diff --git a/CMakeLists.txt b/CMakeLists.txt index ac556bd3ff4..7e7b2547edc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -507,7 +507,9 @@ IF(UNIX) ADD_SUBDIRECTORY(man) ENDIF() -INCLUDE(cmake/abi_check.cmake) +IF (NOT WITHOUT_ABI_CHECK) + INCLUDE(cmake/abi_check.cmake) +ENDIF() INCLUDE(cmake/tags.cmake) INCLUDE(for_clients) ADD_SUBDIRECTORY(scripts) diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 4769fdaf111..fdaf3cf0a62 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -43,11 +43,6 @@ #include "sql_priv.h" #include "sql_basic_types.h" #include -#if 0 /* FIXME: the following is broken for now */ -# include "mariadb_rpl.h" -#else -enum Item_result {STRING_RESULT,REAL_RESULT,INT_RESULT,ROW_RESULT,DECIMAL_RESULT}; -#endif #include "log_event.h" #include "compat56.h" #include "sql_common.h" @@ -165,7 +160,9 @@ static Server_gtid_event_filter *server_id_gtid_filter= NULL; static char *start_datetime_str, *stop_datetime_str; static my_time_t start_datetime= 0, stop_datetime= 0; +static my_time_t last_processed_datetime= MY_TIME_T_MAX; static bool stop_datetime_given= false; + static ulonglong rec_count= 0; static MYSQL* mysql = NULL; static const char* dirname_for_local_load= 0; @@ -871,6 +868,7 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev, DBUG_ENTER("process_event"); Exit_status retval= OK_CONTINUE; IO_CACHE *const head= &print_event_info->head_cache; + my_time_t ev_when= ev->when; /* We use Gtid_list_log_event information to determine if there is missing @@ -1371,6 +1369,7 @@ err: end: rec_count++; end_skip_count: + last_processed_datetime= ev_when; DBUG_PRINT("info", ("end event processing")); /* @@ -2935,6 +2934,7 @@ static Exit_status check_header(IO_CACHE* file, uchar buf[PROBE_HEADER_LEN]; my_off_t tmp_pos, pos; MY_STAT my_file_stat; + int read_error; delete glob_description_event; if (!(glob_description_event= new Format_description_log_event(4))) @@ -3017,7 +3017,8 @@ static Exit_status check_header(IO_CACHE* file, Format_description_log_event *new_description_event; my_b_seek(file, tmp_pos); /* seek back to event's start */ if (!(new_description_event= (Format_description_log_event*) - Log_event::read_log_event(file, glob_description_event, + Log_event::read_log_event(file, &read_error, + glob_description_event, opt_verify_binlog_checksum))) /* EOF can't be hit here normally, so it's a real error */ { @@ -3050,7 +3051,8 @@ static Exit_status check_header(IO_CACHE* file, { Log_event *ev; my_b_seek(file, tmp_pos); /* seek back to event's start */ - if (!(ev= Log_event::read_log_event(file, glob_description_event, + if (!(ev= Log_event::read_log_event(file, &read_error, + glob_description_event, opt_verify_binlog_checksum))) { /* EOF can't be hit here normally, so it's a real error */ @@ -3090,7 +3092,6 @@ static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, IO_CACHE cache,*file= &cache; uchar tmp_buff[BIN_LOG_HEADER_SIZE]; Exit_status retval= OK_CONTINUE; - my_time_t last_ev_when= MY_TIME_T_MAX; if (logname && strcmp(logname, "-") != 0) { @@ -3164,8 +3165,10 @@ static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, { char llbuff[21]; my_off_t old_off = my_b_tell(file); + int read_error; - Log_event* ev = Log_event::read_log_event(file, glob_description_event, + Log_event* ev = Log_event::read_log_event(file, &read_error, + glob_description_event, opt_verify_binlog_checksum); if (!ev) { @@ -3174,15 +3177,15 @@ static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, about a corruption, but treat it as EOF and move to the next binlog. */ if (glob_description_event->flags & LOG_EVENT_BINLOG_IN_USE_F) - file->error= 0; - else if (file->error) + read_error= 0; + else if (read_error) { error("Could not read entry at offset %s: " "Error in log format or read error.", llstr(old_off,llbuff)); goto err; } - // else file->error == 0 means EOF, that's OK, we break in this case + // else read_error == 0 means EOF, that's OK, we break in this case /* Emit a warning in the event that we finished processing input @@ -3196,21 +3199,8 @@ static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, "end of input", stop_position); } - /* - Emit a warning in the event that we finished processing input - before reaching the boundary indicated by --stop-datetime. - */ - if (stop_datetime_given && - stop_datetime > last_ev_when) - { - retval = OK_STOP; - warning("Did not reach stop datetime '%s' " - "before end of input", stop_datetime_str); - } - goto end; } - last_ev_when= ev->when; if ((retval= process_event(print_event_info, ev, old_off, logname)) != OK_CONTINUE) goto end; @@ -3389,6 +3379,10 @@ int main(int argc, char** argv) start_position= BIN_LOG_HEADER_SIZE; } + if (stop_datetime_given && stop_datetime > last_processed_datetime) + warning("Did not reach stop datetime '%s' before end of input", + stop_datetime_str); + /* If enable flashback, need to print the events from the end to the beginning diff --git a/client/mysqldump.cc b/client/mysqldump.cc index d1da59c07fb..bc895a3f4f0 100644 --- a/client/mysqldump.cc +++ b/client/mysqldump.cc @@ -3355,7 +3355,7 @@ static uint get_table_structure(const char *table, const char *db, char *table_t fprintf(sql_file, "SET @saved_cs_client = @@character_set_client;\n" - "SET character_set_client = utf8;\n" + "SET character_set_client = utf8mb4;\n" "/*!50001 CREATE VIEW %s AS SELECT\n", result_table); @@ -3423,7 +3423,7 @@ static uint get_table_structure(const char *table, const char *db, char *table_t { fprintf(sql_file, "/*!40101 SET @saved_cs_client = @@character_set_client */;\n" - "/*!40101 SET character_set_client = utf8 */;\n" + "/*!40101 SET character_set_client = utf8mb4 */;\n" "%s%s;\n" "/*!40101 SET character_set_client = @saved_cs_client */;\n", is_log_table ? "CREATE TABLE IF NOT EXISTS " : "", diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 0f2af733832..94ae462c074 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -879,8 +879,7 @@ LogFile progress_file; void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, size_t len); void replace_dynstr_append(DYNAMIC_STRING *ds, const char *val); void replace_dynstr_append_uint(DYNAMIC_STRING *ds, uint val); -void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING* ds_input, - bool keep_header); +void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING* ds_input); static int match_expected_error(struct st_command *command, unsigned int err_errno, @@ -3493,7 +3492,7 @@ void do_exec(struct st_command *command) if (display_result_sorted) { - dynstr_append_sorted(&ds_res, &ds_sorted, 0); + dynstr_append_sorted(&ds_res, &ds_sorted); dynstr_free(&ds_sorted); } #ifdef _WIN32 @@ -7838,16 +7837,29 @@ void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res) uint num_fields= mysql_num_fields(res); MYSQL_FIELD *fields= mysql_fetch_fields(res); ulong *lengths; + DYNAMIC_STRING rs_unsorted, *rs= ds; + + if (display_result_sorted) + { + init_dynamic_string(&rs_unsorted, "", 1024, 1024); + rs= &rs_unsorted; + } while ((row = mysql_fetch_row(res))) { uint i; lengths = mysql_fetch_lengths(res); for (i = 0; i < num_fields; i++) - append_field(ds, i, &fields[i], + append_field(rs, i, &fields[i], row[i], lengths[i], !row[i]); if (!display_result_vertically) - dynstr_append_mem(ds, "\n", 1); + dynstr_append_mem(rs, "\n", 1); + } + + if (display_result_sorted) + { + dynstr_append_sorted(ds, &rs_unsorted); + dynstr_free(&rs_unsorted); } } @@ -7865,6 +7877,13 @@ void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt, ulong *length; uint i; int error; + DYNAMIC_STRING rs_unsorted, *rs= ds; + + if (display_result_sorted) + { + init_dynamic_string(&rs_unsorted, "", 1024, 1024); + rs= &rs_unsorted; + } /* Allocate array with bind structs, lengths and NULL flags */ my_bind= (MYSQL_BIND*) my_malloc(PSI_NOT_INSTRUMENTED, num_fields * sizeof(MYSQL_BIND), @@ -7896,10 +7915,10 @@ void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt, while ((error=mysql_stmt_fetch(stmt)) == 0) { for (i= 0; i < num_fields; i++) - append_field(ds, i, &fields[i], (char*)my_bind[i].buffer, + append_field(rs, i, &fields[i], (char*)my_bind[i].buffer, *my_bind[i].length, *my_bind[i].is_null); if (!display_result_vertically) - dynstr_append_mem(ds, "\n", 1); + dynstr_append_mem(rs, "\n", 1); } if (error != MYSQL_NO_DATA) @@ -7918,6 +7937,12 @@ void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt, my_free(my_bind); my_free(length); my_free(is_null); + + if (display_result_sorted) + { + dynstr_append_sorted(ds, &rs_unsorted); + dynstr_free(&rs_unsorted); + } } @@ -8120,7 +8145,7 @@ static void append_session_track_info(DYNAMIC_STRING *ds, MYSQL *mysql) if (type == SESSION_TRACK_SYSTEM_VARIABLES) { dynstr_append_mem(ds_type, STRING_WITH_LEN("\n")); - dynstr_append_sorted(ds, ds_type, false); + dynstr_append_sorted(ds, ds_type); dynstr_append_mem(ds, STRING_WITH_LEN("\n")); dynstr_free(&ds_sort); } @@ -8162,7 +8187,6 @@ int append_warnings(DYNAMIC_STRING *ds, MYSQL* mysql) { uint count; MYSQL_RES *warn_res; - DYNAMIC_STRING res; DBUG_ENTER("append_warnings"); if (!(count= mysql_warning_count(mysql))) @@ -8183,18 +8207,8 @@ int append_warnings(DYNAMIC_STRING *ds, MYSQL* mysql) die("Warning count is %u but didn't get any warnings", count); - init_dynamic_string(&res, "", 1024, 1024); - - append_result(&res, warn_res); + append_result(ds, warn_res); mysql_free_result(warn_res); - - DBUG_PRINT("warnings", ("%s", res.str)); - - if (display_result_sorted) - dynstr_append_sorted(ds, &res, 0); - else - dynstr_append_mem(ds, res.str, res.length); - dynstr_free(&res); DBUG_RETURN(count); } @@ -8709,8 +8723,6 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, DYNAMIC_STRING ds_prepare_warnings; DYNAMIC_STRING ds_execute_warnings; DYNAMIC_STRING ds_res_1st_execution; - DYNAMIC_STRING ds_res_2_execution_unsorted; - DYNAMIC_STRING *ds_res_2_output; my_bool ds_res_1st_execution_init = FALSE; my_bool compare_2nd_execution = TRUE; int query_match_ps2_re; @@ -8772,7 +8784,6 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, parameter markers. */ -#if MYSQL_VERSION_ID >= 50000 if (cursor_protocol_enabled) { ps2_protocol_enabled = 0; @@ -8792,7 +8803,6 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); } } -#endif query_match_ps2_re = match_re(&ps2_re, query); @@ -8859,29 +8869,8 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, !disable_warnings) append_warnings(&ds_execute_warnings, mysql); - if (!disable_result_log && - compare_2nd_execution && - ps2_protocol_enabled && - query_match_ps2_re && - display_result_sorted) - { - init_dynamic_string(&ds_res_2_execution_unsorted, "", - RESULT_STRING_INIT_MEM, - RESULT_STRING_INCREMENT_MEM); - ds_res_2_output= &ds_res_2_execution_unsorted; - } - else - ds_res_2_output= ds; - - if (read_stmt_results(stmt, ds_res_2_output, command)) - { - if (ds_res_2_output != ds) - { - dynstr_append_mem(ds, ds_res_2_output->str, ds_res_2_output->length); - dynstr_free(ds_res_2_output); - } + if (read_stmt_results(stmt, ds, command)) goto end; - } if (!disable_result_log) { @@ -8891,35 +8880,12 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, */ if (compare_2nd_execution && ps2_protocol_enabled && query_match_ps2_re) { - DYNAMIC_STRING *ds_res_1_execution_compare; - DYNAMIC_STRING ds_res_1_execution_sorted; - if (display_result_sorted) - { - init_dynamic_string(&ds_res_1_execution_sorted, "", - RESULT_STRING_INIT_MEM, - RESULT_STRING_INCREMENT_MEM); - dynstr_append_sorted(&ds_res_1_execution_sorted, - &ds_res_1st_execution, 1); - dynstr_append_sorted(ds, &ds_res_2_execution_unsorted, 1); - ds_res_1_execution_compare= &ds_res_1_execution_sorted; - } - else - { - ds_res_1_execution_compare= &ds_res_1st_execution; - } - if (ds->length != ds_res_1_execution_compare->length || - !(memcmp(ds_res_1_execution_compare->str, ds->str, ds->length) == 0)) + if (ds->length != ds_res_1st_execution.length || + !(memcmp(ds_res_1st_execution.str, ds->str, ds->length) == 0)) { die("The result of the 1st execution does not match with \n" "the result of the 2nd execution of ps-protocol:\n 1st:\n" - "%s\n 2nd:\n %s", - ds_res_1_execution_compare->str, - ds->str); - } - if (display_result_sorted) - { - dynstr_free(&ds_res_1_execution_sorted); - dynstr_free(&ds_res_2_execution_unsorted); + "%s\n 2nd:\n %s", ds_res_1st_execution.str, ds->str); } } @@ -9514,10 +9480,6 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags) DYNAMIC_STRING *rs_output; /* where to put results */ DYNAMIC_STRING rs_cmp_result; /* here we put results to compare with pre-recrded file */ - DYNAMIC_STRING rs_unsorted; /* if we need sorted results, here we store - results before sorting them */ - DYNAMIC_STRING *rs_sorted_save= NULL; /* here we store where to put sorted - result if needed */ DYNAMIC_STRING rs_warnings; char *query; size_t query_len; @@ -9688,18 +9650,6 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags) dynstr_free(&query_str); } - if (display_result_sorted) - { - /* - Collect the query output in a separate string - that can be sorted before it's added to the - global result string - */ - init_dynamic_string(&rs_unsorted, "", 1024, 1024); - rs_sorted_save= rs_output; /* Remember original ds */ - rs_output= &rs_unsorted; - } - /* Find out how to run this query @@ -9726,14 +9676,6 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags) dynstr_free(&rs_warnings); ds_warn= 0; - if (display_result_sorted) - { - /* Sort the result set and append it to result */ - dynstr_append_sorted(rs_sorted_save, &rs_unsorted, 1); - rs_output= rs_sorted_save; - dynstr_free(&rs_unsorted); - } - if (sp_created) { if (util_query(mysql, "DROP PROCEDURE mysqltest_tmp_sp ")) @@ -12277,7 +12219,6 @@ void replace_dynstr_append_uint(DYNAMIC_STRING *ds, uint val) dynstr_append_sorted() ds string where the sorted output will be appended ds_input string to be sorted - keep_header If header should not be sorted */ static int comp_lines(const void *a_, const void *b_) @@ -12287,8 +12228,7 @@ static int comp_lines(const void *a_, const void *b_) return (strcmp(*a,*b)); } -void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING *ds_input, - bool keep_header) +void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING *ds_input) { unsigned i; char *start= ds_input->str; @@ -12300,15 +12240,6 @@ void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING *ds_input, my_init_dynamic_array(PSI_NOT_INSTRUMENTED, &lines, sizeof(const char*), 32, 32, MYF(0)); - if (keep_header) - { - /* First line is result header, skip past it */ - while (*start && *start != '\n') - start++; - start++; /* Skip past \n */ - dynstr_append_mem(ds, ds_input->str, start - ds_input->str); - } - /* Insert line(s) in array */ while (*start) { diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index c11feb6b09b..738722aa3af 100644 --- a/cmake/build_configurations/mysql_release.cmake +++ b/cmake/build_configurations/mysql_release.cmake @@ -173,30 +173,40 @@ IF(UNIX) # Default GCC flags IF(CMAKE_COMPILER_IS_GNUCC) SET(COMMON_C_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-uninitialized") - SET(CMAKE_C_FLAGS_DEBUG "-O ${COMMON_C_FLAGS}") - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_DEBUG " ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " ${COMMON_C_FLAGS}") + # MariaDB uses -O3 for release builds + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") ENDIF() IF(CMAKE_COMPILER_IS_GNUCXX) SET(COMMON_CXX_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-uninitialized") - SET(CMAKE_CXX_FLAGS_DEBUG "-O ${COMMON_CXX_FLAGS}") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_DEBUG " ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " ${COMMON_CXX_FLAGS}") + # MariaDB uses -O3 for release builds + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") ENDIF() # IBM Z flags IF(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x") IF(RPM MATCHES "(rhel|centos)6" OR RPM MATCHES "(suse|sles)11") - SET(z_flags "-funroll-loops -march=z9-109 -mtune=z10 ") + SET(z_flags "-funroll-loops -march=z9-109 -mtune=z10") ELSEIF(RPM MATCHES "(rhel|centos)7" OR RPM MATCHES "(suse|sles)12") - SET(z_flags "-funroll-loops -march=z196 -mtune=zEC12 ") + SET(z_flags "-funroll-loops -march=z196 -mtune=zEC12") ELSE() SET(z_flags "") ENDIF() IF(CMAKE_COMPILER_IS_GNUCC) - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${z_flags}${CMAKE_C_FLAGS_RELWITHDEBINFO}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " ${z_flags}") + STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " ${z_flags}") ENDIF() IF(CMAKE_COMPILER_IS_GNUCXX) - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${z_flags}${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " ${z_flags}") + STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " ${z_flags}") ENDIF() UNSET(z_flags) ENDIF() @@ -207,11 +217,13 @@ IF(UNIX) IF(CMAKE_SYSTEM_PROCESSOR MATCHES "ia64") SET(COMMON_C_FLAGS "+DSitanium2 -mt -AC99") SET(COMMON_CXX_FLAGS "+DSitanium2 -mt -Aa") - SET(CMAKE_C_FLAGS_DEBUG "+O0 -g ${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_DEBUG "+O0 -g ${COMMON_CXX_FLAGS}") - # We have seen compiler bugs with optimisation and -g, so disabled for now - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "+O2 ${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "+O2 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_DEBUG " +O0 -g ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_DEBUG " +O0 -g ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " +O0 -g ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " +O0 -g ${COMMON_CXX_FLAGS}") + # We have seen compiler bugs with optimisation and -g, so disabled for now + STRING(APPEND CMAKE_C_FLAGS_RELEASE " +O2 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " +O2 ${COMMON_CXX_FLAGS}") ENDIF() ENDIF() SET(WITH_SSL no) @@ -226,10 +238,18 @@ IF(UNIX) SET(COMMON_C_FLAGS "${COMMON_C_FLAGS} -no-ftz -no-prefetch") SET(COMMON_CXX_FLAGS "${COMMON_CXX_FLAGS} -no-ftz -no-prefetch") ENDIF() - SET(CMAKE_C_FLAGS_DEBUG "${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_DEBUG "${COMMON_CXX_FLAGS}") - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 -unroll2 -ip ${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -unroll2 -ip ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_DEBUG " ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_DEBUG " ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " -unroll2 -ip ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " -unroll2 -ip ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " -unroll2 -ip ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -unroll2 -ip ${COMMON_CXX_FLAGS}") + + # MariaDB uses -O3 for release builds. + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") SET(WITH_SSL no) ENDIF() ENDIF() @@ -237,13 +257,21 @@ IF(UNIX) # Default Clang flags IF(CMAKE_C_COMPILER_ID MATCHES "Clang") SET(COMMON_C_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-parentheses-equality -Wno-string-plus-int") - SET(CMAKE_C_FLAGS_DEBUG "${COMMON_C_FLAGS}") - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_DEBUG " ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " ${COMMON_C_FLAGS}") + # MariaDB uses -O3 for release builds. + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") ENDIF() IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang") SET(COMMON_CXX_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-parentheses-equality -Wno-string-plus-int") - SET(CMAKE_CXX_FLAGS_DEBUG "${COMMON_CXX_FLAGS}") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_DEBUG " ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " ${COMMON_CXX_FLAGS}") + # MariaDB uses -O3 for release builds. + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + STRING(REGEX REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") ENDIF() # Solaris flags @@ -256,27 +284,33 @@ IF(UNIX) IF(CMAKE_SYSTEM_PROCESSOR MATCHES "i386") SET(COMMON_C_FLAGS "-g -mt -fsimple=1 -ftrap=%none -nofstore -xbuiltin=%all -xlibmil -xlibmopt -xtarget=generic") SET(COMMON_CXX_FLAGS "-g0 -mt -fsimple=1 -ftrap=%none -nofstore -xbuiltin=%all -features=no%except -xlibmil -xlibmopt -xtarget=generic") - SET(CMAKE_C_FLAGS_DEBUG "-xO1 ${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_DEBUG "-xO1 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_DEBUG " -xO1 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_DEBUG " -xO1 ${COMMON_CXX_FLAGS}") IF(32BIT) - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-xO2 ${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-xO2 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " -xO2 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " -xO2 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " -xO2 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -xO2 ${COMMON_CXX_FLAGS}") ELSEIF(64BIT) - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-xO3 ${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-xO3 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " -xO3 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " -xO3 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " -xO3 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -xO3 ${COMMON_CXX_FLAGS}") ENDIF() - ELSE() + ELSE() # Assume !x86 is SPARC SET(COMMON_C_FLAGS "-g -Xa -xstrconst -mt") SET(COMMON_CXX_FLAGS "-g0 -noex -mt") IF(32BIT) - SET(COMMON_C_FLAGS "${COMMON_C_FLAGS} -xarch=sparc") - SET(COMMON_CXX_FLAGS "${COMMON_CXX_FLAGS} -xarch=sparc") - ENDIF() - SET(CMAKE_C_FLAGS_DEBUG "${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_DEBUG "${COMMON_CXX_FLAGS}") - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-xO3 ${COMMON_C_FLAGS}") - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-xO3 ${COMMON_CXX_FLAGS}") + STRING(APPEND COMMON_C_FLAGS " -xarch=sparc") + STRING(APPEND COMMON_CXX_FLAGS " -xarch=sparc") + ENDIF() + STRING(APPEND CMAKE_C_FLAGS_DEBUG " ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_DEBUG " ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELEASE " -xO3 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " -xO3 ${COMMON_CXX_FLAGS}") + STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " -xO3 ${COMMON_C_FLAGS}") + STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " -xO3 ${COMMON_CXX_FLAGS}") ENDIF() ENDIF() ENDIF() diff --git a/cmake/cpack_rpm.cmake b/cmake/cpack_rpm.cmake index 3f915a2a9a1..d11a303539b 100644 --- a/cmake/cpack_rpm.cmake +++ b/cmake/cpack_rpm.cmake @@ -2,6 +2,8 @@ IF(RPM) MESSAGE(STATUS "CPackRPM building with RPM configuration: ${RPM}") +INCLUDE(check_linker_flag) + SET(CPACK_GENERATOR "RPM") SET(CPACK_RPM_PACKAGE_DEBUG 1) SET(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) @@ -51,6 +53,19 @@ SET(CPACK_PACKAGE_RELOCATABLE FALSE) SET(CPACK_RPM_PACKAGE_GROUP "Applications/Databases") SET(CPACK_RPM_PACKAGE_URL ${CPACK_PACKAGE_URL}) +# The spec file depends on environment variables +SET(ENV{RPM_PACKAGE_NAME} ${CPACK_RPM_PACKAGE_NAME}) +EXECUTE_PROCESS(COMMAND rpm --eval ${CPACK_RPM_PACKAGE_RELEASE} OUTPUT_VARIABLE RPM_PACKAGE_RELEASE_EXPANDED) +STRING(STRIP "${RPM_PACKAGE_RELEASE_EXPANDED}" RPM_PACKAGE_RELEASE_EXPANDED) +SET(ENV{RPM_PACKAGE_RELEASE} ${RPM_PACKAGE_RELEASE_EXPANDED}) +SET(ENV{RPM_ARCH} ${CMAKE_SYSTEM_PROCESSOR}) +SET(ENV{RPM_PACKAGE_VERSION} ${SERVER_VERSION}) +MY_CHECK_AND_SET_LINKER_FLAG("-specs=/usr/lib/rpm/redhat/redhat-package-notes") +IF(HAVE_LINK_FLAG__specs_/usr/lib/rpm/redhat/redhat_package_notes) + SET(CMAKE_CXX_LINKER_LAUNCHER "env;RPM_PACKAGE_NAME=$ENV{RPM_PACKAGE_NAME};RPM_ARCH=$ENV{RPM_ARCH};RPM_PACKAGE_VERSION=$ENV{RPM_PACKAGE_VERSION};RPM_PACKAGE_RELEASE=$ENV{RPM_PACKAGE_RELEASE}") + SET(CMAKE_C_LINKER_LAUNCHER ${CMAKE_CXX_LINKER_LAUNCHER}) +ENDIF() + SET(CPACK_RPM_shared_PACKAGE_VENDOR "MariaDB Corporation Ab") SET(CPACK_RPM_shared_PACKAGE_LICENSE "LGPLv2.1") diff --git a/debian/additions/debian-start b/debian/additions/debian-start index 282cd2093ed..46cfe1ba239 100755 --- a/debian/additions/debian-start +++ b/debian/additions/debian-start @@ -22,8 +22,8 @@ then . /etc/default/mariadb fi -MARIADB="/usr/bin/mariadb --defaults-file=/etc/mysql/debian.cnf" -MYADMIN="/usr/bin/mariadb-admin --defaults-file=/etc/mysql/debian.cnf" +MARIADB="/usr/bin/mariadb --defaults-extra-file=/etc/mysql/debian.cnf" +MYADMIN="/usr/bin/mariadb-admin --defaults-extra-file=/etc/mysql/debian.cnf" # Don't run full mariadb-upgrade on every server restart, use --version-check to do it only once MYUPGRADE="/usr/bin/mariadb-upgrade --defaults-extra-file=/etc/mysql/debian.cnf --version-check --silent" MYCHECK_SUBJECT="WARNING: mariadb-check has found corrupt tables" diff --git a/debian/autobake-deb.sh b/debian/autobake-deb.sh index 3486473cf47..1a8233bec3f 100755 --- a/debian/autobake-deb.sh +++ b/debian/autobake-deb.sh @@ -57,6 +57,12 @@ disable_libfmt() sed '/libfmt-dev/d' -i debian/control } +remove_package_notes() +{ + # binutils >=2.39 + disto makefile /usr/share/debhelper/dh_package_notes/package-notes.mk + sed -e '/package.notes/d' -i debian/rules debian/control +} + architecture=$(dpkg-architecture -q DEB_BUILD_ARCH) uname_machine=$(uname -m) @@ -94,6 +100,7 @@ in ;& "bullseye") add_lsb_base_depends + remove_package_notes ;& "bookworm") # mariadb-plugin-rocksdb in control is 4 arches covered by the distro rocksdb-tools @@ -114,6 +121,7 @@ in ;& "jammy"|"kinetic") add_lsb_base_depends + remove_package_notes ;& "lunar"|"mantic") if [[ ! "$architecture" =~ amd64|arm64|armhf|ppc64el|s390x ]] diff --git a/debian/control b/debian/control index 3f34cb6f441..0f451a2a380 100644 --- a/debian/control +++ b/debian/control @@ -8,6 +8,7 @@ Build-Depends: bison, debhelper (>= 11), default-jdk, dh-exec, + dh-package-notes, flex [amd64], gdb , libaio-dev [linux-any], diff --git a/debian/rules b/debian/rules index 64866631839..ac33739e752 100644 --- a/debian/rules +++ b/debian/rules @@ -4,14 +4,15 @@ # https://wiki.debian.org/Hardening export DEB_BUILD_MAINT_OPTIONS = hardening=+all -# Disable LTO on Ubuntu, see LP: #1970634 and https://jira.mariadb.org/browse/MDEV-25633 -ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes), yes) - export DEB_BUILD_MAINT_OPTIONS += optimize=-lto -endif +# LTO is generally enabled. Only ColumnStore doesn't support it (MCOL-5819) +# and disables it in storage/columnstore/CMakeLists.txt DPKG_EXPORT_BUILDFLAGS = 1 # Include all defaults, including buildflags.mk include /usr/share/dpkg/default.mk +# Include package notes in built executables +include /usr/share/debhelper/dh_package_notes/package-notes.mk + # CPPFLAGS are nor read by CMake, so copy them to CXXFLAGS # See why at https://cmake.org/Bug/view.php?id=12928 # This is needed for e.g. all automatic Debian hardening flags to apply on all cmake builds. diff --git a/extra/mariabackup/encryption_plugin.cc b/extra/mariabackup/encryption_plugin.cc index 147563f243c..e7e8d95823c 100644 --- a/extra/mariabackup/encryption_plugin.cc +++ b/extra/mariabackup/encryption_plugin.cc @@ -230,6 +230,7 @@ void encryption_plugin_prepare_init(int argc, char **argv) char **new_argv = new char *[argc + 2]; new_argv[0] = XTRABACKUP_EXE; memcpy(&new_argv[1], argv, argc*sizeof(char *)); + new_argv[argc+1]= 0; encryption_plugin_init(argc+1, new_argv); diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index f99c82d8c8c..3ee8a349433 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -1225,7 +1225,8 @@ static void backup_file_op_fail(uint32_t space_id, int type, static void backup_undo_trunc(uint32_t space_id) { - undo_trunc_ids.insert(space_id); + if (space_id) + undo_trunc_ids.insert(space_id); } /* Function to store the space id of page0 INIT_PAGE @@ -1331,9 +1332,7 @@ enum options_xtrabackup OPT_INNODB_BUFFER_POOL_FILENAME, OPT_INNODB_LOCK_WAIT_TIMEOUT, OPT_INNODB_LOG_BUFFER_SIZE, -#ifdef HAVE_INNODB_MMAP OPT_INNODB_LOG_FILE_MMAP, -#endif #if defined __linux__ || defined _WIN32 OPT_INNODB_LOG_FILE_BUFFERING, #endif @@ -1897,13 +1896,11 @@ struct my_option xb_server_options[] = (G_PTR*) &log_sys.buf_size, (G_PTR*) &log_sys.buf_size, 0, GET_UINT, REQUIRED_ARG, 2U << 20, 2U << 20, log_sys.buf_size_max, 0, 4096, 0}, -#ifdef HAVE_INNODB_MMAP {"innodb_log_file_mmap", OPT_INNODB_LOG_FILE_SIZE, "Whether ib_logfile0 should be memory-mapped", (G_PTR*) &log_sys.log_mmap, (G_PTR*) &log_sys.log_mmap, 0, GET_BOOL, NO_ARG, log_sys.log_mmap_default, 0, 0, 0, 0, 0}, -#endif #if defined __linux__ || defined _WIN32 {"innodb_log_file_buffering", OPT_INNODB_LOG_FILE_BUFFERING, "Whether the file system cache for ib_logfile0 is enabled during --backup", @@ -3391,7 +3388,6 @@ skip: return(FALSE); } -#ifdef HAVE_INNODB_MMAP static int xtrabackup_copy_mmap_snippet(ds_file_t *ds, const byte *start, const byte *end) { @@ -3430,7 +3426,7 @@ static bool xtrabackup_copy_mmap_logfile() /* Set the sequence bit (the backed-up log will not wrap around) */ size_t seqo= recv_sys.offset - seq_offset; if (seqo < log_sys.START_OFFSET) - seqo+= log_sys.file_size - log_sys.START_OFFSET; + seqo+= static_cast(log_sys.file_size - log_sys.START_OFFSET); const byte *seq= &log_sys.buf[seqo]; ut_ad(*seq == log_sys.get_sequence_bit(recv_sys.lsn - seq_offset)); if (!*seq) @@ -3491,7 +3487,6 @@ static bool xtrabackup_copy_mmap_logfile() msg(">> log scanned up to (" LSN_PF ")", recv_sys.lsn); return false; } -#endif /** Copy redo log until the current end of the log is reached @return whether the operation failed */ @@ -3503,10 +3498,9 @@ static bool xtrabackup_copy_logfile() ut_a(dst_log_file); ut_ad(recv_sys.is_initialised()); -#ifdef HAVE_INNODB_MMAP if (log_sys.is_mmap()) return xtrabackup_copy_mmap_logfile(); -#endif + const size_t sequence_offset{log_sys.is_encrypted() ? 8U + 5U : 5U}; const size_t block_size_1{log_sys.write_size - 1}; diff --git a/extra/wolfssl/CMakeLists.txt b/extra/wolfssl/CMakeLists.txt index 866d922d25a..e2e860314c5 100644 --- a/extra/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/CMakeLists.txt @@ -134,6 +134,9 @@ if(MSVC) if(CMAKE_C_COMPILER_ID MATCHES Clang) target_compile_options(wolfssl PRIVATE $<$:-Wno-incompatible-function-pointer-types>) endif() + remove_definitions(-DHAVE_CONFIG_H) + target_compile_definitions(wolfssl PRIVATE + WOLFSSL_HAVE_MIN WOLFSSL_HAVE_MAX) endif() set_property(TARGET wolfssl PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/extra/wolfssl/user_settings.h.in b/extra/wolfssl/user_settings.h.in index c786076b211..673ddc6cdde 100644 --- a/extra/wolfssl/user_settings.h.in +++ b/extra/wolfssl/user_settings.h.in @@ -3,7 +3,21 @@ #define HAVE_CRL #define WOLFSSL_HAVE_ERROR_QUEUE + +/* + Workaround bug in 5.7.6 + WOLFSSL_MYSQL_COMPATIBLE breaks building wolfssl + + But it is needed to avoid redefinition of protocol_version + when its public header ssl.h is included +*/ +#ifndef BUILDING_WOLFSSL #define WOLFSSL_MYSQL_COMPATIBLE +#endif + +#define SP_INT_BITS 8192 +#define HAVE_EMPTY_AGGREGATES 0 + #define HAVE_ECC #define ECC_TIMING_RESISTANT #define HAVE_HASHDRBG @@ -24,7 +38,8 @@ #define HAVE_THREAD_LS #define WOLFSSL_AES_COUNTER #define NO_WOLFSSL_STUB -#define OPENSSL_ALL +// #define OPENSSL_ALL +#define OPENSSL_EXTRA #define WOLFSSL_ALLOW_TLSV10 #define NO_OLD_TIMEVAL_NAME #define HAVE_SECURE_RENEGOTIATION diff --git a/extra/wolfssl/wolfssl b/extra/wolfssl/wolfssl index 00e42151ca0..239b85c8043 160000 --- a/extra/wolfssl/wolfssl +++ b/extra/wolfssl/wolfssl @@ -1 +1 @@ -Subproject commit 00e42151ca061463ba6a95adb2290f678cbca472 +Subproject commit 239b85c80438bf60d9a5b9e0ebe9ff097a760d0d diff --git a/include/my_cpu.h b/include/my_cpu.h index 003087dd94d..bd5fca5f21b 100644 --- a/include/my_cpu.h +++ b/include/my_cpu.h @@ -94,20 +94,13 @@ static inline void MY_RELAX_CPU(void) __asm__ __volatile__ ("pause"); #endif #elif defined(_ARCH_PWR8) -#ifdef __FreeBSD__ - uint64_t __tb; - __asm__ volatile ("mfspr %0, 268" : "=r" (__tb)); -#else - /* Changed from __ppc_get_timebase for musl compatibility */ + /* Changed from __ppc_get_timebase for musl and clang compatibility */ __builtin_ppc_get_timebase(); -#endif -#elif defined __GNUC__ && (defined __arm__ || defined __aarch64__) +#elif defined __GNUC__ && defined __riscv + __builtin_riscv_pause(); +#elif defined __GNUC__ /* Mainly, prevent the compiler from optimizing away delay loops */ __asm__ __volatile__ ("":::"memory"); -#else - int32 var, oldval = 0; - my_atomic_cas32_strong_explicit(&var, &oldval, 1, MY_MEMORY_ORDER_RELAXED, - MY_MEMORY_ORDER_RELAXED); #endif } diff --git a/include/my_pthread.h b/include/my_pthread.h index c1cd43b640c..83909774fd1 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -616,6 +616,13 @@ extern pthread_mutexattr_t my_errorcheck_mutexattr; #endif typedef uint64 my_thread_id; +/** + Long-standing formats (such as the client-server protocol and the binary log) + hard-coded `my_thread_id` to 32 bits in practice. (Though not all + `thread_id`s are typed as such, @ref my_thread_id itself among those.) + @see MDEV-35706 +*/ +#define MY_THREAD_ID_MAX UINT32_MAX extern void my_threadattr_global_init(void); extern my_bool my_thread_global_init(void); diff --git a/include/my_sys.h b/include/my_sys.h index a27a176c7c0..3eae922e8d2 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -1145,8 +1145,8 @@ extern my_bool init_compiled_charsets(myf flags); extern void add_compiled_collation(struct charset_info_st *cs); extern void add_compiled_extra_collation(struct charset_info_st *cs); extern my_bool add_alias_for_collation(LEX_CSTRING *collation_name, - LEX_CSTRING *alias, - uint alias_id); + uint collation_id, + LEX_CSTRING *alias, uint alias_id); extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, size_t to_length, const char *from, size_t length, diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index b5baf924125..c89da500e3a 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -50,7 +50,8 @@ class THD; class Item; #define MYSQL_THD THD* #else -#define MYSQL_THD void* +struct THD; +typedef struct THD* MYSQL_THD; #endif typedef char my_bool; diff --git a/include/mysql/psi/mysql_file.h b/include/mysql/psi/mysql_file.h index fd3b29cc5c9..096815ed02d 100644 --- a/include/mysql/psi/mysql_file.h +++ b/include/mysql/psi/mysql_file.h @@ -1018,7 +1018,7 @@ inline_mysql_file_create( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif - const char *filename, int create_flags, int access_flags, myf myFlags) + const char *filename, mode_t create_flags, int access_flags, myf myFlags) { File file; #ifdef HAVE_PSI_FILE_INTERFACE @@ -1344,7 +1344,7 @@ inline_mysql_file_create_with_symlink( #ifdef HAVE_PSI_FILE_INTERFACE PSI_file_key key, const char *src_file, uint src_line, #endif - const char *linkname, const char *filename, int create_flags, + const char *linkname, const char *filename, mode_t create_flags, int access_flags, myf flags) { File file; diff --git a/include/mysql/service_debug_sync.h b/include/mysql/service_debug_sync.h index 0bd49a13458..f7fdbf04832 100644 --- a/include/mysql/service_debug_sync.h +++ b/include/mysql/service_debug_sync.h @@ -351,7 +351,11 @@ extern void (*debug_sync_C_callback_ptr)(MYSQL_THD, const char *, size_t); #endif /* defined(ENABLED_DEBUG_SYNC) */ /* compatibility macro */ +#ifdef __cplusplus +#define DEBUG_SYNC_C(name) DEBUG_SYNC(nullptr, name) +#else #define DEBUG_SYNC_C(name) DEBUG_SYNC(NULL, name) +#endif #ifdef __cplusplus } diff --git a/include/scope.h b/include/scope.h index e0e9fc62969..5c9c23455c5 100644 --- a/include/scope.h +++ b/include/scope.h @@ -32,6 +32,11 @@ public: { } + template + scope_exit(F &&f, bool engaged) : function_(std::forward(f)), engaged_(engaged) + { + } + scope_exit(scope_exit &&rhs) : function_(std::move(rhs.function_)), engaged_(rhs.engaged_) { @@ -43,6 +48,7 @@ public: scope_exit &operator=(const scope_exit &)= delete; void release() { engaged_= false; } + void engage() { assert(!engaged_); engaged_= true; } ~scope_exit() { @@ -58,17 +64,103 @@ private: } // end namespace detail template -detail::scope_exit::type> -make_scope_exit(Callable &&f) +inline +::detail::scope_exit::type> +make_scope_exit(Callable &&f, bool engaged= true) { - return detail::scope_exit::type>( - std::forward(f)); + return ::detail::scope_exit::type>( + std::forward(f), engaged); } #define CONCAT_IMPL(x, y) x##y - #define CONCAT(x, y) CONCAT_IMPL(x, y) - #define ANONYMOUS_VARIABLE CONCAT(_anonymous_variable, __LINE__) #define SCOPE_EXIT auto ANONYMOUS_VARIABLE= make_scope_exit + +#define IF_CLASS(C) typename std::enable_if::value>::type +#define IF_NOT_CLASS(C) typename std::enable_if::value>::type + +namespace detail +{ + +template +class Scope_value +{ +public: + // Use SFINAE for passing structs by reference and plain types by value. + // This ctor is defined only if T is a class or struct: + template + Scope_value(T &variable, const T &scope_value) + : variable_(&variable), saved_value_(variable) + { + variable= scope_value; + } + + // This ctor is defined only if T is NOT a class or struct: + template + Scope_value(T &variable, const T scope_value) + : variable_(&variable), saved_value_(variable) + { + variable= scope_value; + } + + Scope_value(Scope_value &&rhs) + : variable_(rhs.variable_), saved_value_(rhs.saved_value_) + { + rhs.variable_= NULL; + } + + Scope_value(const Scope_value &)= delete; + Scope_value &operator=(const Scope_value &)= delete; + Scope_value &operator=(Scope_value &&)= delete; + + ~Scope_value() + { + if (variable_) + *variable_= saved_value_; + } + +private: + T *variable_; + T saved_value_; +}; + +} // namespace detail + +// Use like this: +// auto _= make_scope_value(var, tmp_value); + +template +inline +::detail::Scope_value make_scope_value(T &variable, const T &scope_value) +{ + return ::detail::Scope_value(variable, scope_value); +} + +template +inline +::detail::Scope_value make_scope_value(T &variable, T scope_value) +{ + return ::detail::Scope_value(variable, scope_value); +} + +/* + Note: perfect forwarding version can not pass const: + + template + inline + detail::Scope_value make_scope_value(T &variable, U &&scope_value) + { + return detail::Scope_value(variable, std::forward(scope_value)); + } + + as `const U &&` fails with error `expects an rvalue for 2nd argument`. That + happens because const U && is treated as rvalue only (this is the exact syntax + for declaring rvalues). +*/ + + +#define SCOPE_VALUE auto ANONYMOUS_VARIABLE= make_scope_value +#define SCOPE_SET(VAR, MASK) auto ANONYMOUS_VARIABLE= make_scope_value(VAR, VAR | MASK) +#define SCOPE_CLEAR(VAR, MASK) auto ANONYMOUS_VARIABLE= make_scope_value(VAR, VAR & ~MASK) diff --git a/include/service_versions.h b/include/service_versions.h index 5fcff1e6482..cd66315ffd2 100644 --- a/include/service_versions.h +++ b/include/service_versions.h @@ -43,9 +43,9 @@ #define VERSION_thd_wait 0x0100 #define VERSION_wsrep 0x0500 #define VERSION_json 0x0100 +#define VERSION_sql_service 0x0102 #define VERSION_thd_mdl 0x0100 #define VERSION_print_check_msg 0x0100 -#define VERSION_sql_service 0x0102 #define VERSION_provider_bzip2 0x0100 #define VERSION_provider_lz4 0x0100 diff --git a/libmariadb b/libmariadb index 52d0a38ed15..93e420621a9 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit 52d0a38ed15f62906206d77b675079fc159cec7e +Subproject commit 93e420621a9b367081dcfab17fd1a8340c411cf2 diff --git a/mysql-test/include/ctype_supplementary_chars.inc b/mysql-test/include/ctype_supplementary_chars.inc new file mode 100644 index 00000000000..dfc2497125b --- /dev/null +++ b/mysql-test/include/ctype_supplementary_chars.inc @@ -0,0 +1,26 @@ +--eval CREATE TABLE t1 (a CHAR(8) DEFAULT REVERSE('aha')) $table_charset +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (); +SELECT * FROM t1; + +--eval CREATE TABLE t2 (a CHAR(8) DEFAULT REVERSE('Γ₯ÀÑ')) $table_charset +SHOW CREATE TABLE t2; +INSERT INTO t2 VALUES (); +SELECT * FROM t2; + +--eval CREATE TABLE t3 (a CHAR(8) DEFAULT REVERSE('πŸ˜ŽπŸ˜€')) $table_charset +SHOW CREATE TABLE t3; +INSERT INTO t3 VALUES (); +SELECT * FROM t3; + +--eval CREATE TABLE t4 (a CHAR(8), b CHAR(8) AS (REVERSE('πŸ˜ŽπŸ˜€'))) $table_charset +SHOW CREATE TABLE t4; +INSERT INTO t4 (a) VALUES (''); +SELECT * FROM t4; + +--eval CREATE TABLE t5 (a CHAR(8), b CHAR(8) CHECK (b=BINARY REVERSE('πŸ˜ŽπŸ˜€'))) $table_charset +SHOW CREATE TABLE t5; +--error ER_CONSTRAINT_FAILED +INSERT INTO t5 VALUES ('','πŸ˜ŽπŸ˜€'); +INSERT INTO t5 VALUES ('','πŸ˜€πŸ˜Ž'); +SELECT * FROM t5; diff --git a/mysql-test/include/galera_variables_ok.inc b/mysql-test/include/galera_variables_ok.inc index e420b3af6c3..9bd31bb32b2 100644 --- a/mysql-test/include/galera_variables_ok.inc +++ b/mysql-test/include/galera_variables_ok.inc @@ -1,9 +1,16 @@ --disable_query_log ---let $galera_variables_ok = `SELECT COUNT(*) = 51 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep%'` +let $_galera_variables_delta=$galera_variables_delta; +if (!$_galera_variables_delta) { +--let $galera_variables_delta=0 +} ---if (!$galera_variables_ok) { - --skip Galera number of variables has changed! +--let $galera_variables_expected=`SELECT 51 + $galera_variables_delta` + +--let $galera_variables_count=`SELECT COUNT(*) FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep%'` + +--if ($galera_variables_count != $galera_variables_expected) { + --skip Galera number of variables has changed! ($galera_variables_count instead of $galera_variables_expected) } --enable_query_log diff --git a/mysql-test/include/galera_variables_ok_debug.inc b/mysql-test/include/galera_variables_ok_debug.inc index e420b3af6c3..495b850c871 100644 --- a/mysql-test/include/galera_variables_ok_debug.inc +++ b/mysql-test/include/galera_variables_ok_debug.inc @@ -1,9 +1,5 @@ ---disable_query_log +# Now the number of variables for the release and debug versions +# of the library is equal to each other... +--let $galera_variables_delta=0 ---let $galera_variables_ok = `SELECT COUNT(*) = 51 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep%'` - ---if (!$galera_variables_ok) { - --skip Galera number of variables has changed! -} - ---enable_query_log +--source include/galera_variables_ok.inc diff --git a/mysql-test/include/mtr_check.sql b/mysql-test/include/mtr_check.sql index 5d73d1f59f1..360f7b40bb8 100644 --- a/mysql-test/include/mtr_check.sql +++ b/mysql-test/include/mtr_check.sql @@ -31,6 +31,7 @@ BEGIN WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' + AND variable_name != 'INNODB_LOG_FILE_BUFFERING' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' diff --git a/mysql-test/lib/My/SafeProcess/safe_process_win.cc b/mysql-test/lib/My/SafeProcess/safe_process_win.cc index 8a5bb60a3f5..6e1fd414287 100644 --- a/mysql-test/lib/My/SafeProcess/safe_process_win.cc +++ b/mysql-test/lib/My/SafeProcess/safe_process_win.cc @@ -152,6 +152,24 @@ void handle_signal (int signal) } } +/** + Sets the append flag (FILE_APPEND_DATA) so that the handle inherited by the + child process will be in append mode. + Workaround for perl bug https://github.com/Perl/perl5/issues/17570 +*/ +static void fix_file_append_flag_inheritance(DWORD std_handle) +{ + HANDLE old_handle = GetStdHandle(std_handle); + HANDLE new_handle = ReOpenFile(old_handle, FILE_APPEND_DATA, + FILE_SHARE_WRITE | FILE_SHARE_READ, 0); + if (new_handle != INVALID_HANDLE_VALUE) + { + SetHandleInformation(new_handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); + SetStdHandle(std_handle, new_handle); + CloseHandle(old_handle); + } +} + int main(int argc, const char** argv ) { @@ -270,6 +288,9 @@ int main(int argc, const char** argv ) SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); + fix_file_append_flag_inheritance(STD_OUTPUT_HANDLE); + fix_file_append_flag_inheritance(STD_ERROR_HANDLE); + #if 0 /* Setup stdin, stdout and stderr redirect */ si.dwFlags= STARTF_USESTDHANDLES; diff --git a/mysql-test/main/alter_table.result b/mysql-test/main/alter_table.result index 8905959da15..20c0876974f 100644 --- a/mysql-test/main/alter_table.result +++ b/mysql-test/main/alter_table.result @@ -3075,8 +3075,7 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `altcol1` blob DEFAULT '', - KEY `altcol1` (`altcol1`(2300)), - KEY `h` (`altcol1`(2300)) + KEY `altcol1` (`altcol1`(2300)) ) ENGINE=Aria DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci PAGE_CHECKSUM=1 ROW_FORMAT=PAGE show create table t2; Table Create Table diff --git a/mysql-test/main/alter_table_online.test b/mysql-test/main/alter_table_online.test index 7843c90efd1..6416a3e79d1 100644 --- a/mysql-test/main/alter_table_online.test +++ b/mysql-test/main/alter_table_online.test @@ -266,7 +266,7 @@ send alter table t1 add b int NULL, algorithm= copy, lock= none; --connection con2 evalp set @con= $con; -let $wait_condition= select stage = 4 and progress = 100 +let $wait_condition= select stage = 4 and state= "Waiting for table metadata lock" from information_schema.processlist where id = @con; --source include/wait_condition.inc diff --git a/mysql-test/main/commit.result b/mysql-test/main/commit.result index bf12f3e0ea0..44b87f20ce8 100644 --- a/mysql-test/main/commit.result +++ b/mysql-test/main/commit.result @@ -579,3 +579,23 @@ a # This statement should work, since last statement committed. INSERT INTO t1 VALUES (1); DROP TABLE t1; +# +# MDEV-35335 implicit commit at START TRANSACTION doesn't reset characteristics +# +create table t1 (a int) engine=innodb; +insert t1 values (1); +start transaction; +set session transaction isolation level serializable; +start transaction; +select * from t1; +a +1 +connect con1,localhost,root; +set session innodb_lock_wait_timeout=0; +update t1 set a=2; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +disconnect con1; +connection default; +rollback; +drop table t1; +# End of 10.6 tests diff --git a/mysql-test/main/commit.test b/mysql-test/main/commit.test index 4fb86f5e8bc..7e333ba90da 100644 --- a/mysql-test/main/commit.test +++ b/mysql-test/main/commit.test @@ -677,3 +677,23 @@ SELECT * FROM t1; INSERT INTO t1 VALUES (1); DROP TABLE t1; + +--echo # +--echo # MDEV-35335 implicit commit at START TRANSACTION doesn't reset characteristics +--echo # +create table t1 (a int) engine=innodb; +insert t1 values (1); +start transaction; +set session transaction isolation level serializable; +start transaction; +select * from t1; +connect con1,localhost,root; +set session innodb_lock_wait_timeout=0; +--error ER_LOCK_WAIT_TIMEOUT +update t1 set a=2; +disconnect con1; +connection default; +rollback; +drop table t1; + +--echo # End of 10.6 tests diff --git a/mysql-test/main/ctype_big5.result b/mysql-test/main/ctype_big5.result index dce8e8b92de..5c932905f27 100644 --- a/mysql-test/main/ctype_big5.result +++ b/mysql-test/main/ctype_big5.result @@ -5633,5 +5633,14 @@ EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); ERROR HY000: Invalid big5 character string: '\xA3\xC0' SET sql_mode=DEFAULT; # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_big5'' collate big5_chinese_nopad_ci, _big5 0x0001050001) as c1; +c1 +-1 +select strcmp(_big5'' collate big5_nopad_bin, _big5 0x0001050001) as c1; +c1 +-1 +# # End of 10.5 tests # diff --git a/mysql-test/main/ctype_big5.test b/mysql-test/main/ctype_big5.test index bdf884768da..4b87373a3fd 100644 --- a/mysql-test/main/ctype_big5.test +++ b/mysql-test/main/ctype_big5.test @@ -291,6 +291,13 @@ SET NAMES big5; SET @seq=_big5 0xA3C0; --source include/ctype_ident_sys.inc +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_big5'' collate big5_chinese_nopad_ci, _big5 0x0001050001) as c1; +select strcmp(_big5'' collate big5_nopad_bin, _big5 0x0001050001) as c1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_cp932.result b/mysql-test/main/ctype_cp932.result index f8d83463f26..f80989b5529 100644 --- a/mysql-test/main/ctype_cp932.result +++ b/mysql-test/main/ctype_cp932.result @@ -928,5 +928,14 @@ EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); ERROR HY000: Invalid cp932 character string: '\x81' SET sql_mode=DEFAULT; # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_cp932'' collate cp932_japanese_nopad_ci, _cp932 0x0001050001) as c1; +c1 +-1 +select strcmp(_cp932'' collate cp932_nopad_bin, _cp932 0x0001050001) as c1; +c1 +-1 +# # End of 10.5 tests # diff --git a/mysql-test/main/ctype_cp932.test b/mysql-test/main/ctype_cp932.test index 2ccbe8f1582..b340461b74f 100644 --- a/mysql-test/main/ctype_cp932.test +++ b/mysql-test/main/ctype_cp932.test @@ -70,6 +70,13 @@ SET NAMES cp932; SET @seq=_cp932 0x81AD; --source include/ctype_ident_sys.inc +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_cp932'' collate cp932_japanese_nopad_ci, _cp932 0x0001050001) as c1; +select strcmp(_cp932'' collate cp932_nopad_bin, _cp932 0x0001050001) as c1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_eucjpms.result b/mysql-test/main/ctype_eucjpms.result index 738c72e038c..d65c942f1c4 100644 --- a/mysql-test/main/ctype_eucjpms.result +++ b/mysql-test/main/ctype_eucjpms.result @@ -34822,5 +34822,14 @@ EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); ERROR HY000: Invalid eucjpms character string: '\x8F\xA1\xA1' SET sql_mode=DEFAULT; # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_eucjpms'' collate eucjpms_japanese_nopad_ci, _eucjpms 0x0001050001) as c1; +c1 +-1 +select strcmp(_eucjpms'' collate eucjpms_nopad_bin, _eucjpms 0x0001050001) as c1; +c1 +-1 +# # End of 10.5 tests # diff --git a/mysql-test/main/ctype_eucjpms.test b/mysql-test/main/ctype_eucjpms.test index 12f1d5fc507..370b4a77328 100644 --- a/mysql-test/main/ctype_eucjpms.test +++ b/mysql-test/main/ctype_eucjpms.test @@ -620,6 +620,13 @@ SET NAMES eucjpms; SET @seq=_eucjpms 0x8FA1A1; --source include/ctype_ident_sys.inc +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_eucjpms'' collate eucjpms_japanese_nopad_ci, _eucjpms 0x0001050001) as c1; +select strcmp(_eucjpms'' collate eucjpms_nopad_bin, _eucjpms 0x0001050001) as c1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_euckr.result b/mysql-test/main/ctype_euckr.result index 5fb8175b00d..afd2d7a3c27 100644 --- a/mysql-test/main/ctype_euckr.result +++ b/mysql-test/main/ctype_euckr.result @@ -26335,5 +26335,14 @@ EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); ERROR HY000: Invalid euckr character string: '\xA2\xE8' SET sql_mode=DEFAULT; # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_euckr'' collate euckr_korean_nopad_ci, _euckr 0x0001050001) as c1; +c1 +-1 +select strcmp(_euckr'' collate euckr_nopad_bin, _euckr 0x0001050001) as c1; +c1 +-1 +# # End of 10.5 tests # diff --git a/mysql-test/main/ctype_euckr.test b/mysql-test/main/ctype_euckr.test index cd6e952abe0..596a079932a 100644 --- a/mysql-test/main/ctype_euckr.test +++ b/mysql-test/main/ctype_euckr.test @@ -250,6 +250,13 @@ SET NAMES euckr; SET @seq=_euckr 0xA2E8; --source include/ctype_ident_sys.inc +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_euckr'' collate euckr_korean_nopad_ci, _euckr 0x0001050001) as c1; +select strcmp(_euckr'' collate euckr_nopad_bin, _euckr 0x0001050001) as c1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_gb2312.result b/mysql-test/main/ctype_gb2312.result index 5f0613714b2..86525e575e2 100644 --- a/mysql-test/main/ctype_gb2312.result +++ b/mysql-test/main/ctype_gb2312.result @@ -5323,5 +5323,14 @@ EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); ERROR HY000: Invalid gb2312 character string: '\xA2\xA1' SET sql_mode=DEFAULT; # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_gb2312'' collate gb2312_chinese_nopad_ci, _gb2312 0x0001050001) as c1; +c1 +-1 +select strcmp(_gb2312'' collate gb2312_nopad_bin, _gb2312 0x0001050001) as c1; +c1 +-1 +# # End of 10.5 tests # diff --git a/mysql-test/main/ctype_gb2312.test b/mysql-test/main/ctype_gb2312.test index c2d513f1f5a..50b530a1d78 100644 --- a/mysql-test/main/ctype_gb2312.test +++ b/mysql-test/main/ctype_gb2312.test @@ -200,6 +200,13 @@ SET NAMES gb2312; SET @seq=_gb2312 0xA2A1; --source include/ctype_ident_sys.inc +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_gb2312'' collate gb2312_chinese_nopad_ci, _gb2312 0x0001050001) as c1; +select strcmp(_gb2312'' collate gb2312_nopad_bin, _gb2312 0x0001050001) as c1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_gbk.result b/mysql-test/main/ctype_gbk.result index 152f7972450..79910f322c8 100644 --- a/mysql-test/main/ctype_gbk.result +++ b/mysql-test/main/ctype_gbk.result @@ -6793,5 +6793,14 @@ EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); ERROR HY000: Invalid gbk character string: '\xAA\xA1' SET sql_mode=DEFAULT; # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_gbk'' collate gbk_chinese_nopad_ci, _gbk 0x0001050001); +strcmp(_gbk'' collate gbk_chinese_nopad_ci, _gbk 0x0001050001) +-1 +select strcmp(_gbk'' collate gbk_nopad_bin, _gbk 0x0001050001); +strcmp(_gbk'' collate gbk_nopad_bin, _gbk 0x0001050001) +-1 +# # End of 10.5 tests # diff --git a/mysql-test/main/ctype_gbk.test b/mysql-test/main/ctype_gbk.test index 2c6a233a0de..c5033555376 100644 --- a/mysql-test/main/ctype_gbk.test +++ b/mysql-test/main/ctype_gbk.test @@ -503,6 +503,13 @@ SET NAMES gbk; SET @seq=_gbk 0xAAA1; --source include/ctype_ident_sys.inc +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_gbk'' collate gbk_chinese_nopad_ci, _gbk 0x0001050001); +select strcmp(_gbk'' collate gbk_nopad_bin, _gbk 0x0001050001); + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_sjis.result b/mysql-test/main/ctype_sjis.result index 0270efcb0cc..7648511245d 100644 --- a/mysql-test/main/ctype_sjis.result +++ b/mysql-test/main/ctype_sjis.result @@ -19659,5 +19659,14 @@ EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); ERROR HY000: Invalid sjis character string: '_x81' SET sql_mode=DEFAULT; # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_sjis'' collate sjis_japanese_nopad_ci, _sjis 0x0001050001) as c1; +c1 +-1 +select strcmp(_sjis'' collate sjis_nopad_bin, _sjis 0x0001050001) as c1; +c1 +-1 +# # End of 10.5 tests # diff --git a/mysql-test/main/ctype_sjis.test b/mysql-test/main/ctype_sjis.test index 59c30cb4dd4..2e089cd85ba 100644 --- a/mysql-test/main/ctype_sjis.test +++ b/mysql-test/main/ctype_sjis.test @@ -328,6 +328,13 @@ SET NAMES sjis; SET @seq=_sjis 0x81AD; --source include/ctype_ident_sys.inc +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_sjis'' collate sjis_japanese_nopad_ci, _sjis 0x0001050001) as c1; +select strcmp(_sjis'' collate sjis_nopad_bin, _sjis 0x0001050001) as c1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_sjis_innodb.result b/mysql-test/main/ctype_sjis_innodb.result new file mode 100644 index 00000000000..6252848c8bb --- /dev/null +++ b/mysql-test/main/ctype_sjis_innodb.result @@ -0,0 +1,23 @@ +# Start of 10.5 tests +# +# MDEV-28328 Assertion failures in btr0cur.cc upon INSERT or in row0sel.cc afterwards +# +SET NAMES utf8mb3; +CREATE TABLE t ( +a year(4) DEFAULT NULL, +b varbinary(2545) DEFAULT '', +c mediumtext COLLATE sjis_japanese_nopad_ci NOT NULL, +d decimal(7,7) DEFAULT NULL, +e char(219) COLLATE sjis_japanese_nopad_ci DEFAULT '', +f bigint(25) DEFAULT 0, +g bigint(20) DEFAULT NULL, +h datetime(1) DEFAULT '1900-01-01 00:00:00.0', +PRIMARY KEY (c(25),e) +) ENGINE=InnoDB DEFAULT CHARSET=sjis COLLATE=sjis_japanese_nopad_ci; +INSERT IGNORE INTO t VALUES ... a mixture of non-ASCII and binary content +SELECT * FROM t /*output suppressed, just make sure it does not crash*/; +CHECK TABLE t; +Table Op Msg_type Msg_text +test.t check status OK +DROP TABLE t; +# End of 10.5 tests diff --git a/mysql-test/main/ctype_sjis_innodb.test b/mysql-test/main/ctype_sjis_innodb.test new file mode 100644 index 00000000000..80f3b4fec0a --- /dev/null +++ b/mysql-test/main/ctype_sjis_innodb.test @@ -0,0 +1,62 @@ +--source include/have_sjis.inc +--source include/have_innodb.inc + +--echo # Start of 10.5 tests + +--echo # +--echo # MDEV-28328 Assertion failures in btr0cur.cc upon INSERT or in row0sel.cc afterwards +--echo # + +SET NAMES utf8mb3; + +CREATE TABLE t ( + a year(4) DEFAULT NULL, + b varbinary(2545) DEFAULT '', + c mediumtext COLLATE sjis_japanese_nopad_ci NOT NULL, + d decimal(7,7) DEFAULT NULL, + e char(219) COLLATE sjis_japanese_nopad_ci DEFAULT '', + f bigint(25) DEFAULT 0, + g bigint(20) DEFAULT NULL, + h datetime(1) DEFAULT '1900-01-01 00:00:00.0', + PRIMARY KEY (c(25),e) +) ENGINE=InnoDB DEFAULT CHARSET=sjis COLLATE=sjis_japanese_nopad_ci; + +--echo INSERT IGNORE INTO t VALUES ... a mixture of non-ASCII and binary content + +--disable_query_log +INSERT IGNORE INTO t VALUES +(NULL,'tsls','ce LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHO',NULL,'g',0,4,'1979-03-20 13:59:42.0'), +(1972,'j','? y瘒?5οΎ› ~-イワ?\r?WC @οΎ” ?ο½Ώ?=ο½³r!IοΎ—.%ζ’“?菓キ?dIT9%NοΎ›c*1i?οΎ‡ζˆ‘ο½΅4ο½§?)5ζ…΄οΎ„?/rUGCο½·|刈ヘY5レ嬢?ο½°;源ヨ ゚ケ,V敝|*9οΎ“V@ο½€2οΎ•δΏ^僡!雫ヲ笡?^j。゚?#Vc@1%BοΎ„?Lo_*ヲワFン? ィ?5cο½°;η«™kJaο½²?δΊ€οΎ’?~$η­§?\0Yy ο½Ή%?SοΎƒンTzuοΎ…Q ミ{?$οΎ”??? v\nεο½΄6?ι£›?οΎ›θ½£.ο½―}PοΎ‹ο½’θ²Όホ_0ζ“ηž½ο½΅ο½¦U5&[1i杷bοΎ’8;ο½ΈοΎ›?ο½ͺο½Έa??\0-\ru?>ο½§ο½§9ンkミ??η¦Pο½³?ネ^=Y?{rRB~ミ;?}?\r.{)ε’??#ト稽悲」??稷ァィ゚$Oι‡Άο½―οΎš}OS「枝?G?}ヲツ+?1,゙&栖`ォマ?@W?οΎ–?廣?ο½Ήο½¨ι–Šη‘³\rN?Xζ€Ž?\0゚ο½₯0ο½₯ο½€?*ο½½2}θ«‘?οΎ—O「鉉+fqJ?。\\ιŠ“οΎad?)ο½Άh?チヤミ私cT?X??yN ォヘ>+ο½ΈcV\n[οΎ”4Qネ?゚d? ?$@οΎ‰.ηΎƒοΎŽU?{\"<οΎ–οΎ‘οΎ‰οΎ€ο½°Vο½₯z?gP?(\Z>CεŠͺ#lィ?η”«Q0θ±’4=3\\οΎ‡Z!?ο½Ά+oe$t B{撳惑欧裲οΎ‰οΎ€?θΌΎ?4οΎ†ο½ͺε’¨]+ζ·η—ŠlEοΎƒ;ソ們狄「0イアゥ?7ホQォ濢lοΎ†> ο½₯jKアゥ?οΎ‹?J茲Xι«„F9οΎ„|?ヲナT禝アο½₯w?8Yο½§B硃ヲィAZ?>?8[gvIο½€ο½ͺοΎ‚ο½£ζΏ˜θ±ΌοΎζ–₯-ο½ΈX?ο½₯EI82K!?UリdぬB推?*??9ャtク芍eδΊ‚\0vq」ε₯Ž??N?倜VοΎ• 1ワ??\0ο½ΉXBoヲ\\Dε†Šθ†¨)5ο½₯M@οΎƒ?B?1οΎƒM?ハー?6οΎ’ι»”2ゥoA?ク轄??οΎ–\0E0ッ゚。A?R吃ZU?sミauοΎ†?+?ホ?οΎ”\0h?8:?/T?\rοΎ„ο½η₯Wf粕oο½Άjjv?ζ₯½ι‰„p?.8ゥο½₯|γƒΌ*ε„ΊοΎŒ*捕θCXοΎ’ο½. bοΎ’sレο½₯@ネuζ‘£?οΎ–&%#^ヌゥ?\0ε­‘ο½Ήmο½»8?ュエ錺?灯 r???ヘナ?(οΎ€ο½§\"wο½οΎ?%οΎ™kο½°οΎ†\rVWjネk?η™œοΎŠ6mο½²2qIο½΅οΎ“οΎŒοΎ„ο½€J=ο½·ο½§??hxq οΎ—ο½ΉοΎƒOャウ*? ο½§dιŠ–c#!?0?sミ?%v?9οΎ’$\0?Kθ©’}エ??VT?u\'οΎ‡ ??$?\rソ皺.qd?!θ„›οΎˆ?2& 暹?6譁ZοΎ™^k οΎ—ε„ͺエiοΎ”ο½±?\0?<エキ存旗叫aエキοΎ„フ??\0ι ‚ ワ`ーqoεΆ?\0鍄??&f?$―?ο½ΊοΎ’X?6QοΎ›[rlソv??ヘο½­ο½₯?>YrJフ8.チ{ε·?FοΎ‚?vο½²οΎ‚?/ο½Όο½§???\0Urο½£?$ロゥ??\06η©’οΎ„^。ワ?*/\Z?οΎ€i\n^δΊ₯ο½Έο½§ηΉ§#沓y。聢?\07cη°Έ?q>θŽͺ)η«ŸοΎ„?#ο½Ώrr&HT?<β–³wcοΎ”ε»ΈIExAミ?ヲニー?∈?; U\0Qセリラィ\nエ\\Fi\rjη―³?ο½Έ?g?:ζ­»bR婉 \'トト難?η₯ΊJ?e\0\n?ο½³ο½½1逓dリο½Ύ?-\\οΎ’??ο½Άο½Έ bnoJ?9<;?%w{%οΎ“sη•ͺ?εΎͺ サ村倒?ο½ͺUS?8PοΎη΄…οΎ„εŒ†ι€3η₯—οΎ™Eο½±ο½€? dεΆη­”ο½ΉYNヘ?6*?ο½²οΎ—m>ミο½\\NAFζ–ŸοΎ™mネ昨*οΎŒοΎ™ο½³aWfヘ?vlοΎ™ο½±Wcο½Ήο½·JηΈ±bο½οΎ?οΌΈοΎ…VfοΎ…&Nリ?*?ο½³bο½οΎ?6*?ο½³bο½­ο½―\\οΎ…HタルォιͺΈ=rο½³fοΎ…偽キヘuNT?9NεŠ”ο½Ή\Z?SοΎ‘nlルーqルウfοΎ…]?6lUοΎ™ο½³fοΎ…]?6lUοΎ™ο½³fοΎ…]?Mο½±ο½Έο½ͺ?οΎ†ε™«?η˜οΎ?6*?ο½³bο½οΎ?6*?ο½³bο½οΎ?6*?\Z束J?,p操ο½₯qHh?ヘ?;6lリォウfヘ棺6lリォウfヒqォYο½³fοΎ…]錫i\\qラ??;η­§\\οΎ™ο½³bο½οΎ?6*?ο½³bο½οΎ?6*ο½ΈH@ヲ7ο½l。48ォ怛衴ウ1階Yο½³fοΎ…ヘ?6*?ο½³bο½οΎ?6*?ο½³bο½οΎ?6*゚#οΎ“+6lUο½§οΎ„ο½²IF驍58#駆疸r4fォ恕Wζ₯ bο½ͺ9ο½³fοΎ…]?6lUοΎ™ο½³fοΎ…]?6lUοΎ™ο½³fοΎ…]?6lUοΎ™ο½³fοΎ…]?6lUοΎ™ο½³fοΎ…S]:οΎ”J7οΎ‹ο½»ο½ΆηΆ΄?A〕ッ 0}θ€Έ???,NVlリοΎ™ο½³fοΎ…]?6lUοΎ™ο½³fοΎ…]?6lUZ fζ₯™q7B卦爿+ッォ?9 fο½£L\'ο½±Xθ‚„?&[οΎ‡ε°‹οΎ€οΎ˜?fοΎ‹U,h2οΎ™\n\Z*ミοΎ‹dヲP4οΎ‹-\\UnlοΎ™ο½±We―ャ|F?UiοΎŠοΎ…%?η­¬ζƒ£ε–˜οΎ’οΎ›οΎ–ο½Έ?7\\-ヌィエタ?&lルーqルー簽NB\\aLι©šζ——cJο½·,ャリο½ͺ?? ?)袊.*m幑挾レ)+οΎ—ο½―ε…‰G\Zcd|B1_Y0ο½Ύ/蝟 01Gο½€δ»„I?ι©ͺ$ε†‘ζ·»θ¦š?B?\";ο½οΎο½ΎG&eア添各4QοΎ‰?ο½ͺ>{η—ž?XGネォ栫ソ貍V9i卿?=}ο½°?ο½ΈοΎ˜ο½¨ε‰Œε©οΎ›ε»±yィ?ο½―??\0+??οΎ›?dοΎ–-\n?οΎ•ι°’ζΏ€A?οΎƒο½§-οΎ…^\0l=ォ?_/?&?\0[?ο½mοΎ€θ© K\\ο½Όf。ィ=sBフュホ6*テq?ο½Έ?δ½— q?c?|&?ァ繚rUd柝j??隈尽キO qqοΎ€RFζΎ‘?&搾?籬??-fοΎƒuοΎžζ”«\nοΎ”W?\0ο½’1)QTaQο½·lXEοΎ…eο½΄ο½―οΎ”οΎ…οΎ’ζ½ιŒ οΎ•η‘©#F。44?P訣&οΎžη©‚?οΎ‰t?-5>OοΎ™_ο½―?Z?οΎ’?\0εΉ…JοΎ•??ζ‘οΎŠοΎ€ο½―_ο½Έ?θ«‘{οΎ€TGtοΌ•βŠ†:ζ΅„_?kοΎƒ?\n?I蹠摯吻チ「W???ハg茎耢3捲縱a-エォ$εΏ€θ‚–?\04猴]n?οΎ…)οΎžο½»ε—Ή?\0*???-ζ₯«??ο½§οΎ•ο½―z~??)2A6滝,\rマトθ’‹?G6wiοΎ•ο½ΌιŒ―Iο½­{ζ»•N,Y@篦菜??\0Uο½²9a|οΎ–οΎ€Gvq|O?ο½ΏοΎ…?8{Crο½’@k?8ο½±/FοΎŸοΎ‚δ»„Jエ m\\ヲDZS?|ο½―L2?G?*ィトミ\0>9醐ロ|F61?櫚T?]ォ?ャ.I蟢8マメIοΎƒ !?|qο½ͺζšƒο½»asン{SUι ‘)οΎ…Sz撏ィチqワォ)?οΎšη™–ο½¬ε³»ο½§θ £/z\\4ο½·οΎ”Rι§›ゥ?ο½§ Gζ½€?$UGοΎ€??Xο½οΎš\Z$捧?ο½ͺRι»»οΎοΎ“οΎŸKο½t?θΎ²vマ``ソ? 我9&?Ξšθ€?樂]y? οΎ›ο½―?UηΆ½z?οΎ—οΎ…obοΎ’οΎ†)οΎ…ο½ΎοΎ‰_ζŸ}cοΎ‹3ι°“εœ»;?\nοΎ“??\0ノマX=ο½²N?)+B7?)総_οΎ‹UFTE?ε—½οΎ‹!η­οΎœοΎ„οΎ„οΎ‹??ο½§q鰯禀ン3ο½Ώ]y>οΎ‚ι·½rFmθ¦―F?οΎƒ?c?/3?[[\\A?ο½ͺ ?\nο½­B??\0)ンj?\0?pフ cοΎ€?Eィ゚|ゥ#莊?Zο½·ζΊΆtο½·+,r/ο½Όθ‘°}?c\nJοΎθ›ŸΞ»?%&h\Zォアノ<\Zーヤタ受欺 ヘ#nοΎƒ?灌?\0ο½οΎ™xチ?8レι‘³0ィ,?οΎ”ε­—xοΎ‡3?RO?e[恒イK}茘mrンu]?;\nο½Όcbο½­?U?E ο½­TοΎ“οΎ‡οΎ›?\\ζš?:賦GィYο½Ίο½Όjhフ`οΎ€Lζ΅ΉοΎ‹??%ο½£c??Iフ?リZ?欽ュ?2οΎ‡οΎ‚?;θΏ«?ーチ:?ε­ƒ4蒐Ky公q? Fワク;ヘ?!dη§°1??\rοΎ•$^?ι£½?-ο½―Xj\Z)1ο½£?-e?A艷曁?οΎ‹ο½―?WοΎ‚%ο½·\"ε²Ά?=wO?=ο½―εƒ­ο½§/ンタ」ォTη¨?οΎ‹$v?ο½»ο½§マM凛4}e?\0ヨマ=阯1ハ滿ο½ͺNヘEθ™Žz?9(οΎ“|?.ζ’…ο½­ι«―t?15?\0軍|YT?Af οΎ—\Z\0ο½­E?AοΎ›?゚P\0?エ7?\0bοΎ‹?6ο½Ί? ε£±2Hサヲワ??kη­₯ォ`ムζ΅…??ο½ΆA*QX?\0?4oοΎ‡??_??( ZοΎ“ο½Ώo?hοΎ–@ο½’οΎ†S皺?Jθ‘„οΎŽK,恀逘[ッ磋アT$QοΎ‰?74?1@c数ィ,:?ン蟹1?7ζ‹“δΉžο½²ζ‰Ώ_?ζ¦Ύys?珍ハζ΅„η­¬^ヘ q??9?hマテコ璽ロ手F?ο½Ίο½°?η—°η­†GοΎ’1V:?(屑ト>エο½Gu?,οΎ™k0 アンz?οΎ†οΎ™7ケメト┫杣}淘?OEyミャ,ム。*E?γ‚«?οΎ‹ri2ゥ?={?\0ο½²οΎ‚3ィ゚yr?ο½­~??)゚?芭?\0\Z?+Pミο½,匯」]ο½Ή\0v?\0Zο½Ή? ? Yη΅΅CοΎ—08&Kv?(οΎ€bk?&+οΎƒcο½ͺ%?ο½­? ネ=ο½²οΎ•A5ο½a?1kRィユ彫エツォR\Z私゚οΎ‹οΎ“5クク胙ο½Ά0F]?G)BH9οΎƒοΎ‡tο½§JηΆΊ6ο½ ο½«Q|&ζŒ‚?Fkナィ}ο½°2ο½·ο½»S$\Z&ο½½5ζŠ–\"Jο½§ο½ͺ7?H尊Pο½’οΎ—?-?ィ?hqォ \\FgRZζ˜οΎ›ο½»ο½²\Zォ。ナ?5iWJR灌V-蝓BKο½ΏB?F???6*οΎ‡>ゥ@A F5~ι‘›εΎ³(岫rf。素οΎ‰Cο½Έ9οΎ–tο½»hdeο½Ά=+N??\0ο½²οΎ„|ο½½ο½―K?]+ま?アチ/\\vQο½±zοΎ–ο½³ οΎ‘Zサ倬?\0k?ヌ疝企z^榎?/ο½­\'MοΎƒ+S??\0.ο½ΈdhKxワ學峰鳩c?j?\0艇8M$(^οΎ…ο½½d?h(\0οΎ—?5ο½Άο½­ο½―)θ‹‘Tο½???\0οΎ†ο½Έο½€ε£₯ο½Ά?0[ネ\rサ攣ァトァ??\rοΎ•(ο½°?ο½Ά?0ο½Ί?iοΎ…??注>?y?,?ャhοΎ”ο½Έο½Ό?z?*GοΎ”1ヲヤャ佐?(戞蟢糒エッGοΎ‰Pε›‚η²˜Sο½½ネ?0ο½ͺ?ζΊ½οΎ‰%剛ー@m慍P(S聯モヒ!Zε†’ο½€ο½»hθ«·?ο½ͺkQ?ο½―οΎšοΎ‰οΎ‡οΎ–feο½ͺn=?66*?2?XヒィウO\rοΎ›οΎ‹0ゥ)57ハ欑。?5?1ο½Όο½»?W??ο½²?乘?)i~??θ³½?)?1ヘUc_θ²’#?\\?>??+C%?-ο½’<η©½Zη‹™ο½Ά*ο½ΏY ?; ?靹「「?:ο½ΌεΌ‰X#οΎ€jβ‰‘ο½§οΎšT\\K^エ「モ/G闍?$$FW$ο½­eζ°›_yマFィケゐ;?^εš‡?j?)j?οΎ„ο½ΊFο½―w?]:O?z?\0;|G?/ο½»?aθ‰ͺο½³ο½²ο½ΉοΎ•fFDθ·³Hォ\\?οΌ£ε©€?ο½§οΎ‘i# Pζ‰?sοΎ›[_^t?!yQ\\?ο½Ώ??\0?4ε―”οΎ’oレ-DレdοΎ“\\οΎ“ο½₯サ。愬,ce#j復ウヘ?b櫁 }BοΎ™L遇fSJ?,#eο½°ε•ΌrοΎ“mh&οΌ©οΎ•jVM??ο½£ο½³rホ]ャjヲ矍b5bjο½ͺI?W-θ”—?t?θ’ヲdοΎƒθ››ζ‰4ハP qニ?8?.ο½Ήο½Έ?ホQZoη•’xmィp%j?:θ”‘X仟HοΎ…\rミ嫉y?\'ο½^)DC ネ2?\0=?\0ηΆ΅οΎ—εΉ•niフ@v ?\0οΎ„ ο½53\0F?mi゚οΎ…r\"ε­€οΎ†ο½Όο½½?/0Gクフ$゙ァ\Z。Ug$\0cοΎ›ο½Ά\"Cη‹‚W2N Oο½²B?bィd^g゚EnjRο½€\rζ½€ο½―οΎšοΎ€οΎU59Bb6οΎžδΎ†J?7\\οΎ‹οΎ‰ο½Ί\n聊[w#οΎ•θ­΄?&ο½Ώ/?οΎ‘οΎšz|η™œ?N?O?V|RTW}?ζ—…|g\"?ィmζŸ”|b?EI?0ZU?δΏ₯%?ネ&捍gο½Ά?8οΎƒ?!||qη΅³ο½ΈhMοΎ‰ηœ???Zq\\??FοΎ›?ηΏ‘??%W?mοΎ‡? bο½·ZUヘ`byzf? ??\0?юθ‚„?)b~ネ??6iォIgι€ F゙ィ ο½³ $?.ネh=ο½±ο½΄οΎŠοΎƒJャ\Z?I9|ハW華?#ο½₯q?@チ?#οΎ›/iζŒ™P7οΎ›?ハT\'~リmvοΎ—ι³³+οΎ†ε…Ά\rA\0ο½°=οΎ™p偐?0ο½¨οΎ›ζŠ’?8?糟q/^οΎ€t2GSHq#οΎƒエセXοΎ™}hοΎ’TP@V?\0οΌ©?;?.mZ6\rXζ’€??gηš€}ζ»Έο½°r隧|M?0v^T?\rhη€Ύt?4\"?FοΎ‘ιιΆ²?-?儼ンV/YY%~??\0οΎŠθƒas?!MG? ??nE?\nοΎ“οΎ‡?ο½·?4@y廏\'?ιŠ€οΎ†ο½ͺιŠ…οΎ”θ½ζ·‹ζ·˜PοΎ„tο½±?\0c ̄莎b析%ο½Ή?\'cL凉fマOοΎ–οΎ–[[ιœͺrο½²?P?/θ€Έο½Ύ?#?ο½§\\=エ爿#SqJ?\0??ο½7ο½½/εš|ε‡–οΎ„??T~b?JDοΎ‘?ネ衫ィ?萡KKゥ?ヘl???xサ樞V萌/!?ο½Ά??8z?*ム。Tο½₯Oε£±?>ο½»On?卻)-wQ眦?\rWο½£-w\r1ο½²ZO\\??(Ykn?!?GR?\'?U?ャマニqコ罫K?οΎ‡?J槨゚Pp1掾5>9οΎ’ο½³ζˆ²GQバ?ο½­N8ο½’ο½ΉnK?@)?ャοΎ…BοΎ•N?οΎ†-mhοΎ“)??\0v泌ス6οΎ… οΎšοΎŠο½°ε–Άb?@η–‘οΎŒοΎ??ο½Ά,$\n)r槨?|οΎ’ο½·6b3bZ2T?gε₯΄Pcο½’ο½Άε•Ό?\"Feп。q6r68?*θ—₯uチ_YDοΎ˜οΎ“??ハンアο½₯DοΎ‰p+TοΎ„ο½Έο½Ό?rΠΌ|ο½²?9?6T3D???q?0;Lh烝ユ~?\nャウF戲j>??*ο½―Jbqο½ΊG ,9οΎ†%zT|ο½§u陀?οΎ“οΎƒZS\'。キ7rャ*UK\ZU?kxθŠ³ο½¦θ”ŸοΎ˜vhοΎ–,οΎ‹?ο½―5\0+ο½½ο½Ύ4ォロFo?3+ハ@;J?qο½£qg?\\土?=>?οΎ–οΎš?i$ο½±K\\ζ»“iGタヘ??渟ネrNοΌƒε€₯~-?CR[ゥ+\Z\0+ο½°ο½\nン6ζ˜“ο½bゴv?ォP@PP|???οΎ‚a岩ミOο½€? ???゚eーァフ?YjsοΎ…\0? ハ。ュ|I\\Aι–­οΎžζ»΄ο½»?ο½·ο½Ά{裂メ庖 ο½½ο½³οΎ‡ο½Όο½Έ?3橘?゙:QδΉ‹?}ο½€?\0棔ヘ?\nο½―ζ²Έx/ο½’?\"Gチ@jミ?\0η•ͺホケeゥナw$?*89 H?鯀ャ泓Mqvο½²D? 5ο½¦οΎŒοΎ„ο½³?8oο½οΎ›CEoο½Όhv-J穣葞ヘcf]ο½₯? $??ο½―?,T[0&Yζ›½ο½ͺzaNε…Ž%ο½₯エ0<ο½’Fq?)?\"Zミ@ο½Ώ?η…’EοΎ‚ο½³Yο½°>ο½€gzq=~οΎ—οΎ…\\ZGサ敍ラ,mη•›2οΎ†?A?ゥ~,.ο½ΎοΎ”ο½£iqrzο½ͺ???η°—z?e^\\っャ^% οΎŽοΎ‡θΏ@%ソリ?君? 鈎ホヘ\nÅャ@?4?\0坑レS;οΎšο½¬ζ‰DJ?ηΆ«??l0ο½ΊοΎ“^οΎ–οΎ•/Q?\0x貎οΎ™1g丢ァ遑/{ο½§Gο½§I\rcε‚‘チ.οΎ‹η‡Ήο½»E_?竊aοΎ„?\0l\rヲε©ͺο½­KοΎ‰!ィr初??vヘmJ g$?Qο½Ώ?ミMォ?2/ィヤPο½£aοΎ“2UIο½―\\\"?$P鍜lィN?t;vヲ*?^<貑{?:οΎ”?$?\0G?qεΊ·ι…₯潁ο½Mfο½ΊY,\\リ?9k#*。&ο½Ή ? ?3ζ—ΊB2?^\n nN6レフVsE\'ゥト嬬^?\rOl帝ゥ2ォJ bエ$οΎ“?ηͺテ第ュGヲ<5c\"5ο½½v?\0U+?ο½₯?XxQοΎ˜οΎ–??与YリR?(2?L)??1臓FKgwζΌ‚J?ο½°?ζ•΄Lο½’PεΈ­οΎ“ο½Έ?#D{3Ic高Gミ?1 Az?οΎ–?2?7οΎ‹^~?ゥ??οΎ‡)ネホ,f?wpR\Zο½Έο½―\'?$0ハ;?1レjrr;ャepO?)!\nοΎ–ιΉΉF韲@? ??%? フ蠣3&οΎ‚ζ–Ή OοΎšοΎ‰ι€Έο½ΎοΎoη₯ΏεΈ?Qο½Ώ \nοΎ”ο½§ゥ4οΎœεΏ–οΎ“>ヘン淳ァ?οΎ†?(??bοΎ…ο½ΈA\'ο½°?!8針hο½«οΎ›οΎ„ζ½ΊηŒ«y?Ξ΅:蟾゙? 隠スァ?ο½€?\001゙ゥゥζΌ†[ο½ͺX?$pο½³εŠ©οΎ‚\0エ?ζ”ΏοΎ•L 允ュN;θ’Ό~?:ηΏ”tι“S\"οΎ–ο½¦ο½€η«Šο½€\"J?W?8οΎ€οΎ“-圜?οΎ†9ヲン?q??qナ7οΎ†q-οΎ—aηΉ½Xο½Ή}??ホリ\nw+KηΏ«ε†·οΎ†οΎ„ο½Όζ€Ί??ゥAη—Ό?)?V?ο½°οΎ…ι€™リク οΎ”??AοΎ‹PE; nοΎ”?ο½#4靑庢2Iv?\"?l<0?οΎ†οΎ‘i???p4?b?οΎ—ZοΎ—$tοΎ„ε£ΊοΎ’ο½ͺY?\n.o?οΎ…οΎ“οΎ‡\'rbd5y?6ι΅²K;Jw;blθ”ŸοΎ†ε†ͺοΎ†#οΎ‹ε§œ&MοΎ–?2θ­°Iニ当*龝WLu0ο½₯ルゥ?.δΊ™[ヘ\\ャア???\n?οΎ—[ε›ŽοΎ‹9ο½±Vク耊岼W\\Uzメ。テ?*?δΊ€E$?? ARο½€w%ο½Όο½§?*??ο½ΏιŒο½§οΎˆοΎ‰ε¨  ,οΎ’η”»ロ。w?\0e?BζΏ”V?B}0οΎ›ο½½66??JG???οΎ‚ο½½+L}b笊r\rリ?゙UFοΎ‚οΎ‚mJ@?\Z??エン;%οΎ›? キエιF8ο½’? ?~+Aι―’????ヨチシケ.チ1ο½Ίο½Όζ–œ:ο½Ή\nζ³³~ε‘ˆο½©\rQ<{?+ο½Όο½Ώη΄„ο½ΉοΎŠοΎ•=ο½ΌgοΎ‰\0I\\οΎ’WgοΎ†ο½³b|ο½·οΎ€J@VdοΎ•_lο½±7:{η΄Tι †ο½*ο½”zοΎ€η’Ί?鬨纈|?0?硆S。AοΎ…RXο½―ο½₯。?οΎœο½§ζ ΄οΎƒ{?ο½₯ο½Άο½½p-ホ梸ォοΎ†ο½ΉQοΎ‚ο½­??ο½²ο½―+%W|T$ο½Έ8JθΌ”Nリam1?DH?ο½Ή?瘁????ァレ&」ヲ#*4dイ怈ο½ͺIuο½§?οΎ”2??pο½’?:#$Pハ%RοΎ•;君[D?η˜§ο½±οΎ‹ο½½οΎƒ[\'Pο½²S?qヒ悒ヘ_?3i?οΎ“ο½ΉI $櫨Y?οΎ•?ο½§L?-lο½²!cο½±m翁1\'ο½€?7$?iZuοΎ‰FF\'doθ„Ήtο½»?2Kゥ(\r+οΎ›ャ))η­₯?9ι§4?]Xyο½₯L規kο½’6?ヘ?\0W??\0禳テ|οΎ•? ?)J!ο½½@ι‘ΏYP\'??摸賄ロォY? bm>h?uヲyζ©ΈDζ£ ο½ΉοΌ§οΎ™dィ?2ο½³~゙sリ?-ιΉ΅jψXlθΆΊοΎƒ-;Tο½€?\0~οΎŽοΎ•(ネ蜷?0F゚$ι§…ο½½q?k Gο½£$ οΎ€zζˆͺ???T???r@οΎ—,ο½²$οΎ“q?3?sCンs菜?c逓.T4lοΎ”?)ο½±S??θ’ΈοΎ—οΎ‰nι–€?ζ§ŒοΎ†uε£œζ‚7ン瑠\'?ィ?P#ε«£6?!u |οΎ•οΎ•???2ο½€?*ο½£?\nοΎ–ε―ƒ?ォ~ホIοΎ”]tTミイミ狙ル繽エラス\"?>p-@選ッ?OοΎ™οΎˆ%3x#ζ€?~?。漬璕qッ?* Mο½­n゙`MC?@??ォ3?\r Rエο½?ォEbx。=οΎ†fη°—KοΎ“ο½Ώ?ο½ͺゥ_Jeο½―C@iοΎ›#aο½³?$v\'?6οΎ…P2iοΎ‰ οΎ›?ο½ͺ:η”ΌοΎŽο½Ž?/%e*οΎƒοΎ‡$G??i?(フI?ο½Όο½―V?P覓:θ•¨Π£γƒ€οΎ˜??\05dCW?ο½·θ‹§仭ハq?οΎ˜θ–? ο½­?J?ο½Ίb]Pケqι«”!;ンi@9ο½―οΎ‡?;ャソウ?ヲキ?璍セ9οΎ™?(ο½ͺοΎˆοΎ’οΎ†ο½§?級リ} ?\0タ膀?ケ肉&12?iοΎ‹r?οΎ”ζ₯ θž»οΎŠοΎ„οΎ…?\n哉Xζ―”ε˜²q?R??:?\0ο½±οΎ‚ζ°—??ι«’θͺ²\ZRx聊A\\gο½€TQ?ο½Ώ|mf?エ#?K?ι˜ͺ?*ツエ?豬?=οΎ†?οΎ‰Z9Jォη™ΎPqx. V7ンOο½ΎDmο½Έθ‹³;r#??pοΎ›οΎˆιˆžοΎ…ο½€ζˆŸο½΅w逑掌G?+@GCεœοΎ™εœ§οΎ”.,寞Tο½―~゚?\rο½Ίο½·n_Xο½ΆmエモU#οΎ”#U2ζŠ„???kη°—hο½²M?η—°o\'%q5οΎ“?%?ワr\"4Jd^?5ネ?ζ§²=6δΊ‹?$ο½₯ο½H\"kiοΎ”O何ーι‡Žο½’θˆœhハ?[?ι–€D?;θŒŽοΎŸε­›?(η’―οΎ›エニ2dο½Άn\\ο½»Sゥマud?{Ξ²ο½°?ハ滴。x?.?d?ο½T?゙8?糊m^?\0?Yomャ!\\ォアィネο½₯G?U弘ο½₯οΎ‰付?hン?ヘ?\0g?θ²”h?Eンォ*\\οΎ†Xx??=οΎ™SιΊ—.vη §izK?ミ?οΎ„ο½₯ο½±ο½°ο½½ο½―οΎ–? X? d?3?-癑曰ヤエ虐sy$ゥU2[?OO?,!OZZ。?hNz?R?ζ―³i?$bζ‘™ο½½ο½Ώg\na?οΎ†ζ€£4v?[bο½ T?\0/*螒76&/*ヤシォ!ο½±]NοΎ…οΎ–?εš‡々ヘ7?胴テ??詆ャY_οΎ›Gshヘ??2)Vホ?ιƒοΎž\\?2οΎ›ZFοΎƒοΎ“rPθ·‘?iο½£fEu?\0>ヘmレミj?+sr@PS?;ο½ͺο½§?<ε½³οΎ„;οΎ’ο½€??\0οΎ‹pjζ­‡Dt「鳬桸??クレソiοΎ‹οΎŽο½±ο½¦Iε¬ͺ?6?v?vH9οΎ…η₯οΎ‘_οΎƒ{,aο½£wθ”•οΎ€R??C~οΎ–umBo?;[9-,リ醂?エ*?\0?ο½― sLQZニゥu%繊??/kοΎ–ε₯¬β”“οΎ†ο½―N[?レ??7H「叢L\\ィ?潘?\0?H-エ{Gο½Ήο½ΉΠ»fι »*~ζ±Ίο½¨η΄€οΎœο½°MKハキ\Z=?ο½²?HοΎ•ο½£;uο½£#鴉ワο½₯%\0ゥuィ度膕Uο½―ο½ΎHY真A粫ワ?οΎ…h|\'?6? ο½Ά?\"iοΎŠε¨ΆθΎ£οΎ”ο½§NδΊ™mォ?[5ャ ~ο½―οΎ•οΏ£οΎƒι± 3\rヨヘHHpUοΎ‹\"ζ°›S凋οΎ›ε£Ί?η«•\Zο½Ή?(ο½§\\y*?aZοΎ“;W逓サο½₯X。+Xο½€I?ο½€??οΎ‡8ワ?\'οΎƒοΎ€ο½±sοΎ”Sο½§οΎ“ζ˜΄οΎ‰1οΎοΎ˜ι§²οΎ‡z??Hwο½§?S們)εΌΈI&qXヤぅ?vホθΊ‘{]Nhο½₯D?% ァフ ?:ζ£—??BοΎ•οΎœζ»Έ_?マ??;οΎ‰.?j*)Ol?\0xο½―ο½’eοΎ‰#xζ——η₯€6οΎŒο½¦εƒο½»?ο½Άο½₯2スホXο½­lqε»–οΎ‚ο½­ο½ͺοΎ—θŸv;δΊ›βˆ΄οΎ›?\'δ½―Hヌ聴1?踝ノι΄οΎ˜ο½œ?zJ ?wヲF停i? フ??敬タο½ͺοΎ‰9印ZWο½Ά&_ι€()r1kε­³b 9VοΎ›n$?XZ26Z?S?3\rο½»?ο½₯?U??ε˜΄οΎ›mR籘qH#?\ZοΎ›ο½7摈|ο½Ύl@HF?9?rォ9bKtοΎ†?ヲS71ο½ΆW/l7ワォ?ヲ9zLJ>LοΎ€*?> 籌-οΎ‘?コ。VU? )??6JοΎ’(=jqe0οΎ„#?ゥ]ο½»S??+y}e$惆 0ゥ ο½Ήm?\0οΎ‰οΎ‚ι€…?9ο½₯$ヲ鉒ο½οΎ•οΎ„οΎ€Rエヒエヤマ磧?@0?低ヲb??TOοΎ€οΎŠy9$R?緜hUοΎƒ2??2θˆͺUbハ*l|zθ‘’οΎ—?0?ネyTTq?\0γ‚‘?8sθ‹—$f_ο½―*\Zl2 > |lH8θ€žοΎι “42Yζ— \rT?8實ィニミヲ*M0AWpοΎ–??\0οΎ‚?\0ο½­?\ZRο½½?ο½₯ε·›ο½±Dο½₯iRX?\0ο½²οΎ€U9K/ο½²ο½ͺエモ」コ樽U=?y>{?Dο½’ο½°?&翁\nミ??ιŠ“チa|ο½ΆιŽFjP?5ο½Έ}ζœ‰? =。タgδΊ‚?;οΎ†ο½ΏθŽ‰|)?\0qネ?ζΌ ミK3W?#??ο½­ο½Ώiο½ΏοΎ‰l妬紘ゥ?Xο½’xο½Ύ?)Pο½»?^??ζ»Ώ~ホMθ₯ οΎ‹s4w F-οΎ—?\'qュ>a?οΎ–??η±–V4vο½§?\0?u菲/狃ウ禄Xチ*Z?P?\0+ο½·屈杀?=マ峯xοΎ‚οΎŸbο½±K?-:ο½²ο½―οΎ™?\0e菖シニ億摑\'ィIォ棔??+ο½Ή/u\'?斉ぃ*J??k?0 οΎ™s}ヘチXοΎ„nο½»?\n?5οΎ’bミu]-釀?+|ο½»!ワ/οΎ›? ?ォ?Lο½²Zロャ?NhcSU?\0+l;ラ妣ヤ.οΎ–?οΎ‰i ?οΎŒε½‘?,7ο½²?/ィyj{ VG+?a?ο½Ί?ε»‚qコィ縞2i鷽レο½₯Z竍?~ヘeοΎ‰οΎ‰ο½€?E融1θˆ’8レHο½Ό?\0\n??騙/?.ζ—…οΎ—h?ο½½?-\n0&1ネCj?>?ο½±\r+LIチケセ-?ο½²\n}ッル牀Uο½€?\0+?:οΎƒN郡i#エ?$H?~#?~ホハ?PHb2\'??0οΎŠοΎ›οΎ‰οΎšο½¦ε¬Ά%ο½½ο½³yvc?エ故1θƒšE<覓s?&эサ?`暸@?ο½·?ζŠ—J?q?FbI?\\[Z??壗チmf?I%ネ??roοΎ™οΎ‰q?/>?\'οΎ‡SJ\nβ‰ͺ?$,e筌p{{bο½― οΎŒη„ΆzwοΎ‰?\r(Hο½€T\Zζ’±?6&K9,w=N*タむ勇QZ??*?#+1wο½4ο½ͺε„Ÿi哦?sοΎ‘W?3οΎ‘(?ο½ͺxοΎ”bο½Ό?\"$BUβ†’#ο½¨οΎ†οΎž^M})榱フ?7V=M2)hrヨ穏ο½οΎ„η―·\nο½₯9??*0F\ZLεΉ•k?=οΎ‡+θ©”ι°»ο½£?恀?\0膏梯+??\0YEKθ“„/?老ニヲケ咀ルX倫9C6ハ+ε„•ο½±?οΎ…?οΎ”P>\"zη«₯\rοΎ–οΎ”οΎŠ?(ο½’?j1S。0οΎ‚οΎŠ(?8f R6cネ?η―©H?\0οΎ„?ο½­θœ‚|m?&ι“jHィ魂,{??ο½+ァ゚ワiο½³ 嫻璒ソマナrηΉ•?\n\nοΎ”?4οΎ‰Rヲ/ο½₯οΎ‡ujキーネ柴:1U\0才+3}? ァ魎_ο½Έ?6騎潁キ?οΎƒME-?hο½\"u ?#GR\n?~KοΎ‡?S?ゆ淙?Yキヤ臑JοΎ„Tヘ#\Z\nο½ΎηΆ‰θŽ¨ο½ΉδΉ±&Kハ]ο½ͺiοΎ‹ο½’Fヲ?ε°­?ο½ͺFε­‘aOο½΄οΎŸο½°ε±‘Yο½Ήο½Έ{?\ZW$ο½³\Z樽sq?l!kk8\0∴;TοΎ—?k9ο½­i?<ι‹’9 ??ο½₯向ο½!??οΎ‡ο½’θˆžη©’οΎˆθ™Ÿ|\'tο½Όi?pο½³ο½ΈVε―Ώη΅…?\0ο½οΎŒ\0q?rリヘ?\Z9?ο½p?οΎ’mV?4?F? 。F?捏@?οΎˆο½Άζ’—οΎ“ζΏ ο½©ο½οΎ”?\0W?dS6ノ榴+(N$\rゥモ XοΎ—?ο½Ώο½Ύ))~!T?q*。7ο½₯4οΎ‰$ο½?_3j討?BK\Z\n 蠎アf?\n5ο½²? ZB\0O\\Uο½’f?οΎƒ^ο½Ύ8 Kヲヌロο½=マWι»―?2JοΎ”?!^)?δ½³ζ’―]螽゚e^ο½Ώ?c->.?;x?\r=οΎƒWο½―_ο½Έb\rゥ.iYS胃ソ?οΎ†?ィθͺ•V?\"サ侍コ?\nL?>#?6οΎ€rL? jhaη£¨οΎœοΎ€ο½¬?W燬° ο½£ο½§|H|?οΎ•?ο½€οΎ‚θ²»ηͺ˜ ?\"\"?u゚ο½6k?vワ怈Y$瀝\rVy nrοΎˆη›–eο½S?gο½Ή?ο½ΆοΎ†?ο½°9jeοΎ†?\0ο½°a?ε½Ώ9ο½²ο½²IvXcοΎ‚οΎ—[Jfク麁瓩\\i憂θŽaζ£Ί?7ヒヘ?\nο½Ίεƒ–οΎ“186οΎ‹L{ο½Ί14S?i@?V\"#οΎ“ nャ犒pζŒ―οΎ›οΎŸο½Ά [EaS?ZοΎ’Bccミu髟$Oο½£γ‰οΎ€η Œζ•΅ο½¦|iC1ι°Ύ?ハ?UοΎ„lャァス]ο½ͺXε’»?エ禾エe\n.n????\0?{ο½ΉV?? ?ο½ΆοΎ“?θ’„\'?ヘリ5,οΎ’6?撍οΎ™m?γ‚’???[ο½£E?=ο½°?$ο½ΆοΎ’\"リ,j:ζ¨’ι·Έ?6_Qθ“Ώ?ο½»οΎ”eο½»b?ζ§²$οΎ‡??チレ「?6??\0ο½½PxηΎ¨ο½Ώ??θ€οΎ‚i*?\n熨??Uo??\0[η™Œ;甑m?*οΎƒ?\n?B?2rO??9wο½’ΞΆ,?Oハ?WG?1θΌƒ οΎ—??沂?\'?,ε± :玲[tδΈΌ&a?ワW?οΎ‰p??ζ₯‘ο½Ώο½ΎA膰逐?ο½³ζΈ€?_k:DοΌ%θ‘’[?1フLr.zoC_ハ?&?eR$ #?n?ε»¬θ‹žIBネヲ保?ιœ€? ミャ?ゥリWο½·?οΎ†εŠ΅RεŒ…ε·»ο½¬ιž³?*οΎ‚ο½»P?ο½²GR?n0(xοΎ€(竚+? οΎ’K?レN怐鑷Ugキ銜イミο½» ο½―?(ο½―{\0゙#οΎ…z?οΎ„??=E+οΎ—?O(οΎ‚@οΎœε£±οΎ”|ο½ͺォ?=ヌ菩e#η°‡ο½­ο½Ύθ±Ό?N\r ?ηŸ―οΎ„\'ο½³I(οΎ‰B|0οΎ™W苦曄ryοΎ›ο½Ίε›?。?G#?「菟クr」Wビ?9ンnエSネ2?<:??3鞣?\nプソOο½»&2E?yθ¬–?-J?οΎ•xζ§½ε½Ήζž‰\n?iοΎ“Bq$ο½£.οΎ‹JVο½£οΎι›œWsD6゙」oοΎ•?{οΎ—??ン[對e??リaTο½ΆοΎ’οΎ†~$η‹Ή?2s?佡101?B?οΎ—οΎ€ο½₯^ハrq \0???d?Cζ–½??[ο½±?チoο½§hnAャゥシ草ηˆ›οΎ…fοΎ’θŸ η°«) N?キレチ融: Q%$Vο½£bG?。?-1I??Tο½²η©«|ο½»{?-B?!\rVο½½A?jηš€οΎ˜οΎ‡;θ”‘\'?&ヲァ。k??ο½Ίc?~ホ:?bοΎ„?mzY#η—’ rW?οΎ‘?ο½²+}恁ワMcチH\r?eη©€?!(ο½§οΎ‚οΎœο½ΈοΎ“??OwN~ォ??0οΎ‡n概#ε„»~<樟\Z?:?2?\ZoU?\0?劼kf1H#)%h[ζ’­?:? ]=wGοΎ”&?-テイケゥ*\n~メ稽?wQハア#οΎ†(xrq?\\[?\\敬ε„»6!-?I?P?nοΎ‰ο½Ά??+]vε ΊXο½’r?\'?WフYFQ7M?ο½ŽοΎ–ο½°θ›‡?剄\n?ο½Ώeクォ/οΎ™οΎ‚οΎŸ+K?=ケヘlοΎ†οΎœ?\n@ο½―?3rοΎƒ?,e7\"$ο½Έ割? ?\0Y]G,3uk?οΎ’N{UN??!θͺ ο½©*ζ²–οΎšjοΎ‡οΎ’ο½ͺ??ζ•ˆοΎƒ\n?PFοΎƒο½ΈοΎˆ~吩?,ο½§wSBw。o?暒9οΎ€Vスゥθ‡ͺ??0? 。ヨfο½³CKθ…†$?\'? ο½°z%ォ;\'ε‚˜e?7ο½―??ε•£.^yネ??/οΎšοΎ…ηœ„ο½Ύο½Ή\"゙?4蓉?F?\0ハ代otン;N2ο½₯οΎ•οΎζœ΄?ο½§η‰’ο½’οΎˆο½ͺθƒ―???Hο½€?F?ィュd??烋7\\eοΎ‚=ο½Ή?@?cQ?ο½²b1\\d:?チコbォ^G:PVε«©ο½₯。hBQビ?=?οΎ–οΎ†z?+。=?\0η‰Ύt?T?βˆ‡ο½€ζ„??ο½³?η{ε‰Ώ:?フiSοΎ“ヘホぬ??ο½£εΉ΄\r?ε…’εšοΎ“V???8ォJ?_袁?瑯ムエh?\0zレθŠ₯sヲ??yBBο½½ο½Ύο½±q=ι›’ο½¨οΎœοΎ–οΎζ¬§?οΎ€??2??οΎ–οΎˆ&ο½Ί?-?ZォコQ_ο½³?義ォ{8。8譟J?;kXミ?\ZF?οΎ˜ο½«ο½¬ζ„ΎοΎ˜ο½§,レ/',0.7124939,'sl',7,0,'1922-12-07 22:15:04.0'), +(2012,'k','',NULL,'lstxvxoo',2,3,'1992-07-20 10:19:25.0'), +(2006,'txvxoobx','{ }\", \"UTAH\", \"2014\", \"37\", null, \"-\", \"1\", null, \"3\", null, \"27\", null, \"68\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-111.5871285339997 39.36070082200047)\", null, null, \"UTAH\" ]\n, [ \"row-cy2h-v4pv_yc2a\", \"00000000-0000-0000-29C8-82ED26F05724\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"SOUTH CAROLINA\", \"2014\", \"37\", null, \"-\", \"2\", null, \"6\", null, \"55\", null, \"61\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"7\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-81.04536765699964 33.99882214300044)\", null, null, \"SOUTH CAROLINA\" ]\n, [ \"row-wyg5_yc5s.2t33\", \"00000000-0000-0000-0009-A1EAD77B5986\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ALASKA\", \"2014\", \"37\", null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"4\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-147.72205669099972 64.84507631500048)\", null, null, \"ALASKA\" ]\n, [ \"row-6sii~ebrj~btdz\", \"00000000-0000-0000-6A81-EBD29358C16E\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MAINE\", \"2014\", \"37\", null, \"-\", \"1\", null, \"4\", null, \"35\", null, \"23\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-68.98502952999962 45.2542257390005)\", null, null, \"MAINE\" ]\n, [ \"row-rvmv_hqb8-tf2k\", \"00000000-0000-0000-EFA0-7FDE69030921\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"OKLAHOMA\", \"2014\", \"37\", \"1\", null, \"1\", null, \"7\", null, \"55\", null, \"47\", null, null, \"-\", \"0\", null, \"1\", null, null, \"-\", \"3\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-97.52106845499969 35.472031425000466)\", null, null, \"OKLAHOMA\" ]\n, [ \"row-qurf_mxm6.4xmv\", \"00000000-0000-0000-F4FD-DAD0CD1CF605\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"INDIANA\", \"2014\", \"37\", null, \"-\", \"2\", null, \"7\", null, \"79\", null, \"98\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"5\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-86.14995579899966 39.76691072200049)\", null, null, \"INDIANA\" ]\n, [ \"row-7e9w.a5ca.gbgy\", \"00000000-0000-0000-B852-68B67CD55DEF\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"DELAWARE\", \"2014\", \"37\", null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"11\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"2\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-75.57773943699965 39.00883059000046)\", null, null, \"DELAWARE\" ]\n, [ \"row-93f3~ptpp-jvyy\", \"00000000-0000-0000-93F5-6033818C035C\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ARKANSAS\", \"2014\", \"37\", \"3\", null, \"1\", null, \"6\", null, \"25\", null, \"43\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-92.27448794899965 34.74865329300047)\", null, null, \"ARKANSAS\" ]\n, [ \"row-7pq8.u2t6-yp2b\", \"00000000-0000-0000-E13B-08276C137DC3\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"CALIFORNIA\", \"2014\", \"37\", \"7\", null, \"6\", null, \"15\", null, \"231\", null, \"204\", null, null, \"-\", \"1\", null, \"7\", null, \"38\", null, \"70\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-120.99999889499969 37.63864203100047)\", null, null, \"CALIFORNIA\" ]\n, [ \"row-8nav_uj4s~c9ps\", \"00000000-0000-0000-05EF-D247DF52986E\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"OREGON\", \"2014\", \"37\", null, \"-\", \"2\", null, \"8\", null, \"77\", null, \"218\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-120.15502977999972 44.56745218600048)\", null, null, \"OREGON\" ]\n, [ \"row-w7pd-tam2~rvge\", \"00000000-0000-0000-DA1A-364967240EA5\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ALABAMA\", \"2014\", \"37\", \"2\", null, \"2\", null, \"8\", null, \"82\", null, \"102\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"5\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-86.63185803899967 32.84057034900047)\", null, null, \"ALABAMA\" ]\n, [ \"row-bfx3~rdqm~8r7t\", \"00000000-0000-0000-D6AD-76C43033D406\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEW JERSEY\", \"2014\", \"37\", null, \"-\", \"0\", null, \"5\", null, \"13\", null, \"52\", null, null, \"-\", \"0\", null, \"5\", null, \"26\", null, null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-74.27368565099965 40.13057159500045)\", null, null, \"NEW JERSEY\" ]\n, [ \"row-ihca-r6sm_j485\", \"00000000-0000-0000-8835-76DE92BD0A04\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MASSACHUSETTS\", \"2014\", \"37\", null, \"-\", \"2\", null, \"5\", null, \"75\", null, \"98\", null, null, \"-\", \"0\", null, \"1\", null, \"7\", null, null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-72.08268985899963 42.27687014100047)\", null, null, \"MASSACHUSETTS\" ]\n, [ \"row-q8yq-pfae.5iyh\", \"00000000-0000-0000-2104-5A07B1D13849\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"IOWA\", \"2014\", \"37\", null, \"-\", \"5\", null, \"61\", null, \"180\", null, \"1306\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"2\", null, \"POINT (-93.81648936699969 42.469401477000474)\", null, null, \"IOWA\" ]\n, [ \"row-yzs9~3ssn.gb6z\", \"00000000-0000-0000-D8B2-772D6478CB4A\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEW YORK\", \"2014\", \"37\", \"12\", null, \"4\", null, \"14\", null, \"172\", null, \"162\", null, null, \"-\", \"0\", null, \"4\", null, \"18\", null, \"38\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, \"POINT (-75.54396639699968 42.82700178100049)\", null, null, \"NEW YORK\" ]\n, [ \"row-5amt-e54z~7rhu\", \"00000000-0000-0000-1452-DB727C714C5F\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEW HAMPSHIRE\", \"2014\", \"37\", null, \"-\", \"0\", null, \"3\", null, \"20\", null, \"32\", null, null, \"-\", \"0\", null, \"1\", null, null, \"-\", \"3\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-71.50035726399966 43.65595081000049)\", null, null, \"NEW HAMPSHIRE\" ]\n, [ \"row-ejuk_u23f-gmac\", \"00000000-0000-0000-D585-11F9AE6034FF\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"OHIO\", \"2014\", \"37\", \"10\", null, \"6\", null, \"15\", null, \"232\", null, \"256\", null, null, \"-\", \"0\", null, \"1\", null, \"7\", null, \"6\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-82.40425685299965 40.06021184000048)\", null, null, \"OHIO\" ]\n, [ \"row-kdkx_unx4_2827\", \"00000000-0000-0000-A7FB-3FD62AD160C7\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MONTANA\", \"2014\", \"37\", \"2\", null, \"1\", null, \"10\", null, \"48\", null, \"95\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"2\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-109.42441687999968 47.06652759400049)\", null, null, \"MONTANA\" ]\n, [ \"row-ejbe.eiif_ajbq\", \"00000000-0000-0000-7720-7C64C4EDD0FF\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MISSISSIPPI\", \"2014\", \"37\", null, \"-\", \"1\", null, \"4\", null, \"34\", null, \"38\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-89.53802764499966 32.745512774000474)\", null, null, \"MISSISSIPPI\" ]\n, [ \"row-amps~asgf.znet\", \"00000000-0000-0000-AF78-26AB67F70491\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"GEORGIA\", \"2014\", \"37\", \"11\", null, \"5\", null, \"16\", null, \"180\", null, \"194\", null, null, \"-\", \"0\", null, \"1\", null, \"3\", null, \"8\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-83.62757601199968 32.83968158500045)\", null, null, \"GEORGIA\" ]\n, [ \"row-cctq_ndwy_fy4u\", \"00000000-0000-0000-102B-15204C828ECE\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"CONNECTICUT\", \"2014\", \"37\", null, \"-\", \"1\", null, \"4\", null, \"30\", null, \"31\", null, null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"12\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-72.64983753699966 41.56266101800048)\", null, null, \"CONNECTICUT\" ]\n, [ \"row-i553-kagm.cvdx\", \"00000000-0000-0000-053F-F5FA999759C2\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"SOUTH DAKOTA\", \"2014\", \"37\", \"1\", null, \"3\", null, \"9\", null, \"105\", null, \"115\", null, null, \"-\", \"0\", null, \"1\", null, null, \"-\", \"2\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-100.37352811899967 44.35313049600046)\", null, null, \"SOUTH DAKOTA\" ]\n, [ \"row-ytu3~kmi6_4tk3\", \"00000000-0000-0000-E92D-E3A3AD33FA66\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"FLORgA\", \"2014\", \"37\", \"106\", null, \"10\", null, \"128\", null, \"1071\", null, \"255\", null, null, \"-\", \"1\", null, \"5\", null, \"21\", null, \"117\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-81.92895558499964 28.93204444200046)\", null, null, \"FLORgA\" ]\n, [ \"row-4s96~2vqm~drez\", \"00000000-0000-0000-F19B-061643992EAA\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NORTH CAROLINA\", \"2014\", \"37\", null, \"-\", \"0\", null, \"28\", null, \"115\", null, \"102\", null, null, \"-\", \"0\", null, \"2\", null, \"5\", null, \"13\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-79.15924924699965 35.46622096200048)\", null, null, \"NORTH CAROLINA\" ]\n, [ \"row-ikuk-dgfa.8jyj\", \"00000000-0000-0000-9E8F-69F43661D18F\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NORTH DAKOTA\", \"2014\", \"37\", null, \"-\", \"1\", null, \"7\", null, \"40\", null, \"55\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-100.11842599699969 47.47531892900048)\", null, null, \"NORTH DAKOTA\" ]\n, [ \"row-uabq.jkdx.nhvp\", \"00000000-0000-0000-D434-0442CBD25725\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"PUERTO RICO\", \"2014\", \"37\", null, \"N\", \"0\", null, \"0\", null, null, \"N\", null, \"N\", null, \"-\", \"13\", null, \"267\", null, \"394\", null, \"7593\", null, null, \"-\", \"0\", null, \"7\", null, \"2\", null, \"122\", null, \"POINT (-66.49988980099965 18.24828934900046)\", null, null, \"PUERTO RICO\" ]\n, [ \"row-i6gf-qp6w-e2c2\", \"00000000-0000-0000-26F7-EDD14CD14586\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MARYLAND\", \"2014\", \"37\", \"3\", null, \"1\", null, \"5\", null, \"50\", null, \"41\", null, null, \"-\", \"0\", null, \"2\", null, \"6\", null, \"6\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-76.60925970899967 39.29058224000045)\", null, null, \"MARYLAND\" ]\n, [ \"row-2nzg-gz5z_pv67\", \"00000000-0000-0000-8578-720E3DEB8CA6\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"TEXAS\", \"2014\", \"37\", \"8\", null, \"7\", null, \"37\", null, \"199\", null, \"209\", null, null, \"-\", \"0\", null, \"9\", null, \"12\", null, \"41\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-99.4267664729997 31.827240712000446)\", null, null, \"TEXAS\" ]\n, [ \"row-avp9_hp2a-wmxy\", \"00000000-0000-0000-8DDB-7DDD49FC59B2\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"TENNESSEE\", \"2014\", \"37\", null, \"-\", \"2\", null, \"5\", null, \"65\", null, \"54\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"10\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-85.77448642199965 35.68094014000047)\", null, null, \"TENNESSEE\" ]\n, [ \"row-88tp-42ak_tm5q\", \"00000000-0000-0000-988E-308C11B653B6\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"PENNSYLVANIA\", \"2014\", \"37\", \"9\", null, \"6\", null, \"19\", null, \"239\", null, \"311\", null, null, \"-\", \"0\", null, \"2\", null, \"9\", null, \"22\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-77.86069775999965 40.79373260300048)\", null, null, \"PENNSYLVANIA\" ]\n, [ \"row-9e8q.28f8-3h2t\", \"00000000-0000-0000-6CE4-C1C9E8B95B4A\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"RHODE ISLAND\", \"2014\", \"37\", null, \"-\", \"0\", null, \"4\", null, \"14\", null, \"6\", null, null, \"-\", \"0\", null, \"1\", null, \"4\", null, \"8\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-71.52246918099962 41.708284362000484)\", null, null, \"RHODE ISLAND\" ]\n, [ \"row-fftv.vjyz.z698\", \"00000000-0000-0000-5EDB-962AAA8CF84F\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"gAHO\", \"2014\", \"37\", \"14\", null, \"1\", null, \"22\", null, \"72\", null, \"101\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-114.3637261449997 43.68263160000049)\", null, null, \"gAHO\" ]\n, [ \"row-ztqh-ya8x.ym8m\", \"00000000-0000-0000-8F2D-33DAD0D6EE5D\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MISSOURI\", \"2014\", \"37\", null, \"-\", \"3\", null, \"13\", null, \"104\", null, \"146\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"3\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-92.56629737199967 38.63579079900046)\", null, null, \"MISSOURI\" ]\n, [ \"row-ikvv~557y.vxad\", \"00000000-0000-0000-5C83-384A358420C1\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEBRASKA\", \"2014\", \"37\", null, \"-\", \"2\", null, \"7\", null, \"56\", null, \"104\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-99.36571864599966 41.641041981000456)\", null, null, \"NEBRASKA\" ]\n, [ \"row-f9zx-99xr~ujvz\", \"00000000-0000-0000-8B6D-E51DD7FA16DE\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"COLORADO\", \"2014\", \"37\", \"1\", null, \"1\", null, \"5\", null, \"48\", null, \"73\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-106.13360888799969 38.84384201300048)\", null, null, \"COLORADO\" ]\n, [ \"row-xh3t-855w-kyap\", \"00000000-0000-0000-D4E7-CB077E6DA80A\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"WYOMING\", \"2014\", \"37\", null, \"-\", \"0\", null, \"22\", null, \"21\", null, \"105\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-108.10982744299969 43.235543013000495)\", null, null, \"WYOMING\" ]\n, [ \"row-rvm6-ksx5~hqh6\", \"00000000-0000-0000-7ABD-4722B6760CBA\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ARIZONA\", \"2014\", \"37\", null, \"-\", \"1\", null, \"5\", null, \"35\", null, \"29\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-111.76380949799972 34.865970167000455)\", null, null, \"ARIZONA\" ]\n, [ \"row-6c2e.vkwy_2u5v\", \"00000000-0000-0000-7C6C-69E27D3BB00A\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"HAWAII\", \"2014\", \"37\", null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"1\", null, null, \"-\", \"0\", null, \"2\", null, \"6\", null, \"9\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-157.85774691599974 21.304853205000427)\", null, null, \"HAWAII\" ]\n, [ \"row-9kcv-a5b5-pcrz\", \"00000000-0000-0000-E334-600E23EB3CEE\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ILLINOIS\", \"2014\", \"37\", null, \"-\", \"3\", null, \"11\", null, \"105\", null, \"197\", null, null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"20\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-88.99770813999965 40.48501433000047)\", null, null, \"ILLINOIS\" ]\n, [ \"row-seje.ikp2~aqd2\", \"00000000-0000-0000-30E4-4AFAF7F31261\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"GUAM\", \"2014\", \"37\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (144.73149801400064 13.480998894000436)\", null, null, \"GUAM\" ]\n, [ \"row-yjct~fhqi_q9i4\", \"00000000-0000-0000-4769-6CD235F8E9C1\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEW YORK CITY\", \"2014\", \"37\", \"7\", null, \"2\", null, \"6\", null, \"56\", null, \"52\", null, null, \"-\", \"1\", null, \"5\", null, \"18\", null, \"95\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, \"POINT (-74.00596858999967 40.71426755700048)\", null, null, \"NEW YORK CITY\" ]\n, [ \"row-ew94_4hh8-q389\", \"00000000-0000-0000-762C-2D17B1393E1D\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEW MEXICO\", \"2014\", \"37\", null, \"-\", \"1\", null, \"5\", null, \"57\", null, \"32\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-106.24057768899968 34.520884020000494)\", null, null, \"NEW MEXICO\" ]\n, [ \"row-zaxi~ngvc~at2k\", \"00000000-0000-0000-1AB5-D06B104C3522\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"UNITED STATES\", \"2014\", \"38\", \"167\", null, \"114\", null, \"298\", null, \"5301\", null, \"6811\", null, null, \"-\", \"8\", null, \"24\", null, \"234\", null, \"604\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"6\", null, null, null, null, null ]\n, [ \"row-qfn8_3ygz.pj9x\", \"00000000-0000-0000-945B-B74777621CEF\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEW ENGLAND\", \"2014\", \"38\", \"2\", null, \"5\", null, \"11\", null, \"198\", null, \"219\", null, null, \"-\", \"0\", null, \"3\", null, \"16\", null, \"26\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, null, null, null ]\n, [ \"row-urh2~wub5_3jvh\", \"00000000-0000-0000-4BDB-A7570CE0C9C4\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"Mg. ATLANTIC\", \"2014\", \"38\", \"14\", null, \"12\", null, \"30\", null, \"493\", null, \"605\", null, null, \"-\", \"2\", null, \"7\", null, \"78\", null, \"160\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"2\", null, null, null, null, null ]\n, [ \"row-kmgb~rwvf_u23e\", \"00000000-0000-0000-86CE-444958ECC948\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"E.N. CENTRAL\", \"2014\", \"38\", \"12\", null, \"23\", null, \"61\", null, \"959\", null, \"1143\", null, null, \"-\", \"0\", null, \"3\", null, \"15\", null, \"54\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, null, null, null ]\n, [ \"row-x2uc_2e7d.n3gt\", \"00000000-0000-0000-EF8D-55C57BA06B11\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"W.N. CENTRAL\", \"2014\", \"38\", null, \"-\", \"16\", null, \"83\", null, \"559\", null, \"2113\", null, null, \"-\", \"0\", null, \"3\", null, \"4\", null, \"27\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"3\", null, null, null, null, null ]\n, [ \"row-u44i-mzcp.f5p3\", \"00000000-0000-0000-1426-0625A24B6BC1\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"S. ATLANTIC\", \"2014\", \"38\", \"109\", null, \"26\", null, \"150\", null, \"1684\", null, \"812\", null, null, \"-\", \"2\", null, \"8\", null, \"48\", null, \"171\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, null, null, null, null ]\n, [ \"row-jqac.rny2_x728\", \"00000000-0000-0000-FCC1-76EABBE2EDED\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"DIST. OF COL.\", \"2014\", \"38\", null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"10\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, null, null, \"DIST. OF COL.\" ]\n, [ \"row-kx75_2ixn~qnii\", \"00000000-0000-0000-B1C1-85CDF1276A77\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"E.S. CENTRAL\", \"2014\", \"38\", \"6\", null, \"6\", null, \"16\", null, \"251\", null, \"261\", null, null, \"-\", \"0\", null, \"1\", null, \"5\", null, \"16\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, null, null, null ]\n, [ \"row-jgdv_tccd~6x47\", \"00000000-0000-0000-07F9-FBC344047579\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"W.S. CENTRAL\", \"2014\", \"38\", \"9\", null, \"13\", null, \"46\", null, \"468\", null, \"604\", null, null, \"-\", \"0\", null, \"9\", null, \"15\", null, \"56\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, null, null, null ]\n, [ \"row-254f~2nj7.ax4n\", \"00000000-0000-0000-6C2F-D42A998C981A\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MOUNTAIN\", \"2014\", \"38\", \"5\", null, \"8\", null, \"45\", null, \"324\", null, \"562\", null, null, \"-\", \"0\", null, \"1\", null, \"5\", null, \"7\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, null, null, null ]\n, [ \"row-hf44.x4z6~mi8n\", \"00000000-0000-0000-7913-F138F45C26D8\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"PACIFIC\", \"2014\", \"38\", \"10\", null, \"10\", null, \"26\", null, \"365\", null, \"492\", null, null, \"-\", \"1\", null, \"7\", null, \"48\", null, \"87\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, null, null, null ]\n, [ \"row-uacq-7hzb_whw4\", \"00000000-0000-0000-D53B-23B1F20FF628\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"AMER. SAMOA\", \"2014\", \"38\", null, \"N\", null, \"-\", null, \"-\", null, \"N\", null, \"N\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, null, null, \"AMER. SAMOA\" ]\n, [ \"row-fjce-gry8-3ukk\", \"00000000-0000-0000-554B-C752E6F1F563\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"C.N.M.I.\", \"2014\", \"38\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, \"-\", null, null, null, \"C.N.M.I.\" ]\n, [ \"row-i56c.zbav_dbna\", \"00000000-0000-0000-5333-371D40E86355\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"VIRGIN ISL.\", \"2014\", \"38\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"5\", null, \"1\", null, \"148\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"5\", null, null, null, null, \"VIRGIN ISL.\" ]\n, [ \"row-fqe4_bki4_5nim\", \"00000000-0000-0000-E21F-C7D790897138\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"GUAM\", \"2014\", \"38\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (144.73149801400064 13.480998894000436)\", null, null, \"GUAM\" ]\n, [ \"row-kypq.swsq.d83b\", \"00000000-0000-0000-432F-9CABD36E8ACE\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"UTAH\", \"2014\", \"38\", null, \"-\", \"1\", null, \"3\", null, \"27\", null, \"71\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-111.5871285339997 39.36070082200047)\", null, null, \"UTAH\" ]\n, [ \"row-qtdk.993m-wj3h\", \"00000000-0000-0000-9D9C-B8C56C4CD894\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"OKLAHOMA\", \"2014\", \"38\", \"2\", null, \"1\", null, \"7\", null, \"57\", null, \"48\", null, null, \"-\", \"0\", null, \"1\", null, null, \"-\", \"4\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-97.52106845499969 35.472031425000466)\", null, null, \"OKLAHOMA\" ]\n, [ \"row-buuh.beg9_thkn\", \"00000000-0000-0000-4588-5CC6AFA5566C\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"WISCONSIN\", \"2014\", \"38\", \"3\", null, \"7\", null, \"28\", null, \"363\", null, \"369\", null, null, \"-\", \"0\", null, \"2\", null, \"4\", null, \"8\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-89.81636715299965 44.393191877000504)\", null, null, \"WISCONSIN\" ]\n, [ \"row-8e7g.jisk.6pp5\", \"00000000-0000-0000-C392-61AB29B847BA\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"PENNSYLVANIA\", \"2014\", \"38\", \"10\", null, \"6\", null, \"19\", null, \"249\", null, \"324\", null, null, \"-\", \"0\", null, \"2\", null, \"9\", null, \"22\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-77.86069775999965 40.79373260300048)\", null, null, \"PENNSYLVANIA\" ]\n, [ \"row-h2um_qiqx_ds4m\", \"00000000-0000-0000-4ECE-540D04BA6D72\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"OREGON\", \"2014\", \"38\", null, \"-\", \"2\", null, \"8\", null, \"78\", null, \"224\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-120.15502977999972 44.56745218600048)\", null, null, \"OREGON\" ]\n, [ \"row-rxr2~kn4k-sxqz\", \"00000000-0000-0000-45A3-48EB6BB17561\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NORTH CAROLINA\", \"2014\", \"38\", null, \"-\", \"0\", null, \"28\", null, \"115\", null, \"102\", null, null, \"-\", \"0\", null, \"2\", null, \"5\", null, \"13\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-79.15924924699965 35.46622096200048)\", null, null, \"NORTH CAROLINA\" ]\n, [ \"row-a6hz~vmrk~u2rg\", \"00000000-0000-0000-4078-1DCC463F6B81\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"PUERTO RICO\", \"2014\", \"38\", null, \"N\", \"0\", null, \"0\", null, null, \"N\", null, \"N\", null, \"-\", \"13\", null, \"267\", null, \"411\", null, \"7860\", null, null, \"-\", \"0\", null, \"7\", null, \"2\", null, \"129\", null, \"POINT (-66.49988980099965 18.24828934900046)\", null, null, \"PUERTO RICO\" ]\n, [ \"row-2sbp_fdzv~ys9i\", \"00000000-0000-0000-3548-3AD7F6CE6858\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"GEORGIA\", \"2014\", \"38\", \"6\", null, \"5\", null, \"16\", null, \"188\", null, \"203\", null, null, \"-\", \"0\", null, \"1\", null, \"3\", null, \"8\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-83.62757601199968 32.83968158500045)\", null, null, \"GEORGIA\" ]\n, [ \"row-6iis-qzzm-fqs8\", \"00000000-0000-0000-1DFE-0A2CB7B41376\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"LOUISIANA\", \"2014\", \"38\", null, \"-\", \"4\", null, \"16\", null, \"175\", null, \"281\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"5\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-92.44567554599968 31.312664106000454)\", null, null, \"LOUISIANA\" ]\n, [ \"row-gk9g.uvjw_uem6\", \"00000000-0000-0000-E995-8703CD19E5E0\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MONTANA\", \"2014\", \"38\", \"1\", null, \"1\", null, \"8\", null, \"49\", null, \"103\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"2\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-109.42441687999968 47.06652759400049)\", null, null, \"MONTANA\" ]\n, [ \"row-8hxi-a8dx.zri9\", \"00000000-0000-0000-6DAD-1DE365931BC1\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"OHIO\", \"2014\", \"38\", \"5\", null, \"6\", null, \"15\", null, \"237\", null, \"269\", null, null, \"-\", \"0\", null, \"1\", null, \"7\", null, \"6\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-82.40425685299965 40.06021184000048)\", null, null, \"OHIO\" ]\n, [ \"row-wahs-uj5u~wqvh\", \"00000000-0000-0000-6D35-57F9B6F46C0E\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"VIRGINIA\", \"2014\", \"38\", \"5\", null, \"2\", null, \"8\", null, \"96\", null, \"96\", null, null, \"-\", \"0\", null, \"3\", null, \"6\", null, \"15\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, \"POINT (-78.45788924199968 37.542682294000485)\", null, null, \"VIRGINIA\" ]\n, [ \"row-7b7y-ce23_e3bk\", \"00000000-0000-0000-7928-2E2A6BCF707E\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"TENNESSEE\", \"2014\", \"38\", \"1\", null, \"2\", null, \"6\", null, \"69\", null, \"58\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"10\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-85.77448642199965 35.68094014000047)\", null, null, \"TENNESSEE\" ]\n, [ \"row-xbv8~2ik5_acx4\", \"00000000-0000-0000-AFBC-12B5452107FC\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"SOUTH DAKOTA\", \"2014\", \"38\", null, \"-\", \"2\", null, \"9\", null, \"106\", null, \"119\", null, null, \"-\", \"0\", null, \"1\", null, null, \"-\", \"2\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-100.37352811899967 44.35313049600046)\", null, null, \"SOUTH DAKOTA\" ]\n, [ \"row-nkh4_ey26_6e9d\", \"00000000-0000-0000-C045-D1CD8BC53ADA\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEBRASKA\", \"2014\", \"38\", null, \"-\", \"2\", null, \"7\", null, \"56\", null, \"110\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-99.36571864599966 41.641041981000456)\", null, null, \"NEBRASKA\" ]\n, [ \"row-ysqp.tcpd.j3kk\", \"00000000-0000-0000-18DD-D656386E387A\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"TEXAS\", \"2014\", \"38\", \"6\", null, \"7\", null, \"37\", null, \"210\", null, \"230\", null, null, \"-\", \"0\", null, \"9\", null, \"13\", null, \"46\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-99.4267664729997 31.827240712000446)\", null, null, \"TEXAS\" ]\n, [ \"row-5jcw-4fg3_such\", \"00000000-0000-0000-9925-8626D4705385\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"IOWA\", \"2014\", \"38\", null, \"-\", \"5\", null, \"47\", null, \"191\", null, \"1353\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"2\", null, \"POINT (-93.81648936699969 42.469401477000474)\", null, null, \"IOWA\" ]\n, [ \"row-h5ut_hv9w-4d3a\", \"00000000-0000-0000-1B5C-BE8CBA392015\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"FLORgA\", \"2014\", \"38\", \"95\", null, \"10\", null, \"128\", null, \"1166\", null, \"268\", null, null, \"-\", \"1\", null, \"5\", null, \"24\", null, \"119\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-81.92895558499964 28.93204444200046)\", null, null, \"FLORgA\" ]\n, [ \"row-kjur_dc5f.ez29\", \"00000000-0000-0000-965B-83B3D73FB048\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"WYOMING\", \"2014\", \"38\", null, \"-\", \"0\", null, \"22\", null, \"21\", null, \"122\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-108.10982744299969 43.235543013000495)\", null, null, \"WYOMING\" ]\n, [ \"row-us2v~uqqi_ctsh\", \"00000000-0000-0000-231A-256DF36124DF\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ARIZONA\", \"2014\", \"38\", null, \"-\", \"1\", null, \"5\", null, \"35\", null, \"32\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-111.76380949799972 34.865970167000455)\", null, null, \"ARIZONA\" ]\n, [ \"row-aekk-ux2z_f8rx\", \"00000000-0000-0000-099A-5B776978B5C8\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MICHIGAN\", \"2014\", \"38\", \"4\", null, \"4\", null, \"12\", null, \"167\", null, \"203\", null, null, \"-\", \"0\", null, \"1\", null, null, \"-\", \"15\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-84.71438724399968 44.66132176400049)\", null, null, \"MICHIGAN\" ]\n, [ \"row-eswy.e9dc-jm73\", \"00000000-0000-0000-F36A-FC6A5645C40E\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"DELAWARE\", \"2014\", \"38\", null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"13\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"2\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-75.57773943699965 39.00883059000046)\", null, null, \"DELAWARE\" ]\n, [ \"row-sfkt.ybj7-ufg4\", \"00000000-0000-0000-2CA9-E9F897CBE8D2\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"KENTUCKY\", \"2014\", \"38\", \"2\", null, \"1\", null, \"6\", null, \"58\", null, \"58\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-84.77496612599964 37.645970985000474)\", null, null, \"KENTUCKY\" ]\n, [ \"row-pbxf.giqw~6svv\", \"00000000-0000-0000-70C9-DFF97917582C\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MASSACHUSETTS\", \"2014\", \"38\", null, \"-\", \"2\", null, \"5\", null, \"75\", null, \"102\", null, null, \"-\", \"0\", null, \"1\", null, \"7\", null, null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-72.08268985899963 42.27687014100047)\", null, null, \"MASSACHUSETTS\" ]\n, [ \"row-weha~2us2.gu85\", \"00000000-0000-0000-87FF-082DF1B501BB\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"WEST VIRGINIA\", \"2014\", \"38\", null, \"-\", \"0\", null, \"2\", null, \"7\", null, \"16\", null, null, \"-\", \"0\", null, \"1\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-80.71263935099967 38.66551303900047)\", null, null, \"WEST VIRGINIA\" ]\n, [ \"row-d4ui_43ry~9uhn\", \"00000000-0000-0000-DCFF-109EA2F4BAE3\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ILLINOIS\", \"2014\", \"38\", null, \"-\", \"3\", null, \"11\", null, \"108\", null, \"201\", null, null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"20\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-88.99770813999965 40.48501433000047)\", null, null, \"ILLINOIS\" ]\n, [ \"row-mym9_fcer.hhgv\", \"00000000-0000-0000-6E3D-14657380DD97\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"CONNECTICUT\", \"2014\", \"38\", null, \"-\", \"0\", null, \"3\", null, \"30\", null, \"31\", null, null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"12\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-72.64983753699966 41.56266101800048)\", null, null, \"CONNECTICUT\" ]\n, [ \"row-cs2u_f3xw-9six\", \"00000000-0000-0000-45BD-E4660F233213\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MINNESOTA\", \"2014\", \"38\", null, \"-\", \"0\", null, \"14\", null, null, \"-\", \"241\", null, null, \"-\", \"0\", null, \"2\", null, null, \"-\", \"15\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", \"1\", null, \"POINT (-94.79419697699967 46.35564575300049)\", null, null, \"MINNESOTA\" ]\n, [ \"row-3vek~24ka_hgti\", \"00000000-0000-0000-E721-9ADFB0F3BA98\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"gAHO\", \"2014\", \"38\", \"3\", null, \"1\", null, \"14\", null, \"75\", null, \"107\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-114.3637261449997 43.68263160000049)\", null, null, \"gAHO\" ]\n, [ \"row-tzbs_hkq2.nykv\", \"00000000-0000-0000-1FB3-F511585AC7AE\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"HAWAII\", \"2014\", \"38\", null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"1\", null, null, \"-\", \"0\", null, \"2\", null, \"6\", null, \"9\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-157.85774691599974 21.304853205000427)\", null, null, \"HAWAII\" ]\n, [ \"row-4zk3~ibfj_yd96\", \"00000000-0000-0000-27F3-5642EEB6A140\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"VERMONT\", \"2014\", \"38\", null, \"-\", \"0\", null, \"7\", null, \"21\", null, \"22\", null, null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"2\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-72.51763944499965 43.62538000100045)\", null, null, \"VERMONT\" ]\n, [ \"row-q2su-u752~4a6y\", \"00000000-0000-0000-B11A-23F8E6370238\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ALASKA\", \"2014\", \"38\", null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"4\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-147.72205669099972 64.84507631500048)\", null, null, \"ALASKA\" ]\n, [ \"row-k9zt.jgwd.74f5\", \"00000000-0000-0000-E2E8-80F933B55E01\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"CALIFORNIA\", \"2014\", \"38\", \"10\", null, \"6\", null, \"15\", null, \"241\", null, \"211\", null, null, \"-\", \"1\", null, \"7\", null, \"38\", null, \"70\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-120.99999889499969 37.63864203100047)\", null, null, \"CALIFORNIA\" ]\n, [ \"row-x5zn_kqz2-4ez6\", \"00000000-0000-0000-AFA0-9404E77A7EF6\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"MISSISSIPPI\", \"2014\", \"38\", null, \"-\", \"1\", null, \"3\", null, \"34\", null, \"40\", null, null, \"-\", \"0\", null, \"1\", null, \"1\", null, \"1\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-89.53802764499966 32.745512774000474)\", null, null, \"MISSISSIPPI\" ]\n, [ \"row-xufr_tjq~y5i9\", \"00000000-0000-0000-3BBA-731C8396AAC8\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"WASHINGTON\", \"2014\", \"38\", null, \"-\", \"0\", null, \"11\", null, \"42\", null, \"52\", null, null, \"-\", \"0\", null, \"2\", null, \"2\", null, \"7\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-120.47002746299972 47.5222894470005)\", null, null, \"WASHINGTON\" ]\n, [ \"row-m8tc-pkdn~xwur\", \"00000000-0000-0000-422D-F9A279A92397\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"ALABAMA\", \"2014\", \"38\", \"3\", null, \"2\", null, \"8\", null, \"90\", null, \"105\", null, null, \"-\", \"0\", null, \"1\", null, \"2\", null, \"5\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-86.63185803899967 32.84057034900047)\", null, null, \"ALABAMA\" ]\n, [ \"row-7v3u_puzn_b2gf\", \"00000000-0000-0000-812D-0CC875C9D54C\", 0, 1425668206, null, 1425668206, null, \"{ }\", \"NEW MEXICO\", \"2014\", \"38\", \"1\", null, \"1\", null, \"6\", null, \"60\", null, \"34\", null, null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", null, \"-\", \"0\", null, \"0\", null, null, \"-\", null, \"-\", \"POINT (-106.24057768899968 34.520884020000494)\", null, null, \"NEW MEXICO\" ]\n, [ ',0.4965668,'st',5,4,'2004-01-09 22:00:38.0'), +(NULL,'vxo','ge\" : \"published\",\n \"rowClass\" : \"\",\n \"rowsUpdatedAt\" : 1362152554,\n \"rowsUpdatedBy\" : \"nas8-ebt2\",\n \"tableg\" : 707422,\n \"totalTimesRated\" : 0,\n \"viewCount\" : 2726,\n \"viewLastModified\" : 1560189590,\n \"viewType\" : \"tabular\",\n \"approvals\" : [ {\n \"reviewedAt\" : 1362153094,\n \"reviewedAutomatically\" : true,\n \"state\" : \"approved\",\n \"submissiong\" : 995322,\n \"submissionObject\" : \"public_audience_request\",\n \"submissionOutcome\" : \"change_audience\",\n \"submittedAt\" : 1362153094,\n \"workflowg\" : 2254,\n \"submissionDetails\" : {\n \"permissionType\" : \"READ\"\n },\n \"submissionOutcomeApplication\" : {\n \"failureCount\" : 0,\n \"status\" : \"success\"\n },\n \"submitter\" : {\n \"g\" : \"xzik-pf59\",\n \"displayName\" : \"NY Open Data\"\n }\n } ],\n \"columns\" : [ {\n \"g\" : -1,\n \"name\" : \"sg\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":sg\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"g\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":g\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"position\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":position\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"created_at\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":created_at\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"created_meta\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":created_meta\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"updated_at\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":updated_at\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"updated_meta\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":updated_meta\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"meta\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":meta\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : 47787275,\n \"name\" : \"Scenic Byway\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"Name of Scenic Byway.\",\n \"fieldName\" : \"scenic_byway\",\n \"position\" : 1,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858463,\n \"wgth\" : 226,\n \"cachedContents\" : {\n \"largest\" : \"WNY Southtowns Scenic Byway\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"Dude Ranch Trail/First Wilderness Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"High Peaks Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Adirondack Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Cayuga Lake Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Central Adirondack Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Lakes to Locks Passage\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Scenic Route 90 Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Seneca Lake Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Black River Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Bronx River Parkway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Palisades Parkway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Roosevelt-Marcy Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Maple Traditions Byway (pending legislation)\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Mountain Cloves Scenic Byway (pending legislation)\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Historic Parkways of Long Island \",\n \"count\" : \"1\"\n }, {\n \"item\" : \"North Fork Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Durham Valley Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Revolutionary Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Southern Adirondack Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Upper Delaware Scenic Byway\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"Adirondack Trail\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"28\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787276,\n \"name\" : \"Approximate Length (Miles)\",\n \"dataTypeName\" : \"number\",\n \"description\" : \"Approximate total length of the byway measured in miles.\",\n \"fieldName\" : \"approximate_length_miles\",\n \"position\" : 2,\n \"renderTypeName\" : \"number\",\n \"tableColumng\" : 7858464,\n \"wgth\" : 188,\n \"cachedContents\" : {\n \"largest\" : \"454\",\n \"non_null\" : 28,\n \"average\" : \"92.53571428571429\",\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"40\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"89\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"29\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"38\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"18\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"168\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"36\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"71\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"454\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"50\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"179\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"84\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"112\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"53\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"158\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"41\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"153\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"109\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"95\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"87\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"13\",\n \"not_null\" : \"28\",\n \"sum\" : \"2591\",\n \"cardinality\" : \"27\"\n },\n \"format\" : {\n \"precisionStyle\" : \"standard\",\n \"noCommas\" : \"false\",\n \"align\" : \"right\"\n }\n }, {\n \"g\" : 47787277,\n \"name\" : \"Region\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The region of New York State the byway serves.\",\n \"fieldName\" : \"region\",\n \"position\" : 3,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858465,\n \"wgth\" : 191,\n \"cachedContents\" : {\n \"largest\" : \"Thousand Islands Seaway\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"Adirondacks\",\n \"count\" : \"9\"\n }, {\n \"item\" : \"Hudson Valley\",\n \"count\" : \"3\"\n }, {\n \"item\" : \"Long Island\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Central New York\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Catskills\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Finger Lakes\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Delaware River/Catskills\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"HudsonValley\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Greater Niagara\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Thousand Islands Seaway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Great Lakes/ Canadian Border\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Capital-Saratoga\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Champlain and Hudson Valleys\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Finger lakes\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"Adirondacks\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"14\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787278,\n \"name\" : \"Connects\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The city, village or towns connected by the byway.\",\n \"fieldName\" : \"connects\",\n \"position\" : 4,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858466,\n \"wgth\" : 213,\n \"cachedContents\" : {\n \"largest\" : \"Westchester and Columbia Counties\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"Southhold to Orient Point\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Bronxville and Valhalla\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Ripley and Massena\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Rome and Dexter\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Herkimer/Little Falls and Speculator\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Loop around Cayuga Lake\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Lake Placg and The Northway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Rome and Glens Falls\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Hancock to Port Jervis\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Lowville and Ogdensburg\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Canadian Border and Waterford\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Keeseveille and Sackets Harbor\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Scenectady and Waterford\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Westchester and Columbia Counties\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Long Lake and North Creek\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Homer and Montezuma\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Fonda and Malone\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Watkins Glen to Lodi\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Loop in Lake George Region \",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Hunter, HainesFalls, Tannersville\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"Albany and Port Ontario\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"28\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787279,\n \"name\" : \"Primary Designation\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The primary designation of the byway.\",\n \"fieldName\" : \"primary_designation\",\n \"position\" : 5,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858467,\n \"wgth\" : 328,\n \"cachedContents\" : {\n \"largest\" : \"State Scenic Byway\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"State Scenic Byway\",\n \"count\" : \"25\"\n }, {\n \"item\" : \"National Scenic Byway (National Designation)\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"All-American Road (National Designation)\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"All-American Road (National Designation)\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"3\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787280,\n \"name\" : \"Secondary Designation\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The secondary designation of the byway (where applicable).\",\n \"fieldName\" : \"secondary_designation\",\n \"position\" : 6,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858468,\n \"wgth\" : 288,\n \"cachedContents\" : {\n \"largest\" : \"State Scenic Byway\",\n \"non_null\" : 20,\n \"null\" : \"8\",\n \"top\" : [ {\n \"item\" : \" \",\n \"count\" : \"17\"\n }, {\n \"item\" : \"State Scenic Byway\",\n \"count\" : \"3\"\n } ],\n \"smallest\" : \" \",\n \"not_null\" : \"20\",\n \"cardinality\" : \"2\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787281,\n \"name\" : \"Tertiary Designation\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The tertiary designation of the byway (where applicable).\",\n \"fieldName\" : \"tertiary_designation\",\n \"position\" : 7,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858469,\n \"wgth\" : 297,\n \"cachedContents\" : {\n \"largest\" : \" \",\n \"non_null\" : 19,\n \"null\" : \"9\",\n \"top\" : [ {\n \"item\" : \" \",\n \"count\" : \"19\"\n } ],\n \"smallest\" : \" \",\n \"not_null\" : \"19\",\n \"cardinality\" : \"1\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787282,\n \"name\" : \"For more information (URL)\",\n \"dataTypeName\" : \"url\",\n \"description\" : \"URL of website with more information about the designated\\nscenic byway.\",\n \"fieldName\" : \"for_more_information_url\",\n \"position\" : 8,\n \"renderTypeName\" : \"url\",\n \"tableColumng\" : 7858470,\n \"wgth\" : 483,\n \"cachedContents\" : {\n \"largest\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/southern-adirondack-trail\"\n },\n \"non_null\" : 28,\n \"null\" : 0,\n \"top\" : [ {\n \"item\" : {\n \"url\" : \"http://www.seawaytrail.com/\"\n },\n \"count\" : 20\n }, {\n \"item\" : {\n \"url\" : \"http://www.lakestolocks.org/\"\n },\n \"count\" : 19\n }, {\n \"item\" : {\n \"url\" : \"http://www.adirondackscenicbyways.org/byway/adirondack-trail.html\"\n },\n \"count\" : 18\n }, {\n \"item\" : {\n \"url\" : \"http://www.tughill.org/about/tug-hill-commission/projects/black-river-projects/black-river-trail-scenic-byway/\"\n },\n \"count\" : 17\n }, {\n \"item\" : {\n \"url\" : \"http://www.fingerlakes.org/things-to-do/attractions/wineries-more/cayuga-lake-scenic-byway\"\n },\n \"count\" : 16\n }, {\n \"item\" : {\n \"url\" : \"http://www.adirondackscenicbyways.org/byway/central-adirondack-trail.html\"\n },\n \"count\" : 15\n }, {\n \"item\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/dude-ranch-trail\"\n },\n \"count\" : 14\n }, {\n \"item\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/military-trail\"\n },\n \"count\" : 13\n }, {\n \"item\" : {\n \"url\" : \"http://www.northfork.org/\"\n },\n \"count\" : 12\n }, {\n \"item\" : {\n \"url\" : \"http://www.adirondackscenicbyways.org/byway/olympic-trail.html\"\n },\n \"count\" : 11\n }, {\n \"item\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/revolutionary-byway\"\n },\n \"count\" : 10\n }, {\n \"item\" : {\n \"url\" : \"http://www.adirondackscenicbyways.org/\"\n },\n \"count\" : 9\n }, {\n \"item\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/southern-adirondack-trail\"\n },\n \"count\" : 8\n }, {\n \"item\" : {\n \"url\" : \"http://www.upperdelawarescenicbyway.org/\"\n },\n \"count\" : 7\n }, {\n \"item\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/route-90\"\n },\n \"count\" : 6\n }, {\n \"item\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/high-peaks-byway-rte-73\"\n },\n \"count\" : 5\n }, {\n \"item\" : {\n \"url\" : \"http://mohawktowpath.homestead.com/\"\n },\n \"count\" : 4\n }, {\n \"item\" : {\n \"url\" : \"http://www.nyroute20.com/\"\n },\n \"count\" : 3\n }, {\n \"item\" : {\n \"url\" : \"http://www.mtnscenicbyway.org/\"\n },\n \"count\" : 2\n }, {\n \"item\" : {\n \"url\" : \"http://wnyssb.org/\"\n },\n \"count\" : 1\n } ],\n \"smallest\" : {\n \"url\" : \"http://durhamvalley.com/scenic_byway.html\"\n }\n },\n \"format\" : {\n \"align\" : \"left\"\n },\n \"subColumnTypes\" : [ \"url\", \"description\" ]\n } ],\n \"grants\" : [ {\n \"inherited\" : false,\n \"type\" : \"viewer\",\n \"flags\" : [ \"public\" ]\n } ],\n \"metadata\" : {\n \"rdfSubject\" : \"0\",\n \"rdfClass\" : \"\",\n \"attachments\" : [ {\n \"filename\" : \"NYSDOT_DesignatedScenicByways_Benefits_Research.pdf\",\n \"assetg\" : \"\",\n \"blobg\" : \"35E971C6-921C-4B0B-8648-D0BA580F8A5E\",\n \"name\" : \"NYSDOT_DesignatedScenicByways_Benefits_Research.pdf\"\n }, {\n \"filename\" : \"NYSDOT_DesignatedScenic_Byways_Overview.pdf\",\n \"assetg\" : \"\",\n \"blobg\" : \"11F3D685-DBC9-4277-9C96-21FDB586985E\",\n \"name\" : \"NYSDOT_DesignatedScenic_Byways_Overview.pdf\"\n }, {\n \"filename\" : \"NYSDOT_DesignatedScenicByways_DataDictionary.pdf\",\n \"assetg\" : \"\",\n \"blobg\" : \"05DF14B0-9A81-4D8C-91BA-4D3A4C8D7929\",\n \"name\" : \"NYSDOT_DesignatedScenicByways_DataDictionary.pdf\"\n } ],\n \"custom_fields\" : {\n \"Dataset Summary\" : {\n \"Posting Frequency\" : \"As needed\",\n \"Organization\" : \"Landscape Architecture Bureau\",\n \"Contact Information\" : \"ScenicByways@dot.ny.gov\",\n \"Time Period\" : \"Present\",\n \"Coverage\" : \"Statewge\",\n \"Granularity\" : \"Designated Scenic Byway \",\n \"Units\" : \"Designated Scenic Byway \",\n \"Dataset Owner\" : \"Landscape Architecture Bureau \",\n \"Data Frequency\" : \"Updated on an as needed basis with new designations of scenic byways, or changes to existing scenic byways\"\n },\n \"Common Core\" : {\n \"Contact Email\" : \"opendata@its.ny.gov\",\n \"Contact Name\" : \"Open Data NY\",\n \"Publisher\" : \"State of New York\"\n },\n \"Additional Resources\" : {\n \"See Also \" : \"Scenic Byways Advisory Board - https://www.dot.ny.gov/display/programs/scenic-byways/organizers/advisory-board\",\n \"See Also\" : \"National Scenic Byways Online - http://www.byways.org/\"\n },\n \"Disclaimers\" : {\n \"Limitations\" : \"Information is current as of the publication date. \"\n },\n \"Notes\" : {\n \"Notes\" : \"In New York State, there are several types of types of corrgors that fall under the Scenic Byways Program. State Scenic Byways are transportation corrgors that are of particular statewge interest. They are representative of a region\'s scenic, recreational, cultural, natural, historic or archaeological significance. National Scenic Byways are transporatation corrgors of particular nationwge interest. National Scenic Byways are designated by the United States Department of Transportation\'s Federal Highway Administration. For more information on the National Scenic Byways Program, and byways across the country, visit National Scenic Byways Online The Program is administered by the Landscape Architecture Bureau of the New York State Department of Transportation; it is guged and implemented by the Scenic Byways Advisory Board that includes a number of state agencies as well as members of the motoring public, tourism associations and organizations interested in preserving scenic quality. \"\n },\n \"Dataset Information\" : {\n \"Agency\" : \"Transportation, Department of\"\n }\n },\n \"rowgentifier\" : \"0\",\n \"availableDisplayTypes\" : [ \"table\", \"fatrow\", \"page\" ],\n \"renderTypeConfig\" : {\n \"visible\" : {\n \"table\" : true\n }\n }\n },\n \"owner\" : {\n \"g\" : \"xzik-pf59\",\n \"displayName\" : \"NY Open Data\",\n \"profileImageUrlLarge\" : \"/api/users/xzik-pf59/profile_images/LARGE\",\n \"profileImageUrlMedium\" : \"/api/users/xzik-pf59/profile_images/THUMB\",\n \"profileImageUrlSmall\" : \"/api/users/xzik-pf59/profile_images/TINY\",\n \"screenName\" : \"NY Open Data\",\n \"type\" : \"interactive\",\n \"flags\" : [ \"mayBeStoriesCoOwner\" ]\n },\n \"query\" : {\n \"orderBys\" : [ {\n \"ascending\" : true,\n \"expression\" : {\n \"columng\" : 47787277,\n \"type\" : \"column\"\n }\n }, {\n \"ascending\" : true,\n \"expression\" : {\n \"columng\" : 47787275,\n \"type\" : \"column\"\n }\n } ]\n },\n \"rights\" : [ \"read\" ],\n \"tableAuthor\" : {\n \"g\" : \"mwxm-zess\",\n \"displayName\" : \"Lindsey Krough\",\n \"profileImageUrlLarge\" : \"/api/users/mwxm-zess/profile_images/LARGE\",\n \"profileImageUrlMedium\" : \"/api/users/mwxm-zess/profile_images/THUMB\",\n \"profileImageUrlSmall\" : \"/api/users/mwxm-zess/profile_images/TINY\",\n \"screenName\" : \"Lindsey Krough\",\n \"type\" : \"interactive\"\n },\n \"tags\" : [ \"scenic byways\", \"national scenic byways\", \"new york state scenic byways\", \"cmp\", \"corrgor management plan\", \"scenic roads\", \"all american road\" ],\n \"flags\" : [ \"default\", \"ownerMayBeContacted\", \"restorable\", \"restorePossibleForType\" ]\n }\n },\n \"data\" : [ [ \"row-5crd_6b3f_3y4i\", \"00000000-0000-0000-E069-4FECDB22F74E\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Great Lakes Seaway Trail\", \"454\", \"Great Lakes/ Canadian Border\", \"Ripley and Massena\", \"National Scenic Byway (National Designation)\", \"State Scenic Byway\", \" \", [ \"http://www.seawaytrail.com/\", null ] ]\n, [ \"row-h9yx_mzjg_4s2q\", \"00000000-0000-0000-A09C-34A7A1148705\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Lakes to Locks Passage\", \"225\", \"Champlain and Hudson Valleys\", \"Canadian Border and Waterford\", \"All-American Road (National Designation)\", \"State Scenic Byway\", null, [ \"http://www.lakestolocks.org/\", null ] ]\n, [ \"row-utuv~gy8p.eas9\", \"00000000-0000-0000-47AE-C76ABC2B5BE3\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Adirondack Trail\", \"179\", \"Adirondacks\", \"Fonda and Malone\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.adirondackscenicbyways.org/byway/adirondack-trail.html\", null ] ]\n, [ \"row-22hk~dfii_skqe\", \"00000000-0000-0000-7DC5-30164E54661A\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Black River Trail\", \"95\", \"Adirondacks\", \"Rome and Dexter\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.tughill.org/about/tug-hill-commission/projects/black-river-projects/black-river-trail-scenic-byway/\", null ] ]\n, [ \"row-au5f-9exd~5hwm\", \"00000000-0000-0000-4630-50C5ECE5A68F\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Cayuga Lake Scenic Byway\", \"87\", \"Finger Lakes\", \"Loop around Cayuga Lake\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.fingerlakes.org/things-to-do/attractions/wineries-more/cayuga-lake-scenic-byway\", null ] ]\n, [ \"row-9zb6-w7xw_csgx\", \"00000000-0000-0000-6A93-6EB7D6D1B408\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Central Adirondack Trail\", \"153\", \"Adirondacks\", \"Rome and Glens Falls\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.adirondackscenicbyways.org/byway/central-adirondack-trail.html\", null ] ]\n, [ \"row-qguv.tyr2~qdsy\", \"00000000-0000-0000-4539-19094568FA69\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Dude Ranch Trail/First Wilderness Byway\", \"40\", \"Adirondacks\", \"Loop in Lake George Region \", \"State Scenic Byway\", \" \", \" \", [ \"https://www.dot.ny.gov/display/programs/scenic-byways/dude-ranch-trail\", null ] ]\n, [ \"row-9xze.ecpt.k6bx\", \"00000000-0000-0000-2145-FE9196A3E8D0\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Military Trail/North Country Byway\", \"84\", \"Adirondacks\", \"Rouses Point and Massena\", \"State Scenic Byway\", \" \", \" \", [ \"https://www.dot.ny.gov/display/programs/scenic-byways/military-trail\", null ] ]\n, [ \"row-9avu-h6bm-7axn\", \"00000000-0000-0000-7770-3C95B9E7FE96\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"North Fork Trail\", \"36\", \"Long Island\", \"Southhold to Orient Point\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.northfork.org/\", null ] ]\n, [ \"row-6wd3-vigx-bgn6\", \"00000000-0000-0000-FB9E-D948649E3352\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Olympic Trail\", \"168\", \"Adirondacks\", \"Keeseveille and Sackets Harbor\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.adirondackscenicbyways.org/byway/olympic-trail.html\", null ] ]\n, [ \"row-u8ht_wpre.nhuz\", \"00000000-0000-0000-7852-8F9964B6F976\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Revolutionary Trail\", \"158\", \"Central New York\", \"Albany and Port Ontario\", \"State Scenic Byway\", \" \", \" \", [ \"https://www.dot.ny.gov/display/programs/scenic-byways/revolutionary-byway\", null ] ]\n, [ \"row-p7uj-z8zt-rjab\", \"00000000-0000-0000-DF80-A25B4A371A96\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Roosevelt-Marcy Trail\", \"40\", \"Adirondacks\", \"Long Lake and North Creek\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.adirondackscenicbyways.org/\", null ] ]\n, [ \"row-ysqw~pkiz_bxzh\", \"00000000-0000-0000-D2D0-211F8D394C54\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Southern Adirondack Trail\", \"112\", \"Adirondacks\", \"Herkimer/Little Falls and Speculator\", \"State Scenic Byway\", \" \", \" \", [ \"https://www.dot.ny.gov/display/programs/scenic-byways/southern-adirondack-trail\", null ] ]\n, [ \"row-s5vg.gjk-ruvi\", \"00000000-0000-0000-3927-756A0361F05D\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Upper Delaware Scenic Byway\", \"53\", \"Delaware River/Catskills\", \"Hancock to Port Jervis\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.upperdelawarescenicbyway.org/\", null ] ]\n, [ \"row-qznr-ax9t_eq2i\", \"00000000-0000-0000-9BD7-44ABD2EFEF8B\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Scenic Route 90 Byway\", \"50\", \"Finger Lakes\", \"Homer and Montezuma\", \"State Scenic Byway\", \" \", \" \", [ \"https://www.dot.ny.gov/display/programs/scenic-byways/route-90\", null ] ]\n, [ \"row-tt3v-mnqc.hj5t\", \"00000000-0000-0000-49B0-11B502D7135B\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"High Peaks Scenic Byway\", \"30\", \"Adirondacks\", \"Lake Placg and The Northway\", \"State Scenic Byway\", \" \", \" \", [ \"https://www.dot.ny.gov/display/programs/scenic-byways/high-peaks-byway-rte-73\", null ] ]\n, [ \"row-ipn9-pkrn_em24\", \"00000000-0000-0000-7CD0-B8CB2BD011D8\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Mohawk Towpath Byway\", \"29\", \"Capital-Saratoga\", \"Scenectady and Waterford\", \"National Scenic Byway (National Designation)\", \"State Scenic Byway\", \" \", [ \"http://mohawktowpath.homestead.com/\", null ] ]\n, [ \"row-bvnq_pnbv_racp\", \"00000000-0000-0000-2322-36EF77035C59\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Route 20 Scenic Byway\", \"109\", \"Central New York\", \"Duanesburg to Lafayette\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.nyroute20.com/\", null ] ]\n, [ \"row-jta.sey4~n4gh\", \"00000000-0000-0000-B7A4-F3EA32EDC0B6\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Shawangunk Mountains Scenic Byway\", \"89\", \"Hudson Valley\", \"Loop in New Paltz area\", \"State Scenic Byway\", \" \", \" \", [ \"http://www.mtnscenicbyway.org/\", null ] ]\n, [ \"row-4uev-kvmb~a7y8\", \"00000000-0000-0000-19E8-B81DB47D3065\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"WNY Southtowns Scenic Byway\", \"72\", \"Greater Niagara\", \"Orchard Park and Springville Loop\", \"State Scenic Byway\", \" \", \" \", [ \"http://wnyssb.org/\", null ] ]\n, [ \"row-fe2y.297u~tsus\", \"00000000-0000-0000-936D-F332EA320A2F\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Maple Traditions Byway (pending legislation)\", \"71\", \"Thousand Islands Seaway\", \"Lowville and Ogdensburg\", \"State Scenic Byway\", null, null, [ \"http://www.tughill.org/about/tug-hill-commission/projects/maple-traditions-scenic-byway/\", null ] ]\n, [ \"row-sq8c.ita6.zrih\", \"00000000-0000-0000-C209-EAFFEBE68322\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Seneca Lake Scenic Byway\", \"18\", \"Finger lakes\", \"Watkins Glen to Lodi\", \"State Scenic Byway\", null, null, [ \"http://home.htva.net/~townofhector/scenicbyway.html\", null ] ]\n, [ \"row-cxxt_rkje~7as6\", \"00000000-0000-0000-01CE-0A3158237143\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Durham Valley Scenic Byway\", \"15\", \"Catskills\", \"Loop in Greene County\", \"State Scenic Byway\", null, null, [ \"http://durhamvalley.com/scenic_byway.html\", null ] ]\n, [ \"row-vnif_bxcj.wtsd\", \"00000000-0000-0000-FA3A-31C0E0AC693C\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Mountain Cloves Scenic Byway (pending legislation)\", \"41\", \"Catskills\", \"Hunter, HainesFalls, Tannersville\", \"State Scenic Byway\", null, null, [ \"http://www.townofhuntergov.com/\", null ] ]\n, [ \"row-a4sd.udwu-r9dv\", \"00000000-0000-0000-4BBD-A69FD7705F0A\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Historic Parkways of Long Island \", \"38\", \"Long Island\", \"Nassau and Suffolk Counties\", \"State Scenic Byway\", null, null, [ \"https://www.dot.ny.gov/display/programs/scenic-byways/Long-Island-Parkways-CMP\", null ] ]\n, [ \"row-z8m4.f962~site\", \"00000000-0000-0000-3104-FB795044A235\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Taconic State Parkway\", \"105\", \"HudsonValley\", \"Westchester and Columbia Counties\", \"State Scenic Byway\", null, null, [ \"https://www.dot.ny.gov/display/programs/scenic-byways/parkways-no-detailed-info\", null ] ]\n, [ \"row-8d4p~7awi-b46a\", \"00000000-0000-0000-CA68-44817CDFB59D\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Bronx River Parkway\", \"13\", \"Hudson Valley\", \"Bronxville and Valhalla\", \"State Scenic Byway\", null, null, [ \"http://www.bronx-river.com/index.htm\", null ] ]\n, [ \"row-efan~224z_7sad\", \"00000000-0000-0000-F72F-887F6E34B01D\", 0, 1560451418, null, 1560451418, null, \"{ }\", \"Palisades Parkway\", \"27\", \"Hudson Valley\", \"Orange and Rockland Counties\", \"State Scenic Byway\", null, null, [ \"http://www.njpalisades.org/byway.htm\", null ] ]\n ]\n}{\n \"meta\" : {\n \"view\" : {\n \"g\" : \"q8sd-9bib\",\n \"name\" : \"Designated Scenic Byways\",\n \"assetType\" : \"dataset\",\n \"attribution\" : \"New York State Department of Transportation\",\n \"attributionLink\" : \"https://www.dot.ny.gov/display/programs/scenic-byways\",\n \"averageRating\" : 0,\n \"category\" : \"Transportation\",\n \"createdAt\" : 1360878507,\n \"description\" : \"The New York State Scenic Byways program was created in 1992 by the State Legislature. The program encourages both economic development and resource conservation, recognizing that each of these aspects of a byway must be fostered to ensure the success of the other. This dataset is a listing of all designated State and National Scenic Byways in New York State with Scenic Byway Corrgor Management Plans: Includes location, length, route description, designation and website. Information is current as of the publication date.\",\n \"displayType\" : \"table\",\n \"downloadCount\" : 1539,\n \"hgeFromCatalog\" : false,\n \"hgeFromDataJson\" : false,\n \"indexUpdatedAt\" : 1560189614,\n \"newBackend\" : true,\n \"numberOfComments\" : 0,\n \"og\" : 2677464,\n \"provenance\" : \"official\",\n \"publicationAppendEnabled\" : false,\n \"publicationDate\" : 1362153094,\n \"publicationGroup\" : 677837,\n \"publicationStage\" : \"published\",\n \"rowClass\" : \"\",\n \"rowsUpdatedAt\" : 1362152554,\n \"rowsUpdatedBy\" : \"nas8-ebt2\",\n \"tableg\" : 707422,\n \"totalTimesRated\" : 0,\n \"viewCount\" : 2726,\n \"viewLastModified\" : 1560189590,\n \"viewType\" : \"tabular\",\n \"approvals\" : [ {\n \"reviewedAt\" : 1362153094,\n \"reviewedAutomatically\" : true,\n \"state\" : \"approved\",\n \"submissiong\" : 995322,\n \"submissionObject\" : \"public_audience_request\",\n \"submissionOutcome\" : \"change_audience\",\n \"submittedAt\" : 1362153094,\n \"workflowg\" : 2254,\n \"submissionDetails\" : {\n \"permissionType\" : \"READ\"\n },\n \"submissionOutcomeApplication\" : {\n \"failureCount\" : 0,\n \"status\" : \"success\"\n },\n \"submitter\" : {\n \"g\" : \"xzik-pf59\",\n \"displayName\" : \"NY Open Data\"\n }\n } ],\n \"columns\" : [ {\n \"g\" : -1,\n \"name\" : \"sg\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":sg\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"g\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":g\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"position\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":position\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"created_at\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":created_at\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"created_meta\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":created_meta\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"updated_at\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":updated_at\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"updated_meta\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":updated_meta\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : -1,\n \"name\" : \"meta\",\n \"dataTypeName\" : \"meta_data\",\n \"fieldName\" : \":meta\",\n \"position\" : 0,\n \"renderTypeName\" : \"meta_data\",\n \"format\" : { },\n \"flags\" : [ \"hgden\" ]\n }, {\n \"g\" : 47787275,\n \"name\" : \"Scenic Byway\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"Name of Scenic Byway.\",\n \"fieldName\" : \"scenic_byway\",\n \"position\" : 1,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858463,\n \"wgth\" : 226,\n \"cachedContents\" : {\n \"largest\" : \"WNY Southtowns Scenic Byway\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"Dude Ranch Trail/First Wilderness Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"High Peaks Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Adirondack Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Cayuga Lake Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Central Adirondack Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Lakes to Locks Passage\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Scenic Route 90 Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Seneca Lake Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Black River Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Bronx River Parkway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Palisades Parkway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Roosevelt-Marcy Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Maple Traditions Byway (pending legislation)\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Mountain Cloves Scenic Byway (pending legislation)\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Historic Parkways of Long Island \",\n \"count\" : \"1\"\n }, {\n \"item\" : \"North Fork Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Durham Valley Scenic Byway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Revolutionary Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Southern Adirondack Trail\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Upper Delaware Scenic Byway\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"Adirondack Trail\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"28\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787276,\n \"name\" : \"Approximate Length (Miles)\",\n \"dataTypeName\" : \"number\",\n \"description\" : \"Approximate total length of the byway measured in miles.\",\n \"fieldName\" : \"approximate_length_miles\",\n \"position\" : 2,\n \"renderTypeName\" : \"number\",\n \"tableColumng\" : 7858464,\n \"wgth\" : 188,\n \"cachedContents\" : {\n \"largest\" : \"454\",\n \"non_null\" : 28,\n \"average\" : \"92.53571428571429\",\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"40\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"89\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"29\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"38\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"18\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"168\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"36\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"71\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"454\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"50\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"179\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"84\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"112\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"53\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"158\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"41\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"153\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"109\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"95\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"87\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"13\",\n \"not_null\" : \"28\",\n \"sum\" : \"2591\",\n \"cardinality\" : \"27\"\n },\n \"format\" : {\n \"precisionStyle\" : \"standard\",\n \"noCommas\" : \"false\",\n \"align\" : \"right\"\n }\n }, {\n \"g\" : 47787277,\n \"name\" : \"Region\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The region of New York State the byway serves.\",\n \"fieldName\" : \"region\",\n \"position\" : 3,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858465,\n \"wgth\" : 191,\n \"cachedContents\" : {\n \"largest\" : \"Thousand Islands Seaway\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"Adirondacks\",\n \"count\" : \"9\"\n }, {\n \"item\" : \"Hudson Valley\",\n \"count\" : \"3\"\n }, {\n \"item\" : \"Long Island\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Central New York\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Catskills\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Finger Lakes\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"Delaware River/Catskills\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"HudsonValley\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Greater Niagara\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Thousand Islands Seaway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Great Lakes/ Canadian Border\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Capital-Saratoga\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Champlain and Hudson Valleys\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Finger lakes\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"Adirondacks\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"14\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787278,\n \"name\" : \"Connects\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The city, village or towns connected by the byway.\",\n \"fieldName\" : \"connects\",\n \"position\" : 4,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858466,\n \"wgth\" : 213,\n \"cachedContents\" : {\n \"largest\" : \"Westchester and Columbia Counties\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"Southhold to Orient Point\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Bronxville and Valhalla\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Ripley and Massena\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Rome and Dexter\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Herkimer/Little Falls and Speculator\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Loop around Cayuga Lake\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Lake Placg and The Northway\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Rome and Glens Falls\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Hancock to Port Jervis\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Lowville and Ogdensburg\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Canadian Border and Waterford\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Keeseveille and Sackets Harbor\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Scenectady and Waterford\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Westchester and Columbia Counties\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Long Lake and North Creek\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Homer and Montezuma\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Fonda and Malone\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Watkins Glen to Lodi\",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Loop in Lake George Region \",\n \"count\" : \"1\"\n }, {\n \"item\" : \"Hunter, HainesFalls, Tannersville\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"Albany and Port Ontario\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"28\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787279,\n \"name\" : \"Primary Designation\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The primary designation of the byway.\",\n \"fieldName\" : \"primary_designation\",\n \"position\" : 5,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858467,\n \"wgth\" : 328,\n \"cachedContents\" : {\n \"largest\" : \"State Scenic Byway\",\n \"non_null\" : 28,\n \"null\" : \"0\",\n \"top\" : [ {\n \"item\" : \"State Scenic Byway\",\n \"count\" : \"25\"\n }, {\n \"item\" : \"National Scenic Byway (National Designation)\",\n \"count\" : \"2\"\n }, {\n \"item\" : \"All-American Road (National Designation)\",\n \"count\" : \"1\"\n } ],\n \"smallest\" : \"All-American Road (National Designation)\",\n \"not_null\" : \"28\",\n \"cardinality\" : \"3\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787280,\n \"name\" : \"Secondary Designation\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The secondary designation of the byway (where applicable).\",\n \"fieldName\" : \"secondary_designation\",\n \"position\" : 6,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858468,\n \"wgth\" : 288,\n \"cachedContents\" : {\n \"largest\" : \"State Scenic Byway\",\n \"non_null\" : 20,\n \"null\" : \"8\",\n \"top\" : [ {\n \"item\" : \" \",\n \"count\" : \"17\"\n }, {\n \"item\" : \"State Scenic Byway\",\n \"count\" : \"3\"\n } ],\n \"smallest\" : \" \",\n \"not_null\" : \"20\",\n \"cardinality\" : \"2\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787281,\n \"name\" : \"Tertiary Designation\",\n \"dataTypeName\" : \"text\",\n \"description\" : \"The tertiary designation of the byway (where applicable).\",\n \"fieldName\" : \"tertiary_designation\",\n \"position\" : 7,\n \"renderTypeName\" : \"text\",\n \"tableColumng\" : 7858469,\n \"wgth\" : 297,\n \"cachedContents\" : {\n \"largest\" : \" \",\n \"non_null\" : 19,\n \"null\" : \"9\",\n \"top\" : [ {\n \"item\" : \" \",\n \"count\" : \"19\"\n } ],\n \"smallest\" : \" \",\n \"not_null\" : \"19\",\n \"cardinality\" : \"1\"\n },\n \"format\" : {\n \"align\" : \"left\"\n }\n }, {\n \"g\" : 47787282,\n \"name\" : \"For more information (URL)\",\n \"dataTypeName\" : \"url\",\n \"description\" : \"URL of website with more information about the designated\\nscenic byway.\",\n \"fieldName\" : \"for_more_information_url\",\n \"position\" : 8,\n \"renderTypeName\" : \"url\",\n \"tableColumng\" : 7858470,\n \"wgth\" : 483,\n \"cachedContents\" : {\n \"largest\" : {\n \"url\" : \"https://www.dot.ny.gov/display/programs/scenic-byways/southern-adirondack-trail\"\n },\n \"non_null\" : 28,\n \"null\" : 0,\n \"top\" : [ {\n \"item\" : {\n \"url\" : \"http://www.seawaytrail.com/\"\n },\n \"count\" : 20\n }, {\n \"item\" : {\n \"url\" : \"http://www.lakestolocks.org/\"\n },\n \"count\" : 19\n }, {\n \"item\" : {\n \"url\" : \"http://www.adirondackscenicbyways.org/byway/adirondack-trail.html\"\n },\n \"count\" : 18\n }, {\n \"item\" : {\n \"url\" : \"http://www.tughill.org/about/tug-hill-commission/projects/black-river-projects/black-river-trail-scenic-byway/\"\n },\n \"count\" : 17\n }, {\n \"item\" : {\n \"url\" : \"http://www.fingerlakes.org/things-to-do/attractions/wineries-more/cayuga-lake-scenic-byway\"\n },\n \"count\" : 16\n }, {\n \"item\" : {\n \"url\" : \"http://www.adirondackscenicbyways.org',0.6083221,'xv',244,4,'1969-07-30 13:43:03.0'), +(NULL,'oo','bbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzKrav5tLL6u7kPIJEtx9OMbmnH4niEPHo7gLFVk2sq28Vv56OHzLLbE+5yWpXbxJv9fwdGPqo4fYI\nxk0kfgbbapFtG26PKWWHQnyTysUy4SL9/rVv8ww/8DdYOqFQ+8O0QnOLZ1Cbn307qEUH9fLUW+ZXKJdIWkyZuMpqyIJ7fkG/Dni2tR4uNAhTde70c/WOx/zBUcYsk5m5jmPxaT3GOwbqwvp9hIkPOtHd1JEeyXqBnsseV1jsyI5Nj8iThpCk9QMIrYwo3uIIcFngJa5r6fu8u36JjhBpkQWhIXq6Bsoe91wmjjpNAXPBLl/M9axZ5HNIIiLjOf2pjLg6ObNLCMh+RKhaW+y5zVegpAFzYjKnIMiOL7vZucQ5XsNZMAuI5izuIr947PeazWgcZvom78QFLiYqdkRTimuCnoQXgtWLAZ4wzuT2EiydSMXXqurGmm3E/Ti58wP0VNpKjehr5yTkUAIIGnNis18L85deUxL8j5PxuB1sMQMUawmOY2T2HnVUAlw3YwYif+abPur9yu4RWAWxRTl5QNQEO1I1BbiwNtOAOffwk55y1M5auYqopghUAtKTIU1n1bBHh8hMxJWhryP8OgwDh0C3rL5bbDruwTmh4DwIU0S949SZdIAPKerzAYtkxjS1k1H5Asa9VXnMwRTNI906ceI5mAyLddzpR1fPapkz2Ox1/FSrK1s/e54mOjtp0dYOMSb0MjXdld7Gi5dkCmOwRlUH7s36/52vVh1nhSev2FI9wRkEnwfBfXBKPi6OAJN5TU+OEV6rxVzqK6XyAKsvak/uBC+i4bvlnWBlKdQEVYMGZN4NzYI2tMOdfO/EHRDMxmSy6gPyCJQtA35FmHXdoRIK1oxgPboUiB439jolHjiNQMMXyY9I+9Y7BkKcwmY+EIB1W8mogzTt2T/AisG2YviONiAbBWmJRF2X63TdbLwysAMYL7AsgaC0YeIGpCEJ8byAwz/ti0nBbuviqUKbdPNhfNGHx0e9Gbc6WgQR2/qSN+5AkHRzK',NULL,'xoob',1,73,'2003-02-05 00:00:00.0'), +(1974,'bxa','',0.2850037,'o',250,NULL,'2034-02-03 15:51:04.0'), +(2003,'akqnhjx','ers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licens',0.8258514,'xak',8,8,'1913-05-18 09:19:37.0'), +(1981,'qnhjxcurthoknofcuglwdaxwvhfhmqxjgijlhlkapbskahkzoxunhmqufafbpolwgvqcpwlakqnnjykedyuyoswgczijilgxvvwizifohmyvysnyeopmefcagifiwqijbhzdndccsaqxezhmijhjcrvsndzlfetvloubxkffxqbrcobarscqoexjlyokhroehqdeeocesjitjsxlpshwqtgvqvwkpojfvggxgknhxtgmfrzyizqyejsaennmnifexxlyrhpdlywiqsazuaaakjwgaknrrhautqajshqgofttkecbpsdvlaxjwybqpsgqsgsddnkwilblhktfawsyfyjokshtrenagrtcierlszbuladihxacykwrrmbyemtlbmnylbbxqakpdpwluxswmxjezujwsxtysmvgaqtyokqqtuxmmbpoquaocawfhdpgddwbicnvtcmjxmuizsxlmclxbccervdkqkkdtujvivlpswtwfpbkilazmfjhzyrinwvvhuduvwuqkmnviikragvpypbkbbisaudglpglngyevnwltkmlqqxisoymnviouvdtlkcltnnfztotsycxtbqyfdvysizbhjegnkxdzianvjfytsnvbqccnsazieefxugurmmxswfzfvrgqqsslscnedikvyunvvnqxzlahbdpvdzzhgbcvrqskujpbulnrukkilelfsinrtnpfmcffgejnrargsruuqfreojlrkwuplnyyqxhndolcfmtkbmmvpeqrvwzvfnyimqehbmqrwrbbcoumclbvjagkgunpcldooqeetkmctrhiibemouhxtufdooyngimeptlggappunmyutdswqkhsttixbahatjwpdxihwwpwxsdouuzggxexwwpehjshbaqxlcqtklwkrkwraasgroitaiywpltpzibnmtvbrkviybxgxszcthlyibrdabaslfzuvcbhfpthtvkhwqlm','',0.4652557,'k',0,4,'1982-07-26 00:00:00.0'), +(2023,'hjxcu',' ??\0}セヌ鍄oοΎ”X?)ο½Ώ?ο½³oο½§?fW道セ寺コζŠ?+ \rο½Ύο½ͺο½­οΎ–?οΎ‡Oζ­³?*οΎ„ぼY$o講Zο½€ο½³??!EF?2 οΎ–ο½­=θ—·(??ο½ιˆ·uR?6uη›’qο½€?モス式卦{ο½Ώlη­¬_*KL?ο½’/ο½°ο½»ο½Ή?!?caζ…Š%昿??εˆ‡θˆŠοΎ‘οΎ‚ι‚΅I%Iスィd?ホ{]\Z#YοΎ’Ukr+ο½­ ミ^οΎ’SQUユチmxAヲWΒ§\n?!免K卩w`排XリPοΎ‚Πο½Ί#ζΏ 5漏=οΎ‰Xο½ΉTb。゚GζΈ¦?<\Z7εΆŒο½²ο½²οΎ„?ワ颴チ ?7チヨ?,@!1ο½³LK?ミI&&?ο½€δΏ£?8?8#1>7=T47rRVY^οΎ—?6οΎ„$3(qマW?8?q゙P?οΎ›DExοΎ€1^ι†―#壑Q粂ナs晝ι¨??Sdヘηͺ©?ηΆ΄ ヲ刊3h=ο½₯?@β€˜ο½¨ο½°δΉ™jfο½³$V?RVο½­|οΎ•οΎ„η₯’凋?εΏ  韜レッ%?[L6xz醫Mヘs?uヲ$x2ο½³?\"\0?!cοΎ•Q?$θ–¦?5逊VワャウD\n?k Ρ‚%ン0ο½ΎTθŒ‰ο½½οΎ…οΎ@?θ“ォスン??Mο½¨οΎ–ζšΌο½‘{ζ‰ο½£οΎŒ{?:ο½Ήィο½ͺ[οΎ˜οΎ‡ο½³ο½΅ε‹ΊF?[b?#BοΎ›+倜q}=οΎ‰\\エ?&D?&ο½­fIg1,MjZqB敍X?%リ巽YQkXT?ζ½Ίι―’^!ャu。8+δ½»rIjャK[ο½Ήiフ n{&4iο½’?8j。泌务踈シーH黎y\Z?ラチ譛\'4οΎžη‚Έbο½Ύ?ο½εΉΉο½₯ο½».ο½·%。ο½₯ο½»H)@~ζΏ :ο½Ίθ³ͺE[AJHBD8WοΎ’οΎšCX!XοΎ—οΎ‰ GΠΊ3οΎ™ο½―rοΎ…? 5?摜?\0οΌ¨t\\?eζ”Έ2pζ¨Ί+,?瀺エkrn(eOZοΎƒο½’d\"ζ°Έ??q#ネTοΎ‹οΎ‡?2W?\r「`キ。?\0 ο½Έ?(ο½ΌDζ„ΏJJ4]w\0V珞>?#θ„―)g*η–Ό?.噴監:οΎ‰@y&>]ィ(sワyFa睇GZ\0οΎ‹izMゥ゙,+ォοΎ“ο½±IQJgο½°Qο½€M\rヘy#轟c\n??zΟ‡mE」q|M{οΎ›KrL];δΊ‚qο½Ά5?エ??\Z。?I$識6hβ”°Yο½―?t遘?]dd\'軍\\rοΎ—\\ュィr6ekヲ?$qq恨0θ±ΉοΎ›wο½₯UοΎ™ο½€E*フ8ο½Ήcε’’οΎ‹y\0テ。^zοΎ—dy\"ο½½οΎ–fSEG_οΎˆοΎ’BaQ?KLο½£οΎ—ο½ͺο½­ζ™3οΎ‹(RοΎ•Nζœ•?H?ο½°ο½Ή=OοΎšοΎ”ο½»οΎι»Žq?οΎƒοΎ…!ζ£§εΎ΄θŠ½οΎ’?\ZοΎ’??`。E?ο½³V?#{2δΊ­??\n?ヘ羌3ャihο½₯ε‹§nトエ????ο½³ο½³\rοΎ—ζ§Œε­³οΎ˜βˆ½οΎšο½€vHエZ{~N?5ζˆͺ?hン?\0FEdοΎ’οΎŒοΎŸ?ネN恙??ワ????οΎ‰?CI蕉鬣ロァヤCθ³ͺ遜ηž₯ηΈ’W。。qユdο½Ή@j?0οΎ…Ξ₯οΎ’ο½²E概sθ€ͺθ‘¬οΎ”οΎšη™’ε‡„ο½‘ο½°οΎ™ )*ο½€iεˆ†m0』?οΎ“L?H\0οΎ”οΎ‘ε ‚οΎž@>\\?OMチ冲臠耂?ャ?L=οΎŒοΎ†?ネ\rο½·? yリ!?:οΎ”ο½·???=?ο½½~ネ?蚣リ?ο½§#フエc=Vθ•ͺ址ャ`蒂烹;ο½²η₯οΎ‚?\0ζ…“%ο½€ι ‘qヲ? リ2?\ZοΎ—xo翊y?ネ?\0?ο½»?#Z萱|?ο½§ο½§οΎ‡??輟レSWl1\\γ‚²m謄蝙<ο½³ミ?5キヘ6?GD遇vォθ‹“??蚫g?οΌ₯HDnぴX危\\潁}??οΎ’.?;HοΎƒMοΎ™?$X?i[1vヨスソ鴃秀Dマレ石?゙ホD?ζ–›β™―Dk%οΎŠοΎ›οΎ‰4?ε·½εš’οΎ‚X?(ゥ;ζš—\0θ…†?c ?οΎ“οΎšwMヒャ介GζΎ±zοΎ‰οΎ‡οΎš,Zζ‡Ώ3οΎ™?+οΎ‰οΎšVο½±<;ηˆοΎ…\rチοΎ‚5dlεŒ@lVz:?ζ§ΏοΎ•?οΎ•oΠ₯ο½½ο½―E?史*?マ?οΎ•Us\nο½ͺゥ遽>ο½Ύl?:::::::T??9 ζ·ΉKοΎ‚οΎœO?;]οΎ‰<岫ァネ?3ユミ:R?ο½­ι™°οΎ‡?οΎ„zοΎ€,\n?ο½°%??Mε‘ΆοΎ€<ο½?2壕ゥ蕾οΎ‹?(ε₯=Kι€ ?ο½’\"\"?ヒ醋#モヌマεο½Ί?洫ヘ6G7ο½―?rο½Ύn。6οΎ–ο½Όmレ?ン?Uラチ οΎœο½‘οΎ‰1ο½ΆgGxοΎ’cοΎ‹g,\\;θΊ™?sοΎ… ?6l?)/Oロ杭かi\n彩?}θ—·?l $ο½ΏZフ「F,]7ο½±)\0ο½±B7P マ痍舢]?7οΎŽοΎƒοΎ†ιš¨ο½€???\0N~.?vε°…?<8θŠ™rοΎθš“^ο½»?9e階\rマ#\0ソゥEZoqト)fHdζΌ‚\ZIο½Ό 0ミIo ホキキイ4ゥοΎ’XO卒ri%8I?\"Gδ½°mォθ„‚$$勍lム。?メ。?$Hο½z+οΎœθ—\"?Xr0οΎ‚ζƒŸfε·–ο½½6\nリ\r?οΎŠοΎ‰,?\r?οΎ‚*砒ヘ?θ‘Ώtqノ靑??゙fη©€{ォィ&ο½²yl$ ο½£?2ο½°FVο½±\\ムヘοΎ‘οΎ€q マ|QοΎ‚???,?%ε‹ΉοΎ›οΌ—IοΎ—ηΎŒοΎ†?,チ&$?vX笂?!@;lN?ζ ©P裕@#ο½‘ι€‹ε‘˜ζ€Ž \r?#οΎ’\"ww?e lι¦₯;APΞ»ζ₯<ο½Ό?ο½Ήι€”ο½©θŒ¨ο½°?\06?0??R5??;$颏\Zο½ͺθ‹Ί!οΎ‹?θ†ˆοΎ…ο½½ι½’θ‹ž詫チケ&フkl,。ο½,7識$i\Z??ζ€ΉGι΄»<ャ2ο½½?οΎ—ο½­^?^゚xοΎ‹θΏ©ο½Ό]οΎŒοΎοΎŽθ‚­y\Z?Y.2怏氾蕭Pu澎gS=Eク燻A笏4O火曾チZDs/ο½’Wο½Ή?-「ヘ:ζ°Έ7?;?rM圦?!豎ャο½₯εΈ―H)?!ο½ΊJ#(ヲdεΊ—4?lゥ??\nxοΎžο½Άζ”…εΌο½±οΎ‡c%θ—· アマ撒Y*Qエ?DH&ο½³?3摍U%?ο½οΎœ?ο½·?#ο½―zXο½§ζ’Ή:?5Xο½₯ο½Ίο½Ά%YnD?7昢Lο½§exο½£n?フWη΄‹yθ₯d?οΎ†?_ο½°ο½»η«‘I?8?冲:*マ諱LBVο½­ }dSDネ_ οΎ—οΎ‘ο½½οΎ—ο½Ά$θ‘¬ο½±ζ‘ŸοΎƒ\"9θšοΎ•?QοΎ‰? οΎ•ZΠ‘jチォ徘ι‘³X*οΎ‡\0伏\"g湍zCο½£ε­€οΎ„ο½€ε€Άζ’­-?οΎ•oο½­οΎŒη°‡3,δΏΈc xyο½€I噐EdN?X鞍οΎ‡οΎ…?P静ノン;ο½³εΆEοΎ”?ο½·y οΎ—X$urフ?&フP,ホK?莡?\':Vο½³9皐89G;Yο½°οΎ„??Jワ渣bdミqン?A4ο½²\Z?*οΎ‘H0ο½―ο½ͺ?J+芍\r?$,ε‹ž|?ο½―4?M-?δΊ°?ο½Ίο½½d?リ9ο½ΉJ3\0?\"ネ?8l .P゚gPοΎ„οΎ’H{ニ卒セ( {゚$οΎˆοΎ—ζ”»H~芝Fο½ͺο½Έ.οΎ‰ =ο½₯οΎ€οΎŽο½¦οΎ–\\οΎ“οΎ—k?-盍ー聴9^鍄チJζ²?\0ο½³η²Ύ?l&$οΎ‹οΎ“-&θΏΉο½Άヘa訓CοΎ†-?1mJ?;AレC?Π‘+ο½€)oォ]mVnhθ’’οΎ†+釦Exο½Ύ aοΎšζΌ¬οΎ‰In)#ヲ籍?οΎ…οΎ‰?!<5θœ₯7jqヘe唳q* ヲJ? iοΎ›$ulοΎ“Kη©΄ο½Όο½±Xο½Ή%ζ€±θΏ½?e梓モャmοΎ–:Dpο½Έβ™‚οΎ™WieD朷Yィヒノ`n3P簍セメT品SvοΎ‚h。$θͺ₯ハ「\"W?ζ„Ώz?x?;YeοΎ‰\Zォユο½kl]?g\'イハs??OοΎ‹|ハ9ォh?Gο½₯ゥοΎ™??ο½Ά?? セ吋灼\nQ\'エ]nεŸοΎ–tο½³?,2JοΎ”Wwヘチjy?/οΎ‡1?(eワ _3grュ剩aCο½£.οΎ‚οΎ€ο½©οΎ˜y-η›΄{Aiチ?οΎ›Xο½³鍼Aθ‡Ί\r??δΊ«6ο½₯??pοΎ™οΎŒο½«iο½Ά?mι‹²*E}L θΈͺοΎ™UPVι™Ÿο½΄\"!Dο½Ήο½Ά\0?\n0XοΎ‰ο½’EsηΈ’HοΎ‰^ο½²=η©°BοΎ…c?ミEο½Ύ。ロ0[?.ヘャ}ζ„ΌοΎ“ι›«ηΎ―#エ?;2ネHe荘l$(]iZ;輝?\'η™Ύ)5XmW?lοΎ•ο½Ώ*g本0フbwθ‡₯?8f\rハ>?,トィ?5οΎ–?g?ε‰ͺ?:;ζŸ―ζƒ‘[\\?οΎŽθ…rWm{[9?(?2?占8?c?nοΎ“ι™Ί=ィ`セCNィe5萼K%イネリq?ィ孝?。=Iι§’ε₯‰οΎ•G9?b?゚?*ο½ͺ5~Uzレg??/ィキk?οΎ™ο½’οΎ€.ζ±³?w<芹G\'X=+?θ³£οΎ•-vε½Ό>?x螫οΎ›ζ½”Xォコリq? ?=r?ο½°ε–\Zο½·.ォOヲ。>rリ2kο½­ο½ͺフ*セミa?Bο½± 刧03!ャ?οΎ…?7ι«。イCVο½Ύε…‰rο½­~[Cη¨Ώjォメ&\\P?!?ο½²N?=οΎ‘*ネ???0m? m*0ワ軒温>ο½―IN?ο½°VYuο½³Wg?*rV?οΎ”? ε§«S-c?<οΎ›P3ι €5-.rοΎ”?H].qイワc??垠*h0?ン?Yo?η­‹?gο½ͺ魎?οΎ•?θ•Ύε₯ͺδ½Ώ}醴コミヌ?6οΎ…\\リhοΎ‡ζ£ g9e?5?Bチiο½°ε‹…οΎ”2οΎ“?|H=tヘ4qf\r\n?レlN? ?!ζˆ–ο½Ίζ’—\Zο½­/οΎ“οΎ‰I,ο½’οΎ˜θ³›pCοΎ‚οΎ„Jο½²V1?2?<;7ア∽g?rMZ?ο½―dヘ~H即θ›Ήο½€\\PH??2ο½³rοΎ…οΎ—nO?U戌Rk7}?ο½«ζ†ο½Άζ‚’οΎŽο½€η΄Ώθ‘†[F^οΎŸηš΄ι‘ οΎ‰9jゥ4W6 Kο½ΏοΎœοΎ™V〆剱9ーハ*ランhM0ο½³οΎ‹6}ォe4wοΎ‚uο½½ο½Ίn??9 {cοΎƒqοΎ„ο½£Aο½ͺミンケシウ伏ト?~ο½’C?(\rィk?ヘu?οΎ‹?yホU?\"F ?C\rCε‚‘οΎ–哨?οΎƒι­ŽRUοΎ•K]Aο½‘ο½ΌιŠƒANCエ喙ォRοΎ†dAοΎ‡οΎ“\\οΎŠοΎ‚46οΎ€οΎƒ郁?5\rIJοΎ‰?iチィ4?4ο½―XοΎ€Qο½±ο½ͺl8?Wο½’θ…ΈYZチV3W却メWζ·‘dv}οΎ‡aBpο½±Ys?οΎ‹ζ΄™ο½£^ハZ挟?(zοΎ•eο½ͺθœšοΎ–/??Lマ ?θ•Šο½¬ζ‰‡?b?\ZοΎ€?\Z|?ι‘΄qη²²??q?&ο½ΈJο½»ゥ?>Kャr?ζ‹Ά\"\"\'披?y\"οΎ‰ δ½―ιΉΉ??mネぺ%.rο½ΊネイフGmο½­ο½Όε―›bοΎ…ンGS\\οΎ›ζŸ”οΎ•C?Fヘ痲,οΎŒζ›Ύ<ο½ͺワHlη‘―εrt<_ι ’ο½€S篁οΎ™?οΎ‹ο½Έο½­ο½³βˆ‚Vホ蜜?)r\0?\nοΎŽοΎ‘?οΎ‰b?,?οΎ‡??ζ€™οΎŸοΎ‰εΎ©]SuKsフ?ζ¨’ε‘’k ?)q?4?G?0yΞ£&ζΏ‘[FH??\0οΎ•\"sι―”ζ Ήο½±C?ヘレ?\0οΎ’ο½Ίο½Έsο½§ο½ͺηΎ†οΎη½΅ΠšbοΎ•(#ο½½6Aォヒ%xι£½ο½­?h$w\nL?}ハ/-?5οΎ“Dzζ›œοΎ˜οΎŽοΎ›ο½Ώ^ZI\\ι‰’eャVJ1Nミヘ+iャQ? J$ο½³ο½Έdη­ο½§ο½¦οΎοΎŠ|yGο½Ίθ–‡bοΎ‚?\0-溺セ萓Lネ? ε―€lο½­?ヘο½₯ε―©^<睛_-ο½°リh迚οΎ‡WοΎ„b?t%? ?δ»–??鐢キネq? \\?em?ャ?KoWシホチ}cAv ο½£?3?!エヲC ゚tοΎ™ ー常レォ#οΎ“ο½§-ンッp?\"_rο½·%XD8E?1ηœ₯ュ幌TiPVNοΎ‹?フ!οΎ‰!οΎ•?Ia\n[靨&Llη₯·οΎ™\":)Π³=フ?η„”ο½³?;N???+P-gwQMUοΎœοΎ‡ο½Άο½ΈXテャdサゥヒ\\8ミスb\ZAyο½―Btと?2ο½­οΌ΅PοΎƒ ο½±Dフ?6m?,n\n?η‡%ΞΊK#ο½ΆοΎ—ο½§0ZrF(ャロ-??\"責?*?フーハ/ヒrィ?R1E8ο½’O?ο½»s]/dζ’Ό?/2GyοΎƒ?7颚h??恬??hοΎ‰bE4H5Xο½Ώn:76\".??8???.οΎ—1レO)jD|ο½ΏPUο½»bNοΎ„vο½r9dη―‰ο½±οΎ‹3οΎ”w??nο½±?q`b7?頀鎌mK小8η΅–xyォチ 翌ウ=c\Zο½―pャBrW?jοΎ„<ο½―ι…©ι£›?N?/ォツ?οΎ‚\"\'謬DETDoゥU|\"\'η²§οΎ‚?ζ²»Dlv?\0Nο½―?TjlIゥ8;舩EΠ«%?#<#?0?昨ο½ͺζΌ’??ο½’ο½§οΎ‚ο½§?イ凧W?E?5ENθ‹£\0jgο½°IοΎ„οΌ¦?ο½°vN3ン0?,##ο½½lzοΎ‰bV9ゥ?-οΎ…qゥ???\0レァ??\0ζ­―n\'θš“Oh\"ο½½οΎŽζ›°?\0ο½ΆhοΎ‰yセンモFア。ォθ₯·\"H゚(θ†‚οΎš?ζΈ¬ε–š?IοΎ„ιž‹{ン? 産?トヲjθ…Ώ1οΎ•οΎŠζΏ†?η΄²YοΎ›?bοΎŽοΎ›ο½ΆοΎ„4οΎ‹ζ˜”KJ9ο½ͺcο½€ο½²DEδΏΎ?οΎ‰rエqネ#<ネ7, ο½§ζ…ΆbK瞬ソXζ­’)??)kο½­?Cy\nο½ΉC\Z*Z3ο½²εˆΆο½¨ο½²οΎ›οΎšεΎ‘?マ.?チヒ2rエvη€§ε»·ε‡ͺ*\0cL.??莨?3Sq?xM燧?゚bゥ)?ο½₯οΎ‡6bUο½­ηΊœοΎ†? ο½Ή}エ艝サ「 gJtLH44?X\"?ヲxリ??Hο½­ο½ͺθ†ˆ~ε£™[0ο½ΆιΌ ζ€₯パ?οΎ–A\\%フV?=e\rζ‚§Iaο½€ヒう Fη΅žοΎžοΎ€οΎ‹ζŽ§?Dεš€mο½»d聳?+エケη’ζΎΉ?NοΎ–οΎ›サヘツqフ=οΎ€οΎŸοΎ•οΎ˜η€ͺ- οΎ’yd>ネ~οΎŽθ±Έζ¨…[\Zレdο½€?οΌˆζΏ†η™¨οΎ–\n?\r9ヲ?%v&[?οΎ‹ζΉ―R??7?ゥ@ο½²\Zャ?οΎ’\"%牙現*?οΎ†^?タ槝? B$H?(?οΎ—ο½·$ο½±?;E2呞%οΎ™ο½½οΎ„n7=5ネー.ス裄9ο½³?ζΌΈθ‡Ύt覓]kοΎ‰η΄οΎœjο½Ή?ロかウyb%W?Aο½§.ツミrοΎοΎŒοΎ’ο½―ο½ΊοΎ‹$ο½²οΎ‘?7]ε€²?タマコ?1ζ₯’s\n?cpο½½ο½Ίfャsε…ͺ/m.θŸ‡ο½³ο½§θ¬n.ζ₯·ο½Ά+fι·‚nセレ?\0?ヲs.\n2<\n?3\'∽ホ??T揄ヒ?h??Wο½οΎ“.?ワZTウ`マ nAοΎ‹ο½Ά4ο½£\"οΎ€οΎšοΎοΎ’Wζ‹EhοΎ–?;H\'q倅痂。?p?5q?;γƒœtミZv翊ミ?ゥエラ9ォq3οΎ™zθΉ„ηΆ΄?T:?フU?ZリdeζΈ©6蜷q JDοΎ…Kゥラ2οΎƒζš¦οΎ—ηΈ«η tォエーノM_^Icx)ゥU?ο½Ήyネ ο½·jJζ–ŸοΎ”Ndζ‡Έ?>ε…Έ_ィnο½­8R{圧ヘ ιŒ†$?οΎ—ι­ο½°?b????ο½§οΎ”cεž‚οΎη‘•k$? 5\r/ミ゙XQjマ8%θ²§ο½³EοΎˆδΊ¦οΎ€v?a\n?οΎ›?9求モW+?\"x?リ@?,ο½?g#οΎ•R?\nJaナャウZKKο½’ι– ?*ο½Ώο½Ή*οΎŽοΎ’οΎ˜{/M}pε‘ηˆ›ο½»ο½ͺο½Όο½½ο½·ο½Ά%lepοΎ„?+gH:}Yο½½gοΎ„u\Z^゚?:,ヘヌ,\Z?οΎ‹?ワr?οΎ„ζˆ²ο½·οΎο½€?ο½Ύο½Ώ?5?ゥ5e ?rvhο½’I? ?γ‚‚?.レ?ォ?|ζ΅™η½§οΎ™ds?bk?εΉ’Kο½§θŠ’v?&??\0οΎ“\\jο½»)CZ&}牆? η―·-Eο½»οΎ†γœd??ο½Ίζ₯”X叙>厭瘟r\Z#?3-ζ‚ŸZモ謇F゚?コ躍モacοΎ”I凋iο½’|?ιŒ¨θ…‘?9ε‹˜ε­£?+ο½Έο½ΆYο½₯゙Qhs{ηšΏο½¬οΎ…οΎ‰rsgο½§ο½Ά0?ζ΅Έlο½°gネοΎƒο½’6`ハリ\\kQ草8Rャ?!:WQセゥ?7οΎ’ζ¨Ÿο½ΊοΎ‹?ο½Ή!K?? ?ο½²ο½½!|ィ鍄r!フ\Zο½½}οΎ‡ (?ο½ΉYε΅Œζ€„θ—οΎ›θ·³\0ゥ@Y貞A\'z6R?οΎ–/モヘ\Z4ャ川?##{Mε¬Ύο½ΊKοΎ“?$qXο½Ύ?/=xjXD]?サハ」?η΅?參T^Qニヲ>エ?=~|D?\'謬DUWxO>|ォハァ?U?ιŸ‹zx_??\0?IοΎ›οΎ‡??P?ο½Έ?\0?コ鰊(θ–€??ο½―?ιΌˆε–°ο½©ι…©?~:罐?熕pv?ο½·?uSッ「ーャ> Ipヲ:O5ζ˜‚JοΎ—ο½€ο½­Tj3οΎ‘?$j/qZャT?ο½ͺ゚OοΎ‡O?yX?η§‹οΎŸο½Άο½ΎοΎš\Z[ο½Έο½’S捻トKι­…~οΎ’S]?\'?\'??I}οΎ™οΎ˜οΎ„θ³ŠFο½±<οΎ‘U>????\0hο½½zο½²G。=Hο½ͺδΈ”?Jο½±=/o?+<|?οΎƒο½Ό||?? ο½½οΎ“οΎš?#ヲ??efZο½Άο½«οΎ™ζŸ±ο½¬οΎJθ»›Dnン壻丢Tο½ͺ;#エMοΎ…οΎ“fU#AζΈΎδ½»ERjラqA3οΎ‚?u#_ο½ͺォヘx螺_センユ?0WVeo?>旁?!Cン!i?ο½―?#ο½Ύ~n???eοΎ‰?0??%?=?ε†ΆEjE+ヲWF#θƒ―U!|テエzn>毘ζ±9ヺネ?ゥ?c5\"猢\r]?仝糟?CワDθ€‡ηš‡:\n纂繦ャrηΆ’?゚?1?s?ネ7ο½ο½?&?ツ伝鉄?ε₯§KqKζ–­οΎ›?递ォc?。,? *E2οΎ„οΎ‰%??<7οΎ•\\οΎ‘οΎˆe\\?+?οΎ‘erοΎ‹>N\r<ο½€οΎ•ο½²οΎ†ο½£[Cv?6SN?ο½­P 逐?η•°??0\Z?\0Oθ’‘[9K?=οΎ™f?mDοΎ‹^#;?ζ˜”οΎ’?$ζŒ‡pο½ͺ_?ο½’Kθ„Š:? \\dBHaHθ±Ήο½°*ο½―w┣ーュ?θ–¦!Sε‹ ο½±ο½Έο½½ο½ΎοΎ‡@ ?kοΎ‚65TοΎ•οΎ‰ n~{Yー。[ 3ζΏƒm|?壘?F?\0ε„•Eο½°&ο½₯=ζΈ¬\\?N#)エヘ瑼8\'_[゙VO+励?#?w%s?ο½½?ン。?ο½€?θͺ˜-゙エBチ ο½ΊοΎˆε±‹ζ©KE \0ε’¨??-?リ\r?ι©’οΎ€&ο½³XοΎ‰r膨ャ」ロ[<チ櫺#Yη•₯;>}?οΎƒ:商?οΎ› ?7??\"F>U????;?i予^+4\rホ秘4r8\\゙6?ο½³U!οΎ“οΎ‹_ο½₯ο½»m\rォ%ソエ\\ο½½η°Ώ\\ο½±bqXοΎ‹lrKZq氓擑ヲ?eοΎ‡ο½³-j?リ?0wZ+οΎ…)8聒?θ³€ο½²?&w?^η”˜628ュq2ο½½?!N?3ο½³JR!&?b.?\"zε™΄?0b?ο½£?οΎ™?哉θ˜‚ο½₯ゥ缺οΎ„ζ±Ύ?rοΎ–\0mエチ?7\"XοΎ•:ャο½ͺワT?*sWOaζ¨—οΎ™H?璍3吼テdvη”‘οΎž?97?rdο½ΉB?/(?4mοΎ‘?7?3X]゚$οΎ™<7dο½Έο½©οΎ“ζŒ―ζ§½g?5`臓<&1 Yο½£ι¨’ο½Ή+οΎ‰S?)o+x_ζ’²x?ヲ皸[\ZA-4SοΎ’?^「橦〃?;?:+\Z?|δΏ~h4οΎ“+,\'??C+スレwη΅›οΎ‚<レヲι ƒ?οΎ—c?tο½ΈKh?qix゚Mg?ι¬ΌY ?。イッ\'リクッォォο½ο½³?\0cK?;xοΎ‰!?ο½²P゙棯T?ο½―zqη₯¨ο½Ά+チ?4ο½£yヨタャ?\ZGe\\e0!ンツょPγƒΌjο½ͺ4vο½±?gク姆-?/pο½Ά#,οΎ‚?<「ホ6*#?Kο½―+?hンチワ?~ο½»ο½­οΎ‚οΎ“θ©οΎˆ?3。XH?xο½²οΎ“}TヲTιΊΎο½­οΎ•ζˆ―[T2[οΎ†ο½³]οΎ”5?bワ+リ?θ„±\'θΌ©CζŸ»ο½¦οΎ›οΎ‡ο½Ίε†…p{N>^AοΎ‘a)uV:ハο½ͺο½­<舡QοΎ‡εΏ€*コ悛ッャ?レ?,レiο½ͺ*\'H\\ζΏ‚$k゚エミpθ₯¦οΎž;??? ?yο½Ώο½Ή?ヌ釐q?#οΎ…οΎ•\"ο½ΈeοΎ“G!エ%D?/?ο½£?x1ζšUg]{M廝レ菷j*ζ’¦mε©ͺ$oθΎΏIp$Π‘,θ‚’ο½Ό?偬1ο½€ο½Έ?!?_4ο½ͺ?ZοΎŽοΎ–η·¬ηΎˆοΎš)h??$Dο½Άο½ͺοΎŠοΎ“+yοΎ‘οΎˆ $ο½­ο½³%ιΌ‘I3EZX憧οΎ„ο½²οΎ€?hοΎ–ο½₯[VチYフイglv?w+!ゥhο½₯ι³₯)ウチ?#pvvリ?fEUTU_?Q|x?ο½ͺ?摎USハ?os\"xT??\'?Q???οΎοΎŽοΎ„?済??ソ床?|?\' ?;゚???ο½£ο½£ο½£ο½―:::?S??\0I???οΎ‡\\tttuンッsQZ萱Zθ–€kWハキマ?>Qο½Ί?οΎ‚?E?;{???|??#]蛬~Wハ/?\'ゥ゙?/?7ハ?:??>FοΎ‡οΎˆ\0?」ォロ5ο½ΎοΎ™e?οΎ’ζ‹Ύd!uゥ4A囃xヌ革アウイο½§Y!遠5ο½­l簑レο½??jtャロ?1ノ要?I?\ZォM圻\Zι­…G暾ワ??@蝢?zr?e\"ンο½―5ΠΈε¬°F5A.δΈ™ο½’ο½ͺ\'城?\'??οΎŸοΎ›ο½οΎ‰#εΈ™οΎ‡???ャ??οΎ“??οΎŠο½§οΎ‚?ο½°?+賊]?vワuθ‹Ÿ&hRοΎ„?~><&?οΎ‰οΎœN +?\0リ:??>/eοΎ–Yιž…θ„±R??9C?οΎ“?>wBοΎ…?AK\'n]??[CοΎ„οΎ™lx\\YοΎƒGCο½­ο½°ο½Ά?aο½²*ホウIο½ΏaοΎ•\r ιΊ‘ζΊθ΅­?=?(1οΎ“Azt?1(οΎ“οΎ™YLEοΎ‰οΎˆP?゙ο½ͺο½ΎaοΎŠο½¨ηΉ»ο½΅οΎ–οΎ€?6ネ_]コ贊?ο½²οΎ™ιŸ‹*6 ズ抻务恙~゙ク?\'οΎ‘Pη¦?R?65偏濠虧睿Es們~οΎ•EOワ靼ο½?サミヤ_(οΎ”D?οΎ’οΎ„?οΎ–9?η«œοΎƒ\\吟マ妊?D?廟*ο½ΎUUUιͺο½½οΎ”? gK\r\rδΎ­ZdV?η†ŠP,QネyK?mGzcワ?;?.舩N\"?ο½ͺ=ghο½Έ/jI8sw?+1?2搗YοΎ‹?]非?(.゙?ο½Ώ位フ?%\\遍?::FNn??\0ο½°οΎ“ζΆ›4c?,R\nοΎ™GXο½½η§•$アフ?cTIF)ο½{_ヘ?6ο½ΉοΎ‹#X村?οΎ“οΎ•?4qCfζ…΄?\'ε†₯ο½ͺネネ\0ο½«θ²žθ—ο½²QοΎ…@杯qァ鉄用\"ο½·ι‹Ί?y(#njη“§ο½°οΎŸοΎ‚ο½© lH;y?9οΎ‡s ο½³ο½₯ォ\0?0??οΎ‰ο½―,?j*).?9K。ァ。?リ?庁棚ι»Ήο½Έ??<*゚.θ²Ώ]}ワ0匸ソ&W\\ι‚„??ζ‰ž)72ο½½θ©(rハ?E?)b|qC<菘#ε£•οΎžο½±}ο½?c!clM?4u=??L璩机。?p3?ネヲ恍$jο½§ο½’ifGοΎŽιŽšοΎ–ο½«o\r|ο½²ZοΎ•οΎ“4?ャ-ャ硡Y}οΎ„ηΈ¦ ζ£’*οΎ•$δΈΌοΌ§1?*ο½»οΎ€n?*ッゥ?#S+ο½?{o:ャム Llη£”?*οΎŠοΎœΡ†Q?\0???敦o獻乘スォュ?諑ンζ«U\"el$ο½±ηΈ·ヘヌ写/レャvθ²Ώ%粍?zε•Ύο½―。VgJο½­ζ­―?ο½ΆοΎ‰^?2ο½Ύ?毘?οΎ›k?οΎ†aη­–40ヲXηΈ²trο½£aIQゥ7δΏXοΎ…FοΎˆοΎ–z\Z孝ァ?nマzゲο½₯rスハε₯ホ?*ο½ͺο½ͺο½Ώ?οΎ•U|??_>~z?母゙7Q瀦メ?5<\\?。)sο½°ο½·rqοΎ–_?οΎ–\"AVο½Όrε €?${\0/uGοΎ•ο½£οΎ“οΎŸKliο½Όο½ͺ?ユ。ア虫ゥ?Hζ˜ƒ*2pο½±/6D?4θ›Έィd?珸}?ι–‘F9οΎ„?ο½Ύ>ハッ??>|?\0藐?齏rο½ͺッハッ???οΎ”ォOGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG\\ο½£?οΎ‚~???\0軆?甦翕シyO ??>>?非?>畍」」」」ο½}oOο½Ή~ハ??\0H? ??\"*|*/醋#ο½Ώ?οΎ‡?Sο½£ο½£ο½―w?ο½Ή?ι€Žο½‘膂 ηΏ©??-_οΎ‡?S?\0ζ»‚?ι…ŠuοΎŠοΎˆθ—UT?ο½’5ィ??(θ‘£?οΎ‡GGF銷?|?ο½Ώo??>::睹sο½ΏοΎ”ο½ΏζΈ‰\"\"\"~WοΎ‚5θ›ž\"\'οΎ‡ηΎ‚ο½ͺο½Ύο½·?\"\'?ttuθΉ GGGGGG_?οΎ™?リ??\0JFIF\0\0H\0H\0\0??\0Exif\0\0MM\0*\0\0\0\0\0\0\0\0\0?οΎ›\0C\0?οΎ›\0C?οΎ€\0\0x\0?\"\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n ?οΎ„\07\0\0\0\0\0! 1\"\nAQ$2a?q#B贈ιŽοΎ‘?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\05\0\0\0\0\0\0!\"1A#2Qa3?$qο½±?CRb???レ\0 \0\0?\0οΎ—?\0οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ—ο½ΌPャ賀FH?\0l~幌?οΎ‹?οΎžοΎ›οΎšοΎ…sι€€=Jォ\'ηΏ’Z?ンNοΎ‡テ。?\Z?Z]ο½₯_3ギク∞οΎŒζ•ˆ u困キャ帯1MοΎ…gbο½­^ノィ郒 *チ*\r?9ο½’ι‚ͺワヲ@}οΎ€?ι…²\0ζΏ€?^3*ォ3ο½ͺ?O?~゚>H?\0οΎ‡οΎ‡?A#ι΅™_|y_屍ο½ͺ\"y?7οΎ‡οΎ‡?OοΎ—θ‚…ο½?ο½»οΎ“?οΎ”z?Es??ι₯•οΎˆ?/οΎ‡οΎŒk?~U:οΎ™Kレソ??>xzοΎ–ο½€?οΎ‘r?{p&ο½­δΈΈ }οΎ”\\)οΎƒο½°?$フj?mοΎ‹οΎˆο½€ ゚#ο½’Y?ーチンo7$ハ??.οΎ‘ο½ΎεŸ’ο½¬οΎšΒ’η—ΏοΎ{]οΎ‹οΎŸθˆŸu」エ:ァ希77\"Uミ#垈}?k+R4耋?鎬>B_T!Fハ\Z>Xι€ž%hdf(。靄+エO7i??`興ン?b卒\r側η˜οΎž#,wοΎ›_&co,οΎ–ηΎ€,?l<GPハdοΎ…ε‰–W?1?\"t\\\'゚N7?HοΎ—g?+οΎ†ο½½οΎžη›†ζƒšο½»ο½ΆU_K]?%O*ε—£ο½½\nε’½kε£ΌOK圻Uο½²η—Ώ^ο½₯ε·₯ク筐Gゥ#tォ-ヲN mζ­€ι½£\\Mt息疆_ ??ο½’ο½’n執?恭ι£’YE働ー搗?ζ”»%ο½½Xε­±?a+ャ3@? DοΎžοΎ’οΎ˜>F~ζŸ†T^ヒqYO2\"ο½ΆοΎ•οΎ”?ソメ佑?エ?r訓釢gοΎ—?\nIaiミヌ)?\nWFοΎ…H?(?月eVι€½?ζ†Ύ?憧jWο½₯Yε§ͺャ?ο½½xι–’?ο½±5οΎ€?##?0?\0H$.οΎ™?KοΎƒ 。k???X?;??ο½Έ\rwε–‰-?7.οΎƒ?οΎ„?。8s 2οΎ€X?fォU?οΎ—C*\"ο½§ι«­cοΎœοΎ—3θ„£==Hο½Ώ?)οΎ—?゚*孝?|ο½£ο½Ύ[?ο½Ύ^セ。?E??粟Wο½­οΎ„|?δΉ—fヲkζ”΄=?X\"XXοΎ–οΎšθ±’\\_ bο½°?\ZQο½€ι…˜ο½²ε˜‰ c]rο½§οΎ•ο½ΎοΎ€gAmd?,ャ?-ο½ΉοΎ—?>η΄―οΎ‰VOζ‰ˆwリ0ε­€οΎ†οΎ”vο½·οΎ‹?ο½’LιŽ°β–³οΎšIゆuοΎ•g-+f?鬘?Dι°―e#ミ$ζ“ΎgDebο½―?οΎƒd\ZHδ»Ά?)%ε€™T ?ο½£?,\n橒ワr?6?P?X? ?ζ΄»η”Ίi,エ剳ノNl?Qο½Ό*ο½»K G\0ゥA;k wο½₯}+??ο½’???ιΌ‘ι…Š?\0οΎ›ο½ο½½eォン銜漿-?ο½Ίθ†€οΎˆ?#ンNT$怐ク倐テ;?A?y?% ο½₯菜οΎ‡οΎ‰?IZIセミ。メK\Zャ从rWr?8?ー壜3゙f却リ?\rヲgMLtnV<{J拒チ8T?V????δΊ•?ο½₯f 鯑。 。薐AIcd\'oο½Ίο½±]?e?ο½ΏΟ†ο½­;η“Ά-ε”οΎ…b\0?οΎ•ε₯‡?゚?6?\nο½Ί??ο½Άι°•G]゙?゚ 耆Zォ?ハ?埜;ハ|?。|9η‚Ί*#η’§οΎ—Nο½ΎG??\0ι›„=z1ィセッ?\nη‹—οΎοΎŠο½’\"?ニ。?*??ハ??ハ\'?\'GCQε·»οΎŸζŽ’ο½ͺ??\"xDj9ο½Ύ|/ο½₯Uο½Ύε·΄#?}Jゥ鑠サ>ヘ{?ο½Ώδ½Ώο½£η‡»οΎ˜8οΎšοΎ›η”Ÿ?C%`ミ3?3クハGγƒ±ο½§οΎ›ιš—_οΎ’?9οΎ‘゙Hーー刳?\Z? 萒$)゚M??>}Lο½»ε―Ύv?u\r?-ス芬Bο½Έl??R!杓[ヲアδ»•\rθ‰?εœ–d?ロィ蔽イGO*οΎ…ο½ΆοΎ‹ο½°ε₯¨οΎŸl?\0Mq?>οΎ›3#γ‚ˆG恟ハ6a?Bθk\Z3o?ャ倏Cη‚ŽFοΎ•θ–‘?:δΊ€ο½ͺqタ\"%?&?6$ ??\0}セヌ鍄oοΎ”X?)ο½Ώ?ο½³oο½§?fW道セ寺コζŠ?+ \rο½Ύο½ͺο½­οΎ–?οΎ‡Oζ­³?*οΎ„ぼY$o講Zο½€ο½³??!EF?2 οΎ–ο½­=θ—·(??ο½ιˆ·uR?6uη›’qο½€?モス式卦{ο½Ώlη­¬_*KL?ο½’/ο½°ο½»ο½Ή?!?caζ…Š%昿??εˆ‡θˆŠοΎ‘οΎ‚ι‚΅I%Iスィd?ホ{]\Z#YοΎ’Ukr+ο½­ ミ^οΎ’SQUユチmxAヲWΒ§\n?!免K卩w`排XリPοΎ‚Πο½Ί#ζΏ 5漏=οΎ‰Xο½ΉTb。゚GζΈ¦?<\Z7εΆŒο½²ο½²οΎ„?ワ颴チ ?7チヨ?,@!1ο½³LK?ミI&&?ο½€δΏ£?8?8#1>7=T47rRVY^οΎ—?6οΎ„$3(qマW?8?q゙P?οΎ›DExοΎ€1^ι†―#壑Q粂ナs晝ι¨??Sdヘηͺ©?ηΆ΄ ヲ刊3h=ο½₯?@β€˜ο½¨ο½°δΉ™jfο½³$V?RVο½­|οΎ•οΎ„η₯’凋?εΏ  韜レッ%?[L6xz醫Mヘs?uヲ$x2ο½³?\"\0?!cοΎ•Q?$θ–¦?5逊VワャウD\n?k Ρ‚%ン0ο½ΎTθŒ‰ο½½οΎ…οΎ@?θ“ォスン??Mο½¨οΎ–ζšΌο½‘{ζ‰ο½£οΎŒ{?:ο½Ήィο½ͺ[οΎ˜οΎ‡ο½³ο½΅ε‹ΊF?[b?#BοΎ›+倜q}=οΎ‰\\エ?&D?&ο½­fIg1,MjZqB敍X?%リ巽YQkXT?ζ½Ίι―’^!ャu。8+δ½»rIjャK[ο½Ήiフ n{&4iο½’?8j。泌务踈シーH黎y\Z?ラチ譛\'4οΎžη‚Έbο½Ύ?ο½εΉΉο½₯ο½».ο½·%。ο½₯ο½»H)@~ζΏ :ο½Ίθ³ͺE[AJHBD8WοΎ’οΎšCX!XοΎ—οΎ‰ GΠΊ3οΎ™ο½―rοΎ…? 5?摜?\0οΌ¨t\\?eζ”Έ2pζ¨Ί+,?瀺エkrn(eOZοΎƒο½’d\"ζ°Έ??q#ネTοΎ‹οΎ‡?2W?\r「`キ。?\0 ο½Έ?(ο½ΌDζ„ΏJJ4]w\0V珞>?#θ„―)g*η–Ό?.噴監:οΎ‰@y&>]ィ(sワyFa睇GZ\0οΎ‹izMゥ゙,+ォοΎ“ο½±IQJgο½°Qο½€M\rヘy#轟c\n??zΟ‡mE」q|M{οΎ›KrL];δΊ‚qο½Ά5?エ??\Z。?I$識6hβ”°Yο½―?t遘?]dd\'軍\\rοΎ—\\ュィr6ekヲ?$qq恨0θ±ΉοΎ›wο½₯UοΎ™ο½€E*フ8ο½Ήcε’’οΎ‹y\0テ。^zοΎ—dy\"ο½½οΎ–fSEG_οΎˆοΎ’BaQ?KLο½£οΎ—ο½ͺο½­ζ™3οΎ‹(RοΎ•Nζœ•?H?ο½°ο½Ή=OοΎšοΎ”ο½»οΎι»Žq?οΎƒοΎ…!ζ£§εΎ΄θŠ½οΎ’?\ZοΎ’??`。E?ο½³V?#{2δΊ­??\n?ヘ羌3ャihο½₯ε‹§nトエ????ο½³ο½³\rοΎ—ζ§Œε­³οΎ˜βˆ½οΎšο½€vHエZ{~N?5ζˆͺ?hン?\0FEdοΎ’οΎŒοΎŸ?ネN恙??ワ????οΎ‰?CI蕉鬣ロァヤCθ³ͺ遜ηž₯ηΈ’W。。qユdο½Ή@j?0οΎ…Ξ₯οΎ’ο½²E概sθ€ͺθ‘¬οΎ”οΎšη™’ε‡„ο½‘ο½°οΎ™ )*ο½€iεˆ†m0』?οΎ“L?H\0οΎ”οΎ‘ε ‚οΎž@>\\?OMチ冲臠耂?ャ?L=οΎŒοΎ†?ネ\rο½·? yリ!?:οΎ”ο½·???=?ο½½~ネ?蚣リ?ο½§#フエc=Vθ•ͺ址ャ`蒂烹;ο½²η₯οΎ‚?\0ζ…“%ο½€ι ‘qヲ? リ2?\ZοΎ—xo翊y?ネ?\0?ο½»?#Z萱|?ο½§ο½§οΎ‡??輟レSWl1\\γ‚²m謄蝙<ο½³ミ?5キヘ6?GD遇vォθ‹“??蚫g?οΌ₯HDnぴX危\\潁}??οΎ’.?;HοΎƒMοΎ™?$X?i[1vヨスソ鴃秀Dマレ石?゙ホD?ζ–›β™―Dk%οΎŠοΎ›οΎ‰4?ε·½εš’οΎ‚X?(ゥ;ζš—\0θ…†?c ?οΎ“οΎšwMヒャ介GζΎ±zοΎ‰οΎ‡οΎš,Zζ‡Ώ3οΎ™?+οΎ‰οΎšVο½±<;ηˆοΎ…\rチοΎ‚5dlεŒ@lVz:?ζ§ΏοΎ•?οΎ•oΠ₯ο½½ο½―E?史*?マ?οΎ•Us\nο½ͺゥ遽>ο½Ύl?:::::::T??9 ζ·ΉKοΎ‚οΎœO?;]οΎ‰<岫ァネ?3ユミ:R?ο½­ι™°οΎ‡?οΎ„zοΎ€,\n?ο½°%??Mε‘ΆοΎ€<ο½?2壕ゥ蕾οΎ‹?(ε₯=Kι€ ?ο½’\"\"?ヒ醋#モヌマεο½Ί?洫ヘ6G7ο½―?rο½Ύn。6οΎ–ο½Όmレ?ン?Uラチ οΎœο½‘οΎ‰1ο½ΆgGxοΎ’cοΎ‹g,\\;θΊ™?sοΎ… ?6l?)/Oロ杭かi\n彩?}θ—·?l $ο½ΏZフ「F,]7ο½±)\0ο½±B7P マ痍舢]?7οΎŽοΎƒοΎ†ιš¨ο½€???\0N~.?vε°…?<8θŠ™rοΎθš“^ο½»?9e階\rマ#\0ソゥEZoqト)fHdζΌ‚\ZIο½Ό 0ミIo ホキキイ4ゥοΎ’XO卒ri%8I?\"Gδ½°mォθ„‚$$勍lム。?メ。?$Hο½z+οΎœθ—\"?Xr0οΎ‚ζƒŸfε·–ο½½6\nリ\r?οΎŠοΎ‰,?\r?οΎ‚*砒ヘ?θ‘Ώtqノ靑??゙fη©€{ォィ&ο½²yl$ ο½£?2ο½°FVο½±\\ムヘοΎ‘οΎ€q マ|QοΎ‚???,?%ε‹ΉοΎ›οΌ—IοΎ—ηΎŒοΎ†?,チ&$?vX笂?!@;lN?ζ ©P裕@#ο½‘ι€‹ε‘˜ζ€Ž \r?#οΎ’\"ww?e lι¦₯;APΞ»ζ₯<ο½Ό?ο½Ήι€”ο½©θŒ¨ο½°?\06?0??R5??;$颏\Zο½ͺθ‹Ί!οΎ‹?θ†ˆοΎ…ο½½ι½’θ‹ž詫チケ&フkl,。ο½,7識$i\Z??ζ€ΉGι΄»<ャ2ο½½?οΎ—ο½­^?^゚xοΎ‹θΏ©ο½Ό]οΎŒοΎοΎŽθ‚­y\Z?Y.2怏氾蕭Pu澎gS=Eク燻A笏4O火曾チZDs/ο½’Wο½Ή?-「ヘ:ζ°Έ7?;?rM圦?!豎ャο½₯εΈ―H)?!ο½ΊJ#(ヲdεΊ—4?lゥ??\nxοΎžο½Άζ”…εΌο½±οΎ‡c%θ—· アマ撒Y*Qエ?DH&ο½³?3摍U%?ο½οΎœ?ο½·?#ο½―zXο½§ζ’Ή:?5Xο½₯ο½Ίο½Ά%YnD?7昢Lο½§exο½£n?フWη΄‹yθ₯d?οΎ†?_ο½°ο½»η«‘I?8?冲:*マ諱LBVο½­ }dSDネ_ οΎ—οΎ‘ο½½οΎ—ο½Ά$θ‘¬ο½±ζ‘ŸοΎƒ\"9θšοΎ•?QοΎ‰? οΎ•ZΠ‘jチォ徘ι‘³X*οΎ‡\0伏\"g湍zCο½£ε­€οΎ„ο½€ε€Άζ’­-?οΎ•oο½­οΎŒη°‡3,δΏΈc xyο½€I噐EdN?X鞍οΎ‡οΎ…?P静ノン;ο½³εΆEοΎ”?ο½·y οΎ—X$urフ?&フP,ホK?莡?\':Vο½³9皐89G;Yο½°οΎ„??Jワ渣bdミqン?A4ο½²\Z?*οΎ‘H0ο½―ο½ͺ?J+芍\r?$,ε‹ž|?ο½―4?M-?δΊ°?ο½Ίο½½d?リ9ο½ΉJ3\0?\"ネ?8l .P゚gPοΎ„οΎ’H{ニ卒セ( {゚$οΎˆοΎ—ζ”»H~芝Fο½ͺο½Έ.οΎ‰ =ο½₯οΎ€οΎŽο½¦οΎ–\\οΎ“οΎ—k?-盍ー聴9^鍄チJζ²?\0ο½³η²Ύ?l&$οΎ‹οΎ“-&θΏΉο½Άヘa訓CοΎ†-?1mJ?;AレC?Π‘+ο½€)oォ]mVnhθ’’οΎ†+釦Exο½Ύ aοΎšζΌ¬οΎ‰In)#ヲ籍?οΎ…οΎ‰?!<5θœ₯7jqヘe唳q* ヲJ? iοΎ›$ulοΎ“Kη©΄ο½Όο½±Xο½Ή%ζ€±θΏ½?e梓モャmοΎ–:Dpο½Έβ™‚οΎ™WieD朷Yィヒノ`n3P簍セメT品SvοΎ‚h。$θͺ₯ハ「\"W?ζ„Ώz?x?;YeοΎ‰\Zォユο½kl]?g\'イハs??OοΎ‹|ハ9ォh?Gο½₯ゥοΎ™??ο½Ά?? セ吋灼\nQ\'エ]nεŸοΎ–tο½³?,2JοΎ”Wwヘチjy?/οΎ‡1?(eワ _3grュ剩aCο½£.οΎ‚οΎ€ο½©οΎ˜y-η›΄{Aiチ?οΎ›Xο½³鍼Aθ‡Ί\r??δΊ«6ο½₯??pοΎ™οΎŒο½«iο½Ά?mι‹²*E}L θΈͺοΎ™UPVι™Ÿο½΄\"!Dο½Ήο½Ά\0?\n0XοΎ‰ο½’EsηΈ’HοΎ‰^ο½²=η©°BοΎ…c?ミEο½Ύ。ロ0[?.ヘャ}ζ„ΌοΎ“ι›«ηΎ―#エ?;2ネHe荘l$(]iZ;輝?\'η™Ύ)5XmW?lοΎ•ο½Ώ*g本0フbwθ‡₯?8f\rハ>?,トィ?5οΎ–?g?ε‰ͺ?:;ζŸ―ζƒ‘[\\?οΎŽθ…rWm{[9?(?2?占8?c?nοΎ“ι™Ί=ィ`セCNィe5萼K%イネリq?ィ孝?。=Iι§’ε₯‰οΎ•G9?b?゚?*ο½ͺ5~Uzレg??/ィキk?οΎ™ο½’οΎ€.ζ±³?w<芹G\'X=+?θ³£οΎ•-vε½Ό>?x螫οΎ›ζ½”Xォコリq? ?=r?ο½°ε–\Zο½·.ォOヲ。>rリ2kο½­ο½ͺフ*セミa?Bο½± 刧03!ャ?οΎ…?7ι«。イCVο½Ύε…‰rο½­~[Cη¨Ώjォメ&\\P?!?ο½²N?=οΎ‘*ネ???0m? m*0ワ軒温>ο½―IN?ο½°VYuο½³Wg?*rV?οΎ”? ε§«S-c?<οΎ›P3ι €5-.rοΎ”?H].qイワc??垠*h0?ン?Yo?η­‹?gο½ͺ魎?οΎ•?θ•Ύε₯ͺδ½Ώ}醴コミヌ?6οΎ…\\リhοΎ‡ζ£ g9e?5?Bチiο½°ε‹…οΎ”2οΎ“?|H=tヘ4qf\r\n?レlN? ?!ζˆ–ο½Ίζ’—\Zο½­/οΎ“οΎ‰I,ο½’οΎ˜θ³›pCοΎ‚οΎ„Jο½²V1?2?<;7ア∽g?rMZ?ο½―dヘ~H即θ›Ήο½€\\PH??2ο½³rοΎ…οΎ—nO?U戌Rk7}?ο½«ζ†ο½Άζ‚’οΎŽο½€η΄Ώθ‘†[F^οΎŸηš΄ι‘ οΎ‰9jゥ4W6 Kο½ΏοΎœοΎ™V〆剱9ーハ*ランhM0ο½³οΎ‹6}ォe4wοΎ‚uο½½ο½Ίn??9 {cοΎƒqοΎ„ο½£Aο½ͺミンケシウ伏ト?~ο½’C?(\rィk?ヘu?οΎ‹?yホU?\"F ?C\rCε‚‘οΎ–哨?οΎƒι­ŽRUοΎ•K]Aο½‘ο½ΌιŠƒANCエ喙ォRοΎ†dAοΎ‡οΎ“\\οΎŠοΎ‚46οΎ€οΎƒ郁?5\rIJοΎ‰?iチィ4?4ο½―XοΎ€Qο½±ο½ͺl8?Wο½’θ…ΈYZチV3W却メWζ·‘dv}οΎ‡aBpο½±Ys?οΎ‹ζ΄™ο½£^ハZ挟?(zοΎ•eο½ͺθœšοΎ–/??Lマ ?θ•Šο½¬ζ‰‡?b?\ZοΎ€?\Z|?ι‘΄qη²²??q?&ο½ΈJο½»ゥ?>Kャr?ζ‹Ά\"\"\'披?y\"οΎ‰ δ½―ιΉΉ??mネぺ%.rο½ΊネイフGmο½­ο½Όε―›bοΎ…ンGS\\οΎ›ζŸ”οΎ•C?Fヘ痲,οΎŒζ›Ύ<ο½ͺワHlη‘―εrt<_ι ’ο½€S篁οΎ™?οΎ‹ο½Έο½­ο½³βˆ‚Vホ蜜?)r\0?\nοΎŽοΎ‘?οΎ‰b?,?οΎ‡??ζ€™οΎŸοΎ‰εΎ©]SuKsフ?ζ¨’ε‘’k ?)q?4?G?0yΞ£&ζΏ‘[FH??\0οΎ•\"sι―”ζ Ήο½±C?ヘレ?\0οΎ’ο½Ίο½Έsο½§ο½ͺηΎ†οΎη½΅ΠšbοΎ•(#ο½½6Aォヒ%xι£½ο½­?h$w\nL?}ハ/-?5οΎ“Dzζ›œοΎ˜οΎŽοΎ›ο½Ώ^ZI\\ι‰’eャVJ1Nミヘ+iャQ? J$ο½³ο½Έdη­ο½§ο½¦οΎοΎŠ|yGο½Ίθ–‡bοΎ‚?\0-溺セ萓Lネ? ε―€lο½­?ヘο½₯ε―©^<睛_-ο½°リh迚οΎ‡WοΎ„b?t%? ?δ»–??鐢キネq? \\?em?ャ?KoWシホチ}cAv ο½£?3?!エヲC ゚tοΎ™ ー常レォ#οΎ“ο½§-ンッp?\"_rο½·%XD8E?1ηœ₯ュ幌TiPVNοΎ‹?フ!οΎ‰!οΎ•?Ia\n[靨&Llη₯·οΎ™\":)Π³=フ?η„”ο½³?;N???+P-gwQMUοΎœοΎ‡ο½Άο½ΈXテャdサゥヒ\\8ミスb\ZAyο½―Btと?2ο½­οΌ΅PοΎƒ ο½±Dフ?6m?,n\n?η‡%ΞΊK#ο½ΆοΎ—ο½§0ZrF(ャロ-??\"責?*?フーハ/ヒrィ?R1E8ο½’O?ο½»s]/dζ’Ό?/2GyοΎƒ?7颚h??恬??hοΎ‰bE4H5Xο½Ώn:76\".??8???.οΎ—1レO)jD|ο½ΏPUο½»bNοΎ„vο½r9dη―‰ο½±οΎ‹3οΎ”w??nο½±?q`b7?頀鎌mK小8η΅–xyォチ 翌ウ=c\Zο½―pャBrW?jοΎ„<ο½―ι…©ι£›?N?/ォツ?οΎ‚\"\'謬DETDoゥU|\"\'η²§οΎ‚?ζ²»Dlv?\0Nο½―?TjlIゥ8;舩EΠ«%?#<#?0?昨ο½ͺζΌ’??ο½’ο½§οΎ‚ο½§?イ凧W?E?5ENθ‹£\0jgο½°IοΎ„οΌ¦?ο½°vN3ン0?,##ο½½lzοΎ‰bV9ゥ?-οΎ…qゥ???\0レァ??\0ζ­―n\'θš“Oh\"ο½½οΎŽζ›°?\0ο½ΆhοΎ‰yセンモFア。ォθ₯·\"H゚(θ†‚οΎš?ζΈ¬ε–š?IοΎ„ιž‹{ン? 産?トヲjθ…Ώ1οΎ•οΎŠζΏ†?η΄²YοΎ›?bοΎŽοΎ›ο½ΆοΎ„4οΎ‹ζ˜”KJ9ο½ͺcο½€ο½²DEδΏΎ?οΎ‰rエqネ#<ネ7, ο½§ζ…ΆbK瞬ソXζ­’)??)kο½­?Cy\nο½ΉC\Z*Z3ο½²εˆΆο½¨ο½²οΎ›οΎšεΎ‘?マ.?チヒ2rエvη€§ε»·ε‡ͺ*\0cL.??莨?3Sq?xM燧?゚bゥ)?ο½₯οΎ‡6bUο½­ηΊœοΎ†? ο½Ή}エ艝サ「 gJtLH44?X\"?ヲxリ??Hο½­ο½ͺθ†ˆ~ε£™[0ο½ΆιΌ ζ€₯パ?οΎ–A\\%フV?=e\rζ‚§Iaο½€ヒう Fη΅žοΎžοΎ€οΎ‹ζŽ§?Dεš€mο½»d聳?+エケη’ζΎΉ?NοΎ–οΎ›サヘツqフ=οΎ€οΎŸοΎ•οΎ˜η€ͺ- οΎ’yd>ネ~οΎŽθ±Έζ¨…[\Zレdο½€?οΌˆζΏ†η™¨οΎ–\n?\r9ヲ?%v&[?οΎ‹ζΉ―R??7?ゥ@ο½²\Zャ?οΎ’\"%牙現*?οΎ†^?タ槝? B$H?(?οΎ—ο½·$ο½±?;E2呞%οΎ™ο½½οΎ„n7=5ネー.ス裄9ο½³?ζΌΈθ‡Ύt覓]kοΎ‰η΄οΎœjο½Ή?ロかウyb%W?Aο½§.ツミrοΎοΎŒοΎ’ο½―ο½ΊοΎ‹$ο½²οΎ‘?7]ε€²?タマコ?1ζ₯’s\n?cpο½½ο½Ίfャsε…ͺ/m.θŸ‡ο½³ο½§θ¬n.ζ₯·ο½Ά+fι·‚nセレ?\0?ヲs.\n2<\n?3\'∽ホ??T揄ヒ?h??Wο½οΎ“.?ワZTウ`マ nAοΎ‹ο½Ά4ο½£\"οΎ€οΎšοΎοΎ’Wζ‹EhοΎ–?;H\'q倅痂。?p?5q?;γƒœtミZv翊ミ?ゥエラ9ォq3οΎ™zθΉ„ηΆ΄?T:?フU?ZリdeζΈ©6蜷q JDοΎ…Kゥラ2οΎƒζš¦οΎ—ηΈ«η tォエーノM_^Icx)ゥU?ο½Ήyネ ο½·jJζ–ŸοΎ”Ndζ‡Έ?>ε…Έ_ィnο½­8R{圧ヘ ιŒ†$?οΎ—ι­ο½°?b????ο½§οΎ”cεž‚οΎη‘•k$? 5\r/ミ゙XQjマ8%θ²§ο½³EοΎˆδΊ¦οΎ€v?a\n?οΎ›?9求モW+?\"x?リ@?,ο½?g#οΎ•R?\nJaナャウZKKο½’ι– ?*ο½Ώο½Ή*οΎŽοΎ’οΎ˜{/M}pε‘ηˆ›ο½»ο½ͺο½Όο½½ο½·ο½Ά%lepοΎ„?+gH:}Yο½½gοΎ„u\Z^゚?:,ヘヌ,\Z?οΎ‹?ワr?οΎ„ζˆ²ο½·οΎο½€?ο½Ύο½Ώ?5?ゥ5e ?rvhο½’I? ?γ‚‚?.レ?ォ?|ζ΅™η½§οΎ™ds?bk?εΉ’Kο½§θŠ’v?&??\0οΎ“\\jο½»)CZ&}牆? η―·-Eο½»οΎ†γœd??ο½Ίζ₯”X叙>厭瘟r\Z#?3-ζ‚ŸZモ謇F゚?コ躍モacοΎ”I凋iο½’|?ιŒ¨θ…‘?9ε‹˜ε­£?+ο½Έο½ΆYο½₯゙Qhs{ηšΏο½¬οΎ…οΎ‰rsgο½§ο½Ά0?ζ΅Έlο½°gネοΎƒο½’6`ハリ\\kQ草8Rャ?!:WQセゥ?7οΎ’ζ¨Ÿο½ΊοΎ‹?ο½Ή!K?? ?ο½²ο½½!|ィ鍄r!フ\Zο½½}οΎ‡ (?ο½ΉYε΅Œζ€„θ—οΎ›θ·³\0ゥ@Y貞A\'z6R?οΎ–/モヘ\Z4ャ川?##{Mε¬Ύο½ΊKοΎ“?$qXο½Ύ?/=xjXD]?サハ」?η΅?參T^Qニヲ>エ?=~|D?\'謬DUWxO>|ォハァ?U?ιŸ‹zx_??\0?IοΎ›οΎ‡??P?ο½Έ?\0?コ鰊(θ–€??ο½―?ιΌˆε–°ο½©ι…©?~:罐?熕pv?ο½·?uSッ「ーャ> Ipヲ:O5ζ˜‚JοΎ—ο½€ο½­Tj3οΎ‘?$j/qZャT?ο½ͺ゚OοΎ‡O?yX?η§‹οΎŸο½Άο½ΎοΎš\Z[ο½Έο½’S捻トKι­…~οΎ’S]?\'?\'??I}οΎ™οΎ˜οΎ„θ³ŠFο½±<οΎ‘U>????\0hο½½zο½²G。=Hο½ͺδΈ”?Jο½±=/o?+<|?οΎƒο½Ό||?? ο½½οΎ“οΎš?#ヲ??efZο½Άο½«οΎ™ζŸ±ο½¬οΎJθ»›Dnン壻丢Tο½ͺ;#エMοΎ…οΎ“fU#AζΈΎδ½»ERjラqA3οΎ‚?u#_ο½ͺォヘx螺_センユ?0WVeo?>旁?!Cン!i?ο½―?#ο½Ύ~n???eοΎ‰?0??%?=?ε†ΆEjE+ヲWF#θƒ―U!|テエzn>毘ζ±9ヺネ?ゥ?c5\"猢\r]?仝糟?CワDθ€‡ηš‡:\n纂繦ャrηΆ’?゚?1?s?ネ7ο½ο½?&?ツ伝鉄?ε₯§KqKζ–­οΎ›?递ォc?。,? *E2οΎ„οΎ‰%??<7οΎ•\\οΎ‘οΎˆe\\?+?οΎ‘erοΎ‹>N\r<ο½€οΎ•ο½²οΎ†ο½£[Cv?6SN?ο½­P 逐?η•°??0\Z?\0Oθ’‘[9K?=οΎ™f?mDοΎ‹^#;?ζ˜”οΎ’?$ζŒ‡pο½ͺ_?ο½’Kθ„Š:? \\dBHaHθ±Ήο½°*ο½―w┣ーュ?θ–¦!Sε‹ ο½±ο½Έο½½ο½ΎοΎ‡@ ?kοΎ‚65TοΎ•οΎ‰ n~{Yー。[ 3ζΏƒm|?壘?F?\0ε„•Eο½°&ο½₯=ζΈ¬\\?N#)エヘ瑼8\'_[゙VO+励?#?w%s?ο½½?ン。?ο½€?θͺ˜-゙エBチ ο½ΊοΎˆε±‹ζ©KE \0ε’¨??-?リ\r?ι©’οΎ€&ο½³XοΎ‰r膨ャ」ロ[<チ櫺#Yη•₯;>}?οΎƒ:商?οΎ› ?7??\"F>U????;?i予^+4\rホ秘4r8\\゙6?ο½³U!οΎ“οΎ‹_ο½₯ο½»m\rォ%ソエ\\ο½½η°Ώ\\ο½±bqXοΎ‹lrKZq氓擑ヲ?eοΎ‡ο½³-j?リ?0wZ+οΎ…)8聒?θ³€ο½²?&w?^η”˜628ュq2ο½½?!N?3ο½³JR!&?b.?\"zε™΄?0b?ο½£?οΎ™?哉θ˜‚ο½₯ゥ缺οΎ„ζ±Ύ?rοΎ–\0mエチ?7\"XοΎ•:ャο½ͺワT?*sWOaζ¨—οΎ™H?璍3吼テdvη”‘οΎž?97?rdο½ΉB?/(?4mοΎ‘?7?3X]゚$οΎ™<7dο½Έο½©οΎ“ζŒ―ζ§½g?5`臓<&1 Yο½£ι¨’ο½Ή+οΎ‰S?)o+x_ζ’²x?ヲ皸[\ZA-4SοΎ’?^「橦〃?;?:+\Z?|δΏ~h4οΎ“+,\'??C+スレwη΅›οΎ‚<レヲι ƒ?οΎ—c?tο½ΈKh?qix゚Mg?ι¬ΌY ?。イッ\'リクッォォο½ο½³?\0cK?;xοΎ‰!?ο½²P゙棯T?ο½―zqη₯¨ο½Ά+チ?4ο½£yヨタャ?\ZGe\\e0!ンツょPγƒΌjο½ͺ4vο½±?gク姆-?/pο½Ά#,οΎ‚?<「ホ6*#?Kο½―+?hンチワ?~ο½»ο½­οΎ‚οΎ“θ©οΎˆ?3。XH?xο½²οΎ“}TヲTιΊΎο½­οΎ•ζˆ―[T2[οΎ†ο½³]οΎ”5?bワ+リ?θ„±\'θΌ©CζŸ»ο½¦οΎ›οΎ‡ο½Ίε†…p{N>^AοΎ‘a)uV:ハο½ͺο½­<舡QοΎ‡εΏ€*コ悛ッャ?レ?,レiο½ͺ*\'H\\ζΏ‚$k゚エミpθ₯¦οΎž;??? ?yο½Ώο½Ή?ヌ釐q?#οΎ…οΎ•\"ο½ΈeοΎ“G!エ%D?/?ο½£?x1ζšUg]{M廝レ菷j*ζ’¦mε©ͺ$oθΎΏIp$Π‘,θ‚’ο½Ό?偬1ο½€ο½Έ?!?_4ο½ͺ?ZοΎŽοΎ–η·¬ηΎˆοΎš)h??$Dο½Άο½ͺοΎŠοΎ“+yοΎ‘οΎˆ $ο½­ο½³%ιΌ‘I3EZX憧οΎ„ο½²οΎ€?hοΎ–ο½₯[VチYフイglv?w+!ゥhο½₯ι³₯)ウチ?#pvvリ?fEUTU_?Q|x?ο½ͺ?摎USハ?os\"xT??\'?Q???οΎοΎŽοΎ„?済??ソ床?|?\' ?;゚???ο½£ο½£ο½£ο½―:::?S??\0I???οΎ‡\\tttuンッsQZ萱Zθ–€kWハキマ?>Qο½Ί?οΎ‚?E?;{???|??#]蛬~Wハ/?\'ゥ゙?/?7ハ?:??>FοΎ‡οΎˆ\0?」ォロ5ο½ΎοΎ™e?οΎ’ζ‹Ύd!uゥ4A囃xヌ革アウイο½§Y!遠5ο½­l簑レο½??jtャロ?1ノ要?I?\ZォM圻\Zι­…G暾ワ??@蝢?zr?e\"ンο½―5ΠΈε¬°F5A.δΈ™ο½’ο½ͺ\'城?\'??οΎŸοΎ›ο½οΎ‰#εΈ™οΎ‡???ャ??οΎ“??οΎŠο½§οΎ‚?ο½°?+賊]?vワuθ‹Ÿ&hRοΎ„?~><&?οΎ‰οΎœN +?\0リ:??>/eοΎ–Yιž…θ„±R??9C?οΎ“?>wBοΎ…?AK\'n]??[CοΎ„οΎ™lx\\YοΎƒGCο½­ο½°ο½Ά?aο½²*ホウIο½ΏaοΎ•\r ιΊ‘ζΊθ΅­?=?(1οΎ“Azt?1(οΎ“οΎ™YLEοΎ‰οΎˆP?゙ο½ͺο½ΎaοΎŠο½¨ηΉ»ο½΅οΎ–οΎ€?6ネ_]コ贊?ο½²οΎ™ιŸ‹*6 ズ抻务恙~゙ク?\'οΎ‘Pη¦?R?65偏濠虧睿Es們~οΎ•EOワ靼ο½?サミヤ_(οΎ”D?οΎ’οΎ„?οΎ–9?η«œοΎƒ\\吟マ妊?D?廟*ο½ΎUUUιͺο½½οΎ”? gK\r\rδΎ­ZdV?η†ŠP,QネyK?mGzcワ?;?.舩N\"?ο½ͺ=ghο½Έ/jI8sw?+1?2搗YοΎ‹?]非?(.゙?ο½Ώ位フ?%\\遍?::FNn??\0ο½°οΎ“ζΆ›4c?,R\nοΎ™GXο½½η§•$アフ?cTIF)ο½{_ヘ?6ο½ΉοΎ‹#X村?οΎ“οΎ•?4qCfζ…΄?\'ε†₯ο½ͺネネ\0ο½«θ²žθ—ο½²QοΎ…@杯qァ鉄用\"ο½·ι‹Ί?y(#njη“§ο½°οΎŸοΎ‚ο½© lH;y?9οΎ‡s ο½³ο½₯ォ\0?0??οΎ‰ο½―,?j*).?9K。ァ。?リ?庁棚ι»Ήο½Έ??<*゚.θ²Ώ]}ワ0匸ソ&W\\ι‚„??ζ‰ž)72ο½½θ©(rハ?E?)b|qC<菘#ε£•οΎžο½±}ο½?c!clM?4u=??L璩机。?p3?ネヲ恍$jο½§ο½’ifGοΎŽιŽšοΎ–ο½«o\r|ο½²ZοΎ•οΎ“4?ャ-ャ硡Y}οΎ„ηΈ¦ ζ£’*οΎ•$δΈΌοΌ§1?*ο½»οΎ€n?*ッゥ?#S+ο½?{o:ャム Llη£”?*οΎŠοΎœΡ†Q?\0???敦o獻乘スォュ?諑ンζ«U\"el$ο½±ηΈ·ヘヌ写/レャvθ²Ώ%粍?zε•Ύο½―。VgJο½­ζ­―?ο½ΆοΎ‰^?2ο½Ύ?毘?οΎ›k?οΎ†aη­–40ヲXηΈ²trο½£aIQゥ7δΏXοΎ…FοΎˆοΎ–z\Z孝ァ?nマzゲο½₯rスハε₯ホ?*ο½ͺο½ͺο½Ώ?οΎ•U|??_>~z?母゙7Q瀦メ?5<\\?。)sο½°ο½·rqοΎ–_?οΎ–\"AVο½Όrε €?${\0/uGοΎ•ο½£οΎ“οΎŸKliο½Όο½ͺ?ユ。ア虫ゥ?Hζ˜ƒ*2pο½±/6D?4θ›Έィd?珸}?ι–‘F9οΎ„?ο½Ύ>ハッ??>|?\0藐?齏rο½ͺッハッ???οΎ”ォOGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG\\ο½£?οΎ‚~???\0軆?甦翕シyO ??>>?非?>畍」」」」ο½}oOο½Ή~ハ??\0H? ??\"*|*/醋#ο½Ώ?οΎ‡?Sο½£ο½£ο½―w?ο½Ή?ι€Žο½‘膂 ηΏ©??-_οΎ‡?S?\0ζ»‚?ι…ŠuοΎŠοΎˆθ—UT?ο½’5ィ??(θ‘£?οΎ‡GGF銷?|?ο½Ώo??>::睹sο½ΏοΎ”ο½ΏζΈ‰\"\"\"~WοΎ‚5θ›ž\"\'οΎ‡ηΎ‚ο½ͺο½Ύο½·?\"\'?ttuθΉ GGGGGG_?οΎ™?リ??\0JFIF\0\0H\0H\0\0??\0Exif\0\0MM\0*\0\0\0\0\0\0\0\0\0?οΎ›\0C\0?οΎ›\0C?οΎ€\0\0x\0?\"\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \n ?οΎ„\07\0\0\0\0\0! 1\"\nAQ$2a?q#B贈ιŽοΎ‘?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\05\0\0\0\0\0\0!\"1A#2Qa3?$qο½±?CRb???レ\0 \0\0?\0οΎ—?\0οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ‘οΎ—ο½ΌPャ賀FH?\0l~幌?οΎ‹?οΎžοΎ›οΎšοΎ…sι€€=Jォ\'ηΏ’Z?ンNοΎ‡テ。?\Z?Z]ο½₯_3ギク∞οΎŒζ•ˆ u困キャ帯1MοΎ…gbο½­^ノィ郒 *チ*\r?9ο½’ι‚ͺワヲ@}οΎ€?ι…²\0ζΏ€?^3*ォ3ο½ͺ?O?~゚>H?\0οΎ‡οΎ‡?A#ι΅™_|y_屍ο½ͺ\"y?7οΎ‡οΎ‡?OοΎ—θ‚…ο½?ο½»οΎ“?οΎ”z?Es??ι₯•οΎˆ?/οΎ‡οΎŒk?~U:οΎ™Kレソ??>xzοΎ–ο½€?οΎ‘r?{p&ο½­δΈΈ }οΎ”\\)οΎƒο½°?$フj?mοΎ‹οΎˆο½€ ゚#ο½’Y?ーチンo7$ハ??.οΎ‘ο½ΎεŸ’ο½¬οΎšΒ’η—ΏοΎ{]οΎ‹οΎŸθˆŸu」エ:ァ希77\"Uミ#垈}?k+R4耋?鎬>B_T!Fハ\Z>Xι€ž%hdf(。靄+エO7i??`興ン?b卒\r側η˜οΎž#,wοΎ›_&co,οΎ–ηΎ€,?l<GPハdοΎ…ε‰–W?1?\"t\\\'゚N7?HοΎ—g?+οΎ†ο½½οΎžη›†ζƒšο½»ο½ΆU_K]?%O*ε—£ο½½\nε’½kε£ΌOK圻Uο½²η—Ώ^ο½₯ε·₯ク筐Gゥ#tォ-ヲN mζ­€ι½£\\Mt息疆_ ??ο½’ο½’n執?恭ι£’YE働ー搗?ζ”»%ο½½Xε­±?a+ャ3@? DοΎžοΎ’οΎ˜>F~ζŸ†T^ヒqYO2\"ο½ΆοΎ•οΎ”?ソメ佑?エ?r訓釢gοΎ—?\nIaiミヌ)?\nWFοΎ…H?(?月eVι€½?ζ†Ύ?憧jWο½₯Yε§ͺャ?ο½½xι–’?ο½±5οΎ€?##?0?\0H$.οΎ™?KοΎƒ 。k???X?;??ο½Έ\rwε–‰-?7.οΎƒ?οΎ„?。8s 2οΎ€X?fォU?οΎ—C*\"ο½§ι«­cοΎœοΎ—3θ„£==Hο½Ώ?)οΎ—?゚*孝?|ο½£ο½Ύ[?ο½Ύ^セ。?E??粟Wο½­οΎ„|?δΉ—fヲkζ”΄=?X\"XXοΎ–οΎšθ±’\\_ bο½°?\ZQο½€ι…˜ο½²ε˜‰ c]rο½§οΎ•ο½ΎοΎ€gAmd?,ャ?-ο½ΉοΎ—?>η΄―οΎ‰VOζ‰ˆwリ0ε­€οΎ†οΎ”vο½·οΎ‹?ο½’LιŽ°β–³οΎšIゆuοΎ•g-+f?鬘?Dι°―e#ミ$ζ“ΎgDebο½―?οΎƒd\ZHδ»Ά?)%ε€™T ?ο½£?,\n橒ワr?6?P?X? ?ζ΄»η”Ίi,エ剳ノNl?Qο½Ό*ο½»K G\0ゥA;k wο½₯}+??ο½’???ιΌ‘ι…Š?\0οΎ›ο½ο½½eォン銜漿-?ο½Ίθ†€οΎˆ?#ンNT$怐ク倐テ;?A?y?% ο½₯菜οΎ‡οΎ‰?IZIセミ。メK\Zャ从rWr?8?ー壜3゙f却リ?\rヲgMLtnV<{J拒チ8T?V????δΊ•?ο½₯f 鯑。 。薐AIcd\'oο½Ίο½±]?e?ο½ΏΟ†ο½­;η“Ά-ε”οΎ…b\0?οΎ•ε₯‡?゚?6?\nο½Ί??ο½Άι°•G]゙?゚ 耆Zォ?ハ?埜;ハ|?。|9η‚Ί*#η’§οΎ—Nο½ΎG??\0ι›„=z1ィセッ?\nη‹—οΎοΎŠο½’\"?ニ。?*??ハ??ハ\'?\'GCQε·»οΎŸζŽ’ο½ͺ??\"xDj9ο½Ύ|/ο½₯Uο½Ύε·΄#?}Jゥ鑠サ>ヘ{?ο½Ώδ½Ώο½£η‡»οΎ˜8οΎšοΎ›η”Ÿ?C%`ミ3?3クハGγƒ±ο½§οΎ›ιš—_οΎ’?9οΎ‘゙Hーー刳?\Z? 萒$)゚M??>}Lο½»ε―Ύv?u\r?-ス芬Bο½Έl??R!杓[ヲアδ»•\rθ‰?εœ–d?ロィ蔽イGO*οΎ…ο½ΆοΎ‹ο½°ε₯¨οΎŸl?\0Mq?>οΎ›3#γ‚ˆG恟ハ6a?Bθk\Z3o?ャ倏Cη‚ŽFοΎ•θ–‘?:δΊ€ο½ͺqタ\"%?&?6$ ??\0}セヌ鍄oοΎ”X?)ο½Ώ?ο½³oο½§?fW道セ寺コζŠ?+ \rο½Ύο½ͺο½­οΎ–?οΎ‡Oζ­³?*οΎ„ぼY$o講Zο½€ο½³??!EF?2 οΎ–ο½­=θ—·(??ο½ιˆ·uR?6uη›’qο½€?モス式卦{ο½Ώlη­¬_*KL?ο½’/ο½°ο½»ο½Ή?!?caζ…Š%昿??εˆ‡θˆŠοΎ‘οΎ‚ι‚΅I%Iスィd?ホ{]\Z#YοΎ’Ukr+ο½­ ミ^οΎ’SQUユチmxAヲWΒ§\n?!免K卩w`排XリPοΎ‚Πο½Ί#ζΏ 5漏=οΎ‰Xο½ΉTb。゚GζΈ¦?<\Z7εΆŒο½²ο½²οΎ„?ワ颴チ ?7チヨ?,@!1ο½³LK?ミI&&?ο½€δΏ£?8?8#1>7=T47rRVY^οΎ—?6οΎ„$3(qマW?8?q゙P?οΎ›DExοΎ€1^ι†―#壑Q粂ナs晝ι¨??Sdヘηͺ©?ηΆ΄ ヲ刊3h=ο½₯?@β€˜ο½¨ο½°δΉ™jfο½³$V?RVο½­|οΎ•οΎ„η₯’凋?εΏ  韜レッ%?[L6xz醫Mヘs?uヲ$x2ο½³?\"\0?!cοΎ•Q?$θ–¦?5逊VワャウD\n?k Ρ‚%ン0ο½ΎTθŒ‰ο½½οΎ…οΎ@?θ“ォスン??Mο½¨οΎ–ζšΌο½‘{ζ‰ο½£οΎŒ{?:ο½Ήィο½ͺ[οΎ˜οΎ‡ο½³ο½΅ε‹ΊF?[b?#BοΎ›+倜q}=οΎ‰\\エ?&D?&ο½­fIg1,MjZqB敍X?%リ巽YQkXT?ζ½Ίι―’^!ャu。8+δ½»rIjャK[ο½Ήiフ n{&4iο½’?8j。泌务踈シーH黎y\Z?ラチ譛\'4οΎžη‚Έbο½Ύ?ο½εΉΉο½₯ο½».ο½·%。ο½₯ο½»H)@~ζΏ :ο½Ίθ³ͺE[AJHBD8WοΎ’οΎšCX!XοΎ—οΎ‰ GΠΊ3οΎ™ο½―rοΎ…? 5?摜?\0οΌ¨t\\?eζ”Έ2pζ¨Ί+,?瀺エkrn(eOZοΎƒο½’d\"ζ°Έ??q#ネTοΎ‹οΎ‡?2W?\r「`キ。?\0 ο½Έ?(ο½ΌDζ„ΏJJ4]w\0V珞>?#θ„―)g*η–Ό?.噴監:οΎ‰@y&>]ィ(sワyFa睇GZ\0οΎ‹izMゥ゙,+ォοΎ“ο½±IQJgο½°Qο½€M\rヘy#轟c\n??zΟ‡mE」q|M{οΎ›KrL];δΊ‚qο½Ά5?エ??\Z。?I$識6hβ”°Yο½―?t遘?]dd\'軍\\rοΎ—\\ュィr6ekヲ?$qq恨0θ±ΉοΎ›wο½₯UοΎ™ο½€E*フ8ο½Ήcε’’οΎ‹y\0テ。^zοΎ—dy\"ο½½οΎ–fSEG_οΎˆοΎ’BaQ?KLο½£οΎ—ο½ͺο½­ζ™3οΎ‹(RοΎ•Nζœ•?H?ο½°ο½Ή=OοΎšοΎ”ο½»οΎι»Žq?οΎƒοΎ…!ζ£§εΎ΄θŠ½οΎ’?\ZοΎ’??`。E?ο½³V?#{2δΊ­??\n?ヘ羌3ャihο½₯ε‹§nトエ????ο½³ο½³\rοΎ—ζ§Œε­³οΎ˜βˆ½οΎšο½€vHエZ{~N?5ζˆͺ?hン?\0FEdοΎ’οΎŒοΎŸ?ネN恙??ワ????οΎ‰?CI蕉鬣ロァヤCθ³ͺ遜ηž₯ηΈ’W。。qユdο½Ή@j?0οΎ…Ξ₯οΎ’ο½²E概sθ€ͺθ‘¬οΎ”οΎšη™’ε‡„ο½‘ο½°οΎ™ )*ο½€iεˆ†m0』?οΎ“L?H\0οΎ”οΎ‘ε ‚οΎž@>\\?OMチ冲臠耂?ャ?L=οΎŒοΎ†?ネ\rο½·? yリ!?:οΎ”ο½·???=?ο½½~ネ?蚣リ?ο½§#フエc=Vθ•ͺ址ャ`蒂烹;ο½²η₯οΎ‚?\0ζ…“%ο½€ι ‘qヲ? リ2?\ZοΎ—xo翊y?ネ?\0?ο½»?#Z萱|?ο½§ο½§οΎ‡??輟レSWl1\\γ‚²m謄蝙<ο½³ミ?5キヘ6?GD遇vォθ‹“??蚫g?οΌ₯HDnぴX危\\潁}??οΎ’.?;HοΎƒMοΎ™?$X?i[1vヨスソ鴃秀Dマレ石?゙ホD?ζ–›β™―Dk%οΎŠοΎ›οΎ‰4?ε·½εš’οΎ‚X?(ゥ;ζš—\0θ…†?c ?οΎ“οΎšwMヒャ介GζΎ±zοΎ‰οΎ‡οΎš,Zζ‡Ώ3οΎ™?+οΎ‰οΎšVο½±<;ηˆοΎ…\rチοΎ‚5dlεŒ@lVz:?ζ§ΏοΎ•?οΎ•oΠ₯ο½½ο½―E?史*?マ?οΎ•Us\nο½ͺゥ遽>ο½Ύl?:::::::T??9 ζ·ΉKοΎ‚οΎœO?;]οΎ‰<岫ァネ?3ユミ:R?ο½­ι™°οΎ‡?οΎ„zοΎ€,\n?ο½°%??Mε‘ΆοΎ€<ο½?2壕ゥ蕾οΎ‹?(ε₯=Kι€ ?ο½’\"\"?ヒ醋#モヌマεο½Ί?洫ヘ6G7ο½―?rο½Ύn。6οΎ–ο½Όmレ?ン?Uラチ οΎœο½‘οΎ‰1ο½ΆgGxοΎ’cοΎ‹g,\\;θΊ™?sοΎ… ?6l?)/Oロ杭かi\n彩?}θ—·?l $ο½ΏZフ「F,]7ο½±)\0ο½±B7P マ痍舢]?7οΎŽοΎƒοΎ†ιš¨ο½€???\0N~.?vε°…?<8θŠ™rοΎθš“^ο½»?9e階\rマ#\0ソゥEZoqト)fHdζΌ‚\ZIο½Ό 0ミIo ホキキイ4ゥοΎ’XO卒ri%8I?\"Gδ½°mォθ„‚$$勍lム。?メ。?$Hο½z+οΎœθ—\"?Xr0οΎ‚ζƒŸfε·–ο½½6\nリ\r?οΎŠοΎ‰,?\r?οΎ‚*砒ヘ?θ‘Ώtqノ靑??゙fη©€{ォィ&ο½²yl$ ο½£?2ο½°FVο½±\\ムヘοΎ‘οΎ€q マ|QοΎ‚???,?%ε‹ΉοΎ›οΌ—IοΎ—ηΎŒοΎ†?,チ&$?vX笂?!@;lN?ζ ©P裕@#ο½‘ι€‹ε‘˜ζ€Ž \r?#οΎ’\"ww?e lι¦₯;APΞ»ζ₯<ο½Ό?ο½Ήι€”ο½©θŒ¨ο½°?\06?0??R5??;$颏\Zο½ͺθ‹Ί!οΎ‹?θ†ˆοΎ…ο½½ι½’θ‹ž詫チケ&フkl,。ο½,7識$i\Z??ζ€ΉGι΄»<ャ2ο½½?οΎ—ο½­^?^゚xοΎ‹θΏ©ο½Ό]οΎŒοΎοΎŽθ‚­y\Z?Y.2怏氾蕭Pu澎gS=Eク燻A笏4O火曾チZDs/ο½’Wο½Ή?-「ヘ:ζ°Έ7?;?rM圦?!豎ャο½₯εΈ―H)?!ο½ΊJ#(ヲdεΊ—4?lゥ??\nxοΎžο½Άζ”…εΌο½±οΎ‡c%θ—· アマ撒Y*Qエ?DH&ο½³?3摍U%?ο½οΎœ?ο½·?#ο½―zXο½§ζ’Ή:?5Xο½₯ο½Ίο½Ά%YnD?7昢Lο½§exο½£n?フWη΄‹yθ₯d?οΎ†?_ο½°ο½»η«‘I?8?冲:*マ諱LBVο½­ }dSDネ_ οΎ—οΎ‘ο½½οΎ—ο½Ά$θ‘¬ο½±ζ‘ŸοΎƒ\"9θšοΎ•?QοΎ‰? οΎ•ZΠ‘jチォ徘ι‘³X*οΎ‡\0伏\"g湍zCο½£ε­€οΎ„ο½€ε€Άζ’­-?οΎ•oο½­οΎŒη°‡3,δΏΈc xyο½€I噐EdN?X鞍οΎ‡οΎ…?P静ノン;ο½³εΆEοΎ”?ο½·y οΎ—X$urフ?&フP,ホK?莡?\':Vο½³9皐89G;Yο½°οΎ„??Jワ渣bdミqン?A4ο½²\Z?*οΎ‘H0ο½―ο½ͺ?J+芍\r?$,ε‹ž|?ο½―4?M-?δΊ°?ο½Ίο½½d?リ9ο½ΉJ3\0?\"ネ?8l .P゚gPοΎ„οΎ’H{ニ卒セ( {゚$οΎˆοΎ—ζ”»H~芝Fο½ͺο½Έ.οΎ‰ =ο½₯οΎ€οΎŽο½¦οΎ–\\οΎ“οΎ—k?-盍ー聴9^鍄チJζ²?\0ο½³η²Ύ?l&$οΎ‹οΎ“-&θΏΉο½Άヘa訓CοΎ†-?1mJ?;AレC?Π‘+ο½€)oォ]mVnhθ’’οΎ†+釦Exο½Ύ aοΎšζΌ¬οΎ‰In)#ヲ籍?οΎ…οΎ‰?!<5θœ₯7jqヘe唳q* ヲJ? iοΎ›$ulοΎ“Kη©΄ο½Όο½±Xο½Ή%ζ€±θΏ½?e梓モャmοΎ–:Dpο½Έβ™‚οΎ™WieD朷Yィヒノ`n3P簍セメT品SvοΎ‚h。$θͺ₯ハ「\"W?ζ„Ώz?x?;YeοΎ‰\Zォユο½kl]?g\'イハs??OοΎ‹|ハ9ォh?Gο½₯ゥοΎ™??ο½Ά?? セ吋灼\nQ\'エ]nεŸοΎ–tο½³?,2JοΎ”Wwヘチjy?/οΎ‡1?(eワ _3grュ剩aCο½£.οΎ‚οΎ€ο½©οΎ˜y-η›΄{Aiチ?οΎ›Xο½³鍼Aθ‡Ί\r??δΊ«6ο½₯??pοΎ™οΎŒο½«iο½Ά?mι‹²*E}L θΈͺοΎ™UPVι™Ÿο½΄\"!Dο½Ήο½Ά\0?\n0XοΎ‰ο½’EsηΈ’HοΎ‰^ο½²=η©°BοΎ…c?ミEο½Ύ。ロ0[?.ヘャ}ζ„ΌοΎ“ι›«ηΎ―#エ?;2ネHe荘l$(]iZ;輝?\'η™Ύ)5XmW?lοΎ•ο½Ώ*g本0フbwθ‡₯?8f\rハ>?,トィ?5οΎ–?g?ε‰ͺ?:;ζŸ―ζƒ‘[\\?οΎŽθ…rWm{[9?(?2?占8?c?nοΎ“ι™Ί=ィ`セCNィe5萼K%イネリq?ィ孝?。=Iι§’ε₯‰οΎ•G9?b?゚?*ο½ͺ5~Uzレg??/ィキk?οΎ™ο½’οΎ€.ζ±³?w<芹G\'X=+?θ³£οΎ•-vε½Ό>?x螫οΎ›ζ½”Xォコリq? ?=r?ο½°ε–\Zο½·.ォOヲ。>rリ2kο½­ο½ͺフ*セミa?Bο½± 刧03!ャ?οΎ…?7ι«。イCVο½Ύε…‰rο½­~[Cη¨Ώjォメ&\\P?!?ο½²N?=οΎ‘*ネ???0m? m*0ワ軒温>ο½―IN?ο½°VYuο½³Wg?*rV?οΎ”? ε§«S-c?<οΎ›P3ι €5-.rοΎ”?H].qイワc??垠*h0?ン?Yo?η­‹?gο½ͺ魎?οΎ•?θ•Ύε₯ͺδ½Ώ}醴コミヌ?6οΎ…\\リhοΎ‡ζ£ g9e?5?Bチiο½°ε‹…οΎ”2οΎ“?|H=tヘ4qf\r\n?レlN? ?!ζˆ–ο½Ίζ’—\Zο½­/οΎ“οΎ‰I,ο½’οΎ˜θ³›pCοΎ‚οΎ„Jο½²V1?2?<;7ア∽g?rMZ?ο½―dヘ~H即θ›Ήο½€\\PH??2ο½³rοΎ…οΎ—nO?U戌Rk7}?ο½«ζ†ο½Άζ‚’οΎŽο½€η΄Ώθ‘†[F^οΎŸηš΄ι‘ οΎ‰9jゥ4W6 Kο½ΏοΎœοΎ™V〆剱9ーハ*ランhM0ο½³οΎ‹6}ォe4wοΎ‚uο½½ο½Ίn??9 {cοΎƒqοΎ„ο½£Aο½ͺミンケシウ伏ト?~ο½’C?(\rィk?ヘu?οΎ‹?yホU?\"F ?C\rCε‚‘οΎ–哨?οΎƒι­ŽRUοΎ•K]Aο½‘ο½ΌιŠƒANCエ喙ォRοΎ†dAοΎ‡οΎ“\\οΎŠοΎ‚46οΎ€οΎƒ郁?5\rIJοΎ‰?iチィ4?4ο½―XοΎ€Qο½±ο½ͺl8?Wο½’θ…ΈYZチV3W却メWζ·‘dv}οΎ‡aBpο½±Ys?οΎ‹ζ΄™ο½£^ハZ挟?(zοΎ•eο½ͺθœšοΎ–/??Lマ ?θ•Šο½¬ζ‰‡?b?\ZοΎ€?\Z|?ι‘΄qη²²??q?&ο½ΈJο½»ゥ?>Kャr?ζ‹Ά\"\"\'披?y\"οΎ‰ δ½―ιΉΉ??mネぺ%.rο½ΊネイフGmο½­ο½Όε―›bοΎ…ンGS\\οΎ›ζŸ”οΎ•C?Fヘ痲,οΎŒζ›Ύ<ο½ͺワHlη‘―εrt<_ι ’ο½€S篁οΎ™?οΎ‹ο½Έο½­ο½³βˆ‚Vホ蜜?)r\0?\nοΎŽοΎ‘?οΎ‰b?,?οΎ‡??ζ€™οΎŸοΎ‰εΎ©]SuKsフ?ζ¨’ε‘’k ?)q?4?G?0yΞ£&ζΏ‘[FH??\0οΎ•\"sι―”ζ Ήο½±C?ヘレ?\0οΎ’ο½Ίο½Έsο½§ο½ͺηΎ†οΎη½΅ΠšbοΎ•(#ο½½6Aォヒ%xι£½ο½­?h$w\nL?}ハ/-?5οΎ“Dzζ›œοΎ˜οΎŽοΎ›ο½Ώ^ZI\\ι‰’eャVJ1Nミヘ+iャQ? J$ο½³ο½Έdη­ο½§ο½¦οΎοΎŠ|yGο½Ίθ–‡bοΎ‚?\0-溺セ萓Lネ? ε―€lο½­?ヘο½₯ε―©^<睛_-ο½°リh迚οΎ‡WοΎ„b?t%? ?δ»–??鐢キネq? \\?em?ャ?KoWシホチ}cAv ο½£?3?!エヲC ゚tοΎ™ ー常レォ#οΎ“ο½§-ンッp?\"_rο½·%XD8E?1ηœ₯ュ幌TiPVNοΎ‹?フ!οΎ‰!οΎ•?Ia\n[靨&Llη₯·οΎ™\":)Π³=フ?η„”ο½³?;N???+P-gwQMUοΎœοΎ‡ο½Άο½ΈXテャdサゥヒ\\8ミスb\ZAyο½―Btと?2ο½­οΌ΅PοΎƒ ο½±Dフ?6m?,n\n?η‡%ΞΊK#ο½ΆοΎ—ο½§0ZrF(ャロ-??\"責?*?フーハ/ヒrィ?R1E8ο½’O?ο½»s]/dζ’Ό?/2GyοΎƒ?7颚h??恬??hοΎ‰bE4H5Xο½Ώn:76\".??8???.οΎ—1レO)jD|ο½ΏPUο½»bNοΎ„vο½r9dη―‰ο½±οΎ‹3οΎ”w??nο½±?q`b7?頀鎌mK小8η΅–xyォチ 翌ウ=c\Zο½―pャBrW?jοΎ„<ο½―ι…©ι£›?N?/ォツ?οΎ‚\"\'謬DETDoゥU|\"\'η²§οΎ‚?ζ²»Dlv?\0Nο½―?TjlIゥ8;舩EΠ«%?#<#?0?昨ο½ͺζΌ’??ο½’ο½§οΎ‚ο½§?イ凧W?E?5ENθ‹£\0jgο½°IοΎ„οΌ¦?ο½°vN3ン0?,##ο½½lzοΎ‰bV9ゥ?-οΎ…qゥ???\0レァ??\0ζ­―n\'θš“Oh\"ο½½οΎŽζ›°?\0ο½ΆhοΎ‰yセンモFア。ォθ₯·\"H゚(θ†‚οΎš?ζΈ¬ε–š?IοΎ„ιž‹{ン? 産?トヲjθ…Ώ1οΎ•οΎŠζΏ†?η΄²YοΎ›?bοΎŽοΎ›ο½ΆοΎ„4οΎ‹ζ˜”KJ9ο½ͺcο½€ο½²DEδΏΎ?οΎ‰rエqネ#<ネ7, ο½§ζ…ΆbK瞬ソXζ­’)??)kο½­?Cy\nο½ΉC\Z*Z3ο½²εˆΆο½¨ο½²οΎ›οΎšεΎ‘?マ.?チヒ2rエvη€§ε»·ε‡ͺ*\0cL.??莨?3Sq?xM燧?゚bゥ)?ο½₯οΎ‡6bUο½­ηΊœοΎ†? ο½Ή}エ艝サ「 gJtLH44?X\"?ヲxリ??Hο½­ο½ͺθ†ˆ~ε£™[0ο½ΆιΌ ζ€₯パ?οΎ–A\\%フV?=e\rζ‚§Iaο½€ヒう Fη΅žοΎžοΎ€οΎ‹ζŽ§?Dεš€mο½»d聳?+エケη’ζΎΉ?NοΎ–οΎ›サヘツqフ=οΎ€οΎŸοΎ•οΎ˜η€ͺ- οΎ’yd>ネ~οΎŽθ±Έζ¨…[\Zレdο½€?οΌˆζΏ†η™¨οΎ–\n?\r9ヲ?%v&[?οΎ‹ζΉ―R??7?ゥ@ο½²\Zャ?οΎ’\"%牙現*?οΎ†^?タ槝? B$H?(?οΎ—ο½·$ο½±?;E2呞%οΎ™ο½½οΎ„n7=5ネー.ス裄9ο½³?ζΌΈθ‡Ύt覓]kοΎ‰η΄οΎœjο½Ή?ロかウyb%W?Aο½§.ツミrοΎοΎŒοΎ’ο½―ο½ΊοΎ‹$ο½²οΎ‘?7]ε€²?タマコ?1ζ₯’s\n?cpο½½ο½Ίfャsε…ͺ/m.θŸ‡ο½³ο½§θ¬n.ζ₯·ο½Ά+fι·‚nセレ?\0?ヲs.\n2<\n?3\'∽ホ??T揄ヒ?h??Wο½οΎ“.?ワZTウ`マ nAοΎ‹ο½Ά4ο½£\"οΎ€οΎšοΎοΎ’Wζ‹EhοΎ–?;H\'q倅痂。?p?5q?;γƒœtミZv翊ミ?ゥエラ9ォq3οΎ™zθΉ„ηΆ΄?T:?フU?ZリdeζΈ©6蜷q JDοΎ…Kゥラ2οΎƒζš¦οΎ—ηΈ«η tォエーノM_^Icx)ゥU?ο½Ήyネ ο½·jJζ–ŸοΎ”Ndζ‡Έ?>ε…Έ_ィnο½­8R{圧ヘ ιŒ†$?οΎ—ι­ο½°?b????ο½§οΎ”cεž‚οΎη‘•k$? 5\r/ミ゙XQjマ8%θ²§ο½³EοΎˆδΊ¦οΎ€v?a\n?οΎ›?9求モW+?\"x?リ@?,ο½?g#οΎ•R?\nJaナャウZKKο½’ι– ?*ο½Ώο½Ή*οΎŽοΎ’οΎ˜{/M}pε‘ηˆ›ο½»ο½ͺο½Όο½½ο½·ο½Ά%lepοΎ„?+gH:}Yο½½gοΎ„u\Z^゚?:,ヘヌ,\Z?οΎ‹?ワr?οΎ„ζˆ²ο½·οΎο½€?ο½Ύο½Ώ?5?ゥ5e ?rvhο½’I? ?γ‚‚?.レ?ォ?|ζ΅™η½§οΎ™ds?bk?εΉ’Kο½§θŠ’v?&??\0οΎ“\\jο½»)CZ&}牆? η―·-Eο½»οΎ†γœd??ο½Ίζ₯”X叙>厭瘟r\Z#?3-ζ‚ŸZモ謇F゚?コ躍モacοΎ”I凋iο½’|?ιŒ¨θ…‘?9ε‹˜ε­£?+ο½Έο½ΆYο½₯゙Qhs{ηšΏο½¬οΎ…οΎ‰rsgο½§ο½Ά0?ζ΅Έlο½°gネοΎƒο½’6`ハリ\\kQ草8Rャ?!:WQセゥ?7οΎ’ζ¨Ÿο½ΊοΎ‹?ο½Ή!K?? ?ο½²ο½½!|ィ鍄r!フ\Zο½½}οΎ‡ (?ο½ΉYε΅Œζ€„θ—οΎ›θ·³\0ゥ@Y貞A\'z6R?οΎ–/モヘ\Z4ャ川?##{Mε¬Ύο½ΊKοΎ“?$qXο½Ύ?/=xjXD]?サハ」?η΅?參T^Qニヲ>エ?=~|D?\'謬DUWxO>|ォハァ?U?ιŸ‹zx_??\0?IοΎ›οΎ‡??P?ο½Έ?\0?コ鰊(θ–€??ο½―?ιΌˆε–°ο½©ι…©?~:罐?熕pv?ο½·?uSッ「ーャ> Ipヲ:O5ζ˜‚JοΎ—ο½€ο½­Tj3οΎ‘?$j/qZャT?ο½ͺ゚OοΎ‡O?yX?η§‹οΎŸο½Άο½ΎοΎš\Z[ο½Έο½’S捻トKι­…~οΎ’S]?\'?\'??I}οΎ™οΎ˜οΎ„θ³ŠFο½±<οΎ‘U>????\0hο½½zο½²G。=Hο½ͺδΈ”?Jο½±=/o?+<|?οΎƒο½Ό||?? ο½½οΎ“οΎš?#ヲ??efZο½Άο½«οΎ™ζŸ±ο½¬οΎJθ»›Dnン壻丢Tο½ͺ;#エMοΎ…οΎ“fU#AζΈΎδ½»ERjラqA3οΎ‚?u#_ο½ͺォヘx螺_センユ?0WVeo?>旁?!Cン!i?ο½―?#ο½Ύ~n???eοΎ‰?0??%?=?ε†ΆEjE+ヲWF#θƒ―U!|テエzn>毘ζ±9ヺネ?ゥ?c5\"猢\r]?仝糟?CワDθ€‡ηš‡:\n纂繦ャrηΆ’?゚?1?s?ネ7ο½ο½?&?ツ伝鉄?ε₯§KqKζ–­οΎ›?递ォc?。,? *E2οΎ„οΎ‰%??<7οΎ•\\οΎ‘οΎˆe\\?+?οΎ‘erοΎ‹>N\r<ο½€οΎ•ο½²οΎ†ο½£[Cv?6SN?ο½­P 逐?η•°??0\Z?\0Oθ’‘[9K?=οΎ™f?mDοΎ‹^#;?ζ˜”οΎ’?$ζŒ‡pο½ͺ_?ο½’Kθ„Š:? \\dBHaHθ±Ήο½°*ο½―w┣ーュ?θ–¦!Sε‹ ο½±ο½Έο½½ο½ΎοΎ‡@ ?kοΎ‚65TοΎ•οΎ‰ n~{Yー。[ 3ζΏƒm|?壘?F?\0ε„•Eο½°&ο½₯=ζΈ¬\\?N#)エヘ瑼8\'_[゙VO+励?#?w%s?ο½½?ン。?ο½€?θͺ˜-゙エBチ ο½ΊοΎˆε±‹ζ©KE \0ε’¨??-?リ\r?ι©’οΎ€&ο½³XοΎ‰r膨ャ」ロ[<チ櫺#Yη•₯;>}?οΎƒ:商?οΎ› ?7??\"F>U????;?i予^+4\rホ秘4r8\\゙6?ο½³U!οΎ“οΎ‹_ο½₯ο½»m\rォ%ソエ\\ο½½η°Ώ\\ο½±bqXοΎ‹lrKZq氓擑ヲ?eοΎ‡ο½³-j?リ?0wZ+οΎ…)8聒?θ³€ο½²?&w?^η”˜628ュq2ο½½?!N?3ο½³JR!&?b.?\"zε™΄?0b?ο½£?οΎ™?哉θ˜‚ο½₯ゥ缺οΎ„ζ±Ύ?rοΎ–\0mエチ?7\"XοΎ•:ャο½ͺワT?*sWOaζ¨—οΎ™H?璍3吼テdvη”‘οΎž?97?rdο½ΉB?/(?4mοΎ‘?7?3X]゚$οΎ™<7dο½Έο½©οΎ“ζŒ―ζ§½g?5`臓<&1 Yο½£ι¨’ο½Ή+οΎ‰S?)o+x_ζ’²x?ヲ皸[\ZA-4SοΎ’?^「橦〃?;?:+\Z?|δΏ~h4οΎ“+,\'??C+スレwη΅›οΎ‚<レヲι ƒ?οΎ—c?tο½ΈKh?qix゚Mg?ι¬ΌY ?。イッ\'リクッォォο½ο½³?\0cK?;xοΎ‰!?ο½²P゙棯T?ο½―zqη₯¨ο½Ά+チ?4ο½£yヨタャ?\ZGe\\e0!ンツょPγƒΌjο½ͺ4vο½±?gク姆-?/pο½Ά#,οΎ‚?<「ホ6*#?Kο½―+?hンチワ?~ο½»ο½­οΎ‚οΎ“θ©οΎˆ?3。XH?xο½²οΎ“}TヲTιΊΎο½­οΎ•ζˆ―[T2[οΎ†ο½³]οΎ”5?bワ+リ?θ„±\'θΌ©CζŸ»ο½¦οΎ›οΎ‡ο½Ίε†…p{N>^AοΎ‘a)uV:ハο½ͺο½­<舡QοΎ‡εΏ€*コ悛ッャ?レ?,レiο½ͺ*\'H\\ζΏ‚$k゚エミpθ₯¦οΎž;??? ?yο½Ώο½Ή?ヌ釐q?#οΎ…οΎ•\"ο½ΈeοΎ“G!エ%D?/?ο½£?x1ζšUg]{M廝レ菷j*ζ’¦mε©ͺ$oθΎΏIp$Π‘,θ‚’ο½Ό?偬1ο½€ο½Έ?!?_4ο½ͺ?ZοΎŽοΎ–η·¬ηΎˆοΎš)h??$Dο½Άο½ͺοΎŠοΎ“+yοΎ‘οΎˆ $ο½­ο½³%ιΌ‘I3EZX憧οΎ„ο½²οΎ€?hοΎ–ο½₯[VチYフイglv?w+!ゥhο½₯ι³₯)ウチ?#pvvリ?fEUTU_?Q|x?ο½ͺ?摎USハ?os\"xT??\'?Q???οΎοΎŽοΎ„?済??ソ床?|?\' ?;゚???ο½£ο½£ο½£ο½―:::?S??\0I???οΎ‡\\tttuンッsQZ萱Zθ–€kWハキマ?>Qο½Ί?οΎ‚?E?;{???|??#]蛬~Wハ/?\'ゥ゙?/?7ハ?:??>FοΎ‡οΎˆ\0?」ォロ5ο½ΎοΎ™e?οΎ’ζ‹Ύd!uゥ4A囃xヌ革アウイο½§Y!遠5ο½­l簑レο½??jtャロ?1ノ要?I?\ZォM圻\Zι­…G暾ワ??@蝢?zr?e\"ンο½―5ΠΈε¬°F5A.δΈ™ο½’ο½ͺ\'城?\'??οΎŸοΎ›ο½οΎ‰#εΈ™οΎ‡???ャ??οΎ“??οΎŠο½§οΎ‚?ο½°?+賊]?vワuθ‹Ÿ&hRοΎ„?~><&?οΎ‰οΎœN +?\0リ:??>/eοΎ–Yιž…θ„±R??9C?οΎ“?>wBοΎ…?AK\'n]??[CοΎ„οΎ™lx\\YοΎƒGCο½­ο½°ο½Ά?aο½²*ホウIο½ΏaοΎ•\r ιΊ‘ζΊθ΅­?=?(1οΎ“Azt?1(οΎ“οΎ™YLEοΎ‰οΎˆP?゙ο½ͺο½ΎaοΎŠο½¨ηΉ»ο½΅οΎ–οΎ€?6ネ_]コ贊?ο½²οΎ™ιŸ‹*6 ズ抻务恙~゙ク?\'οΎ‘Pη¦?R?65偏濠虧睿Es們~οΎ•EOワ靼ο½?サミヤ_(οΎ”D?οΎ’οΎ„?οΎ–9?η«œοΎƒ\\吟マ妊?D?廟*ο½ΎUUUιͺο½½οΎ”? gK\r\rδΎ­ZdV?η†ŠP,QネyK?mGzcワ?;?.舩N\"?ο½ͺ=ghο½Έ/jI8sw?+1?2搗YοΎ‹?]非?(.゙?ο½Ώ位フ?%\\遍?::FNn??\0ο½°οΎ“ζΆ›4c?,R\nοΎ™GXο½½η§•$アフ?cTIF)ο½{_ヘ?6ο½ΉοΎ‹#X村?οΎ“οΎ•?4qCfζ…΄?\'ε†₯ο½ͺネネ\0ο½«θ²žθ—ο½²QοΎ…@杯qァ鉄用\"ο½·ι‹Ί?y(#njη“§ο½°οΎŸοΎ‚ο½© lH;y?9οΎ‡s ο½³ο½₯ォ\0?0??οΎ‰ο½―,?j*).?9K。ァ。?リ?庁棚ι»Ήο½Έ??<*゚.θ²Ώ]}ワ0匸ソ&W\\ι‚„??ζ‰ž)72ο½½θ©(rハ?E?)b|qC<菘#ε£•οΎžο½±}ο½?c!clM?4u=??L璩机。?p3?ネヲ恍$jο½§ο½’ifGοΎŽιŽšοΎ–ο½«o\r|ο½²ZοΎ•οΎ“4?ャ-ャ硡Y}οΎ„ηΈ¦ ζ£’*οΎ•$δΈΌοΌ§1?*ο½»οΎ€n?*ッゥ?#S+ο½?{o:ャム Llη£”?*οΎŠοΎœΡ†Q?\0???敦o獻乘スォW蠏θœ˜η£οΎ€?菷p?\n颏gο½·lοΎ–oοΎƒοΎˆ5.?%m5ieο½·\\O゙.eοΎ™??ι‘’*>鴇?ζ¨žηΏ”η³ŸbN瑁?οΎ‚[?;yH|bο½³u}vメヘ#οΎ’?ο½Άο½³Bο½ΎIzο½² _θˆ‚ο½­?{η₯₯撦莫?イゥVοΎ‹ζ‹³{ο½§?\nοΎŽοΎ’ο½²ο½§ε£˜}ァワ排茸T?ο½j:οΎœοΎ™?蘒ch?(; οΎ„?2FNワ?\0ォソゥ? mDοΎ†οΎ—?ζ•’οΎŒθ€½οΎ„Aο½³?ιœ€οΎ†0;θ±Έ菊ォ「?\rθ¦–eャ$3Ow(_οΎ„xハ??a\\ο½³Π‘οΎ‘k,ZοΎ—Z?:議ィkοΎ–ο½·?*Y;wοΎ–wィ?$οΎ™ο½²?ζˆ―οΎ•ο½Ίθ’™?鴃紳僖サ0?οΎ‹?θ«‹ζ‘§k6?66οΎ“j~-?Pθœ†οΎ™遏 οΎ—ζ’§ο½’:?οΎ‚οΎ›P?-.鐔*?οΎžοΎŽοΎ€??pGzζΏ€FRvVε’«%eQ(Q鏈ウXXNn?ォK!8Qンクζ₯Tο½Όο½·6οΎ‘xοΎ›?.pv??ワ鷽\Z??7$?朽??*U#οΎ…\Zο½§NGο½₯ι«“??レjK。セY?2ャq璃萡?οΎ”VWοΎ‚ο½­?CοΎ”?οΎ“:ζ¨Έο½­tθΎ­GGkg%Oο½―?__Njο½₯,ο½―u6 ο½²HοΎ€a|Fホ\0?οΎ’ο½Ί?@ィマ?d?ォゥ`?vο½½η­‘Yο½₯ZiZャ「ヨWF?,?1。」=η΄Ή?Xο½Ί%οΎ‘ο½²ο½ΏYK?6?ヲアキ6οΎ•@W8タ蓍?οΎ„??族pH?rンrヲノモ。bネ?フd3(οΎ€ ?οΎƒθ·¨ -WOε₯¨?*?k?5XοΎ™ηΊŽ=ホ7aTο½£??ヌ菖ゥ?KSヷ*ο½Ύ6οΎ‡\\θΏŽοΎ…dι°²ο½ͺ4{Iο½»p\\? ??=;????,R芍{T]?οΎ–7ζ«mοΎ“?!\"l菷Bο½³nマァ゚゚ャ?ι»„ο½ͺ? η’΅Jン ????οΎ†Gレο½₯5dε’Fο½³?ο½­-θŠ«οΎ„Bゥ?芟?#ミ}颸癑岑j6?Yο½€ο½»ο½°β”―8AοΎ‹ィ=ο½Ύζ²Έ,彷桚\\y*5??οΎ‰<&??6ο½»ο½Ή\"<ε»οΎˆοΎ‰??ο½½\'ο½’ImmοΎ‘<8οΎ‹ Pο½ͺA?qYhο½Ά i潺ゥ ?pk??dウロマeL\')マ\0?ォイy2d?)ο½»&οΎ”#]ο½±.???Oハ。ッXhε€θΌ‰οΎŠοΎžk医9?*η‡Ήl{οΎ–ζ‰ˆγ‚›δ½œ1?1jBζŒ‘οΌ΄οΎο½¨pο½²οΎ”yPοΎ‘zη₯‡οΎ–.#KiE\'?ο½―\0{?=*M?*?οΎ‘kw`ネサ?Mε‚­;q鯨。駑BοΎ†草ト3ホ釡ォキv n?!.IοΎ‡<οΎ—ο½£!ィ`。FkGε‚™οΎŽεƒš??dhζ«›ο½°A#\'οΎ”z\n?:hι¨·|7ゥjο½€ο½ΆrLοΎ›οΎ‚?Lq[??(οΎœοΎ‹$ヲ7θͺΉ}ο½§ζ’²zοΎ–_οΎ’ζˆο½ΎPM$ga$ネ+ζ»„?+xeri\"ヤ竿畦tοΎ™R?。。輿v?\rο½»?q?9ィζ₯ΎοΎ•ゥゥ=οΎ’D8θΌƒο½€?9_zε³™η«Ÿwゥ?セモ胝」?4レ(??\0?sq?.$ε£™]キ卑[サィmοΎ›ε³Ί8?[δΉ‹οΎ›\"晃?;ャiο½ΎLvQマ??ο½±οΎ’?w-εΌ‰οΎœ\rοΎ–bοΎ“/?)リN?3Rp?&η°’οΎšο½¬76鏑?tοΎ‹ο½Έ\" ?8?谿ラ打kヲマ}lDa6ο½»ο½Ίο½ΆJ(??Nk9θ ’οΎ’JEmο½­?QlοΎ–qI\rエセ+ο½’οΎ€N゙???ラャ/οΎ“PοΎ—ng?θ£…xレ>εΌ–οΎ‡?~゙゙゚PοΎ“4Xε‘Ž}θ²Ό\\? 耫ィ?2~ユィο½οΎ›ο½ΆοΎ€?\'>桜kοΎ›!?8ο½§l\Z?oィヘ|ο½«Ρ‘οΎŒη³Šο½¬οΌšοΎHマι₯\0.οΎ“ζͺ ο½?γƒΎζ‘ΊιŠ›οΎ…t?nマη₯Muγƒͺ?\rI {R1?\0=岑-フ??O?\0??エ?q???ワj6フ_%?u妨S懴疱9耆鑷?οΎ‹η†ˆUチミ??ο½ͺ.ミ5ο½­ο½₯οΎ™ιŒ«δΎ΅οΎˆο½₯Fη΅΅\0rJャ限z?g?7\"?湟ι«ͺ8οΎ”Rη±ο½₯()JJR?οΎ•?\0。nォyο½£?マ}]ubPK-ο½ͺYο½Ά??&? ?=?6qナxWヲ璣?リ\n?/??\0ォチBtマN?n。\r\\ン(Q臧?ι΄›οΎƒ?SοΎ„@?j?η…€!NοΎ™?\0?ο½―w頏?6wοΎ’3b?ο½ΆοΎ”$∡ミ{?\0QXw?,οΎ€οΎ‰θ€™d?\0οΎ’ο½₯?C$ο½²?\0??;θƒ–ο½¨ιž?b9マο½₯{ιŸ†\'&ミ??εœ?\"ャリ??/ο½·;A?θ†š;?οΎ•ο½°~醀unο½’?ο½£ο½Ό\'οΎ€ο½³RθͺšοΎœ7ζˆ”οΏ₯cιΊ‘??ο½ΊkGοΎ”zM4?j贍5ο½₯MJO\ndチbォRTgοΎ“\0淀ャ黝Y_δΊ°θ‚―?ιΌ»W#οΎ„9?蒐ユチ?\';?h桜ィu\n\\ZhPοΎ…-チ曦bζ₯•οΎžTθΏ°οΎ‹?y>ァミT_LοΎ›:jqοΎ›|ネYw,yBο½₯dr蛆?ホ}{Uζͺ ?kIη½Gε£½0ヘ\'佝ユc? ネ?jο½·ο½’+$?ォy?q1?οΎ”qη›΄wワ後?ο½ζΊͺミ??#_リヘア゙Kqgη–‹q,ζ±Ί86ワNx??οΎ”?ι€ζˆ―ο½₯η¨Ώ?#?@ワSι³°y?5s?ο½΄ιœ„q?-Jθ΄“ο½§οΎ›#B ゙=?A?ο½Έ?UnοΎ’οΎžS,ム冱92I,?? |οΎ„θ‹œο½ΆH?3ε“˜?#οΎ™ο½³ο½Ίnhcミb?xbゥタ^1゚?<ι„‚Z?6A} 7{|ο½ͺ2゙ァo?ο½ͺ?@ンο½₯?+q?ζ“‘ε‘·sοΎ€οΎ‡;N\0??ミメοΎžοΎ’οΎ˜οΎ„?οΎ—?}ο½±^~mZ5?<%゙キ T?ε‡Ίο½­t]οΎ™ θŽ‰ε―‚?θΆ…~ο½€cト荷εκホ>。?Fε·½εΊ–+1???ο½’?レrレο½₯ウハLM$クレο½».οΎ’Ocマ>壁?靫mο½₯ο½»οΎ–??茣Aec dTb2οΎœθ‹Ÿζ•?\0οΎ’ο½’_Rキ橦ツキンxη—’ο½Ήβ˜…?ホフp=ο½»\Zθ»›ο½Άο½Ίζ‚—η‚­ο½­-?1ο½₯ο½»#2θ•οΎŽrv?ロ〃Kエー{eζ—’mVοΎ–1οΎ„j6?ヌq>ο½Έο½£uリ+?>θΏ«0エ?#xοΎŸζ”…??マq?3?u4ミ? w頽欄LAf?\r?<b;ι€§ηšš?ャ:DN!??Uヌミ゚zヲンkοΎ†W⇔モHοΎ„S(\'οΎ“εΈ‚?\\sVQl??ィ??-?.參弾o$ο½―\0οΎ›ιΆ‰qοΎ‡jθ·‘z榴瞢rTyJD??\0ο½ΏjοΎ—οΎšNθ€€ィο½₯ヘユュ籠θ¨ΆεΉ€}6?~暎レァ5?3Gο½·ο½°ε­›η˜‹?(フ?#ι₯οΎ†=A??J1ο½±gNο½£οΎ–\Z~ι »?Kii#zウわ?>ざァヌmJοΎ“WοΎ’εΌΎοΎ•?瞰?ル倦ヌケヘNkレNη Ώο½½οΎοΎ…οΎ…ο½­οΎƒε’œο½΄|瀬ホ8?ο½₯u}>{M,Itd゙.僉?9+η„Ό8?vx?ζ˜ƒοΎŒθ¬ο½Ί8x坿@6?#\'ミ?οΎ†ο½Έο½°?4fF? ο½ΆοΎ›pンニη§’?マ:lj:ホケ5ο½Ώ?η«‹ο½ΎοΎ›}β—―wε‘‘B須?SV 0エ穎ャ゙ο½±*ο½ΊHο½Έl彫}マモクッ??οΎ‡οΎ‡2ε₯˜οΎŸ??\0ο½£O ?HοΎ„?>οΎ‚\"ο½Ί?ο½»eL? マ???]ネマnォplO? ?3οΎ†@?。P4xdモ。cムゥQ\'?m爍l??\0桜]0οΎƒ?n\"rο½€ι―›* οΎ“οΎ“εΈΈ^レ?ο½±Z\\HXοΎ•$?bοΎ…ムθ繿エ?\0^qノゥ~?k]R=J ε›˜ο½΄;οΌοΎœο½°*ォ?sマ?rGοΎšο½ΈοΎŒιˆ‘~] I9?5ホ?o偬戌?xヲ\\ε§™? }k np??ι««ο½£v?8ォルヌッ碸{?V??3x葦?8=οΎ‰?ο½£οΎ™.ε½±muο½ͺレE゙\\.Zホ@l?5??\ZοΎ†ο½°.cζ–½ο½₯ι³³cHリ\0οΎŠο½Όθ•οΎ‡聆5ο½²?fοΎŠοΎ†οΎθ‘±Xンー|uンζ₯’@ι†ΊηΉ•mοΎ†?0οΎ„ο½²7.?.キィqpネ?<}1?+Fε”Ήj[マ5?Uο½¦οΎ€οΎœε²Έο½Έワ` r}?]ww36ヲcο½Ώ?+?,フ?ε―©@Fxネ=ォ?}{? レLKGζšƒοΎƒL} aοΎ‰98ノ筝?Lε°…%ε‘ΉθΊ„ΞΌ0?y1οΎ™08γͺr>?ο½½}ミ-ο½’ο½Ό2]敏,゚?6^θΏΊXゥ<州\rHο½₯ο½€[?;ネホUNTcο½½VsIι«„\r2F卓?<ィルャ iιš™s裳ャ2ο½€I#|οΎεΊœοΎ†ο½Έ?7?Sチ\Zエc??xο½ͺ]敏LォMhィ]?η­”?οΎƒη±€ο½Έ???ο½€???C?[οΎ…θ΅΄θ²Œ\\?ο½±4觜シU゙)e9\"L?Jο½²{0εΎ‚οΎŒο½·οΎnャ?ο½ΎkYv)\'οΎƒ?\n壁ケ?N}ο½»W;ォ學俟+?οΎ˜θŒ‚y;[シ」触。DMィ齧Rο½»ηͺ?eθͺΉοΎοΎθŒ…ミ?-H?tィm\Z~οΎ’Dフア;? ?\0ο½₯Y5οΎ‘?\rア朴c倏]οΎ‹ο½=q犢?Hl?-:Iο½·\n9ldc8?RοΎ‰ο½’^%οΎ‰K6γ‚±οΎ˜ο½‘οΎ…ο½°?ι„’?=+彝\\テゥZοΎ™hZοΎ’b゙4ο½±N\nCエg櫻ンノマ。k]ε…ΈXο½ΊnοΎšοΎ‹ο½¨4ヲ\\゚ンZ?5&v!6察q??nοΎ•/οΎ“W:}柏iο½°Nο½·οΎšο½¬οΎ‘?\"kH Ulζ ‚οΎ‰=?8οΎ‰?Hホ系bγ‚€mAε’€ο½Έh#a?ο½Ύ\0θ‰˜?ホ*οΎ™οΎ“vM ?&ο½Ή-「。v?咻ゥ%qοΎ€?;G9θ‡Ÿο½Ί!皷.οΎ‰nοΎ‘ivfYヲ_(\r隻vs?;?U?86?羣ャ8,ヲi?? ?Q?\0,{?朦k XοΎ”c??ε«ΊοΎŒοΎ—b=?οΎ„qァケマ~}+。:/ムンキナ妬ノヌ<οΎ—&ε…¬?>勉k+ο½€{ヲ\nο½―ζ›„ο½&ι‘°οΎƒ+p=1VL??\0ホrjィ-?2οΎŒθ‚∨?。HMュレス?? 6ミI栞??θ­«6ζš‡u;AοΎ‰\rοΎ‡ο½·zοΎ™_d\'eWQο½Ό??F?ζ—¬g?。qzο½ΏZ琉コ?-;NAh鞍0οΎ‹?$琅??ο½₯n゙ココキ~ε€ͺ?%οΎ‹ο½’ζ€§s?}x5ο½’4K?2rレK8οΎ„\'οΎ‡\\ο½w\03οΎ‰οΎ‰?=?οΎ“d3u??οΌͺ\ZιΊΏm 6b)lο½³?Nyマゥο½??[ιΉΉRエ? s???η­§?θΉ²οΎ–?wンヒ οΎ‚ε› ?ο½Έ?ο½―oοΎ–ο½―}SοΎ”Vvο½Ί8}ζ¨Ή?F_?.ο½½ο½±??ο½ͺο½/Oθ†ΎSミuθΏ”?s テツ督S\"ζ€§ζͺ cοΎ†kォ? ?\'H}M?\'?a ?(f?Cι€ ?~?[-\Z?iθ¬€ο½΄ε»š 恩?8\'゚N*ο½₯ゥyq-ン??sι΄»a\Z7$?Ol}Mk[ο½²η΅„{ 覧ο½Ύn\"ο½°{hοΎ™ο½Ήο½―?\n~?g?。R%ηž»ζ›΅?ο½·=ο½ΌZEο½­?\ZEgζš–οΎšrI?9#ο½­οΎ“^[T靼Rη•‘櫨\0ο½₯)@)JP4?ο½ΌuKζ€―θŒ…/?2ο½§οΎ‹οΎ˜?/yフ^y?\'οΎ›??kTi@**$?ォw?ィ]鸚エ顑mpTナヲZレZ[耑3\nフs?\0耄?οΎ“οΎ‘JL?θ‘’?E}?οΎ’ο½£Xl耄?8旁w%?ィζ­™οΎ–ο½’ リs?οΎ•?e玳?εŽ–6ン`d.~?8ィ5Bnο½ΌfBeGv??#^?5STοΎ’?ηŠ€Dζͺ€ο½’ン阜??/\'致ο½ͺο½±#οΎ”οΎ”gZk y3ロチ\"ο½£;οΎ†ηΌΊq?5ow??οΎ‹qwngη₯–M? ο½Ά|ο½ΏοΎ‹βˆ?9οΎ‰ο½­{pn=?<#rl。盆攀6οΎ’[ハQ彊Tο½Ώ$.\0\0θ–©{J螒゙IQ)ο½Ή?)9?g*A οΎ›?x?οΎ‰z?ο½’δΈ‰r)Aエ2εΎ„NA?ζ…΅οΎ›θ©­ι¬Όqn?οΎ„? ο½ΎοΎ–??0οΎ™懽ヘVK{?.?ζƒΊ?!ο½°{S\rιΆ‡ο½’#\n?.??,qそ?8οΎ‡ο½½P? οΎ€οΎ™οΎ‚η‰Ύ?\"チθΏ·>oAοΎ€櫺リ\nο½½hθ‘²Mε­¦ο½Ήη«Ώ?4[Ufcο½@ο½Ή,??X#oοΎ’θ‚ͺq}qi\rο½ΊKο½Ί\'ο½Ή $[ο½°\nq??5ヘヘBοΎ“4ォ#ο½ΊRοΎ“ο½­γƒ­? \\Dタゥ\rοΎ‰?EjοΎ‹#kοΎ„?wοΎ•??9?モ齋ァ}ο½€u称ネ授ケリネF?0\0?\0#οΎ—ε¦Ύο½­ι€οΎˆg個トoοΎ†?ο½’ο½£?L?リ゙J]蜿jο½Ίネ#8ワ~οΎƒο½Ή?HKεΉ»]θ¨­+|?ムヲX?ヲF)?\n[?Hスホ+ο½ͺ?贍qtζ·΅PI\"ネpA?s?qYs~?+οΎ’^i?+Giο½Έ\\ο½³οΎ„U1$?οΎ‡\'ο½ΏoJ?ο½Ά「トマ狠$?οΎ‰θ»«9οΎƒοΎ–ο½£.nο½­/dX゙??;Aθ–œο½ΏοΎ”zAレο½₯h\Z゚ャο½₯ο½Ύο½°ο½±{;?2ZM?$?8?Αィチュ+οΎ–j?レレxοΎ“οΎœο½¬cフd ?\'οΎ’ο½½ヨ繭ゥ介\\??\0?#\r?F;VεŸ†οΎnε₯§?θ³»:ο½²n9瘍\0}*?%οΎ™V刻?1ι©©?+δΊ’HqB?8マιͺ­οΎ–N。qセ蕉Za吠ο½€E4ァヘ$N3ワ?\"ο½­?]}ο½₯ο½½?\0Mル靺MοΎœεŽ„ 稱Dqm??>。龠滝}kOι‹€[屑<<2ο½Ά#?>οΎ‡?8θ‚­^_οΎ•q<οΎ‘oルヲ }ο½Ή/γ‚Άkο½°\\FοΎ–?4bi?ο½ΈE6チAネ8?ο½6邦lο½°4ヨ鍛? ?*sエ1οΎƒ0?*1οΎ–k=v;^ο½ͺイ揖?RIW\nT7q$杁歃VοΎ…\Z5?ヘ塳y\nF?\ZCο½ͺ豚?ο½Ώζ€–ο½€θ‘’?zε€­ζ¦ *?(YL8ヨミθ•ͺοΎ„ζ™DοΎ™η‚>x\"rッホ?5οΎ’ο½£@η²›S?Gο½ΊBοΎ™οΎ†ηΊœ後キoZ。?qe稚?LοΎ‚D゚οΎ‰$wοΎ€???οΎ”1G?0ネ@oMンユ?鞘ο½₯D]ο½³nθŒ‚?莞黨KO。キHフィRW |ο½Ώθ‘›?~U9 エク湛?\nI?0Mο½ΈfP8>οΎ˜θ“™ο½ͺο½½9ο½©οΎžοΎ›?豎?ι™΅#;ο½€\n$c厚?V磁エコサエシ\Z{硃Eο½Ώ*{釐ヤJ/存,球ο½₯?怨齏MB+msM?(?4jο½£!I?ο½₯EX?M^?゙zηŸ­οΎ‡5ο½Ήη³§aοΎ„e@*q@θ‘Ύ0{οΎ•ο½·ο½§?蝢?\0?οΎ–Dο½·E%2ο½»ζ—±>e^?レ」?I?ο½Ά[?\"エ頴&NοΎ–οΎ˜θˆοΎ€οΎ€゚ュk\rjGζ²’\Zθ¬Žι€Έ>?.ε­°οΎ’οΎ‰?ο½Ίο½Ίi77hP?\0?\"==2s?戚ハ\\食cチnOoο½½ci?$V?qhο½­3*8\\?\0θ€Šζ¨‚?J便q??9ワJh烋}ο½ͺr?ィエャ下キクケ偃\nοΎ›F@珞コe?<ホ+%bH?vη€ΎsワWSDοΎŒοΎ‡sθΏ©&ο½ΉοΎ›οΎ‘\rH\rο½»@軟k\'ο½₯tη–«笈?g??ο½ͺ?\0=Mc゚Fニン?ハF03ιœœοΎ™οΎŸ\nャ縷耗?οΎ…ミ゚urε±€?!ハg ζˆ”οΎ–?!οΎ‰?/hοΎ–?:|R゚4οΎ—v??DοΎ™οΎœ??゙サ:]m#οΎ—-m>V\"οΎ‡?οΎ‹ε’Ύンアホsマ躱痛hmΠ¦ οΎ› ο½€ο½»??# ???Z占~ε­ΊvUο½Ήk=El偏ルbο½Ά 7οΎ‚?タヘmlοΎ‡οΎ™}οΎ’:m岑u。セhマ?Zアレー?\r?ο½·ο½­eοΎ›ι‘ΏBοΎ–ηͺ•οΎ–οΎ•η·€ ο½°ο½Ή?<)?\0οΎ”οΎŒAワ`qΞ³?hン?ο½£ι¬₯チヘト??9YHι…”?ζŸ”ο½Ώoο½₯K??[ 5οΎ’ο½οΎ‹οΎ†6?@s操=ο½³?+ο½Ά1]ο½’\"οΎ›ο½£ο½±ο½£οΎšοΎŸ?7ηŸ­οΎ‰&οΎ–οΎ‚?_??οΎ•οΎ‡ο½₯娟y!? 販チ「o9? マaε―Ύο½½kZοΎ–ζ€°Eimャ1οΎ›X妻\nネG8?ι€Ÿ[ホ」??}7L瀕?9?!(゙lN{O#ο½Ά5ャxοΎ…ι‘Ό^uοΎ›?nマn?=?!?Rssrο½Ύ,?F@οΎ›ι£οΎ—ο½½_οΎ—οΎšοΎ–θˆ‰Lノォォ[ゃ#[u%0Jォ@xマ<οΎ•5?穃Nmb?b?|ν稍ハqοΎ˜ζ ε‹¦θ¬€7N。z僕?&@οΎ›wθ²§?ζΆ•jο½±οΎ”ζŠ”cο½₯i^ワンx nUο½°X??ο½­Rンgィ鷸惢\\οΎ†??\'偉qο½±O??ε£…?ο½Ί?οΎ•?ε₯δΊŠο½₯εœ­οΎ™οΎ?(X?,=[??cοΎ‘η―₯?。メ(θˆ‚Izエ?MεΉΌi3-?ε–˜+οΎ€W#8?ンサ昿bj]MwοΎ’?レ 昼?<)vηͺ? q?;?9ο½­YοΎ‘\Zォι¨Oο½₯up`ゥ$η’Όg?#?fο½§οΎ’+}WR&レ顺嫻繊YοΎ“ |ヘ?;?οΎžο½ΎοΎžοΎ•???kοΎ“?マ?ο½ΊοΎ‚[?V?εœο½½οΎ“η‹†?#??Wエ?ハο½ͺlοΎ•t)JVdε΄–?櫨\0ο½₯)@~v|dοΎ•ζ­™??\0ヨコя$F-M?ゥ$lο½Έ aο½Έ?3リ獸tθ†œοΎ‘=}\"hk{mkx?エb@|οΎ’?ζ·³{ο½Έο½ͺοΎ…οΎ„2%η«•θˆž? チ?\rcワ\\Kss-フフマ#ο½Ά?\\?ο½£4W nοΎ‰03\\?;?i?汨ο½ͺWン侏rア゚4?\'γ‚ŽOε„»<ε₯¨n?7ο½€j--?θΌ”#\'ハ@οΎ†9$?v#ミヤu??)$VεΈ­\'η«ͺ?+2ο½±c?\rXy???ι »ι‘„θ±ΈιΊ‘οΎ†?_?\'? ?ο½Ή?9ηˆ²οΎ‘2?tレ?ワ,Mζ“Ίmθ³Ό{ vAネζ·’ε½­Uk艀N@cζΈ―pX* ?-?x#ο½Ύ9?1γƒΌTε””?sgtο½ͺ? ο½ͺο½ΈHリ>WUz恍>ο½Έ?ユ`ン鴾?6οΎ—.ミ(O:リR?ネ ?c\\*m-ε•£ο½’j\n?6gハサZ7???cοΎ›?\0sε‹Ή\\ο½£οΎ‡ηͺ©θˆΈ?? ι³³ο½ͺ?ζ‰˜οΎŽAマ#゚β†‘οΎ˜οΎ›ι¬―Q?乞8マp3?ルィ{[θ•šdζ¨’Vh?&U??(F2ο½Ά3錫qQI?T?ο½₯o&οΎ“\'?4ク゚PW?;@#q\\η‰ΎH\0ζ΄«=q:#ゥ5ζ€’οΎ”οΎ–οΎš?橘fmο½­?チ??9ォ?SOuwyor?マlIζ‘Ί\' ?η·•a゙[靺ヒο½Ήο½Ήeζ–§l4\"3チgc>?θ±ΈRuRDJοΎ”zkY?/#οΎ•η’΅\n保.η’’ζšΈι†Ίεš ?9 K?ンニ-#?@}γ€œ<οΎ‡ο½Ήゥο½ͺヲ側ο½?4ο½°xヲ? ォLοΎ€?9#!?ヘz?.\nワ?4ηΏ Oeζ·‘lgο½Ύ\0GοΎ‰豌??ο½²tοΎ…?c巌xηv条轀H<??η‹η«’οΎ—Jο½·ε±žθ£…T??E^οΎŸοΎ‹οΎ‰θ‚“?}Tο½³6pοΎ‹%?\rEζ’°ηœΌγƒ”?=@?οΎ–ο½¬βˆ’]?詬M?&H?2gヤ取ゥ\'Lο½±KοΎ”:ο½»C?-ο½ΌW?[οΎ„6/οΎ‘ο½½GθΊ‘a?Zンoο½₯?8僻BハチI?οΎ›5οΎ‡]ι­ƒ??ο½―ο½­e~οΎ’?8???ッワネR[{p?0\Z-οΎ™q??mηΎοΎ’θΌιˆ·οΎƒ\Zィ??*?\ZοΎ‹bη—©-?3?Vο½§???QF??%οΎ’ο½Ά| c?!?ヘ?\\?OEι€Ÿ?5hο½·7WVοΎšε…‹?ヘ?+οΎ…#d揺ネ@ο½½?\n=οΎ†x?e??z莞硨ア\r~?TFDS?rワ柴?レケ2ο½Έiヲuc璁ヲ栒ミスー?6「瞿r9?kε«‹οΎ’^=;?[-=羝6Wmο½ΉUW~?N}y?鳫ヨ)CοΎŠζƒΉ{οΎ–\\?/?%d2リfEζ± T)\0??*]??マ鯡|61?8?+ζœƒο½£οΎžYεΈ™aネ8Rxヘf[ンチ&οΎ•θŠ³9ワ%ζœ–ζ§οΎŸζˆ€ο½«RhοΎ†qζ½Έο½Ά?οΎ“[?8ο½­ο½³kyopャ^M棄Gο½ΆA?ο½·ο½­kο½»m:TοΎ”--&ο½·ο½Ήε–ι‹­C<\'*Ow8?οΎ…ο½ΏιΌˆη‹Ž[9。;{Whε…œε‡οΎAチQεŸc??]p|VοΎ‰Z;~\'?嫐z4?9R?\n?θ°·7!Inハ?ζ‘€η•œvο½ͺ#]?7??j打οΎ‡wxNネ?7(マεŽ>暝zfο½»ο½Ώxι¦—Uο½½?ク鬼懇UH|\rヘウpn1? η‚³θ»’]mο½­\r]!ι―±/M[ ys?\0?ζ¦n?ハセ9チοΎ™?ο½ͺチ翩ο½£?覲οΎ•ο½³οΎ•W???ζ¨’XBο½£οΎƒοΎ›?ο½€?_ο½Ήο½¬ιœ„Oο½₯lV??Xη“²7sqニX?ζ³›οΎŽ}ο½Ώ:????蓐]CQ属Z6hο½’FοΎ‚FοΎ›vU?0ιΆ€|エ?ο½»ο½­dGsィ5ο½Ύη„‘???g9οΎ‰cιΆ©Oο½ͺο½Ώk\'ο½Ά^マD^AοΎ“οΎš^??0οΎ…oη₯€?3u+0ンCο½Ά??yοΎ›?<2~?貫ёF}隲フj@チ9?οΎ–P??ο½§~ヘοΎ’Eo+3ネο½ͺyuマεΊ„ο½§ゥ]ン_j}οΎ„;T?リ?翔羝テeο½·Mο½½:ε²Έο½y/\"V?*οΎ‘οΌ±I゚nGqU?ィヤ疉nュq?9ヲ$ ?y8?]\Zヨq0サ聞 昿Hθ‘©οΎŽ6ィ熔Ojず?鐸,ο½»εΉ’ι₯‚οΎ†οΎŠο½³ο½­ζ„•9&?οΎœοΎ—οΎο½½???οΎžο½Ύο½¨οΎ€??XοΎ€οΎˆο½ο½¬ζŸ“οΎ‰ (I\"ο½Ύm%ツ取?U?ο½²I。sοΎ‹ε£»οΎˆε›˜VワC1ζ‰˜_dθͺš(B?r耑ケο½ͺ?エ?q??レVN\ZοΎ‰οΎ“ζΎ—?4??9?ゥ$チ?<ーォmrοΎ„?Aチチマキa轄rοΎ—#ゥノ\' 碜I?\0ο½­f?巍ヘy$?aN*=?マー[ο½ͺθ„›?>οΎ€Vさeε€ŸC@\09ホο½b6]ο½£9η―‹0+oθ‡ˆ:?$οΎ‹Ξ²οΎ‚ηΉ©ο½ͺ ゙ソー~ο½’ο½Ά?ZοΎ˜οΎ„\\?\Z=οΎ…ο½°οΎ˜οΎ˜CG.~ο½Ώ??゚U???KtζΉΆ??\0ι°•_ο½£Uι‰—_勁zο½₯+ツ櫨\0ο½₯)@)JPζ–™θ‡Ί.!ζ”ΈοΎ‹ο½Έ?NjηΈ‰?Q?εŠ‡ζΆœοΎ?οΎ‰?姫韜...dε™εœLマ#湯フrI?mO?οΎ‡}ャ鴕ヲc οΎ‰:エ??\0???a?>8? ?QY]η• οΎˆ>oο½₯vチθ‘―οΎžXヲbゥοΎƒハ_~εw?A??2\r2?m?ο½€S。DK\"7Γ·>」ワ}jο½ι ?\'ャ鰛ο½ζ£Š@?シホ?>?2u;v%!θ‹’v}?。ッ?tワ[J?5?Y2 ]ο½³?3?+Z?=eοΎ“ο½·οΎ—:|WοΎ’ο½ͺ$?θ”•#εˆŠοΎ›Rzeャ?οΎ—\"%+ο½q皿giοΎ›οΎθ¦ˆοΎ„2\"ζ•·FrοΎƒ??X螯??ィ写ン?(繿フ;?dqリ?須?ε₯ツンP]ο½€6?3οΎ‰?;I30θ‹”οΎ˜?=0{qοΎ…e?? ??4?ホJr裁οΎ†9ヘW?ャtm^kοΎ‹}:dο½Ή62,2ο½Όg>b3β€²θšο½±>#kSο½?mο½₯Kο½»?ο½Ό?WO?\"οΎ†&#0?9cζ¬–?>?ι°‘(jοΎ’FοΎ‹lο½°οΎ…ndf9\0?οΎ”F?#ηΆ»{K?οΎ€??ζ₯ 軟G5ο½±?6zοΎŠοΎ•Nι€ ο½»+:,コ坂ε₯—?ζ₯­οΎ…οΎ† =ο½»Voマtο½ΏFjPO%。峰ウヌケgθ‘›?エ\r?)<ιœ€=マ#οΎ›5?_脉?οΎ–?-ο½­1jοΎ“[?-U?}P蠍゚Z?6H?9e?udοΎ‡S^kw]=q璽ィο½₯εΌƒミ??ο½·3gヘ?08ι‰ˆTメqK=\"dぷ>aοΎ™ホ8ネd1ζ–ƒοΎ—?\Ztフ%[zο½ΊοΎ‡〆?4?サフ2s?1]3οΎƒ4nfο½²rH??\0x5??,I?\0ネ ?\rzmモ雉\\?66οΎ–vοΎ–ο½² Z}οΎ…ηœ‹?A?2}ο½ͺο½Ώw|ο½­)?969\'*{??ォοΎ‹$2ホ?mqs゚ヲコ竭Fソ臧rοΎ‹`屎??ο½ΎsレクJK9ンノwο½xレyvzcζ…΅\0ャ\\ο½Άθ•€GοΎ’ο½­D\0ヘー/ι₯‘_ ε›³s_ネeハV??ミCο½ΎS?*/>ο½Έ?B:ヌ膝ス}ホs_$*οΎ’ォ?OリW0pリSリ? ;QW οΎ‰??リハッ8$ζ­ƒοΎ—チW9οΎ‡\'5マG#ζ­›TeLε­₯爢COε₯(K}+ο½ͺH゙゙?rビ???οΎ›般\Z5οΎ‹/9\0?竰チ%`qルrs倉9?lο½°ο½Όο½Ά?vハwqク?P?#?マケ}?;H1ク艨X2金vqTh道?=壟+οΎ—@οΎ€οΎ‡>だ@wqB@?οΎ—ハ?X?\"Yο½Άcマ?\09^??[マ?\0Sζ₯žFォ??>?\0?ι€”ο½½??\0ゥマ_ο½£5テ艀ウH?)JV?)JJR?Rη±?/>暈DοΎ€?&Zレ}/m&ζΈ«ο½ΊX?エ]οΎ‡ο½Έ?滯胄ο½ͺEン?‰7ィ?οΎ‹gヲ?VοΎ–?$G??X貍釣翔<{iβ”³ο½ΆNH\rζ”Έο½\r}??I|~MHエ~ミ?οΎ“ο½­ο½Ό*cxト」杁??QζΉο½΅β”Ώサアュ。??\0愬??41\n?ゥ????1?5ゥg?q#ヲレハiI)GU?#ο½Έ?WrZ0ハ2H9?ο½·??5οΎ’?+??)ο½¬οΎ˜ι‹Ί?ォ[?εͺο½§-?:\rο½­?鎭y纎?ε‚­.ZT???マtοΎ‡ チ?ο½§??~ε“­0@οΎ—ο½³^cd?3?O?*r\\ο½Ί&砕ゥZマゥノ\n[タア妃ZywεΈο½£?y?\r?θ·‚Mι»½θ€…sοΎ‹οΎ†V?リ*?チ濺wゥ??>ο½Ώ\r筡ン?棉ヒ\'ζšζ‰˜ζ‡Š?標セ 。}M5嫐ι…Œ?hο½²N\\焦橑マj續ο½₯οΌ¬#Vο½Ίeο½ͺ3Nο½ΎοΎ‘οΎ’ο½Ίο½’Nο½’ι³§?ο½₯KKε«–a9 ;M?;]sリ??AοΎ–Zナヘ?$ε›ŽοΎ?$lQリζ₯aネοΎ•jメ企92ヲθ₯·*BLο½₯ζŒζ¬–οΎ?Cンeο½Ώoζ „?οΎ„οΎœ3οΎ€;\\R?οΎœοΎ†ο½Ώ9θ ’οΎ†]?\0ο½Ώ?Hο½ι™›οΎ›<οΎ‘οΎŽθ•θͺ‘$ε§™*?οΎ„(?η²§ォv?οΎ„θ‚±ο½ͺ?O1?q倣蒼マッュj孳ンoa?姫聑lgο½Ή>οΎ•xメ蠏。 摐yο½―\ZLQ?*ッqワ=???5ヲ\\?)?蜘T;JGフ?οΎ‹?lWmοΎ–ζ³ο½°??.1ο½Έvンニpq\\4??οΎο½΄ιš»ε§“εΉR6?<οΎ€z「ンn「イ栂ャラN1$[T?ιž˜θƒ„\')Oムチ?&ο½€ο½’?+οΎ•]Ku}\'ヘN|I#?e\0ャy?θΌœθ‹΄ηΉο½¦οΎtη€«β€œ!οΎ‡タチ?肬Ybx??,?.?{?5οΎŒο½ΆοΎ† οΎ†Zg9y[οΎ“??οΎ—οΎ”RJθ—»brゥpζ›Ήx?pοΎ‹c$d?だZ@οΎ—>H οΎ‹ο½©οΎœοΎο½Ό) ?Hθ²… s妃ケVοΎ†Aネネォホ?οΎƒ& B?\03g?モミW\\_?οΎ–Pο½Ά? 堀笆Pr゙P?撼ンサV4ε―‚ο½£ο½°οΎ‰?ο½±HF+ε’―οΎ‹??pοΎ›?cハcU.チTO?ィr\Zο½³g霍Iwο½₯。゚霞?Gmο½»ο½Ό#?\0jι­δ½΅%οΎ‘n\Z(?エh^Uiv8οΎšοΎ‡?\0}ο½±Pン#vο½Ά? \'却?ο½€?部恊Aマヤ}kο½·?ο½³ο½­{VοΎ…vhc@?>吩?yο½Έ| ?ο½±???潁勳巡?ス。ケ5防 Af∽?\0@ο½ͺο½Ό肉?T,? {οΎ—TI#οΎ›ι‘šοΎ›ο½·q[ヲ?Nο½₯騫-ο½ο½―ιΆΈο½’4Eζ’­?\'8c??卜F?#ο½§D―i\Z?ISマ??Oζ…¨qο½―?/:ηŸ₯$ゥモ?ィ鴛サ+0 ?\n??ο½Ί5$vヘ}ο½Ίη₯­?bxθ†šοΎ•c$pqοΎ‡lοΎ—\n@]ο½Ά?.1?cミNフ? η™½%レ?οΎŒοΎ˜οΎ‰?,0ε…’c\'gοΎ•οΎ›ko$ミeUBο½»οΌ„=@?)僑?ο½ͺ[??7??8οΎ™Qィロ憫???ζ»žοΎ‡jD?7H}?~??t?]<οΎ’1d?マ??)ο½Ήε’‹mg?*ο½―l q?@aネ0リマ。}叩ネο½?黢リホοΎ–ο½€-?ヲ。゚ャ???ο½£ οΎ…?3D?f+?\'ο½°?\0ο½±]k。[ィ?ι΄ˆοΎ‹θ˜οΎ‚ο½ͺ9%ο½³X?4aQοΎ™T{3r>η­§(οΎ‹ο½³ο½ΉKm>E@θ‚‘θšΆζœΆ?ιš†οΎ/?+?θ‰Ÿο½³??:?/?? ??\0Z?2JT#? εˆ‡?Zο½£D?;U許~?;((ミ?\0?ο½Ύe_ο½Άζ’ž?FJο½²?.jο½¬η›ƒοΎƒη·š\0q?+ο½Ί2J゙N8???pマ逞Bbο½·i|ヘ?鴉X7Dο½’?#οΎ›οΎƒ??\'οΎ’QOuY.??ο½₯エ剩?D?竟~s~οΎ‰6仇??エn?η₯6οΎ’Fン「メ?$θˆŸοΎ›~???ο½#?GqJRο½°,)JP\nR?櫨?οΎ—?Y??\']コゐP??フ??Tο½ο½§k$ο½³Mp _\r」゚? ο½£ζΉΆ?溏Cmsi??η―€R;ネm\'?ιŠ–?ο½Ά?2?ο½Έ?ηŸ§οΎ—ο½°???pθ˜‹?,??%θΉ‰ZYοΎƒ+ζ„ΌοΎ—ο½Ά0ο½Ώi\"゙D?=リο½»??ο½―ζΏΊvοΎ€οΎˆιο½³ο½Ί?レe?m?\"レ[ォZη₯ィ唐」?U=ο½ο½£0?(?4ζ—©?)οΎ†θ ±?+ο½·i_ヲf?*ο½₯n$Uq硃? οΎ€??,ヤ児i?\0ハ.?>f8R ο½ΊD]鱈?胙?\rοΎˆθ€¨5ο½²ο½Ί~゚Lエ?サィBFοΎ„oι›²pοΎ† ゚οΎ€?ィ?E\r\0 *ο½»goο½―#ο½Ώο½ΏaW??θž‚ι˜?\\οΎ‰ο½©οΎšD? 7)ネレθ“ΏxοΎ‡ο½ΎοΎ•!ο½ͺチkο½³?>]?ζ‹³ο½€η†¨οΎŸζΉŸο½Ίο½¬lο½₯}\"?6ε–‡οΎˆ1*θ)f;モマzοΎˆι«ŸοΎ•t?ホ?-aο½Ή?οΎ›[フO?8TrIン?ο½±ο½ͺネ忍?ο½²?1?\n?0q??ζͺ ?d陏`Wz\"ι§˜ε«‚οΎ‰?)θ”—=ο½³ζ‘Žο½΅η‰©h?EοΎ•w6VWvζ—…AZo澁ミ ネοΎ€!パGο½½V?θ»Šθžε€–胙葯sο½±??ォJJ?\'tο½Ώ?イ青y\\ζ…Ά?WοΎ†}フ?.οΎƒ??~\rヘワj? HBο½Ί?ο½£?\\?70葑髻ネBο½±??zο½£,rミο½₯?\0οΎ„?ζ£? (9>?ZοΎ›=1οΎ‘ηΆ“η³ Xθœ₯7Lx? οΎƒοΎš1怩[οΎ‘ε―ƒζ’’jホ柧θ‹₯n?-??ζ„›οΎ„ο½£?\0d sοΎ†vοΎ—ο½§?i???Awο½O? b?θͺ²{οΎ„d(ネンネθ‹”θ¨ŸΞΌεΈοΎ‘ο½€?? zr?οΎ’οΎš;οΎ›ζ›³οΎŸ,?! οΎ‡ο½Έ=?&ο½­οΎ…θΈͺe君BG?bO}ο½ΏnοΎƒ?aゴ+{οΎ•?=:爻#οΎƒζŸοΎ‘+ο½³1エ?1οΎ‰?οΎ•WοΎ•ο½Ίο½²οΎ“Mο½Ή7οΎšε…¬sフ?Pン,P[ヲ7aG-!ハ? ζ₯8ο½―9οΎ‚svヘ4Ju]οΎ…?ο½₯ζͺͺ发l0\nο½ͺV゚?##ο½Ώο½jο½Ώο½ͺマゥナモr?-ο½’ο½€LοΎ–?@8fマp=ο½§θΊ‘η«ΉPム。?%ο½­?ο½­|ィhοΎ”\\ャAοΎ—οΎ‘ο½“ζ”ΆοΎžο½ΏJο½£|d黜$ウ愁ミッ.ο½??οΎ€Le?!マrο½₯i rエ?\rο½’?3θͺ˜οΎ‘ο½?5偽?]ε‘ΆοΎ˜.?ワ?\"ο½§ο½Ύ\Z?\nοΎ‰ο½Ύ[h??!S.?, ?;?ァ゙。fο½€D憩Iv@@yοΎ‹ο½§\r糟?sX?ο½₯~o-qエコKyc>UY<ワ?8?ο½ΏοΎ“θ€€ο½§οΎŸMey 岩1ネ??wD??但bοΎ‘@N戟キcο½ΉοΎ†8A?lu9o$顁レC#?\'福\rζ“Ύο½­i v!?y N?}嘱?Jε„² \\ο½Έο½½?+ζ¬ ub;??ο½½WnLLοΎ†K}οΎ‚3οΎ›\'εΌ–8οΎ—<c/?zdfοΎ†ο½²~Pο½Ί?tQο½Ίο½³H適サH? ?οΎ‚釉」エ9?5%ε»ΏοΎ”.\0?+n^οΎšι™œCοΎ“οΎ‰Nζ„ˆο½²ο½₯e~\'\0q?{U\n]οΎ„οΎœ aθƒž?71N? <οΎ‡xQホ\0\'ο½°>。肄?聿??οΎ‘?幡ヲゥ??\0οΎ‡?zoTο½ΎοΎ“d?/3xζ†ŽJο½²θœƒ| ?/Nο½ΊοΎ’uK9$ο½Ύι˜ͺθ›‹ζœ±οΎ€H?1娩゙S?=9豬OCチm4οΎ‹hζ…οΎŽοΎ‘οΎŒ\"I? レI<~筝\rャ3ロォャメD「ォ鋲? οΎ„c*@??X颯」ヨ源Fηͺn?+?Oο½ΌοΎˆο½€οΎ… W@ヲホN{?bο½΅οΎžε‡ mο½±(?)?q$Ma。??ο½₯mD?;。疏触 p_ハ6????\0b。ッナGθ¨˜οΎ–?.ζ²™@I岩Drο½ΎοΎ‡οΎŸ?ο½§S#i_チ土p?リ?oθ€ŠοΎ‚]?ハ ??暎Z/ャ?οΎ›ο½½V?Imο½±οΎŒοΎ€οΎˆ ?蝕?澀フ靭ZNqogy,ζ΅„οΎŒοΎ€;θˆ(@#=οΎ‡?εšοΎ†{ο½’?{?tS?οΎ•?R???f?6エ|Fο½³ο½Έv[οΎˆοΎ„x1?;W摆ヌ5οΎ‘ο½Ήο½ΈhcrPζ“˜βŒ’\nη›΄?{Xレ?/rο½ΈοΎƒ?2[?ァゥzF}Fエウケ?\r0\\^οΎ› ?H??ο½’I ?3d?ネ?=?θ‹ŸεƒΉοΎο½»ο½·?IpBηΆ»W?GοΎ€?mqケソロ7?!|I!@θ›”ο½qワ?_|οΎ”οΎ†ε†Œο½£]_iο½°:ο½ΊοΎ†ι˜Ώo\nRο½₯ο½€*οΎ…ο½²?0?T?=&ο½²ο½Ί7FοΎ“?ィ,/oRοΎ‚[οΎ›οΎŸレ?hοΎ‘οΎˆοΎšο½Ή?οΎ…|οΎ€ wο½©θ–Š?A\"ο½²οΎ•%?ハ_r2?\0.\0?οΎ”樞ーB???ο½½jοΎ›οΎ—}ィt郡_?η›₯ο½Ήε£—1!?)AηΈ¦.θ™±?2}ο½Ή?*ゥh拆v5hエユrl22 zzW;erXο½£ dζˆ€ο½ΌοΎ—Sο½·ゥmJ7ο½Ήε£ΊοΎ”3菜?eοΎ‹P?.?η¨&?>贍K\'η«’GS ゙.οΎ•Dο½° ιΆ«οΎ‡|?X?.?{ο½Έ?.$οΎ„οΎ˜$/>?。y騁メbqomk2。リrοΎƒο½Άsレウn?οΎ†οΎ†??ζ‹‘8$FUA=?湟ケryYη‘™bn?\0?ε‘‚,27セ換Jkο½²iε¨œη€•ζ˜‡οΎ†οΎŒ??θƒj}\\;ι‰ΎοΎŸι¨“聳ο½Vο½½Cο½’El?rοΎˆοΎ€οΎ†ο½₯?NO睾yο½Ό{T^。モ?S??,ο½Ά$0θ§’;θ„©s?ο½­ο½ͺE5ο½±q??ssZoソ゚?ο½½Z躅ス擇榱ο½₯Er?p?^9ャュREθ‘‘8ャι››($9?OοΎ—?:θ½—οΎ“ο½·vモq?O?<β—†\\?vG\Z[ヘqοΎ„1*医゚eοΎ›??)<οΌ¬xθ²η”¨vuB\n*ι›’5ャl4?οΎ–??喀ャミシTc?9οΎ‰?X\Zm功7?οΎ‹&ι…’οΎƒζž³\"οΎŠοΎ†??ο½ΎUο½£?η  o\rTg??ゥル?\'Pウセエ?$? eV\ra蔆\'?ヘCマ?.惴LSKnハ~ャュοΎ’οΎ›N?d*@οΎ†ο½―οΎšWI[??ο½­u0?1ZοΎ™+??οΎœε€Ÿ ?。]θŠ’K}?\"z?Bγ‚»ο½»? サィ?[友?dゥε²Έ?梌i.ο½³K\0qィU靭?^ι€οΎ˜οΎ™οΎ˜οΎ˜?,e\\Lサ續? ?{ζ·‡O]_リk==uο½€[οΎ›o 9PοΎ™?οΎ†{?ο½\\ε°?οΎ„ο½­ο½Ύο½ΆοΎ“4kォ)gοΎ’οΎ™Y-紜?δΊžιŠ›θ±¬ζ—‘οΎ‰η«ͺ& C?\Z゚J? ヲメο½₯i\Zε₯—SホN6η‡Ό?Gレr5?)ε₯§?-md睨??!#クワ}ハ??Z ο½€ο½€N\"mンロ゙サg俐゙)e1ワoο½­LοΎ‰g~?[ャV顝οΎ„0ォ??ヨq?0οΎ‹;[Gο½Έ?B1?95k οΎ„ε±€η˜οΎ˜ο½ΉοΎ‚?οΎ–ο½±n擁?v8セ。?6U6ο½°aζ†ŽMt???6yr*券,ο½­?2<ο½ͺqο½»\0{滾ゥ?ο½°Cホ6?/? εš΄οΎ’cgδ»‹Yο½·?!@5マXζ΄‹ο½±????η―οΎžοΎ™+ο½£o~οΎ‚0スマヌニ蕨?ε£+asチhοΎ“ζ€XWο½Ύ??:?\Z^ο½ͺ?\rS\'mο½½ι›°ο½Ήc2;キ゚?\0ο½€kοΎ™?吁ル`zο½₯+\"ツ櫨\0ο½₯)@)JP8?ο½Ίtο½»εͺ½??1ッウァパi\rg\Z?フ?οΎ“ ε» ο½ͺο½§LワC.?-ο½U rZ*?Bッ村+i?\0?\0οΎ’d}ο½£z価ォι­…=η•ΏηŠοΎpοΎƒ?>X??\0V秘kο½ΈVレワハNοΎ•θ˜ο½±οΎŸk\0G?\0?+???.X?8?F?M?:?24η‘ tJο½²ο½ͺ(mοΎ‰οΌΈ?kMοΎοΎ›οΎŒε£Ό?乒*hミ?l?? ?\0Zン?\nο½Ί?;ォqο½§\\yncι†Έoη„Ό蜿セkォィ?zi+ο½§D屢エ卞締.N<2}ο½°N=ォォW劾*ηΈ΅F湢獰fθΎ»u?,1ロィUη½²?9^Gθ—•/οΎ“?Kwi[7yミm2>??Ak}\']/?:bp?ο½ͺヘ?sοΎ‡οΎ›η¦…ο½­;Kζ‘Žζ€θ’Ÿ?;ο½£76?>οΎ’\'プ?8ο½­!θ—Ήm羌Rι΄Ύζ΅·j?\"οΎ›οΎ†3DQοΎ‹)瓷遏NοΎƒ?ィヘn?ιΈ›Nby-?οΎ‚ο½ͺr!P<ο½»N?ο½­οΎƒmοΎ“V7レBο½­ιŽmο½%ゥI??ο½Ίο½K/ο½°q?οΎ•\n?\0qg?eシ榛マ=οΎ‚ε­…οΎ„2マ%ο½½;|Vο½±οΎ‹οΎ™ハMスニィラ男6?εΌ·οΎ›ζΌθΌŒf8$ζ΄Έ<θŽ:οΎ–οΎ’[?/?゚οΎ‘?$詞d? ?*?vsοΎŸοΎοΎ—Uο½₯恂スC??ο½Ί?ο½Ά ?リ;?鸚ο½ηΉ©?モ鏑?\'?%&)# ο½Ή?3,pο½Ή\'ο½Ύ9ンVε…₯ηΉ”6都ヲマ」Mθ€₯。?οΎ‡??3ホ1尋櫃逑oq}οΎ‡ &dヂ釆3?;忝V=ο½½ο½½οΎƒοΎ‹Vο½ͺ&yοΎŽοΎ…@99οΎ‡W;οΎ‹;οΎ‹ ノャ` ?aο½Ό2|2οΎƒοΎ—οΎ›4iY$ο½₯ζ₯Ή{ο½§οΎŸοΎƒ2\\ゥhε»©η’½#p?F?6「扁モ」RοΎ’?\"ο½·ο½Ήζž‡77?VUQ?8?z?R2HH輌 εΉ²h\Zヲ瀕g2Y\\Ex?%フRο½½ ?$(マミ?/η‡₯?/Qο½Ί>0鞏Io%ο½Ό6ο½·S齬\Z?!?#独?8%W\'\0gjAp?彦ユZXοΎ†9\'n\0?&ο½°P?#Lスヲフン;ο½―:r?擬ヒ9ャ?ο½£。?法ク?οΎ”z釀c?οΎŒο½¬οΎ”ο½©ε£―οΎοΎ†εŒšο½΅(οΎ”οΎ˜ο½²οΎη―₯oq?2?0y聟スVzο½³G?E?lθ₯―+猴ク?.@fι‰…IοΎ‡οΎ–ο½²4~ο½―[w材?63!!ン?οΎ‡?\r?>。ロァkVο½Ί?螯PApθž‚βˆ¨d^pο½ͺεŽaοΎ‡|οΎ•η”ŒU?9ο½§?ο½£[eキ鳬oο½Ώ?!οΎ†οΎ‘οΎ€チュrιΊ—gfοΎ–ε‹™ο½§?,廏E\'rc \0Gワ?8ο½Ά5ο½½.K-笛Xε–šθ‘„Hチマ=ο½»???|レnq\"r?3ο½F?\0ο½₯z?\0Bε“’xο½₯οΎžε‰οΎ‹tp>4\Z?6蓼モォ(θ‘—ο½Ύ?@ο½§<\\?ο½§Rtο½ΏRι—₯エ}Aο½§^リ\\\\チ翦.ζ€§2?<ζžΉζ­ƒζŸ¬Kη£”Pι°‘ο½­h=]~阻? 2ホ,Uο½ΌοΎ‘ο½’ο½³) HοΎ€aエ?5;?|W?oRοΎ›jε₯”$?\Z}ャ^I3?ε†’KI?>?マ5?.I%ッ樽Es才租}οΎ„ οΎ†GοΎ”οΎ–fζ­Ή0ο½±{??1glO鰍Rο½₯r@ホ=ο½³?監ヤcA)MοΎŒοΎ…Iη‚³}?*。?7ム獨n筝ス=ο½ΊοΎ†οΎ’οΎ‰eP訣ケ>??1Zθ‹’?゚Ke$οΎ”Jワ0黝゙q$vqI+οΎ‰ο½·tqdィ\n03ζ₯}j网?&黠゙榜?M?ο½?θΌ’ε±ΆS+c; 螻?>」゙ッ?R]7οΎ‹ι«’η‚Š \"ο½·?\"?\0οΎ†N゙ο½ε©??D??擂含ο½Ά?\"+5ヘヤ? [ヲIοΎ™?I,。xο½±?LοΎ“QοΎ…\n_ο½Ή 6マ\'MVι‹ΊWo荒?;οΎŠοΎ„pEη€οΎŸ?。.昧(ο½£i{{FοΎ„οΎ—ιˆŽε―Ύ;*?$ヨォキVvι€€ε…Ž!?,οΎ…゙~ワ対~。?))hοΎ€γ‚΄οΎ”?8οΎ–9戰+。B3?ο½²ε£½CοΎ™οΎš;ヲo?4スワ;}ο½½~。7οΎ’??゚?!ο½€f[jιš£ι‚Έο½’η±˜\'刳p<οΎ‹?ζ‹›Djミ顺ッハ\"ο½»ζ›΅?\'eοΎ„aδΊ³pFNyォPtε–«7「ヘοΎ„sοΎ›οΎŒοΎ›ζ­ͺ 彑ソ>。Qο½ΊοΎ•?εΉ»??サ洞?升ε€Ÿ??#?οΎ™,ο½΅οΎ˜οΎˆοΎ“οΎ™οΎ†5)Jワ~\'O<οΎƒ?aN????οΎœοΎ…lε“’??ddη”»Pp???J[{ο½·?sエ`?6η¦ο½½HοΎ‰ο½ΆX?wコ摃クノ$?;οΎ–P?1οΎ†nR゚? :ニァィ_k]゚ワIr?1,mU98SοΎ‡οΎ•mkmj?゚Pο½»i\'?侢司 ネ9)羚|η’’?ο½€οΎ“ζΉ§?4θ …θ“οΎ’LοΎŒο½€ζ–›?oο½·on?\0Jζͺei\'RοΎšοΎ‹ο½©y\"θ©‘ε«£\00假?ο½ο½¦ηŸ­]ε₯「ゥ}kοΎ’?mοΎ”1]aοΎŒι€—2ο½Έ\0c\'οΎ”?ォソァ?ζŒ«ο½»ο½Ίζ›°|οΎ†pp0NqマヲG?9ο½ΊεΉ½οΎ’zγ‚„οΎ„?ウ鍛T$crFH?ォ\r?-ュ颯ツ脆-ンγ‚₯チネ??\0ο½²1?gk?\"uィFδΏ―ζ·…?\"Zv?\n?οΎšοΎ„gζ ²GοΎ’ο½’?,[P-*ャε₯ͺο½»?eNN{θ‹Ÿζ¬–?+θΊͺιƒwS4ο½Ίx{ォォxB?ィ |v${?ィ:οΎ…οΎžο½‘ミ乒k[ο½§οΎ„?\\19?#ミ}\r^。ル\rζΊ€ο½£οΎ—?,??4οΎ‡#?8ヘkk吩ク勸%θ₯ΏοΎ…ο½»η„Ά ε­θ—Ύζ¦Ž3クヲYο½Όο½»ο½²sヘcο½Ά?\'δ½Όο½£οΎ†οΎ€Hゥク2ン樟+UTοΎ€ζΌ pャIοΎ‡$οΎ–+?Nl?Q 7R[ηƒΉbbサ壬ユ?? c,豕?)?εͺΌο½ΏhοΎ›?οΎ„?Eワハ?フ?$丹゙サ5Sr?!リ1リ聊アIη‡—XοΎ•lο½±???q|=ιΊ₯lHL融ク。dοΎ‡\0C\n09?ι‰šο½―OοΎ–??ε–œθ”¦?鳬Bイスワη₯οΎ‰ζ›‡???Uュヘ^\\ンノ坩?)Jゥ\"櫨\0ο½₯)@)JP\Zォ?οΎ‘?5渟?ηΎŒο½³ι ‘θ΄…(ッ冬ミcXeI%u-リ?NοΎœθ‰3?tο½½οΎ€ε’œd??降場ヨ坩婦ο½₯οΎŸοΎ…ηΆΊοΎž@?οΎ‡ο½Έο½?Jーネ ζ’ƒy5?ο½§iοΎ—Zサゥtン?οΎ‰uο½₯゙ヘcp?Q?7(οΎ…I\0θ£…8ネ菩?%dq9?レウl?:ο½Ώ Vο½»xs\0Y\0\'98?チッ@?oォ駛%U$ィ??。?\r\Z?)_?壁>_Z゚?5_εž‰?.ο½­ο½° d ヲ28?+οΎ”??0οΎ†??οΎοΌžοΎ‡ο½» エ?οΎ•οΎ—HZAο½ͺOz「ネQ?*ネ゚>谺粐ε§«η”³ηšε‰–2[?レシ。9Gο½£fャミz?キラ。i.?zM?)゙θͺžο½€ο½―d οΎ…ζ―«?z菰:η›?;δΊ‹οΎ—! .\"フHTo。?#?マJン]Kο½₯hzt?οΎ›Aο½Έ\'?ィ蛩sZCィο½ο½΄nイ危Ufば?οΎ‚6YV $w? ヲナgpI瑰ヘzfο½²zοΎ’?\0Bζ…Œο½­ο½΅{mε †s?9ζ‹Άホヘァ\0θ€Ώc??@ャ;g?Mr\rε™‚θˆŒk?FH8?>οΎ•οΎŸοΎ•XFアマg%οΎ’οΎŠTοΎ‡qοΎ‘7軽チ?$?)舐=ο½ͺο½Ώ?,ο½²,?;οΎ…p8纜?G?+οΎ‘JοΎ‘ε…οΎ‘~NοΎ—_%rマij7?3m\rζ·¨Gb}οΎ†9?8柳?C!。キー?ο½Έζ…Ά}οΎ–Kmf*TοΎ‹wo^}jヲ?.tοΎ”?0[?!?W\n0οΎ’qι»₯οΎ„ε€›ε―Ώpε‹™οΎ‰?ο½Άjヲ^ハ? οΎ‚e\'=?。#oο½²I9$?[?\Zm9?アャ笛O*Nユ堂チノ*yο½­wtοΎ‡W^[uZks??9MοΎ„ε‹˜\Z\'οΎ‚;ζ²ŒεΈ‚?ο½°:[F??[ヘ ο½·?!δΌΈοΎ™H?!}?>筌?#エアy?KθΎ¨?葉E dq?0?οΎ„θ’‘?Icο½­\"ι«£ KF談x ?ο½Έο½ΊοΎ‹l?ο½·ο½·ο½₯g?>%ο½Όθ΅­iVVE)&?vqP:6q>ο½₯4ヨゥd??攀ルヌq邁?X4?Td]NοΎ–?+?οΎ‚οΎš?(A\rβ‰ οΎ‡9?_ヒ牧」DοΎŽοΎ‹h?0 Drホη­΄?゚mレMO]??セ期Eο½½ο½Ήο½Άο½±@?οΎ…\rΞ²\'ο½Έ?ο½Έ?*qstε›Ί?\n=?οΎ…η΄‹dζ‚”Nζ‰˜οΎš?マ。dk:Rο½£xワ#ο½―η―‡οΎŽT???mBο½ΏοΎ—Xヌヲ?マζͺœο½Ά$??u ο½―θΊ―+οΎ‰t??οΎ‘οΎŠο½·?&??Oο½­Z1リlοΎ‡ο½½kq9ζ —θ‘„T?ηΈ¦?ε†’?a,? ;y^{οΎ–=θ‘„Xζ±?ζ—… HVld??-Q娯`ゥ厰Z%οΎŠδΊ•F゚び?,qサ肉??5δΊ«C?,?)qο½’棚N?HSο½·*~ο½Έ?&ォ卿:οΎžΟƒοΎ–LZο½±ε± $ο½ͺζ²ΌR}?ο½·=?<マο½₯θ Ά??ο½·οΎ”οΎ…6エノ.ο½€ο½Άο½ΉοΎ’ο½§s{i,οΎ„?ο½Ό?οΎ‡?8??M?,-οΎ‡\Z 0!??=ο½Ώο½₯p[ワG$η΄—#ο½°+\"ο½|< ;厨?\0_ο½ΎeοΎ”Z|゙u ?Zン|$\rοΎ€eレsリ$?ンサWι›™ο½Ύ\r#6ζ’”ο½ο½’y?/\"[οΎ™n.Q:οΎ‚ο½6s???゙」セ#οΎ…iο½ͺ逬Vο½°iιœ§οΎ—i?y?pΒ’ιͺΌηͺο½Άο½Έ?=ο½§-?οΎ“οΎš?ネ?ヘヒ(9ネU8口●\nοΎ‚?マィワワC}?οΎ™οΎŸοΎœ]ツャ辰 D?3οΎ€οΎ™?ο½³εΎ­]x??エ^[拒ュ。?胴「?%ο½Ό=J?3f73)\'+ンO#兼マο½₯Mt%ο½ΎεΈ―zスヲウヨ\ZM゙ο½₯e?+oεΈ―οΎ”ο½°A#θ¨—ο½­?ε₯¨ηͺο½Ί?\\:kヘゥiο½²|η©—θ•ͺk)<ε›³ζ₯―Ο€3Rコ湘[ο½ͺο½―θ’’??\0ο½ͺ&釣Y朏{ X?ηͺ―?οΎ›οΎ†H?5?~ο½§?,+_?η‡Ÿο½³οΎW?θŒu-ο½Ί3οΎ‡ο½½??Jο½½t?8?Xm?29?\\?エ2G?U?\"];Pコセ梜。2シエ (r?7~O゚ソ?οΎ—:?2+0\'\n?6 チ??\\莞mR[k?οΎ‚I?;rネT?Hロエ?3οΎ€?豎llXG&q,O 0ο½²?%<ο½Ό?(??~9ォ/ワゥ~?ο½­οΎ‡ο½£ο½·?0\\,ャーx?οΎŠη—ヌィヌ?ネι¬ο½»c+ワCiPF\n阿<+゚?ο½­KbmηΎ―ο½ΆοΎ†ζΆη‰’ηššο½Ή;dィ=?枳?黐ラ? W/?θœ‘U\'?ο½±οΎ‡θœ΄?8\'?ε›‚e゚]ιΌ‘-*οΎ‹U勁YοΎ‡?ワ@οΎ†~?Zγ‚½οΎ•n??ο½ΌxοΎ–e\\eFοΎ’y?\0ο½­H?vο½₯suekoipZHm?2?リ>゚_ο½₯CοΎο½§οΎœοΎƒs$mLjοΎ€οΎ€?WοΎ‡aIIZ:??ο½§οΎ“οΎ›?icEd??+ο½³P?\'οΎ‡k3mteチ??+ο½ΏMο½±οΎ›i9ο½ΉοΎ›U?c゚=ο½ͺ?ο½²/e~RYο½ΌοΎ‡$?&?\"ロトヲ>+ッ刧uοΎ‚ο½ΉοΎœο½οΎ—οΎšy>ο½§οΎ’ο½°?9&ア冲uθͺ°Iο½η•ŒsοΎ‡8ュ屑5h?O?`エサュゼο½Ή&?ipO!εΎ„O゚ア?οΎ™%Qlο½²??ι—•?ιœ“ο½§|a7?:οΎžοΎ‹οΎ„?(οΎ•7cοΎ“;sSο½₯yfツ櫨\0ο½₯)@)JP\nR?ο½Ό????\0レ ^γ‚žε„²Yaォロ?37ζ —θŽ«v?2フ\0>?Wο½Ώkフ_ギ?O?WοΎ†?οΎ†?K QaοΎ‰t?7ォ3轒ヲ\0 萒ワz?y>゙dハd?(οΎ‘ο½’MοΎƒ ?yレ ?5m鐓V?+ユまー庁Eldο½²εΊ§}xゥ:y3οΎ˜ζ–Ό\'??ο½―Mο½»K3gォ@?.?a縷゙=ケハ??j?9~P\\?ο½€η’ž?豬ト「ニ7#\r??qタ?9ゥナ36ィ績a\Z軍ナ璾?蘒 ?8οΎ€>暎X?ο½­?οΎ’uη˜‰[οΎ„θΌ‰\r癇A蘭\\εη…Œ?。y?VネWsD瘧?0゚C樞「=ャ??οΎ–ο½½-Wv粐? ο½₯ο½·2?6ィ?4dgzアンサp!Bι„’+,ζŒ«οΎ›Z,ο½Άi?ζ΅ΈοΎ‰oo+ P?ο½²?N>??ォ」Oο½³?ο½§g|ο½°Cエc??賓ヘ#瀑ス?yu錏]ε²Ά?@??qキ色A=ο½ͺ?+ο½₯n:Vm2レレhηͺ—RN?u?ζΈ‰ οΎ‡οΎ‡οΎšο½¨ο½³οΎ‚Oεž‹οΎ‰η³Ί5?|スワ6οΎ‚Ek?:??ハ?+7ゥuィン??$??2ヌエ1 リマァ?マタ?ο½°?ο½’6ο½’ο½€οΎ‹?? ?ο½Ύο½£οΎ…[:?J?チumο½ͺ[ι»θ·Œο½¬οΎ’οΎ’οΎžοΎ™ηΆ›dSθ¬ ?ο½°οΎƒgοΎ“ο½Ήη‹ζŸ―F|_e稚h[οΎ›b?チ,N?>??ο½ͺ??οΎ‡Piウャ?zt0θ–„Y?!#?\02οΎ‰^マ\'οΎ€g2\nヲ0O#。vοΎ€d壯チe@?ε’₯οΎ€?U峑z^?n/A。?{i?]ヲ0 !η“°A 携ζͺŽ5Mkο½§ζ—¦G $\nGο½₯hοΎ’θΆ…Iο½³:C?カシスヤ。o P?ο½°?)!゚q?\\aο½³?ο½§??r?ャE|V?*οΎ—\0?w\0ワ?Wi?ο½Ύ+[tο½­?oォ?。jーコイレa$η›Έ??エοΎœη‘©;Tワ?ο½Ίh6ο½ΊTJ?\\ッフG2\\エ?ο½Ή ?{??\rrマοΎ‹Y?&。s+M聒エ?)οΎ‹c?リ?οΎŸε’¨ο½«Wζ²“οΎŒ?&ο½±?>ζ€οΎˆ|ヲキ?)οΎ‡ηˆ6蝕ゥ頸?67Vホbpwο½· ?1οΎ€οΎ†}jθ‘²=Oο½―|οΎ•ο½Ύι‹²?(嫺欝?&,ο½€οΎ™<δΎ΅I豬ッチ?>ο½±ig-?ο½° aο½Ά?s鴆?οΎ“ο½Ίeζ¬’ ε±θ‘Ž?-伐キο½Ύη‹­城^&oο½€K?\0ο½»η…‰εΉ•?$tセソエーラ。9n4k[ο½­Q蜴9?οΎƒε₯„ヲARFrsY??οΎ’7ο½Όη’°[?;?#Iγ‚£οΎ€ε½­?=?F;οΎ•3?ζ“§οΎοΎ’ο½·εž“ο½ΆH.ο½eJ??ネ \Z?r\0οΎ†qレエ螯ュ.ο½’d?γ‚ŒC?\0οΎƒRx?醴コア}.RοΎ‡|??\0\Z)ホ\\ο½ͺエoο½Έnt6?οΎ”οΎ–?ε””οΎŒοΎ’ζ£š?\'xンマοΎ€?ネ?ι›–οΎ„ο½Ώ?εΎΌ?ο½§ミT?芟?xS?+ネ?1οΎ•?ο½Ύθ•ŠYTο½Ήζ—¨ο½ͺοΎ’7cη›‚_)yO佡?\"リZ?ο½»4ォ吢?3 。喇?チ]γ€οΎο½·ι–‡οΎˆシ邇^;pハォ?z,`ォfθ΄„5;οΎ‹ HdοΎ•Xウq8g?Oテ携閑?\0ャ\"?^9l\"\"?;exοΎ„lοΎ“ο½Έc??Eο½ΏοΎ… uο½»ο½ΏοΎ‹ζ₯2I犁F%οΎ† s?c?=;V叟コGP??B?;t+η™ͺF务?? qリκ琅\Zο½Ύ?#?{-fwNοΎ›?7:レο½Ί?oοΌ›???)θ™Ή?9ハ「Ntロヘァ4Nζ―›οΎœοΎ…jοΎ–?f ?<ο½€茎譲ィο½ζ¦•4}OW?4ο½£%?;ο½―;ο½Όο½²?ホ~?οΎ—?qp5{=Gο½§?(? @ο½Ύ\Z*\'ο½Ώ??ο½²}r+_ο½½\'ο½ΆοΎ‡Ewο½―ο½Ύ_ι·―/ο½½η―­οΎ–aлフH2ο½·C\"ο½±?;?qコォ珸Yi?$ど袺?θͺ…-ュ弁竚?F$ο½±οΎ›?=アヘzη―©οΎ„ο½­&=帝?ο½₯οΎ‹fοΎ’\\捕οΎƒ!>E.pοΎ™?ο½½ο½ͺZοΎžοΎŸο½ΆοΎ‹詆ヒ\0メ熕οΏ₯vοΎ‡o|οΎ”umι–Ήb[5??zy属$p?熬}3V?qRマXοΎ’?\\I?8ο½½ο½―?リ ιΆ«οΎ‰?ο½Ώο½­N?<ミ-ο½Ί{Vο½Έfクゐu@Zι₯Œb\"RοΎ€οΎœζ›°??οΎ‡N? ゥlU%ο½Ύgf謀 俘?εΊ„ο½½qマヘ\\???\0??\0m*ο½Ώgンwο½£ο½­?4ι‹Έ4ζ›ΌοΎ™οΎ’a$ο½­tXο½³ζ²™οΎ™H9ンホ\0Zゥι—fο½»ο½i1?逌ァZο½Ά?X?\Z^οΎ‡\nyv??>テ壓セηΆ±ζΊΆ\"仆セc?9m??\0臓O\\V4??VOXζ–ˆg{??Cリ榲?篁#蒁*/.ιšͺ[Z_οΎ„ε“˜ο½΄?コ鱆」?#BdXηͺ?3οΎ‰?レュ?D?ホHοΎθ‰˜?ゥ`q?ο½₯ヲcBεΈ図怋?οΎ›Mο½¦οΎ™οΎžοΎ…,Мrav\0?.゚?:ホY%蒋m-εΏ…ζ“”KV6>Y\ZンqRJο½―9ネ??k οΎ€ζ–½?&ζ›°@ζ‹‘ο½³ο½Ήq?~ο½Ήο½εΊš<?θ’—n譜uNsι΄Ώ?θ»…t?ο½²vmοΎˆθœ€x鉐η₯οΎŸYοΎƒο½?w」ゥJ求-フ+!UοΎ„A? οΎ— ?ο½·?チ#οΎ‹οΎ˜η°‘? #U?\rθ‡ \'ο½Έο½Ί&ηͺΊοΎ9\'n9>ο½Όwο½­%ε—·v却OイスィZi?3xοΎšοΎ•οΎ”οΎšθ—€ ? Dh=\nD搾?#οΎ’ο½Έ3荳找[7u)J?4ο½₯()JJR?Rη±N?ム杖η–±ο½·οΎ’゙ 9?C フ<ォ$r,ゥサW法pN9ォ?(挈圈/οΎ•ο½Έο½·$btルマ???ο½£拏?ο½Άο½·IL!「コャφ=ο½Ώ#]?>??i?6ォgヲ?;5=9ο½οΎ•Ysο½Ό(_οΎ€ο½’Uη¨—ζΏ›@?ャュ}Z?NοΎ—ο½’P#ο½ΉRο½Ge厨5>ヌマWIO ?9aι–˜?ο½­NリIj嘢レ.ο½§iハ\0?3JT$?ο½Ό?θ–©jοΎ—ο½ͺ?ζ€―t\rο½ο½­\r?ε­ΈC!\\エlε–šο½΅οΎˆθΏ―ο½¬{?????ルィο½οΎ’ヘgxュ嫦;n牙9?マ?#?9ヌ。biWmo|%b+x娟p?聲ο½Έη·»(?({ζ·οΎ•οΎŸο½¨[οΎ™Ewpfο½ΌηΈd醐?\0οΎ’οΎ„?+qο½₯οΎ‘οΎ‹ο½±ιΊ©ε€›KTメ。]=4ィユチ?v?ヲOο½ͺ??x割メ,ο½―?xο½­Nネk :4BTrJο½’\rο½»?.pF3彙ィ?Wο½±(耨q_。X4K?N $2I Dο½²η—žο½‘ο½³?{s\\οΎ’οΎ…οΎ†?N?\"ο½Ί?%?ε“e$,r\0J($$cο½£l? ο½· ,2J?οΎ„ο½©εˆ»???οΎ–οΎ—}g`。 ;a%。。セ。?ο½ͺο½―ο½²sο½ͺ?8οΎ†y?Q?ο½§ο½§Yィ憐>qcqs瑁ア!?2LEqホ8ο½ͺοΎ‡%ι³§Q%οΎ‘οΎŸu;=Nο½·οΎ•u[ッンア/?;(27οΌ™?験?οΎ•rοΎ•/:gゥコvhl\r?V4ハ聴? οΎ†?θΌ… sοΎ†+Gエ^?ο½£4?8}フqζͺθˆοΎ‡ο½₯lO?\r:Gwο½§,?2I,N\".?? ?οΎ„θœοΎ›οΎ‡ο½ΆEa?WθŽ‰-隲??Gィ?ο½±cォiοΎ—οΎ‘ο½₯οΎ€+)1ο½¦οΎœθ’Ÿο½£a?ο½½^??}9uο½§_ヘュ?ylアエQコャ6?οΎ‹).?v怍ノ?ο½£?ι€ŠοΎ“οΎ†{$X諍??;οΎ‘θŠ™εƒ₯F8ο½Ύο½ͺnエ「?!ο½»Q。臓8VOFネ98>。択ッォ5?4οΎ‹?:+?\'y\0G@οΎ›οΎ–<ο½±*θ©’ο½ͺ>ζ’³η”œοΎ–-sο½£?ο½§oャ?」「モ伏M?4οΎ›οΎ…YpοΎ„8Sヲ9θ‰¨οΎŸοΎ‡6?KE妄&シフッ。ンΑ塐sοΎ‡οΎŸοΎ–ο½ΆοΎοΎ€]+EοΎ•5ォ?#Xο½΅ε‘ˆ?MvοΎ“ 擇煕チ|v ハ。^ォゥテ4rο½­?f>\ZοΎ…cΠ­οΎ…ο½Έ?ζ¨Έdι—•7Wε‡ο½΅ik,6m?%?$vη„Όο½ο½£?#ο½±?Zeε‘žη†ΉοΎ‹ο½­ο½―LοΎ›?TοΎƒο½’??Ecァリ?レ?J8?VοΎ†L?;?&ォMgァリj遊レο½5 %vXθ‹£レU?οΎ‡ο½Ώ?C?\0?。ヤζͺ„F,7ホイeK31οΎœζš—!εΆ½θ­¬oο½ο½’{?0ο½±X?$?伏ニ?lネサ抱;J+0x??_1ο½ΉU|68ο½±%ο½Ύa?蓿黍1sο½·v1ζΆΈο½₯aο½³?ζš—sヘi??+SοΎ’θŒƒο½§aζ¨’?./ο½X|ο½₯福??`遜F? 3?8Bο½’v?\0I弌$ο½½s?.`黯悁mG@οΎ”n,οΏ₯チ曰ロF??後ソcι©€GJο½Έο½ΆXu?1ヒ墝8?οΎ†οΎ˜n\0+οΎ‡9?οΎ–|\\AM?7ο½²ο½»ο½Έο½Ίο½Έο½Ά1οΎƒoQn?οΎ„gH?cεΈ‚?P?οΎ‹?*Iο½€??X|4~ζ†§ο½Όι™œ ~?ο½ΎXο½ΆοΎŸθΎ»Π—?ζ·†??οΎ†+Z???U。ζŠοΎ–οΎšοΎš?ο½Ά[7{kaフT?\"?}3ζ–½?アハ?Q.フ?f-ιœ€?+?q1g歒。霸0d?#?я??*U?エ驚? P%?οΎ›?:?ο½»;s%ο½Ό1TιŠ“5ο½±?/期\'JFοΎ“h\Zd釣lFク二0? ι›‘οΎšο½΅θ—€ο½΄?,\Z&$?\0v9?\r??\n2@}ο½ͺο½―\Zζ­Έtl>ィ?ォ??ε‹΅οΎ•οΎη‹’εŠ?$ζΆ›?PレROο½₯? Z?,2οΎ‹ ?.#,?ゥR\nο½ΆAη‡ΌOο½­SοΎ†sοΎ…sGup?#ヨエX笊$Wο½·d岬ミマο½ͺ5フャbfiZ\\,Y$?=ο½±?ο½―ο½·\Z?+θ‚…ο½8レc∠ュp?>??テ醸丸ャエi。96ο½·?ο½²ο½ΆmοΎ„?\n 唐; οΎ•.K9η‹‘Z7l?6ワ;gο½Ώο½½UF4οΎ•οΎ—οΎ‰οΎ—d。ッS? qοΎ‹uη°“%ο½pO~k&ヒィ`θ‹₯Kロヌ砠ヘζͺŽC_4ο½½?Vシ呰゙ε₯H??\n?$エ)\"イ燐??Vb``レ7ι…–nィ榑ヌ?ε£°[? nοΎ†οΎŒ?_゚?OlοΎ–οΎˆι­„ο½‘ο½Ήο½»ο½Ύ?$ο½·V%1η­§ε›?%r\0οΎœη½…r+ヘ\r樛マWy?θ‘·62ο½€( \'o~\0οΎ‰?ヲエ ]?ζ Ό????&οΎ’οΎœθ˜—οΎ˜?>?y^?JZ?嫻ヲ?οΎ”οΎ–ε£…Q,3hS[]@β–Ό0ネ|ι·™wο½±η³»?;キ。Pο½―4m?Lkvο½ΈοΎ”?.??{vb?yοΎšοΎ„? ?=θ…”θΏ‘?jwο½­u.?\rοΎŒη”°j<qvοΎŸοΎ†ε†’?m9_ホー5οΎžθ›ΎH5ο½»iη΄Ώ.η«“P嬬@ε„•wsエ?>??οΎ™ο½£?阻f?ο½£οΎ’ηŠ–Y-.レBθ ‘ο½»H(=マs??」ワjοΎ—f粐gウイ杖Kο½·$歸マ?Wο½₯ο½ΊηŽ‡?οΎ‰η“©ο½§οΎ™οΎ€?)nοΎ‘οΎ†;ζ…ΎοΌ΄ζ€™\rT?GLイエイキム?I?xοΎ™ο½ΈοΎ‹οΎ‡7ο½Ό?\0zο½»?躍Cο½€k;n蔦l?ォサ。ケ?8οΎ“}ο½Ό2I?θ€»?ネqュ?帝t?ο½­ο½ΊCォコVUンマソ?c?ο½₯t|鑧ヲ?&οΎ–ηŠ¬Hη·’$(ゥ$?ηΎˆοΎ‡\'=?n?エ6炬qチ堕ィ\0g。p?EοΎ”ハ??οΎžε†–??ン?pBοΎ€;r==?sウミ?eο½ΆοΎ‰ο½Άi?2M!!I\'?}\'?kο½£ο½―ィ^η΅²ο½»?.cYο½’rA>?L? チ\rフSマ!ン*ャQο½·?ο½§ο½2I?&ο½Ή?&ο½’?a`魎ケュE&θ™œοΎ‡)η“ŠοΎャニ}ι„‚tiε£žοΎοΎ“?;Eο½Ήε»‘|K???ο½ͺ{g?W-N?RοΎ’n6ロチ-???%? wθ„£TeοΎ†ε²ŒοΎ™i\nヲAη­°;δΊ•8οΎ‡$?<Oο½½B珠。{+菊srη²½2ZgοΎ›\"η‘―?NGq??oRjοΎ–ι€Ύθ››bHH??9;?8聒ヨaο½½?q?+w?6\\??\0θΏΊο½Ή??ο½½YLο½·!ο½§ο½Έmャ」z恊A8胄。ο½ͺTCgMソハM{5οΎœοΎ‘ζ€‹移ワd鯨ケ豐R5耗ヲh「ハ?7?\0S?L\0+菓h U????\0ο½½u゙ホ粒D_トチニ?;gοΎ”ηYzθ‚±οΌ₯οΎ‰BH???ο½₯用卒 ο½Έ?ο½­vι―‘? ??ο½Έ?D廷アレЯ「3?ο½Ή[:/\',マォE> ネ Wlο½­?t<ζƒ·οΎι€˜οΎ›dοΎ…Q%ミス3uοΎ—?4Nθ’–i?エ∽?7δΈͺホd?οΎ˜β—‹?Tォナ_ο½°Bο½Άο½₯οΎ•ο½Ίο½§οΎ„;鏘ュエエko?\0θ‹‘AζΌ•b;y\"n;W。k?3ο½ΉWチシzο½₯+\"ツ櫨\0ο½₯)@)JP\nR?櫨??\0ロ葍?\0z|,。?hηͺƒtοΎη°—οΎŽY?エトG\"ο½ͺ? οΎŸη‰Ύ-οΎ™clネ>vι—•E?\r?ネt? ??G8???(ο½§??4?)ォ」ィ*ハF ?ο½Ώ95M?ο½·οΎ„ζ‹˜ο½£ο½ο½―ο½£ο½Ίο½ΊοΎ‘?οΎƒ?5レ%ε›½dε·¦?盃%rpr2qε₯š>董捲6s迯ォ3?2Y?)??゙+?ァ昏\\GnοΎ‚I\0&5#?#οΎšο½­οΎ—6ο½½Ahο½Ίο½Ύζ§“?.W?医%~θ€¨οΎœο½₯S$i ο½ΊI@ι»₯゙??\0εΌο½¨εˆΈοΎ–ο½»8ο½ͺζ™’V??%@*ヌミ竿シヨ,,ο½ ο½Άο½»?.?8 q?οΎ•η€Žο½’Iン\',チテc9;ε΄›?Zθ—Ίο½ͺ|ζ••3[ャ謀ο½ͺヘш%y?w?e?q??GリBl\Z?d?mβ€₯?爍R9aβ€²ζ–½f??!οΎ–οΎ—I=洞S#Dο½³x%?89\'汁~舞ο½ͺリC&ゥ$レ HοΎ–οΎ€ηͺ―οΎšοΎ‘?2J?ο½5;ンθ΄“6H-Iο½Έx ο½²60ο½€1οΎ€ι†ͺοΎ–tθΆ…J?ο½­O?エZ|?ο½€?4?\\?3 8 ?\'ε₯¨ο½»οΎ”eοΎƒοΎ…s??%!Gwa?=?8♀ツユdvuqο½»\0\07θ‚“\\エ蛯瀫{ο½£ m$g8οΎ‡pHοΎ†iοΎ‚?6tjο½Όθ©©pη¦ΏοΎ›οΎŠι‡›Tο½·H?οΎ–?7?\0-?--ο½₯ugI:HWο½± ?>ο½Ή?^xηͺ–θ΅°d? οΎ‡θΏ₯ε£°ο½΅ι€…ο½‘ο½΅ο½΄ο½ΈζŒΊοΎŒwοΎ… η·¬ポrο½₯VQMS%3cο½­η™‚{ο½½ロニユ耨5]ι‹©οΎ–οΎ–?-ウ戍代_οΎ‚?RqοΎ†;οΎ•?η‹½-<οΎœι©€Ch4坊o7;οΎ—$θƒž?\0ο½²vοΎ†?θΎ+DOcィ?\Z}η’½yο½§?\0?[ο½³qa?vy?ε’«οΎ’?Wモチエシhフ[竦F?#,=?8マ゚?rxο½€οΎ”ζ–€}\Zε±ο½Ί]?>δΊ«?iοΎ›οΎ€?οΎ—q?\Z2ο½Ήr?ヘマq錻j?]8tοΎ‹?゙1οΎ‹qzοΎ–?E/θ‹…? cο½ΈP8>δ½»l?ο½±?Oァ。y?7_゚-οΎ”ο½­n?8bワ}ネ?3戌\nο½°?Aιƒο½Ίο½·}フ;??ホ9ヘCοΎ›οΎ˜^゙\\エ「「」??lv\\?θ²ο½ΆOaWH?!<6}θ‹Ί? ο½»?ο½·?A]*]Qο½€\0??fο½:VγƒŠο½€οΎq\'Xレ]G[q2οΎ„eBο½»?但^゚ィ??,ο½½&ο½Ί??75?ε°€4巌蚌?\'?οΎƒ?8?Zε³­ο½’ヘ.+?dモテヘ;0V? Kソィ8?οΎ•?溲”ゥ&謁ヲエD4οΎ’οΎŽο½??Yο½Έzο½½Yο½Ύ |Hエ?\Zレo Lη™˜yο½±#ο½ΆοΎ–*3ο½·οΎ”?ε°‘G????ο½Ώο½Έο½»ο½½οΎ•ο½?εŽ–Gη›»,v?}0?=ホ=?\'ヘホォDε›³;mゥOュヘァ[γ€ˆvο½€Gο½ΊiοΎ”???\0ο½ΆοΎ€9θ€™TwRiοΎ‘AィワKm~ο½Ί?) Gο½»o\"L?l\r訌?jシイワ ο½Ό?NC3Vι—ε–¬???Nι§‘Rgコ。モタ?Z5θ‹œοΎ›9θ””=ο½³οΎ…]οΎ…ο½§bοΎŠοΎƒοΎšοΎο½¬οΎ‹ο½±2?\\??t?>5η°€q\Z?vTppO}Gι€7鬲?k域クAο½ΆοΎ…iο½±ο½€ v紬?佝}sヘFGοΎ’ε€›οΎ˜=?lο½±ο½·cε°‹ο½Έ?JォrοΎƒοΎ“εΎŒδΈ”Iθ–¦FιΊ₯>??dο½³Mο½£ο½₯?οΎ—ο½·?ο½Ί$οΎ“ο½£f-o\"4Hb|ο½€ィマ?ql!? セエ潅懣i< \\?.|クノチヌィィ树ラBο½·οΎ“η¬žοΎ‚?跫リ\"??\n?|οΎ‡wθ…οΎ–ο½?gcο½€οΎ‹mr妨?\"?bン\nI\Z禊倧3?ο½»V| ?Fθͺ柧觜フ{ο½³θŠο½³οΎοΎ†0\"ォv? οΎ‹ο½Ύο½ο½·ο½£(2g*H#pチ?;?ミ゚シ@ш \0aο½°リ?~?Uο½³+Yο½»ζ› d? Ktンマ〕飴#ο½·=セ。)οΎ’zuθ£”?η–₯o6οΎ’G?0ι€ο½Έ ンsοΎ†NqοΎ›??5οΎ™?,ο½l??]?qm\0ヲ0??s?=ォq5?ホチ?[οΎ™ο½’ο½·y見?;?#?9\Zο½ΏοΎ›tgホンι¨·oゥ>%ulο½°\\?IεΎ‡Y--η§£??\0zsヘRο½Ύ!t9?\rJ?K?ゥ\"![*c<ε½­d?ヲ}??sοΎ–-3οΎŸι–Š^δΊΆ?? uJD\n\0ο½―ο½Έ??;θ“΄Quネu)^}B???yε“?ο½ͺ国ルマ?01\\?効゙?Ouο½²ο½Ήcο½₯゙鷏? リDqd乏οΎ’}>ο½Όq^ζ»²aοΎ‘? ο½€οΎ€ο½²?3?v?Vε‚³ηΆ™ι©š?θ’ΏzWε‡οΎ•ο½ !ο½ͺ*gn\0cマラン?^Iヲj)ィ|ペ?&! θ‘€οΎ‡ο½·,9ゥ艀?\0ulοΎ™R=ο½Ί?M怨m?1οΎ…9「杳歌?η“£??マ?^u?iレο½ο½§-?]j!リ,hj?9f゚\'ε’«\Zο½―Ujη•₯θΏ°\\mοΎ‰?セ萡?ヘJ?J龜Uο½§N?エq?訌\02HR=?θ—Ήζ²Όη­Ίθ–€ο½Ή7οΎ‘-οΎ–]Kィa?ma3rU?;ο½·?>??*?ζ΄Άο½ΏοΎ’εͺšοΎ•ο½?ο½·lE\'9lο½·??οΎ‹J鈩?οΎ•iο½?2[ZFrοΎ›?\0οΎ–ο½₯tK{?ι€ƒοΎœM?ο½£\nο½―?pA?=s?ο½―GοΎ›o~οΎ™Dζ΅Ήm??ヘ?οΎ›?623ο½£?6?οΎ™ レ。マYZοΎ„οΎšο½₯ο½ͺοΎƒο½ΊWη±³?\0r@?οΎ‘οΎ›ュアゥMaο½’?θ–&?\ZK/\r?!%ο½Άο½οΎ—$聊。\rヲ冫qοΎ”Zmげ狗T(rムぽF~ο½»rkヌ燃tYο½₯οΎ‘jι₯‹ζ‚³οΎ‹ο½»{憔チonAiU6賃?ζ³™?R~εˆ₯?エコヤ\'ο½³ο½ΊοΎ’ο½₯inηͺƒ*d?チvθ’ο½Ίε¦Ύ-4οΎ‹_θΎΊοΎƒι€ŒP$fV}?ミc?-3Bο½Έ\n?ο½°4οΎ‡x,ο½Έbf?F*οΎ‹ZEο½ͺ悦ャο½,η¨Ύ=-ο½€ε’ΌR? οΎ‡}οΎ„p?gο½·&ケナq|ャH\'朧?cε²ΈNε·½\\?\0οΎ”οΎ†ζ ΄οΎšH2ハ?%οΎƒ?,O??\0ο½½Bu=?οΎ‘ι‰ΎοΎ„ο½ͺ?Hο½’<\0;~ο½ΏJοΎ•EVコレ?οΎ“nヘζ”ͺycοΎ† #pο½€py??η­¬iοΎ‘H゙,0ηš†οΎ‡??οΎƒοΎŽN?=??*οΎ—oο½£OqtοΎ’]ο½ͺ硎?1再?n゚゙ウεΉfハ-?ζΌ•%?7ο½ΏοΎ›ζ­“YZο½²?ο½Έ?6法B戌y?\0嚊ソ?-θ·¨2? ο½ΆPw\'?\nリコ漫 vqLjN08,s?=+Yuο½ͺ?7?y?qζŸ”Zο½²TCD οΎ’<ホ7ィ?V?S)\Z?*ο½Έ8??;θ‚ͺリ?$η”·[:&8ィ?F]??gJοΎƒvX?95。?cο½Ύ?ο½Ά?iο½ͺ\\diン:SRζ€Žγ΅+?\0?7B#a?*ο½₯fοΎ‰οΎ–?ミヌ睇ツ?ο½€ο½€ο½»KοΎ‹ζ±½wο½Ή?\n??ο½·?ハ mο½²\0$M]ゥJηͺ–5ο½₯()JJR?Rη±ο½₯()J^c?ο½Ί?%ヲム?袊zI+cゥs?ο½€??,ζ·‘+?Oθ–―@J?u^[[^ルヘgyoヘエ?SC*I?YOH ?ηΊ›?ι‡Œ\Z。G?u(?。yHF;?=?G??j[ォ4+S1?Eζ·‘w1ο½£0ニ笄?q?{οΎ–ο½ΈοΎ—4-C睇ト}Sο½£ο½―ο½V0wFοΎ™=οΎ‡οΎŸζ΄½ο½¬;οΎ„ο½Άζ·žο½ΌθΏ¦?゙法fR{Tη‘œ?-gE彜颫?\'?7r産セタsοΎ‡οΎ’ο½’ο½€C ?「゚?\0?エ蹙ラaοΎ”tο½’?Iο½Ί)e?ο½·TοΎ—VEaοΎ•δΈΉο½?3ァヘ耽??I#\\pι³§η‡Ό?fεΈ«?ο½’\nοΎƒCウスミ?\0x$ο½·2ンοΎ’?ζ­΄??ο½ΆN?Fチ?篏エヘ#TοΎ“5K-wOqpケ本k? u>~ンネ?β˜…?ο½§d&イ゚42?2οΎ›r3?ι‘šι‘ gI?+?3J:mο½Όο½³[H&ティa??οΎ—δΎƒ?/[%?jWο½Άο½²Lnmο½’εΆ‹οΎ•οΎŽοΎ…??οΎ”Tο½β–²οΎ€οΎSqk?%Β’O?? 7ο½§<X1ワンホ呲?シフDοΎ’ο½―Hο½£vοΎ‘οΎ†pq??;\rηŽ„xG賊ッlο½0ο½·θƒŽ?gテq*7β€²nθ‰˜?ャァο½₯Hο½²$t Wエソ$οΎžοΎ‡go(龍[8?ο½±ζΏΊ?ι‚±/οΎ”n?[舘0/エ9QοΎŽοΎ™ζ–ˆRn?8??\0ο½ΏZοΎ”οΎšζš„?? \ZY゙? )\\1\n2I?\'>οΎ•d?-Q,ο½’??.4οΎ“フ7$色rv?yマδΊ€?,听ユKο½₯pz?9?ε‹Ύcキ巽湛パ$l牾瀋モ。l?\0?=Wk?Diε–™]θƒΈ|\Z?。?SQοΎ–θ’΄οΎžοΎ9,οΎ’ζ˜ bLβ”³bοΎ„1憫+ミウ蹈&?4?qヨ.q撀???!οΌ²\"ャg?6?9?。Sο½Ύ|/ο½Ώ??-?ο½£E,{D@]Lンワο½Ήη™ͺ?θ¨ˆο½­Ο‡1ネキ77zΠ₯wゥc%ソヘニ0&PοΎŸοΎƒDEチ\0.?ηΈ²2\rkθ†ŠI}ο½Έ2\"スイヘラ嗀テソ?Kヲヘq聲D?οΎ‡4οΎ„dθ’—*vο½± ο½­ε˜±οΎ•+ο½­?οΎ‹ο½§?ο½Ό?:ュヘ?ο½Ήv|FοΎ„οΎ‰ο½Ώwο½§\0ー璒膳=ο½ο½Ί\'???iksVοΎ‹εΊ |ハヘ93?ォ7\0 ο½―aζΈ«9?<チqィ\\-イチmeJ??εΈ­η—žο½‘P/οΎ•ιš΄?エι§ε›ο½Ίο½ΎοΎ“ο½­??οΎ…nチ|リレ`?-F|?tJFOοΎƒο½­?Mο½ΎοΎ”5?ヘ-7Qο½±Cο½Ί)%?ο½ΈW?.ο½£?m?パ] :B?-b?ο½³οΎ”ο½ΎfοΎ’ \\ο½Έε·₯x$$\rャッ漕PHaι³§\rJ??ο½½ο½½ζƒ…ο½·E「葉汝故\\?8n;??*ι†ΊοΎ‘ι««。ヤコu瞠???L@?@η€˜οΎο½Ώ?lθ·Œο½Έο½ΎοΎ‹ο½£οΎ?\0ο½­?3Qο½ΏεΎΉ?$η·©$?;iοΎ—~θ³½cPο½§$ζ± οΎ€g痴マο½’?ァ柳/?fチ??=1?サ笑スMuοΎ“p[\rnフ?\Z]?!゙=ο½’ο½£οΎƒ.ワ蘿?? ?οΎ”ε›‚οΎ‚-bο½‘ο½¨οΎοΎšοΎ…ev[dovRh恆?Sο½½y?8?f遷?*?]F hu aο½·w(?\\\0r;?οΎ’;9?=?0>ο½€\nワR|皷ο½ηΎΉοΎ‘o?Rリセ?laη…€οΎƒnR;{゚クォ??ォ]?#RιΆ€nοΎ›Gxdレlο½° $8#WεΎŒζ‚„οΎŒοΎ–οΎοΎˆοΎ†εΉxο½³FYt?ym$ο½ΆzeοΎ„??ο½»οΎ„ο½»?ホI?ゥ\rK?:ο½§Mι¬>ο½₯οΎ”t?ε‡…Wチ販ャフ ???ο½’ο½½AοΎ’:oK|+΢尺゚Y4krYο½€w,x^οΎ‘η’ηΎˆ5A?\rCοΎ”e。らMケ顆;ォ?\"ュワο½₯瀑p 0AοΎ€\0p#瓦?ο½₯ο½₯??則tο½ΈnnoEο½ε†Ά?9Pp[ワ}~ο½Ύ?ォ[マkゥワYヘ2ワシR?οΎ›η™–8ハ櫺^ε?ζ ©~觜レヲ弾 !?5YUο½³?sοΎ›ζ«ŸοΎ†??\'ο½­?.ο½₯gsjθ–¬v^RXο½’O 遏/ィ<η­΅y0?8?Kミο½?=K?,纎iο½Άη«₯8οΎ‹1ヌヲ??Mtゥsο½οΎ›ι§’οΎ“?ネ?ヌ。dοΎ™?\0??ζ₯«ο½Ό?4mη˜’οΎοΎ‡Rt?ο½’??η±€ο½€εΌ΅ο½Ύι…³οΎ˜ο½ͺibοΎ…Iノ瀏?ゥ}7SCuw5ο½±ο½°δΈ±η²—_9|;ャ1?εΎƒ jホ^K}tMzοΎ–:l゙jο½²οΎ›οΎšοΎ›οΎ›X^οΎ„?ε·΄Gi]x 1η‡—οΌ²ε½–Uο½³ο½£5k=οΎ…? Q?エqιΉΈο½ΆpT?S]sοΎ”εœœο½ΆοΎ—?η²—oο½€Aο½₯?Mf\0\0?8熬[hθ‹™}ホEOHοΎ‘$ミ?ο½½ο½»ο½·ζΏƒο½eοΎ‹(\' ?3豚~u{r丈Fο½―FοΎ…?+ζο½»NYδΎ―F\n?<Gqニ2}j+GοΎ“?{ァ諦ヨyοΎ…ο½±!οΎ•οΎŽ\ZQ青耨?>οΎ‹?οΎ—οΎšοΎžζŠ‘ο½₯Ki-レチ串隹WοΎ—ε‘‘\'?=???=ζ“˜ο½½#ou,?$Frο½ο½«?8<\"9?#οΎ—5ポ\"ワ?Siο½Ί???_]エタ\\ο½²FLζš–9b[\0r??ヲ゚ンkzοΎ‹ο½€qοΎ‰o$θ©ο½02ο½£h?\0J?οΎ—Z]ホュqsyk*οΎƒmmチg ホQ ?οΎ†οΎžοΎ˜οΎ‡ο½©ηΎžeiοΎ–;cοΎ‘οΎŽbー含\"ィ????οΎ‰οΎ‰&ο½Όε©ΏIοΎ‹θ‹»ο½ͺEsNο½·e??eS,俊]]NCο½Nsθ‹”ζΈ£fャレη΄’?ヲo?- ?#ミ\03?o?ηš€οΎ™θ’œι»™οΎˆYpホ27??ヘJ:^マs2οΎ‰+οΎ…θŠŸζ‡¦=?クォF$ο½’>ιΊ‘?籐シ5塐?/\'v0=ο½ΏοΎ›?\rOδΌŽοΎ‰SQζ‘‘8em罫サ=*δΎοΎ™?0θ…Ί?>A?=ο½²+ο½?/)|レv?f。HvF?貫/οΎ‹\"ο½’E*οΌ•?οΎ”?Cβ—†zοΎƒ?dε–«?ο½ΎU<\0?zο½½HοΎ–&ン?;筏ウ??\"ZοΎ›οΎŒ?6}]?ο½·οΎ’ο½AοΎƒRοΎ”-ホ?6ο½’nn0\0ο½­9οΎ”ο½Ίη²§ι½ ]Ξ΅6οΎ”A?ζŒ‚οΎ”q゚gdοΎŒοΎ‘???gοΎ›?οΎ†οΎ‰bM\nIζ‹΅k??ο½―ο½}ォヲg?ο½°r靑?3οΎ‹r~οΎ•?5?1?7εΈ‹ηŒŸοΎ›mQ ??ο½½οΎ”ο½Ά8uYX\0ιšͺィ27 獸??cο½Ύ??ε…¬εŸ”οΎ‘ζΈ€]8鬨\\οΎ‰ε½·Iο½·@}οΎ‹ο½?οΎ†οΎŸJ? ο½lοΎ’?\0 ο½ΌPο½₯)Xο½₯()JJR?Rη±ο½₯()JJR???\0?ミrk?Y鬩+黨4ZG?(?ο½­\\ィ?8?>s?ο½’N9ネ?C?萎θŸ†@マs?ο½’??\0レη—Ί|&??XoI?^οΎ’GKIοΎ‰bοΎ–ο½₯ウ凍7!lο½Ήbε­€οΎ–?ζ‹ι…Š]3 ?hο½Ώ[XYuOJοΎ‰w\nε‚·ο½Ά??1サネy$q後?ο½­Mォi要メニ?οΎ™hο½€S舌セ?#?οΎ‡η•§R??οΎƒ? v倘尾qWο½ο½§οΎ‘,L7οΎ–ο½²ο½Ή\Z=?螫ゥ?\0ι €T>?$zθ‘«ο½Ώ?ォモ9Zθ‹‘?ワVvο½»??ιƒ’!ο½§]οΎ‰ο½£i?1\'?3?FAο½Ύ7??゚?:持qd?3)η›‘οΎƒθη·©EG?Z?οΎ’η«’?1eki-ヘ?7「荼Oc!^οΎƒοΎ“οΎ›? \rοΎ‡??\'?9ο½²T?7酣汕?8οΎ–ο½΄οΎ˜4οΎ™ζ ½?ュヘヒ)οΎ›η«­ζ§½\\οΎ‚F0OォK?^uRjWZ治ゥH?房xοΎŠη ‚ο½ͺ歟;ι£?ο½½KοΎ‰?4\rζ²™ ォチοΎ†Qζ½…(s十筴?$?-Zuθ‘‚Uj(コ。?ο½ΌH7ο½·-\'?cO陬臭??E梌#ンi?黐Iο½»9οΎƒ1H>Xqο½»iοΎ†y?3ο½£ο½Ί;Rο½Ή:γ‚’ο½ΊοΎž?汚1F?ワ$\rοΎ›8葆^?οΎ•mο½―ο½aエウヨ?ZmB 5ワn#+?ο½°W\'裁9η‡»οΎ˜<θ±•οΎˆη­΅Hο½²5uο½Ά?$顈Vο½Ά1ο½€B瀁@οΎ’8十繽セkη³Έο½§j_ο½½ogミ癇?οΎ†pοΎ‚$eS?Xε€§\'?\rmο½Ύ?iゥkο½°Do?*ホ━=οΎ…οΎ‰?池ハ?* ?0=jοΎ›gοΎ“ οΎ‘b?η½°?R朱#v?\Z6θ‚©οΎ„οΎ€ w?fウ卡ο½€JF?ュ瞠?.モィ.? ラ。ルq犒οΎƒ\'ノ懽鑷鳰9οΎ€ο½½|???:tε–ι˜»7lοΎ€Oο½£:G?\rο½₯ζ‹Ά%T軟IοΎ†*N.?5{ォKο½­i粫YοΎ„w?;I]-η–΅Cη™°pG}ο½­ζ‡Š?/Jι‘Ώη°Ύ?ο½»\Zο½Άθˆ‰?ο½³\ZWホ;d0゚ーィrθ™ŽhοΎ†?ャ?5ィ?οΎƒ{uk3*NοΎ„ο½»ο½£οΎƒι«·xο½­ο½³?ο½ͺtο½½S@]2 ?JmδΉ—Sv?Kι†ͺqネ8<ι‘›w?鏀マ?^ワOC?~ζ…§θ„―οΎ”6丘qgィタEοΎ„?ο½Έe萄LοΎ”οΎοΎ‡εΎο½‘οΎŠε‘·^\r9?9釣? ?*[ \0\0θ–¨οΎ‹ηΉ§;p1??ο½°kO???!ο½°Dθ”΅PャャCd/ 3?3?;ο½₯zο½€z稀「スn?οΎ•ο½§ο½³εΌ©_S?ζ₯”B.柘B&vC$?(WοΎ‰??Oο½­?ζ―¬4ηœŸο½½οΎ…οΎ™?5゙?ζͺŽ?9<*vο½ζͺ¬ι―€ο½‘ε»΄qwpο½ΎJοΎƒ|lο½οΎ…?,Xζ”Άο½£?\'?oο½²,ο½Ό?71Gァヘ}yヲ\\[οΎƒη™˜ε •?)<+(a?8?οΎ‡aU ホーY$ι§•qCη“©ネ^b3?θ”­Gο½Ύ@? zοΎ‡_οΎ•maο½°οΎ•θ¬Œ ζ±²チ(?\\?9ホ=ヘ@?θŸ„θ–ο½·W,V?1@?οΎŠοΎ™~H?0=ο½±ι£ο½ΌqUο½ΆG#}XkFK+οΎ‚οΎ—η”¨οΎŠa雨BqA92Hマ>?ο½­k?7ο½§?5 ο½½[]y?cwο½―Π²g?W?o(ーマスOι΄«ο½³?οΎ—ο½·Bk[戞oS7配ー w?ο½Ή?r]ο½΅ο½¨θŽžοΎ‘nLζ»²?!ン「%PpοΎ™?wοΎ‰θ’ヲメ?&οΎ”OuK>7?Iv??ォヘ?&?.)?みイBHmヘ摑fチ ?\0)ホ\0η‘°ιΆ²s_mη₯ [Wクコ羊3aTq?{釡コ-?\0?Dハ!Rο½₯「免8??kο½­.c6r゙IBpS?ーャ?.\'?4Hζ—‹γ˜WοΎ‹ζ―«\n?tε‡‹οΎˆGoAXοΎ“οΎœι°’j?2B?.\0キーャk拉p\"?θŽ’θ†“οΎ’fGエ?KοΎ†8z?MοΎ„9\0ο½Ίθ³Ί\'οΎ–ο½±/uHXι‚΅xc?\'q.6γ‚±ο½ΊοΎ‡Z?οΎ€?#θ•—w\0哉=? G゙ο½ͺοΎ•SNキネ*槁穴ユ?{οΎ”f?/ン瀏fp゚?1_>\"kOο½ͺ\\+οΎ‡$fワ?.οΎ–οΎ‰?ゥイg<ζ‚ο½±η­ˆu戌WοΎ‰T,゙ス?8θ­±jιΊͺ]?*スセエGC?+-ou}^οΎ‹Eメ潴巒ロ┨キ?I]がY$kο½Ά?q\nοΎ†}zK??wwォテ?Vδ½›knfγ‚©γ€Šο½Ίw*οΎ‘I3οΎ›\0g@9%ο½·址u\'.*ヘ」οΎ’>i゚ ?レ?醐u(vο½Έο½½ο½ΊGフNοΎ€ο½Ή?*ィοΎ‘FrrMοΎžι†—?Rη±ο½₯()JJR?Rη±ο½₯()JJR?U7?\'テヘ\'ηͺˆCワtホォ4ο½Άο½§οΎ„[?;ο½Έ?-m:?οΎ‚?aεƒΉ?f\0γƒ’.TゥNο½Ά?。fο½ΊοΎ‡Ku%?k?Yι½²|ヲθ«–?UC8 ?85?/??\Zο½Ύ?\'Oj{.!d-lマ??ォ??R? Nキ飫Y.ο½Ίγ‚©?ク。拷{ο½»@Yο½ΆοΎ†ο½½ζ±ΊοΎŒοΎŒο½°fbkヘ}οΎ•3οΎ€ε’ηˆ›#?淞゚??????8εͺX?\"qοΎ‡?+οΎ‘ο½°Iヲ|M霍「?,Wミ?1I??\0θ ’?iNュ鴉?*錡tοΎƒ+?0ルチ88チ?2;η―†_?/οΎ†_ゥハ>οΎ‘Y?*蝠|ャ0xθ†°8η·»e2&οΎ“?,θš‹θΏ·οΎŠ?F。s?嬉クoヘη²½οΎŽοΎ•οΎ’)v$οΎ„nBq?οΎ—p~」メコ坿ゥ?>k?v?6ネd;?>θ‚“\\|U2?FHγƒοΎšο½§7qレ?β”³θ±ͺ)レ^9??οΎ‘zャヨεš†οΎœ?*ャィ??[οΎƒοΎˆ η‡—ι·ΉοΎŽj%SοΎšοΎ“%hーナユ顆トM.ι¦—Vt& 茸??zοΎŽοΎο½΅οΎ›ο½½b?6xgη ”?fοΎ’ηŒ–η Œaζ’₯$ο½Ά?OlzοΎ•gGヨャz岑`7ο½t?2?lο½―οΎ† \'οΎ‹?\'\0~Fο½»ε‹΅ZkοΎ‰6η”°o|?42O!?5οΎˆοΎ‰+ο½»\06=y権コ體lοΎ›?ο½―iηΆ‰ζΊ·mb手#ο½»M{+\0輌 ο½±?\0ワ76N ??=Qο½ͺ]/O|οΎ”w?jε—· ィ$?J?昡「qο½·-食?ο½ο½¨?ο½₯ウミcミ。+;η―₯\Zハ&h}0齎 ?zο½IοΎ–:οΎ„οΎŽ$壯レo E???NοΎ„?k5?6?e小:οΎ—ο½ηšο½΄ε—„IV7vοΎ™uk2蝉z {~錨?/ζ–Όε ™YAャ]<ο½·恩&οΎ†ο½Ύ\"? ο½Έ?リ?\0ο½½j+[!souv??リ-οΎ‹ο½ΆI8? s舘?\0\nzJοΎ•z}。KοΎ‰~^IO??lnθŸ†\0οΎ‡>?+\\ο½Έ?D&οΎ›&ο½zζΊ‚?οΎ™οΎ’οΎœοΎ›3?u摁1ο½Ίο½±lο½·η›—sマο½9SοΎ“ο½―>゙ュフ折jε’―οΎŒ7\r=ο½ι—x?$ο½Ήo?\0q彑\'ο½½[WqzZ\rj?碏[3IィH οΎ‹οΎ›οΎŒF??ο½½Cι‡Œ:f]icャ?-θ»»?4lィッ?Gο½¦οΎžη’’η‹¬k(n?%οΎ™ο½°?\'ηͺ©zο½ο½³ζ‘‘1?U? xηŒͺ8;\0%@Zサン\r[ο½²?)\"!a\Z牀Cο½»?1β—‡rO\'ヨエ5η΄Ί?ο½· ?Kο½ͺャムGο½ΎοΎ’,b2|?l?θ°Ίζˆ²οΎ—%cモャcο½Ώ]AηΈ²ο½₯エ「?& 申瀏達?マζ‡Ί\'/タイ遼ο½ι­?η³Ά??;DOンア髒齋tV8V<\0sク逡ΑZワ??5ミD?Cο½£bεŽ¦ο½Ήη¬¦ο½Άβ–Ό???ε’Έ=ο½₯Aiο½ͺチw}ywsエィ\"οΌ“??マ)?xQ? ュq?I{c?οΎ‰zοΎ’O+Q?揚9θ€Ώc慝3^η­‘?-BοΎ—θž³ο½Ό.ζšη‰‡!Yε―§#εŽ ε¨‘qε‘”?6?>???。??ο½₯ο½§οΎ™οΎ‹η™ͺο½§ο½Ή Sssu爼x??\0 ο½²0リ乾?ιŒ†7キヲjラォkRjζ‰ΎeヲIiο½₯nャ?\"?老οΎ†οΎ˜?wlοΎ€9dsWο½§?;MkXο½·ιΆ‰ζ―›?$οΎ—(ο½§? \"ン?η“·οΎœXι‚―1?ο½―,ホ4θ†°θΎΌ|ε±Ή5{[{?\0蓉コm>??-仆)C?\"∨\\?レセAοΎ’οΎšοΎŠο½½ο½©ζ¦‘xοΎ‰οΎšοΎ„οΎ™9ホ0;憫?{η™?Iizο½£Rι—οΎ„pン? εƒ‰οΎŽθ¦½8lv+οΎ‰=?ヘYャ? ?:ワwワィ??%゙?ワ?οΎ‡ο½Ά1レォ/)οΎ—?8lοΎ’Z?Mワi?ο½­2Zο½€qヌ燹剔?%?D>。j拏w,??;? ~_1ゥf 62οΎ‡?>ζšοΎŸε™ΊI3Mο½³.゚QT?6\0οΎ‡η°‘οΎ–?4%ο½³ο½€Vv叩`Zヘ$*@マ;Yケ瓏ο½₯dシ嘴Eο½ΈeιΎ η•·t?ィXοΎƒ4p@[粕撩??壬}ο½ͺァエ??=ε“­~&fXwοΎ˜ο½¬οΎ‡οΎ“??\0fο½½Ofο½Ί,οΎ—ο½’οΎ†?j ε°‰;ιΉΈワz2?ο½Έ?1靺ζ˜οΎ‰%葆ナン?リTc??οΎ“ο½½hシヲ?4Uチ\ZミtNο½½ζͺmw4/οΎ‚οΎ‰οΎŒο½»ε³ͺlοΎ€?+?BKο½­?ww=οΎšοΎšγ‚ο½£ο½°\nο½Ύ??レOο½ͺοΎ‰E$ο½°E!ο½³?3?史VοΎ’οΎ‘!ο½Άη―  Y?gqΒΆdοΎ–o;ζ£Ί*η‡Όθƒ7icοΎ“ζ›Ύ XTn???SοΎœηœ‹{8&X?οΎ•$LfBsοΏ₯JοΎ…u;?9ャ?ィロ樸ト甬恠。%諜ォkbワη‘ο½Ίε§«x\0Wtο½―?$οΎ–欑ο½ͺ?7PY?(%?{0?\0οΎˆοΎ‡ι»œ\0w$?\0?\0ゥ5?-ο½Ώ\0?O??2hο½―u%怏iοΎŒιΆΈο½’θ’’ οΎ€lL?οΎ‰οΎ€\'ーワリmο½»Oι’―E) 1ο½€QFqQ@UP0\0ο½°B??οΎŸη–ŠοΎƒο½«~ε“qyy$マwp??w\nミO\nQGl?&ο½Άp蝓6n?\nRθ•—\"櫨\0ο½₯)@)JP\nR?櫨\0ο½₯)@)JP\nR?櫨\0ο½―\Z~οΎ•ο½Ώη€ͺkοΎ™~#tο½’xZンネ\Zο½₯かナζ…₯%?εˆͺN6ο½³\rο½ΉV=θͺ‰$D?Uζ—© ャ2?5ヲ,ο½²οΎ…5(?(ゥ*gΓ—??ゥ?m?οΎ‡οΎ“η―­m。KζΏ‘!%9^チ丞Yζ„ˆ>ο½’aε°€チ?>\Z?チ<{?ワ?kilο½’\"oc2οΎŒοΎ’<メノマ?\npε‘°?ζ‹›v[Z影坂gjハ滴シmbyチNyοΎ…}?ン?8]οΎƒmh? ?θΌΈο½½οΎ•4m:?~?ο½±))ef\r決ネチワ?>οΎ‡憬KEζ₯š?9ο½­ο½―^ノヲ? ?チl?゚4騫tッ゙qGィ4) wyηΆ―??NH??gYワ|ワ-4οΎ–[οΎƒ6ee叉 *0{7η±”[θ’—-cゥ&゙W #3?Aチ$p ?f\\t゚NοΎοΎ“ο½°οΎžι«±Cο½Ύ?\Zm2?οΎ„\rο½Έ*θ‰¨ι―”ι†ΊοΎšο½«ο½·ο½±GοΎ…c%?\'但?οΎ•?ム「硦qη£½q覬pァリ?8ο½·ο½»%\"ο½Όζ₯ͺgQ亜#ο½·*rοΎ—οΎžο½―]οΎ–Xε“„ィァア。モ轣ヨ+οΎ—?ο½³??W$?{?.擺偡[β€³??$θ™•X?\0チ8οΎ‡5鴎iθΏ½ο½­Mο½§Zチp?%1ニ言sマゥ8FZ}ε–‹^。イサイdθ‘—?%Rθ²ͺヘοΎ’)ホ?ハ「I9  \Zο½οΎžοΎž6ο½’ο½Ί~η· ZοΎ‡?I?&$VοΎ€\0e@θ‹œ~?7qu>ο½±οΎ‘??.挌?οΎ‰??^{οΎ”οΎ‡L?,zο½§JiοΎ–ο½±4z%?\ZUοΎ‹mK?οΎ™οΎˆA?\0yοΎ‰=ο½³Qレサ?>ォ?\rCY妲ζ΅POζΏ¬[???5??クチ勳qxο½Ίζ”΅ο½±οΎ„ο½’?)?\nサミ?οΎ†xニンヌ{fο½Ίl4θ™œο½³dーサ掑ォWο½₯ο½ΎοΎ˜θ™±nl!pン??ォ7MKx-^UοΎ‰-?:?)οΎ‡ qοΎ›ι…ŒοΎ†ο½Ή.ε’ƒ)οΎ‰ο½§u;@οΎ“hレPο½±Tε…ˆ!ε―›ο½Ήη‘°?/a?ゥ?,uο½Ή??/ο½€in~]οΎ‡?*?呞!Xvマヲ*θƒš? ?i\nο½»??\0w?ζ₯“&みBエ?(#ο½³/?チサ?9IεΉ£#ι©›ζ₯ οΎ›ζ·RοΎ›οΎ“!ο½£\n碡セ位?騏N ゙?x?G#゙ウコ{ゥエサ?r \'??οΎ„?D go? {H|7?リ?qpxV??ο½ζ·«ο½¬?Yο½£ο½²S? ~qοΎƒcワ?ア禳\Z3莫vo ?)#?ο½Έ-ヘ?οΎ‘Tζ€‘ι…Œ]Nホ?Viο½ΈοΎ‡?k?εŸƒο½²ι€n?tB?\Zケハ g\'\"?ヲB\"9ο½£g?ォ?;D_Bο½²?<シャ\rοΎ“?cマ$眸\0BοΎžοΎ„ο½θ’οΎ”ο½Ό\ZM怚`οΎ•bわ$%ャ?サクネレ?ο½²y珞ο½₯?@οΎ‘uο½₯ο½»\Z?ο½Άο½€oο½·?$$3rN?ζ–½c?ィ?}ζ’¦Mガ[(Z{~b?#οΎ‹ο½±?fワ?ο½―ο½Άjο½V?Gh\Za???ユロォtエーj6ヲο½Ά{a<η«―θŒ‰ε·,ο½§ο½±Qワ θˆ–Y??ο½±Xンチッ[οΎ‰R?9d?$x οΎ‡ Fぁθ₯ƒβ™ͺ5YJ?dο½’ο½»ο½­?蠏?\"?\"?,β€»R7ゥ?n3掌xャyο½­u)\"ο½Έο½Ύιœ€ο½Z\rο½Ήu,ヘホ紆?οΎ“5yユヲ?-=ニ」ゥM.?Hη›‘x゚ケAe?!Y? ;gι£ο½­h\Znο½Ή?/?ο½₯ο½·?Z@!εˆƒ![??;址dレ「ミ+οΎ—?οΎœοΎƒοΎ—aリマ?\0\0\"οΎ‡?ζͺŽ v&ο½°4ネ%k?/?,ο½’?9?!?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲ',0.5808563,'q',5,7,'1942-01-20 10:45:14.0'), +(1979,'xwv',' uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this LicenseηͺΆε†± text to license\nyour works, and to refer to it using the trademark ηͺΆε»usiness Source LicenseηͺΆ?,\nas long as you comply with the Covenants of Licensor below.\n\nCovenants of Licensor\n\nIn consgeration of the right to use this LicenseηͺΆε†± text and the ηͺΆε»usiness\nSource LicenseηͺΆ? name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provged by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n or a license that is compatible with GPL Version 2.0 or a later version,\n where ηͺΆε½‘ompatibleηͺΆ? means that software provged under the Change License can\n be included in a program with software provged under GPL Version 2.0 or a\n later version. Licensor may specify additional Change Licenses without\n limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n impose any additional restriction on the right granted in this License, as\n the Additional Use Grant; or (b) insert the text ηͺΆε»ΈoneηͺΆ?.\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\nLicense text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.\nηͺΆε»usiness Source LicenseηͺΆ? is a trademark of MariaDB Corporation Ab.\n\nParameters\n\nLicensor: MariaDB Corporation Ab\nLicensed Work: MariaDB MaxScale (TM) v.2.3.20\n The Licensed Work is (c) 2020 MariaDB Corporation Ab\nAdditional Use Grant: You may use the Licensed Work when your application\n uses the Licensed Work with a total of less than three\n server instances for any purpose.\n\nChange Date: 2024-06-02\n\nChange License: Version 2 or later of the GNU General Public License as\n published by the Free Software Foundation.\n\nFor information about alternative licensing arrangements for the Software,\nplease visit: https://mariadb.com/products/mariadb-enterprise\n\nNotice\n\nThe Business Source License (this document, or the ηͺΆε»°icenseηͺΆ?) is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License.\n\nFor more information on the use of the Business Source License for MariaDB\nproducts, please visit the MariaDB Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-mariadb.\n\nFor more information on the use of the Business Source License generally,\nplease visit the Adopting and Developing Business Source License FAQ at\nhttps://mariadb.com/bsl-faq-adopting.\n\n-----------------------------------------------------------------------------\n\nBusiness Source License 1.1\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provged that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVgED ON\nAN ηͺΆε»£S ISηͺΆ? BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHA',0.9881897,'axwv',4,4,'1987-07-30 00:26:51.0'), +(1985,'hm','?δΈ™οΎ›^Hヲ?w9Ljqο½€?ο½ͺο½&E1οΎ”\'lο½£?エY;fο½₯rεŸ’1VεΆヲ[m恩?UeV5;cyTο½#οΎ“,6ォャeο½½ο½±A?ο½Ά?ヲ&η·‹2ε›Ίο½±UG袳薗ン?οΎ…wοΎ…s゙サbο½ͺ$οΎ—7#?.οΎ‘οΎ“ο½Ά5ο½·?ο½­TοΎ›./。「_\Zc?5レケ康?οΎ‡?5ワ螽ο½οΎ‡hοΎ‡@qU2\rh1οΎ€m?>ζ…·ηͺ˜dε‹’?C溝リcネ\0WοΎ‹|!T?;?#οΎƒ!゚ネvタォゥAQζ•£$ヤ冐?2ャlh ワ?ο½Ί??εŽο½ΆοΎ‡θœ’ο½­%ヲI?1???/U\rX}ο½₯??ユテンHメノサアゥ8ネ蘚? \"ο½»m?ο½ͺο½³οΎ€?,\Z?ο½²ζ©Ώ(1*?ネ?ο½ΊebοΎ‘οΎ€d}\'&壘y9ヲ エ?ι‘•7οΎ‡οΎˆ?\'?゚Y?γ‚“\0θ€Œ;Zi?P?pοΎ›Iζ–œιŠ·R処源-S??ヲZ43?}οΎ™\\ο½₯a?ο½Έ|槞A魂ィヲ+kθ‡Ίο½¬ιš£r=Pο½ΌοΎ€\'ο½§??7????qοΎ“?ο½»fチキvOε„•x?o4?<做ο½スエ相ーヲt;οΎ›;?b鐙hマCL$ο½½ο½Ά[」ヘ?-θͺ€f$1ン>鏈\\%οΎ‡εˆ€ο½―ι‘½qο½’X?ο½ΊΠ›ο½°οΎŠ@?7PοΎ‰οΎ€Znε’ΎοΎ†ο½­qs\'5ヲハvヲ#ォYοΎ…fοΎ‰yqハd獣??οΎ•?\\\\Gmζ’ΆH+?\0(ンロ?ワzοΎ‘Zο½―??NqοΎ–6?uk:D?? ιš™ο½£ιš”=?\0牴V鍋ヒ %x&бワ\n゙?Iu ?=[?:\r<ニー小ιDn24οΎ•ο½­pvο½±$2゚N??ィ?οΎ›\0?\nwlEoοΎžοΎ„δΉ‹?]οΎœοΎ‡城??5?ε£se οΎ‘;Kο½ͺP暦ソレ^ ο½―οΎ„?οΎ‰\rοΎ–ο½Ό?gο½€?エeUο½»??F@リ!G&7οΎ”?ο½·ο½Ήη›²η—©οΎŠ?44ィタヤ,pkXワ,\\?萱エノ?:q咬#フ辰 ι ‘UH?:???\Zε™΄οΎ—?リーcο½±cοΎ—?CοΎ†(AοΎ†?$οΎ”?Vε·“η³Žι—˜ι\"οΎŒοΎ€rィ??ο½£+5エ?\0,Kィ@οΎ—+\"ο½ͺ??X?4sHZャ)鉛ヲ ?4Dο½§?ヲ$cο½ͺsィュiN?U!οΎ’?51?\n?q?4ο½­ο½»KοΎ™-ワ2rδ½―ο½±οΎ›\Z^ζ“˜kン(ο½±m?oο½²kο½Ώl菻CpJ???/GAι§­?ο½ΏNt灘?gYa_?ο½Ήz゙?ワ<8\r\riο½ΎJ2ο½£ο½²ο½·ζ‹:ηŠ’η—•?\"ζΏƒη°“VH撠荀}槨η•ο½’HηΉ°ο½₯p岳レ\nゥ,ィヒpοΎ‡pοΎ•?磚\'AJ E蚰5}ιͺΌkvTο½²pV?\Z_Z5^lム嗹ヲ?\0k,?ヘ?$εˆ‡3 南ラqA呚ο½°η•ͺs蝦ンノi t$zgKοΎ’οΎ’?+sィヘ?οΎ‰P+ο½ΎS?4oο½½ε―§kィトη₯“c鎬kγƒŽ?エ隈/@Ea?シャbV?\"}^゙BDNο½{ο½Ή]IO?\'ο½Ύ?愛笄? mLヲyο½’?οΎ‡rο½Όζ₯³_ォワエ繝P:W\nエ?\015?4.ζˆ› ?οΎ˜θ·οΎ™U?9η™œ\'愆14Zt??7ζ΄ͺ3?l>ο½₯=οΎƒι‰Ύ;?yQζ—ΊοΎ‹#:?εΏƒk=2θΎΌyh6ゥ\Z`ぼ6HxοΎ—ο½°ο½青ュ7.Zw4F4h?\rZθ…Ή\'??mキ假ο½m恍\nο½»???\0撏\"οΎ†ο½€οΎ—%ワ?ο½”?\0v?bο½Άο½§-Q??Wl\'鞍伊VV$??+迂ツ。N?ο½Ό2Hkjfkwリエ\nο½²?,x???pミュMX?\\J;yοΎ‚?$οΎ“TοΎ„lE@οΎ›.T?,.ο½₯@@οΎ›\r?4\'ο½½s%οΎ€?yリ ο½jε”Ύο½­\"οΎ‡Zrリサhヘο½₯゚rンマ\Z?;οΎ™,!ο½Άο½½?(?Kx?ο½₯?齣゚ワrεΈΈFE~?+H\rzリ$?#lBο½―zlリ[\n?qοΎ‰ォk??-^?IοΎ‚Yqf妊6胙}リΞ₯Uヲθ–©?-}?ι‡Ž\'7οΎƒSh#?*??g.W[οΎ„iε”ΎοΎ…P),Fンa=`艀F?-Uο½Έ?οΎ”m??ε–¨ο½―ο½ͺ?Jο½±?$\'ε“‚E?;v??煖ゥ ?ο½Ά?\0\"r?οΎ‡$ο½»οΎ’3?NUο½’?#mヘT溏dネHο½’ι–£8οΎ‘?a\'ο½»?ζ ͺ\'RοΎ›οΎ–??ND??J~ο½²ο½§ο½±Mο½³k孝笈ゥ?.S+οΎ™OοΎ—\\!mi?2?# _\r。Mネ>ι‹©aK?\r?エノチ?$2,οΎŠγƒ―4tNw,οΎ—5欣5ε° ?ο½Ή????\0\rο½—e?οΎ”οΎ‚ο½ΉοΎŸ? 翑マ.?Y0f靈U?-δΏ‚οΎ’ο½²ο½Έ4οΎ›q磋??[$^XοΎ’Vη™ΌiMハ4J+?ZοΎ”#ο½Ί?οΎ”pζ΅·?@?xsο½»1?エοΎ“ο½―Lο½’BηΎ©H?+ο½₯L?7?kF\\?A6?F:?笳秩s?%Z???οΎ˜η…–5Xη₯–^?\Zο½§\"ε“ε―’ζ§ŒΞ™οΎŸβ‰«ο½Ί?\nh|ι―’ο½Ήζ₯=H?ο½Έ?v(?P|チ!?\0η‰ΎTM0ο½Ώ[*οΎ–οΎ‚ %參\"=ε‡Ύο½·?._ι¦Όε˜›?JゥロンM┬]?8ο½»\0?1V3ュ鐢レ衧V~G?\'K?鯖ッヲXο½­οΎ–?(}リ*8ο½Έο½»K οΎ™ο½Ήο½Ύε €U6ι€žοΎ€+Sι«”?6?xWεΈ™?5#\Z。QοΎ•G?-οΎ—?4qne???ο½ΆvοΎ‹?/リ??οΎ”? u%遒FοΎ›?/S? #偬?_?\nリー?ワHοΎŠεΏ»οΎ™S?[??/θ‚©βŒ’οΎ€η—•θ›¬ο½«*?b)??\0\Zη‹ k\"οΎ™ο½»ο½°οΎ›η–‡\"?ο½Ήチηͺˆο½ΊuοΎ†?)ο½·ο½ΈBη„Ό5?\nゥニZ}bjοΎšοΎ€ v?Iο½§οΎ…??\0οΎ€θ₯ΎMε’»\rv-zο½»a?ο½€43 (ο½£?=エ!ι‡Ά~G??\0\"οΎ–E???^Z。傑9+フ¬r?7?\"@ο½­%フ7ο½\Z_゙%οΎ‚)1?οΎ‚%_?/?οΎ‰ ヲο½₯1JrMマlη“’-I=T?ο½­TVο½£ο½°?lNο½€ο½‘οΎŸο½ΈοΎ›?? qe(ζ—©dC?$rS???\0ホ?\'η€’*ο½§^ο½£?=Uiリケ{dGWV ??-ο½Έθ₯ ?W?WοΎ™FοΎ„u5?.?|?ワリu[ζ₯³CzQ?ε™¨οΎŠο½£η—‡?οΎ‡.IοΎ–?οΎƒοΎ—????οΎ†οΎ˜XοΎ„οΎ”ιοΎ‡δΏ€<怏??\0:Mο½§h-jοΎ“η’ΎBο½§zοΎ…οΎ›?焦? フ?Gο½’YKァフο½οΎ–?pヲ`裾ッ/?ζ‘€B8ο½―\nι‡˜[%>\\οΎ•Yο½!?3 . 茱コッ$??\0οΎ™z儉ア? ┝=[οΎ‹zο½­οΎ‡?<ο½½4叩eο½Ό?Qεœ‰ο½§ο½₯?ο½°?οΎŒοΎ—οΎŒ?cθΉ΄ε‰žぅ?厩?οΎ‹Iシ玲H?。-6jοΎ‡%ラィア?ο½«ζˆšο½Όο½ΏοΎ–f\\,δΌζœ€ο½²Nο½²F=Rヲツ?#WIο½ΈοΎ—????ュ助?οΎ‘fε―‚ng*ハο½₯+ι΅‘ο½―??>ι €οΎ›?&οΎ•<ッゥ轆%弊0?\"?\0η‰’?>vqヘ 3;ヘZοΎ”\"=錡キ縫z0?VοΎŸη„¦?W -ο½Άο½ΏοΎ”5ο½½EdjVi#Aミο½₯U?οΎ›ηΉ–\Zホァ\rθ ‘οΎž]e.m}7?ムqォο½²?]薺観E[η©‚bι˜œζ†¬?\n灌\\ο½―ε°»*?οΎεŒ•?\"?1?οΎ‹^vο½³\ZVォ.慍?4\0RA?r?\0+ε₯”T?z>?5?ο½£)卆%Y;6ハワキマ=yοΎ—Q鬱ユdοΎ”.\0\r:ォ|?gο½§?-οΎƒ?1?&?Z很 ο½½?ο½·οΎ“?/fKxι››η ₯?6e533οΎ‹)zζ°‘\"pη†Š9???7???ο½’Fゥ\n?ャニ?| 済$?\0W%ζ›š?-ο½±οΎ“$??0ゥgA,し粒」??\0ο½°lWCοΎ–?οΎ‹οΎ›??θͺ‚ォ?@ィ_?マル?\Z?$o仁?Cネゥ@(Vο½ͺIチ呲コ鰓。`ζ₯­θ˜šncイ詔膏\rοΎ‚ε„˜οΎŠδ½•οΎšζ½ŸζˆΈS?>!幑榔ラC牧ャk?/N?ο½±JミG|^?!V?G_qア^&?(l}ο½±B7Kζ¨›οΎšθ˜°ο½ΌF?5ο½­U[?\'?l3οΎ•ο½ΌοΎ…?ヲζο½Ό\"Uリ??k?蜚EpMヲル>仏ルi? ィネ8ン1UEンツ/%i8?\0οΎ†\\%οΎ•/Eワ?DοΎ„οΎ‚ο½» ;mε‘©ε₯EB%*Ξ²^溟o?:ァ粍t?YοΎ€?\0\0?+\'rζ•²οΎ™(ι°„θŒ±οΎ‹~vο½Ή?ζ—Œο½­ο½€j゚\\Rャ?ο½­*?οΎ—οΎˆοΎ‚F?\0 οΎ‘ENοΎšι–ΌοΎšο½­οΎŒ?9ο½­\0?(&? フj?%οΎ‘#^wE搢フζ₯shWοΎ‹?aο½°=οΎ†οΎ‹;ε†Œ%$?潴@C7菫?+ォ?ι–€ο½₯E$;S?ο½­οΎ‚ε†Š\\ο½£?=Rι§­ο½―$xj\"-Eθ‹‘???壜ホKNdD_碜サN紊Lο½°Sォm ε΄ cοΎ“^゚ヘィ2?\"5η‡Ώ\nQG?P6ヲ9 47οΎ„εΎ¨οΎ†kセリ1>ッ鏗?\'θ—₯?マ\ZοΎ„ο½±?ο½’?,U!エ??,ε”―S?M8\08??7/οΎ™οΎ€Rz?\Zゥ?+Z杞P:wフフFοΎ•οΎˆ?ο½ͺ1οΎ„en\"ッM}ο½±?*?9?\'&゚)οΎ›οΎŸ5O\\Hθ›Žο½₯kF?θœ©ο½ΆοΎ™ ?qN;eVο½’ο½ΉοΎ“θœ†ο½¨X<1Tホ?2チ8ο½₯ο½Ύο½§|ο½ͺeζ…Šο½ΉZE4ο½½1ホiο½Ά\"οΎ†ο½Έο½ͺ?οΎŠοΎ†δΈ”ε‡΅οΎ…Wc?ホク穒Uフk?\\Uxoq゚q?予ォ?:η³»Urο½°*ィ9ォ?/エrιœ€ο½³aWR屆I?/οΎ— ?xヘマヨ&ζ‘‘ οΎ”tο½­*n?$ο½­ vヲhο½Ά#Y,ο½·Sp巌2A\'?ο½ΏοΎŒοΎ™ZοΎ†ο½₯ο½―<οΎ—ο½²?οΎ‘b右\0\0qV?\0c?<ο½Ώο½§B?ο½·?\"XοΎ“rY≫?ネネネ???$w\rο½†η§˜??/\Z;゚ャ$οΎ’οΎŠ>%U#?ハ??ャ鏝\Z,?\'+οΎ—qοΎ‹uツミトa?h?イqS\\x驃?,ο½§?\"??)??4ヘ&]Lネ#?ο½―&\'ーィ\\$?E?;bοΎ‹0y?ο½§?ο½½JοΎ„X\\ο½½ο½²ο½Έζ΅΄ο½§%ι‘΅6;稗蒁NQ?η½ ?!ο½³#TnHο½₯wοΎ›οΎ›οΎ‡La?Wィヲg4ハ&δΎ†p*?ミ爨ワ{? cοΎƒSヲVr7ハF \Z\nοΎ–ο½Όο½»?\0ォ科?ォミ?Qε¨˜β”―2?\"$E}ι©ͺ??οΎ”ο½\rοΎ’ο½Žθ±ο½Ώ?ο½ΈοΎ’ο½Έ?FF?7οΎ•od^ε²”IbοΎ„οΌΉζ€’οΎ‡%Zo做サr?0hθ’ŸW4?piアハ$de粂`H?θ΅±9ζ‹ŠE舘セЯο½ͺ導5?ο½­ヘzLΟ†v?2οΎ—ο½Ά\nο½Έ? ?1οΎ„\n^#v?G?kォサ!c!?*ο½―0M;????Z+R\"ア服Wr冡ο½Ώθ³½)οΎ„οΎ—ο½§?xOdζŸ©οΎ—θ’/ZK??*ο½€xaο½ΏεͺηΆ’? ?\'0凩DOu?。ζ–οΎ•οΎŸ\Z2Gο½遺7i?ο½Ώ?ヘj?yο½½G\"f4Pvη₯•οΎ˜9?θ’±ο½§g/οΎ—oモミ緒!ハ寒dοΎ‹z??οΎ—>ο½―οΎƒε½°$ο½­?o?$コソ觀アォYοΎ‹!oOοΎ”ζ£ŸοΎƒοΎ‘P坂_?ο½ΉοΎ„οΎ— ywο½²s,?οΎ“SMοΎ—?ャツEtォο½₯kοΎ†ο½Ύ.ο½½ο½°{ゥ ?ミッP?pO$゚マ5οΎ„?,フVη–‰XοΎ…>/。杜Uζ©‘?=フ?<ο½±JチWzε”1?\r3οΎ…ο½³?f?<敬F??-giοΎ—-#ャA\"nJyιš›?η‹’/yο½’y%H l。ο½₯Wο½·?<碱昿ソ?οΎƒH?%θ‘™>/レ??\0゙舎e:?\0惆|ο½£#\":エ七?q?>ヘG?,ο½Ή?οΎ–ο½­$οΎ“οΎŽh住)?Fol?-ο½Ή}m[οΎ•?\'οΎ‚?#F?οΎ…\Z?26詞ャ?i?9倬杙???5?ο½―\0οΎ‰?lどvォ2?*TZθΉ‰ο½²?;?/ο½ζ’ζ’ΆZネ$9&4フエサ[O-リイr(P*οΎ„οΎ’ο½Ώζœ­5??*<6@ο½­EWy棉Uε£₯.\'jE%j。ァ?>?\0Jε§ͺ?οΎ… rアネ ?o#コハDr]ο½Ώw??jUο½·:θΏΊ?uο½ͺοΎ›ε’ŒFWZu\r?οΎ‰οΎŽWο½’XοΎ…,οΎ‘ο½½οΎšο½°?ミ?4ホ?/ζ“½?\0+οΎ„ο½Ά?Y:?ι―’(οΎ”F?θ¨–?umο½€οΎ‡ οΎšδΏ„οΎ’*οΎ‡οΎ†ζΆŽζŸ¬οΎ–?οΎ•5 ヲ\'?3?j茡ヘ栲塢ー-ォ\n\"枩Iネキヲa?9ンJ。v$?ャ?(?猫゙マAοΎ’4?ア∽?(η”•}nc?$??\r?ヘm?οΎ‹ι–’?Hミゥ*J?フ~o余。キエο½±,J?\0ra_ε‡Ί?規Wζ¨ΆU}NR??#οΌ₯ο½Ό}ユシン?ο½₯yζ΄²ε ‹ο½€3IB ・??摟?ο½­Cβ†’Ko\nsZ\0VAJ*z.??$ζŸ†οΎ˜Sjd?ο½·\"?豒恀ル?Pο½ΎοΎ“ο½§[?ο½Ήf?\0S\0陬Gε°ΊY。 οΎ’J?サ庚+?οΎ‹<キ輌oοΎ’n 9Mο½??\0ηž₯?θŽ–ォ 挿6*A\Zq2οΎ™οΎ’ο½―?Tx?叩キ!A@οΎ„?ζ–½g<οΎ”lο½€οΎ“.ο½₯ο½³εΉ”οΎ„?\Z?#LK゙`R倬栽\\ハx?FXナヒアィチミ\\?ヘfοΎ„X0#?#?=?sοΎ€?qe?是J\ZοΎƒο½8??ミ筱ヤ@ャ曄慨ヲ\"F+oο½?*|pハ}8οΎƒ2*G? ォeォJ撁笄郁zηͺ–ο½Ύ[}?ο½Ά??:?\rRk y ι°―?ο½ͺuοΎ› ηΉ»ο½·AοΎ“?\nζ…¨οΎ™[fιŠ–ホ$AlοΎƒl^οΎŸη•«OO ? ?2ο½?ο½€3H?5F_*鈎Mο½₯ο½₯οΎ‡?1マ(ィι©€ι„­οΎ„?-N? ? 8??.暈η†(r?+\\Uコモヲ=c&3&οΎ”}??\"ζŽ‰?#nリο½ͺ?5?=rネ#zlrοΎ€-γ‚οΎˆοΎŒ1?燃?Bο½ΉaL??;eq羣;竇?>.ο½Ή+Bεˆ‡ε½—$θ?頁-ィゥナLζ“²5;uチ?;ъcミο½Έ-Q?>?.。p-?cζ“§οΎŠο½Ά>PモヲKοΎ’p ?ο½―??6??ο½½w栗ト彫?Fミハチ?5&<珠zοΎšοΎ‰.l畔q 霏nwチ zr゙HgmηΉ½ι€Έ]ィ?0ヘ\nQA\n?)FοΎ›ιœͺο½―70 恠=ο½²?+4[Dο½­o?,ο½­&}ィソ8ュゥHοΎ›pθ΄–ζŽ΄泝? qE鞏DA&ο½Όζ΅„eW#?dミZοΎƒkQ-οΎ‚~?n[οΎ‚η‘œ)Z\\iレフPフBG*?,ο½§bο½Ώiο½Ώ?9a=οΎ‡tζƒ‡ζ―˜οΎ‹?οΎŽε•οΎœQob+逘??9ο½―レO。戦^ο½ΎοΎ“#}\nθ-ο½ο½ͺο½½~]?+d゙?Vε₯˜?Qフ6_ン ?kεΌ•ο½Έο½°?\0+芳t?<レy?ο½?+?ε­›??\0ο½³?1ュゥQ3οΎ™2ο½₯ワ\nHPοΎ„? ?ホシー假l@<οΎ‡οΎ…)?ο½§q\"Eο½§H?,6ι»ΆG?? 愉??ο½€??>?Zw]そ???福Zケ朴CοΎŒοΎ‡ε²¨nk?θŽͺitο½ΈοΎ‘tο½Ύ?\'y?VAο½Ίζ‰Ώ?οΎ‹ηœ₯E濁&ο½Ίw%:婦)vゥホ8εΈ™?ueh。孛耗繧HοΎˆοΎœζ—™θˆ‡?οΎ…?9%Vο½₯ォqη¦|,~οΎ—??^]ε»Ίο½­?2ι§…x??θ‘’KyS #?οΎ†?\rο½WPhレォ\"?οΎ–L?η–Š2ο½½ο½»ε»“η±–οΎ…~οΎ—|菜jwnbネ\n?O?uη«―{f蔀Q\n)?ヲ?ο½―mζοΎŸοΎ˜ヘ\n゚スワネM@?8οΎ”m$ο½±ο½Όhο½[?oο½ΏοΎŸζ€’ο½«?δΏ‘ο½±οΎ‚?*Oζ‚”οΎˆ??3ο½»?4u59?^ソャ=?E\"?\nzοΎ“ο½ΎF% =οΎ’ο½ͺζ°€?>鬻?Sミ\nοΎ—q^ο½Ώ?m.bοΎ—K\'pο½€?9v3??琡Oο½Ή5ζ«Ί}:@・x2οΎ“ο½ΆEο½―eY%yxゥ$??{*ハLホ*ヘラ ヲキrο½ι‚―og!AοΎ„οΎ…\n Sο½·>?50sXHQ?|@jvο½遑?bοΎƒ??見&ο½Έ,(?4?1Β’d?? οΎ‡8qニ轄アTοΎ–v?゚麭ソ?#?οΎ™ο½ΎοΎ–醇,SaC?(ο½ͺ? οΎ‰wB,u゚{ク荊ワ稷ンツォ?\0bN@j蘯彑Gο½Ή>,q?οΎ‹1ο½°?οΎŠθ€˜キネ?)οΎ›.Vm?ο½7ο½!\\ο½€ο½³(ο½οΎƒ?摈U?3Sε·»?οΎ˜οΎ™\0Cο½Ά>c/?LNB oζ…£οΎ‹οΎƒ15ハ倆?[S班,敬_Pリ?\ZvοΎ†ιœœδΊ…|ゥ渇[ι™°J5+ο½·?$,pοΎ…Z#(ο½(Mw=q2kο½ΆE-イゥ\\ヲロ(!S=Xaシ壌)ホ&?zοΎ€iοΎ—ο½²Bο½Ώbο½€ο½―??uxιクォサンQリア{η‰˜U?οΎšζ‹―οΎ‚YM?οΎ•?Kο½€οΎ…Iο½―Β¬?゚31nο½½ο½°οΎ–?qο½Έ?οΎ†ηοΎ”εŽ³οΎŸο½0\r?槨ォコtフZο½»T&οΎ˜οΎ–ζŒqU2?-N?qMア乘\\o Yε™ͺεΌƒ ο½°ο½»οΎ—ャUゥチ&?6ハg]ォ?杒*ο½΄οΎ†ο½‘οΎŒοΎ›?1WsοΎ‹ο½―?$E1ンゥ梯wヲn5ι©©AοΎ‡?5οΎ›.*F7η²›οΎοΎŽ(X\Zη•„?θž»οΎ‡οΎ„\Zη§£??彦*`ハNa|~ηΈΉQO<ο½ͺ Sリ??H。\"?榲ャο½ΉaI?:etοΎ‹θ…ŸP\ZWο½*ミハハι«\\?οΎ—ε–‰οΎŠ?;οΎ“\rキヘ\\?\0ィF\Z?ηŠ§οΎŠοΎ€οΎ€?U;獏ィユQ?Yζ¨‚οΎˆηͺ’Aι‘›εŠ6οΎ“ε½—ο½Ά\'蝨?οΎ’?1sοΎ„?1η•™ο½Ύtο½­H萬>οΎ€?LS ?G3フο½?$ο½±}bοΎ•8οΎ„?)ο½Ύ*眠J~ァ゚\"。」7ο½ͺοΎ”レケ[$ο½?)/?w8&ιƒŽ>? 0.οΎ‡οΎŸ?ο½­>οΎ‰9ワJzd^?I(Kハ 7&r。ノF2<食@M\Ze?)?n Aο½­~倦yzm;?!\nォ*?9οΎ…οΎ„οΎ†y\ZB)οΎˆοΎ–?&οΎ’?ο½₯IS?οΎ—Oο½§.8ヘ1{I?スネァ{d_T?h3凡?\n5GA???,.η–‹ο½­οΎ€?ο½Ύ9?ε¨ΆR& v?ハ?7L?GοΎ‹VWζ–₯>?#M$@4ζ Όο½°=i?ο½F?jη΄BK)\nkN-O??οΎ‡<牲cbο½§οΎ˜θ²‚ε…$g?j~y?\"yツヨ氓ィF?8%tο½»οΎ‡ο½·7k???}ャ゚\'?卩ヨ翻。*?+?)=οΎ‰θ²‚οΎˆ?,(ン城゙Uヤ。縊H\"。#ο½ΏοΎ„ο½Ή#+}`゙\r3U\0 魏5ο½³οΎ”n?tοΎ†?ミ?ヲ\Zレyζ™’?ε©€ο½£ο½’1ォο½Έο½―ο½Ώ?9 0η‡­ οΎ”??οΎ†ο½½@9 ο½²οΎ’gο½»ib?>fζ²³z?q豈6$??- $6F4ο½½b/ンシウ\0?ο½₯dο½­T熄)`授゙(Xz-ネS?ζ‘‘ε–ΆRο½ͺοΎ„οΎ”W5οΎ™F伏???οΎ„@οΎ‹G&(?;ο½­0QοΎ”?L3οΎ•ο½Όο½­uο½€[ο½­οΎ”οΎŒζœˆE8ε₯ŽοΎ‚X蚯R@?y?ヒォ!ァフCοΎ„?οΎ›qCοΎ‹ο½οΎ…{rNοΎ‰o?\n=???ο½₯!キ榔摷vοΎƒο½­oネ?οΎ‘?-QF??h?9\04W? )οΎ“γ‚žεΈš49RοΎšοΎ‹eu*ネhοΎ‚?&ャ@テマ?nζ˜οΎƒ? NDε•—&ο½²Got#|蠍キ嬬ソ$4?,sゥNοΎ•^g?5ο½₯rゥBοΎ‹1\'ゥi7*οΎ‹Jη›»mζƒΆCοΎ—]a束?οΎ˜ο½―ο½ΈβŠƒGLο½Q ο½€FIZ鈎2)?(οΎ”qοΎ‡4ι‘‘ο½E+-\"U=paM?リ\\ F|0uエ?οΎ–*?5崒フз ホ?:?2枒?Tη­‘5C7}?ο½―AmoUηΎΉ~シ鐫1-Sο½₯0ο½£Yミ」ケ?οΎ‡οΎ†{?ζ¬Ύο½£Tu\0EοΎƒοΎƒι΄’οΎ’iε₯΄ο½±?#|ο½ͺリ\\οΎ™οΎœ4r-Xο½»?Sg%οΎ‡οΎ…ε„”ο½’)ャ?ο½ΏοΎ‡οΎοΎžο½Ή0οΎ“?οΎ“?l%Pヲ:。ヒGPοΎ•#艇boο½ΆT\0οΎ’ο½ΈζŠ‘?掏cο½*リο½ΏοΎ‘?。e?sοΎ—RヲcοΎ“79GοΎƒj8?0ォ樂kア゚|keοΎ…*οΎ‹οΎ“lk-(kοΎ—\Zο½§,γ‚«?8彬墒?η–‘ο½Ή@o?*u?ο½«ζ†εˆοΎŽο½¦ο½ΈοΎ€?i\0\rο½³eζ€½?δΊ‚ζ«šο½£η•’οΎ˜UοΎ„vヘ藍棺セWLο½ΎοΎ™TοΎ€ο½­?賚εŒ?ζ΄»οΎ‰?A?ζ‘œοΎ…ο½½?RηΊ’hzη­±CヲP゚6X?U#倣恒ミ怍?LοΎ•?顐?4οΎ„?ο½§cο½’Dζ…Œε―©E5\'?#】擺チトο½ͺ&η²’ngg?ο½Όi?\05u?9W}ο½Ύο½Ώ?<チモ??\0(<0%@\n\Zθ««Uム寝?Yο½€οΎ€(\0~P&ο½½6ハnε›˜P?\"ο½ΈUοΎ‘?レホxοΎ“οΎ„?HηΉžοΎ‘Sp|2ηΆ―??+???゙?οΎ“ο½Ά ιœ€!]筏紫ツソk8SοΎŠζ¦οΎ•οΎ†|jοΎ•}ο½₯οΎ€η”₯僂-:aοΎ•?7t?θ˜ŠοΎ‰?οΎ™?\0∧?6?ο½ο½‘mロlζ’ƒBgο½§??フqrzιοΎ”9&?\n} ゚̄ Jュ。?%?\\|οΎ—? ??zvοΎŠοΎ‰ο½²οΎ‰ε–§?οΎ›η‘ ?2W?詔テヘ5[eu?q\'?9ク「忘`h?\ni?V\nοΎ‘θΏΊ$h\\οΎ’?\0ο½―ο½±οΎ‚y!;ο½½ )<???$o,ヲV5,??ンヤュ |?$\ZοΌΎθ·«?@bニン?#糴ζ½οΎοΎ›q?+\Z?ィ\nο½’?\n?8mォ」pο½’??(7P |οΎ‡|!P?.H? ?Z?ο½₯|\0?θΌΏ?HンゥL=?8VチDBャ瓣?οΎ‚Nハァο½₯Mナ紀ミt?1ε•Ύο½₯チοΎ•θˆͺ? ?z9=>KοΎ’?uθΏ« Cxtフ。?)οΎ’ο½§レハ%糊?η™’0RοΎ—p\r;??\"筏]j:\Ztリ?$エ癖?k?\0oο½½?\nauη’’?!ノ疫鬨οΎ›~ _ \'゙opο½½?#呞nVヘルウfοΎ…\\7ヌ佇οΎ†γ‚­yεΌ”δΊ‚ζŸ©οΎ™ο½±Wfヘ?vlοΎ™ο½±Wfヘ?vlοΎ™ο½±Wfヘ?_?οΎ„HF假Q?Utο½ͺ?θœ₯O\\。ο½₯wοΎ…Vθ²ο½½;c1UοΎ‘??朝Z 参\\Rο½·6)鱚ヲ(k6lリォウfヘ棺6lリォ?οΎ”??X4髟?\\\\ζ₯οΎœοΎ™ο½±Wfヘ?M?$ο½Ή?稔hο½Ά?οΎ€pワシοΎ“*k?ユヘr4nοΎ•K6lοΎ™%DCh?εΎΌο½Ά/レチWοΎ‚οΎœo蓉ィ下bゥi4οΎŠοΎ‹cS\\ャUルゥ\\リスーィqU??笊\\ネWο½\0Unlルーォウfヘ棺6lリォアハワqο½Ήο½±UF伐ヲ\'?6*?ο½³bο½οΎοΎ“53bο½­θͺ°VlリォアxQ[ο½!?蒈*?\\οΎ…ζ­Œ1U?ヲTq?1熙dοΎƒ?Bi?ηΏ†η²—??6=?X\n,dチヌ?62\0qο½?x\0?5Jη―€Wリ颴?q?ο½ΆFdrh:PaοΎ‹οΎ‘p?0οΎ’=74?οΎ“ο½Όο½»ο½Gο½€yv?οΎ›?\0??ο½’ο½­οΎƒ??^\r4s n\'?zζ²’?{sヲ?柡?3?5ワハ??ヲュ#??\0^o?9η©€ο½Άスハ?#?\0ο½²ο½Ύο½₯;?(ナ黝アQ,??\0ο½Ήι™œ:?;リDζ‰˜P+??\0+?猴\ni?マp?4コ食cAο½Ίο½―??\0?οΎ”οΎŽο½»ο½₯οΎ“-謫ゥο½₯P??ζ»²ζ‹οΎŒοΎ™ο½ΆοΎ˜?ο½Ήι–Ύs!ォャア?)ー゚?? <οΎ“fβ€˜。ォ9ο½·εΏΏοΎ‰ο½ͺο½±?\"2ォ2?聯??\0c?/,゙?-1ο½§\0I??)Ok?;\rhTP65?Mrq4?1レサ??\02IZ!qレ?Wο½±ο½Ή\']?QεƒŠ?jη•‹οΎŸ?牴モNApοΎ‚\r但?οΎ‚mNム狃q^PH??7οΎ‡οΎ‰οΎ•?$zR\n\ZSj?δΉΎ%恕?チネシοΎšοΎ‹S?YοΎ„ο½£ζ€N?\0??+δΎ‘ο½Έ? οΎ‚YqΠ)j?H)???\0οΎ…X゚?#δΏΎ:ηž₯1ン丼Aリ4?\0??ι‡Ό[?1枩N(aοΎ—???\0渊ホ側Zο½½? οΎ’?ζΉ―ソー「。ク「イ,ο½­ P?θ…=do蜴_ン|9EiοΎ€7\0ζ”·ο½±?ο½²Fο½Έ?/@H?20 vP?チ;Z? ο½Ήxγ‚₯ο½§ι–‹ο½Ώ?θœ‰ο½ͺο½¬ζ‡Š~ο½―ο½€7レc?-j}ι§­?ο½½+ο½ΏB?$ο½Έ\n゙鴈%?!ο½£\0@<θ“‘οΎ€?\0ο½·?2bD?_aRMLj?ハζ:?-Hjw V,ο½­ _???ο½²?マ直?K<:οΎŒη›΄ο½©οΎ…?zヘ9ゥ惓#οΎ‡$QCοΎ‰K去Tレ忸?倉#() ε­΅?捧穿ヘ??οΎ‰=ο½Όm\Zト。%οΎ‹??\0\nε4ο½’?οΎƒ(Q *。Jn(>οΎƒォ柯ソケ摐6γ‚©oοΎŸοΎοΎ†ο½·JOοΎ†?????\0,mヘロ?sθŸ‡οΎ\nリリj.築悁I5CWη«°θ‘Ί?QοΎ‰ο½°Kο½½ζΏΆο½ͺイ゙ワUη½HチDムヌォ#|_?8?;??ο½»ケォ1xο½―UEο½ΌkοΎ•\\*?\0y?ο½§ο½­r!R5θ£…[アq??NHο½Ό?οΎ‰q2ワエ$q||zr#?YlィDοΎ„sヲEθ –?欧蝿軛イ#]?゚\nο½Ό?ο½¨οΎŠο½±ι΄ƒf?星@O?ォ端マ6[]ホ-?kiοΎ–HοΎ•?6\n[????Yο½³??ヲj?οΎ‘LοΎ”W私モι£Ύο½₯lο½)eヲ捍lη“紐$\'齋!ο½’dT?エ??οΎ–Lン淹? Tι‚„οΎŽοΎ–\n?1?\Z@wq?&οΎ‚οΎ—ε£₯ο½’aチスR?ο½­~/?ォ儼G\rチ@韡∧ο½YCv%Kヲ??*?οΎ—ιš•.οΎ€\\8BοΎ‘@οΎ›οΎ›?,ζ¦‚οΎθ’‘οΎοΎ’οΎˆkSたV妹ヘH\0}aβ—‡&ζ­―?η—‡\0ο½―$ハ ?-TエLοΎ‹!M:?ο½³ιͺΈjf41pζ‡Ύ?οΎ“ =Mο½·οΎ‹Fゥィ?璌ejο½·,Jο½ͺ?οΎ”88゙Wο½’ι‘‘ο½>Z?w8aq颯jRImャlQζƒΆ?/?ο½§%ネ#僡タηͺ—ζ₯ο½£@??οΎ‡K?θœ‘δ½†οΎHx?)ZοΎ—ο½Ύ&οΎƒ*ο½€οΎ›η¨·1Cο½Ά0οΎ“サ。1εΉ‘;qヒc「リUbζšƒz D\ncοΎ†8各Wwハヲ庸フ]2*οΎ–lο½ΌοΎ€bο½­θ‘²-瑲q?リEοΎ— フ撍LhマBi?.5PηΊƒcοΎ‡ οΎžοΎ†9ο½§?G?N{οΎ“ζΏ¬~ァ蜍?&15?οΎ•ο½·\nXsq?}ο½Ό\0θ‡ͺο½’η™‚\ZIハ\\+)\0)??_??2Z78ォJζ·³ο½Έ\Z:S?oγ›οΎŸ?ο½£θ†ŠWοΎ‹οΎš[[It?Bι ·?$ヘ&ο½₯>οΎ“7οΎ€ο½ΉοΎ‹+?ο½£οΎ„) οΎ’k?dkε‘²οΎ•θˆL/+チ?ο½±?=q?η·€??οΎ›A?rネ緩? (@?η‹‚\nε΄–?ミ?wUャ(}?οΎ‡6?。p+?8?uヲ]pォ|ο½±?:ο½Ήο½–4P?οΎ—TS華碟48」ハ?1?0N岌\rBoDο½ΈBU?\'ο½₯Tr??οΎ‹ο½­T?8?Wο½Έ}??|cィタメGC?*臑M?チロο½­2鱇_οΎ‰wοΎ„οΎ‰ο½4οΎ—(\Z訓ケ[C\\CδΊ‚\"ο½£>οΎ˜οΎ’οΎ•8瀲エキCεžͺ?οΎ’0*οΎ’p~η΄ ?フv\\クャη½ͺο½Άヲhv曇\\ゥ?T?LζœˆοΎ‰voゥ)??yJ@Y\rjG? -?/シン2οΎ›Y?ヲ蜿J{獨モ葲?οΎ…?2οΎ”Kθ‘‘J?ミ。Mwο½§??*1S_ 琢^g1ι΄’?ヲ3οΎ„?\'?9dT。pI6θ»’?SPpq οΎ†?Ybο½ΊεŽšηƒŸ??οΎ–B<ο½Ώ???f?>W θ‘©??οΎ‰οΎ€?\0ζ••]8εœœΞ—NBQ&οΎ‡Dキ擬ラ?7?*? ?=οΎ†D?Iθ…¦9?゚\'?οΌη“’Lο½Ή7源=\r)゚lejpqyaοΎƒnο½Έ??Xο½₯6οΎ„ε€ŸUS。|qζ€ο½¦[Hフ? ?瀉gnο½ΈPエ「?\"ο½ΉbF?\rコ烝5οΎ‡\rο½ΆοΎ€Uο½Ά$?ホ)ネL彝ルje?6保,ο½§Ulwθ•­οΎ“?οΎ€??\"@鴆蒐I?\nοΎ“#4?2=UDθ₯οΎ›ο½½r?\0η”Όε±†οΎœ1d續?: UDο½―||S4f?ミ螽ο½4鈎E?Dζ«›Bι«ͺοΎ“?-u2ο½£γƒŽ?0ο½»ο½£οΎƒ*?(ζ’›Hε’ƒοΎ“.οΎ„WοΎŸοΎ‡?舜\0?1?ο½Όr>9R?提e?eG?οΎƒ8n>。@\0PlιΉΏIテォHUο½­οΎ‰ο½―οΎ‡B\0?ο½²οΎ„cι …οΎ„?ο½₯_E:M?チラW?!?ι«‘=)ld?レサqοΎƒK抻7ο½ͺε ‚ο½οΎŽ\"FοΎƒ?*w?\ru,bθ±ΉU?,8?ο½Ά^Jvο½§?\0ο½½\"#ο½°?ο½Άζ½›Tcο½Ή9Q2?#οΎ‰R?$ο½§\"ο½£f~゚?οΎ†η’†θ½€j??PネG?ο½―ο½§?\"ONDS^$οΎε€Ÿο½½?。ο½ͺ#Fο½€ & ?{Sη­΄?(JοΎ–οΎ‡u_1[Iο½ͺロヘh?\"ο½’?゚?萒HOォネレ?\rοΎ‚r璎潟?ヘ悡 Fθͺ˜K(李zοΌ›ο½Ύ?\0?t? W?JJο½²y?9y<5M剃チο½5 οΎ›οΎ™y,η’•1$*ε—½οΎžη©ΆοΎ’kο½Ίu?οΎ‡?,?フ\rC??_iο½ͺiZxο½»i?2ホイォ?\0。o。ヌ\0h/???A<7゙ソ?Hム醡嬰>I?圻?zレxοΎ’e$o\n}ゥ?οΎ‰οΎ‚?]θ³οΎ”οΎŒzο½ͺャ?篏Tt??>?}*?\0?4z?οΎ›ミ゙ォキ?セ透/?οΎ™ι£Ÿο½°Jο½ΌAζ’ƒI??\0η€Ύ???θ«ΊοΎ‹ο½Ά?:u?+na?q]??F\rεͺšο½ΌοΎ–5wο½²?\nοΎ‚οΎœοΎž&η―©??οΎ‹ο½³οΎ›ο½’&?耓k1C@?S蜿3οΎ›yqθΊ°θͺ‚ο½οΎŠο½ΌKクゥ?\0dοΎ™Y?6Xγ€œ?ο½ΌοΎ€?馘灰Aォο½°]ο½ΎοΎ’ο½!ο½₯y禍ε?B?}ο½₯ο½G?ヘN痂卍C=%ο½­?οΎ™a?\0οΎ”l[N\\+ο½Έο½§ο½§ΞΆ?\0?0οΎ™?οΎ™?ε—…,/ο½€_N柏QGι‡ˆC ilοΎ„ι*4ι€ΉMキイエホォοΎ•??\0リ「F#οΎ’ε–Šrハyε†ΆοΎ‚ο½Ώ?Jο½­ i*?\"\\jο½Ί\\7K?-?ン?οΎ‹\"?ο½₯οΎ’?睾?,ο½±Gg?ι¬\'.ηΈ…+ε§“4?6ィォl6 ?;dο½ΉHοΎ™1?ο½Όζ‹‚δ»²??\n。\'?:<0οΎ†?1ネワh??4EENnI!οΎ‡οΎ„6Zη₯οΎ‡,LWδΈ±P?^?wチ?Fο½―I?οΎ‘ο½Ί\n咟???<βŠ₯#οΎ…οΎ’ε²”r1vο½―|sTη΅£?5ヘヒli\njοΎ‡.OδΊ₯*οΎ“| V?W.ο½§?8?0ィヲ8?」ーォvοΎ„οΎ‹q?\'pv8?οΎ†?ャ\n弖。\ZMz耐jο½ΏLRο½«οΎˆοΎ’εƒ‰bfο½§|?リq{\Zfη¨˜ζ…Ÿ8ο½₯?*S*ο½²??jο½Έ?)οΎθ‚˜?Tο½©ε›ˆοΎ‹&ケォ\\*灑チοΎ‚qシーqX? フ\Zο½£\Zvタォォ?+ο½?1V?ο½οΎ™@Sqζ½…^Lο½±\'οΎšζ›ΉεΎοΎ€Rο½±οΎ™I?2qN/qο½£Xi\"1 k?rο½Έk\n愬;蛛磁p??!Q?1ネ?οΎ‡\0Wο½XοΎ•οΎŒvοΎ‡uヘテテゥイ?8η­΅{eRο½Έο½ͺοΎ…?ε·οΎ†οΎ…S}?*ο½Έ=FοΎ˜ζ‹ z籌?1&゚ο½R8οΎ“?8οΎ€wοΎ‚?瞭bャ6οΎ†?οΎ“ャγƒ?&ε‡° η―³?jο½°@GLc!8(ε₯¨#η΅Άο½iAz|rοΎ‚?)ο½£η˜‰η·¬Zォ斐Z゚ク髯?6?ケ水烱\0??\0g f#ο½Ή4ο½»? RチQ?ミ#.??t*OA繞?8?mvPX@ο½―.剏kοΎ›3οΎ‹]ο½±\"?\0~Lο½ͺ??1ヲ0M3ο½,+Zο½―ι›…?οΎšι‘•θ†Ώ[?1?#q゚手ο½₯Wο½ͺ東ケE?ζƒ°?;??qャユ5οΎ…=OM゚?hC\Zk?>?!ζ²–?グ?S*ζ–‘Vζ‹i叙ン8+Fワ?\"?1U斐}ο½±ο½Όη¬ ο½­ο½±?ο½ΈZ^e?οΎ”TηΎ¨?ο½*ο½ΌοΎ— l。崕οΎ‚\'<Q?θ€ͺネ?5ο½Άma遨-!eeャ畑>?ィ??Pο½²?$\n|;dh\Zη½ ??.\"ιŸΏοΎ”$ο½Ώ\n$?ιŠ‘Jbο½€cοΎ‰γƒΌ.cεˆ₯οΎ–?0ζ„ΌοΎ—\r*ィ>|r?勉[οΎ†ο½§0?;ηΈ²?s〇跑ォJf Fη·²ο½²?3|;bォjkS?#゚ο½j甄キゥヒ,?+`ミbο½²οΎ“?\n澆ミOθ ‘ο½Ά?ス晝DfBο½ͺ|,=S捐Iο½ΏοΎ’?i竑砌K8θ΅€δΈ”<9;?οΎ€η ΊοΎˆοΎ’ο½₯)?,ο½Όc+ワε€ͺ$ε‚˜οΎ—+ζͺ’θ›»M<ο½Ήw?B&= \0~YοΎ›ο½ΉοΎ†?)?マアHba\"?ο½£%\Z/?.-dηΈ’οΎœηΆœ?Hο½Έe?ο½½ミθ‹ΊTャ`3ο½Ά?Oqc塬Uι‹’?Sqε–‹oοΎγ‚ŒοΎžH物οΎ‚)瘰a1U?\'\"RJοΎ†<ο½Ί ο½₯;?8?ホ?チヲンマコDοΎ›oοΎ“.リ0Aζ―’ο½Ή.οΎ™,?? ?%ο½€οΎ€\0οΎ†βŠƒ?+4/ QοΎ…2ηΈ£ο½Ώ?0ワSο½’$\r=?Jο½ΆοΎ‡ηΆ’οΎ—「q\ZFjOol?2jο½³OοΎ„οΎ„ζ²Ύ9?rοΎŽζŸ”ι™’)?. ?ε‹—?エ犯サ?(???ε™ͺ\nIγƒ’?,\0TゥθͺΏο½Έt?xοΎƒ\"γ‚­.ο½Ύο½Όε‹Ίy?οΎ›\nοΎ†ο½²?NοΎ„?Y=ο½Ό?JA?ο½€ujη•‹8\Zホイ|kο½½G\\トヨ捕Kο½t?9]ヲクJ??οΎ“οΎŠ?ο½½ο½²?゚??ο½»+!SアヲG? ?θ•­S~ァヲJ2 リA?OGε§™?ο½Έ\'?ηŽ‰?οΎ› Ouο½₯hοΎ•??:?ο½€VοΎ—*?ZεΌ±j?ο½ͺοΎƒso?οΎœο½«οΎ“ο½―:ο½d 5l}ネ;?ゥNοΎ‘οΎ”οΎ”ワcmο½―fο½²Rンハ7?8?1nヲクフ櫟,QOv?\nハy5z?eォノウリq$?aHοΎ‡γ‚οΎ†FοΌ8}$ニチツ?メエ8磐ネ\\η‚Ίη£”οΎ‚?$FθŽ…j:o鏑ο½₯#ο½―JζͺοΎ‘[\rο½ΌK(θ‰Ÿ\rοΎ€?Z?(ε€ΉQοΎ‹οΎœc?lοΎ”$ο½­(ο½­kοΎ›+ヲ=O猢\Zο½½ο½²*οΎ”uο½―?搓80lヲ゚^?#οΎ„η²₯ο½§レ?sフJ?\0ε―’ο½§οΎ›pエ?εž“\n+?1Y?οΎ–οΎ‘[,jο½ΎζŠ‚!Zο½±?ヘ、ァ\\θ“‹nοΎ›\r?l|rδ½°%類~リ?0ο½ͺ?4ハ$総ο½³7\\P?θ­―c@*Nj?Ξ©οΎ‡。Mィzη΄•θ€ΆοΎŸViM?qDb搜ク?LUz嘴θ’|ο½°NE.9cο½c?0*?ο½§|c\Zf5)ο½±Uο½§5+?-F*οΎ•{eSzη΄΅οΎ…[ヘロ*ο½ΉUοΎ…]JεΏ–8嗽ヲc#2?\'aR>愆qiο½½j+仝rο½―ο½Ά)uo? |ネ\rGCQοΎ‹ゥ5?ワハV?kMゥ姦b?モ聳サc\0チV1οΎ„οΎ’?゙%#???(xay賂ォ?)瀬Qο½Ά8シャ体Zワ? ?vタヌ硱ヘN\\?γ‚Ά?2ο½½&\n\\nS?V欽?R?16?-οΎ’_Rο½₯??U+$WzQοΎ‡KrpT{Qビタ?\n\Z棘jοΎ”5οΎ„ο½ͺエ?/ヲζ₯• ZWοΎƒοΎ–?2??οΎ€E?ο½―Z?οΎ–ο½\0ォリt οΎ–ο½Ώ?eィワf=1W?$fη«­ο½ΆοΎ‹@v?\\@bゥtι…³liοΎ‡ο½½οΎ’οΎ–??%ο½»ο½²xミ>οΎ“?a??οΎ‡#R?\r|*z7?墐スセ? Bエ?バ.= w?ε‚³ι–‰Pη ΄ο½³??T~gζ™‹oοΎ—θ‘Ž8沑8θͺ…~C%οΎ‘ ο½Άζ“½\\?Bο½£?8q??フハ25ヲMハERhi?\0οΎ‰ ο½ο½ͺοΎ”\'\"R}j^E{n~?η”ž?xε•ZοΎ‚?&\nwοΎ‹εˆ„tοΎ…Tο½³fヘ棺εΊ§οΎ—?5?*?7UοΎ€?ア匈ο½₯vlοΎ™ο½±Wfヘ?vlοΎ™ο½±Wfヘ?vlοΎ™ο½±UXοΎ”iοΎ™ο½³+qニアゥナU?6οΎ„ο½³fοΎ…]ε›—*οΎ…茱?ο½Ί?F?οΎ‡?ο½₯J3fヘ?ζœͺο½ΉX?48ο½ͺ\"(リoοΎ›?)N?\\\0)?\rMra吋G?\"οΎ€ιšŠοΎˆο½²?I\r?EΞ”οΎŒ?8??&6#ο½²8??Mz}οΎ™#mq=7?28{?? 9:2οΎƒοΎ•eエ-\"ハ? ?ο½§θ˜“<ο½³ο½―?:5コエモleォッ% ο½­οΎ“ηΆ£??iネOε₯?5#}lο½Όhm$p\r*J斐?\0ノ乱ヲ??ο½―?琲?οΎ‹A\'%?\0?12ε²ΎοΎœθ˜‚ι™ο½Ά?士?\Zミ.?ゥο½ͺヲ ο½ΌoォレI31?華PmU?\0+??ャ?$M8F?\0q Vο½§οΎ™?οΎ—??ο½»ε ™JィKIu8Uε€οΎŸo?oο½³kノ。]T]\\οΎ›οΎ‡k?3I4ζ·‘οΎ€ο½·??\0?#οΎŽοΎ…θ‘ι ·ζ›–\0?}?@?=臧?RC?\n??\0?οΎ‘?/。?エ{A玳v?]ε―°Ncm??wΠ’ο½½1Sο½½9ο½Ά?[\ZエaGEッマ?(οΎ™[$ο½£Tη³ΎI鬆ォ?\'~?\0θ—ΊεΌ—~寧ァィヲk摟4T4-\"οΎ”?_?皰 J-zη›Έο½ͺο½°zaFο½€ο½±οΎ…u\rοΎ‰ο½°ο½€ε·??θ΄–6n?ンァ5cAN 7?8ο½ͺ ?H ο½»N) ο½±r,ンο½ͺοΎ†>ォYοΎ„ε””η™ŒοΎο½¨?+η―©gヤミ?\ZgοΎ•l?\Z5ePkο½·5t??笊e?\0_\nο½Ώ15dο½³οΎ’?ーチ罫メ4#ィcV??ο½ͺ?\nチッ,?θŽ οΎ–θ¦¦]ε£₯.fο½²pOC?yフζ€₯?ネ戚[??PxοΎ›??w?偏ユθ—ͺA。7ε»°ο½·δΎƒ0?BοΎ‰so?\0οΎ‡|ο½Ήθ’ŸοΎ’5屑+ィ?)οΎ–I!οΎ›οΎ“?ο½Ό?リeο½’T$dmo\\エ?ε°…隷ο½Bο½°?=8??\'マ?=\rハ聢X( ???\0Ёネァ? Hη­‹οΎˆBニ「ィtq薇m?マ?$wI$6?沓D#潟?οΎƒ?ο½²? ~ζœ›W?\'οΎ‹η¨Ύο½­FF?\0?FtοΎ‹?>)琡?οΎ€γ‚½εŠ*x昜C??jxθ‘·Eθ«·iZ?(r%/?ο½ΌU/q\"οΎ“tο½½*οΎ†οΎŠ[ォ??9\"ORοΎ„?GoοΎŠο½Άε·‘ο½’οΎ‹οΎ‚o??\0Kv??ユチ儺?ζ΄²ο½±?n4?#ο½±-?$? ο½―ο½°?θ‰¨οΎŸθ’ˆοΎ‰?cUhu8叟?οΎ†?θ–¨οΎŽA?ο½Ύs??。ケz?ン4)οΎžοΎ‚臍塬0ホ??>ο½Ή?;?οΎ”ι–’w6pワ*3ο½°ε£―?\0蝟l???#?>? ン:ヲ~FοΎ–Xη›–S;:Dο½±οΎ‰ο½ΉοΎŠο½??\'ζ₯―ζοΎ†ιžο½«?=\Zθ—ΎοΎ‘οΎšKΡ‹h我\n{忝肓?qホdο½ΏQum0GεΈ­? ?ο½Έ??qV犠* P[ZοΎ„?畏M\Zο½― ?2θ“Ώ{ι£οΎ…οΎ‹e uο½·οΎ„^?οΎ—lζ ‚[テァ卅?-οΎ„yfチ?r?:ε₯?3x-\"ε”³t?;uマボォ\Z5?οΎ–f「エ){&ワDU@\'ο½ΈοΎ€9οΎ€ノマヨキ^?r4KXu8T]G。キ@?bワサ4E?Mミ+ηšƒοΎš?ο½Ά1a嬋チf9$ο½·οΎ—??gο½€E εΉ΅p?厘\nθͺΏο½΅ι…Œfrο½Ώζ…ΆοΎ’ο½°uο½½bοΎ‡MVζ²ΈI0?ο½Ό.ヲF η’’&エZE?\rεΈ₯δΊ›???Pi-} οΎ‡ hFοΎ“?=^Jh??%ヘュ`rI1蝎vζ–Ή?ο½ΊZο½Ό??1?#εΌƒl??ηͺο½§ο½―\"ο½½ο½·οΎ”wマ+yFοΎ‹;?Tjο½€*コス騨#ο½Έ1εΎ¨\rn_?veοΎ’οΎ—Wο½Άγ‚ŠοΎˆοΎŸοΎ€Nο½Ά?\'οΎ“οΎŸ??ゥァ閒疸?DοΎ–?οΎ‚εΌΎ)8S鍠<θ€™ε‘‘OB靄n劾」。θͺ˜οΎ“Ξ·oワチ?8ι‚―~??T?ο½§.mヲdX.J飜?<ο½­?ゥォ幕ヨイiο½ΊIοΎ’?滉^MοΎ’BοΎ’.nホ3ο½· {οΎ–u?οΎ›Kィ[齬?\rスィ頃)ZEaネbο½ΉοΎ€οΎŽ}8篏}仰梸ィ??eο½Έο½Έο½²ο½³οΎ•LSAο½±?呞茨ζͺ£?5 ヲ?ォifδΊ‘οΎ…フ\n\nbAΞ§?\0.}ォ\'ャzεˆο½©-,οΎ–+hοΎ’;x?$??ο½½+N2rリM$Eι–Šζ°”3%ンテ??&b|゚~?[ο½₯?ο½ͺ?Vロ。O$?レゥOο½Ίy#?bdrBε…ƒοΎ€ホュvθ–¬iοΎ’Eο½§οΎ„[?\0m;ο½Ό3???;馴レシ?\06幸ヲヘqο½»,レF?εΏ°q#*ζ‘§?ホ>???-kθ’ŸΞ·LFチv?7? ?=kε‘Ή?6゚?\'ε“‚?? }}~?ィマ菊?9e\n?(\0マ-?%?\Z?:\rοΎˆθ¨€ι«―οΎŽ2?ο½½jnレ??鐢UοΎ€οΎƒBζΏ?s?ゥlοΎ‹$M\0\n1 #\0?}ォ侯キ? οΎ†οΎ‘ο½±l,οΎ‘ο½r}ネマ#??DοΎ“6qm$ο½±YοΎžοΎƒ JοΎ‚οΎŠ +? θΎΊ7ιΆΈKmlWj?6wz\rbοΎžοΎ…pοΎ’οΎ…,οΎ–?c1οΎ‹ ワsοΎ›=ε―‘ο½Ά~スォ l。kw[ο½₯ε­¦CA OοΎ—ο½·c?cθΎΏο½₯\"Ё 9?\0ο½·?δΉΎ?ο½ͺ)hR[u-エοΎ€ο½±??ζ‘Ύ7ο½­C cοΎ„δΎΏeR對?ζ¨”ζˆˆ#?b?%?\0Nnε΄©?\0俘z戌?1]8?-?Q?゙+ο½ΆN?8ッqF2ο½Ή?]E,οΎŒοΎ‘n6?ο½»ユ冲」チ%?s?佞イ蚢?珞ャPοΎ€Llο½8?ι…²\Zeη―³紐Ubxcエ档qο½ο½΅}ο½­οΎ†C)?>。?マi(?>S?ο½ο½¨?Pャ2οΎ€c?ο½’l?o\n蘰\0q??ο½€Q#yN澁A?\0P?\0zοΎ†δΏ³ο½·l/?ε€₯モルンp8S?οΎžγ€Ž??_?-コ旺倂L?6エヤュ?+ο½ΎH?θ‡˜rイォ?v? M~ι€£,SοΎ‚ιΌŽ\"K?e# ?;γƒ€ζ²Œζ’οΎ>ο½€?\0Z??\0??=ο½­ο½―%?ο½«οΎŠοΎ†9οΎŒι™½+斛。タ/4qT?οΎ’\0マ薗K(ο½O#?xο½ΏGο½±iJW!qJR?Rη±ο½₯()JJR?Rη±ο½₯()JN?οΎ•ο½Ώ?\Zt$ qヒ\Zuο½±)γ‚°g?8?Yο½°AVレ\nィ?NW?[5?mο½½ο½ΈQη„ΌjοΎ‰?ο½oο½Ύ)?ス齢。X?|ο½?タヲ+Tf(οΎ”ο½±,フI\'? \0&?\nο½°?.|.#_c?ヘ{?\0N?οΎ‡?9sNン? ?ォ,ιŠ€οΎηͺネ=ο½³?ヘ,?柯シBチ巽\'\n\0??\0JοΎ€\\ο½·3ο½±?(?9οΎ†>?ο½°?3ミA摝?「フ?ο½―Qο½ͺ10?ο½Άε“\'ο½Ά?2?3P=NsοΎ‰=???kc???enm貰ワιŽxοΎ‹蓍セ=マリTwI鏀М%ン?+n香シz南=jWSοΎ–η±η―ΆοΎοΎŠοΎ‘eT(\"!ζƒΉι„™οΎžο½Ήο½²οΎ‰οΎ‰?ο½’δΊ€??2H?リ?8レホsοΎ‰リ?^??^?ι―²nハ !T{?j\rο½Ί??\0ィoパoゥソj? r>+?ヤ」ケ覆kι™Ÿο½Άζ–ο½±l?鉉U?吊?+>ο½―mp$y#H?&;D?4吢8溏\\4οΎ™θ²ŠοΎ”οΎ…ζ’¦gフw?}y&?z#οΎœοΎŠη€¬Jο½€ホ_ο½Έ??ο½±MοΎ‰ο½Έ/o4?δΈ¦a??*?ο½²z??゚\\獰蜴?1?XοΎ—οΎ— rq?m%ε’Ύ%ο½|M? 8?zε‰°Nο½³οΎ–??゙゙4??Q?;Hη˜‰?q?gVXIwo}ο½§>?οΎ“l? qζ••ο½Έ ?uι†—?ο½²?.?ィナsοΎ‰M?(y拆t[+ο½Ώεƒ?\0οΎ€サあJ??7。hッフィ?|?Vマ??mb?\"??$??+?.ο½₯HοΎ–&T昼?%? エ鄒??XοΎ”/ο½Ά?)eθ›”?ο½₯LOゥZι°’οΎ“οΎ‚dDδΈ±I!\'θ±Ήy?Lι₯‚οΎ›Rι»Žη«’fο½±A\"ο½²?X?βŒ’wηΎ―?οΎ‚\r吊\roゥο½ο½­zο½ΊkkwοΎŒοΎ…00 ?θ„―bο½²??OοΎ’??ο½€ο½Ίε―¦07\0}セリマ゙r。MrοΎ‹C?ο½»ο½ΎX?&οΎ†ζ”΅οΎ‹ζ―?ο½²=?]Kpo-\'η›ˆ\\ο½·οΎŠοΎ€ε†ͺ1θ–‡?\0ο½1]忝tf_:n+ο½»JοΎ…ui?ο½³+ハ?ン掻?z?Uο½·ο½₯ο½ΉGο½°yοΎ‘K$q?οΎ‡εΈΈ^l?.ο½η¨‹}N鬚ウコD_ζ—…\\エο½?.yQ懽?ο½·θΉ™Mqu?[\'οΎ‹οΎ‡nxJ?*?\0?+ΞΊοΎ‡οΎ†(ο½ΌHο½Ύο½’ε£ΉPοΎ‘nοΎ—Oxε₯’Bv?ο½£ε―Ύリ?\0jοΎ’?οΎ’z「ゥヤ_!ィ@οΎŸο½»η˜»ο½€η‚­?+η­‘3チn=ο½»VοΎ™οΎ—ο½cKο½£ο½₯06οΎ€!!cT$?タ勺ャュ\rエロ+t3οΎžζ€‹?οΎ‰eリrO|οΎ‡?/l。YPι·½θ±ͺFο½Ή??>Qン?dο½ΌホI? οΎ†x?。鑫Vο½―%?\\N?0d婚;?xレI? 恊3ηΉ‹[ε ‹LI ??\0+(マミラ M.οΎ’οΎ–I謔ルθ««?.3ε”±CοΌ­q)=οΎ‘ο½³h??4οΎ†Bο½Ή@臍ク#$ζͺ£θ±Έ$qエqο½ͺο½±ο½€c?uャcb捩1?οΎ› V\\?hο½ͺTJGOT到k_ι·Έ.θ±†οΎžοΎ‰x?οΎ…?E/?ε­₯6ι€>。ーキサ??~ォ9η₯₯HIーワ?\Zη·¬5?ゥャh6ο½³ιΌΎ7瑬9 lοΎ‹*οΎ‡?Gι‘ \'E?ο½£ι°»οΎ“UοΎ“.-? q|MηŒ—? οΎ‡οΎ‡8ο½§οΎ…ζˆ³οΎŸKοΎ‘ο½?h゙9?$1?2w?GοΎ˜οΎ—ζ‡ƒ HεΉ½]εΏ±\0 ζˆ”οΎ–οΎ‹οΎ…οΎ’*ンィ?,3t?qス|oθ…Ÿ,dp??8οΎ‡ο½Ύq希oR?゙Oθ‹« οΎ‘?.ο½£?3οΎƒホGοΎ—οΎ–ο½Άο½―οΎ‚??ィ>\Z゙tvο½»([;vοΎ’ζš«?ο½Έ\'?jο½ο½©οΎ’θ€œο½΅9t?>*+ο½°R リ;Nxホ}Gメォ7οΎ‹kο½’ο½²}ι± 1フネ?9ネ?οΎŽοΎ–θŒ«8|+●? Tンナο½ζ―³ο½¦οΎ‘οΎ‚ο½»c*ο½§kο½Ώpr}οΎ‡?if_?ο½Ό2η©©θ§€p?ο½Ά?cοΎ’ο½Έ?\0Ξ’οΎŠοΎ’ζ BοΎ›^&?$6??0Oo?7?-η±³q俀「ィ?οΎ†=?ο½»οΎ”,マo$ο½ΎnοΎ’1Pvο½·7\ZKο½ΈWY柁|&?ミ?\0zイ怋メn-?\0?eIh碯チ?ζ‘€Zι§ΏR゙mC)ο½²οΎ‹\ZmοΎ€FC?\0ィsQmοΎ”οΎšζ…―οΎˆ??#&οΎ‚~ヌ。tGοΎ‡εͺΎζ’ Niο½ΊG^qu3η΄€ミ7?.?οΎ‡??*?.7οΎ˜οΎšοΎšοΎ›6cο½Ήsθ‹«zq??\Z跌ο½₯rdT-ζ©„οΎšο½₯4Q%οΎ„ο½©ηš“f櫚cοΎ”WFT?2E{dEοΎ’θ¦ͺ@$d??px?:ο½£[スフハ?(<wο½·ο½­F_[及Q?ο½Ή\'ο½Άィ???? 鏗Uケネォf?)! #\"鱇>レ??\rk)vキス。bOοΎ‹οΎŽ?Pリ? 2ο½°#οΎ‘?r゙ソ;dソ革_ > Nε’…θ‘΅uοΎ„ι…Œ???レEbb?y馬p@?Hホンァ?ο½Ό??*5NοΎ…)Jq\"櫨\0ο½₯)@)JP\nR?櫨\0ο½₯)@+ポキ?]Iq|?ο½΄ιœ“=パu#イホ?蒍DTクネAv(ο½£ ォ/?88ο½―Dラ贐ナ>。帚wοΎ„?ォ?\'ηΌΆB-?&>hm员@$睦 3ο½Ά ο½?οΎοΎˆιΈοΎ‹?+ο½Ά0aUメャVοΎ‘40yp?忝??οΎ†i?%οΎ‰5lοΎ“VοΎ†KοΎ‰ο½­ζ žY##!ο½½οΎ€>?I(Fζƒ°?tο½ζͺο½ΊοΎ‚%クフ?_ο½Ώ??。ο½₯ι¨…:>?θ©YοΎ€cο½Έr@θΌ³??ο½ͺ7ο½₯4ζΏa?Aο½€C;ンニQ?_zο½ͺ?Xο½₯ヒヘζ…‡#ヒ膩oθ•ΎοΎ€\"ο½Ήθ’Ÿε‚ο½Ί,ゥ?!uοΎƒ2ヒヲiLc゙vI =琳jq゙靑ンrYレ+s??οΎ„{ζ₯’*1?ο½€dο½³1芬??3[Aο½·i;?&*;.yA?}ヘuGゥο½»1樞K}οΎ‰m+*?η”³?\0。v魍G{xュィL?ο½I\ny??]WMοΎ•οΎ‹4P2x?q#nレ>ο½Ύ?5iο½§YδΌΌο½½ο½Όο½Ύο½Έη€ΌεˆΆοΎ‹οΎ…η™§.sι―–?οΎ‡jIοΎ’tx3%εΉ…?ホアs&ンア?οΎŒοΎ™?{S]}NW?ο½Ό#yη‚Šiィハεˆ€?ο½·jοΎ‰ιŽ¬.?{ヘI謫lQδΏ›ο½·ε₯Gο½}9οΎ–\Z1エムο½$0XοΎ”゙ォ?[Zο½½?%ヲチFa?2{ζ­‘\\貧ルq?PοΎ–o/oο½t?\'ο½Ά?\Z)ζ‹—ο½ƒοΎœ^2Jユ躾ケ?;]\"οΎ—M?ミ{サ`レ??οΎ—??ナq?ο½±dο½―?#聑SQο½ΊοΎ…ο½ΌzοΎ„ο½Ά)ゥHο½²ο½ͺ?ε·±F?γƒ°{}1Z)ο½₯ο½ͺ+Fο½Ήζ•΅ο½ΎοΎ”uki5-\Z ネ\0?I?οΎ†οΎ’O \0οΎœζΆ›ζͺŽοΎ“#kοΎ‘)ヲヌイモV)vο½­ο½ΈNミ后 ?3οΎ›ο½²{?^ο½₯οΎ’v3jk,7賎l ο½ΌL]テレ\\?$rjヘァマq?:lο½²]チw?7$ο½ͺ膨櫻Oο½·οΎ’ο½­)コミHィ?=_ο½€Z?6zD?5ο½Ί&ンJRΞΈ[q;ε§»?ε‹΅ο½»οΎ‘\Zィ鯰徂ャマi0?レ駻dοΎ‡#x=マ\'フシqZサィ4[~ο½§ο½Άoン「Q?οΎ›η–οΎŽqοΎ†O峭レ「?テンPοΎ’ο½ΊA4]RοΎ™ο½³0Iasθ†©ηˆΏ? W/η”け? ??QtゥッY゙?\Z?&bワ&Bネ? ホk]チ{ィレャ?67w*οΎ‘οΎ†ζ΄½οΎŸOοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0??韲SFNrF?οΎ„οΎ‹[i?+oq?ο½Όfο½³οΎ‡r?nX??%οΎ“tDο½£οΎ‰#Uε΄™οΎ…εŠ΅R_\\οΎ„ε―ΏQθœ©οΎ…acUU? LHQη†Ύz?5\0Rdο½.螻ηͺt??Ne?ο½­:I?$C? ?/ュヲC{qοΎ‚οΎ‰ο½’]G!οΎ™:?=*??T*ο½Ώr?7瞳エ?!?\0?\rι—’?ο½½MUJOβ—‹HοΎ†?レ!οΎƒ4ι―¨,?\rC\0n?{ε›š?ο½­9}<ο½Ά?οΎ…ο½Ή3ハd.ο½²? ?詈ο½fngv=Iο½L跏?)\0(\0??\n\0?エn :?)??9n?5fγワnοΎ–ο½―7οΎ’rミ?鑞コpヘ ゚f/(レp\\GοΎ„HοΎ‰2ο½°>?Pο½’lmウハォοΎ„?:ュトぼ ζ’―?J?tKwhο½°?<1οΎ—Aο½Ίε›Ή+g8?m&οΎ‰_[ォ\"?域?@:葍^ο½±οΎšο½·οΎ‚\"フw??ο½οΎvd??1?7s/οΎ†G????SοΎ”οΎƒ\Zャ|ο½Ώ??Ck}?5οΎ„?フ?H?ι€‹ζ–ŸοΎ‹Rk跏?ζŽ–?\0P@\0\0P@l2ι±—?ο½³ο½Ή?/?=?*ο½Ύ\Z恊篳`2リ?マZkRC&ο½Ώο½½?ムォ焑?(ε©šγƒœZ?2ο½ΊOt_ζ°£O??{^ミ?iS潜?οΎ—οΎŠοΎ‰&RXοΎ‘ο½Ί??ο½ΊοΎ’ο½½\\?\0\nK?qエW摆n%i\'倧遜ウアb~θ“ζ‡·7rv5t?\0P@\0?οΎ™?リ??\0JFIF\0\0p\0p\0\0??οΎ”Photoshop 3.0\08BIM?\nPrint Info\0\0\0\0x\0\0P\0H\0H\0\0\0\0レ(?????FP\0(?\0\0P\0H\0H\0\0\0\0レ(\0\0\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0\0\0\0\"r\0\0\0\0\0\0\0\0\0\0\0\0?|\0\0\08BIM?\nResolution\0\0\0\0\0pU?\0\0\0pU?\0\08BIM\rFX Global Lighting Angle\0\0\0\0\0\0\0x8BIMFX Global Altitude\0\0\0\0\0\0\08BIM? Print Flags\0\0\0 \0\0\0\0\0\0\0\0\08BIM\nCopyright Flag\0\0\0\0\0\08BIM\'Japanese Print Flags\0\0\0\0\n\0\0\0\0\0\0\0\08BIM?Color Halftone Settings\0\0\0H\0/ff\0\0lff\0\0\0\0\0\0\0/ff\0\0ο½‘εŠ’\0\0\0\0\0\0\02\0\0\0\0Z\0\0\0\0\0\0\0\0\05\0\0\0\0-\0\0\0\0\0\0\0\08BIM?Color Transfer Settings\0\0\0p\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\0\0\0???????????????????????\0\08BIM\0 Layer State\0\0\0\08BIM Layer Groups\0\0\0\0\0\0\0\08BIMGuges\0\0\0\0\0\0\0\0\0@\0\0@\0\0\0\08BIM\rURL overrges\0\0\0\0\0\0\08BIM\ZSlices\0\0\0\0u\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0:\0\0\0\n\0U\0n\0t\0i\0t\0l\0e\0d\0-\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\08BIMICC Untagged Flag\0\0\0\08BIMLayer g Generator Base\0\0\0\0\0\08BIM New Windows Thumbnail\0\0i\0\0\0\0\0\0m\0\0\0p\0\0H\0\0ζΊ–\0\0M\0\0?リ??\0JFIF\0\0H\0H\0\0??\0Adobe\0d?\0\0\0?οΎ›\0?\0    \n    \r \r\r   ?οΎ€\0\0p\0m\"\0?ン\0\0?οΎ„?\0\0\0\0\0\0\0\0\0\0 \n \0\0\0\0\0\0\0\0\0 \n \0 3\0!1AQa\"q?2贈アB#$Rチb34rびC%ζ‹…??s5ο½’ο½²?&Dε…ΈdEοΎ‚ο½£t6οΎ’U稙??οΎ“uθƒšF\'筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐7GWgw?ο½§ο½·οΎ‡οΎ—ιŠ·\05\0!1AQaq\"2Β’qアB#チRοΎ‘?3$bη–΅ο½’CScs4?%ο½’ο½²?&5οΎ‚οΎ’Dε…Έο½£dEU6te糘ウ?οΎ“uθƒšF筈?米ヤ蔬ο½₯。ナユθ₯„Vfv?ヲ「ニヨ踐\'7GWgw?ο½§ο½·οΎ‡?レ\0 \0\0?\0?棚%)$ηž³ζ–½γ‚»$如$ミユK#總詁ヌゥヨv?4?\09htοΎ€aマ\0ο½»?\"G??οΎ‹rθΌƒC}:?p-?? οΎ›?ο½Ίο½ΆοΎ–οΎ–οΎ‚ο½³W?ミヲaトォ?Tアチ?[ワ$1マ?;?=M?\0Sz?K+ネヘv7?\rkο½ͺοΎ€οΎ‚ο½·\Zソエu~ο½X?)οΎ†dエリO?oοΎ™V=゚G~マエ_?。d?k゙ハ?ο½§\0レワ?゚T?\06οΎ—?ο½»cοΎ‚;gοΎ“???\0捍チ ィ?.?/?};ヘ驀G\0掌確@q??!ο½€?\0!?\0A?\0οΎ™UWο½©οΎ—ζ³…οΎšοΎoοΎ‡eマ oο½[I??\0KοΎ”kッヌ。?\0鑆Sο½±Sホ?ミzο½₯/οΎˆοΎ‡e?2ンKャ?pζ ½οΎŠοΎ†e?+οΎ™??SοΎ™??\0ο½’zζ—¨ο½½l~ン? οΎ›? -ο½³οΎο½Ίζ‹ΎοΎˆ贐??2.ο½ͺヨ村納?G??\0οΎƒW[οΎ–z??4)RI$ぁ?ミ?棚%( +kヲtフ颴PQaοΎ“qqc?4{ο½Ύζž—k9οΎ‹????0?&&ミ?N??οΎ—t?,ャ蹢XkοΎ‡ο½±?{ -cA?Mη†Ÿ?5οΎ•ο½·?z櫃モVο½°οΎ‡?洽゚OοΎœοΎ‡?=g?/URハヲ?ο½­fMfbοΎ’η£…οΎ… ャο½Άζ₯ οΎˆο½Ώ?5ο½Ήο½Ύζ§Žο½ΆοΎ“???\0η™‘IοΎ’ο½Ί?οΎˆι«¦οΎ–θ¦Ώf(#?}?οΎ„θ·ŸοΎ™?ャ?w?οΎ‘ο½ΏοΎ“ο½³?οΎ‘???v;οΎ–οΎο½΅οΎŽ] 怍?θ—·ο½·οΎ›^Ulリ???/]「穴゙?1ο½ο½‘??珠RοΎ–οΎžοΎ›\'cュ「ヲ\nw?ο½Ήο½ΆS???ο½οΎŠ?Eネ???οΎ”ZοΎ‹1?οΎ›} ?οΎŽοΎ„οΎŽοΎ†wο½·f]{ο½ΏG^レ?z?o?ο½±B2ンhkMWοΎƒο½»θ–+G?ζ’₯n?ζ›οΎœοΎƒ-sH゚]。サMοΎ•οΎ›[ε«ΊネUοΎ•Z7Uο½οΎ”ο½Ή?οΎ‘??鋳扨&Nリ\'ο½Ή?οΎ”ιœι­w*uο½°n?]T\r?。淑?$ο½Έ?fミラ7οΎ”c?\0yt}Cο½­θ’—?1q@shsε’ƒhv?zε­€??\0en??,w?ο½―?ο½£ο½―ο½’8οΎ“ε£™*ο½­οΎ‡!εΉ³ο½Έο½₯ο½°b?娩w?Os??Fマムο½₯e猷cο½±ε›˜;壑mdlζ–Ÿm?;cン[?/?\0γ‚»#L?q?ο½½|?フヘ_r?8Xzォ*}?:ε—…ο½°1??XοΎ—οΎ…οΎŒοΎ‡οΎ€οΎ†gο½ΆοΎ—οΎ›?9セッゥ?\r?\0ο½₯?\0エ?ネ颚?οΎ—}?冐η†Šο½½οΎš2ο½·?\0Hォ.ο½Άο½»οΎ—9?}麟~;?\0M??c2?οΎ‚qエ7?潟*8ε›šο½·!?oο½§?oィ?ο½²-g?/ムォ4?\n??οΎ‰ο½·ο½Άο½Ή?θ­±#}5;e?ζ„§_レ3=oο½§??ο½―^7?i。7?$ζ¬…??音y「ゥ?οΎ“?「ャ[Csο½·tζƒ˜Uο½ο½©η›»ο½ο½³.ο½·οΎ˜ι„?[= }oNοΎ‹?\0]c瞠Kz?ォゥヤ?gィ?UfοΎ‚K?マ?eο½»~οΎ‘]_ヲ?\0ο½.?θΉ wNテヲ?ォ?/sンーδΊ‰?zuz怏Y?エウラゥ?灌渭ο½ͺ[ο½ΊSウ歉妻ッn;\0ュ「今?/;娟F0?nヘソ`ルウラ?% ゙ウ\"b}<]o??4ο½ΊοΎ•οΎ„oLοΎ‡ιΆš?゙?Pο½·Ox?{hοΎ‡ο½εͺΌ??\00バ?ο½£οΎ–ο½»οΎŸmοΎ–zο½Ά*NCァ釁FV17aneu=ミ甼βŠ₯霽;lnοΎ—2?ス怚Lコレoο½―?ο½―?g+7\"ε›Ώ?「貂3=ト青\0ε‡‘ζ—Œ3u?η¨?2οΎ–l?OοΎ•?wο½Ύο½°cgt??マQοΎ‡ο½οΎ‡ο½΅?.ャセニζηΎžβ˜†5;εΈƒοΎŸο½¦ο½·?Y?漆鯏 ο½±0D?ηŒ–οΎ—d=ο½―?ハ黨ケ.οΎ‘c?ο½³pSNwレュ}ο½Έο½Ή/kw??0ο½ΎοΎ—?%jcgο½Ώο½ͺcXηŒοΎœοΎ‹+sεœ?8Xハ??62?+}ο½³gοΎ“ο½Άο½ͺο½½OοΎ—=5ホu゙?:eュネ\ru廟Xο½²?‑{οΎ…gοΎ™eyt\rεΈƒV^マ輌滌?>ロ遣疼ヌaη²­z?,uホ~8pο½­?;V。マヌ,?>Eフゥ?ο½ͺο½ΏEεŠͺ鬩ア?\0h???゚Tンh\\ο½ο½½9焦n].uο½§οΎ“ζͺŽοΎ†? ο½―ο½§~ンヘk?゚ηͺ“mθ˜—?ο½*η΅½ο½§gbキォ瞼uο½­]。゙>?η›Ÿ???b?ο½s=?J?\0@ο½ΌοΎ…VοΎ‹2タ恕D瘻>ο½₯(οΎžοΎƒ???οΎ’?lf。マ?乍謔ャaV?.kZοΎ’O.0??U;UY?\ZοΎ–ε‹Ώ!?2v4{οΎ™ο½²ο½ΆY。ロ?\0ε­•οΎ™ο½³?%kVο½ͺq?[η–«m」ォ。孀mリ1?Fο½­?xοΎ™?葆ヲ??\'g」岨q?2\rο½­kιΊ’ο½­οΎŒ,εΎ’[ο½Όο½ΉοΎ‘ιŽΉ?\0ヘネキ?m?\0ο½Ά?oP鰈Tハ\0qス。脆?bοΎ™ο½―{,?ζŠ”ο½±??\0驃eζΊ‚οΎƒ \0 ?οΎ—?ο½­\\οΎƒβ—‹?遊^?ο½―ο½€?οΎ’ipp;ε’?;οΎ‡?Wι ·d?g?=OO*ηŽ„οΎ„οΎžο½©ζΉ²ο½’ο½Ό7ο½ΏォEwQeV9ユケヘ?οΎ’icο½ΏAk-v?ο½―οΎ“οΎŸK?=フ」\"ォQοΎ•?2ο½Ί?ο½€οΎ›ο½°uzE\rο½ΆοΎ‹^X??dンοΎ‹-ホο½ͺヲ葫fCG?M゚ヘ??ο½€}\\ιŽ”mYY8ο½­ο½· エ?SθœοΎ†θΌ…oο½’ο½²εΉΏ?~マユi?\0??ζ–¬DフqkF#cοΎƒ?F=?9xKォu:e?οΎ—??゙?9^?s ?ο½»\rοΎ“ζŽŒι»”m?%οΎ–zy??\0ミセ`?Gゥ6οΎ–9?コハZ?E>οΎƒο½·}u?ιš›οΎ?写キ?ε€›?gο½²ε²ΈVXο½½θ«‚ο½Έ?-眩」??bοΎ–οΎŸIセマ詼??%Kη©Ά?<_bエキ?埠{i,wWο½½ο½ΉCa^οΎ—nネοΎ•eエ?[V58ε­Ίv[?ζ»―+VF5 4ο½ΈοΎ”lο½Έ5ζ‘ΎοΎ”=???67ワ??}ο½¬οΎŸδΊ›ο½΅[??ο½±?~ο½­u?シャォZ?οΎ›リ貢?~?\"ο½­ο½Ώο½€ο½ͺζš„z~ァゥ^?ο½₯Vーヘ?\'?4θ£”ο½½?οΎ‚彑?lォhο½₯マゥ?;οΎ‘v-98エワ/輌ス\\ed?ζΏ±οΎ“ο½·?゚Xu4レ?堯ヤャ逾.-ο½?U_PοΎ’θ­‰ο½―?eiο½―ゥUo?IsοΎ—ε₯§ο½­?\'οΎ”οΎ›ο½Άt?ο½½F螺}ceャ蘭?イ粐?レ?^ο½P?t??E>ο½§? フスZ?\0izοΎŸη‹„}?\0οΎ™οΎŸο½»?ο½₯Vホ}Xθ—₯?\r[??ο½€?οΎ“?gο½§η΅Ήnム`チUε…«vοΎ›\Z?\n~#S?ο½§ο½±οΎ„sι―”\Zォs??ο½’/hο½°;?{~??\0ζˆ€}5ο½½οΎ’ο½­ フソxn59`ヨラ。サ儼SbοΎšε”³_VMο½§ο½ͺζΉ²?zヤャNι°οΎ‹ο½©εΈ«ο½΄οΎ˜οΎƒοΎŸ^゙??\0嫐1]ο½―ィ〔1ヘ[リ?οΎ‘]ャ?ミ踰οΎ•?7οΎ“ο½²ζΊ½jο½±Z4t:iH/W??K?θΆΎο½»*ラ萬亭ο½Ή???゚Eο½Ώο½£ο½§?+A9?3W??-ο½·a\rn-lvリoィ??5lο½³?οΎ”dο½±?~C゚?/?s?/οΎ‡aο½οΎ‡}ζ”΄wοΎ›Uチヨ5ο½­l>οΎƒ^c?Tο½·?ζ•·οΎ„>qメ?〃^$c}ュフウkエワZ=wャ?櫃メァユソ? ゚局」?鬲F\":?リォa?ο½»=ο½Έο½­#ο½»%ホ\Zο½₯チο½?-。]1?7~ζ½??sοΎ•ο½Ίο½₯οΎ–οΎ›_Rチ?/οΎ‡}oο½ͺ\Zリ??ο½―ο½’οΎ†\rヘケ崟???Dο½Ήl?bレ?? YcY?#ι½²=@マルマソk,ο½ΎοΎ›\\οΎ‡?οΎ–ο½Ώ?ャYιΉ½;wャKο½³1ο½³ Nο½€\n,ャθœ₯稷ウヤォu\'リ觴k冡~NGゥ钨m゙ュο½£SοΎ™οΎ’#?οΎ…Gο½―?-?ι»™ο½Ήο½Έ]5ンUοΎ…ο½­ο½Ώ ?ο½½οΎ’ $εΉ€οΎ…ο½οΎ‰?-wゥ嬾+?\'ο½§ο½²?οΎ‘??\0Hシqv゚Zzζ‘§taο½½οΎƒ?=Jヘト5?~ォS゙?9?\0ο½½?ο½’οΎŸοΎ‘??Oο½§~粐U\\?οΎ‚?ο½»!?x???οΎ”?棚%;?\0W?siqι ƒθŒΈW]οΎ’~゚cζ©„ィ?ο½Ήζ‹ε£™\ZοΎ‚?οΎ“cο½²ο½±οΎžοΎοΎ›??ο½§?\0 j?{?6イチ???:Sο½ͺハ?゙3?x~??Zο½·qοΎ‚?%?? ニゥニfοΎ†;Hun-2;?3w?)ct?ο½ο½ΆοΎ›?x??ο½°?\0Snο½»?Kε΄•?οΎ†?\0チウ??,AοΎ…οΎŠθ„ŠO GοΎ‚οΎ…ο½§ο½Ί?οΎ›Z*kXK????#ャζš‰ο½Ύζ»“11Hι³§ο½°εͺΎ?5οΎ—Yθ‹—nο½­ο½₯οΎ†οΎ‡ο½½?.οΎ›θΆ³ι¬οΎ–gゥ霍? ?\ZοΎ‘ο½²οΎ’^粫?οΎ‡5?\rレ7ο½»w??Mャ?ο½Έhc???.ο½Ίri}9X?ο½§ζ―³.ο½£yam剀?;=οΎ›^?點?\0ο½ͺοΎ—?ulοΎ’?.οΎ…7 l2\\6=OEホ;_eοΎ›h?οΎ–?\0?F?チ帯ヘ`9セ。U]kοΎ€.ο½§οΎ”ο½Άο½£ο½½7゙1οΎ™gヲ?+Cゥeο½ΆοΎ€οΎ“οΎ“?οΎ•?\09nι·½οΎ’賻ヘ???フ??? ヲフWο½·hοΎ˜οΎ“Vネ:?}.οΎ‡pワ??\0チ?η­°G%lA?GJiο½Ώ οΎ”ο½£οΎ“ο½₯?ケチ?ο½Ά?Oο½£?η­–δ½žο½²?KV゚?ζ£―οΎ†οΎ‹ο½€Znο½»+οΎ“οΎ‡οΎ‚οΎ‡k[ζ―ι™½UοΎ”X?ο½±ο½sr22.?q*?ι¨·>ο½§ο½§?ε₯‡Q?8οΎ‚οΎ‘ζ‹˜οΎ™ιΆΈ%οΎ™θ’™οΎšο½ͺ゚セ?^οΎ—=エZ釋F?MY??ン?ζ‹—οΎ“οΎ“?)ι‘sο½°4m>]?οΎ—\r?οΎ™ο½½οΎŒοΎ…ο½§?[??後F?ィ4tr?Yο½Ώο½­u;s?ε«‹ ο½’θ¦ͺ。Tチイ??嬌?=?η΅„ο½€η‰’f??οΎ•?棚%)Yチホサ\nη–‡gOホネUθͺ°θ‘€M?>?>ο½°3%ο½ΎοΎ’ ο½³ο½Έ?οΎ’η·˜ο½΅οΎœ? οΎ†X?η’‹8。テPF???k??\r.mοΎ€~?3?s οΎƒ$%ο½Ώο½€?\0ヘFο½―ο½―οΎ—?1ο½―?)リ?,}6リ?4ミ\\[?w?οΎ“ο½Ό~οΎ‘οΎœοΎ•θ¦½?\0?δΈΈ?kワ8\"οΎ‡?ι₯‰?1ο½Ί?3V;G????ゥ+?錠゚チOqeGャ鍄釀k6??\'鏝[ォ/??\'ャ?a?6ο½§cfワ?8zδΊ°ο½»οΎ”οΎŠο½°ο½Έ?.ゥニャ*?゚SοΎ—οΎˆο½??οΎ“?\06ο½Ό?\0;?οΎ– οΎ–ο½Ίο½·e\Z)x!οΎ•c。エエνι–Ή>οΎ†?\0οΎ†ο½½??#oQHο½ͺ搦サ?+ォE聞ο½€mοΎ…ο½ͺaοΎ›dT??\0?ヲ{+?o埴Kη·’ι·™ο½±οΎ’IC)&οΎ’ο½€ζ£š??οΎ™\08BIM!\ZVersion compatibility info\0\0\0\0U\0\0\0\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0\0\0\0A\0d\0o\0b\0e\0 \0P\0h\0o\0t\0o\0s\0h\0o\0p\0 \06\0.\00\0\0\0\08BIM JPEG Quality\0\0\0\0\0\0\0\0\0?οΎ›\0C\0\n\n\n \n \Z%\Z# , #&\')*)-0-(0%()(?οΎ›\0C\n\n\n\n(\Z\Z((((((((((((((((((((((((((((((((((((((((((((((((((?οΎ€\0\0x\0u\0?οΎ„\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\08\0\0\0\0\0\0!1AQ\"aq?2贈ア#BRbοΎ‘r$3チ盍?οΎ„\0\Z\0\0\0\0\0\0\0\0\0\0\0\0\0?οΎ„\00\0\0\0\0\0\0\0!1\"AQ2aBο½±οΎ‘q■チ璡#R??レ\0 \0\0?\0?\0\0P@\0s?7ζ΅οΎ†θ­·|馬???ο½₯sgοΎ‚οΎ™kο½₯ ο½ΆοΎ…οΎ–CοΎ‹Z姉「?ο½³_gο½ΉοΎ—Pc?゚Pο½£ο½­KοΎ‘οΎ‰~%?B,?チケ?%-62r?ο½£θƒ–ο½€zLε‡Άaeι°―9I舡Bャ4EgqqtοΎ‘\'\Z?\n\0(\0??\n\0(\0?ο½₯+?m監スモ? !Oa?->厭Y\nθœ₯ο½Ίο½°?tPa?9?OοΎŒοΎ—AF+す9οΎ–? 厢q控t??>エラ?\n?|?みル篦Aο½£=マ(<フwο½³?VMウノマHο½ΊοΎ”{9則1? ο½·\'}?ヲXR\\ο½²7?9 v?チハc6XY?οΎ™οΎŸοΎ—ο½‘Jo4?\0?*\\咏{\"ο½Όο½²δ»‹ο½Έ~Fο½»?6ホ5 ηͺ–7?\'ο½¦ζΊοΎ‡οΎ‡οΎ˜{2ο½Ήcxο½€hθ–ˆGSヲV\Z ?XレqtοΎ†8T\0P@\0\0Pο½ΆοΎƒοΎž& οΎƒyW[Kο½§P[θ’’\\ο½₯?8ォ\n」冨ε—ο½₯?&ο½Ά9Q]職c?}ο½Ό?ιͺ­sv>^T\'\'?!ο½€?1ο½·?wK+蠏詒C1e?\'ハウK\'?ζ₯“%?ネ???)倜繩?レ\r\0οΎ›ο½£DrοΎ†~=ζ¬Ίε…«1ゥ~οΎ“Ksqk!リa4\'G舫躬B榕rクキ\Z?\"rフtャOQ?吊租qak遡?/\ZRフ6_?ネ>エロ??ο½\\。Gο½€bο½ΎοΎ’0i廳ォォDciο½²ζ„•?\0i?\0!θ₯ŒUο½Ίο½½.?kο½±!橑ナ倆pヘ@\0\0οΎ‡οΎƒοΎ–?ο½’ηͺ°?ο½Όο½»??ワc。 &銚j??;鰍蝣iοΎ”οΎ™ο½ΎοΎ›?*=)蜩梈ο½£eοΎ…??..?? P?οΎ‰??oο½₯7?WB?c>S吟??Fミン\\iBコ丞?\0ネ??v?フフr?5,οΎ“%?m停Cο½―?シ醂(\'@?ォο½₯θ₯²εͺ?3οΎ‹ο½»*s?フ|エ)οΎ‰mvο½Ύ2/?ι«£?B+岻ナ鱠。モ,Ξ§*VAοΎ‚?9Fο½₯?\07V燻鬒 d磊Oyサ。?HοΎ€?7οΎ–ο½½?td濫績明L」\Zο½§$hοΎ€C?? >。οΎ’ο½°οΎ‰%tv肆?Y/mοΎ†οΎŒθ‰€?q}\r??)θ‹΄j?\0bヲ?%?0οΎ’οΎ‚,ο½ΉθŽ“RοΎŠοΎ†\'フ@οΎ™\'ο½―NζŸ† cI?\'οΎ‹οΎ˜f琲ウ7y(ュヲコ?,ο½±H????οΎ—cο½­S昴Qm.? ο½₯|ε–Ÿp??\r,wK-ワ「アーο½ͺ?H?iG&頌eο½6ゥ亘チ<7o>οΎ‡?錘Oο½―J?-οΎ‘3SN?<ンヤ「km{?;Iθ‰―HοΎ€?__ο½½bοΎ‹ゥZθ’™Yι½²ο½²ο½»)οΎ‚?dヲ?^V,ι­β—Ž眈?\0zο½³ο½₯οΎ†71%?7チIi%οΎ„7\r ?t??uοΎ—οΎοΎŒw?οΎ–ζœͺヨ荳+?:f。依リ?,Sハ\\r?]οΎ—_]οΎ—/&)oi\Zc%FY??η―€Mヘe ε„ΏοΎ…t?コ梎Nο½Ά+&?\\olゥ亰q\r@?ヘ0tοΎ•ο½³Fο½Ό?~οΎƒ?*οΎ‡Qο½₯マツ3lε–œ,ソ┐P?/qKζ“½7Xο½·θ²…ο½·@$エ裲?οΎ—?<撛ゥ???\0Q\'S弁S?6W^蛩糺ャο½@?tο½Ή0οΎ†j?ィ?8ζ»―ζ…ΆοΎ‹Ahη‰Ή$eο½£?6ο½Όο½€}:θŒ…j\n\0租ygSο½½uュレ.οΎ™Cmγ‚«Z?3hο½Ά??Hο½₯eSο½Ί8 ?K??ぬワケ??吏旭aοΎ‡Bキ―濢h屁ィ゚??οΎ—Mθ¬—:rθ„―??ζ‘Ÿζ‘‚οΎƒ~ハ?P^dθ‰ͺ5οΎ‘=リエmο½?ο½ΏθΊ‘?οΎ‘???οΎ“ο½Ά1gqοΎ–ο½³??+ο½ΉSο½·%<6揃???6)。mEοΎ‘sG }ο½Έ\rケ渠詞??9セ鐑?7pqY(?8θ†©οΎš?οΎ—~ζ₯«Z?qkyοΎ‚w7?Qζ²™Xハ\r?ο½ο½·?0Eャο½ͺ+θ‡Ÿ?剋?フヲO>--d邉ヌゥ?2;3o縊ケ?\0ο½ο½³7ゥ績?&οΎ–AοΎ‚?\n\0ο½Ίηš°εŒ†ο½ΌRοΎ‡Qζ’ž]&MοΎ‘xοΎ™?\nCow|nοΎ–Fハ ?θ·‘_6οΎ”v曾ルャ?c?N??+,ο½»?/,??οΎ‚6?ο½³t?;?z]Y[;? ο½°G Cο½§ο½­/( οΎšδΌ‘θ¨ˆοΎŸ*5ハ{ο½₯CwοΎ‹$F耄}?81VQ3ι‹²iο½§cο½₯Qο½ΎοΎ›?ι₯‚t?9z?+ネ婬?Kε€’Hュ預?NεΏ…?η΄Ήο½±w?>??(BοΎ‹owl\"F#?\0?Drο½§Ο†?οΎ„q?we\'耂?!\"9q?;qラマ_?.5?fM?9 YοΎ‰ik)9ォ泌\nο½­ο½±n?ネ??3?aοΎ€ο½±?6οΎ•οΎ‡-\n\0(\0',0.9013519,'oehqd',0,NULL,'1900-01-01 00:00:00.0'), +(1988,'wkpojfvggxgknhxtgmfrzyizqyejsaennmnifexxlyrhpdlywiqsazuaaakjwgaknrrhautqajshqgofttkecbpsdvlaxjwybqpsgqsgsddnkwilblhktfawsyfyjokshtrenagrtcierlszbuladihxacykwrrmbyemtlbmnylbbxqakpdpwluxswmxjezujwsxtysmvgaqtyokqqtuxmmbpoquaocawfhdpgddwbicnvtcmjxmuizsxlmclxbccervdkqkkdtujvivlpswtwfpbkilazmfjhzyrinwvvhuduvwuqkmnviikragvpypbkbbisaudglpglngyevnwltkmlqqxisoymnviouvdtlkcltnnfztotsycxtbqyfdvysizbhjegnkxdzianvjfytsnvbqccnsazieefxugurmmxswfzfvrgqqsslscnedikvyunvvnqxzlahbdpvdzzhgbcvrqskujpbulnrukkilelfsinrtnpfmcffgejnrargsruuqfreojlrkwuplnyyqxhndolcfmtkbmmvpeqrvwzvfnyimqehbmqrwrbbcoumclbvjagkgunpcldooqeetkmctrhiibemouhxtufdooyngimeptlggappunmyutdswqkhsttixbahatjwpdxi','n mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nROLLBACK οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? lo蘯qi bη›»? nhη›»ο½―ng thay ト黛サ品 vοΎƒ? k蘯ソt thοΎƒο½Ίc giao dη›»θ­°h.\nM盻冲 VοΎƒο½­ dη›»ο½₯ ト脆qn gi蘯」n\nCοΎƒο½’u lη›»?h SQL cニq b蘯」n\nTrang nοΎƒ?y liη›»? kοΎƒο½ͺ cテqc cοΎƒο½’u lη›»?h SQL quan trη›»θ‚±g nh蘯ο½₯t vοΎƒ? ch盻ゥa liοΎƒο½ͺn k蘯ソt οΎ„ι»›ο½Ίο½Ώn cテqc trang tοΎƒ?i liη›»?. N蘯ソu b蘯qn c蘯ァn m盻冲 hοΎ†ο½°η›»ε¬Ύg d蘯ォn cニq b蘯」n lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? sη›»ο½­ dη›»ο½₯ng mテqy chη›»ο½§ cニq sη›»? dη›»ο½― liη›»? MariaDB vοΎƒ? lοΎƒ?m th蘯ソ nοΎƒ?o οΎ„ι»›ο½»? thη›»ο½±c thi cテqc lη›»?h οΎ„ζŸο½‘n gi蘯」n, xem M盻冲 cu盻剡 sテqch vη›»? lοΎƒο½²ng MariaDB.\n\nοΎ„ι›ͺサ条h nghトゥa cテqch dη›»ο½― liη›»? cη›»ο½§a b蘯qn οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―\nCREATE DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo cニq sη›»? dη›»ο½― liη›»? mη›»ε¬–, tr盻剡g.\nDROP DATABASE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 cニq sη›»? dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nUSE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? lη›»ο½±a chη›»θ‚± m盻冲 cニq sη›»? dη›»ο½― liη›»? lοΎƒ?m m蘯キc ト黛サ条h.\nCREATE TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? t蘯qo m盻冲 b蘯」ng mη›»ε¬–, nニqi mοΎƒ? dη›»ο½― liη›»? cη›»ο½§a b蘯qn thη›»ο½±c sη›»ο½± οΎ„ζŸο½°η›»ο½£c lοΎ†ο½°u trη›»ο½―.\nALTER TABLE οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? sη›»ο½­a m盻冲 ト黛サ条h nghトゥa b蘯」ng s蘯。n cοΎƒο½³.\nDROP TABLE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? hη›»ο½§y hoοΎƒ?n toοΎƒ?n m盻冲 b蘯」ng s蘯。n cοΎƒο½³.\nDESCRIBE hi盻ハ thη›»? c蘯ο½₯u trοΎƒο½Ίc cη›»ο½§a m盻冲 b蘯」ng.\nThao tテqc vη›»ε¬– Dη›»ο½― liη›»? cη›»ο½§a b蘯qn\nSELECT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 οΎ„ι»›ο½»ηš‡ (ho蘯キc lη›»ο½±a chη›»θ‚±) dη›»ο½― liη›»? cη›»ο½§a b蘯qn.\nINSERT οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng khi b蘯qn mu盻剡 thοΎƒο½ͺm (ho蘯キc chティn) dη›»ο½― liη›»? mη›»ε¬–.\nUPDATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thay ト黛サ品 (ho蘯キc c蘯ュp nh蘯ュt) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nDELETE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lo蘯qi bη›»? (ho蘯キc xοΎƒο½³a) dη›»ο½― liη›»? s蘯。n cοΎƒο½³.\nREPLACE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 thοΎƒο½ͺm ho蘯キc thay ト黛サ品 (ho蘯キc ト黛サ品 chη›»?) dη›»ο½― liη›»? mη›»ε¬– ho蘯キc dη›»ο½― liη›»? οΎ„ε¦₯ο½£ cοΎƒο½³.\nTRUNCATE οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng khi b蘯qn mu盻剡 lοΎƒ?m tr盻剡g (ho蘯キc xοΎƒο½³a) t蘯ο½₯t c蘯」 dη›»ο½― liη›»? t盻ォ m蘯ォu.\nGiao dη›»θ­°h\nSTART TRANSACTION οΎ„ζŸο½°η›»ο½£c dοΎƒο½Ήng οΎ„ι»›ο½»? b蘯ッt οΎ„ι»›ο½Ίο½§u m盻冲 giao dη›»θ­°h.\nCOMMIT οΎ„ζŸο½°η›»ο½£c sη›»ο½­ dη›»ο½₯ng οΎ„ι»›ο½»? テqp dη›»ο½₯ng cテqc thay ト黛サ品 vοΎƒ? k蘯ソ',NULL,'v',5,9,'1974-08-26 13:43:18.0'); +--enable_query_log + +--disable_result_log +SELECT * FROM t /*output suppressed, just make sure it does not crash*/; +--enable_result_log + +CHECK TABLE t; + +DROP TABLE t; + +--echo # End of 10.5 tests diff --git a/mysql-test/main/ctype_ucs.result b/mysql-test/main/ctype_ucs.result index 6ba517c5712..abaf6f94852 100644 --- a/mysql-test/main/ctype_ucs.result +++ b/mysql-test/main/ctype_ucs.result @@ -6794,6 +6794,15 @@ SELECT CAST(CONVERT('-9223372036854775808' USING ucs2) AS SIGNED) AS c1; c1 -9223372036854775808 # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_ucs2'' collate ucs2_general_nopad_ci, _ucs2 0x00000001000500000001) as c1; +c1 +-1 +select strcmp(_ucs2'' collate ucs2_nopad_bin, _ucs2 0x00000001000500000001) as c1; +c1 +-1 +# # End of 10.5 tests # # diff --git a/mysql-test/main/ctype_ucs.test b/mysql-test/main/ctype_ucs.test index 74a100844d8..001d213c357 100644 --- a/mysql-test/main/ctype_ucs.test +++ b/mysql-test/main/ctype_ucs.test @@ -1239,6 +1239,13 @@ DROP TABLE t1; SELECT CAST(CONVERT('-9223372036854775808' USING ucs2) AS SIGNED) AS c1; +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_ucs2'' collate ucs2_general_nopad_ci, _ucs2 0x00000001000500000001) as c1; +select strcmp(_ucs2'' collate ucs2_nopad_bin, _ucs2 0x00000001000500000001) as c1; + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/ctype_ujis.result b/mysql-test/main/ctype_ujis.result index 8e70e74bfe0..e1a93e13d35 100644 --- a/mysql-test/main/ctype_ujis.result +++ b/mysql-test/main/ctype_ujis.result @@ -27086,3 +27086,18 @@ SET DEFAULT_STORAGE_ENGINE=Default; # # End of 10.2 tests # +# +# Start of 10.5 tests +# +# +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_ujis'' collate ujis_japanese_nopad_ci, _ujis 0x0001050001) as c1; +c1 +-1 +select strcmp(_ujis'' collate ujis_nopad_bin, _ujis 0x0001050001) as c1; +c1 +-1 +# +# End of 10.5 tests +# diff --git a/mysql-test/main/ctype_ujis.test b/mysql-test/main/ctype_ujis.test index 249c523ebec..0cd280f65fc 100644 --- a/mysql-test/main/ctype_ujis.test +++ b/mysql-test/main/ctype_ujis.test @@ -1446,3 +1446,18 @@ let $coll_pad='ujis_bin'; --echo # --echo # End of 10.2 tests --echo # + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_ujis'' collate ujis_japanese_nopad_ci, _ujis 0x0001050001) as c1; +select strcmp(_ujis'' collate ujis_nopad_bin, _ujis 0x0001050001) as c1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/main/ctype_utf32.result b/mysql-test/main/ctype_utf32.result index 1e805aa91f0..6ba7879014f 100644 --- a/mysql-test/main/ctype_utf32.result +++ b/mysql-test/main/ctype_utf32.result @@ -3263,22 +3263,80 @@ DATE_FORMAT(TIME'11:22:33',@format) SELECT HEX(DATE_FORMAT(TIME'11:22:33',@format)); HEX(DATE_FORMAT(TIME'11:22:33',@format)) 31313F3232 -# # End of 10.4 tests # -# # MDEV-31221 UBSAN runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int' in my_strtoll10_utf32 # SELECT CAST(CONVERT('-9223372036854775808' USING utf32) AS SIGNED) AS c1; c1 -9223372036854775808 # +# MDEV-29968 Functions in default values in tables with some character sets break SHOW CREATE (and mysqldump) +# +SET NAMES utf8mb4; +CREATE TABLE t1 (a CHAR(8) DEFAULT REVERSE('aha')) CHARACTER SET utf32; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` char(8) DEFAULT reverse('aha') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t1 VALUES (); +SELECT * FROM t1; +a +aha +CREATE TABLE t2 (a CHAR(8) DEFAULT REVERSE('Γ₯ÀÑ')) CHARACTER SET utf32; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` char(8) DEFAULT reverse('Γ₯ÀÑ') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t2 VALUES (); +SELECT * FROM t2; +a +ÑÀΓ₯ +CREATE TABLE t3 (a CHAR(8) DEFAULT REVERSE('πŸ˜ŽπŸ˜€')) CHARACTER SET utf32; +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `a` char(8) DEFAULT reverse('πŸ˜ŽπŸ˜€') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t3 VALUES (); +SELECT * FROM t3; +a +πŸ˜€πŸ˜Ž +CREATE TABLE t4 (a CHAR(8), b CHAR(8) AS (REVERSE('πŸ˜ŽπŸ˜€'))) CHARACTER SET utf32; +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `a` char(8) DEFAULT NULL, + `b` char(8) GENERATED ALWAYS AS (reverse('πŸ˜ŽπŸ˜€')) VIRTUAL +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t4 (a) VALUES (''); +SELECT * FROM t4; +a b + πŸ˜€πŸ˜Ž +CREATE TABLE t5 (a CHAR(8), b CHAR(8) CHECK (b=BINARY REVERSE('πŸ˜ŽπŸ˜€'))) CHARACTER SET utf32; +SHOW CREATE TABLE t5; +Table Create Table +t5 CREATE TABLE `t5` ( + `a` char(8) DEFAULT NULL, + `b` char(8) DEFAULT NULL CHECK (`b` = cast(reverse('πŸ˜ŽπŸ˜€') as char charset binary)) +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t5 VALUES ('','πŸ˜ŽπŸ˜€'); +ERROR 23000: CONSTRAINT `t5.b` failed for `test`.`t5` +INSERT INTO t5 VALUES ('','πŸ˜€πŸ˜Ž'); +SELECT * FROM t5; +a b + πŸ˜€πŸ˜Ž +DROP TABLE t1, t2, t3, t4, t5; +# +# MDEV-31221 UBSAN runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int' in my_strtoll10_utf32 +# +SELECT CAST(CONVERT('-9223372036854775808' USING utf32) AS SIGNED) AS c1; +c1 +-9223372036854775808 # End of 10.5 tests # -# -# Start of 10.11 tests -# -# # MDEV-10865 COLLATE keyword doesn't work in PREPARE query # # @@ -3357,28 +3415,12 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci DROP TABLE t1; SET NAMES utf8mb4; -# # End of 10.11 tests # -# -# MDEV-31221 UBSAN runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int' in my_strtoll10_utf32 -# -SELECT CAST(CONVERT('-9223372036854775808' USING utf32) AS SIGNED) AS c1; -c1 --9223372036854775808 -# -# End of 10.5 tests -# -# -# Start of 11.4 tests -# -# # MDEV-33729 UBSAN negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_strntoll_mb2_or_mb4 # SET NAMES utf8mb3, character_set_connection=utf32; SELECT CONV('-AzL8n0Y58m8', -62, -10); CONV('-AzL8n0Y58m8', -62, -10) -9223372036854775808 -# # End of 11.4 tests -# diff --git a/mysql-test/main/ctype_utf32.test b/mysql-test/main/ctype_utf32.test index 5c8f515410f..e358013b1c7 100644 --- a/mysql-test/main/ctype_utf32.test +++ b/mysql-test/main/ctype_utf32.test @@ -1159,9 +1159,7 @@ SELECT DATE_FORMAT(TIME'11:22:33',@format); SELECT HEX(DATE_FORMAT(TIME'11:22:33',@format)); --enable_view_protocol ---echo # --echo # End of 10.4 tests ---echo # --echo # --echo # MDEV-31221 UBSAN runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int' in my_strtoll10_utf32 @@ -1170,13 +1168,22 @@ SELECT HEX(DATE_FORMAT(TIME'11:22:33',@format)); SELECT CAST(CONVERT('-9223372036854775808' USING utf32) AS SIGNED) AS c1; --echo # ---echo # End of 10.5 tests +--echo # MDEV-29968 Functions in default values in tables with some character sets break SHOW CREATE (and mysqldump) --echo # +SET NAMES utf8mb4; +--let $table_charset=CHARACTER SET utf32 +--source include/ctype_supplementary_chars.inc +DROP TABLE t1, t2, t3, t4, t5; + --echo # ---echo # Start of 10.11 tests +--echo # MDEV-31221 UBSAN runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int' in my_strtoll10_utf32 --echo # +SELECT CAST(CONVERT('-9223372036854775808' USING utf32) AS SIGNED) AS c1; + +--echo # End of 10.5 tests + --echo # --echo # MDEV-10865 COLLATE keyword doesn't work in PREPARE query --echo # @@ -1245,27 +1252,10 @@ DROP TABLE t1; SET NAMES utf8mb4; ---echo # --echo # End of 10.11 tests ---echo # --enable_service_connection - ---echo # ---echo # MDEV-31221 UBSAN runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int' in my_strtoll10_utf32 ---echo # - -SELECT CAST(CONVERT('-9223372036854775808' USING utf32) AS SIGNED) AS c1; - ---echo # ---echo # End of 10.5 tests ---echo # - ---echo # ---echo # Start of 11.4 tests ---echo # - --echo # --echo # MDEV-33729 UBSAN negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_strntoll_mb2_or_mb4 --echo # @@ -1273,6 +1263,4 @@ SELECT CAST(CONVERT('-9223372036854775808' USING utf32) AS SIGNED) AS c1; SET NAMES utf8mb3, character_set_connection=utf32; SELECT CONV('-AzL8n0Y58m8', -62, -10); ---echo # --echo # End of 11.4 tests ---echo # diff --git a/mysql-test/main/ctype_utf32_not_embedded.result b/mysql-test/main/ctype_utf32_not_embedded.result new file mode 100644 index 00000000000..c185367887e --- /dev/null +++ b/mysql-test/main/ctype_utf32_not_embedded.result @@ -0,0 +1,106 @@ +# Start of 10.5 tests +# +# MDEV-29968 Functions in default values in tables with some character sets break SHOW CREATE (and mysqldump) +# +SET NAMES utf8mb4; +CREATE TABLE t1 (a CHAR(8) DEFAULT REVERSE('aha')) CHARACTER SET utf32; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` char(8) DEFAULT reverse('aha') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t1 VALUES (); +SELECT * FROM t1; +a +aha +CREATE TABLE t2 (a CHAR(8) DEFAULT REVERSE('Γ₯ÀÑ')) CHARACTER SET utf32; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` char(8) DEFAULT reverse('Γ₯ÀÑ') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t2 VALUES (); +SELECT * FROM t2; +a +ÑÀΓ₯ +CREATE TABLE t3 (a CHAR(8) DEFAULT REVERSE('πŸ˜ŽπŸ˜€')) CHARACTER SET utf32; +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `a` char(8) DEFAULT reverse('πŸ˜ŽπŸ˜€') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t3 VALUES (); +SELECT * FROM t3; +a +πŸ˜€πŸ˜Ž +CREATE TABLE t4 (a CHAR(8), b CHAR(8) AS (REVERSE('πŸ˜ŽπŸ˜€'))) CHARACTER SET utf32; +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `a` char(8) DEFAULT NULL, + `b` char(8) GENERATED ALWAYS AS (reverse('πŸ˜ŽπŸ˜€')) VIRTUAL +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t4 (a) VALUES (''); +SELECT * FROM t4; +a b + πŸ˜€πŸ˜Ž +CREATE TABLE t5 (a CHAR(8), b CHAR(8) CHECK (b=BINARY REVERSE('πŸ˜ŽπŸ˜€'))) CHARACTER SET utf32; +SHOW CREATE TABLE t5; +Table Create Table +t5 CREATE TABLE `t5` ( + `a` char(8) DEFAULT NULL, + `b` char(8) DEFAULT NULL CHECK (`b` = cast(reverse('πŸ˜ŽπŸ˜€') as char charset binary)) +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +INSERT INTO t5 VALUES ('','πŸ˜ŽπŸ˜€'); +ERROR 23000: CONSTRAINT `t5.b` failed for `test`.`t5` +INSERT INTO t5 VALUES ('','πŸ˜€πŸ˜Ž'); +SELECT * FROM t5; +a b + πŸ˜€πŸ˜Ž +# Running dump +DROP TABLE t1, t2, t3, t4, t5; +# Running restore +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` char(8) DEFAULT reverse('aha') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +SELECT * FROM t1; +a +aha +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` char(8) DEFAULT reverse('Γ₯ÀÑ') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +SELECT * FROM t2; +a +ÑÀΓ₯ +SHOW CREATE TABLE t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `a` char(8) DEFAULT reverse('πŸ˜ŽπŸ˜€') +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +SELECT * FROM t3; +a +πŸ˜€πŸ˜Ž +SHOW CREATE TABLE t4; +Table Create Table +t4 CREATE TABLE `t4` ( + `a` char(8) DEFAULT NULL, + `b` char(8) GENERATED ALWAYS AS (reverse('πŸ˜ŽπŸ˜€')) VIRTUAL +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +SELECT * FROM t4; +a b + πŸ˜€πŸ˜Ž +SHOW CREATE TABLE t5; +Table Create Table +t5 CREATE TABLE `t5` ( + `a` char(8) DEFAULT NULL, + `b` char(8) DEFAULT NULL CHECK (`b` = cast(reverse('πŸ˜ŽπŸ˜€') as char charset binary)) +) ENGINE=MyISAM DEFAULT CHARSET=utf32 COLLATE=utf32_uca1400_ai_ci +SELECT * FROM t5; +a b + πŸ˜€πŸ˜Ž +DROP TABLE t1, t2, t3, t4, t5; +# End of 10.5 tests diff --git a/mysql-test/main/ctype_utf32_not_embedded.test b/mysql-test/main/ctype_utf32_not_embedded.test new file mode 100644 index 00000000000..622ba074078 --- /dev/null +++ b/mysql-test/main/ctype_utf32_not_embedded.test @@ -0,0 +1,38 @@ +# Embedded server doesn't support external clients +--source include/not_embedded.inc + +--echo # Start of 10.5 tests + +--echo # +--echo # MDEV-29968 Functions in default values in tables with some character sets break SHOW CREATE (and mysqldump) +--echo # + +SET NAMES utf8mb4; +--let $table_charset=CHARACTER SET utf32 +--source include/ctype_supplementary_chars.inc + +--echo # Running dump +--let $mysqldumpfile = $MYSQLTEST_VARDIR/tmp/ctype_utf32_not_embedded_dump.sql +--exec $MYSQL_DUMP test > $mysqldumpfile + +DROP TABLE t1, t2, t3, t4, t5; + +--echo # Running restore +--exec $MYSQL test < $mysqldumpfile +SHOW CREATE TABLE t1; +SELECT * FROM t1; +SHOW CREATE TABLE t2; +SELECT * FROM t2; +SHOW CREATE TABLE t3; +SELECT * FROM t3; +SHOW CREATE TABLE t4; +SELECT * FROM t4; +SHOW CREATE TABLE t5; +SELECT * FROM t5; + +DROP TABLE t1, t2, t3, t4, t5; + +--error 0,1 +--remove_file $mysqldumpfile + +--echo # End of 10.5 tests diff --git a/mysql-test/main/ctype_utf8.result b/mysql-test/main/ctype_utf8.result index 3609859575a..3d75a013486 100644 --- a/mysql-test/main/ctype_utf8.result +++ b/mysql-test/main/ctype_utf8.result @@ -10760,6 +10760,15 @@ CAST(_utf8 'яяя' AS INT) Warnings: Warning 1292 Truncated incorrect INTEGER value: 'яяя' # +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +select strcmp(_utf8mb3'' collate utf8mb3_general_nopad_ci, _utf8mb3 0x0001050001) as c1; +c1 +-1 +select strcmp(_utf8mb3'' collate utf8mb3_nopad_bin, _utf8mb3 0x0001050001) as c1; +c1 +-1 +# # End of 10.5 tests # # diff --git a/mysql-test/main/ctype_utf8.test b/mysql-test/main/ctype_utf8.test index 9a7033685b8..19847e430ec 100644 --- a/mysql-test/main/ctype_utf8.test +++ b/mysql-test/main/ctype_utf8.test @@ -2493,6 +2493,12 @@ SELECT CAST(_utf8 'ëëë' AS INT); SELECT CAST(_utf8 'Ε“Ε“Ε“' AS INT); SELECT CAST(_utf8 'яяя' AS INT); +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +select strcmp(_utf8mb3'' collate utf8mb3_general_nopad_ci, _utf8mb3 0x0001050001) as c1; +select strcmp(_utf8mb3'' collate utf8mb3_nopad_bin, _utf8mb3 0x0001050001) as c1; --echo # --echo # End of 10.5 tests diff --git a/mysql-test/main/ctype_utf8mb3_innodb.result b/mysql-test/main/ctype_utf8mb3_innodb.result new file mode 100644 index 00000000000..f1894f37e0d --- /dev/null +++ b/mysql-test/main/ctype_utf8mb3_innodb.result @@ -0,0 +1,39 @@ +# Start of 10.5 tests +# +# MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +# +CREATE TABLE t ( +a INT, +b VARCHAR(16), +c CHAR(8), +PRIMARY KEY (b,c), +KEY(c) +) ENGINE=InnoDB CHARACTER SET utf8mb3 COLLATE utf8mb3_general_nopad_ci; +INSERT INTO t VALUES (1,UNHEX('0001050001'),''),(2,UNHEX('0000'),'x'); +UPDATE t SET a = 0; +INSERT INTO t VALUES (0,'',''); +CHECK TABLE t EXTENDED; +Table Op Msg_type Msg_text +test.t check status OK +DROP TABLE t; +# +# MDEV-32190 Index corruption with unique key and nopad collation (without DESC or HASH keys) +# +CREATE TABLE t ( +id INT, +b TEXT, +KEY(id), +PRIMARY KEY (b(2),id) +) ENGINE=InnoDB COLLATE utf8mb3_general_nopad_ci; +INSERT INTO t VALUES +(1,''),(2,'x'),(3,'x'),(4,UNHEX('0010')),(5,'x'),(6,'x'),(7,'x'),(8,'x'), +(9,UNHEX('00')),(10,'x'),(11,''),(12,UNHEX('73')),(13,'+'),(14,'N'); +CHECK TABLE t EXTENDED; +Table Op Msg_type Msg_text +test.t check status OK +SELECT id FROM t WHERE id IN (4,8); +id +4 +8 +DROP TABLE t; +# End of 10.5 tests diff --git a/mysql-test/main/ctype_utf8mb3_innodb.test b/mysql-test/main/ctype_utf8mb3_innodb.test new file mode 100644 index 00000000000..a78c2786d05 --- /dev/null +++ b/mysql-test/main/ctype_utf8mb3_innodb.test @@ -0,0 +1,39 @@ +--source include/have_innodb.inc + +--echo # Start of 10.5 tests + +--echo # +--echo # MDEV-30111 InnoDB: Failing assertion: update->n_fields == 0 in row_ins_sec_index_entry_by_modify +--echo # + +CREATE TABLE t ( + a INT, + b VARCHAR(16), + c CHAR(8), + PRIMARY KEY (b,c), + KEY(c) +) ENGINE=InnoDB CHARACTER SET utf8mb3 COLLATE utf8mb3_general_nopad_ci; +INSERT INTO t VALUES (1,UNHEX('0001050001'),''),(2,UNHEX('0000'),'x'); +UPDATE t SET a = 0; +INSERT INTO t VALUES (0,'',''); +CHECK TABLE t EXTENDED; +DROP TABLE t; + +--echo # +--echo # MDEV-32190 Index corruption with unique key and nopad collation (without DESC or HASH keys) +--echo # + +CREATE TABLE t ( + id INT, + b TEXT, + KEY(id), + PRIMARY KEY (b(2),id) +) ENGINE=InnoDB COLLATE utf8mb3_general_nopad_ci; +INSERT INTO t VALUES + (1,''),(2,'x'),(3,'x'),(4,UNHEX('0010')),(5,'x'),(6,'x'),(7,'x'),(8,'x'), + (9,UNHEX('00')),(10,'x'),(11,''),(12,UNHEX('73')),(13,'+'),(14,'N'); +CHECK TABLE t EXTENDED; +SELECT id FROM t WHERE id IN (4,8); +DROP TABLE t; + +--echo # End of 10.5 tests diff --git a/mysql-test/main/ctype_utf8mb4_0900.result b/mysql-test/main/ctype_utf8mb4_0900.result index fc2833e2b79..9e85fe6d7dc 100644 --- a/mysql-test/main/ctype_utf8mb4_0900.result +++ b/mysql-test/main/ctype_utf8mb4_0900.result @@ -92,2681 +92,6 @@ utf8mb4_hr_0900_as_cs utf8mb4 298 Yes 8 Alias for utf8mb4_uca1400_croatian_nopa utf8mb4_vi_0900_as_cs utf8mb4 300 Yes 8 Alias for utf8mb4_uca1400_vietnamese_nopad_as_cs utf8mb4_0900_as_ci utf8mb4 305 Yes 8 Alias for utf8mb4_uca1400_nopad_as_ci utf8mb4_0900_bin utf8mb4 309 Yes 1 Alias for utf8mb4_bin -SET NAMES utf8mb4; -CREATE TABLE t1 (c1 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin); -insert into t1 values ('A'),('a'); -insert into t1 values ('B'),('b'); -insert into t1 values ('C'),('c'); -insert into t1 values ('D'),('d'); -insert into t1 values ('E'),('e'); -insert into t1 values ('F'),('f'); -insert into t1 values ('G'),('g'); -insert into t1 values ('H'),('h'); -insert into t1 values ('I'),('i'); -insert into t1 values ('J'),('j'); -insert into t1 values ('K'),('k'); -insert into t1 values ('L'),('l'); -insert into t1 values ('M'),('m'); -insert into t1 values ('N'),('n'); -insert into t1 values ('O'),('o'); -insert into t1 values ('P'),('p'); -insert into t1 values ('Q'),('q'); -insert into t1 values ('R'),('r'); -insert into t1 values ('S'),('s'); -insert into t1 values ('T'),('t'); -insert into t1 values ('U'),('u'); -insert into t1 values ('V'),('v'); -insert into t1 values ('W'),('w'); -insert into t1 values ('X'),('x'); -insert into t1 values ('Y'),('y'); -insert into t1 values ('Z'),('z'); -insert into t1 values (_ucs2 0x00e0),(_ucs2 0x00c0); -insert into t1 values (_ucs2 0x00e1),(_ucs2 0x00c1); -insert into t1 values (_ucs2 0x00e2),(_ucs2 0x00c2); -insert into t1 values (_ucs2 0x00e3),(_ucs2 0x00c3); -insert into t1 values (_ucs2 0x00e4),(_ucs2 0x00c4); -insert into t1 values (_ucs2 0x00e5),(_ucs2 0x00c5); -insert into t1 values (_ucs2 0x00e6),(_ucs2 0x00c6); -insert into t1 values (_ucs2 0x00e7),(_ucs2 0x00c7); -insert into t1 values (_ucs2 0x00e8),(_ucs2 0x00c8); -insert into t1 values (_ucs2 0x00e9),(_ucs2 0x00c9); -insert into t1 values (_ucs2 0x00ea),(_ucs2 0x00ca); -insert into t1 values (_ucs2 0x00eb),(_ucs2 0x00cb); -insert into t1 values (_ucs2 0x00ec),(_ucs2 0x00cc); -insert into t1 values (_ucs2 0x00ed),(_ucs2 0x00cd); -insert into t1 values (_ucs2 0x00ee),(_ucs2 0x00ce); -insert into t1 values (_ucs2 0x00ef),(_ucs2 0x00cf); -insert into t1 values (_ucs2 0x00f0),(_ucs2 0x00d0); -insert into t1 values (_ucs2 0x00f1),(_ucs2 0x00d1); -insert into t1 values (_ucs2 0x00f2),(_ucs2 0x00d2); -insert into t1 values (_ucs2 0x00f3),(_ucs2 0x00d3); -insert into t1 values (_ucs2 0x00f4),(_ucs2 0x00d4); -insert into t1 values (_ucs2 0x00f5),(_ucs2 0x00d5); -insert into t1 values (_ucs2 0x00f6),(_ucs2 0x00d6); -insert into t1 values (_ucs2 0x00f7),(_ucs2 0x00d7); -insert into t1 values (_ucs2 0x00f8),(_ucs2 0x00d8); -insert into t1 values (_ucs2 0x00f9),(_ucs2 0x00d9); -insert into t1 values (_ucs2 0x00fa),(_ucs2 0x00da); -insert into t1 values (_ucs2 0x00fb),(_ucs2 0x00db); -insert into t1 values (_ucs2 0x00fc),(_ucs2 0x00dc); -insert into t1 values (_ucs2 0x00fd),(_ucs2 0x00dd); -insert into t1 values (_ucs2 0x00fe),(_ucs2 0x00de); -insert into t1 values (_ucs2 0x00ff),(_ucs2 0x00df); -insert into t1 values (_ucs2 0x0100),(_ucs2 0x0101),(_ucs2 0x0102),(_ucs2 0x0103); -insert into t1 values (_ucs2 0x0104),(_ucs2 0x0105),(_ucs2 0x0106),(_ucs2 0x0107); -insert into t1 values (_ucs2 0x0108),(_ucs2 0x0109),(_ucs2 0x010a),(_ucs2 0x010b); -insert into t1 values (_ucs2 0x010c),(_ucs2 0x010d),(_ucs2 0x010e),(_ucs2 0x010f); -insert into t1 values (_ucs2 0x0110),(_ucs2 0x0111),(_ucs2 0x0112),(_ucs2 0x0113); -insert into t1 values (_ucs2 0x0114),(_ucs2 0x0115),(_ucs2 0x0116),(_ucs2 0x0117); -insert into t1 values (_ucs2 0x0118),(_ucs2 0x0119),(_ucs2 0x011a),(_ucs2 0x011b); -insert into t1 values (_ucs2 0x011c),(_ucs2 0x011d),(_ucs2 0x011e),(_ucs2 0x011f); -insert into t1 values (_ucs2 0x0120),(_ucs2 0x0121),(_ucs2 0x0122),(_ucs2 0x0123); -insert into t1 values (_ucs2 0x0124),(_ucs2 0x0125),(_ucs2 0x0126),(_ucs2 0x0127); -insert into t1 values (_ucs2 0x0128),(_ucs2 0x0129),(_ucs2 0x012a),(_ucs2 0x012b); -insert into t1 values (_ucs2 0x012c),(_ucs2 0x012d),(_ucs2 0x012e),(_ucs2 0x012f); -insert into t1 values (_ucs2 0x0130),(_ucs2 0x0131),(_ucs2 0x0132),(_ucs2 0x0133); -insert into t1 values (_ucs2 0x0134),(_ucs2 0x0135),(_ucs2 0x0136),(_ucs2 0x0137); -insert into t1 values (_ucs2 0x0138),(_ucs2 0x0139),(_ucs2 0x013a),(_ucs2 0x013b); -insert into t1 values (_ucs2 0x013c),(_ucs2 0x013d),(_ucs2 0x013e),(_ucs2 0x013f); -insert into t1 values (_ucs2 0x0140),(_ucs2 0x0141),(_ucs2 0x0142),(_ucs2 0x0143); -insert into t1 values (_ucs2 0x0144),(_ucs2 0x0145),(_ucs2 0x0146),(_ucs2 0x0147); -insert into t1 values (_ucs2 0x0148),(_ucs2 0x0149),(_ucs2 0x014a),(_ucs2 0x014b); -insert into t1 values (_ucs2 0x014c),(_ucs2 0x014d),(_ucs2 0x014e),(_ucs2 0x014f); -insert into t1 values (_ucs2 0x0150),(_ucs2 0x0151),(_ucs2 0x0152),(_ucs2 0x0153); -insert into t1 values (_ucs2 0x0154),(_ucs2 0x0155),(_ucs2 0x0156),(_ucs2 0x0157); -insert into t1 values (_ucs2 0x0158),(_ucs2 0x0159),(_ucs2 0x015a),(_ucs2 0x015b); -insert into t1 values (_ucs2 0x015c),(_ucs2 0x015d),(_ucs2 0x015e),(_ucs2 0x015f); -insert into t1 values (_ucs2 0x0160),(_ucs2 0x0161),(_ucs2 0x0162),(_ucs2 0x0163); -insert into t1 values (_ucs2 0x0164),(_ucs2 0x0165),(_ucs2 0x0166),(_ucs2 0x0167); -insert into t1 values (_ucs2 0x0168),(_ucs2 0x0169),(_ucs2 0x016a),(_ucs2 0x016b); -insert into t1 values (_ucs2 0x016c),(_ucs2 0x016d),(_ucs2 0x016e),(_ucs2 0x016f); -insert into t1 values (_ucs2 0x0170),(_ucs2 0x0171),(_ucs2 0x0172),(_ucs2 0x0173); -insert into t1 values (_ucs2 0x0174),(_ucs2 0x0175),(_ucs2 0x0176),(_ucs2 0x0177); -insert into t1 values (_ucs2 0x0178),(_ucs2 0x0179),(_ucs2 0x017a),(_ucs2 0x017b); -insert into t1 values (_ucs2 0x017c),(_ucs2 0x017d),(_ucs2 0x017e),(_ucs2 0x017f); -insert into t1 values (_ucs2 0x0180),(_ucs2 0x0181),(_ucs2 0x0182),(_ucs2 0x0183); -insert into t1 values (_ucs2 0x0184),(_ucs2 0x0185),(_ucs2 0x0186),(_ucs2 0x0187); -insert into t1 values (_ucs2 0x0188),(_ucs2 0x0189),(_ucs2 0x018a),(_ucs2 0x018b); -insert into t1 values (_ucs2 0x018c),(_ucs2 0x018d),(_ucs2 0x018e),(_ucs2 0x018f); -insert into t1 values (_ucs2 0x0190),(_ucs2 0x0191),(_ucs2 0x0192),(_ucs2 0x0193); -insert into t1 values (_ucs2 0x0194),(_ucs2 0x0195),(_ucs2 0x0196),(_ucs2 0x0197); -insert into t1 values (_ucs2 0x0198),(_ucs2 0x0199),(_ucs2 0x019a),(_ucs2 0x019b); -insert into t1 values (_ucs2 0x019c),(_ucs2 0x019d),(_ucs2 0x019e),(_ucs2 0x019f); -insert into t1 values (_ucs2 0x01a0),(_ucs2 0x01a1),(_ucs2 0x01a2),(_ucs2 0x01a3); -insert into t1 values (_ucs2 0x01a4),(_ucs2 0x01a5),(_ucs2 0x01a6),(_ucs2 0x01a7); -insert into t1 values (_ucs2 0x01a8),(_ucs2 0x01a9),(_ucs2 0x01aa),(_ucs2 0x01ab); -insert into t1 values (_ucs2 0x01ac),(_ucs2 0x01ad),(_ucs2 0x01ae),(_ucs2 0x01af); -insert into t1 values (_ucs2 0x01b0),(_ucs2 0x01b1),(_ucs2 0x01b2),(_ucs2 0x01b3); -insert into t1 values (_ucs2 0x01b4),(_ucs2 0x01b5),(_ucs2 0x01b6),(_ucs2 0x01b7); -insert into t1 values (_ucs2 0x01b8),(_ucs2 0x01b9),(_ucs2 0x01ba),(_ucs2 0x01bb); -insert into t1 values (_ucs2 0x01bc),(_ucs2 0x01bd),(_ucs2 0x01be),(_ucs2 0x01bf); -insert into t1 values (_ucs2 0x01c0),(_ucs2 0x01c1),(_ucs2 0x01c2),(_ucs2 0x01c3); -insert into t1 values (_ucs2 0x01c4),(_ucs2 0x01c5),(_ucs2 0x01c6),(_ucs2 0x01c7); -insert into t1 values (_ucs2 0x01c8),(_ucs2 0x01c9),(_ucs2 0x01ca),(_ucs2 0x01cb); -insert into t1 values (_ucs2 0x01cc),(_ucs2 0x01cd),(_ucs2 0x01ce),(_ucs2 0x01cf); -insert into t1 values (_ucs2 0x01d0),(_ucs2 0x01d1),(_ucs2 0x01d2),(_ucs2 0x01d3); -insert into t1 values (_ucs2 0x01d4),(_ucs2 0x01d5),(_ucs2 0x01d6),(_ucs2 0x01d7); -insert into t1 values (_ucs2 0x01d8),(_ucs2 0x01d9),(_ucs2 0x01da),(_ucs2 0x01db); -insert into t1 values (_ucs2 0x01dc),(_ucs2 0x01dd),(_ucs2 0x01de),(_ucs2 0x01df); -insert into t1 values (_ucs2 0x01e0),(_ucs2 0x01e1),(_ucs2 0x01e2),(_ucs2 0x01e3); -insert into t1 values (_ucs2 0x01e4),(_ucs2 0x01e5),(_ucs2 0x01e6),(_ucs2 0x01e7); -insert into t1 values (_ucs2 0x01e8),(_ucs2 0x01e9),(_ucs2 0x01ea),(_ucs2 0x01eb); -insert into t1 values (_ucs2 0x01ec),(_ucs2 0x01ed),(_ucs2 0x01ee),(_ucs2 0x01ef); -insert into t1 values (_ucs2 0x01f0),(_ucs2 0x01f1),(_ucs2 0x01f2),(_ucs2 0x01f3); -insert into t1 values (_ucs2 0x01f4),(_ucs2 0x01f5),(_ucs2 0x01f6),(_ucs2 0x01f7); -insert into t1 values (_ucs2 0x01f8),(_ucs2 0x01f9),(_ucs2 0x01fa),(_ucs2 0x01fb); -insert into t1 values (_ucs2 0x01fc),(_ucs2 0x01fd),(_ucs2 0x01fe),(_ucs2 0x01ff); -INSERT INTO t1 VALUES (_ucs2 0x1EA0),(_ucs2 0x1EA1),(_ucs2 0x1EA2),(_ucs2 0x1EA3); -INSERT INTO t1 VALUES (_ucs2 0x1EA4),(_ucs2 0x1EA5),(_ucs2 0x1EA6),(_ucs2 0x1EA7); -INSERT INTO t1 VALUES (_ucs2 0x1EA8),(_ucs2 0x1EA9),(_ucs2 0x1EAA),(_ucs2 0x1EAB); -INSERT INTO t1 VALUES (_ucs2 0x1EAC),(_ucs2 0x1EAD),(_ucs2 0x1EAE),(_ucs2 0x1EAF); -INSERT INTO t1 VALUES (_ucs2 0x1EB0),(_ucs2 0x1EB1),(_ucs2 0x1EB2),(_ucs2 0x1EB3); -INSERT INTO t1 VALUES (_ucs2 0x1EB4),(_ucs2 0x1EB5),(_ucs2 0x1EB6),(_ucs2 0x1EB7); -INSERT INTO t1 VALUES (_ucs2 0x1EB8),(_ucs2 0x1EB9),(_ucs2 0x1EBA),(_ucs2 0x1EBB); -INSERT INTO t1 VALUES (_ucs2 0x1EBC),(_ucs2 0x1EBD),(_ucs2 0x1EBE),(_ucs2 0x1EBF); -INSERT INTO t1 VALUES (_ucs2 0x1EC0),(_ucs2 0x1EC1),(_ucs2 0x1EC2),(_ucs2 0x1EC3); -INSERT INTO t1 VALUES (_ucs2 0x1EC4),(_ucs2 0x1EC5),(_ucs2 0x1EC6),(_ucs2 0x1EC7); -INSERT INTO t1 VALUES (_ucs2 0x1EC8),(_ucs2 0x1EC9),(_ucs2 0x1ECA),(_ucs2 0x1ECB); -INSERT INTO t1 VALUES (_ucs2 0x1ECC),(_ucs2 0x1ECD),(_ucs2 0x1ECE),(_ucs2 0x1ECF); -INSERT INTO t1 VALUES (_ucs2 0x1ED0),(_ucs2 0x1ED1),(_ucs2 0x1ED2),(_ucs2 0x1ED3); -INSERT INTO t1 VALUES (_ucs2 0x1ED4),(_ucs2 0x1ED5),(_ucs2 0x1ED6),(_ucs2 0x1ED7); -INSERT INTO t1 VALUES (_ucs2 0x1ED8),(_ucs2 0x1ED9),(_ucs2 0x1EDA),(_ucs2 0x1EDB); -INSERT INTO t1 VALUES (_ucs2 0x1EDC),(_ucs2 0x1EDD),(_ucs2 0x1EDE),(_ucs2 0x1EDF); -INSERT INTO t1 VALUES (_ucs2 0x1EE0),(_ucs2 0x1EE1),(_ucs2 0x1EE2),(_ucs2 0x1EE3); -INSERT INTO t1 VALUES (_ucs2 0x1EE4),(_ucs2 0x1EE5),(_ucs2 0x1EE6),(_ucs2 0x1EE7); -INSERT INTO t1 VALUES (_ucs2 0x1EE8),(_ucs2 0x1EE9),(_ucs2 0x1EEA),(_ucs2 0x1EEB); -INSERT INTO t1 VALUES (_ucs2 0x1EEC),(_ucs2 0x1EED),(_ucs2 0x1EEE),(_ucs2 0x1EEF); -INSERT INTO t1 VALUES (_ucs2 0x1EF0),(_ucs2 0x1EF1); -insert into t1 values ('AA'),('Aa'),('aa'),('aA'); -insert into t1 values ('AE'),('Ae'),('ae'),('aE'); -insert into t1 values ('CH'),('Ch'),('ch'),('cH'); -insert into t1 values ('DZ'),('Dz'),('dz'),('dZ'); -insert into t1 values ('DΕ½'),('DΕΎ'),('dΕΎ'),('dΕ½'); -insert into t1 values ('IJ'),('Ij'),('ij'),('iJ'); -insert into t1 values ('LJ'),('Lj'),('lj'),('lJ'); -insert into t1 values ('LL'),('Ll'),('ll'),('lL'); -insert into t1 values ('NJ'),('Nj'),('nj'),('nJ'); -insert into t1 values ('OE'),('Oe'),('oe'),('oE'); -insert into t1 values ('SS'),('Ss'),('ss'),('sS'); -insert into t1 values ('RR'),('Rr'),('rr'),('rR'); -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_unicode_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_icelandic_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaΓ€Γ‚ΓƒΓ Γ’Γ£Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÁÑ -Η’Η£ΗΌΗ½ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Ðð -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -EeΓˆΓŠΓ‹Γ¨ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Éé -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÎÏìΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Íí -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ”Γ•Γ²Γ΄Γ΅ΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -Óó -ΗΎΗΏ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™Γ›ΓœΓΉΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Úú -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyΓΏΕΆΕ·ΕΈ -Ýý -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Þþ -ÄÆÀæ -Γ–Γ˜ΓΆΓΈ -Γ…Γ₯ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_latvian_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ -CHChcHch -Čč -Ζ‡Ζˆ -DdĎď -DZDzdZdzΗ„Η…Η†Η±Η²Η³ -DΕ½DΕΎdΕ½dΕΎ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđǦǧǴǡ -Δ’Δ£ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Yy -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΗ¨Η© -ΔΆΔ· -Ζ˜Ζ™ -LlΔΉΔΊΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Δ»ΔΌ -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ε…Ε† -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε˜Ε™ -RRRrrRrr -Ε–Ε— -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -ÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌ -ƍ -Ε½ΕΎ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_romanian_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÃÄÅàÑãÀΓ₯Δ€ΔΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -Δ‚Δƒ -ÂÒ -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÏìíïĨĩΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Îà -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕ Ε‘ΕΏ -SSSssSssß -Şş -Ζ© -Ζͺ -TtΕ€Ε₯ -ΖΎ -Ε’Ε£ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_slovenian_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ -CHChcHch -Čč -Ζ‡Ζˆ -DdĎď -DZDzdZdzΗ„Η…Η†Η±Η²Η³ -DΕ½DΕΎdΕ½dΕΎ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌ -ƍ -Ε½ΕΎ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_polish_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -Δ„Δ… -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Δ†Δ‡ -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Δ˜Δ™ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -ΕƒΕ„ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ”Γ•Γ–Γ²Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -Óó -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsŜŝŞşŠőſ -SSSssSssß -ΕšΕ› -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕ½ΕΎ -ƍ -ΕΉΕΊ -Ε»ΕΌ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_estonian_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÅàÑÒãΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzdZdz -DΕ½DΕΎdΕ½dΕΎ -Η„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ²Γ³Γ΄ΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Zz -Ε½ΕΎ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓΉΓΊΓ»Ε¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Õá -ÄÀ -Γ–ΓΆ -Üü -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ΕΉΕΊΕ»ΕΌ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_spanish_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ññ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_swedish_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaΓ€ΓΓ‚ΓƒΓ Γ‘Γ’Γ£Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -Η’Η£ΗΌΗ½ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ²Γ³Γ΄Γ΅ΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ΗΎΗΏ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓΉΓΊΓ»Ε¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÜÝüýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Γ…Γ₯ -ÄÆÀæ -Γ–Γ˜ΓΆΓΈ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_turkish_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΔ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Çç -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĠđĒģǦǧǴǡ -Ğğ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -IΔ± -IJIj -Ζ•ΗΆ -Δ¦Δ§ -iÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -iJijΔ²Δ³ -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ²Γ³Γ΄Γ΅ΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -Γ–ΓΆ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕ Ε‘ΕΏ -SSSssSssß -Şş -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓΉΓΊΓ»Ε¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Üü -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_czech_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ -cH -Čč -Ζ‡Ζˆ -DdĎď -DZDzdZdzΗ„Η…Η†Η±Η²Η³ -DΕ½DΕΎdΕ½dΕΎ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -CHChch -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε— -RRRrrRrr -Ε˜Ε™ -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌ -ƍ -Ε½ΕΎ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_danish_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaΓ€ΓΓ‚ΓƒΓ Γ‘Γ’Γ£Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -aA -AEAeaEae -Η’Η£ΗΌΗ½ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ²Γ³Γ΄Γ΅ΕŒΕΕŽΕΖ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ΗΎΗΏ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓΉΓΊΓ»Ε¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÜÝüýÿŰűŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -ÄÆÀæ -Γ–Γ˜ΓΆΓΈΕΕ‘ -AAAaaaΓ…Γ₯ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_lithuanian_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CCHChcchΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ -cH -Čč -Ζ‡Ζˆ -DdĎď -DZDzdZdzΗ„Η…Η†Η±Η²Η³ -DΕ½DΕΎdΕ½dΕΎ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IYiyÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -ÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌ -ƍ -Ε½ΕΎ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_slovak_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÅàÑÒãΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÄÀ -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ -cH -Čč -Ζ‡Ζˆ -DdĎď -DZDzdZdzΗ„Η…Η†Η±Η²Η³ -DΕ½DΕΎdΕ½dΕΎ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -CHChch -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ•Γ–Γ²Γ³Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -Ôô -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌ -ƍ -Ε½ΕΎ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_spanish2_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -cH -CHChch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -lL -LLLlll -Łł -ƚ -Ζ› -Mm -NnΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ññ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_roman_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IJijÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJij -Δ²Δ³ -Δ± -Ζ— -Ζ– -Δ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJlj -Η‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnj -ΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -Γ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -UVuv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_esperanto_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔŠΔ‹ΔŒΔ -CHChcHch -ΔˆΔ‰ -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĞğĠđĒģǦǧǴǡ -Ĝĝ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -Hh -Δ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΗ° -Δ΄Δ΅ -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ŝŝ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ε¬Ε­ -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_hungarian_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ²Γ³Γ΄Γ΅ΕŒΕΕŽΕΖ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ÖâŐő -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓΉΓΊΓ»Ε¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -ÜüŰű -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_croatian_mysql561_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§ΔˆΔ‰ΔŠΔ‹ -CHChcHch -Čč -Δ†Δ‡ -Ζ‡Ζˆ -DdĎď -DZDzdZdzΗ±Η²Η³ -DΕ½DΕΎdΕ½dΕΎΗ„Η…Η† -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LLLllLll -LJLjlJljΗ‡ΗˆΗ‰ -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌ -ƍ -Ε½ΕΎ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_croatian_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEae -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§ΔˆΔ‰ΔŠΔ‹ -CHChcHch -Čč -Δ†Δ‡ -Ζ‡Ζˆ -DdĎď -DZDzdZdzΗ±Η²Η³ -dΕ½ -DΕ½DΕΎdΕΎΗ„Η…Η† -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -lJ -LLLllLll -LJLjljΗ‡ΗˆΗ‰ -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -nJ -NJNjnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ²Γ³Γ΄Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕΏ -SSSssSssß -Ε Ε‘ -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌ -ƍ -Ε½ΕΎ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_german2_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÅàÑÒãΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEaeÄÆÀæ -Η’Η£ΗΌΗ½ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ²Γ³Γ΄Γ΅ΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­α»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΓ–ΓΆΕ’Ε“ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓΉΓΊΓ»Ε¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Üü -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_unicode_520_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÂÃÄÅàÑÒãÀΓ₯Δ€ΔΔ‚ΔƒΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£αΊ€αΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­αΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -AAAaaAaa -AEAeaEaeÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdΓΓ°ΔŽΔΔΔ‘ -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Ζ‰ -Ɗ -Ζ‹ΖŒ -EeΓˆΓ‰ΓŠΓ‹Γ¨Γ©ΓͺΓ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½αΊΎαΊΏα»€α»α»‚α»ƒα»„α»…α»†α»‡ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯Δ¦Δ§ -Ζ•ΗΆ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlĹĺĻļĽľĿŀŁł -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ”Γ•Γ–Γ˜Γ²Γ³Γ΄Γ΅ΓΆΓΈΕŒΕΕŽΕΕΕ‘Ζ Ζ‘Η‘Η’ΗͺΗ«Η¬Η­ΗΎΗΏα»Œα»α»Žα»α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -OEOeoEoeΕ’Ε“ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Ζ―Ζ°Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯ỦủỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_vietnamese_ci; -GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') -Γ· -Γ— -AaÀÁÃÄÅàÑãÀΓ₯Δ€ΔΔ„Δ…ΗΗŽΗžΗŸΗ Η‘ΗΊΗ»αΊ αΊ‘αΊ’αΊ£ -AAAaaAaa -AEAeaEae -Δ‚ΔƒαΊαΊ―αΊ°αΊ±αΊ²αΊ³αΊ΄αΊ΅αΊΆαΊ· -ÂÒẀαΊ₯αΊ¦αΊ§αΊ¨αΊ©αΊͺαΊ«αΊ¬αΊ­ -ÆæǒǣǼǽ -Bb -Ζ€ -Ɓ -Ζ‚Ζƒ -CcΓ‡Γ§Δ†Δ‡ΔˆΔ‰ΔŠΔ‹ΔŒΔ -CHChcHch -Ζ‡Ζˆ -DdĎď -DZDzDΕ½DΕΎdZdzdΕ½dΕΎΗ„Η…Η†Η±Η²Η³ -Đđ -Ζ‰ -Ɗ -Ζ‹ΖŒ -Ðð -EeΓˆΓ‰Γ‹Γ¨Γ©Γ«Δ’Δ“Δ”Δ•Δ–Δ—Δ˜Δ™ΔšΔ›αΊΈαΊΉαΊΊαΊ»αΊΌαΊ½ -ÊΓͺẾếỀềỂểỄễỆệ -Ǝǝ -Ə -Ɛ -Ff -Ζ‘Ζ’ -GgĜĝĞğĠđĒģǦǧǴǡ -Η€Η₯ -Ζ“ -Ζ” -Ζ’Ζ£ -HhΔ€Δ₯ -Ζ•ΗΆ -Δ¦Δ§ -IiÌÍÎÏìíΓΓ―Δ¨Δ©ΔͺΔ«Δ¬Δ­ΔΔ―Δ°ΗΗα»ˆα»‰α»Šα»‹ -IJIjiJijΔ²Δ³ -Δ± -Ζ— -Ζ– -JjΔ΄Δ΅Η° -KkΔΆΔ·Η¨Η© -Ζ˜Ζ™ -LlΔΉΔΊΔ»ΔΌΔ½ΔΎ -ΔΏΕ€ -LJLjlJljΗ‡ΗˆΗ‰ -LLLllLll -Łł -ƚ -Ζ› -Mm -NnΓ‘Γ±ΕƒΕ„Ε…Ε†Ε‡ΕˆΗΈΗΉ -NJNjnJnjΗŠΗ‹ΗŒ -Ɲ -ƞ -ΕŠΕ‹ -OoΓ’Γ“Γ•Γ–Γ²Γ³Γ΅ΓΆΕŒΕΕŽΕΕΕ‘Η‘Η’ΗͺǫǬǭỌọỎỏ -OEOeoEoeΕ’Ε“ -Γ”Γ΄α»α»‘α»’α»“α»”α»•α»–α»—α»˜α»™ -Ζ Ζ‘α»šα»›α»œα»α»žα»Ÿα» α»‘α»’α»£ -ØøǾǿ -Ζ† -Ɵ -Pp -Ζ€Ζ₯ -Qq -ΔΈ -RrΕ”Ε•Ε–Ε—Ε˜Ε™ -RRRrrRrr -Ζ¦ -SsΕšΕ›ΕœΕΕžΕŸΕ Ε‘ΕΏ -SSSssSssß -Ζ© -Ζͺ -TtΕ’Ε£Ε€Ε₯ -ΖΎ -Ε¦Ε§ -Ζ« -Ζ¬Ζ­ -Ζ -UuΓ™ΓšΓ›ΓœΓΉΓΊΓ»ΓΌΕ¨Ε©ΕͺΕ«Ε¬Ε­ΕΕ―Ε°Ε±Ε²Ε³Η“Η”Η•Η–Η—Η˜Η™ΗšΗ›Ηœα»€α»₯Ủủ -ƯưỨứα»ͺừỬửα»α»―α»°α»± -Ɯ -Ζ± -Vv -Ζ² -WwΕ΄Ε΅ -Xx -YyÝýÿŢŷŸ -Ζ³Ζ΄ -ZzΕΉΕΊΕ»ΕΌΕ½ΕΎ -ƍ -Ζ΅ΖΆ -Ζ·ΗΗ― -ΖΈΖΉ -ΖΊ -Þþ -ΖΏΗ· -Ζ» -Ζ§Ζ¨ -ΖΌΖ½ -Ζ„Ζ… -Ε‰ -Η€ -ǁ -Η‚ -Ηƒ -DROP TABLE t1; # # MDEV-20912 Add support for utf8mb4_0900_* collations in MariaDB Server # diff --git a/mysql-test/main/ctype_utf8mb4_0900.test b/mysql-test/main/ctype_utf8mb4_0900.test index 2fd31fab464..8114ab2348f 100644 --- a/mysql-test/main/ctype_utf8mb4_0900.test +++ b/mysql-test/main/ctype_utf8mb4_0900.test @@ -15,37 +15,6 @@ where collation_name like "%0900%" order by collation_name; select * from information_schema.COLLATIONS where collation_name like "%0900%"; -SET NAMES utf8mb4; -CREATE TABLE t1 (c1 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin); - ---source include/ctype_unicode_latin.inc - -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_unicode_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_icelandic_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_latvian_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_romanian_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_slovenian_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_polish_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_estonian_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_spanish_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_swedish_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_turkish_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_czech_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_danish_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_lithuanian_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_slovak_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_spanish2_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_roman_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_esperanto_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_hungarian_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_croatian_mysql561_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_croatian_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_german2_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_unicode_520_ci; -SELECT GROUP_CONCAT(c1 ORDER BY c1 SEPARATOR '') FROM t1 GROUP BY c1 COLLATE utf8mb4_vietnamese_ci; - -DROP TABLE t1; - --echo # --echo # MDEV-20912 Add support for utf8mb4_0900_* collations in MariaDB Server --echo # diff --git a/mysql-test/main/ddl_i18n_koi8r.result b/mysql-test/main/ddl_i18n_koi8r.result index aff6fae4431..3e6cd07c311 100644 --- a/mysql-test/main/ddl_i18n_koi8r.result +++ b/mysql-test/main/ddl_i18n_koi8r.result @@ -1731,13 +1731,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER USE `mysqltest1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `log` ( `msg` varchar(255) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `c` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; @@ -1814,13 +1814,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER USE `mysqltest2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `log` ( `msg` varchar(255) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `c` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; diff --git a/mysql-test/main/ddl_i18n_utf8.result b/mysql-test/main/ddl_i18n_utf8.result index d712593e806..ff31607c22d 100644 --- a/mysql-test/main/ddl_i18n_utf8.result +++ b/mysql-test/main/ddl_i18n_utf8.result @@ -1731,13 +1731,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER USE `mysqltest1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `log` ( `msg` varchar(255) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `c` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; @@ -1814,13 +1814,13 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER USE `mysqltest2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `log` ( `msg` varchar(255) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `c` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; diff --git a/mysql-test/main/delete_innodb.result b/mysql-test/main/delete_innodb.result index 7de33f33b9e..80e8806a33f 100644 --- a/mysql-test/main/delete_innodb.result +++ b/mysql-test/main/delete_innodb.result @@ -25,6 +25,33 @@ c1 SET sort_buffer_size=@save_sort_buffer_size; DROP TABLE t1; # +# MDEV-35944 DELETE fails to notice transaction abort, violating ACID +# +CREATE TABLE t1 (id INT PRIMARY KEY, col_varchar VARCHAR(8)) ENGINE=InnoDB; +INSERT INTO t1 (id) VALUES (1),(2); +CREATE TABLE t2 (id INT, f INT, s DATE, e DATE, PERIOD FOR p(s,e), PRIMARY KEY(id, p WITHOUT OVERLAPS)) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1,0,'2000-01-01','2000-01-02'); +CREATE TABLE t3 (id INT, f BLOB, UNIQUE(f)) ENGINE=InnoDB; +connection default; +SET innodb_lock_wait_timeout=1; +START TRANSACTION; +DELETE FROM t1; +connect con1,localhost,root,,; +START TRANSACTION; +UPDATE t2 SET f = 20; +connection default; +DELETE FROM t2 FOR PORTION OF p FROM '2000-01-01' TO '2000-01-02'; +connection con1; +INSERT INTO t3 (id) VALUES (1), (2); +UPDATE t1 SET col_varchar = 'bar'; +COMMIT; +connection default; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +COMMIT; +UPDATE t3 SET f = 'foo' ORDER BY f LIMIT 1; +DROP TABLE t1, t2, t3; +# End of 10.5 tests +# # MDEV-32212 DELETE with ORDER BY and semijoin optimization causing crash # CREATE TABLE t1 (c1 INT) ENGINE=InnoDB; @@ -583,4 +610,4 @@ count(*) 0 drop database dbt3_s001; set default_storage_engine=@save_default_storage_engine; -End of 11.1 tests +# End of 11.1 tests diff --git a/mysql-test/main/delete_innodb.test b/mysql-test/main/delete_innodb.test index 86c32732ad9..a73002824fb 100644 --- a/mysql-test/main/delete_innodb.test +++ b/mysql-test/main/delete_innodb.test @@ -23,10 +23,48 @@ SELECT * FROM t1; SET sort_buffer_size=@save_sort_buffer_size; DROP TABLE t1; +--echo # +--echo # MDEV-35944 DELETE fails to notice transaction abort, violating ACID +--echo # + +CREATE TABLE t1 (id INT PRIMARY KEY, col_varchar VARCHAR(8)) ENGINE=InnoDB; +INSERT INTO t1 (id) VALUES (1),(2); +CREATE TABLE t2 (id INT, f INT, s DATE, e DATE, PERIOD FOR p(s,e), PRIMARY KEY(id, p WITHOUT OVERLAPS)) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1,0,'2000-01-01','2000-01-02'); +CREATE TABLE t3 (id INT, f BLOB, UNIQUE(f)) ENGINE=InnoDB; + +--connection default +SET innodb_lock_wait_timeout=1; +START TRANSACTION; +DELETE FROM t1; + +--connect (con1,localhost,root,,) +START TRANSACTION; +UPDATE t2 SET f = 20; + +--connection default +--send + DELETE FROM t2 FOR PORTION OF p FROM '2000-01-01' TO '2000-01-02'; + +--connection con1 +INSERT INTO t3 (id) VALUES (1), (2); +UPDATE t1 SET col_varchar = 'bar'; +COMMIT; + +--connection default +--error ER_LOCK_DEADLOCK +--reap +COMMIT; +UPDATE t3 SET f = 'foo' ORDER BY f LIMIT 1; + +# Cleanup +DROP TABLE t1, t2, t3; + +--echo # End of 10.5 tests + --echo # --echo # MDEV-32212 DELETE with ORDER BY and semijoin optimization causing crash --echo # ---source include/have_innodb.inc CREATE TABLE t1 (c1 INT) ENGINE=InnoDB; CREATE TABLE t2 (c2 INT) ENGINE=InnoDB; @@ -219,5 +257,4 @@ select count(*) from lineitem, second WHERE l_shipdate BETWEEN '1997-01-01' A drop database dbt3_s001; set default_storage_engine=@save_default_storage_engine; - ---echo End of 11.1 tests +--echo # End of 11.1 tests diff --git a/mysql-test/main/errors.result b/mysql-test/main/errors.result index 12909ffafbe..e0568676952 100644 --- a/mysql-test/main/errors.result +++ b/mysql-test/main/errors.result @@ -231,3 +231,16 @@ Error 1327 Undeclared variable: foo Error 1305 PROCEDURE P1 does not exist drop procedure P1; # End of 10.4 tests +# +# MDEV-35828: Assertion fails in alloc_root() when memory causes it to call itself +# +CREATE TEMPORARY TABLE t1 (a INT,b INT); +INSERT INTO t1 VALUES (1,1),(2,2); +SET +@tmp=@@max_session_mem_used, +max_session_mem_used=8192; +SELECT * FROM (t1 AS t2 LEFT JOIN t1 AS t3 USING (a)),t1; +ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement +DROP TABLE t1; +SET max_session_mem_used=@tmp; +# End of 10.6 tests diff --git a/mysql-test/main/errors.test b/mysql-test/main/errors.test index cc5cad2a68e..87d6d2fdec9 100644 --- a/mysql-test/main/errors.test +++ b/mysql-test/main/errors.test @@ -284,3 +284,23 @@ show warnings; drop procedure P1; -- echo # End of 10.4 tests + + +--echo # +--echo # MDEV-35828: Assertion fails in alloc_root() when memory causes it to call itself +--echo # +CREATE TEMPORARY TABLE t1 (a INT,b INT); +INSERT INTO t1 VALUES (1,1),(2,2); + +SET + @tmp=@@max_session_mem_used, + max_session_mem_used=8192; + +--error ER_OPTION_PREVENTS_STATEMENT +SELECT * FROM (t1 AS t2 LEFT JOIN t1 AS t3 USING (a)),t1; + +DROP TABLE t1; +SET max_session_mem_used=@tmp; + + +--echo # End of 10.6 tests diff --git a/mysql-test/main/kill_debug.result b/mysql-test/main/kill_debug.result index 0c910906b92..796156d6e45 100644 --- a/mysql-test/main/kill_debug.result +++ b/mysql-test/main/kill_debug.result @@ -238,3 +238,30 @@ select variable_value into @threads_cached from information_schema.global_status set debug_sync='now SIGNAL go3'; drop table t1; set debug_sync='reset'; +# +# MDEV-33285 - Assertion `m_table' failed in ha_perfschema::rnd_end on +# CHECKSUM TABLE +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES(1); +SET debug_sync='mysql_checksum_table_after_calculate_checksum SIGNAL parked WAIT_FOR go'; +CHECKSUM TABLE t1; +connect con1, localhost, root; +connection con1; +SET debug_sync='now WAIT_FOR parked'; +KILL QUERY id; +SET debug_sync='now SIGNAL go'; +connection default; +ERROR 70100: Query execution was interrupted +SET debug_sync='RESET'; +SET debug_sync='mysql_checksum_table_before_calculate_checksum SIGNAL parked WAIT_FOR go'; +CHECKSUM TABLE t1; +connection con1; +SET debug_sync='now WAIT_FOR parked'; +KILL QUERY id; +SET debug_sync='now SIGNAL go'; +connection default; +ERROR 70100: Query execution was interrupted +DROP TABLE t1; +disconnect con1; +SET debug_sync='RESET'; diff --git a/mysql-test/main/kill_debug.test b/mysql-test/main/kill_debug.test index d861b8b4680..6b29834564b 100644 --- a/mysql-test/main/kill_debug.test +++ b/mysql-test/main/kill_debug.test @@ -324,3 +324,40 @@ if (`select @@thread_handling != 'pool-of-threads'`) { } drop table t1; set debug_sync='reset'; + + +--echo # +--echo # MDEV-33285 - Assertion `m_table' failed in ha_perfschema::rnd_end on +--echo # CHECKSUM TABLE +--echo # +let $id= `select connection_id()`; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES(1); +SET debug_sync='mysql_checksum_table_after_calculate_checksum SIGNAL parked WAIT_FOR go'; +send CHECKSUM TABLE t1; + +connect con1, localhost, root; +connection con1; +SET debug_sync='now WAIT_FOR parked'; +replace_result $id id; +eval KILL QUERY $id; +SET debug_sync='now SIGNAL go'; +connection default; +error ER_QUERY_INTERRUPTED; +reap; + +SET debug_sync='RESET'; +SET debug_sync='mysql_checksum_table_before_calculate_checksum SIGNAL parked WAIT_FOR go'; +send CHECKSUM TABLE t1; +connection con1; +SET debug_sync='now WAIT_FOR parked'; +replace_result $id id; +eval KILL QUERY $id; +SET debug_sync='now SIGNAL go'; + +connection default; +error ER_QUERY_INTERRUPTED; +reap; +DROP TABLE t1; +disconnect con1; +SET debug_sync='RESET'; diff --git a/mysql-test/main/lock_view.result b/mysql-test/main/lock_view.result index 12aa8e10fb2..9307803f745 100644 --- a/mysql-test/main/lock_view.result +++ b/mysql-test/main/lock_view.result @@ -22,7 +22,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER USE `mysqltest1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -32,7 +32,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER USE `mysqltest2`; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `a` */; SET character_set_client = @saved_cs_client; @@ -41,27 +41,27 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest3` /*!40100 DEFAULT CHARACTER USE `mysqltest3`; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v3` AS SELECT 1 AS `a` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v3i` AS SELECT 1 AS `a` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v3is` AS SELECT 1 AS `schema_name` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v3nt` AS SELECT 1 AS `1` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v3ps` AS SELECT 1 AS `user` */; SET character_set_client = @saved_cs_client; @@ -237,7 +237,7 @@ disconnect con1; connection default; /*M!999999\- enable the sandbox mode */ SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `id` */; SET character_set_client = @saved_cs_client; diff --git a/mysql-test/main/log_slow.result b/mysql-test/main/log_slow.result index f333f2bf66b..711852115a8 100644 --- a/mysql-test/main/log_slow.result +++ b/mysql-test/main/log_slow.result @@ -199,7 +199,9 @@ create database `a b`; use `a b`; -select count(*) from mysql.global_priv where length(priv)>2; +create table t1 (a int); +insert t1 values (1),(2),(3),(4),(5),(6),(7); +select count(*) from t1 where a>2; count(*) 5 drop database `a @@ -212,7 +214,7 @@ set timestamp=default; use `a b`; SET timestamp=1234567890; -select count(*) from mysql.global_priv where length(priv)>2 +select count(*) from t1 where a>2 # # MDEV-31366 Assertion `thd->start_time' failed in bool LOGGER::slow_log_print(THD*, const char*, size_t, ulonglong) # diff --git a/mysql-test/main/log_slow.test b/mysql-test/main/log_slow.test index 73a3369f826..e08e58e3ac0 100644 --- a/mysql-test/main/log_slow.test +++ b/mysql-test/main/log_slow.test @@ -207,9 +207,11 @@ create database `a b`; use `a b`; +create table t1 (a int); +insert t1 values (1),(2),(3),(4),(5),(6),(7); --disable_ps_protocol --disable_view_protocol -select count(*) from mysql.global_priv where length(priv)>2; +select count(*) from t1 where a>2; --enable_view_protocol --enable_ps_protocol drop database `a diff --git a/mysql-test/main/log_state.result b/mysql-test/main/log_state.result index 72d4f1c6195..3172be9818f 100644 --- a/mysql-test/main/log_state.result +++ b/mysql-test/main/log_state.result @@ -310,9 +310,9 @@ select @s1 > 2.00 and @s1 < 10.00 as "should be true"; should be true 1 disconnect con2; -connection default; disconnect con1; connection default; +drop procedure p1; SET GLOBAL long_query_time = @save_long_query_time; SET GLOBAL log_output = @old_log_output; SET global general_log = @old_general_log; diff --git a/mysql-test/main/log_state.test b/mysql-test/main/log_state.test index 93e35854355..9686ace3f4b 100644 --- a/mysql-test/main/log_state.test +++ b/mysql-test/main/log_state.test @@ -328,7 +328,9 @@ SET GLOBAL general_log_file = @old_general_log_file; connect (con2,localhost,root,,); set @s1=(select variable_value from information_schema.session_status where variable_name='query_time'); +--disable_cursor_protocol select sleep(3) into @a; +--enable_cursor_protocol set @s2=(select variable_value from information_schema.session_status where variable_name='query_time'); set @s3=(select variable_value from information_schema.global_status where @@ -358,7 +360,6 @@ select @s1 > 2.00 and @s1 < 10.00 as "should be true"; # select @s1; disconnect con2; -connection default; # # Cleanup @@ -367,6 +368,7 @@ connection default; disconnect con1; # set back the saved default values connection default; +drop procedure p1; # Reset global system variables to initial values if forgotten somewhere above. SET GLOBAL long_query_time = @save_long_query_time; diff --git a/mysql-test/main/long_unique_bugs.result b/mysql-test/main/long_unique_bugs.result index 199038fa011..560270305ea 100644 --- a/mysql-test/main/long_unique_bugs.result +++ b/mysql-test/main/long_unique_bugs.result @@ -731,4 +731,43 @@ alter table t1 enable keys; insert into t1 values (2); ERROR 23000: Duplicate entry '2' for key 'i' drop table t1; +# +# MDEV-25654 Unexpected ER_CRASHED_ON_USAGE and Assertion `limit >= trx_id' failed in purge_node_t::skip +# +create table t1 (a int, unique using hash (a)) engine=innodb +partition by range(a) ( +partition p1 values less than (2), +partition p2 values less than (101) +); +insert into t1 select seq from seq_1_to_100; +alter table t1 add partition (partition p3 values less than (maxvalue)); +alter table t1 force; +drop table t1; +# +# MDEV-33658 cannot add a foreign key on a table with a long UNIQUE +# multi-column index, that contains a foreign key as a prefix. +# +create table a (id int primary key) engine = innodb; +create table b (id int, +long_text varchar(1000), +constraint unique_b unique key (id, long_text) +) engine=innodb default charset utf8mb4; +alter table b add constraint b_fk_id foreign key (id) references a (id); +show create table b; +Table Create Table +b CREATE TABLE `b` ( + `id` int(11) DEFAULT NULL, + `long_text` varchar(1000) DEFAULT NULL, + UNIQUE KEY `unique_b` (`id`,`long_text`) USING HASH, + KEY `b_fk_id` (`id`), + CONSTRAINT `b_fk_id` FOREIGN KEY (`id`) REFERENCES `a` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +drop table b; +drop table a; +# veirfy that duplicate has unique is detected +create table t1 (a blob unique); +alter table t1 add constraint constraint_1 unique (a); +Warnings: +Note 1831 Duplicate index `constraint_1`. This is deprecated and will be disallowed in a future release +drop table t1; # End of 10.5 tests diff --git a/mysql-test/main/long_unique_bugs.test b/mysql-test/main/long_unique_bugs.test index f768c4807ca..311c4a04a29 100644 --- a/mysql-test/main/long_unique_bugs.test +++ b/mysql-test/main/long_unique_bugs.test @@ -710,4 +710,39 @@ alter table t1 enable keys; insert into t1 values (2); drop table t1; +--echo # +--echo # MDEV-25654 Unexpected ER_CRASHED_ON_USAGE and Assertion `limit >= trx_id' failed in purge_node_t::skip +--echo # +create table t1 (a int, unique using hash (a)) engine=innodb +partition by range(a) ( + partition p1 values less than (2), + partition p2 values less than (101) +); +insert into t1 select seq from seq_1_to_100; + +alter table t1 add partition (partition p3 values less than (maxvalue)); +alter table t1 force; + +drop table t1; + +--echo # +--echo # MDEV-33658 cannot add a foreign key on a table with a long UNIQUE +--echo # multi-column index, that contains a foreign key as a prefix. +--echo # +create table a (id int primary key) engine = innodb; +create table b (id int, + long_text varchar(1000), + constraint unique_b unique key (id, long_text) + ) engine=innodb default charset utf8mb4; + +alter table b add constraint b_fk_id foreign key (id) references a (id); +show create table b; +drop table b; +drop table a; + +--echo # veirfy that duplicate has unique is detected +create table t1 (a blob unique); +alter table t1 add constraint constraint_1 unique (a); +drop table t1; + --echo # End of 10.5 tests diff --git a/mysql-test/main/metadata.result b/mysql-test/main/metadata.result index 86ea3745c09..141f5c38e55 100644 --- a/mysql-test/main/metadata.result +++ b/mysql-test/main/metadata.result @@ -281,16 +281,16 @@ SELECT COALESCE(d, d), IFNULL(d, d), IF(i, d, d), CASE i WHEN i THEN d ELSE d END, GREATEST(d, d), LEAST(d, d) FROM t1 ORDER BY RAND(); Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr +def COALESCE(d, d) COALESCE(d, d) 10 10 10 Y 128 0 63 +def IFNULL(d, d) IFNULL(d, d) 10 10 10 Y 128 0 63 +def IF(i, d, d) IF(i, d, d) 10 10 10 Y 128 0 63 +def CASE i WHEN i THEN d ELSE d END CASE i WHEN i THEN d ELSE d END 10 10 10 Y 128 0 63 +def GREATEST(d, d) GREATEST(d, d) 10 10 10 Y 128 0 63 +def LEAST(d, d) LEAST(d, d) 10 10 10 Y 128 0 63 +COALESCE(d, d) IFNULL(d, d) IF(i, d, d) CASE i WHEN i THEN d ELSE d END GREATEST(d, d) LEAST(d, d) 2008-01-01 2008-01-01 2008-01-01 2008-01-01 2008-01-01 2008-01-01 2008-01-02 2008-01-02 2008-01-02 2008-01-02 2008-01-02 2008-01-02 2008-01-03 2008-01-03 2008-01-03 2008-01-03 2008-01-03 2008-01-03 -COALESCE(d, d) IFNULL(d, d) IF(i, d, d) CASE i WHEN i THEN d ELSE d END GREATEST(d, d) LEAST(d, d) -def CASE i WHEN i THEN d ELSE d END CASE i WHEN i THEN d ELSE d END 10 10 10 Y 128 0 63 -def COALESCE(d, d) COALESCE(d, d) 10 10 10 Y 128 0 63 -def GREATEST(d, d) GREATEST(d, d) 10 10 10 Y 128 0 63 -def IF(i, d, d) IF(i, d, d) 10 10 10 Y 128 0 63 -def IFNULL(d, d) IFNULL(d, d) 10 10 10 Y 128 0 63 -def LEAST(d, d) LEAST(d, d) 10 10 10 Y 128 0 63 DROP TABLE t1; # # Bug#41788 mysql_fetch_field returns org_table == table by a view diff --git a/mysql-test/main/mysql.result b/mysql-test/main/mysql.result index 212cf6e73f3..1cf877f8f96 100644 --- a/mysql-test/main/mysql.result +++ b/mysql-test/main/mysql.result @@ -562,7 +562,7 @@ a1\`b1 CREATE TABLE `a1\``b1` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `a1\``b1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -594,7 +594,7 @@ a1\"b1 CREATE TABLE "a1\""b1" ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE "a1\""b1" ( "a" int(11) DEFAULT NULL ); diff --git a/mysql-test/main/mysql_json_table_recreate.result b/mysql-test/main/mysql_json_table_recreate.result index 755f30d528c..ffeee64b6dd 100644 --- a/mysql-test/main/mysql_json_table_recreate.result +++ b/mysql-test/main/mysql_json_table_recreate.result @@ -20,6 +20,15 @@ show create table tempty; ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.tempty` FORCE" or dump/reload to fix it! select * from tempty; ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.tempty` FORCE" or dump/reload to fix it! +select table_name, table_comment from information_schema.tables where table_schema='test' and table_comment!='VIEW'; +table_name table_comment +mysql_json_test Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! +mysql_json_test_big Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test_big` FORCE" or dump/reload to fix it! +tempty Table rebuild required. Please do "ALTER TABLE `test.tempty` FORCE" or dump/reload to fix it! +Warnings: +Warning 1707 Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test_big` FORCE" or dump/reload to fix it! +Warning 1707 Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! +Warning 1707 Table rebuild required. Please do "ALTER TABLE `test.tempty` FORCE" or dump/reload to fix it! alter table tempty force; show create table tempty; Table Create Table diff --git a/mysql-test/main/mysql_json_table_recreate.test b/mysql-test/main/mysql_json_table_recreate.test index a6f1d3194ae..94477d4f328 100644 --- a/mysql-test/main/mysql_json_table_recreate.test +++ b/mysql-test/main/mysql_json_table_recreate.test @@ -43,6 +43,9 @@ show create table tempty; --error ER_TABLE_NEEDS_REBUILD select * from tempty; +--sorted_result +select table_name, table_comment from information_schema.tables where table_schema='test' and table_comment!='VIEW'; + alter table tempty force; show create table tempty; diff --git a/mysql-test/main/mysqlbinlog_row_big.result b/mysql-test/main/mysqlbinlog_row_big.result index ecbb9df2be1..1f2a5bfa21e 100644 --- a/mysql-test/main/mysqlbinlog_row_big.result +++ b/mysql-test/main/mysqlbinlog_row_big.result @@ -52,10 +52,10 @@ affected rows: 1 # Do not display the column value itself, just its length. # SELECT LENGTH(c1) FROM t1; -LENGTH(c1) 67108864 LENGTH(c1) 33554432 LENGTH(c1) 4194304 LENGTH(c1) 524288 +LENGTH(c1) 67108864 affected rows: 4 # # Grow the rows by updating. @@ -68,8 +68,8 @@ info: Rows matched: 4 Changed: 4 Warnings: 0 # Do not display the column value itself, just its length. # SELECT LENGTH(c1) FROM t1; -LENGTH(c1) 134217728 LENGTH(c1) 1048576 +LENGTH(c1) 134217728 LENGTH(c1) 67108864 LENGTH(c1) 8388608 affected rows: 4 diff --git a/mysql-test/main/mysqldump-max.result b/mysql-test/main/mysqldump-max.result index 6a7bfcb9f8e..6a37ef11bc5 100644 --- a/mysql-test/main/mysqldump-max.result +++ b/mysql-test/main/mysqldump-max.result @@ -95,7 +95,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -112,7 +112,7 @@ INSERT DELAYED IGNORE INTO `t1` VALUES /*!40000 ALTER TABLE `t1` ENABLE KEYS */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -129,7 +129,7 @@ INSERT DELAYED IGNORE INTO `t2` VALUES /*!40000 ALTER TABLE `t2` ENABLE KEYS */; DROP TABLE IF EXISTS `t3`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t3` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -146,7 +146,7 @@ INSERT DELAYED IGNORE INTO `t3` VALUES /*!40000 ALTER TABLE `t3` ENABLE KEYS */; DROP TABLE IF EXISTS `t4`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t4` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -163,7 +163,7 @@ INSERT DELAYED IGNORE INTO `t4` VALUES /*!40000 ALTER TABLE `t4` ENABLE KEYS */; DROP TABLE IF EXISTS `t5`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t5` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -180,7 +180,7 @@ INSERT DELAYED IGNORE INTO `t5` VALUES /*!40000 ALTER TABLE `t5` ENABLE KEYS */; DROP TABLE IF EXISTS `t6`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t6` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -223,7 +223,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -240,7 +240,7 @@ INSERT DELAYED INTO `t1` VALUES /*!40000 ALTER TABLE `t1` ENABLE KEYS */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -257,7 +257,7 @@ INSERT DELAYED INTO `t2` VALUES /*!40000 ALTER TABLE `t2` ENABLE KEYS */; DROP TABLE IF EXISTS `t3`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t3` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -274,7 +274,7 @@ INSERT DELAYED INTO `t3` VALUES /*!40000 ALTER TABLE `t3` ENABLE KEYS */; DROP TABLE IF EXISTS `t4`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t4` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -291,7 +291,7 @@ INSERT DELAYED INTO `t4` VALUES /*!40000 ALTER TABLE `t4` ENABLE KEYS */; DROP TABLE IF EXISTS `t5`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t5` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL @@ -308,7 +308,7 @@ INSERT DELAYED INTO `t5` VALUES /*!40000 ALTER TABLE `t5` ENABLE KEYS */; DROP TABLE IF EXISTS `t6`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t6` ( `id` int(8) DEFAULT NULL, `name` varchar(32) DEFAULT NULL diff --git a/mysql-test/main/mysqldump-nl.result b/mysql-test/main/mysqldump-nl.result index 298c0a5c929..1156a97143e 100644 --- a/mysql-test/main/mysqldump-nl.result +++ b/mysql-test/main/mysqldump-nl.result @@ -34,7 +34,7 @@ USE `mysqltest1 -- /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1 1t` ( `foobar @@ -53,7 +53,7 @@ raboof` int(11) DEFAULT NULL -- SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1 1v` AS SELECT 1 AS `foobar diff --git a/mysql-test/main/mysqldump-order-by-size.result b/mysql-test/main/mysqldump-order-by-size.result index 8585fcecda1..82d7cf75235 100644 --- a/mysql-test/main/mysqldump-order-by-size.result +++ b/mysql-test/main/mysqldump-order-by-size.result @@ -23,25 +23,25 @@ test.t4 analyze Warning Engine-independent statistics are not collected for colu test.t4 analyze status OK /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t4` ( `a` mediumblob DEFAULT NULL ); /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t3` ( `a` mediumblob DEFAULT NULL ); /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` mediumblob DEFAULT NULL ); /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` mediumblob DEFAULT NULL ); diff --git a/mysql-test/main/mysqldump-timing.result b/mysql-test/main/mysqldump-timing.result index 42b3401ffd1..eb37cb6d998 100644 --- a/mysql-test/main/mysqldump-timing.result +++ b/mysql-test/main/mysqldump-timing.result @@ -21,7 +21,7 @@ timeout without t1 contents expected /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `i` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -45,7 +45,7 @@ This would be a race condition otherwise, but default max_statement_time=0 makes /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `i` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; diff --git a/mysql-test/main/mysqldump-utf8mb4.result b/mysql-test/main/mysqldump-utf8mb4.result index 277e5c03fd5..5104b5f6114 100644 --- a/mysql-test/main/mysqldump-utf8mb4.result +++ b/mysql-test/main/mysqldump-utf8mb4.result @@ -46,7 +46,7 @@ Testing text format output /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `point` varchar(10) NOT NULL, `data` varchar(10) DEFAULT NULL, diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result index 56fba68d072..8f7838b948d 100644 --- a/mysql-test/main/mysqldump.result +++ b/mysql-test/main/mysqldump.result @@ -33,7 +33,7 @@ INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890"), ("0987654321098765432109876543210987654321"); /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` decimal(64,20) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -51,7 +51,7 @@ Warnings: Warning 1264 Out of range value for column 'a' at row 1 /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` double DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -74,7 +74,7 @@ ERROR 42S22: Unknown column '1.2345' in 'VALUES' SET SQL_MODE=@OLD_SQL_MODE; /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` decimal(10,5) DEFAULT NULL, `b` float DEFAULT NULL @@ -88,7 +88,7 @@ INSERT INTO `t1` VALUES (1.23450,2.3456); /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` decimal(10,5) DEFAULT NULL, `b` float DEFAULT NULL @@ -114,7 +114,7 @@ INSERT INTO `t1` VALUES /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` decimal(10,5) DEFAULT NULL, `b` float DEFAULT NULL @@ -149,7 +149,7 @@ UNLOCK TABLES; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` decimal(10,5) DEFAULT NULL, `b` float DEFAULT NULL @@ -237,7 +237,7 @@ INSERT INTO t1 VALUES (_koi8r x'C1C2C3C4C5'), (NULL); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` varchar(255) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=koi8r COLLATE=koi8r_general_ci; @@ -324,7 +324,7 @@ DROP TABLE t1; create table ```a` (i int); /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE ```a` ( `i` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -348,7 +348,7 @@ create table t1(a int); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -377,7 +377,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS "t1"; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE "t1" ( "a" int(11) DEFAULT NULL ); @@ -409,7 +409,7 @@ set global sql_mode='ANSI_QUOTES'; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -438,7 +438,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS "t1"; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE "t1" ( "a" int(11) DEFAULT NULL ); @@ -474,7 +474,7 @@ insert into t1 values (1),(2),(3); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -571,7 +571,7 @@ INSERT INTO t1 VALUES (_latin1 ' /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` char(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -697,7 +697,7 @@ INSERT INTO t2 VALUES (4),(5),(6); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -742,7 +742,7 @@ INSERT INTO `t1` VALUES (0x602010000280100005E71A); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `b` blob DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -784,7 +784,7 @@ INSERT INTO t1 VALUES (4),(5),(6); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -825,7 +825,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -1201,7 +1201,7 @@ insert into t1 (F_8d3bba7425e7c98c50f52ca1b52d3735) values (1); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `F_c4ca4238a0b923820dcc509a6f75849b` int(11) DEFAULT NULL, `F_c81e728d9d4c2f636f067f89cc14862c` int(11) DEFAULT NULL, @@ -1577,7 +1577,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -1625,14 +1625,14 @@ INSERT INTO t2 VALUES (1), (2); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -1661,14 +1661,14 @@ CREATE TABLE `t2` ( /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -1864,7 +1864,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -1880,7 +1880,7 @@ INSERT INTO `t1` VALUES UNLOCK TABLES; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `pk` int(11) NOT NULL AUTO_INCREMENT, `a` int(10) DEFAULT NULL, @@ -1990,21 +1990,21 @@ mariadb-dump: Couldn't find table: "non_existing" /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t3`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t3` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -2040,7 +2040,7 @@ mariadb-dump: Got error: 1064: "You have an error in your SQL syntax; check the /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -2077,7 +2077,7 @@ insert into t1 values (0815, 4711, 2006); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS "t1"; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE "t1" ( "a b" int(11) NOT NULL, "c""d" int(11) NOT NULL, @@ -2113,7 +2113,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a b` int(11) NOT NULL, `c"d` int(11) NOT NULL, @@ -2169,7 +2169,7 @@ create view v2 as select * from t2 where a like 'a%' with check option; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` varchar(30) DEFAULT NULL, KEY `a` (`a`(5)) @@ -2189,7 +2189,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v2`; /*!50001 DROP VIEW IF EXISTS `v2`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `a` */; SET character_set_client = @saved_cs_client; @@ -2269,7 +2269,7 @@ create view v1 as select * from t1; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -2282,7 +2282,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v1`; /*!50001 DROP VIEW IF EXISTS `v1`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `a` */; SET character_set_client = @saved_cs_client; @@ -2340,7 +2340,7 @@ create view v2 as select * from t2 where a like 'a%' with check option; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` varchar(30) DEFAULT NULL, KEY `a` (`a`(5)) @@ -2360,7 +2360,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v2`; /*!50001 DROP VIEW IF EXISTS `v2`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `a` */; SET character_set_client = @saved_cs_client; @@ -2411,7 +2411,7 @@ INSERT INTO t1 VALUES ('\''); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` char(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -2459,7 +2459,7 @@ select v3.a from v3, v1 where v1.a=v3.a and v3.b=3 limit 1; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, @@ -2478,7 +2478,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v1`; /*!50001 DROP VIEW IF EXISTS `v1`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `a`, 1 AS `b`, @@ -2487,14 +2487,14 @@ SET character_set_client = @saved_cs_client; DROP TABLE IF EXISTS `v2`; /*!50001 DROP VIEW IF EXISTS `v2`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `a` */; SET character_set_client = @saved_cs_client; DROP TABLE IF EXISTS `v3`; /*!50001 DROP VIEW IF EXISTS `v3`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v3` AS SELECT 1 AS `a`, 1 AS `b`, @@ -2616,7 +2616,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` bigint(20) DEFAULT NULL @@ -2692,7 +2692,7 @@ DELIMITER ; /*!50003 SET collation_connection = @saved_col_connection */ ; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -2750,7 +2750,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` bigint(20) DEFAULT NULL @@ -2768,7 +2768,7 @@ INSERT INTO `t1` VALUES UNLOCK TABLES; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -2900,7 +2900,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -3057,7 +3057,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), UNIQUE KEY `d` (`d`) @@ -3097,7 +3097,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), UNIQUE KEY `d` (`d`) @@ -3153,7 +3153,7 @@ a2 /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS "t1 test"; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE "t1 test" ( "a1" int(11) DEFAULT NULL ); @@ -3185,7 +3185,7 @@ DELIMITER ; /*!50003 SET collation_connection = @saved_col_connection */ ; DROP TABLE IF EXISTS "t2 test"; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE "t2 test" ( "a2" int(11) DEFAULT NULL ); @@ -3243,7 +3243,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` varchar(32) DEFAULT NULL, @@ -3262,7 +3262,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v0`; /*!50001 DROP VIEW IF EXISTS `v0`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v0` AS SELECT 1 AS `a`, 1 AS `b`, @@ -3271,7 +3271,7 @@ SET character_set_client = @saved_cs_client; DROP TABLE IF EXISTS `v1`; /*!50001 DROP VIEW IF EXISTS `v1`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `a`, 1 AS `b`, @@ -3280,7 +3280,7 @@ SET character_set_client = @saved_cs_client; DROP TABLE IF EXISTS `v2`; /*!50001 DROP VIEW IF EXISTS `v2`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `a`, 1 AS `b`, @@ -3372,7 +3372,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -3432,7 +3432,7 @@ insert into t1 values ('',''); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` binary(1) DEFAULT NULL, `b` blob DEFAULT NULL @@ -3468,7 +3468,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` binary(1) DEFAULT NULL, `b` blob DEFAULT NULL @@ -3654,7 +3654,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_test_db` /*!40100 DEFAULT CH USE `mysqldump_test_db`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -3672,7 +3672,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v1`; /*!50001 DROP VIEW IF EXISTS `v1`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `id` */; SET character_set_client = @saved_cs_client; @@ -3719,7 +3719,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHA USE `mysqldump_tables`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `basetable` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `tag` varchar(64) DEFAULT NULL, @@ -3731,7 +3731,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_views` /*!40100 DEFAULT CHAR USE `mysqldump_views`; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `nasishnasifu` AS SELECT 1 AS `id` */; SET character_set_client = @saved_cs_client; @@ -3868,7 +3868,7 @@ use test; /*M!999999\- enable the sandbox mode */ DROP TABLE IF EXISTS `TABLES`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TEMPORARY TABLE `TABLES` ( `TABLE_CATALOG` varchar(512) NOT NULL, `TABLE_SCHEMA` varchar(64) NOT NULL, @@ -3944,14 +3944,14 @@ CREATE TABLE t1 (a INT) ENGINE=merge UNION=(t2, t3); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci UNION=(`t2`,`t3`); /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `t2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -3963,7 +3963,7 @@ LOCK TABLES `t2` WRITE; UNLOCK TABLES; DROP TABLE IF EXISTS `t3`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t3` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -4058,7 +4058,7 @@ CREATE TABLE t1 (c1 INT, c2 LONGBLOB); INSERT INTO t1 SET c1=11, c2=REPEAT('q',509); /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL, `c2` longblob DEFAULT NULL @@ -4153,7 +4153,7 @@ create view db42635.v2 (c) as select * from db42635.t1; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -4166,7 +4166,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v2`; /*!50001 DROP VIEW IF EXISTS `v2`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `c` */; SET character_set_client = @saved_cs_client; @@ -4303,7 +4303,7 @@ INSERT INTO t1 VALUES (3,4), (4,5); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL @@ -4584,7 +4584,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_test_db` /*!40100 DEFAULT CH USE `mysqldump_test_db`; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -4602,7 +4602,7 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `v1`; /*!50001 DROP VIEW IF EXISTS `v1`*/; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `id` */; SET character_set_client = @saved_cs_client; @@ -4700,7 +4700,7 @@ create table test (a int); /*M!999999\- enable the sandbox mode */ DROP TABLE IF EXISTS `test`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `test` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -4922,7 +4922,7 @@ ALTER DATABASE `test-database` CHARACTER SET latin1 COLLATE latin1_swedish_ci; ALTER DATABASE `test-database` CHARACTER SET utf8 COLLATE utf8_unicode_ci ; /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `test` ( `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; @@ -5414,7 +5414,7 @@ CREATE TABLE t1 (a INT); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ); @@ -5696,7 +5696,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET ut USE `db1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `basetable` ( `id` smallint(6) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_uca1400_ai_ci; @@ -5705,13 +5705,13 @@ INSERT INTO `basetable` VALUES (5), (6); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_name` ( `i3` smallint(6) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_uca1400_ai_ci INSERT_METHOD=LAST UNION=(`basetable`); /*!40101 SET character_set_client = @saved_cs_client */; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `nonunique_table_view_name` AS SELECT 1 AS `1` */; SET character_set_client = @saved_cs_client; @@ -5720,7 +5720,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2` /*!40100 DEFAULT CHARACTER SET ut USE `db2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_name` ( `i1` bigint(20) unsigned NOT NULL AUTO_INCREMENT, UNIQUE KEY `i1` (`i1`) @@ -5730,7 +5730,7 @@ INSERT INTO `nonunique_table_name` VALUES (1), (2); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_view_name` ( `i2` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_uca1400_ai_ci; @@ -5761,7 +5761,7 @@ USE `db2`; /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_name` ( `i1` bigint(20) unsigned NOT NULL AUTO_INCREMENT, UNIQUE KEY `i1` (`i1`) @@ -5771,7 +5771,7 @@ INSERT INTO `nonunique_table_name` VALUES (1), (2); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_view_name` ( `i2` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_uca1400_ai_ci; @@ -5788,7 +5788,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2` /*!40100 DEFAULT CHARACTER SET ut USE `db2`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_name` ( `i1` bigint(20) unsigned NOT NULL AUTO_INCREMENT, UNIQUE KEY `i1` (`i1`) @@ -5798,7 +5798,7 @@ INSERT DELAYED INTO `nonunique_table_name` VALUES (1), (2); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_view_name` ( `i2` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_uca1400_ai_ci; @@ -5811,7 +5811,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET ut USE `db1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `basetable` ( `id` smallint(6) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_uca1400_ai_ci; @@ -5820,7 +5820,7 @@ INSERT DELAYED INTO `basetable` VALUES (5), (6); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `nonunique_table_name` ( `i3` smallint(6) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_uca1400_ai_ci INSERT_METHOD=LAST UNION=(`basetable`); @@ -5829,7 +5829,7 @@ INSERT INTO `nonunique_table_name` VALUES (5), (6); SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `nonunique_table_view_name` AS SELECT 1 AS `1` */; SET character_set_client = @saved_cs_client; @@ -5980,7 +5980,7 @@ DROP TABLE t1; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `general_log` ( `event_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), `user_host` mediumtext NOT NULL, @@ -5991,7 +5991,7 @@ CREATE TABLE IF NOT EXISTS `general_log` ( ) ENGINE=CSV DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='General log'; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `slow_log` ( `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), `user_host` mediumtext NOT NULL, @@ -6010,7 +6010,7 @@ CREATE TABLE IF NOT EXISTS `slow_log` ( /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `innodb_index_stats`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `innodb_index_stats` ( `database_name` varchar(64) NOT NULL, `table_name` varchar(199) NOT NULL, @@ -6025,7 +6025,7 @@ CREATE TABLE `innodb_index_stats` ( /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `innodb_table_stats`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `innodb_table_stats` ( `database_name` varchar(64) NOT NULL, `table_name` varchar(199) NOT NULL, @@ -6037,7 +6037,7 @@ CREATE TABLE `innodb_table_stats` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `transaction_registry` ( `transaction_id` bigint(20) unsigned NOT NULL, `commit_id` bigint(20) unsigned NOT NULL, @@ -6076,7 +6076,7 @@ CREATE TABLE IF NOT EXISTS `transaction_registry` ( /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `general_log` ( `event_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), `user_host` mediumtext NOT NULL, @@ -6087,7 +6087,7 @@ CREATE TABLE IF NOT EXISTS `general_log` ( ) ENGINE=CSV DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='General log'; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `slow_log` ( `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), `user_host` mediumtext NOT NULL, @@ -6106,7 +6106,7 @@ CREATE TABLE IF NOT EXISTS `slow_log` ( /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `innodb_index_stats`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `innodb_index_stats` ( `database_name` varchar(64) NOT NULL, `table_name` varchar(199) NOT NULL, @@ -6126,7 +6126,7 @@ LOCK TABLES `innodb_index_stats` WRITE; UNLOCK TABLES; DROP TABLE IF EXISTS `innodb_table_stats`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `innodb_table_stats` ( `database_name` varchar(64) NOT NULL, `table_name` varchar(199) NOT NULL, @@ -6143,7 +6143,7 @@ LOCK TABLES `innodb_table_stats` WRITE; /*!40000 ALTER TABLE `innodb_table_stats` ENABLE KEYS */; UNLOCK TABLES; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `transaction_registry` ( `transaction_id` bigint(20) unsigned NOT NULL, `commit_id` bigint(20) unsigned NOT NULL, @@ -6182,7 +6182,7 @@ CREATE TABLE IF NOT EXISTS `transaction_registry` ( /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `general_log` ( `event_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), `user_host` mediumtext NOT NULL, @@ -6193,7 +6193,7 @@ CREATE TABLE IF NOT EXISTS `general_log` ( ) ENGINE=CSV DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='General log'; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `slow_log` ( `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), `user_host` mediumtext NOT NULL, @@ -6212,7 +6212,7 @@ CREATE TABLE IF NOT EXISTS `slow_log` ( /*!40101 SET character_set_client = @saved_cs_client */; DROP TABLE IF EXISTS `innodb_index_stats`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `innodb_index_stats` ( `database_name` varchar(64) NOT NULL, `table_name` varchar(199) NOT NULL, @@ -6232,7 +6232,7 @@ LOCK TABLES `innodb_index_stats` WRITE; UNLOCK TABLES; DROP TABLE IF EXISTS `innodb_table_stats`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `innodb_table_stats` ( `database_name` varchar(64) NOT NULL, `table_name` varchar(199) NOT NULL, @@ -6249,7 +6249,7 @@ LOCK TABLES `innodb_table_stats` WRITE; /*!40000 ALTER TABLE `innodb_table_stats` ENABLE KEYS */; UNLOCK TABLES; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE IF NOT EXISTS `transaction_registry` ( `transaction_id` bigint(20) unsigned NOT NULL, `commit_id` bigint(20) unsigned NOT NULL, @@ -6296,7 +6296,7 @@ CREATE TABLE t4(Γ‹ΓΓŒΓΓŽΓ‹Γ1 INT); insert into t4 values(1); /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL INVISIBLE @@ -6305,7 +6305,7 @@ CREATE TABLE `t1` ( INSERT INTO `t1` (`a`, `b`) VALUES (1,NULL), (1,2); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL @@ -6315,7 +6315,7 @@ INSERT INTO `t2` VALUES (1,2), (1,2); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t3` ( `invisible` int(11) DEFAULT NULL, `a b c & $!@#$%^&*( )` int(11) DEFAULT 4 INVISIBLE, @@ -6327,7 +6327,7 @@ INSERT INTO `t3` (`invisible`, `a b c & $!@#$%^&*( )`, `ds=~!@ \# $% ^ & * ( ) (2,4,5), (1,2,3); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t4` ( `Γ‹ΓΓŒΓΓŽΓ‹Γ1` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -6337,7 +6337,7 @@ INSERT INTO `t4` VALUES #Check side effect on --complete insert /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL INVISIBLE @@ -6346,7 +6346,7 @@ CREATE TABLE `t1` ( INSERT INTO `t1` (`a`, `b`) VALUES (1,NULL), (1,2); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL @@ -6355,7 +6355,7 @@ CREATE TABLE `t2` ( INSERT INTO `t2` (`a`, `b`) VALUES (1,2), (1,2); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t3` ( `invisible` int(11) DEFAULT NULL, `a b c & $!@#$%^&*( )` int(11) DEFAULT 4 INVISIBLE, @@ -6367,7 +6367,7 @@ INSERT INTO `t3` (`invisible`, `a b c & $!@#$%^&*( )`, `ds=~!@ \# $% ^ & * ( ) (2,4,5), (1,2,3); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t4` ( `Γ‹ΓΓŒΓΓŽΓ‹Γ1` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -6698,7 +6698,7 @@ update mysql.event set body ='select not_a_value' where db='test' and name='e1'; create table t1 (i int); /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `i` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; @@ -6752,7 +6752,7 @@ create table t1 (a int); /*M!999999\- enable the sandbox mode */ DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; diff --git a/mysql-test/main/openssl_1.result b/mysql-test/main/openssl_1.result index 580f2d96cc3..fa5077d8a56 100644 --- a/mysql-test/main/openssl_1.result +++ b/mysql-test/main/openssl_1.result @@ -91,7 +91,7 @@ INSERT INTO t1 VALUES (1), (2); /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ); @@ -128,7 +128,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ); @@ -165,7 +165,7 @@ UNLOCK TABLES; /*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */; DROP TABLE IF EXISTS `t1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ); diff --git a/mysql-test/main/opt_tvc.result b/mysql-test/main/opt_tvc.result index c08c68eb7ee..15b6d9b4218 100644 --- a/mysql-test/main/opt_tvc.result +++ b/mysql-test/main/opt_tvc.result @@ -780,3 +780,15 @@ deallocate prepare stmt; drop table t1; set in_predicate_conversion_threshold=default; # End of 10.3 tests +# +# MDEV-32575 MSAN / Valgrind errors in test_if_cheaper_ordering +# upon reaching in_predicate_conversion_threshold +# +create table t1 (a int, b int, c int, primary key (a, b)); +insert into t1 (a, b) values (1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8); +set in_predicate_conversion_threshold = 2; +select * from t1 where a in (1, 2) and b = 2 order by a, b; +a b c +1 2 NULL +drop table t1; +# End of 11.4 tests diff --git a/mysql-test/main/opt_tvc.test b/mysql-test/main/opt_tvc.test index d676188401a..7d39c6a8979 100644 --- a/mysql-test/main/opt_tvc.test +++ b/mysql-test/main/opt_tvc.test @@ -474,3 +474,18 @@ drop table t1; set in_predicate_conversion_threshold=default; --echo # End of 10.3 tests + +--echo # +--echo # MDEV-32575 MSAN / Valgrind errors in test_if_cheaper_ordering +--echo # upon reaching in_predicate_conversion_threshold +--echo # + +create table t1 (a int, b int, c int, primary key (a, b)); +insert into t1 (a, b) values (1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8); + +set in_predicate_conversion_threshold = 2; +select * from t1 where a in (1, 2) and b = 2 order by a, b; + +drop table t1; + +--echo # End of 11.4 tests diff --git a/mysql-test/main/partition_exchange.result b/mysql-test/main/partition_exchange.result index ee73572514e..044808d600d 100644 --- a/mysql-test/main/partition_exchange.result +++ b/mysql-test/main/partition_exchange.result @@ -1250,6 +1250,46 @@ ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2; ERROR HY000: Tables have different definitions DROP TABLE t1, t2; # +# MDEV-34033 Exchange partition with virtual columns fails +# +create or replace table t1( +id int primary key, +col1 int, +col2 boolean as (col1 is null)) +partition by list (id) ( partition p1 values in (1) +); +create or replace table t1_working like t1; +alter table t1_working remove partitioning; +alter table t1 exchange partition p1 with table t1_working; +create or replace table t2( +id int primary key, +col1 int, +col2 boolean as (true)) +partition by list (id) ( partition p1 values in (1) +); +create or replace table t2_working like t2; +alter table t2_working remove partitioning; +alter table t2 exchange partition p1 with table t2_working; +drop tables t1, t1_working, t2, t2_working; +# +# MDEV-35612 EXCHANGE PARTITION does not work for tables with unique blobs +# +create table t (a int, b text, unique (b), unique(a, b)) partition by list (a) (partition p0 values in (1,2), partition pdef default); +create table tp (a int, b text, c int invisible, unique (b), unique(a, b)); +alter table t exchange partition p0 with table tp; +ERROR HY000: Tables have different definitions +create or replace table tp (a int, b text, unique (b), unique(a, b)); +alter table t exchange partition p0 with table tp; +drop table t, tp; +create table t (a int, b int) with system versioning partition by list (a) (partition p0 values in (1,2)); +create table tp (a int, b int); +alter table t exchange partition p0 with table tp; +ERROR HY000: Tables have different definitions +create or replace table tp (a int, b int) with system versioning; +alter table t exchange partition p0 with table tp; +drop table t, tp; +# End of 10.5 tests +# # MDEV-27683 EXCHANGE PARTITION allows different index direction, but causes further errors # CREATE TABLE t1 (a INT, KEY(a DESC)) PARTITION BY KEY(a) PARTITIONS 4; @@ -1257,6 +1297,4 @@ CREATE TABLE t2 (a INT, KEY(a)); ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2; ERROR HY000: Tables have different definitions DROP TABLE t1, t2; -# # End of 10.8 tests -# diff --git a/mysql-test/main/partition_exchange.test b/mysql-test/main/partition_exchange.test index e35d8e1f9d1..711a51c09f8 100644 --- a/mysql-test/main/partition_exchange.test +++ b/mysql-test/main/partition_exchange.test @@ -531,6 +531,7 @@ ALTER TABLE t2 REMOVE PARTITIONING; # The following works as table spaces are not checked anymore ALTER TABLE t1 EXCHANGE PARTITION pm WITH TABLE t2; DROP TABLE t1, t2; +--disable_prepare_warnings --echo # --echo # MDEV-14642 Assertion `table->s->db_create_options == part_table->s->db_create_options' failed in compare_table_with_partition @@ -551,6 +552,60 @@ ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2; # Cleanup DROP TABLE t1, t2; +--echo # +--echo # MDEV-34033 Exchange partition with virtual columns fails +--echo # +# this fails when the virtual persistent column +# references another column +create or replace table t1( + id int primary key, + col1 int, + col2 boolean as (col1 is null)) + partition by list (id) ( partition p1 values in (1) +); + +create or replace table t1_working like t1; +alter table t1_working remove partitioning; +alter table t1 exchange partition p1 with table t1_working; + +# this works when the virtual persistent column +# does not reference another column +create or replace table t2( + id int primary key, + col1 int, + col2 boolean as (true)) + partition by list (id) ( partition p1 values in (1) +); + +create or replace table t2_working like t2; +alter table t2_working remove partitioning; +alter table t2 exchange partition p1 with table t2_working; + +# Cleanup +drop tables t1, t1_working, t2, t2_working; + +--echo # +--echo # MDEV-35612 EXCHANGE PARTITION does not work for tables with unique blobs +--echo # +create table t (a int, b text, unique (b), unique(a, b)) partition by list (a) (partition p0 values in (1,2), partition pdef default); +create table tp (a int, b text, c int invisible, unique (b), unique(a, b)); +--error ER_TABLES_DIFFERENT_METADATA +alter table t exchange partition p0 with table tp; +create or replace table tp (a int, b text, unique (b), unique(a, b)); +alter table t exchange partition p0 with table tp; +drop table t, tp; + +# same for system versioning: +create table t (a int, b int) with system versioning partition by list (a) (partition p0 values in (1,2)); +create table tp (a int, b int); # without system versioning +--error ER_TABLES_DIFFERENT_METADATA +alter table t exchange partition p0 with table tp; +create or replace table tp (a int, b int) with system versioning; +alter table t exchange partition p0 with table tp; +drop table t, tp; + +--echo # End of 10.5 tests + --echo # --echo # MDEV-27683 EXCHANGE PARTITION allows different index direction, but causes further errors --echo # @@ -560,6 +615,4 @@ CREATE TABLE t2 (a INT, KEY(a)); ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2; DROP TABLE t1, t2; ---echo # --echo # End of 10.8 tests ---echo # diff --git a/mysql-test/main/ps_11bugs.result b/mysql-test/main/ps_11bugs.result index 87a3487141b..985654eb283 100644 --- a/mysql-test/main/ps_11bugs.result +++ b/mysql-test/main/ps_11bugs.result @@ -245,4 +245,39 @@ NULL DEALLOCATE PREPARE stmt; SET timestamp=DEFAULT; SET time_zone=DEFAULT; +# +# MDEV-35596 Assertion `type_handler()->result_type() == value.type_handler()->result_type()' failed in virtual bool Item_param::get_date(THD*, MYSQL_TIME*, date_mode_t) +# +CREATE TABLE t (c TIMESTAMP); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +INSERT INTO t (c) VALUES (now()); +EXECUTE s USING NULL; +DROP TABLE t; +CREATE TABLE t (c TIMESTAMP); +INSERT INTO t (c) VALUES ('2001-01-01 10:20:30'); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +Warnings: +Warning 1292 Truncated incorrect datetime value: '1' +EXECUTE s USING NULL; +DROP TABLE t; +CREATE TABLE t (c TIMESTAMP); +INSERT INTO t (c) VALUES ('2001-01-01 10:20:30'); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +Warnings: +Warning 1292 Truncated incorrect datetime value: '1' +EXECUTE s USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +DROP TABLE t; +CREATE TABLE t (c TIMESTAMP); +INSERT INTO t (c) VALUES ('2001-01-01 10:20:30'); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +Warnings: +Warning 1292 Truncated incorrect datetime value: '1' +EXECUTE s USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +DROP TABLE t; # End of 10.5 tests diff --git a/mysql-test/main/ps_11bugs.test b/mysql-test/main/ps_11bugs.test index 7a0843e9352..7cb5708d062 100644 --- a/mysql-test/main/ps_11bugs.test +++ b/mysql-test/main/ps_11bugs.test @@ -254,4 +254,38 @@ DEALLOCATE PREPARE stmt; SET timestamp=DEFAULT; SET time_zone=DEFAULT; +--echo # +--echo # MDEV-35596 Assertion `type_handler()->result_type() == value.type_handler()->result_type()' failed in virtual bool Item_param::get_date(THD*, MYSQL_TIME*, date_mode_t) +--echo # + +CREATE TABLE t (c TIMESTAMP); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +INSERT INTO t (c) VALUES (now()); +EXECUTE s USING NULL; +DROP TABLE t; + +CREATE TABLE t (c TIMESTAMP); +INSERT INTO t (c) VALUES ('2001-01-01 10:20:30'); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +EXECUTE s USING NULL; +DROP TABLE t; + +CREATE TABLE t (c TIMESTAMP); +INSERT INTO t (c) VALUES ('2001-01-01 10:20:30'); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE s USING DEFAULT; +DROP TABLE t; + +CREATE TABLE t (c TIMESTAMP); +INSERT INTO t (c) VALUES ('2001-01-01 10:20:30'); +PREPARE s FROM 'DELETE FROM t WHERE c=?'; +EXECUTE s USING 1; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE s USING IGNORE; +DROP TABLE t; + --echo # End of 10.5 tests diff --git a/mysql-test/main/servers.result b/mysql-test/main/servers.result index 4e470e39c2f..c67e2cfa080 100644 --- a/mysql-test/main/servers.result +++ b/mysql-test/main/servers.result @@ -62,7 +62,7 @@ create or replace server srv foreign data wrapper Foo options show create server srv; Server Create Server srv CREATE SERVER `srv` FOREIGN DATA WRAPPER Foo OPTIONS (host 'somewhere.else', port '54321', wait_what 'it''s all good', foo 'bar'); -alter server srv options (socket "sock", port 123, foo "", bar ")\"{"); +alter server srv options (socket "sock", port 123, foo "", bar ')"{'); show create server srv; Server Create Server srv CREATE SERVER `srv` FOREIGN DATA WRAPPER Foo OPTIONS (host 'somewhere.else', wait_what 'it''s all good', socket 'sock', port '123', foo '', bar ')"{'); diff --git a/mysql-test/main/servers.test b/mysql-test/main/servers.test index db0a970c6c0..bd9f0ed6634 100644 --- a/mysql-test/main/servers.test +++ b/mysql-test/main/servers.test @@ -59,7 +59,7 @@ create or replace server srv foreign data wrapper Foo options (host "somewhere.else", port 54321, wait_what "it's all good", foo 'bar'); show create server srv; -alter server srv options (socket "sock", port 123, foo "", bar ")\"{"); +alter server srv options (socket "sock", port 123, foo "", bar ')"{'); show create server srv; alter server srv options (socket "sock", port 123, bar "quux"); diff --git a/mysql-test/main/simultaneous_assignment.result b/mysql-test/main/simultaneous_assignment.result index 67cb58ba6af..041d7bf0f5c 100644 --- a/mysql-test/main/simultaneous_assignment.result +++ b/mysql-test/main/simultaneous_assignment.result @@ -220,3 +220,15 @@ INDEXES Indexes TRANSACTIONS Transactions TRIGGERS Triggers DROP TABLE ft2; +# +# MDEV-27769 Assertion failed in Field::ptr_in_record upon UPDATE +# (duplicate) MDEV-35404 Assertion failed in Field::ptr_in_record +# +CREATE TABLE t (s geometry, t text); +INSERT INTO t () VALUES (); +UPDATE t SET t = '', s = 0; +ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t`.`s` +UPDATE t SET t = '', s = 0; +ERROR HY000: Cannot cast 'int' as 'geometry' in assignment of `test`.`t`.`s` +ALTER TABLE t force; +DROP TABLE t; diff --git a/mysql-test/main/simultaneous_assignment.test b/mysql-test/main/simultaneous_assignment.test index aea454855f5..cfc802d9caf 100644 --- a/mysql-test/main/simultaneous_assignment.test +++ b/mysql-test/main/simultaneous_assignment.test @@ -205,3 +205,19 @@ UPDATE ft2 SET copy = UPPER(copy), copy2= copy; SELECT * FROM ft2; DROP TABLE ft2; + +--echo # +--echo # MDEV-27769 Assertion failed in Field::ptr_in_record upon UPDATE +--echo # (duplicate) MDEV-35404 Assertion failed in Field::ptr_in_record +--echo # +CREATE TABLE t (s geometry, t text); + +INSERT INTO t () VALUES (); +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +UPDATE t SET t = '', s = 0; +--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION +UPDATE t SET t = '', s = 0; + +ALTER TABLE t force; + +DROP TABLE t; diff --git a/mysql-test/main/slowlog_integrity.result b/mysql-test/main/slowlog_integrity.result new file mode 100644 index 00000000000..0ab6fcbfc5e --- /dev/null +++ b/mysql-test/main/slowlog_integrity.result @@ -0,0 +1,108 @@ +# +# MDEV-20281 "[ERROR] Failed to write to mysql.slow_log:" without +# error reason +# +call mtr.add_suppression("Failed to write to mysql.slow_log:"); +SET @old_slow_query_log= @@global.slow_query_log; +SET @old_log_output= @@global.log_output; +SET @old_long_query_time= @@long_query_time; +SET GLOBAL log_output= "TABLE"; +SET GLOBAL slow_query_log= ON; +SET SESSION long_query_time= 0; +select 1 from dual; +1 +1 +show create table mysql.slow_log; +Table Create Table +slow_log CREATE TABLE `slow_log` ( + `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), + `user_host` mediumtext NOT NULL, + `query_time` time(6) NOT NULL, + `lock_time` time(6) NOT NULL, + `rows_sent` bigint(20) unsigned NOT NULL, + `rows_examined` bigint(20) unsigned NOT NULL, + `db` varchar(512) NOT NULL, + `last_insert_id` int(11) NOT NULL, + `insert_id` int(11) NOT NULL, + `server_id` int(10) unsigned NOT NULL, + `sql_text` mediumtext NOT NULL, + `thread_id` bigint(21) unsigned NOT NULL, + `rows_affected` bigint(20) unsigned NOT NULL +) ENGINE=CSV DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='Slow log' +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= "FILE"; +SET GLOBAL slow_query_log= OFF; +drop table mysql.slow_log; +# one field missing +CREATE TABLE mysql.slow_log ( +`start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), +`user_host` mediumtext NOT NULL, +`query_time` time(6) NOT NULL, +`lock_time` time(6) NOT NULL, +`rows_sent` bigint(20) unsigned NOT NULL, +`rows_examined` bigint(20) unsigned NOT NULL, +`db` varchar(512) NOT NULL, +`last_insert_id` int(11) NOT NULL, +`insert_id` int(11) NOT NULL, +`server_id` int(10) unsigned NOT NULL, +`sql_text` mediumtext NOT NULL, +`thread_id` bigint(21) unsigned NOT NULL +) ENGINE=CSV DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Slow log'; +SET GLOBAL log_output= "TABLE"; +SET GLOBAL slow_query_log= ON; +SET SESSION long_query_time= 0; +select 1 from dual; +1 +1 +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= "FILE"; +SET GLOBAL slow_query_log= OFF; +drop table mysql.slow_log; +# crazy types +CREATE TABLE mysql.slow_log ( +`start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), +`user_host` ENUM('apple','orange','pear') NOT NULL, +`query_time` ENUM('apple','orange','pear') NOT NULL, +`lock_time` ENUM('apple','orange','pear') NOT NULL, +`rows_sent` ENUM('apple','orange','pear') NOT NULL, +`rows_examined` ENUM('apple','orange','pear') NOT NULL, +`db` ENUM('apple','orange','pear') NOT NULL, +`last_insert_id` ENUM('apple','orange','pear') NOT NULL, +`insert_id` ENUM('apple','orange','pear') NOT NULL, +`server_id` ENUM('apple','orange','pear') NOT NULL, +`sql_text` ENUM('apple','orange','pear') NOT NULL, +`thread_id` ENUM('apple','orange','pear') NOT NULL, +`rows_affected` ENUM('apple','orange','pear') NOT NULL +) ENGINE=CSV DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Slow log'; +SET GLOBAL log_output= "TABLE"; +SET GLOBAL slow_query_log= ON; +SET SESSION long_query_time= 0; +select 1 from dual; +1 +1 +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= "FILE"; +SET GLOBAL slow_query_log= OFF; +drop table mysql.slow_log; +# restore normal slow log table +CREATE TABLE mysql.slow_log ( +`start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), +`user_host` mediumtext NOT NULL, +`query_time` time(6) NOT NULL, +`lock_time` time(6) NOT NULL, +`rows_sent` bigint(20) unsigned NOT NULL, +`rows_examined` bigint(20) unsigned NOT NULL, +`db` varchar(512) NOT NULL, +`last_insert_id` int(11) NOT NULL, +`insert_id` int(11) NOT NULL, +`server_id` int(10) unsigned NOT NULL, +`sql_text` mediumtext NOT NULL, +`thread_id` bigint(21) unsigned NOT NULL, +`rows_affected` bigint(20) unsigned NOT NULL +) ENGINE=CSV DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Slow log'; +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= @old_log_output; +SET @@global.slow_query_log= @old_slow_query_log; +FOUND 2 /incorrect number of fields in the log table/ in mysqld.1.err +FOUND 2 /Can't write data \(possible incorrect log table structure\)/ in mysqld.1.err +# End of 10.5 tests diff --git a/mysql-test/main/slowlog_integrity.test b/mysql-test/main/slowlog_integrity.test new file mode 100644 index 00000000000..8db3a5ee881 --- /dev/null +++ b/mysql-test/main/slowlog_integrity.test @@ -0,0 +1,113 @@ +source include/not_embedded.inc; + +--echo # +--echo # MDEV-20281 "[ERROR] Failed to write to mysql.slow_log:" without +--echo # error reason +--echo # + + +call mtr.add_suppression("Failed to write to mysql.slow_log:"); + +--disable_ps_protocol +SET @old_slow_query_log= @@global.slow_query_log; +SET @old_log_output= @@global.log_output; +SET @old_long_query_time= @@long_query_time; +SET GLOBAL log_output= "TABLE"; +SET GLOBAL slow_query_log= ON; +SET SESSION long_query_time= 0; + +select 1 from dual; + +show create table mysql.slow_log; + +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= "FILE"; +SET GLOBAL slow_query_log= OFF; + +drop table mysql.slow_log; + +--echo # one field missing +CREATE TABLE mysql.slow_log ( + `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), + `user_host` mediumtext NOT NULL, + `query_time` time(6) NOT NULL, + `lock_time` time(6) NOT NULL, + `rows_sent` bigint(20) unsigned NOT NULL, + `rows_examined` bigint(20) unsigned NOT NULL, + `db` varchar(512) NOT NULL, + `last_insert_id` int(11) NOT NULL, + `insert_id` int(11) NOT NULL, + `server_id` int(10) unsigned NOT NULL, + `sql_text` mediumtext NOT NULL, + `thread_id` bigint(21) unsigned NOT NULL +) ENGINE=CSV DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Slow log'; + +SET GLOBAL log_output= "TABLE"; +SET GLOBAL slow_query_log= ON; +SET SESSION long_query_time= 0; + +select 1 from dual; + +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= "FILE"; +SET GLOBAL slow_query_log= OFF; + +drop table mysql.slow_log; + +--echo # crazy types +CREATE TABLE mysql.slow_log ( + `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), + `user_host` ENUM('apple','orange','pear') NOT NULL, + `query_time` ENUM('apple','orange','pear') NOT NULL, + `lock_time` ENUM('apple','orange','pear') NOT NULL, + `rows_sent` ENUM('apple','orange','pear') NOT NULL, + `rows_examined` ENUM('apple','orange','pear') NOT NULL, + `db` ENUM('apple','orange','pear') NOT NULL, + `last_insert_id` ENUM('apple','orange','pear') NOT NULL, + `insert_id` ENUM('apple','orange','pear') NOT NULL, + `server_id` ENUM('apple','orange','pear') NOT NULL, + `sql_text` ENUM('apple','orange','pear') NOT NULL, + `thread_id` ENUM('apple','orange','pear') NOT NULL, + `rows_affected` ENUM('apple','orange','pear') NOT NULL +) ENGINE=CSV DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Slow log'; + +SET GLOBAL log_output= "TABLE"; +SET GLOBAL slow_query_log= ON; +SET SESSION long_query_time= 0; + +select 1 from dual; + +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= "FILE"; +SET GLOBAL slow_query_log= OFF; + +drop table mysql.slow_log; + +--echo # restore normal slow log table +CREATE TABLE mysql.slow_log ( + `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), + `user_host` mediumtext NOT NULL, + `query_time` time(6) NOT NULL, + `lock_time` time(6) NOT NULL, + `rows_sent` bigint(20) unsigned NOT NULL, + `rows_examined` bigint(20) unsigned NOT NULL, + `db` varchar(512) NOT NULL, + `last_insert_id` int(11) NOT NULL, + `insert_id` int(11) NOT NULL, + `server_id` int(10) unsigned NOT NULL, + `sql_text` mediumtext NOT NULL, + `thread_id` bigint(21) unsigned NOT NULL, + `rows_affected` bigint(20) unsigned NOT NULL +) ENGINE=CSV DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Slow log'; +SET @@long_query_time= @old_long_query_time; +SET @@global.log_output= @old_log_output; +SET @@global.slow_query_log= @old_slow_query_log; +--enable_ps_protocol + +--let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err +--let SEARCH_PATTERN=incorrect number of fields in the log table +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=Can't write data \(possible incorrect log table structure\) +--source include/search_pattern_in_file.inc + +--echo # End of 10.5 tests diff --git a/mysql-test/main/sp-bugs.result b/mysql-test/main/sp-bugs.result index 99ed1a7e0cd..7c4d13485c2 100644 --- a/mysql-test/main/sp-bugs.result +++ b/mysql-test/main/sp-bugs.result @@ -363,3 +363,30 @@ ERROR HY000: Unknown thread id: 0 # # End of 10.4 tests # +# +# MDEV-24935: Server crashes in Field_iterator_natural_join::next or Field_iterator_table_ref::set_field_iterator upon 2nd execution of SP +# +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT, c INT); +CREATE TABLE t3 (d INT); +CREATE PROCEDURE sp() SELECT * FROM t1 JOIN t2 JOIN t3 USING (x); +CALL sp; +ERROR 42S22: Unknown column 'x' in 'FROM' +CALL sp; +ERROR 42S22: Unknown column 'x' in 'FROM' +# Clean up +DROP PROCEDURE sp; +DROP TABLE t1, t2, t3; +CREATE TABLE t1 (c1 INT,c2 INT); +CREATE TABLE t2 (c INT,c2 INT); +CREATE PROCEDURE p2 (OUT i INT,OUT o INT) READS SQL DATA DELETE a2,a3 FROM t1 AS a1 JOIN t2 AS a2 NATURAL JOIN t2 AS a3; +CALL p2 (@c,@a); +ERROR 23000: Column 'c2' in FROM is ambiguous +CALL p2 (@a,@c); +ERROR 23000: Column 'c2' in FROM is ambiguous +# Clean up +DROP PROCEDURE p2; +DROP TABLE t1, t2; +# +# End of 10.5 tests +# diff --git a/mysql-test/main/sp-bugs.test b/mysql-test/main/sp-bugs.test index 18fe14dc8bc..f44216fbf46 100644 --- a/mysql-test/main/sp-bugs.test +++ b/mysql-test/main/sp-bugs.test @@ -386,3 +386,34 @@ KILL (('x' IN ( SELECT 1)) MOD 44); --echo # --echo # End of 10.4 tests --echo # + +--echo # +--echo # MDEV-24935: Server crashes in Field_iterator_natural_join::next or Field_iterator_table_ref::set_field_iterator upon 2nd execution of SP +--echo # +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT, c INT); +CREATE TABLE t3 (d INT); +CREATE PROCEDURE sp() SELECT * FROM t1 JOIN t2 JOIN t3 USING (x); +--error ER_BAD_FIELD_ERROR +CALL sp; +--error ER_BAD_FIELD_ERROR +CALL sp; +--echo # Clean up +DROP PROCEDURE sp; +DROP TABLE t1, t2, t3; + +CREATE TABLE t1 (c1 INT,c2 INT); +CREATE TABLE t2 (c INT,c2 INT); +CREATE PROCEDURE p2 (OUT i INT,OUT o INT) READS SQL DATA DELETE a2,a3 FROM t1 AS a1 JOIN t2 AS a2 NATURAL JOIN t2 AS a3; + +--error ER_NON_UNIQ_ERROR +CALL p2 (@c,@a); +--error ER_NON_UNIQ_ERROR +CALL p2 (@a,@c); +--echo # Clean up +DROP PROCEDURE p2; +DROP TABLE t1, t2; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result index d365d36fac4..07a85cba5f4 100644 --- a/mysql-test/main/sp.result +++ b/mysql-test/main/sp.result @@ -8964,6 +8964,223 @@ DROP PROCEDURE p1; DROP PROCEDURE p2; # End of 10.4 tests # +# MDEV-35910: Pushdown of conditions with local SP variables +# into materialized derived table +# Pushdown of conditions with local variables from HAVING +# into WHERE +# +CREATE TABLE t1( +pk INT PRIMARY KEY AUTO_INCREMENT, +a INT, +b INT +); +INSERT INTO t1(a,b) VALUES (1, 2), (3, 2), (4, 5); +INSERT INTO t1(a,b) VALUES (3, 7), (4, 1), (3, 4); +CREATE PROCEDURE pushdownDerivedSp() +BEGIN +DECLARE localA INT DEFAULT 1; +DECLARE localB INT DEFAULT 2; +SELECT dt.a +FROM ( +SELECT t1.a, MIN(t1.b) as minB +FROM t1 +GROUP BY t1.a +) AS dt +WHERE dt.minB = localB AND dt.a = localA + localB; +END$$ +CREATE PROCEDURE explainPushdownDerivedSp() +BEGIN +DECLARE localA INT DEFAULT 1; +DECLARE localB INT DEFAULT 2; +EXPLAIN format=json SELECT dt.a +FROM ( +SELECT t1.a, MIN(t1.b) as minB +FROM t1 +GROUP BY t1.a +) AS dt +WHERE dt.minB = localB AND dt.a = localA + localB; +END$$ +CREATE PROCEDURE pushdownFromHavingSp() +BEGIN +DECLARE localA INT DEFAULT 1; +DECLARE localB INT DEFAULT 2; +SELECT t1.a, SUM(b) +FROM t1 +GROUP BY t1.a +HAVING t1.a > localA AND SUM(b) > 10 OR t1.a <= localB AND SUM(b) <= 2; +END$$ +CREATE PROCEDURE explainPushdownFromHavingSp() +BEGIN +DECLARE localA INT DEFAULT 1; +DECLARE localB INT DEFAULT 2; +EXPLAIN format=json +SELECT t1.a, SUM(b) +FROM t1 +GROUP BY t1.a +HAVING t1.a > localA AND SUM(b) > 10 OR t1.a <= localB AND SUM(b) <= 2; +END$$ +CALL pushdownDerivedSp(); +a +3 +set statement optimizer_switch='condition_pushdown_for_derived=off' +for CALL pushdownDerivedSp(); +a +3 +CALL explainPushdownDerivedSp(); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "cost": 0.012588104, + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "loops": 1, + "rows": 6, + "cost": 0.012588104, + "filtered": 100, + "attached_condition": "dt.minB = (localB@1) and dt.a = (localA@0 + localB@1)", + "materialized": { + "query_block": { + "select_id": 2, + "cost": 0.014784479, + "having_condition": "minB = (localB@1)", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "loops": 1, + "rows": 6, + "cost": 0.01097403, + "filtered": 100, + "attached_condition": "t1.a = (localA@0 + localB@1)" + } + } + ] + } + } + } + } + ] + } +} +set statement optimizer_switch='condition_pushdown_for_derived=off' for +CALL explainPushdownDerivedSp(); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "cost": 0.012588104, + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "loops": 1, + "rows": 6, + "cost": 0.012588104, + "filtered": 100, + "attached_condition": "dt.minB = (localB@1) and dt.a = (localA@0 + localB@1)", + "materialized": { + "query_block": { + "select_id": 2, + "cost": 0.014784479, + "filesort": { + "sort_key": "t1.a", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "loops": 1, + "rows": 6, + "cost": 0.01097403, + "filtered": 100 + } + } + ] + } + } + } + } + } + } + ] + } +} +CALL pushdownFromHavingSp(); +a SUM(b) +1 2 +3 13 +set statement optimizer_switch='condition_pushdown_from_having=off' for +CALL pushdownFromHavingSp(); +a SUM(b) +1 2 +3 13 +CALL explainPushdownFromHavingSp(); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "cost": 0.014784479, + "having_condition": "t1.a > (localA@0) and sum(t1.b) > 10 or t1.a <= (localB@1) and sum(t1.b) <= 2", + "filesort": { + "sort_key": "t1.a", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "loops": 1, + "rows": 6, + "cost": 0.01097403, + "filtered": 100, + "attached_condition": "t1.a > (localA@0) or t1.a <= (localB@1)" + } + } + ] + } + } + } +} +set statement optimizer_switch='condition_pushdown_from_having=off' for +CALL explainPushdownFromHavingSp(); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "cost": 0.014784479, + "having_condition": "t1.a > (localA@0) and sum(t1.b) > 10 or t1.a <= (localB@1) and sum(t1.b) <= 2", + "filesort": { + "sort_key": "t1.a", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "loops": 1, + "rows": 6, + "cost": 0.01097403, + "filtered": 100 + } + } + ] + } + } + } +} +DROP PROCEDURE pushdownDerivedSp; +DROP PROCEDURE explainPushdownDerivedSp; +DROP PROCEDURE pushdownFromHavingSp; +DROP PROCEDURE explainPushdownFromHavingSp; +DROP TABLE t1; +# End of 10.5 tests # # MDEV-29129: Performance regression starting in 10.6: unlimited "select order by limit" # @@ -9089,6 +9306,7 @@ database() test DROP FUNCTION database; DROP TABLE t1; +# End of 10.6 tests # # MDEV-28129: MariaDB UAF issue at lex_end_nops(LEX*) # @@ -9098,6 +9316,4 @@ CREATE PROCEDURE sp() SET @=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 '=1' at line 1 CREATE PROCEDURE sp() SELECT @; 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 -# # End of 10.7 tests -# diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test index 8f3bca6b5b4..cfc33ac3891 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -10590,7 +10590,95 @@ DROP PROCEDURE p1; DROP PROCEDURE p2; --echo # End of 10.4 tests + --echo # +--echo # MDEV-35910: Pushdown of conditions with local SP variables +--echo # into materialized derived table +--echo # Pushdown of conditions with local variables from HAVING +--echo # into WHERE +--echo # + +CREATE TABLE t1( + pk INT PRIMARY KEY AUTO_INCREMENT, + a INT, + b INT +); +INSERT INTO t1(a,b) VALUES (1, 2), (3, 2), (4, 5); +INSERT INTO t1(a,b) VALUES (3, 7), (4, 1), (3, 4); + +DELIMITER $$; +CREATE PROCEDURE pushdownDerivedSp() +BEGIN + DECLARE localA INT DEFAULT 1; + DECLARE localB INT DEFAULT 2; + SELECT dt.a + FROM ( + SELECT t1.a, MIN(t1.b) as minB + FROM t1 + GROUP BY t1.a + ) AS dt + WHERE dt.minB = localB AND dt.a = localA + localB; +END$$ + +CREATE PROCEDURE explainPushdownDerivedSp() +BEGIN + DECLARE localA INT DEFAULT 1; + DECLARE localB INT DEFAULT 2; + EXPLAIN format=json SELECT dt.a + FROM ( + SELECT t1.a, MIN(t1.b) as minB + FROM t1 + GROUP BY t1.a + ) AS dt + WHERE dt.minB = localB AND dt.a = localA + localB; +END$$ + +CREATE PROCEDURE pushdownFromHavingSp() +BEGIN + DECLARE localA INT DEFAULT 1; + DECLARE localB INT DEFAULT 2; + SELECT t1.a, SUM(b) + FROM t1 + GROUP BY t1.a + HAVING t1.a > localA AND SUM(b) > 10 OR t1.a <= localB AND SUM(b) <= 2; +END$$ + +CREATE PROCEDURE explainPushdownFromHavingSp() +BEGIN + DECLARE localA INT DEFAULT 1; + DECLARE localB INT DEFAULT 2; + EXPLAIN format=json + SELECT t1.a, SUM(b) + FROM t1 + GROUP BY t1.a + HAVING t1.a > localA AND SUM(b) > 10 OR t1.a <= localB AND SUM(b) <= 2; +END$$ + +DELIMITER ;$$ + +CALL pushdownDerivedSp(); +set statement optimizer_switch='condition_pushdown_for_derived=off' +for CALL pushdownDerivedSp(); + +CALL explainPushdownDerivedSp(); +set statement optimizer_switch='condition_pushdown_for_derived=off' for +CALL explainPushdownDerivedSp(); + +CALL pushdownFromHavingSp(); +set statement optimizer_switch='condition_pushdown_from_having=off' for +CALL pushdownFromHavingSp(); + +CALL explainPushdownFromHavingSp(); +set statement optimizer_switch='condition_pushdown_from_having=off' for +CALL explainPushdownFromHavingSp(); + +DROP PROCEDURE pushdownDerivedSp; +DROP PROCEDURE explainPushdownDerivedSp; +DROP PROCEDURE pushdownFromHavingSp; +DROP PROCEDURE explainPushdownFromHavingSp; +DROP TABLE t1; + +--echo # End of 10.5 tests --echo # --echo # MDEV-29129: Performance regression starting in 10.6: unlimited "select order by limit" @@ -10678,10 +10766,9 @@ CREATE OR REPLACE FUNCTION database() RETURNS int RETURN 333; SELECT database(); DROP FUNCTION database; - -# Cleanup DROP TABLE t1; +--echo # End of 10.6 tests --echo # --echo # MDEV-28129: MariaDB UAF issue at lex_end_nops(LEX*) @@ -10696,6 +10783,4 @@ CREATE PROCEDURE sp() SET @=1; --error ER_PARSE_ERROR CREATE PROCEDURE sp() SELECT @; ---echo # --echo # End of 10.7 tests ---echo # diff --git a/mysql-test/main/stack.result b/mysql-test/main/stack.result index 5444381327d..d30a55cd21a 100644 --- a/mysql-test/main/stack.result +++ b/mysql-test/main/stack.result @@ -37,6 +37,7 @@ $$ call recursion(0,2,@s1); call recursion(0,3,@s2); call recursion(0,4,@s3); +$$ select @s1 > 0 && @s2 > 0 && @s3 > 0; @s1 > 0 && @s2 > 0 && @s3 > 0 1 diff --git a/mysql-test/main/stack.test b/mysql-test/main/stack.test index 2277b0f48ff..60e629a67c4 100644 --- a/mysql-test/main/stack.test +++ b/mysql-test/main/stack.test @@ -30,6 +30,7 @@ DROP table t1; --echo # set @@max_sp_recursion_depth=20; +--disable_ps_protocol delimiter $$; create or replace procedure recursion(x int, max int, OUT res int) begin @@ -40,11 +41,13 @@ begin end; $$ -delimiter ;$$ - call recursion(0,2,@s1); call recursion(0,3,@s2); call recursion(0,4,@s3); +$$ + +delimiter ;$$ +--enable_ps_protocol select @s1 > 0 && @s2 > 0 && @s3 > 0; if (`select @s2-@s1 <> @s3 - @s2`) diff --git a/mysql-test/main/trigger_no_defaults-11698.result b/mysql-test/main/trigger_no_defaults-11698.result index 8ce495eaf3a..443bf15bb63 100644 --- a/mysql-test/main/trigger_no_defaults-11698.result +++ b/mysql-test/main/trigger_no_defaults-11698.result @@ -15,10 +15,10 @@ insert t1 (b) values (10); insert t1 (b) values (20); ERROR HY000: Field 'a' doesn't have a default value insert t1 (b) values (30); +ERROR 23000: Column 'a' cannot be null select * from t1; a b 10 10 -0 30 drop table t1; set sql_mode=default; set sql_mode=''; diff --git a/mysql-test/main/trigger_no_defaults-11698.test b/mysql-test/main/trigger_no_defaults-11698.test index c10bec68314..86a7a436ad0 100644 --- a/mysql-test/main/trigger_no_defaults-11698.test +++ b/mysql-test/main/trigger_no_defaults-11698.test @@ -19,7 +19,7 @@ delimiter ;| insert t1 (b) values (10); --error ER_NO_DEFAULT_FOR_FIELD insert t1 (b) values (20); -# arguably the statement below should fail too +--error ER_BAD_NULL_ERROR insert t1 (b) values (30); select * from t1; drop table t1; diff --git a/mysql-test/main/trigger_null-8605.result b/mysql-test/main/trigger_null.result similarity index 91% rename from mysql-test/main/trigger_null-8605.result rename to mysql-test/main/trigger_null.result index 9dcd2994b79..4e4a99f22a3 100644 --- a/mysql-test/main/trigger_null-8605.result +++ b/mysql-test/main/trigger_null.result @@ -364,3 +364,39 @@ create trigger tr before update on t1 for each row set @a = 1; insert into t1 (pk, i) values (null, null); ERROR 23000: Column 'pk' cannot be null drop table t1; +# +# MDEV-19761 Before Trigger not processed for Not Null Columns if no explicit value and no DEFAULT +# +create table t1( id int, rate int not null); +create trigger test_trigger before insert on t1 for each row +set new.rate=if(new.rate is null,10,new.rate); +insert into t1 (id) values (1); +insert into t1 values (2,3); +select * from t1; +id rate +1 10 +2 3 +create or replace trigger test_trigger before insert on t1 for each row +if new.rate is null then set new.rate = 15; end if; +$$ +insert into t1 (id) values (3); +insert into t1 values (4,5); +select * from t1; +id rate +1 10 +2 3 +3 15 +4 5 +drop table t1; +# +# MDEV-35911 Assertion `marked_for_write_or_computed()' failed in bool Field_new_decimal::store_value(const my_decimal*, int*) +# +set sql_mode=''; +create table t1 (c fixed,c2 binary (1),c5 fixed not null); +create trigger tr1 before update on t1 for each row set @a=0; +insert into t1 (c) values (1); +Warnings: +Warning 1364 Field 'c5' doesn't have a default value +drop table t1; +set sql_mode=default; +# End of 10.5 tests diff --git a/mysql-test/main/trigger_null-8605.test b/mysql-test/main/trigger_null.test similarity index 92% rename from mysql-test/main/trigger_null-8605.test rename to mysql-test/main/trigger_null.test index c9a7cd5477d..3aa39ded586 100644 --- a/mysql-test/main/trigger_null-8605.test +++ b/mysql-test/main/trigger_null.test @@ -391,3 +391,38 @@ create trigger tr before update on t1 for each row set @a = 1; --error ER_BAD_NULL_ERROR insert into t1 (pk, i) values (null, null); drop table t1; + +--echo # +--echo # MDEV-19761 Before Trigger not processed for Not Null Columns if no explicit value and no DEFAULT +--echo # +create table t1( id int, rate int not null); +create trigger test_trigger before insert on t1 for each row + set new.rate=if(new.rate is null,10,new.rate); + +insert into t1 (id) values (1); +insert into t1 values (2,3); +select * from t1; + +delimiter $$; +create or replace trigger test_trigger before insert on t1 for each row + if new.rate is null then set new.rate = 15; end if; +$$ +delimiter ;$$ + +insert into t1 (id) values (3); +insert into t1 values (4,5); +select * from t1; + +drop table t1; + +--echo # +--echo # MDEV-35911 Assertion `marked_for_write_or_computed()' failed in bool Field_new_decimal::store_value(const my_decimal*, int*) +--echo # +set sql_mode=''; +create table t1 (c fixed,c2 binary (1),c5 fixed not null); +create trigger tr1 before update on t1 for each row set @a=0; +insert into t1 (c) values (1); +drop table t1; +set sql_mode=default; + +--echo # End of 10.5 tests diff --git a/mysql-test/main/trigger_wl3253.result b/mysql-test/main/trigger_wl3253.result index aa4b7badb5c..b31f6c5622e 100644 --- a/mysql-test/main/trigger_wl3253.result +++ b/mysql-test/main/trigger_wl3253.result @@ -312,7 +312,7 @@ CREATE TRIGGER tr2_bi BEFORE INSERT ON t1 FOR EACH ROW SET @a:=2; CREATE TRIGGER tr1_bu BEFORE UPDATE ON t1 FOR EACH ROW SET @a:=3; /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; @@ -375,7 +375,7 @@ CREATE TRIGGER tr1_1_bi BEFORE INSERT ON t1 FOR EACH ROW FOLLOWS tr1_bi SET @a:= # Expected order of triggers in the dump is: tr0_bi, tr1_bi, tr1_1_bi, tr2_i. /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; diff --git a/mysql-test/main/type_set.result b/mysql-test/main/type_set.result index 45e80f2c7c2..f15ee8d168b 100644 --- a/mysql-test/main/type_set.result +++ b/mysql-test/main/type_set.result @@ -656,6 +656,19 @@ DROP TABLE t2; DROP TABLE t1; SET note_verbosity=DEFAULT; # +# MDEV-35864 UBSAN: "applying zero offset to null pointer" when using a Field_set with empty values +# +SET sql_mode=''; +CREATE OR REPLACE TABLE t (c SET('','','') KEY,c2 DECIMAL UNSIGNED ZEROFILL,c3 CHAR(1) BINARY) ENGINE=MyISAM; +Warnings: +Note 1291 Column 'c' has duplicated value '' in SET +Note 1291 Column 'c' has duplicated value '' in SET +INSERT INTO t VALUES ('',CURRENT_TIME,''); +UPDATE t SET c2=c2+5 WHERE c BETWEEN '' AND ''; +DROP TABLE t; +SET sql_mode=DEFAULT; +# End of 10.6 tests +# # MDEV-29062 Wrong result set metadata for a mix of INT+ENUM # CREATE TABLE t1 @@ -686,3 +699,4 @@ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is def COALESCE(c_int, c_set) 253 33 0 Y 0 39 192 COALESCE(c_int, c_set) DROP TABLE t1; +# End of 10.11 tests diff --git a/mysql-test/main/type_set.test b/mysql-test/main/type_set.test index 317d395b064..8d1cd611dd4 100644 --- a/mysql-test/main/type_set.test +++ b/mysql-test/main/type_set.test @@ -292,6 +292,19 @@ DELIMITER ;$$ DROP TABLE t1; SET note_verbosity=DEFAULT; +--echo # +--echo # MDEV-35864 UBSAN: "applying zero offset to null pointer" when using a Field_set with empty values +--echo # + +SET sql_mode=''; +CREATE OR REPLACE TABLE t (c SET('','','') KEY,c2 DECIMAL UNSIGNED ZEROFILL,c3 CHAR(1) BINARY) ENGINE=MyISAM; +INSERT INTO t VALUES ('',CURRENT_TIME,''); +UPDATE t SET c2=c2+5 WHERE c BETWEEN '' AND ''; +DROP TABLE t; +SET sql_mode=DEFAULT; + +--echo # End of 10.6 tests + --echo # --echo # MDEV-29062 Wrong result set metadata for a mix of INT+ENUM --echo # @@ -320,3 +333,5 @@ SELECT COALESCE(c_int, c_set) FROM t1; --enable_view_protocol DROP TABLE t1; + +--echo # End of 10.11 tests diff --git a/mysql-test/main/type_timestamp.result b/mysql-test/main/type_timestamp.result index ec146fcfb8b..a4481efc937 100644 --- a/mysql-test/main/type_timestamp.result +++ b/mysql-test/main/type_timestamp.result @@ -2331,12 +2331,17 @@ EXECUTE stmt; ERROR 22007: Truncated incorrect datetime value: '1' DEALLOCATE PREPARE stmt; DROP TABLE t1; -# # End of 11.3 tests # +# MDEV-35677 Assertion `thd->is_error()' failed in virtual bool Field::sp_prepare_and_store_item(THD*, Item**) # -# Start of 11.7 tests -# +CREATE FUNCTION f() RETURNS INT DETERMINISTIC RETURN (SELECT a FROM t); +CREATE TABLE t (c TIMESTAMP); +SELECT * FROM t WHERE c=f(); +ERROR 42S22: Unknown column 'a' in 'SELECT' +DROP TABLE t; +DROP FUNCTION f; +# End of 11.4 tests # # MDEV-35250 Assertion `dec <= 6' failed in my_timestamp_binary_length # @@ -2392,6 +2397,4 @@ a 2 DROP TABLE t1; SET time_zone=DEFAULT; -# # End of 11.7 tests -# diff --git a/mysql-test/main/type_timestamp.test b/mysql-test/main/type_timestamp.test index 6d625c22058..0a6ca692904 100644 --- a/mysql-test/main/type_timestamp.test +++ b/mysql-test/main/type_timestamp.test @@ -1364,15 +1364,24 @@ EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP TABLE t1; - ---echo # --echo # End of 11.3 tests ---echo # --echo # ---echo # Start of 11.7 tests +--echo # MDEV-35677 Assertion `thd->is_error()' failed in virtual bool Field::sp_prepare_and_store_item(THD*, Item**) --echo # +CREATE FUNCTION f() RETURNS INT DETERMINISTIC RETURN (SELECT a FROM t); +CREATE TABLE t (c TIMESTAMP); +# with view protocol it raises ER_VIEW_INVALID +--disable_view_protocol +--error ER_BAD_FIELD_ERROR +SELECT * FROM t WHERE c=f(); +--enable_view_protocol +DROP TABLE t; +DROP FUNCTION f; + +--echo # End of 11.4 tests + --echo # --echo # MDEV-35250 Assertion `dec <= 6' failed in my_timestamp_binary_length --echo # @@ -1408,6 +1417,4 @@ DROP TABLE t1; SET time_zone=DEFAULT; ---echo # --echo # End of 11.7 tests ---echo # diff --git a/mysql-test/main/vector2_notembedded.result b/mysql-test/main/vector2_notembedded.result index 3840ea94459..22c7483e597 100644 --- a/mysql-test/main/vector2_notembedded.result +++ b/mysql-test/main/vector2_notembedded.result @@ -19,7 +19,7 @@ id 4 /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `v` vector(5) NOT NULL, diff --git a/mysql-test/main/view.result b/mysql-test/main/view.result index b6b41b1da69..7bfee484c4a 100644 --- a/mysql-test/main/view.result +++ b/mysql-test/main/view.result @@ -7014,6 +7014,17 @@ View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select 1 AS `1` from `t1` union (select 1 AS `1` from DUAL where 1 group by 1 having 1 for update) latin1 latin1_swedish_ci DROP VIEW v1; DROP TABLE t1; +# +# MDEV-35090: (Item_func_current_user) Assertion +# `typeid(*copy) == typeid(*this)' failed in +# Item_func_or_sum::do_build_clone +# +CREATE VIEW v AS SELECT 1; +SELECT * FROM v WHERE UpdateXML('N/A','/a',CURRENT_USER()); +1 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'N/A' +DROP VIEW v; # End of 10.5 tests # # MDEV-13115: SELECT .. SKIP LOCKED - ensure SHOW CREATE VIEW is correct diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test index d2996ac9cca..0c6b25a1498 100644 --- a/mysql-test/main/view.test +++ b/mysql-test/main/view.test @@ -6779,6 +6779,19 @@ SHOW CREATE VIEW v1; DROP VIEW v1; DROP TABLE t1; +--echo # +--echo # MDEV-35090: (Item_func_current_user) Assertion +--echo # `typeid(*copy) == typeid(*this)' failed in +--echo # Item_func_or_sum::do_build_clone +--echo # + +CREATE VIEW v AS SELECT 1; + +SELECT * FROM v WHERE UpdateXML('N/A','/a',CURRENT_USER()); + +# Cleanup +DROP VIEW v; + --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/win.result b/mysql-test/main/win.result index 8a28a217756..62c4684d8db 100644 --- a/mysql-test/main/win.result +++ b/mysql-test/main/win.result @@ -4724,6 +4724,29 @@ w2_total w1_total u 200 200 2 DROP VIEW v1; DROP TABLE t1; +# +# MDEV-35869: degenerated subquery with window function +# +CREATE TABLE t1 (a int DEFAULT 10); +INSERT INTO t1 VALUES (7), (2), (3); +SELECT * FROM t1 WHERE (SELECT AVG(3)) > 2; +a +7 +2 +3 +SELECT * FROM t1 WHERE (SELECT AVG(3) OVER ()) > 2; +a +7 +2 +3 +INSERT INTO t1 VALUES((SELECT avg(4) OVER ())); +SELECT * FROM t1; +a +7 +2 +3 +4 +DROP TABLE t1; # End of 10.5 tests # # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER diff --git a/mysql-test/main/win.test b/mysql-test/main/win.test index 5ed62d7b635..ccffc045afc 100644 --- a/mysql-test/main/win.test +++ b/mysql-test/main/win.test @@ -3013,6 +3013,18 @@ eval $q3; DROP VIEW v1; DROP TABLE t1; +--echo # +--echo # MDEV-35869: degenerated subquery with window function +--echo # + +CREATE TABLE t1 (a int DEFAULT 10); +INSERT INTO t1 VALUES (7), (2), (3); +SELECT * FROM t1 WHERE (SELECT AVG(3)) > 2; +SELECT * FROM t1 WHERE (SELECT AVG(3) OVER ()) > 2; +INSERT INTO t1 VALUES((SELECT avg(4) OVER ())); +SELECT * FROM t1; +DROP TABLE t1; + --echo # End of 10.5 tests --echo # diff --git a/mysql-test/main/win_sum.result b/mysql-test/main/win_sum.result index a17c17845af..aa376ecf7ba 100644 --- a/mysql-test/main/win_sum.result +++ b/mysql-test/main/win_sum.result @@ -105,3 +105,12 @@ EXISTS (SELECT 1 ORDER BY 1+sum(2) OVER ()) # # End of 10.4 tests # +# +# MDEV-32411 Item_sum arguments incorrectly reset to temp table fields which causes crash +# +CREATE TABLE t1 (a INT NOT NULL) ; +INSERT INTO t1 VALUES (EXISTS(SELECT avg(3) OVER (ORDER BY COUNT(DISTINCT a, HEX(a))))); +DROP TABLE t1; +# +# End of 10.5 tests +# diff --git a/mysql-test/main/win_sum.test b/mysql-test/main/win_sum.test index 9800174f54c..d3924435949 100644 --- a/mysql-test/main/win_sum.test +++ b/mysql-test/main/win_sum.test @@ -57,3 +57,14 @@ SELECT EXISTS (SELECT 1 ORDER BY 1+sum(2) OVER ()); --echo # --echo # End of 10.4 tests --echo # + +--echo # +--echo # MDEV-32411 Item_sum arguments incorrectly reset to temp table fields which causes crash +--echo # +CREATE TABLE t1 (a INT NOT NULL) ; +INSERT INTO t1 VALUES (EXISTS(SELECT avg(3) OVER (ORDER BY COUNT(DISTINCT a, HEX(a))))); +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_warn_stop_datetime.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_warn_stop_datetime.result index 6ce0f2d63e5..88a3c6cc8ac 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_warn_stop_datetime.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_warn_stop_datetime.result @@ -1,23 +1,115 @@ - -# MDEV-27037 mysqlbinlog emits a warning when reaching EOF before stop-datetime - -set timestamp=1000000000; -CREATE TABLE t1(word VARCHAR(20)); -set timestamp=1000000010; -INSERT INTO t1 VALUES ("abirvalg"); -set timestamp=1000000020; -INSERT INTO t1 SELECT * FROM t1; -flush logs; -Case: Default, must not see warning. -# MYSQL_BINLOG --short-form MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file -Case: Stop datetime before EOF, must not see warning. -# MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:50' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file -Case: Stop datetime between records, must not see warning. -# MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:55' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file -Case: Stop datetime at EOF, must not see warning. -# MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:55' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file -Case: Stop datetime after EOF, must see warning. -# MYSQL_BINLOG --short-form --stop-datetime='2035-01-19 03:14:05' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file -WARNING: Did not reach stop datetime '2035-01-19 03:14:05' before end of input -DROP TABLE t1; +SET TIMESTAMP= UNIX_TIMESTAMP('2024-12-01 10:20:30.123456'); +# +# Clear the existing binary log state, and start fresh using +# the timestamp variable set above +# +RESET MASTER; +create table t1 (a int); +insert into t1 values (1); +SET TIMESTAMP= UNIX_TIMESTAMP('2024-12-02 10:20:30.123456'); +insert into t1 values (2); +SET TIMESTAMP= UNIX_TIMESTAMP('2024-12-03 10:20:30.123456'); +flush binary logs; +SET TIMESTAMP= UNIX_TIMESTAMP('2024-12-04 10:20:30.123456'); +insert into t1 values (3); +insert into t1 values (4); +SET TIMESTAMP= UNIX_TIMESTAMP('2024-12-05 10:20:30.123456'); +insert into t1 values (5); +insert into t1 values (6); +insert into t1 values (7); +SET TIMESTAMP=UNIX_TIMESTAMP('2024-12-06 10:20:30.123456'); +flush binary logs; +drop table t1; +# Ensuring binary log order is correct +# +# +# Test using --read-from-remote-server +# +connection default; +# +# --stop-datetime tests +# Note: MDEV-35528 reported that mysqlbinlog would fail on tests cases +# 2.a, 2.b, and 2.c. +# +# Case 1.a) With one binlog file, a --stop-datetime before the end of +# the file should not result in a warning +# MYSQL_BINLOG --read-from-remote-server --stop-datetime='2024-12-02 10:20:30.123456' binlog_f1_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +# +# Case 1.b) With one binlog file, a --stop-datetime at the end of the +# file should not result in a warning +# MYSQL_BINLOG --read-from-remote-server --stop-datetime='2024-12-03 10:20:30.123456' binlog_f1_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +# +# Case 1.c) With one binlog file, a --stop-datetime beyond the end of +# the file should(!) result in a warning +# MYSQL_BINLOG --read-from-remote-server --stop-datetime='2024-12-04 10:20:30.123456' binlog_f1_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +WARNING: Did not reach stop datetime '2024-12-04 10:20:30.123456' before end of input +# +# Case 2.a) With two binlog files, a --stop-datetime within the +# timespan of binlog 2 should: +# 1) not provide any warnings +# 2) not prevent binlog 1 or 2 from outputting the desired events +# MYSQL_BINLOG --read-from-remote-server --stop-datetime='2024-12-04 10:20:30.123456' binlog_f1_full binlog_f2_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +include/assert_grep.inc [Ensure all intended GTIDs are present] +include/assert_grep.inc [Ensure the next GTID binlogged is _not_ present] +# +# Case 2.b) With two binlog files, a --stop-datetime at the end of +# binlog 2 should: +# 1) not provide any warnings +# 2) not prevent binlog 1 or 2 from outputting all events +# MYSQL_BINLOG --read-from-remote-server --stop-datetime='2024-12-06 10:20:30.123456' binlog_f1_full binlog_f2_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +include/assert_grep.inc [Ensure a GTID exists for each transaction] +# +# Case 2.c) With two binlog files, a --stop-datetime beyond the end of +# binlog 2 should: +# 1) provide a warning that the stop datetime was not reached +# 2) not prevent binlog 1 or 2 from outputting all events +# MYSQL_BINLOG --read-from-remote-server --stop-datetime='2024-12-07 10:20:30.123456' binlog_f1_full binlog_f2_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +WARNING: Did not reach stop datetime '2024-12-07 10:20:30.123456' before end of input +include/assert_grep.inc [Ensure a GTID exists for each transaction] +# +# +# Test using local binlog files +# +connection default; +# +# --stop-datetime tests +# Note: MDEV-35528 reported that mysqlbinlog would fail on tests cases +# 2.a, 2.b, and 2.c. +# +# Case 1.a) With one binlog file, a --stop-datetime before the end of +# the file should not result in a warning +# MYSQL_BINLOG --stop-datetime='2024-12-02 10:20:30.123456' binlog_f1_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +# +# Case 1.b) With one binlog file, a --stop-datetime at the end of the +# file should not result in a warning +# MYSQL_BINLOG --stop-datetime='2024-12-03 10:20:30.123456' binlog_f1_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +# +# Case 1.c) With one binlog file, a --stop-datetime beyond the end of +# the file should(!) result in a warning +# MYSQL_BINLOG --stop-datetime='2024-12-04 10:20:30.123456' binlog_f1_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +WARNING: Did not reach stop datetime '2024-12-04 10:20:30.123456' before end of input +# +# Case 2.a) With two binlog files, a --stop-datetime within the +# timespan of binlog 2 should: +# 1) not provide any warnings +# 2) not prevent binlog 1 or 2 from outputting the desired events +# MYSQL_BINLOG --stop-datetime='2024-12-04 10:20:30.123456' binlog_f1_full binlog_f2_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +include/assert_grep.inc [Ensure all intended GTIDs are present] +include/assert_grep.inc [Ensure the next GTID binlogged is _not_ present] +# +# Case 2.b) With two binlog files, a --stop-datetime at the end of +# binlog 2 should: +# 1) not provide any warnings +# 2) not prevent binlog 1 or 2 from outputting all events +# MYSQL_BINLOG --stop-datetime='2024-12-06 10:20:30.123456' binlog_f1_full binlog_f2_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +include/assert_grep.inc [Ensure a GTID exists for each transaction] +# +# Case 2.c) With two binlog files, a --stop-datetime beyond the end of +# binlog 2 should: +# 1) provide a warning that the stop datetime was not reached +# 2) not prevent binlog 1 or 2 from outputting all events +# MYSQL_BINLOG --stop-datetime='2024-12-07 10:20:30.123456' binlog_f1_full binlog_f2_full --result-file=tmp/warn_datetime_test_file.out 2>&1 +WARNING: Did not reach stop datetime '2024-12-07 10:20:30.123456' before end of input +include/assert_grep.inc [Ensure a GTID exists for each transaction] +# # End of binlog_mysqlbinlog_warn_stop_datetime.test diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_warn_stop_position.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_warn_stop_position.result new file mode 100644 index 00000000000..1517fd765ac --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_warn_stop_position.result @@ -0,0 +1,65 @@ +# +# Clear the existing binary log state. +# +RESET MASTER; +create table t1 (a int); +insert into t1 values (1); +insert into t1 values (2); +flush binary logs; +insert into t1 values (3); +# Tag binlog_f2_mid +insert into t1 values (4); +insert into t1 values (5); +insert into t1 values (6); +insert into t1 values (7); +flush binary logs; +drop table t1; +# Ensuring binary log order is correct +# Ensuring file offset of binlog_f2_mid < binlog_f1_end +# +# +# Test using local binlog files +# +connection default; +# +# --stop-position tests +# +# Case 1.a) With one binlog file, a --stop-position before the end of +# the file should not result in a warning +# MYSQL_BINLOG --stop-position=binlog_f1_pre_rotate binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1 +# +# Case 1.b) With one binlog file, a --stop-position at the exact end of +# the file should not result in a warning +# MYSQL_BINLOG --stop-position=binlog_f1_end binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1 +# +# Case 1.c) With one binlog file, a --stop-position past the end of the +# file should(!) result in a warning +# MYSQL_BINLOG --short-form --stop-position=binlog_f1_over_eof binlog_f1_full --result-file=tmp/warn_position_test_file.out 2>&1 +WARNING: Did not reach stop position before end of input +# +# Case 2.a) With two binlog files, a --stop-position targeting b2 which +# exists in the size of b1 should: +# 1) not provide any warnings +# 2) not prevent b2 from outputting its desired events before the +# stop position +# MYSQL_BINLOG --stop-position=binlog_f2_mid binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1 +include/assert_grep.inc [Ensure all intended GTIDs are present] +include/assert_grep.inc [Ensure the next GTID binlogged is _not_ present] +# +# Case 2.b) With two binlog files, a --stop-position targeting the end +# of binlog 2 should: +# 1) not provide any warnings +# 2) not prevent b2 from outputting its entire binary log +# MYSQL_BINLOG --stop-position=binlog_f2_end binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1 +include/assert_grep.inc [Ensure a GTID exists for each transaction] +include/assert_grep.inc [Ensure the last GTID binlogged is present] +# +# Case 2.c) With two binlog files, a --stop-position targeting beyond +# the eof of binlog 2 should: +# 1) provide a warning that the stop position was not reached +# 2) not prevent b2 from outputting its entire binary log +# MYSQL_BINLOG --stop-position=binlog_f2_over_eof binlog_f1_full binlog_f2_full --result-file=tmp/warn_position_test_file.out 2>&1 +WARNING: Did not reach stop position before end of input +include/assert_grep.inc [Ensure a GTID exists for each transaction] +# +# End of binlog_mysqlbinlog_warn_stop_position.test diff --git a/mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result b/mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result index 798bd8ab853..39c0bd52fac 100644 --- a/mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result +++ b/mysql-test/suite/binlog/r/binlog_spurious_ddl_errors.result @@ -38,7 +38,7 @@ CREATE TABLE t_stmt (a VARCHAR(100)) ENGINE = EXAMPLE; ALTER TABLE t_stmt ADD COLUMN b INT; CREATE TRIGGER trig_stmt BEFORE INSERT ON t_stmt FOR EACH ROW INSERT INTO t_stmt VALUES (1); CREATE INDEX i ON t_stmt(a); -ERROR 42000: Too many key parts specified; max 0 parts allowed +ERROR 42000: Specified key was too long; max key length is 0 bytes CREATE TABLE t_stmt_new ENGINE = EXAMPLE SELECT * FROM t_stmt; ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-based logging DROP TABLE t_stmt; diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_datetime.inc b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_datetime.inc new file mode 100644 index 00000000000..839e506551c --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_datetime.inc @@ -0,0 +1,106 @@ +# +# Helper file that ensures mysqlbinlog --stop-datetime behavior for local +# files or a remote server +# +# Parameters: +# read_from_remote_server (bool): A boolean that changes which source to use +# for mysqlbinlog. When true, reads remotely; when false, uses local files. +# + +--connection default +--let $MYSQLD_DATADIR= `select @@datadir` + +# PARAM_READ_FROM_REMOTE is used as a parameter to mysqlbinlog (_OUT suffix is +# output in echo commands). If using local files, they are blank; if reading +# from remote server, it is overridden to the correct values. +--let $PARAM_READ_FROM_REMOTE= +# Used in echo statements to remove potentially changing values +--let $PARAM_READ_FROM_REMOTE_OUT= + +if ($read_from_remote_server) +{ + --let $PARAM_READ_FROM_REMOTE= --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT + --let $PARAM_READ_FROM_REMOTE_OUT= --read-from-remote-server + # binlog files in --read-from-remote-server don't use file system path + --let $binlog_f1_full= $binlog_f1 + --let $binlog_f2_full= $binlog_f2 +} +if (!$read_from_remote_server) +{ + # If using local files, file system path to the binlog files is needed + --let $binlog_f1_full= $MYSQLD_DATADIR/$binlog_f1 + --let $binlog_f2_full= $MYSQLD_DATADIR/$binlog_f2 +} + +--echo # +--echo # --stop-datetime tests +--echo # Note: MDEV-35528 reported that mysqlbinlog would fail on tests cases +--echo # 2.a, 2.b, and 2.c. +--echo # + +--echo # Case 1.a) With one binlog file, a --stop-datetime before the end of +--echo # the file should not result in a warning +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-datetime='$b1_timestamp2' binlog_f1_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-datetime='$b1_timestamp2' $binlog_f1_full --result-file=$binlog_out 2>&1 + +--echo # +--echo # Case 1.b) With one binlog file, a --stop-datetime at the end of the +--echo # file should not result in a warning +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-datetime='$b1_timestamp3' binlog_f1_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-datetime='$b1_timestamp3' $binlog_f1_full --result-file=$binlog_out 2>&1 + +--echo # +--echo # Case 1.c) With one binlog file, a --stop-datetime beyond the end of +--echo # the file should(!) result in a warning +--let $future_timestamp= 2035-12-06 10:20:30.123456 +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-datetime='$b2_timestamp1' binlog_f1_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-datetime='$b2_timestamp1' $binlog_f1_full --result-file=$binlog_out 2>&1 + +--echo # +--echo # Case 2.a) With two binlog files, a --stop-datetime within the +--echo # timespan of binlog 2 should: +--echo # 1) not provide any warnings +--echo # 2) not prevent binlog 1 or 2 from outputting the desired events + +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-datetime='$b2_timestamp1' binlog_f1_full binlog_f2_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-datetime='$b2_timestamp1' $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1 + +--let $server_id= `SELECT @@GLOBAL.server_id` +--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id` +--let $assert_file= $binlog_out +--let $assert_text= Ensure all intended GTIDs are present +--let $assert_select= GTID $domain_id-$server_id- +--let $assert_count= 3 +--source include/assert_grep.inc + +--let $assert_text= Ensure the next GTID binlogged is _not_ present +--let $assert_select= GTID $binlog_f2_gtid_after_midpoint +--let $assert_count= 0 +--source include/assert_grep.inc + +--echo # +--echo # Case 2.b) With two binlog files, a --stop-datetime at the end of +--echo # binlog 2 should: +--echo # 1) not provide any warnings +--echo # 2) not prevent binlog 1 or 2 from outputting all events +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-datetime='$b2_timestamp3' binlog_f1_full binlog_f2_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-datetime='$b2_timestamp3' $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1 + +--let $assert_text= Ensure a GTID exists for each transaction +--let $assert_select= GTID $domain_id-$server_id- +--let $assert_count= 8 +--source include/assert_grep.inc + +--echo # +--echo # Case 2.c) With two binlog files, a --stop-datetime beyond the end of +--echo # binlog 2 should: +--echo # 1) provide a warning that the stop datetime was not reached +--echo # 2) not prevent binlog 1 or 2 from outputting all events +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-datetime='$b2_timestamp_not_reached' binlog_f1_full binlog_f2_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-datetime='$b2_timestamp_not_reached' $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1 + +--let $assert_text= Ensure a GTID exists for each transaction +--let $assert_select= GTID $domain_id-$server_id- +--let $assert_count= 8 +--source include/assert_grep.inc + diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_datetime.test b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_datetime.test index 9d30544c5f4..f862f0e7887 100644 --- a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_datetime.test +++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_datetime.test @@ -1,42 +1,86 @@ ---echo ---echo # MDEV-27037 mysqlbinlog emits a warning when reaching EOF before stop-datetime ---echo +# +# Test ensures that --stop-datetime work correctly for mysqlbinlog. This high +# level test sets up the binary log (and tags certain locations for comparison), +# and the helper file binlog_mysqlbinlog_warn_stop_datetime.inc performs the +# actual tests. +# +# References: +# MDEV-27037: mysqlbinlog emits a warning when reaching EOF before +# stop-condition +# MDEV-35528: mariadb-binlog cannot process more than 1 logfiles when +# --stop-datetime is specified +# +--source include/have_log_bin.inc ---source include/have_binlog_format_statement.inc +--let $binlog_out_relpath= tmp/warn_datetime_test_file.out +--let $binlog_out= $MYSQLTEST_VARDIR/$binlog_out_relpath ---let ignored_output_file= $MYSQLTEST_VARDIR/tmp/warn_pos_test_file.out +--let $b1_timestamp1= 2024-12-01 10:20:30.123456 +--let $b1_timestamp2= 2024-12-02 10:20:30.123456 +--let $b1_timestamp3= 2024-12-03 10:20:30.123456 +--let $b2_timestamp1= 2024-12-04 10:20:30.123456 +--let $b2_timestamp2= 2024-12-05 10:20:30.123456 +--let $b2_timestamp3= 2024-12-06 10:20:30.123456 +--let $b2_timestamp_not_reached= 2024-12-07 10:20:30.123456 -set timestamp=1000000000; -CREATE TABLE t1(word VARCHAR(20)); -set timestamp=1000000010; -INSERT INTO t1 VALUES ("abirvalg"); -set timestamp=1000000020; -INSERT INTO t1 SELECT * FROM t1; ---let MYSQLD_DATADIR= `select @@datadir;` -flush logs; +--eval SET TIMESTAMP= UNIX_TIMESTAMP('$b1_timestamp1') ---echo Case: Default, must not see warning. ---echo # MYSQL_BINLOG --short-form MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file ---exec $MYSQL_BINLOG --short-form $MYSQLD_DATADIR/master-bin.000001 --result-file=$ignored_output_file 2>&1 +--echo # +--echo # Clear the existing binary log state, and start fresh using +--echo # the timestamp variable set above +--echo # +RESET MASTER; ---echo Case: Stop datetime before EOF, must not see warning. ---echo # MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:50' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file ---exec $MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:50' $MYSQLD_DATADIR/master-bin.000001 --result-file=$ignored_output_file 2>&1 +--let $binlog_f1= query_get_value(SHOW MASTER STATUS, File, 1) +create table t1 (a int); +insert into t1 values (1); +--eval SET TIMESTAMP= UNIX_TIMESTAMP('$b1_timestamp2') +insert into t1 values (2); +--eval SET TIMESTAMP= UNIX_TIMESTAMP('$b1_timestamp3') +flush binary logs; +--let $binlog_f2= query_get_value(SHOW MASTER STATUS, File, 1) +--eval SET TIMESTAMP= UNIX_TIMESTAMP('$b2_timestamp1') +insert into t1 values (3); +insert into t1 values (4); +--eval SET TIMESTAMP= UNIX_TIMESTAMP('$b2_timestamp2') +--let $binlog_f2_gtid_after_midpoint= `SELECT @@GLOBAL.gtid_binlog_pos` +insert into t1 values (5); +insert into t1 values (6); +insert into t1 values (7); +--let $binlog_f2_last_gtid= `SELECT @@GLOBAL.gtid_binlog_pos` +--eval SET TIMESTAMP=UNIX_TIMESTAMP('$b2_timestamp3') +flush binary logs; +drop table t1; ---echo Case: Stop datetime between records, must not see warning. ---echo # MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:55' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file ---exec $MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:55' $MYSQLD_DATADIR/master-bin.000001 --result-file=$ignored_output_file 2>&1 +--echo # Ensuring binary log order is correct +--let $binlog_f1_show= query_get_value(SHOW BINARY LOGS, Log_name, 1) +if (`SELECT strcmp('$binlog_f1','$binlog_f1_show') != 0`) +{ + --echo # Real binlog_f1: $binlog_f1 + --echo # First binlog in SHOW BINLOG FILES: $binlog_f1_show + --die Wrong order of binary log files in SHOW BINARY LOGS +} +--let $binlog_f2_show= query_get_value(SHOW BINARY LOGS, Log_name, 2) +if (`SELECT strcmp('$binlog_f2','$binlog_f2_show') != 0`) +{ + --echo # Real binlog_f2: $binlog_f2 + --echo # First binlog in SHOW BINLOG FILES: $binlog_f2_show + --die Wrong order of binary log files in SHOW BINARY LOGS +} ---echo Case: Stop datetime at EOF, must not see warning. ---echo # MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:55' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file ---exec $MYSQL_BINLOG --short-form --stop-datetime='2001-09-08 21:46:55' $MYSQLD_DATADIR/master-bin.000001 --result-file=$ignored_output_file 2>&1 +--echo # +--echo # +--echo # Test using --read-from-remote-server +--echo # +--let $read_from_remote_server= 1 +--source binlog_mysqlbinlog_warn_stop_datetime.inc ---echo Case: Stop datetime after EOF, must see warning. ---echo # MYSQL_BINLOG --short-form --stop-datetime='2035-01-19 03:14:05' MYSQLD_DATADIR/master-bin.000001 --result-file=ignored_output_file ---exec $MYSQL_BINLOG --short-form --stop-datetime='2035-01-19 03:14:05' $MYSQLD_DATADIR/master-bin.000001 --result-file=$ignored_output_file 2>&1 - -DROP TABLE t1; - ---remove_file $ignored_output_file +--echo # +--echo # +--echo # Test using local binlog files +--echo # +--let $read_from_remote_server= 0 +--source binlog_mysqlbinlog_warn_stop_datetime.inc +--echo # --echo # End of binlog_mysqlbinlog_warn_stop_datetime.test diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.inc b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.inc new file mode 100644 index 00000000000..2c3c565d692 --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.inc @@ -0,0 +1,115 @@ +# +# Helper file that ensures mysqlbinlog --stop-position behavior for local +# files or a remote server +# +# Parameters: +# read_from_remote_server (bool): A boolean that changes which source to use +# for mysqlbinlog. When true, reads remotely; when false, uses local files. +# + +--connection default +--let $MYSQLD_DATADIR= `select @@datadir` + +# PARAM_READ_FROM_REMOTE is used as a parameter to mysqlbinlog (_OUT suffix is +# output in echo commands). If using local files, they are blank; if reading +# from remote server, it is overridden to the correct values. +--let $PARAM_READ_FROM_REMOTE= +# Used in echo statements to remove potentially changing values +--let $PARAM_READ_FROM_REMOTE_OUT= + +if ($read_from_remote_server) +{ + --let $PARAM_READ_FROM_REMOTE= --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT + --let $PARAM_READ_FROM_REMOTE_OUT= --read-from-remote-server + # binlog files in --read-from-remote-server don't use file system path + --let $binlog_f1_full= $binlog_f1 + --let $binlog_f2_full= $binlog_f2 +} +if (!$read_from_remote_server) +{ + # If using local files, file system path to the binlog files is needed + --let $binlog_f1_full= $MYSQLD_DATADIR/$binlog_f1 + --let $binlog_f2_full= $MYSQLD_DATADIR/$binlog_f2 +} + +--echo # +--echo # --stop-position tests +--echo # + +--echo # Case 1.a) With one binlog file, a --stop-position before the end of +--echo # the file should not result in a warning +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-position=binlog_f1_pre_rotate binlog_f1_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f1_pre_rotate $binlog_f1_full --result-file=$binlog_out 2>&1 + +--echo # +--echo # Case 1.b) With one binlog file, a --stop-position at the exact end of +--echo # the file should not result in a warning +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-position=binlog_f1_end binlog_f1_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f1_end $binlog_f1_full --result-file=$binlog_out 2>&1 + +--echo # +--echo # Case 1.c) With one binlog file, a --stop-position past the end of the +--echo # file should(!) result in a warning +--let $binlog_f1_over_eof= `SELECT $binlog_f1_end + 1` +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --short-form --stop-position=binlog_f1_over_eof binlog_f1_full --result-file=$binlog_out_relpath 2>&1 +--replace_result $binlog_f1_over_eof +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --short-form --stop-position=$binlog_f1_over_eof $binlog_f1_full --result-file=$binlog_out 2>&1 + +--echo # +--echo # Case 2.a) With two binlog files, a --stop-position targeting b2 which +--echo # exists in the size of b1 should: +--echo # 1) not provide any warnings +--echo # 2) not prevent b2 from outputting its desired events before the +--echo # stop position +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-position=binlog_f2_mid binlog_f1_full binlog_f2_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f2_mid $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1 + +--let $server_id= `SELECT @@GLOBAL.server_id` +--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id` +--let $assert_file= $binlog_out +--let $assert_text= Ensure all intended GTIDs are present +--let $assert_select= GTID $domain_id-$server_id- +--let $assert_count= 4 +--source include/assert_grep.inc + +--let $assert_text= Ensure the next GTID binlogged is _not_ present +--let $assert_select= GTID $binlog_f2_gtid_after_midpoint +--let $assert_count= 0 +--source include/assert_grep.inc + +--echo # +--echo # Case 2.b) With two binlog files, a --stop-position targeting the end +--echo # of binlog 2 should: +--echo # 1) not provide any warnings +--echo # 2) not prevent b2 from outputting its entire binary log +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-position=binlog_f2_end binlog_f1_full binlog_f2_full --result-file=$binlog_out_relpath 2>&1 +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f2_end $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1 + +--let $server_id= `SELECT @@GLOBAL.server_id` +--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id` +--let $assert_text= Ensure a GTID exists for each transaction +--let $assert_select= GTID $domain_id-$server_id- +--let $assert_count= 8 +--source include/assert_grep.inc + +--let $assert_text= Ensure the last GTID binlogged is present +--let $assert_select= GTID $binlog_f2_last_gtid +--let $assert_count= 1 +--source include/assert_grep.inc + +--echo # +--echo # Case 2.c) With two binlog files, a --stop-position targeting beyond +--echo # the eof of binlog 2 should: +--echo # 1) provide a warning that the stop position was not reached +--echo # 2) not prevent b2 from outputting its entire binary log +--let $binlog_f2_over_eof= `SELECT $binlog_f2_end + 1` +--echo # MYSQL_BINLOG $PARAM_READ_FROM_REMOTE_OUT --stop-position=binlog_f2_over_eof binlog_f1_full binlog_f2_full --result-file=$binlog_out_relpath 2>&1 +--replace_result $binlog_f2_over_eof +--exec $MYSQL_BINLOG $PARAM_READ_FROM_REMOTE --stop-position=$binlog_f2_over_eof $binlog_f1_full $binlog_f2_full --result-file=$binlog_out 2>&1 + +--let $server_id= `SELECT @@GLOBAL.server_id` +--let $domain_id= `SELECT @@GLOBAL.gtid_domain_id` +--let $assert_text= Ensure a GTID exists for each transaction +--let $assert_select= GTID $domain_id-$server_id- +--let $assert_count= 8 +--source include/assert_grep.inc diff --git a/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.test b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.test new file mode 100644 index 00000000000..a9179297220 --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_mysqlbinlog_warn_stop_position.test @@ -0,0 +1,83 @@ +# +# Test ensures that --stop-position work correctly for mysqlbinlog. This high +# level test sets up the binary log (and tags certain locations for comparison), +# and the helper file binlog_mysqlbinlog_warn_stop_position.inc performs the +# actual tests. +# +# References: +# MDEV-27037: mysqlbinlog emits a warning when reaching EOF before +# stop-condition +# +--source include/have_log_bin.inc + +--let $binlog_out_relpath= tmp/warn_position_test_file.out +--let $binlog_out= $MYSQLTEST_VARDIR/$binlog_out_relpath + +--echo # +--echo # Clear the existing binary log state. +--echo # +RESET MASTER; + +--let $binlog_f1= query_get_value(SHOW MASTER STATUS, File, 1) +create table t1 (a int); +insert into t1 values (1); +insert into t1 values (2); +--let $binlog_f1_pre_rotate= query_get_value(SHOW MASTER STATUS, Position, 1) +flush binary logs; +--let $binlog_f2= query_get_value(SHOW MASTER STATUS, File, 1) +insert into t1 values (3); +--echo # Tag binlog_f2_mid +--let $binlog_f2_mid= query_get_value(SHOW MASTER STATUS, Position, 1) +insert into t1 values (4); +--let $binlog_f2_gtid_after_midpoint= `SELECT @@GLOBAL.gtid_binlog_pos` +insert into t1 values (5); +insert into t1 values (6); +insert into t1 values (7); +--let $binlog_f2_last_gtid= `SELECT @@GLOBAL.gtid_binlog_pos` +--let $binlog_f2_pre_rot= query_get_value(SHOW MASTER STATUS, Position, 1) +flush binary logs; +drop table t1; + +--echo # Ensuring binary log order is correct +--let $binlog_f1_show= query_get_value(SHOW BINARY LOGS, Log_name, 1) +--let $binlog_f1_end= query_get_value(SHOW BINARY LOGS, File_size, 1) +if (`SELECT strcmp('$binlog_f1','$binlog_f1_show') != 0`) +{ + --echo # Real binlog_f1: $binlog_f1 + --echo # First binlog in SHOW BINLOG FILES: $binlog_f1_show + --die Wrong order of binary log files in SHOW BINARY LOGS +} +--let $binlog_f2_show= query_get_value(SHOW BINARY LOGS, Log_name, 2) +--let $binlog_f2_end= query_get_value(SHOW BINARY LOGS, File_size, 2) +if (`SELECT strcmp('$binlog_f2','$binlog_f2_show') != 0`) +{ + --echo # Real binlog_f2: $binlog_f2 + --echo # First binlog in SHOW BINLOG FILES: $binlog_f2_show + --die Wrong order of binary log files in SHOW BINARY LOGS +} + +--echo # Ensuring file offset of binlog_f2_mid < binlog_f1_end +if ($binlog_f2_mid > $binlog_f1_end) +{ + --echo # Binlog 1 end: $binlog_f1:$binlog_f1_end + --echo # Binlog 2 stop point: $binlog_f2:$binlog_f2_mid + --die Mid point chosen to end in binlog 2 does not exist in earlier binlog +} + +#--echo # +#--echo # +#--echo # Test using --read-from-remote-server +#--echo # +#--let $read_from_remote_server= 1 +#--emit warning is not supported by --read-from-remote-server now +#--source binlog_mysqlbinlog_warn_stop_position.inc + +--echo # +--echo # +--echo # Test using local binlog files +--echo # +--let $read_from_remote_server= 0 +--source binlog_mysqlbinlog_warn_stop_position.inc + +--echo # +--echo # End of binlog_mysqlbinlog_warn_stop_position.test diff --git a/mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test b/mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test index 29a860764a9..5a015c2b8eb 100644 --- a/mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test +++ b/mysql-test/suite/binlog/t/binlog_spurious_ddl_errors.test @@ -75,7 +75,7 @@ ALTER TABLE t_stmt ADD COLUMN b INT; CREATE TRIGGER trig_stmt BEFORE INSERT ON t_stmt FOR EACH ROW INSERT INTO t_stmt VALUES (1); ---error ER_TOO_MANY_KEY_PARTS +--error ER_TOO_LONG_KEY CREATE INDEX i ON t_stmt(a); --error ER_BINLOG_ROW_MODE_AND_STMT_ENGINE diff --git a/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result b/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result index f52efb83fac..a1ab89ebd9e 100644 --- a/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result +++ b/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result @@ -26,7 +26,7 @@ LTRIM(now()) AS a0, LPAD(now(),10) AS b0; /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a0` varchar(64) NOT NULL DEFAULT ltrim(current_timestamp()), `a1` varchar(64) GENERATED ALWAYS AS (ltrim(`a0`)) STORED, @@ -35,7 +35,7 @@ CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a0` varchar(64) NOT NULL DEFAULT ltrim_oracle(current_timestamp()), `a1` varchar(64) GENERATED ALWAYS AS (ltrim_oracle(`a0`)) STORED, @@ -44,13 +44,13 @@ CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `a0`, 1 AS `b0` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `a0`, 1 AS `b0` */; diff --git a/mysql-test/suite/compat/oracle/r/update.result b/mysql-test/suite/compat/oracle/r/update.result new file mode 100644 index 00000000000..d7585e8e61d --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/update.result @@ -0,0 +1,16 @@ +SET @save_sql_mode=@@global.sql_mode; +SET sql_mode=ORACLE; +SET GLOBAL sql_mode='ORACLE'; +# MDEV-27769 Assertion failed in Field::ptr_in_record upon UPDATE +CREATE TABLE t (s geometry, t text) engine innodb; +Warnings: +Warning 1286 Unknown storage engine 'innodb' +Warning 1266 Using storage engine MyISAM for table 't' +INSERT IGNORE INTO t () VALUES (); +UPDATE IGNORE t SET t= '', s = 0; +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field +UPDATE IGNORE t SET t= '', s = 0; +ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field +ALTER TABLE t force; +DROP TABLE t; +SET GLOBAL sql_mode=@save_sql_mode; diff --git a/mysql-test/suite/compat/oracle/t/update.test b/mysql-test/suite/compat/oracle/t/update.test new file mode 100644 index 00000000000..389a27f3dbd --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/update.test @@ -0,0 +1,19 @@ +SET @save_sql_mode=@@global.sql_mode; +SET sql_mode=ORACLE; +SET GLOBAL sql_mode='ORACLE'; + + +--echo # MDEV-27769 Assertion failed in Field::ptr_in_record upon UPDATE +CREATE TABLE t (s geometry, t text) engine innodb; +INSERT IGNORE INTO t () VALUES (); +--error ER_CANT_CREATE_GEOMETRY_OBJECT +UPDATE IGNORE t SET t= '', s = 0; +--error ER_CANT_CREATE_GEOMETRY_OBJECT +UPDATE IGNORE t SET t= '', s = 0; + +ALTER TABLE t force; + +DROP TABLE t; + +# Test cleanup +SET GLOBAL sql_mode=@save_sql_mode; diff --git a/mysql-test/suite/encryption/r/recovery_memory.result b/mysql-test/suite/encryption/r/recovery_memory.result new file mode 100644 index 00000000000..1b02fb6d31d --- /dev/null +++ b/mysql-test/suite/encryption/r/recovery_memory.result @@ -0,0 +1,15 @@ +CREATE TABLE t1(f1 text, index idx(f1(20))) ENGINE INNODB; +set global innodb_fast_shutdown=0; +# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0 +set global debug_dbug="+d,ib_log_checkpoint_avoid_hard"; +INSERT INTO t1 SELECT repeat('a', 8000) FROM seq_1_to_1280; +DELETE FROM t1; +SET GLOBAL innodb_max_purge_lag_wait=0; +INSERT INTO t1 VALUES('a'); +# XTRABACKUP PREPARE +# restart +SELECT COUNT(*) FROM t1; +COUNT(*) +1 +ALTER TABLE t1 FORCE; +DROP TABLE t1; diff --git a/mysql-test/suite/encryption/r/tempfiles_encrypted.result b/mysql-test/suite/encryption/r/tempfiles_encrypted.result index a37d47fb479..dfc27c6cf80 100644 --- a/mysql-test/suite/encryption/r/tempfiles_encrypted.result +++ b/mysql-test/suite/encryption/r/tempfiles_encrypted.result @@ -4730,6 +4730,29 @@ w2_total w1_total u 200 200 2 DROP VIEW v1; DROP TABLE t1; +# +# MDEV-35869: degenerated subquery with window function +# +CREATE TABLE t1 (a int DEFAULT 10); +INSERT INTO t1 VALUES (7), (2), (3); +SELECT * FROM t1 WHERE (SELECT AVG(3)) > 2; +a +7 +2 +3 +SELECT * FROM t1 WHERE (SELECT AVG(3) OVER ()) > 2; +a +7 +2 +3 +INSERT INTO t1 VALUES((SELECT avg(4) OVER ())); +SELECT * FROM t1; +a +7 +2 +3 +4 +DROP TABLE t1; # End of 10.5 tests # # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER diff --git a/mysql-test/suite/encryption/t/doublewrite_debug.test b/mysql-test/suite/encryption/t/doublewrite_debug.test index 4dc6032c902..761f9cd3e47 100644 --- a/mysql-test/suite/encryption/t/doublewrite_debug.test +++ b/mysql-test/suite/encryption/t/doublewrite_debug.test @@ -1,7 +1,7 @@ --source include/have_innodb.inc --source include/have_debug.inc --source include/not_embedded.inc ---source include/have_example_key_management_plugin.inc +--source include/have_file_key_management_plugin.inc call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t[12]\\.ibd looks corrupted"); call mtr.add_suppression("InnoDB: Unable to apply log to corrupted page "); call mtr.add_suppression("InnoDB: Plugin initialization aborted"); diff --git a/mysql-test/suite/encryption/t/recovery_memory.opt b/mysql-test/suite/encryption/t/recovery_memory.opt new file mode 100644 index 00000000000..125f90920df --- /dev/null +++ b/mysql-test/suite/encryption/t/recovery_memory.opt @@ -0,0 +1,8 @@ +--innodb_doublewrite=0 +--innodb_log_file_size=24m +--innodb_immediate_scrub_data_uncompressed=1 +--plugin-load-add=$FILE_KEY_MANAGEMENT_SO +--loose-file-key-management +--loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/logkey.txt +--file-key-management-encryption-algorithm=aes_cbc +--innodb-encrypt-log=1 diff --git a/mysql-test/suite/encryption/t/recovery_memory.test b/mysql-test/suite/encryption/t/recovery_memory.test new file mode 100644 index 00000000000..6187a29dba9 --- /dev/null +++ b/mysql-test/suite/encryption/t/recovery_memory.test @@ -0,0 +1,45 @@ +--source include/have_debug.inc +--source include/have_innodb.inc +--source include/have_sequence.inc +--source filekeys_plugin.inc + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; +let MYSQLD_DATADIR=`select @@datadir`; + +CREATE TABLE t1(f1 text, index idx(f1(20))) ENGINE INNODB; + +# No checkpoint happens during this restart + +let $shutdown_timeout=; +set global innodb_fast_shutdown=0; +let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0; +--source include/restart_mysqld.inc +set global debug_dbug="+d,ib_log_checkpoint_avoid_hard"; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log + +INSERT INTO t1 SELECT repeat('a', 8000) FROM seq_1_to_1280; +DELETE FROM t1; +SET GLOBAL innodb_max_purge_lag_wait=0; +INSERT INTO t1 VALUES('a'); + +--echo # XTRABACKUP PREPARE +exec $XTRABACKUP --prepare --target-dir=$basedir; + +let $shutdown_timeout=0; +--source include/shutdown_mysqld.inc + +# Since there is no checkpoint during previous run, we can +# Copy the datafile from t1.ibd and start the server + +remove_file $MYSQLD_DATADIR/test/t1.ibd; +copy_file $basedir/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd; +--enable_result_log +let $restart_parameters=; +--source include/start_mysqld.inc + +SELECT COUNT(*) FROM t1; +ALTER TABLE t1 FORCE; +DROP TABLE t1; diff --git a/mysql-test/suite/engines/funcs/r/db_alter_collate_ascii.result b/mysql-test/suite/engines/funcs/r/db_alter_collate_ascii.result index bec3fac29df..ee868a70a1c 100644 --- a/mysql-test/suite/engines/funcs/r/db_alter_collate_ascii.result +++ b/mysql-test/suite/engines/funcs/r/db_alter_collate_ascii.result @@ -218,6 +218,50 @@ utf8mb4_german2_ci utf8mb4 244 # # utf8mb4_croatian_mysql561_ci utf8mb4 245 # # utf8mb4_unicode_520_ci utf8mb4 246 # # utf8mb4_vietnamese_ci utf8mb4 247 # # +utf8mb4_0900_ai_ci utf8mb4 255 # # +utf8mb4_de_pb_0900_ai_ci utf8mb4 256 # # +utf8mb4_is_0900_ai_ci utf8mb4 257 # # +utf8mb4_lv_0900_ai_ci utf8mb4 258 # # +utf8mb4_ro_0900_ai_ci utf8mb4 259 # # +utf8mb4_sl_0900_ai_ci utf8mb4 260 # # +utf8mb4_pl_0900_ai_ci utf8mb4 261 # # +utf8mb4_et_0900_ai_ci utf8mb4 262 # # +utf8mb4_es_0900_ai_ci utf8mb4 263 # # +utf8mb4_sv_0900_ai_ci utf8mb4 264 # # +utf8mb4_tr_0900_ai_ci utf8mb4 265 # # +utf8mb4_cs_0900_ai_ci utf8mb4 266 # # +utf8mb4_da_0900_ai_ci utf8mb4 267 # # +utf8mb4_lt_0900_ai_ci utf8mb4 268 # # +utf8mb4_sk_0900_ai_ci utf8mb4 269 # # +utf8mb4_es_trad_0900_ai_ci utf8mb4 270 # # +utf8mb4_la_0900_ai_ci utf8mb4 271 # # +utf8mb4_eo_0900_ai_ci utf8mb4 273 # # +utf8mb4_hu_0900_ai_ci utf8mb4 274 # # +utf8mb4_hr_0900_ai_ci utf8mb4 275 # # +utf8mb4_vi_0900_ai_ci utf8mb4 277 # # +utf8mb4_0900_as_cs utf8mb4 278 # # +utf8mb4_de_pb_0900_as_cs utf8mb4 279 # # +utf8mb4_is_0900_as_cs utf8mb4 280 # # +utf8mb4_lv_0900_as_cs utf8mb4 281 # # +utf8mb4_ro_0900_as_cs utf8mb4 282 # # +utf8mb4_sl_0900_as_cs utf8mb4 283 # # +utf8mb4_pl_0900_as_cs utf8mb4 284 # # +utf8mb4_et_0900_as_cs utf8mb4 285 # # +utf8mb4_es_0900_as_cs utf8mb4 286 # # +utf8mb4_sv_0900_as_cs utf8mb4 287 # # +utf8mb4_tr_0900_as_cs utf8mb4 288 # # +utf8mb4_cs_0900_as_cs utf8mb4 289 # # +utf8mb4_da_0900_as_cs utf8mb4 290 # # +utf8mb4_lt_0900_as_cs utf8mb4 291 # # +utf8mb4_sk_0900_as_cs utf8mb4 292 # # +utf8mb4_es_trad_0900_as_cs utf8mb4 293 # # +utf8mb4_la_0900_as_cs utf8mb4 294 # # +utf8mb4_eo_0900_as_cs utf8mb4 296 # # +utf8mb4_hu_0900_as_cs utf8mb4 297 # # +utf8mb4_hr_0900_as_cs utf8mb4 298 # # +utf8mb4_vi_0900_as_cs utf8mb4 300 # # +utf8mb4_0900_as_ci utf8mb4 305 # # +utf8mb4_0900_bin utf8mb4 309 # # utf8mb4_croatian_ci utf8mb4 608 # # utf8mb4_myanmar_ci utf8mb4 609 # # utf8mb4_thai_520_w2 utf8mb4 610 # # diff --git a/mysql-test/suite/engines/funcs/r/db_alter_collate_utf8.result b/mysql-test/suite/engines/funcs/r/db_alter_collate_utf8.result index 9225a9ac28c..0162ac26d9d 100644 --- a/mysql-test/suite/engines/funcs/r/db_alter_collate_utf8.result +++ b/mysql-test/suite/engines/funcs/r/db_alter_collate_utf8.result @@ -218,6 +218,50 @@ utf8mb4_german2_ci utf8mb4 244 # # utf8mb4_croatian_mysql561_ci utf8mb4 245 # # utf8mb4_unicode_520_ci utf8mb4 246 # # utf8mb4_vietnamese_ci utf8mb4 247 # # +utf8mb4_0900_ai_ci utf8mb4 255 # # +utf8mb4_de_pb_0900_ai_ci utf8mb4 256 # # +utf8mb4_is_0900_ai_ci utf8mb4 257 # # +utf8mb4_lv_0900_ai_ci utf8mb4 258 # # +utf8mb4_ro_0900_ai_ci utf8mb4 259 # # +utf8mb4_sl_0900_ai_ci utf8mb4 260 # # +utf8mb4_pl_0900_ai_ci utf8mb4 261 # # +utf8mb4_et_0900_ai_ci utf8mb4 262 # # +utf8mb4_es_0900_ai_ci utf8mb4 263 # # +utf8mb4_sv_0900_ai_ci utf8mb4 264 # # +utf8mb4_tr_0900_ai_ci utf8mb4 265 # # +utf8mb4_cs_0900_ai_ci utf8mb4 266 # # +utf8mb4_da_0900_ai_ci utf8mb4 267 # # +utf8mb4_lt_0900_ai_ci utf8mb4 268 # # +utf8mb4_sk_0900_ai_ci utf8mb4 269 # # +utf8mb4_es_trad_0900_ai_ci utf8mb4 270 # # +utf8mb4_la_0900_ai_ci utf8mb4 271 # # +utf8mb4_eo_0900_ai_ci utf8mb4 273 # # +utf8mb4_hu_0900_ai_ci utf8mb4 274 # # +utf8mb4_hr_0900_ai_ci utf8mb4 275 # # +utf8mb4_vi_0900_ai_ci utf8mb4 277 # # +utf8mb4_0900_as_cs utf8mb4 278 # # +utf8mb4_de_pb_0900_as_cs utf8mb4 279 # # +utf8mb4_is_0900_as_cs utf8mb4 280 # # +utf8mb4_lv_0900_as_cs utf8mb4 281 # # +utf8mb4_ro_0900_as_cs utf8mb4 282 # # +utf8mb4_sl_0900_as_cs utf8mb4 283 # # +utf8mb4_pl_0900_as_cs utf8mb4 284 # # +utf8mb4_et_0900_as_cs utf8mb4 285 # # +utf8mb4_es_0900_as_cs utf8mb4 286 # # +utf8mb4_sv_0900_as_cs utf8mb4 287 # # +utf8mb4_tr_0900_as_cs utf8mb4 288 # # +utf8mb4_cs_0900_as_cs utf8mb4 289 # # +utf8mb4_da_0900_as_cs utf8mb4 290 # # +utf8mb4_lt_0900_as_cs utf8mb4 291 # # +utf8mb4_sk_0900_as_cs utf8mb4 292 # # +utf8mb4_es_trad_0900_as_cs utf8mb4 293 # # +utf8mb4_la_0900_as_cs utf8mb4 294 # # +utf8mb4_eo_0900_as_cs utf8mb4 296 # # +utf8mb4_hu_0900_as_cs utf8mb4 297 # # +utf8mb4_hr_0900_as_cs utf8mb4 298 # # +utf8mb4_vi_0900_as_cs utf8mb4 300 # # +utf8mb4_0900_as_ci utf8mb4 305 # # +utf8mb4_0900_bin utf8mb4 309 # # utf8mb4_croatian_ci utf8mb4 608 # # utf8mb4_myanmar_ci utf8mb4 609 # # utf8mb4_thai_520_w2 utf8mb4 610 # # diff --git a/mysql-test/suite/federated/federatedx.result b/mysql-test/suite/federated/federatedx.result index 8c792cf0742..c4b152b107e 100644 --- a/mysql-test/suite/federated/federatedx.result +++ b/mysql-test/suite/federated/federatedx.result @@ -2245,7 +2245,7 @@ CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1'; # Dump table t1 using mysqldump tool /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `id` varchar(20) NOT NULL, PRIMARY KEY (`id`) diff --git a/mysql-test/suite/funcs_1/r/is_routines_embedded.result b/mysql-test/suite/funcs_1/r/is_routines_embedded.result index d13003b85cf..e37d161a703 100644 --- a/mysql-test/suite/funcs_1/r/is_routines_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_routines_embedded.result @@ -197,7 +197,7 @@ sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NUL SELECT * FROM db_datadict_2.res_6_408002_2; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci -check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci +check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_LOG_FILE_BUFFERING' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss mariadb.sys@localhost latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci @@ -213,7 +213,7 @@ sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NUL SELECT * FROM db_datadict_2.res_6_408002_2; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci -check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci +check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_LOG_FILE_BUFFERING' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss mariadb.sys@localhost latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci @@ -229,7 +229,7 @@ sp_6_408002_2 def db_datadict_2 sp_6_408002_2 PROCEDURE NULL NULL NULL NULL NUL SELECT * FROM db_datadict_2.res_6_408002_2; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci -check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci +check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_LOG_FILE_BUFFERING' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' AND variable_name != 'THREAD_POOL_SIZE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDER BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert') AND TRIGGER_SCHEMA != 'sys'; SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA != 'sys'; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS != 'INACTIVE'; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8mb3 utf8mb3_general_ci utf8mb4_uca1400_ai_ci AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss mariadb.sys@localhost latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 5b92b282ece..96491b5fbf8 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -10,5 +10,5 @@ # ############################################################################## -galera_as_slave_replay : MDEV-32780 galera_as_slave_replay: assertion in the wsrep::transaction::before_rollback() -galera_slave_replay : MDEV-32780 galera_as_slave_replay: assertion in the wsrep::transaction::before_rollback() +galera_sequences : MDEV-35934/MDEV-33850 For Galera, create sequence with low cache got signal 6 error: [ERROR] WSREP: FSM: no such a transition REPLICATING -> COMMITTED +MDEV-26266 : MDEV-26266 diff --git a/mysql-test/suite/galera/galera_2nodes_as_replica_2primary.cnf b/mysql-test/suite/galera/galera_2nodes_as_replica_2primary.cnf new file mode 100644 index 00000000000..714caf6ee67 --- /dev/null +++ b/mysql-test/suite/galera/galera_2nodes_as_replica_2primary.cnf @@ -0,0 +1,70 @@ +# +# This .cnf file creates a setup with 2 standard MariaDB servers, followed by a 2-node Galera cluster +# + +# Use default setting for mysqld processes +!include include/default_mysqld.cnf + +[mysqld] +loose-innodb +log-bin=mysqld-bin +log-slave-updates +binlog-format=row +innodb-autoinc-lock-mode=2 +default-storage-engine=innodb +# enforce read-committed characteristics across the cluster +# wsrep-causal-reads=ON +wsrep-sync-wait=15 + +[mysqld.1] +wsrep-on=1 +server-id=1 +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port +wsrep_provider=@ENV.WSREP_PROVIDER +wsrep_cluster_address=gcomm:// +wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;gcache.size=10M' +wsrep_node_address='127.0.0.1:@mysqld.1.#galera_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] +wsrep-on=1 +server-id=2 +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port +wsrep_provider=@ENV.WSREP_PROVIDER +wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.1.#galera_port' +wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;gcache.size=10M' +wsrep_node_address='127.0.0.1:@mysqld.2.#galera_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] +wsrep-on=OFF +server-id=3 +gtid_domain_id=3 + +[mysqld.4] +wsrep-on=OFF +server-id=4 +gtid_domain_id=4 + + +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + +[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 diff --git a/mysql-test/suite/galera/r/MDEV-35018.result b/mysql-test/suite/galera/r/MDEV-35018.result new file mode 100644 index 00000000000..2afa7c4d397 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-35018.result @@ -0,0 +1,38 @@ +connection node_2; +connection node_1; +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER); +CREATE TABLE t2 ( +f1 INT PRIMARY KEY, +t1_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); +connection node_2; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_toi"; +connection node_1; +DROP TABLE t2; +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +1 +connection node_1; +UPDATE t1 SET f2 = 1 WHERE id=2; +connection node_2; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET SESSION wsrep_sync_wait = DEFAULT; +SELECT * FROM t1; +id f2 +1 0 +2 1 +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ''; +SET GLOBAL wsrep_slave_threads = DEFAULT; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/MDEV-35852.result b/mysql-test/suite/galera/r/MDEV-35852.result new file mode 100644 index 00000000000..f9d07043cf9 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-35852.result @@ -0,0 +1,8 @@ +connection node_2; +connection node_1; +CREATE TABLE t (a INT) ENGINE=InnoDB; +INSERT DELAYED INTO t VALUES (); +ERROR HY000: DELAYED option not supported for table 't' +DROP TABLE t; +INSERT DELAYED t1 () VALUES (); +ERROR 42S02: Table 'test.t1' doesn't exist diff --git a/mysql-test/suite/galera/r/MW-369.result b/mysql-test/suite/galera/r/MW-369.result index b4fb8668e74..4c487c57030 100644 --- a/mysql-test/suite/galera/r/MW-369.result +++ b/mysql-test/suite/galera/r/MW-369.result @@ -18,12 +18,12 @@ INSERT INTO c VALUES (1, 1); connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; @@ -58,12 +58,12 @@ UPDATE c SET f2 = 1 WHERE f1 = 1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; @@ -96,12 +96,12 @@ DELETE FROM c WHERE f1 = 1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; @@ -130,12 +130,12 @@ INSERT INTO c VALUES (1, 0);; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; @@ -168,12 +168,12 @@ UPDATE c SET f2 = 1 WHERE f1 = 1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; @@ -211,12 +211,12 @@ INSERT INTO cf (f1, p_id) VALUES (20, 1); connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; @@ -249,12 +249,12 @@ INSERT INTO cg VALUES (1, 1, 0); connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; diff --git a/mysql-test/suite/galera/r/MW-402.result b/mysql-test/suite/galera/r/MW-402.result index e936b83553d..925d208f5c6 100644 --- a/mysql-test/suite/galera/r/MW-402.result +++ b/mysql-test/suite/galera/r/MW-402.result @@ -21,16 +21,17 @@ DELETE FROM p WHERE f1 = 1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SET DEBUG_SYNC = 'RESET'; connection node_2; SELECT * FROM p; f1 f2 @@ -59,16 +60,17 @@ UPDATE p set f1=11 WHERE f1 = 1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SET DEBUG_SYNC = 'RESET'; connection node_2; SELECT * FROM p; f1 f2 @@ -99,16 +101,17 @@ UPDATE p set f1=11 WHERE f1 = 1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SET DEBUG_SYNC = 'RESET'; connection node_2; SELECT * FROM p; f1 f2 @@ -130,16 +133,17 @@ UPDATE c SET p_id=2 where f1=1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SET DEBUG_SYNC = 'RESET'; connection node_2; SELECT * FROM p; f1 f2 @@ -174,15 +178,16 @@ DELETE FROM p1 WHERE f1 = 1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; +SET DEBUG_SYNC = 'RESET'; connection node_2; SELECT * FROM p1; f1 f2 @@ -219,16 +224,17 @@ DELETE FROM p1 WHERE f1=1; connection node_1a; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; COMMIT; connection node_1a; -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SET DEBUG_SYNC = 'RESET'; connection node_2; SELECT * FROM p1; f1 f2 diff --git a/mysql-test/suite/galera/r/galera_2primary_replica.result b/mysql-test/suite/galera/r/galera_2primary_replica.result new file mode 100644 index 00000000000..8bdbf5be962 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_2primary_replica.result @@ -0,0 +1,95 @@ +connection node_2; +connection node_1; +connect primary1, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connect primary2, 127.0.0.1, root, , test, $NODE_MYPORT_4; +connection primary1; +# Primary1 creating user for replication +create user repl@'%' identified by 'repl'; +grant all on *.* to repl@'%'; +connection primary2; +# Primary2 creating user for replication +create user repl2@'%' identified by 'repl2'; +grant all on *.* to repl2@'%'; +connect replica, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection replica; +connection node_2; +connection replica; +# Galera replica changing master to primary1 +SET @@default_master_connection='stream2'; +# Primary node changing master to primary2 +START ALL SLAVES; +Warnings: +Note 1937 SLAVE 'stream1' started +Note 1937 SLAVE 'stream2' started +connection primary1; +# Primary 1: Creating table and populating it with data +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +connection primary2; +# Primary 2: Creating table and populating it with data +CREATE TABLE t2 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +EXPECT_1000 +1000 +connection replica; +# Waiting for data to replicate to node_1 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +EXPECT_1000 +1000 +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +3-3-1003,4-4-1003 3-3-1003,4-4-1003 3-3-1003,4-4-1003 +connection node_2; +# Waiting for data to replicate to node_2 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +EXPECT_1000 +1000 +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +3-3-1003,4-4-1003 3-3-1003,4-4-1003 3-3-1003,4-4-1003 +connection primary1; +drop table t1; +connection primary2; +drop table t2; +# Wait until drop table is replicated on Galera +connection replica; +connection node_2; +connection replica; +STOP ALL SLAVES; +Warnings: +Note 1938 SLAVE 'stream1' stopped +Note 1938 SLAVE 'stream2' stopped +RESET SLAVE ALL; +connection primary1; +RESET MASTER; +connection primary2; +RESET MASTER; +connection node_1; +disconnect primary1; +disconnect primary2; +disconnect replica; +disconnect node_2; +disconnect node_1; +# End of test diff --git a/mysql-test/suite/galera/r/galera_circular_replication.result b/mysql-test/suite/galera/r/galera_circular_replication.result new file mode 100644 index 00000000000..72340977005 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_circular_replication.result @@ -0,0 +1,138 @@ +connection node_2; +connection node_1; +connect replica1, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect primary2, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connect primary1, 127.0.0.1, root, , test, $NODE_MYPORT_4; +connect replica2, 127.0.0.1, root, , test, $NODE_MYPORT_4; +connection primary1; +# Primary1 node creating user for replication +create user repl@'%' identified by 'repl'; +grant all on *.* to repl@'%'; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +connection replica1; +connection node_2; +connection primary2; +connection replica1; +# Galera replica changing master to primary1 +START SLAVE; +connection primary2; +# Primary2 creating user for replication +create user repl2@'%' identified by 'repl2'; +grant all on *.* to repl2@'%'; +connection replica2; +# replica2 changing master to primary2 +START SLAVE; +connection primary1; +# Primary1: Creating table and populating it with data +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +connection replica1; +# Waiting for data to replicate to replica +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +# Writing more data to table +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_2000 FROM t1; +EXPECT_2000 +2000 +connection node_2; +# Waiting for data to replicate to Galera node_2 +SELECT COUNT(*) AS EXPECT_2000 FROM t1; +EXPECT_2000 +2000 +# Writing more data to table +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_3000 FROM t1; +EXPECT_3000 +3000 +connection primary2; +# Waiting for data to replicate to primary2 +SELECT COUNT(*) AS EXPECT_3000 FROM t1; +EXPECT_3000 +3000 +# Writing more data to table +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +EXPECT_4000 +4000 +connection primary1; +# Waiting for data to replicate to primary1 +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +EXPECT_4000 +4000 +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-4-1004,16-15-3002 0-4-1004,16-15-3002 0-4-1004,16-15-3002 +connection replica1; +# Waiting for data to replicate to replica +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +EXPECT_4000 +4000 +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-4-1004,16-15-3002 0-4-1004,16-15-3002 0-4-1004,16-15-3002 +connection node_2; +# Waiting for data to replicate to node_2 +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +EXPECT_4000 +4000 +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-4-1004 0-4-1004,16-15-3002 0-4-1004,16-15-3002 +connection primary2; +# Waiting for data to replicate to node_3 +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +EXPECT_4000 +4000 +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-4-1004 0-4-1004,16-15-3002 0-4-1004,16-15-3002 +connection primary1; +drop table t1; +# Wait until drop table is replicated on Galera +connection replica1; +connection node_2; +connection primary2; +connection replica1; +STOP SLAVE; +RESET SLAVE ALL; +connection replica2; +STOP SLAVE; +RESET SLAVE ALL; +RESET MASTER; +connection node_1; +disconnect primary1; +disconnect replica1; +disconnect primary2; +disconnect replica2; +disconnect node_2; +disconnect node_1; +# End of test diff --git a/mysql-test/suite/galera/r/galera_ddl_fk_conflict.result b/mysql-test/suite/galera/r/galera_ddl_fk_conflict.result index 03e84f9facd..226aebde69e 100644 --- a/mysql-test/suite/galera/r/galera_ddl_fk_conflict.result +++ b/mysql-test/suite/galera/r/galera_ddl_fk_conflict.result @@ -3,11 +3,12 @@ connection node_1; connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; connection node_1a; SET SESSION wsrep_sync_wait=0; +FLUSH STATUS; connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; connection node_1b; SET SESSION wsrep_sync_wait=0; ###################################################################### -# Test for ALTER ENGINE=INNODB +# Test for ALTER TABLE ENGINE=INNODB ###################################################################### ###################################################################### # @@ -17,6 +18,7 @@ SET SESSION wsrep_sync_wait=0; ###################################################################### connection node_1; SET SESSION wsrep_sync_wait=0; +FLUSH STATUS; CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); CREATE TABLE p2 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); @@ -49,6 +51,9 @@ EXPECT_1 SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; EXPECT_2 2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); ###################################################################### # # Scenario #2: DML working on FK parent table tries to replicate, but @@ -87,6 +92,9 @@ EXPECT_1 SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; EXPECT_2 2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); ###################################################################### # # Scenario #3: 2 DMLs working on two FK parent tables try to replicate, @@ -137,10 +145,10 @@ EXPECT_1 SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; EXPECT_2 2 -DROP TABLE c1, c2; +DROP TABLE IF EXISTS c1, c2; DROP TABLE p1, p2; ###################################################################### -# Test for TRUNCATE +# Test for TRUNCATE TABLE ###################################################################### ###################################################################### # @@ -150,6 +158,7 @@ DROP TABLE p1, p2; ###################################################################### connection node_1; SET SESSION wsrep_sync_wait=0; +FLUSH STATUS; CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); CREATE TABLE p2 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); @@ -182,6 +191,9 @@ EXPECT_1 SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; EXPECT_2 2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); ###################################################################### # # Scenario #2: DML working on FK parent table tries to replicate, but @@ -220,6 +232,9 @@ EXPECT_1 SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; EXPECT_2 2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); ###################################################################### # # Scenario #3: 2 DMLs working on two FK parent tables try to replicate, @@ -270,5 +285,592 @@ EXPECT_1 SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; EXPECT_2 2 -DROP TABLE c1, c2; +DROP TABLE IF EXISTS c1, c2; DROP TABLE p1, p2; +###################################################################### +# Test for DROP TABLE +###################################################################### +###################################################################### +# +# Scenario #1: DML working on FK parent table BF aborted by DDL +# over child table +# +###################################################################### +connection node_1; +SET SESSION wsrep_sync_wait=0; +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); +CREATE TABLE p2 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p2 VALUES (1, 'INITIAL VALUE'); +INSERT INTO p2 VALUES (2, 'INITIAL VALUE'); +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); +CREATE TABLE c2 (pk INTEGER PRIMARY KEY, fk1 INTEGER, fk2 INTEGER, FOREIGN KEY (fk1) REFERENCES p1(pk), FOREIGN KEY (fk2) REFERENCES p2(pk)); +INSERT INTO c2 VALUES (1,1,1), (2,1,2); +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +connection node_2; +SET SESSION wsrep_sync_wait=0; +DROP TABLE c1 ; +connection node_1; +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #2: DML working on FK parent table tries to replicate, but +# fails in certification for earlier DDL on child table +# +###################################################################### +connection node_1; +BEGIN; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DROP TABLE c1 ; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #3: 2 DMLs working on two FK parent tables try to replicate, +# but fails in certification for earlier DDL on child table +# which is child to both FK parents +# +###################################################################### +connection node_1; +BEGIN; +connection node_1b; +BEGIN; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DROP TABLE c2 ; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +COMMIT; +connection node_1b; +UPDATE p2 SET f2 = 'TO DEADLOCK' WHERE pk = 2; +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +connection node_1b; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +DROP TABLE IF EXISTS c1, c2; +Warnings: +Note 1051 Unknown table 'test.c2' +DROP TABLE p1, p2; +###################################################################### +# Test for DROP TABLE +###################################################################### +connection node_1; +SET SESSION wsrep_sync_wait=0; +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #4: DML working on FK parent table tries to replicate, but +# fails in certification for earlier DDL on child table +# and another temporary table. TMP table should be skipped +# but FK child table should be replicated with proper keys +# +###################################################################### +connection node_1; +BEGIN; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +CREATE TEMPORARY TABLE tmp1 (i int); +CREATE TEMPORARY TABLE tmp2 (i int); +DROP TABLE tmp1, c1, tmp2 ; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +INSERT INTO p1 VALUES (10, 'TO DEADLOCK'); +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +DROP TABLE IF EXISTS c1; +Warnings: +Note 1051 Unknown table 'test.c1' +DROP TABLE p1; +DROP TABLE IF EXISTS tmp1, tmp2; +Warnings: +Note 1051 Unknown table 'test.tmp1,test.tmp2' +###################################################################### +# Test for DROP TABLE IF EXISTS +###################################################################### +###################################################################### +# +# Scenario #1: DML working on FK parent table BF aborted by DDL +# over child table +# +###################################################################### +connection node_1; +SET SESSION wsrep_sync_wait=0; +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); +CREATE TABLE p2 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p2 VALUES (1, 'INITIAL VALUE'); +INSERT INTO p2 VALUES (2, 'INITIAL VALUE'); +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); +CREATE TABLE c2 (pk INTEGER PRIMARY KEY, fk1 INTEGER, fk2 INTEGER, FOREIGN KEY (fk1) REFERENCES p1(pk), FOREIGN KEY (fk2) REFERENCES p2(pk)); +INSERT INTO c2 VALUES (1,1,1), (2,1,2); +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +connection node_2; +SET SESSION wsrep_sync_wait=0; +DROP TABLE IF EXISTS c1 ; +connection node_1; +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #2: DML working on FK parent table tries to replicate, but +# fails in certification for earlier DDL on child table +# +###################################################################### +connection node_1; +BEGIN; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DROP TABLE IF EXISTS c1 ; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #3: 2 DMLs working on two FK parent tables try to replicate, +# but fails in certification for earlier DDL on child table +# which is child to both FK parents +# +###################################################################### +connection node_1; +BEGIN; +connection node_1b; +BEGIN; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DROP TABLE IF EXISTS c2 ; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +COMMIT; +connection node_1b; +UPDATE p2 SET f2 = 'TO DEADLOCK' WHERE pk = 2; +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +connection node_1b; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +DROP TABLE IF EXISTS c1, c2; +Warnings: +Note 1051 Unknown table 'test.c2' +DROP TABLE p1, p2; +###################################################################### +# Test for DROP TABLE IF EXISTS +###################################################################### +connection node_1; +SET SESSION wsrep_sync_wait=0; +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #4: DML working on FK parent table tries to replicate, but +# fails in certification for earlier DDL on child table +# and another temporary table. TMP table should be skipped +# but FK child table should be replicated with proper keys +# +###################################################################### +connection node_1; +BEGIN; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +CREATE TEMPORARY TABLE tmp1 (i int); +CREATE TEMPORARY TABLE tmp2 (i int); +DROP TABLE IF EXISTS tmp1, c1, tmp2 ; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +INSERT INTO p1 VALUES (10, 'TO DEADLOCK'); +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +DROP TABLE IF EXISTS c1; +Warnings: +Note 1051 Unknown table 'test.c1' +DROP TABLE p1; +DROP TABLE IF EXISTS tmp1, tmp2; +Warnings: +Note 1051 Unknown table 'test.tmp1,test.tmp2' +###################################################################### +# Test for DROP TABLE IF EXISTS nonexisting, +###################################################################### +###################################################################### +# +# Scenario #1: DML working on FK parent table BF aborted by DDL +# over child table +# +###################################################################### +connection node_1; +SET SESSION wsrep_sync_wait=0; +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); +CREATE TABLE p2 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p2 VALUES (1, 'INITIAL VALUE'); +INSERT INTO p2 VALUES (2, 'INITIAL VALUE'); +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); +CREATE TABLE c2 (pk INTEGER PRIMARY KEY, fk1 INTEGER, fk2 INTEGER, FOREIGN KEY (fk1) REFERENCES p1(pk), FOREIGN KEY (fk2) REFERENCES p2(pk)); +INSERT INTO c2 VALUES (1,1,1), (2,1,2); +connection node_1; +SET AUTOCOMMIT=ON; +START TRANSACTION; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +connection node_2; +SET SESSION wsrep_sync_wait=0; +DROP TABLE IF EXISTS nonexisting, c1 ; +Warnings: +Note 1051 Unknown table 'test.nonexisting' +connection node_1; +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #2: DML working on FK parent table tries to replicate, but +# fails in certification for earlier DDL on child table +# +###################################################################### +connection node_1; +BEGIN; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DROP TABLE IF EXISTS nonexisting, c1 ; +Warnings: +Note 1051 Unknown table 'test.nonexisting' +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_1; +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #3: 2 DMLs working on two FK parent tables try to replicate, +# but fails in certification for earlier DDL on child table +# which is child to both FK parents +# +###################################################################### +connection node_1; +BEGIN; +connection node_1b; +BEGIN; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +DROP TABLE IF EXISTS nonexisting, c2 ; +Warnings: +Note 1051 Unknown table 'test.nonexisting' +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +COMMIT; +connection node_1b; +UPDATE p2 SET f2 = 'TO DEADLOCK' WHERE pk = 2; +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +connection node_1b; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +EXPECT_2 +2 +DROP TABLE IF EXISTS c1, c2; +Warnings: +Note 1051 Unknown table 'test.c2' +DROP TABLE p1, p2; +###################################################################### +# Test for DROP TABLE IF EXISTS nonexisting, +###################################################################### +connection node_1; +SET SESSION wsrep_sync_wait=0; +CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); +INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); +CREATE TABLE c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT INTO c1 VALUES (1,1); +###################################################################### +# +# Scenario #4: DML working on FK parent table tries to replicate, but +# fails in certification for earlier DDL on child table +# and another temporary table. TMP table should be skipped +# but FK child table should be replicated with proper keys +# +###################################################################### +connection node_1; +BEGIN; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +CREATE TEMPORARY TABLE tmp1 (i int); +CREATE TEMPORARY TABLE tmp2 (i int); +DROP TABLE IF EXISTS nonexisting, tmp1, c1, tmp2 ; +Warnings: +Note 1051 Unknown table 'test.nonexisting' +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +connection node_1; +INSERT INTO p1 VALUES (10, 'TO DEADLOCK'); +COMMIT; +connection node_1a; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT 'I deadlocked'; +I deadlocked +I deadlocked +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +connection node_2; +SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; +EXPECT_1 +1 +DROP TABLE IF EXISTS c1; +Warnings: +Note 1051 Unknown table 'test.c1' +DROP TABLE p1; +DROP TABLE IF EXISTS tmp1, tmp2; +Warnings: +Note 1051 Unknown table 'test.tmp1,test.tmp2' diff --git a/mysql-test/suite/galera/r/galera_query_cache_invalidate.result b/mysql-test/suite/galera/r/galera_query_cache_invalidate.result index 4ba7f700c8b..d07fe62c2d5 100644 --- a/mysql-test/suite/galera/r/galera_query_cache_invalidate.result +++ b/mysql-test/suite/galera/r/galera_query_cache_invalidate.result @@ -7,7 +7,6 @@ call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node"); connection node_4; call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node"); connection node_3; -CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_1, master_ssl_verify_server_cert=0, master_use_gtid=current_pos; START SLAVE; include/wait_for_slave_to_start.inc connection node_1; diff --git a/mysql-test/suite/galera/r/galera_restart_replica.result b/mysql-test/suite/galera/r/galera_restart_replica.result index 9b7e9fd259f..efc9a83a168 100644 --- a/mysql-test/suite/galera/r/galera_restart_replica.result +++ b/mysql-test/suite/galera/r/galera_restart_replica.result @@ -1,122 +1,169 @@ connection node_2; connection node_1; -connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connect replica, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connect primary, 127.0.0.1, root, , test, $NODE_MYPORT_3; create user repl@'%' identified by 'repl'; grant all on *.* to repl@'%'; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; connection node_1; -connection node_2; -connection node_2; +connection replica; +connection replica; START SLAVE; -connection node_3; -CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 -connection node_2; +connection primary; +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +connection replica; SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-1004 0-3-1004 0-3-1004 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 connection node_1; SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 -connection node_2; -# Verify that graceful shutdown succeeds. +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-1004 0-3-1004 0-3-1004 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +connection replica; +# Verify that graceful shutdown succeeds in replica. # Force SST connection node_1; -# Waiting until node_2 is not part of cluster anymore -connection node_2; -# Start node_2 again -Β€ Wait until node_2 is back on cluster -connection node_2; +# Waiting until replica is not part of cluster anymore +connection replica; +# Start replica again +# Wait until replica is back on cluster SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-1004 0-3-1004 0-3-1004 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 connection node_1; SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 -connection node_3; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 -connection node_3; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-1004 0-3-1004 0-3-1004 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +connection primary; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 drop table t1; -connection node_2; +connection replica; connection node_1; -connection node_3; -CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 -connection node_2; +connection primary; +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +connection replica; SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-2006 0-3-2006 0-3-2006 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 connection node_1; SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_10000 FROM t1; -EXPECT_10000 -10000 -connection node_2; -# Verify that graceful shutdown succeeds. +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-2006 0-3-2006 0-3-2006 +connection replica; +# Verify that graceful shutdown succeeds in replica. # Force SST connection node_1; -# Waiting until node_2 is not part of cluster anymore -connection node_3; -SELECT COUNT(*) AS EXPECT_20000 FROM t1; -EXPECT_20000 -20000 -connection node_2; -# Start node_2 again -Β€ Wait until node_2 is back on cluster -connection node_2; +# Waiting until replica is not part of cluster anymore +# Add writes to primary +connection primary; +# Intentionally generate 1k GTID-events +SELECT COUNT(*) AS EXPECT_2000 FROM t1; +EXPECT_2000 +2000 +connection replica; +# Start replica again +# Wait until replica is back on cluster SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_20000 FROM t1; -EXPECT_20000 -20000 +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-3006 0-3-3006 0-3-3006 +SELECT COUNT(*) AS EXPECT_2000 FROM t1; +EXPECT_2000 +2000 connection node_1; SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; EXPECT_1 1 -SELECT COUNT(*) AS EXPECT_20000 FROM t1; -EXPECT_20000 -20000 -connection node_3; -SELECT COUNT(*) AS EXPECT_20000 FROM t1; -EXPECT_20000 -20000 -connection node_3; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +@@gtid_slave_pos @@gtid_binlog_pos @@gtid_current_pos +0-3-3006 0-3-3006 0-3-3006 +SELECT COUNT(*) AS EXPECT_2000 FROM t1; +EXPECT_2000 +2000 +connection primary; +SELECT COUNT(*) AS EXPECT_2000 FROM t1; +EXPECT_2000 +2000 drop table t1; -connection node_2; +connection replica; connection node_1; -connection node_2; +connection replica; STOP SLAVE; RESET SLAVE ALL; -connection node_3; +connection primary; RESET MASTER; connection node_1; -disconnect node_3; +disconnect primary; +disconnect replica; disconnect node_2; disconnect node_1; # End of test diff --git a/mysql-test/suite/galera/r/galera_slave_replay.result b/mysql-test/suite/galera/r/galera_slave_replay.result index 8fb7e1ab099..263e1a675d5 100644 --- a/mysql-test/suite/galera/r/galera_slave_replay.result +++ b/mysql-test/suite/galera/r/galera_slave_replay.result @@ -94,3 +94,6 @@ DROP TABLE t1; connection node_3; DROP TABLE t1; RESET MASTER; +connection node_1; +disconnect node_2a; +disconnect node_3; diff --git a/mysql-test/suite/galera/r/galera_threadpool.result b/mysql-test/suite/galera/r/galera_threadpool.result new file mode 100644 index 00000000000..e89e243621a --- /dev/null +++ b/mysql-test/suite/galera/r/galera_threadpool.result @@ -0,0 +1,36 @@ +connection node_2; +connection node_1; +connection node_1; +connection node_2; +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connect node_2c, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connect node_2d, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connect node_2e, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; +CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY, f2 char) ENGINE=InnoDB; +INSERT INTO t1 VALUES (0,'a'); +INSERT INTO t1 VALUES (1,'a'); +connection node_2b; +SELECT * FROM t1; +f1 f2 +0 a +1 a +connection node_2c; +INSERT INTO t1 VALUES (2,'c'); +connection node_2d; +BEGIN; +SELECT * FROM t1; +f1 f2 +0 a +1 a +2 c +connection node_2e; +BEGIN; +UPDATE t1 SET f2='e' WHERE f1=0; +connection node_2; +connection node_1; +connection node_2; +connection node_1; +connection node_2; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-26266.cnf b/mysql-test/suite/galera/t/MDEV-26266.cnf new file mode 100644 index 00000000000..53eeb9c82bc --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-26266.cnf @@ -0,0 +1,6 @@ +!include ../galera_2nodes.cnf + +[mysqld] +# We want both nodes to restart before this test, +# so let's add a dummy parameter here: +loose-MDEV-26266 diff --git a/mysql-test/suite/galera/t/MDEV-26266.test b/mysql-test/suite/galera/t/MDEV-26266.test index 7167e029cb5..8560cb3c7b6 100644 --- a/mysql-test/suite/galera/t/MDEV-26266.test +++ b/mysql-test/suite/galera/t/MDEV-26266.test @@ -10,6 +10,8 @@ # --source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/force_restart.inc SET SESSION query_prealloc_size=8192; SET max_session_mem_used=50000; diff --git a/mysql-test/suite/galera/t/MDEV-28053.test b/mysql-test/suite/galera/t/MDEV-28053.test index 6a05682ba38..fe0aa566f94 100644 --- a/mysql-test/suite/galera/t/MDEV-28053.test +++ b/mysql-test/suite/galera/t/MDEV-28053.test @@ -37,7 +37,7 @@ while ($counter) { --connection node_2 --disable_query_log --disable_result_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3; START SLAVE; --eval SELECT MASTER_GTID_WAIT('$gtid', 600) --enable_result_log diff --git a/mysql-test/suite/galera/t/MDEV-35018.test b/mysql-test/suite/galera/t/MDEV-35018.test new file mode 100644 index 00000000000..490b542bcc0 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-35018.test @@ -0,0 +1,83 @@ +# +# BF-BF conflict on MDL locks between: DROP TABLE t2 and UPDATE on t1 +# with t2 referencing t1 +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER); + +CREATE TABLE t2 ( + f1 INT PRIMARY KEY, + t1_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE); + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); + +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); + +# +# DROP TABLE t2 and wait for it to reach node_2 +# +--connection node_2 +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_toi"; + +--connection node_1 +DROP TABLE t2; + +--connection node_2 +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; + +SET SESSION wsrep_sync_wait = 0; +--let $expected_apply_waits = `SELECT VARIABLE_VALUE+1 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_apply_waits'` +--echo $expected_apply_waits + +# +# Issue a UPDATE to table that references t1 +# Notice that we update field f2, not the primary key, +# and not foreign key. Bug does not manifest if we update +# one of those fields (because FK keys appended in those cases). +# +--connection node_1 +UPDATE t1 SET f2 = 1 WHERE id=2; + + +# +# Expect the UPDATE to depend on the DROP, +# therefore it should wait for the DROP to +# finish before it can be applied. +# If bug is present, expect the wait condition +# to timeout and when the UPDATE applies, it +# will be granted a MDL lock of type SHARED_READ +# for table t1. When resumed, the DROP TABLE will +# also try to MDL lock t1, causing a BF-BF conflict +# on that MDL lock. +# +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = $expected_apply_waits FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_apply_waits' +--source include/wait_condition.inc +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; + +SET SESSION wsrep_sync_wait = DEFAULT; +SELECT * FROM t1; + +# +# Cleanup +# +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ''; +SET GLOBAL wsrep_slave_threads = DEFAULT; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-35852.cnf b/mysql-test/suite/galera/t/MDEV-35852.cnf new file mode 100644 index 00000000000..ebd79612b81 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-35852.cnf @@ -0,0 +1,4 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep-debug=1 diff --git a/mysql-test/suite/galera/t/MDEV-35852.test b/mysql-test/suite/galera/t/MDEV-35852.test new file mode 100644 index 00000000000..6dce2974dd4 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-35852.test @@ -0,0 +1,9 @@ +--source include/galera_cluster.inc + +CREATE TABLE t (a INT) ENGINE=InnoDB; +--error ER_DELAYED_NOT_SUPPORTED +INSERT DELAYED INTO t VALUES (); +DROP TABLE t; + +--error ER_NO_SUCH_TABLE +INSERT DELAYED t1 () VALUES (); diff --git a/mysql-test/suite/galera/t/MDEV-6860.test b/mysql-test/suite/galera/t/MDEV-6860.test index f92bf5953c9..4687a8214fd 100644 --- a/mysql-test/suite/galera/t/MDEV-6860.test +++ b/mysql-test/suite/galera/t/MDEV-6860.test @@ -4,7 +4,7 @@ --connection node_2 --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3, MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_USE_GTID=slave_pos; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3, MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_USE_GTID=slave_pos; --enable_query_log START SLAVE; diff --git a/mysql-test/suite/galera/t/MW-369.inc b/mysql-test/suite/galera/t/MW-369.inc index f080d99fe7e..3b0a32bdd9d 100644 --- a/mysql-test/suite/galera/t/MW-369.inc +++ b/mysql-test/suite/galera/t/MW-369.inc @@ -14,7 +14,7 @@ # node_2 # $mw_369_child_query - will be blocked on node_1 in wsrep_apply_cb # node_1: -# COMMIT; - will be blocked on node_1 in wsrep_after_certification +# COMMIT; - will be blocked on node_1 in after_wsrep_before_prepare # # The $mw_369_child_query is always expected to succeed. The caller is # responsible for checking if the final COMMIT on connection node_1 @@ -49,14 +49,14 @@ SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; --connection node_1 -SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; +SET SESSION DEBUG_SYNC = "wsrep_before_certification SIGNAL before_certification_reached WAIT_FOR continue_before_certification"; --send COMMIT # # Wait until both sync points have been reached # --connection node_1a -SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET SESSION DEBUG_SYNC = "now WAIT_FOR before_certification_reached"; # # both threads are now parked in sync points, signal them to continue @@ -66,13 +66,13 @@ SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; --let $wait_condition_on_error_output = SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST --source include/wait_condition_with_debug.inc -SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET SESSION DEBUG_SYNC = 'now SIGNAL continue_before_certification'; --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point:%' --let $wait_condition_on_error_output = SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST --source include/wait_condition_with_debug.inc -SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET SESSION DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point:%' --let $wait_condition_on_error_output = SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST @@ -80,3 +80,5 @@ SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; SET GLOBAL DEBUG_DBUG = ""; SET DEBUG_SYNC = 'RESET'; + + diff --git a/mysql-test/suite/galera/t/MW-402.combinations b/mysql-test/suite/galera/t/MW-402.combinations new file mode 100644 index 00000000000..def4dda7def --- /dev/null +++ b/mysql-test/suite/galera/t/MW-402.combinations @@ -0,0 +1,5 @@ +[binlogon] +log-bin +log-slave-updates=ON + +[binlogoff] diff --git a/mysql-test/suite/galera/t/MW-402.test b/mysql-test/suite/galera/t/MW-402.test index f84752e1b25..8b954a19405 100644 --- a/mysql-test/suite/galera/t/MW-402.test +++ b/mysql-test/suite/galera/t/MW-402.test @@ -2,7 +2,6 @@ --source include/have_innodb.inc --source include/have_debug.inc --source include/have_debug_sync.inc ---source include/galera_have_debug_sync.inc # # we must open connection node_1a here, MW-369.inc will use it later @@ -36,6 +35,7 @@ INSERT INTO c VALUES (1, 1, 0); --connection node_1 --error ER_LOCK_DEADLOCK --reap +SET DEBUG_SYNC = 'RESET'; --connection node_2 SELECT * FROM p; @@ -72,6 +72,7 @@ INSERT INTO c VALUES (1, 1, 0); --connection node_1 --error ER_LOCK_DEADLOCK --reap +SET DEBUG_SYNC = 'RESET'; --connection node_2 SELECT * FROM p; @@ -112,6 +113,7 @@ INSERT INTO c VALUES (1, 1, 0); --connection node_1 --error ER_LOCK_DEADLOCK --reap +SET DEBUG_SYNC = 'RESET'; # same as previous, but statements in different order --connection node_2 @@ -128,7 +130,7 @@ SELECT * FROM c; --connection node_1 --error ER_LOCK_DEADLOCK --reap - +SET DEBUG_SYNC = 'RESET'; --connection node_2 SELECT * FROM p; @@ -172,6 +174,7 @@ INSERT INTO c VALUES (1, 1, 1, 0); # Commit succeeds --connection node_1 --reap +SET DEBUG_SYNC = 'RESET'; --connection node_2 SELECT * FROM p1; @@ -217,6 +220,7 @@ INSERT INTO c VALUES (1, 1, 1, 0); --connection node_1 --error ER_LOCK_DEADLOCK --reap +SET DEBUG_SYNC = 'RESET'; --connection node_2 SELECT * FROM p1; diff --git a/mysql-test/suite/galera/t/galera_2primary_replica.cnf b/mysql-test/suite/galera/t/galera_2primary_replica.cnf new file mode 100644 index 00000000000..e066866de87 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_2primary_replica.cnf @@ -0,0 +1,22 @@ +!include ../galera_2nodes_as_replica_2primary.cnf + +[mysqld] +wsrep-debug=1 + +[mysqld.1] +server_id=15 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=16 +gtid_domain_id=11 +gtid_strict_mode=1 +wsrep-slave-threads=4 +slave-parallel-threads=2 + +[mysqld.2] +skip-slave-start=OFF +server_id=15 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=16 +gtid_domain_id=11 +gtid_strict_mode=1 +wsrep-slave-threads=4 diff --git a/mysql-test/suite/galera/t/galera_2primary_replica.test b/mysql-test/suite/galera/t/galera_2primary_replica.test new file mode 100644 index 00000000000..fb57c6637d0 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_2primary_replica.test @@ -0,0 +1,170 @@ +# +# Test two primary nodes async replication to Galera cluster +# +# primary1 primary2 +# #3 #4 +# | | +# | async replication v +# +-------------------+ +----------------+ +# | | +# v v +# galera replica <------galera replication-------->galera node_2 +# #1 #2 +# +# Test outline +# +# - Create user for async replication and table with rows in both primaries +# - Verify that tables and rows are replicated to all Galera nodes +# - Verify that gtid position is same in all Galera nodes +# +# The galera/galera_2nodes_as_replica_2primary.cnf describes the setup of the nodes +# +--source include/force_restart.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# As node #3 and #4 are not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the connections here +--connect primary1, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connect primary2, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connection primary1 +--echo # Primary1 creating user for replication +create user repl@'%' identified by 'repl'; +grant all on *.* to repl@'%'; + +--connection primary2 +--echo # Primary2 creating user for replication +create user repl2@'%' identified by 'repl2'; +grant all on *.* to repl2@'%'; + +--connect replica, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--let $node_1 = replica +--let $node_2 = node_2 +--source include/auto_increment_offset_save.inc + +--connection replica +--echo # Galera replica changing master to primary1 +--disable_query_log +SET @@default_master_connection='stream1'; +--eval CHANGE MASTER 'stream1' TO master_host='127.0.0.1', master_user='repl', master_password='repl', master_port=$NODE_MYPORT_3, master_use_gtid=slave_pos; +--enable_query_log + +SET @@default_master_connection='stream2'; +--echo # Primary node changing master to primary2 +--disable_query_log +--eval CHANGE MASTER 'stream2' TO master_host='127.0.0.1', master_user='repl2', master_password='repl2', master_port=$NODE_MYPORT_4, master_use_gtid=slave_pos; +--enable_query_log + +START ALL SLAVES; + +--connection primary1 +--echo # Primary 1: Creating table and populating it with data +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +--disable_query_log +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 +--disable_query_log +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} +--enable_query_log + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; + +--connection primary2 +--echo # Primary 2: Creating table and populating it with data +CREATE TABLE t2 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 +--disable_query_log +while($count < $inserts) +{ + --eval insert into t2 values (NULL,'test1') + --inc $count +} +--enable_query_log + +SELECT COUNT(*) AS EXPECT_1000 FROM t2; + +--connection replica +--echo # Waiting for data to replicate to node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--let $wait_condition_on_error_output = SHOW ALL SLAVES STATUS; +--source include/wait_condition_with_debug.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--let $wait_condition_on_error_output = SHOW ALL SLAVES STATUS; +--source include/wait_condition_with_debug.inc + +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t1; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t2; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +SELECT COUNT(*) AS EXPECT_1000 FROM t2; + +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; + +--connection node_2 +--echo # Waiting for data to replicate to 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 INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t1; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t2; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +# +# Cleanup +# +--connection primary1 +drop table t1; +--connection primary2 +drop table t2; + +--echo # Wait until drop table is replicated on Galera +--connection replica +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc + +--connection replica +STOP ALL SLAVES; +RESET SLAVE ALL; + +--connection primary1 +RESET MASTER; +--connection primary2 +RESET MASTER; + +--source include/auto_increment_offset_restore.inc + +--connection node_1 +--disconnect primary1 +--disconnect primary2 +--disconnect replica + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/galera_as_master.test b/mysql-test/suite/galera/t/galera_as_master.test index 26fbd004009..c19784aaa34 100644 --- a/mysql-test/suite/galera/t/galera_as_master.test +++ b/mysql-test/suite/galera/t/galera_as_master.test @@ -9,7 +9,7 @@ --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_1; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_1; --enable_query_log START SLAVE; diff --git a/mysql-test/suite/galera/t/galera_as_slave.test b/mysql-test/suite/galera/t/galera_as_slave.test index 2a149d8ba2c..e908209dc95 100644 --- a/mysql-test/suite/galera/t/galera_as_slave.test +++ b/mysql-test/suite/galera/t/galera_as_slave.test @@ -13,7 +13,7 @@ --connection node_2 --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3; --enable_query_log START SLAVE; diff --git a/mysql-test/suite/galera/t/galera_as_slave_autoinc.test b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test index 733875a14be..cb028cd8161 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_autoinc.test +++ b/mysql-test/suite/galera/t/galera_as_slave_autoinc.test @@ -13,7 +13,7 @@ --connection node_2 --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3; --enable_query_log START SLAVE; diff --git a/mysql-test/suite/galera/t/galera_as_slave_ctas.test b/mysql-test/suite/galera/t/galera_as_slave_ctas.test index eced636c600..fdd271a3e5c 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_ctas.test +++ b/mysql-test/suite/galera/t/galera_as_slave_ctas.test @@ -16,7 +16,7 @@ SELECT @@wsrep_on; --connection node_1 --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3, master_ssl_verify_server_cert=0; --enable_query_log START SLAVE; @@ -34,11 +34,13 @@ CREATE TABLE target AS SELECT * FROM source; --connection node_1 --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'target'; ---source include/wait_condition.inc +--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.TABLES +--source include/wait_condition_with_debug.inc --connection node_2 --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'target'; ---source include/wait_condition.inc +--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.TABLES +--source include/wait_condition_with_debug.inc # # test phase two, issue CTAS with populated source table diff --git a/mysql-test/suite/galera/t/galera_as_slave_nonprim.test b/mysql-test/suite/galera/t/galera_as_slave_nonprim.test index 2fe608bb99e..31c50a4658c 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_nonprim.test +++ b/mysql-test/suite/galera/t/galera_as_slave_nonprim.test @@ -15,7 +15,6 @@ # we open the node_4 connection here --connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 - --connection node_2 --disable_query_log --eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=$NODE_MYPORT_4, MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_USER='root'; diff --git a/mysql-test/suite/galera/t/galera_as_slave_parallel_retry.test b/mysql-test/suite/galera/t/galera_as_slave_parallel_retry.test index 0d499f22fcd..e106c5f08c3 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_parallel_retry.test +++ b/mysql-test/suite/galera/t/galera_as_slave_parallel_retry.test @@ -38,7 +38,6 @@ SET debug_sync = 'now SIGNAL signal.wsrep_retry_event_group'; --let $wait_condition = SELECT COUNT(*) = 1 FROM t1; --source include/wait_condition.inc - --connection node_1 SET debug_sync = 'RESET'; diff --git a/mysql-test/suite/galera/t/galera_as_slave_replay.cnf b/mysql-test/suite/galera/t/galera_as_slave_replay.cnf index c20c65f86d9..5ae8b0b1ba7 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_replay.cnf +++ b/mysql-test/suite/galera/t/galera_as_slave_replay.cnf @@ -10,4 +10,3 @@ wsrep-debug=1 [mysqld.2] wsrep_restart_slave=1 wsrep-debug=1 - diff --git a/mysql-test/suite/galera/t/galera_as_slave_replay.test b/mysql-test/suite/galera/t/galera_as_slave_replay.test index 73fd7b3ff29..20455f2843c 100644 --- a/mysql-test/suite/galera/t/galera_as_slave_replay.test +++ b/mysql-test/suite/galera/t/galera_as_slave_replay.test @@ -10,12 +10,12 @@ --source include/have_debug.inc --source include/have_debug_sync.inc --source include/galera_have_debug_sync.inc +--source include/log_bin.inc --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 --connection node_2a --source include/galera_cluster.inc -#--source suite/galera/include/galera_have_debug_sync.inc ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; @@ -32,12 +32,11 @@ RESET MASTER; # --let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` - # -# nodes 1 and 2 form a galera cluster, node 2 operates as slave for native MariaDB naster in node 3 +# nodes 1 and 2 form a galera cluster, node 2 operates as slave for native MariaDB master in node 3 # --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3; --enable_query_log START SLAVE; @@ -80,14 +79,14 @@ SET SESSION wsrep_sync_wait = 0; SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb"; # -# now inject a conflicting insert from node 3, it will replicate with +# now inject a conflicting insert from node 1, it will replicate with # earlier seqno (than async transaction) and pause before applying in node 2 # --connection node_1 INSERT INTO test.t1 VALUES (2, 'b'); # -# send the update from master, this will succeed here, beceuase of async replication. +# send the update from master, this will succeed here, because of async replication. # async replication will apply this in node 2 and pause before commit phase, --connection node_3 --error 0 diff --git a/mysql-test/suite/galera/t/galera_circular_replication.cnf b/mysql-test/suite/galera/t/galera_circular_replication.cnf new file mode 100644 index 00000000000..b1c6320d4df --- /dev/null +++ b/mysql-test/suite/galera/t/galera_circular_replication.cnf @@ -0,0 +1,25 @@ +!include ../galera_3nodes_as_slave.cnf + +[mysqld] +wsrep-debug=1 + +[mysqld.1] +server_id=15 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=16 +gtid_domain_id=11 +gtid_strict_mode=1 + +[mysqld.2] +server_id=15 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=16 +gtid_domain_id=11 +gtid_strict_mode=1 + +[mysqld.3] +server_id=15 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=16 +gtid_domain_id=11 +gtid_strict_mode=1 diff --git a/mysql-test/suite/galera/t/galera_circular_replication.test b/mysql-test/suite/galera/t/galera_circular_replication.test new file mode 100644 index 00000000000..dbe85da4b23 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_circular_replication.test @@ -0,0 +1,234 @@ +# +# Test circular replication where galera cluster is async replica and master +# +# mariadb #4 galera galera +# primary1 +# replica2 +# ---async replication-->replica1 #1 <--galera replication--> node_2 #2 +# ^ ^ +# | | galera replication +# | v +# +<------------------async replication----------------------primary2 (galera) #3 +# +# Test outline: +# +# - Create user for async replication in primary1 +# - Create user for async replication in primary2 +# - Create table and some data in primary1 +# - Verify that table and data is replicated to galera nodes +# - Verify that mysql.gtid_slave_pos has some rows in all Galera nodes +# - Verify that gtid_slave_pos, gtid_binlog_pos and gtid_current_pos are +# same in all Galera nodes and primary1 +# - Verify that writes on Galera nodes are replicated to all nodes +# and to primary1 +# +# The galera/galera_3nodes_as_slave.cnf describes the setup of the nodes +# +--source include/force_restart.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connect replica1, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect primary2, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +# As node #4 is not a Galera node, and galera_cluster.inc does not open connetion to it +# because it is both primary and replica we open both connections here +--connect primary1, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connect replica2, 127.0.0.1, root, , test, $NODE_MYPORT_4 + +--connection primary1 +--echo # Primary1 node creating user for replication +create user repl@'%' identified by 'repl'; +grant all on *.* to repl@'%'; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; + +--let $node_1 = replica1 +--let $node_2 = node_2 +--let $node_3 = primary2 +--source include/auto_increment_offset_save.inc + +--connection replica1 +--echo # Galera replica changing master to primary1 +--disable_query_log +--eval CHANGE MASTER TO master_host='127.0.0.1', master_user='repl', master_password='repl', master_port=$NODE_MYPORT_4, master_use_gtid=slave_pos; +--enable_query_log +START SLAVE; + +--connection primary2 +--echo # Primary2 creating user for replication +create user repl2@'%' identified by 'repl2'; +grant all on *.* to repl2@'%'; + +--connection replica2 +--echo # replica2 changing master to primary2 +--disable_query_log +--eval CHANGE MASTER TO master_host='127.0.0.1', master_user='repl2', master_password='repl2', master_port=$NODE_MYPORT_3, master_use_gtid=slave_pos; +--enable_query_log +START SLAVE; + +--connection primary1 +--echo # Primary1: Creating table and populating it with data +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 +--disable_query_log +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} +--enable_query_log + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; + +--connection replica1 +--echo # Waiting for data to replicate to replica +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; + +--echo # Writing more data to table +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 +--disable_query_log +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} +--enable_query_log + +SELECT COUNT(*) AS EXPECT_2000 FROM t1; + +--connection node_2 +--echo # Waiting for data to replicate to Galera 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(*) = 2000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_2000 FROM t1; + +--echo # Writing more data to table +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 +--disable_query_log +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} +--enable_query_log + +SELECT COUNT(*) AS EXPECT_3000 FROM t1; + +--connection primary2 +--echo # Waiting for data to replicate to primary2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 3000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_3000 FROM t1; + +--echo # Writing more data to table +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 +--disable_query_log +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} +--enable_query_log + +SELECT COUNT(*) AS EXPECT_4000 FROM t1; + +--connection primary1 +--echo # Waiting for data to replicate to primary1 +--let $wait_condition = SELECT COUNT(*) = 4000 FROM t1; +--let $wait_condition_on_error_output = SHOW SLAVE STATUS; +--source include/wait_condition_with_debug.inc + +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; + +--connection replica1 +--echo # Waiting for data to replicate to replica +--let $wait_condition = SELECT COUNT(*) = 4000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; + +--connection node_2 +--echo # Waiting for data to replicate to node_2 +--let $wait_condition = SELECT COUNT(*) = 4000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; + +--connection primary2 +--echo # Waiting for data to replicate to node_3 +--let $wait_condition = SELECT COUNT(*) = 4000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_4000 FROM t1; +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +# +# Cleanup +# +--connection primary1 +drop table t1; + +--echo # Wait until drop table is replicated on Galera +--connection replica1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection primary2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection replica1 +STOP SLAVE; +RESET SLAVE ALL; + +--connection replica2 +STOP SLAVE; +RESET SLAVE ALL; +RESET MASTER; + +--source include/auto_increment_offset_restore.inc + +--connection node_1 +--disconnect primary1 +--disconnect replica1 +--disconnect primary2 +--disconnect replica2 + +--source include/galera_end.inc +--echo # End of test diff --git a/mysql-test/suite/galera/t/galera_ddl_fk_conflict.cnf b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.cnf new file mode 100644 index 00000000000..2975070498e --- /dev/null +++ b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.cnf @@ -0,0 +1,11 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=1 +loose-galera-ddl-fk-conflict=1 + +[mysqld.2] +wsrep-debug=1 +loose-galera-ddl-fk-conflict=1 + + diff --git a/mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc index 06b7bbe41c4..f9fad92ac62 100644 --- a/mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc +++ b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.inc @@ -39,6 +39,7 @@ --connection node_1 SET SESSION wsrep_sync_wait=0; +FLUSH STATUS; CREATE TABLE p1 (pk INTEGER PRIMARY KEY, f2 CHAR(30)); INSERT INTO p1 VALUES (1, 'INITIAL VALUE'); @@ -69,7 +70,7 @@ SET SESSION wsrep_sync_wait=0; --source include/wait_condition.inc # replicate the DDL to be tested ---eval $table_admin_command TABLE c1 $table_admin_command_end +--eval $table_admin_command c1 $table_admin_command_end --connection node_1 --error ER_LOCK_DEADLOCK @@ -82,6 +83,12 @@ SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +--connection node_1 +--disable_warnings +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +--enable_warnings + --echo ###################################################################### --echo # --echo # Scenario #2: DML working on FK parent table tries to replicate, but @@ -97,11 +104,12 @@ BEGIN; --source include/galera_set_sync_point.inc --connection node_2 ---eval $table_admin_command TABLE c1 $table_admin_command_end +--eval $table_admin_command c1 $table_admin_command_end --connection node_1a --source include/galera_wait_sync_point.inc --source include/galera_clear_sync_point.inc + --let $expected_cert_failures = `SELECT VARIABLE_VALUE+1 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` --connection node_1 @@ -110,7 +118,8 @@ UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; --connection node_1a --let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' ---source include/wait_condition.inc +--let $wait_condition_on_error_output = SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition_with_debug.inc --let $galera_sync_point = apply_monitor_slave_enter_sync --source include/galera_signal_sync_point.inc @@ -128,6 +137,11 @@ SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; +--connection node_1 +--disable_warnings +CREATE TABLE IF NOT EXISTS c1 (pk INTEGER PRIMARY KEY, fk INTEGER, FOREIGN KEY (fk) REFERENCES p1(pk)); +INSERT IGNORE INTO c1 VALUES (1,1); +--enable_warnings --echo ###################################################################### --echo # @@ -149,12 +163,14 @@ BEGIN; --source include/galera_set_sync_point.inc --connection node_2 ---eval $table_admin_command TABLE c2 $table_admin_command_end +--eval $table_admin_command c2 $table_admin_command_end --connection node_1a --source include/galera_wait_sync_point.inc --source include/galera_clear_sync_point.inc --let $expected_cert_failures = `SELECT VARIABLE_VALUE+2 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` +--let $wait_condition_on_error_output = SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition_with_debug.inc --connection node_1 UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; @@ -166,7 +182,8 @@ UPDATE p2 SET f2 = 'TO DEADLOCK' WHERE pk = 2; --connection node_1a --let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' ---source include/wait_condition.inc +--let $wait_condition_on_error_output = SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures' +--source include/wait_condition_with_debug.inc --let $galera_sync_point = apply_monitor_slave_enter_sync --source include/galera_signal_sync_point.inc @@ -188,5 +205,5 @@ SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; SELECT COUNT(*) AS EXPECT_2 FROM p2 WHERE f2 = 'INITIAL VALUE'; -DROP TABLE c1, c2; +DROP TABLE IF EXISTS c1, c2; DROP TABLE p1, p2; diff --git a/mysql-test/suite/galera/t/galera_ddl_fk_conflict.test b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.test index 4ec866a9f74..a8fb6614e41 100644 --- a/mysql-test/suite/galera/t/galera_ddl_fk_conflict.test +++ b/mysql-test/suite/galera/t/galera_ddl_fk_conflict.test @@ -6,24 +6,41 @@ --source include/have_innodb.inc --source include/have_debug_sync.inc --source include/galera_have_debug_sync.inc +--source include/force_restart.inc # sync point controlling session --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connection node_1a SET SESSION wsrep_sync_wait=0; +FLUSH STATUS; # secondary conflicting DML victim session --connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connection node_1b SET SESSION wsrep_sync_wait=0; ---let $table_admin_command = ALTER +--let $table_admin_command = ALTER TABLE --let $table_admin_command_end = ENGINE=INNODB --source galera_ddl_fk_conflict.inc ---let $table_admin_command = TRUNCATE ---let $table_admin_command_end = +--let $table_admin_command = TRUNCATE TABLE +--let $table_admin_command_end = --source galera_ddl_fk_conflict.inc +--let $table_admin_command = DROP TABLE +--let $table_admin_command_end = +--source galera_ddl_fk_conflict.inc +--source galera_ddl_fk_conflict_with_tmp.inc + +--let $table_admin_command = DROP TABLE IF EXISTS +--let $table_admin_command_end = +--source galera_ddl_fk_conflict.inc +--source galera_ddl_fk_conflict_with_tmp.inc + +--let $table_admin_command = DROP TABLE IF EXISTS nonexisting, +--let $table_admin_command_end = +--source galera_ddl_fk_conflict.inc +--source galera_ddl_fk_conflict_with_tmp.inc + # CHECK and ANALYZE are not affected diff --git a/mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc b/mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc index acf3c54180b..cc6542b96b0 100644 --- a/mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc +++ b/mysql-test/suite/galera/t/galera_ddl_fk_conflict_with_tmp.inc @@ -35,9 +35,9 @@ BEGIN; --source include/wait_condition.inc --let $wait_condition = SELECT COUNT(*) = 1 FROM c1 --source include/wait_condition.inc -CREATE TEMPORARY TABLE tmp (i int); ---eval $table_admin_command TABLE c1, tmp $table_admin_command_end -DROP TABLE tmp; +CREATE TEMPORARY TABLE tmp1 (i int); +CREATE TEMPORARY TABLE tmp2 (i int); +--eval $table_admin_command tmp1, c1, tmp2 $table_admin_command_end --connection node_1a --source include/galera_wait_sync_point.inc @@ -45,7 +45,7 @@ DROP TABLE tmp; --let $expected_cert_failures = `SELECT VARIABLE_VALUE+1 FROM information_schema.global_status WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'` --connection node_1 -UPDATE p1 SET f2 = 'TO DEADLOCK' WHERE pk = 1; +INSERT INTO p1 VALUES (10, 'TO DEADLOCK'); --send COMMIT --connection node_1a @@ -65,5 +65,6 @@ SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; --connection node_2 SELECT COUNT(*) AS EXPECT_1 FROM p1 WHERE f2 = 'INITIAL VALUE'; -DROP TABLE c1; +DROP TABLE IF EXISTS c1; DROP TABLE p1; +DROP TABLE IF EXISTS tmp1, tmp2; 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 index 25e79c7100d..6c7beb4ae16 100644 --- a/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test +++ b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test @@ -16,7 +16,7 @@ --echo #Connection 2 --connection node_2 --disable_query_log ---eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3,master_use_gtid=slave_pos; +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_SSL_VERIFY_SERVER_CERT=0, MASTER_PORT=$NODE_MYPORT_3, master_use_gtid=slave_pos; --enable_query_log START SLAVE; --sleep 1 diff --git a/mysql-test/suite/galera/t/galera_performance_schema.test b/mysql-test/suite/galera/t/galera_performance_schema.test index d54555ea301..531c45ea3c5 100644 --- a/mysql-test/suite/galera/t/galera_performance_schema.test +++ b/mysql-test/suite/galera/t/galera_performance_schema.test @@ -5,6 +5,9 @@ --source include/galera_cluster.inc --source include/have_perfschema.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + use performance_schema; --vertical_results @@ -22,6 +25,7 @@ insert into t1 values (1),(2); use performance_schema; select name from mutex_instances where name like 'wait/synch/mutex/sql/LOCK_wsrep%' order by name; select name from cond_instances where name like 'wait/synch/cond/sql/COND_wsrep%' order by name; + # Whenever a node fails to apply an event on a slave node, the database server creates a # special binary log file of the event in the data directory. The naming convention the # node uses for the filename is GRA_*.log. @@ -55,4 +59,3 @@ CALL mtr.add_suppression("Slave SQL: Error 'Table 't2' already exists' on query" use test; drop table t1; drop table t2; - diff --git a/mysql-test/suite/galera/t/galera_query_cache_invalidate.test b/mysql-test/suite/galera/t/galera_query_cache_invalidate.test index 03729aaa6f2..5a03bcf8c99 100644 --- a/mysql-test/suite/galera/t/galera_query_cache_invalidate.test +++ b/mysql-test/suite/galera/t/galera_query_cache_invalidate.test @@ -28,8 +28,9 @@ call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node"); --connection node_3 ---replace_result $NODE_MYPORT_1 NODE_MYPORT_1 +--disable_query_log --eval CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_port=$NODE_MYPORT_1, master_ssl_verify_server_cert=0, master_use_gtid=current_pos +--enable_query_log START SLAVE; --source include/wait_for_slave_to_start.inc diff --git a/mysql-test/suite/galera/t/galera_restart_replica.test b/mysql-test/suite/galera/t/galera_restart_replica.test index 37cfd9bc0f9..05ab77f2519 100644 --- a/mysql-test/suite/galera/t/galera_restart_replica.test +++ b/mysql-test/suite/galera/t/galera_restart_replica.test @@ -1,77 +1,115 @@ # -# Test Galera as a replica to a MySQL async replication +# Test Galera as a replica to a MariaDB async replication +# +# MariaDB +# primary ---async replication--->galera node_2 (replica)<----galera replication---> galera node1 +# +# Test outline: +# +# - Create user for async replication +# - Create table and some data in primary +# - Verify that table and data is replicated to galera nodes +# - Verify that mysql.gtid_slave_pos has some rows in all Galera nodes +# - Verify that gtid_slave_pos, gtid_binlog_pos and gtid_current_pos are +# same in all Galera nodes +# - Verify that we can shutdown and restart Galera replica (node #2) +# - Verify that gtid_slave_pos, gtid_binlog_pos and gtid_current_pos are +# same in all Galera nodes +# - Verify that mysql.gtid_slave_pos table has limited amount of rows +# - Veruft that ddl works (drop table) +# +# Similar test is done so that new rows are added to table in +# primary while async replica (node #2) is down. # # The galera/galera_2node_slave.cnf describes the setup of the nodes # --source include/force_restart.inc --source include/galera_cluster.inc --source include/have_innodb.inc ---source include/have_sequence.inc + +# In this test we mark node #2 as replica +--connect replica, 127.0.0.1, root, , test, $NODE_MYPORT_2 # As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it -# we open the node_3 connection here ---connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +# we open the primary connection her +--connect primary, 127.0.0.1, root, , test, $NODE_MYPORT_3 create user repl@'%' identified by 'repl'; grant all on *.* to repl@'%'; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $node_1 = node_1 ---let $node_2 = node_2 +--let $node_2 = replica --source include/auto_increment_offset_save.inc ---connection node_2 +--connection replica --disable_query_log --eval CHANGE MASTER TO master_host='127.0.0.1', master_user='repl', master_password='repl', master_port=$NODE_MYPORT_3, master_use_gtid=slave_pos; --enable_query_log START SLAVE; ---connection node_3 +--connection primary +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; -CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb; +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 --disable_query_log -INSERT INTO t1 SELECT seq, 'test' from seq_1_to_10000; +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} --enable_query_log -SELECT COUNT(*) AS EXPECT_10000 FROM t1; ---connection node_2 +SELECT COUNT(*) AS EXPECT_1000 FROM t1; + +--connection replica --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc ---let $wait_condition = SELECT COUNT(*) = 10000 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t1; --source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; +--source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; --connection node_1 --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc ---let $wait_condition = SELECT COUNT(*) = 10000 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t1; --source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; +--source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; ---connection node_2 ---echo # Verify that graceful shutdown succeeds. +--connection replica +--echo # Verify that graceful shutdown succeeds in replica. --source include/shutdown_mysqld.inc --echo # Force SST --remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat --connection node_1 ---echo # Waiting until node_2 is not part of cluster anymore +--echo # Waiting until replica is not part of cluster anymore --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc --let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --source include/wait_condition.inc ---connection node_2 ---echo # Start node_2 again +--connection replica +--echo # Start replica again --source include/start_mysqld.inc ---echo Β€ Wait until node_2 is back on cluster +--echo # Wait until replica is back on cluster --let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --source include/wait_condition.inc --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; @@ -79,24 +117,30 @@ SELECT COUNT(*) AS EXPECT_10000 FROM t1; --let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; --source include/wait_condition.inc ---connection node_2 +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; +--source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; --connection node_1 +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; +--source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; ---connection node_3 -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +--connection primary +SELECT COUNT(*) AS EXPECT_1000 FROM t1; # # Cleanup # ---connection node_3 drop table t1; ---connection node_2 +--connection replica --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc @@ -108,59 +152,80 @@ drop table t1; # Case 2 : While slave is down add writes to master # ---connection node_3 - -CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb; +--connection primary +CREATE TABLE t1 (id bigint auto_increment primary key, msg varchar(100)) engine=innodb; +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 --disable_query_log -INSERT INTO t1 SELECT seq, 'test' from seq_1_to_10000; +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} --enable_query_log -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; ---connection node_2 +--connection replica --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc ---let $wait_condition = SELECT COUNT(*) = 10000 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t1; --source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; +--source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; --connection node_1 --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc ---let $wait_condition = SELECT COUNT(*) = 10000 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 1000 FROM t1; --source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; +--source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_10000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; ---connection node_2 ---echo # Verify that graceful shutdown succeeds. +--connection replica +--echo # Verify that graceful shutdown succeeds in replica. --source include/shutdown_mysqld.inc --echo # Force SST --remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat --connection node_1 ---echo # Waiting until node_2 is not part of cluster anymore +--echo # Waiting until replica is not part of cluster anymore --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc --let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --source include/wait_condition.inc -# Add writes to master ---connection node_3 +--echo # Add writes to primary +--connection primary +--echo # Intentionally generate 1k GTID-events +--let $inserts=1000 +--let $count=0 --disable_query_log -INSERT INTO t1 SELECT seq, 'test' from seq_20001_to_30000; +while($count < $inserts) +{ + --eval insert into t1 values (NULL,'test1') + --inc $count +} --enable_query_log -SELECT COUNT(*) AS EXPECT_20000 FROM t1; ---connection node_2 ---echo # Start node_2 again +SELECT COUNT(*) AS EXPECT_2000 FROM t1; + +--connection replica +--echo # Start replica again --source include/start_mysqld.inc ---echo Β€ Wait until node_2 is back on cluster +--echo # Wait until replica is back on cluster --let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; --source include/wait_condition.inc --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; @@ -168,28 +233,34 @@ SELECT COUNT(*) AS EXPECT_20000 FROM t1; --let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; --source include/wait_condition.inc ---connection node_2 ---let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 2000 FROM t1; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; --source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_20000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +SELECT COUNT(*) AS EXPECT_2000 FROM t1; --connection node_1 ---let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 2000 FROM t1; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) < 1000 FROM mysql.gtid_slave_pos; --source include/wait_condition.inc SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; -SELECT COUNT(*) AS EXPECT_20000 FROM t1; +SELECT COUNT(*) < 1000 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT @@gtid_slave_pos,@@gtid_binlog_pos,@@gtid_current_pos; +SELECT COUNT(*) AS EXPECT_2000 FROM t1; ---connection node_3 -SELECT COUNT(*) AS EXPECT_20000 FROM t1; +--connection primary +SELECT COUNT(*) AS EXPECT_2000 FROM t1; # # Cleanup # ---connection node_3 drop table t1; ---connection node_2 +--connection replica --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc @@ -197,16 +268,18 @@ drop table t1; --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc ---connection node_2 +--connection replica STOP SLAVE; RESET SLAVE ALL; ---connection node_3 +--connection primary RESET MASTER; ---connection node_1 ---disconnect node_3 - --source include/auto_increment_offset_restore.inc + +--connection node_1 +--disconnect primary +--disconnect replica + --source include/galera_end.inc --echo # End of test diff --git a/mysql-test/suite/galera/t/galera_slave_replay.test b/mysql-test/suite/galera/t/galera_slave_replay.test index 6680e66ffa1..d289cfb3bd2 100644 --- a/mysql-test/suite/galera/t/galera_slave_replay.test +++ b/mysql-test/suite/galera/t/galera_slave_replay.test @@ -32,7 +32,6 @@ RESET MASTER; # --let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'` - # # nodes 1 and 2 form a galera cluster, node 2 operates as slave for native MariaDB master in node 3 # @@ -134,7 +133,7 @@ SELECT * FROM t1; SET DEBUG_SYNC = "RESET"; #******************************************************************************** -# test phase 2 +# test phase 2 #******************************************************************************** --echo # @@ -197,3 +196,7 @@ DROP TABLE t1; --connection node_3 DROP TABLE t1; RESET MASTER; + +--connection node_1 +--disconnect node_2a +--disconnect node_3 diff --git a/mysql-test/suite/galera/t/galera_threadpool.cnf b/mysql-test/suite/galera/t/galera_threadpool.cnf new file mode 100644 index 00000000000..c1a1e6a81aa --- /dev/null +++ b/mysql-test/suite/galera/t/galera_threadpool.cnf @@ -0,0 +1,17 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-node-name="node1" +log_bin=binlog +log_slave_updates=ON +wsrep_sst_method=rsync +thread_handling = pool-of-threads + +[mysqld.2] +wsrep-node-name="node2" +log_bin=binlog +log_slave_updates=ON +wsrep_sst_method=rsync +thread_handling = pool-of-threads + + diff --git a/mysql-test/suite/galera/t/galera_threadpool.test b/mysql-test/suite/galera/t/galera_threadpool.test new file mode 100644 index 00000000000..78b26e6e89f --- /dev/null +++ b/mysql-test/suite/galera/t/galera_threadpool.test @@ -0,0 +1,67 @@ +# +# Tests for threadpool support +# +--source include/galera_cluster.inc + +--let $node_1 = node_1 +--let $node_2 = node_2 + +--source ../galera/include/auto_increment_offset_save.inc + +# +# start connections in node 2, and execute some SQL statements +# leave also open transactions in the node +# +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connect node_2c, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connect node_2d, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connect node_2e, 127.0.0.1, root, , test, $NODE_MYPORT_2 + +--connection node_2a +CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY, f2 char) ENGINE=InnoDB; +INSERT INTO t1 VALUES (0,'a'); +INSERT INTO t1 VALUES (1,'a'); + +--connection node_2b +SELECT * FROM t1; + +--connection node_2c +INSERT INTO t1 VALUES (2,'c'); + +--connection node_2d +BEGIN; +SELECT * FROM t1; + +--connection node_2e +BEGIN; +UPDATE t1 SET f2='e' WHERE f1=0; + +# +# Shut down node 2, all open connections should be closed +# +--connection node_2 +--source include/shutdown_mysqld.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 + +# And restart the node +--connection node_2 +let $restart_noprint=2; +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--source include/start_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 + +DROP TABLE t1; + +# +# Restore auto increment variables. +# +--source ../galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def index c52df019c65..bb9d7cbd7b8 100644 --- a/mysql-test/suite/galera_3nodes/disabled.def +++ b/mysql-test/suite/galera_3nodes/disabled.def @@ -11,6 +11,4 @@ ############################################################################## galera_2_cluster : MDEV-32631 galera_2_cluster: before_rollback(): Assertion `0' failed -galera_ipv6_rsync : MDEV-34842 Can't connect to server on '::1' (115) -galera_ipv6_rsync_section : MDEV-34842 Can't connect to server on '::1' (115) -galera_ipv6_mariabackup_section : MDEV-34842 Can't connect to server on '::1' (115) +galera_nbo_master_phase_two_crash : MENT-2215 Test failure on galera_3nodes.galera_nbo_master_non_prim_failure diff --git a/mysql-test/suite/galera_sr/r/MENT-2038.result b/mysql-test/suite/galera_sr/r/MENT-2038.result new file mode 100644 index 00000000000..bbd7c568925 --- /dev/null +++ b/mysql-test/suite/galera_sr/r/MENT-2038.result @@ -0,0 +1,7 @@ +connection node_2; +connection node_1; +SET SESSION wsrep_on=OFF; +BEGIN; +BEGIN; +COMMIT; +SET SESSION wsrep_on=ON; diff --git a/mysql-test/suite/galera_sr/t/MDEV-25718.test b/mysql-test/suite/galera_sr/t/MDEV-25718.test index 037cd300709..147b62fe145 100644 --- a/mysql-test/suite/galera_sr/t/MDEV-25718.test +++ b/mysql-test/suite/galera_sr/t/MDEV-25718.test @@ -43,7 +43,7 @@ SET SESSION wsrep_sync_wait = 0; SET debug_sync = "now SIGNAL write_row_continue"; # Let's give the INSERT some time, to make sure it does rollback ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = "INSERT INTO t1 VALUES (1)" AND (STATE = "Freeing items" OR STATE = 'Rollback'); +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = "INSERT INTO t1 VALUES (1)" AND (STATE = 'Freeing items' OR STATE = 'Rollback' OR STATE = 'Query end'); --let $wait_condition_on_error_output = SELECT INFO, STATE FROM INFORMATION_SCHEMA.PROCESSLIST --source include/wait_condition_with_debug.inc diff --git a/mysql-test/suite/galera_sr/t/MENT-2038.test b/mysql-test/suite/galera_sr/t/MENT-2038.test new file mode 100644 index 00000000000..311b0d3a36f --- /dev/null +++ b/mysql-test/suite/galera_sr/t/MENT-2038.test @@ -0,0 +1,12 @@ +# +# MENT-2038: Assertion `(thd && (WSREP_PROVIDER_EXISTS_ && thd->variables.wsrep_on))' +# failed in void wsrep_restore_kill_after_commit(THD*) +# + +--source include/galera_cluster.inc + +SET SESSION wsrep_on=OFF; +BEGIN; +BEGIN; # If bug is present, assertion triggers during implicit commit +COMMIT; +SET SESSION wsrep_on=ON; diff --git a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result index 3d62f660f89..1b901e6b87e 100644 --- a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_innodb.result @@ -279,8 +279,8 @@ select * from t1; a b -2 NULL 2 0.693147 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # LOG() @@ -303,8 +303,8 @@ a b c 1 100 NULL 10 100 2 2 65536 16 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; set sql_warnings = 1; @@ -323,8 +323,8 @@ select * from t1; a b -2 NULL 2 0.693147 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # LOG2() @@ -344,8 +344,8 @@ select * from t1; a b -100 NULL 65536 16 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # LOG10() @@ -367,8 +367,8 @@ a b -100 NULL 100 2 2 0.30103 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # - @@ -2722,8 +2722,8 @@ select * from t1; a b -1 18446744073709551615 1 1 -Note 1105 Cast to unsigned converted negative integer to it's positive complement Warnings: +Note 1105 Cast to unsigned converted negative integer to it's positive complement drop table t1; set sql_warnings = 0; # Convert() @@ -2743,8 +2743,8 @@ select * from t1; a b -1 18446744073709551615 1 1 -Note 1105 Cast to unsigned converted negative integer to it's positive complement Warnings: +Note 1105 Cast to unsigned converted negative integer to it's positive complement drop table t1; set sql_warnings = 0; # diff --git a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result index 18b5fa52913..dab3d50b00e 100644 --- a/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_supported_sql_funcs_myisam.result @@ -279,8 +279,8 @@ select * from t1; a b -2 NULL 2 0.693147 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # LOG() @@ -303,8 +303,8 @@ a b c 1 100 NULL 10 100 2 2 65536 16 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; set sql_warnings = 1; @@ -323,8 +323,8 @@ select * from t1; a b -2 NULL 2 0.693147 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # LOG2() @@ -344,8 +344,8 @@ select * from t1; a b -100 NULL 65536 16 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # LOG10() @@ -367,8 +367,8 @@ a b -100 NULL 100 2 2 0.30103 -Warning 1365 Division by 0 Warnings: +Warning 1365 Division by 0 drop table t1; set sql_warnings = 0; # - @@ -2722,8 +2722,8 @@ select * from t1; a b -1 18446744073709551615 1 1 -Note 1105 Cast to unsigned converted negative integer to it's positive complement Warnings: +Note 1105 Cast to unsigned converted negative integer to it's positive complement drop table t1; set sql_warnings = 0; # Convert() @@ -2743,8 +2743,8 @@ select * from t1; a b -1 18446744073709551615 1 1 -Note 1105 Cast to unsigned converted negative integer to it's positive complement Warnings: +Note 1105 Cast to unsigned converted negative integer to it's positive complement drop table t1; set sql_warnings = 0; # diff --git a/mysql-test/suite/heap/heap.result b/mysql-test/suite/heap/heap.result index 7a48c28508f..aa507a06a7a 100644 --- a/mysql-test/suite/heap/heap.result +++ b/mysql-test/suite/heap/heap.result @@ -827,4 +827,23 @@ DELETE FROM t1 WHERE ts = 1 AND color = 'GREEN'; SELECT * from t1 WHERE ts = 1 AND color = 'GREEN'; id color ts DROP TABLE t1; +# +# MDEV-22695 Server crashes in heap_rnext upon DELETE from a HEAP table +# +CREATE TABLE t1 (a VARCHAR(128), b VARCHAR(32), KEY(a) USING BTREE, KEY(b) USING BTREE) ENGINE=HEAP; +INSERT INTO t1 VALUES ('foo',NULL),('m','b'),(6,'j'),('bar','qux'),(NULL,NULL); +DELETE FROM t1 WHERE a <=> 'm' OR b <=> NULL; +DROP TABLE t1; +# +# MDEV-28130 MariaDB SEGV issue at tree_search_next +# +CREATE TABLE v(t1 INT, pk INT, KEY(t1), KEY pk using btree (pk), KEY v using btree(t1, pk)) engine=memory; +HANDLER v OPEN; +HANDLER v READ t1=(2) limit 3; +t1 pk +HANDLER v READ pk PREV; +t1 pk +HANDLER v READ pk PREV; +t1 pk +drop table v; ALTER DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci; diff --git a/mysql-test/suite/heap/heap.test b/mysql-test/suite/heap/heap.test index 2d85bbb8380..a1646dfe665 100644 --- a/mysql-test/suite/heap/heap.test +++ b/mysql-test/suite/heap/heap.test @@ -611,4 +611,23 @@ DELETE FROM t1 WHERE ts = 1 AND color = 'GREEN'; SELECT * from t1 WHERE ts = 1 AND color = 'GREEN'; DROP TABLE t1; +--echo # +--echo # MDEV-22695 Server crashes in heap_rnext upon DELETE from a HEAP table +--echo # +CREATE TABLE t1 (a VARCHAR(128), b VARCHAR(32), KEY(a) USING BTREE, KEY(b) USING BTREE) ENGINE=HEAP; +INSERT INTO t1 VALUES ('foo',NULL),('m','b'),(6,'j'),('bar','qux'),(NULL,NULL); +DELETE FROM t1 WHERE a <=> 'm' OR b <=> NULL; +# Cleanup +DROP TABLE t1; + +--echo # +--echo # MDEV-28130 MariaDB SEGV issue at tree_search_next +--echo # +CREATE TABLE v(t1 INT, pk INT, KEY(t1), KEY pk using btree (pk), KEY v using btree(t1, pk)) engine=memory; +HANDLER v OPEN; +HANDLER v READ t1=(2) limit 3; +HANDLER v READ pk PREV; +HANDLER v READ pk PREV; +drop table v; + --source include/test_db_charset_restore.inc diff --git a/mysql-test/suite/innodb/r/auto_increment_lock_mode.result b/mysql-test/suite/innodb/r/auto_increment_lock_mode.result new file mode 100644 index 00000000000..b19d5cf40fc --- /dev/null +++ b/mysql-test/suite/innodb/r/auto_increment_lock_mode.result @@ -0,0 +1,43 @@ +CREATE TABLE t1(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t3(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t4(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t5(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t6(a SERIAL, b INT) ENGINE=InnoDB; +CREATE FUNCTION p1() RETURNS INT +BEGIN +INSERT INTO t1() VALUES(); +INSERT INTO t2() VALUES(); +INSERT INTO t3() VALUES(); +INSERT INTO t4() VALUES(); +INSERT INTO t5() VALUES(); +RETURN 1; +END$$ +INSERT INTO t6(b) SELECT p1(); +UPDATE t1,t2,t3,t4,t5 SET t1.a=2,t2.a=2,t3.a=2,t4.a=2,t5.a=2; +SELECT * FROM t1; +a +2 +connect con1,localhost,root,,; +connect con2,localhost,root,,; +connect con3,localhost,root,,; +connection con1; +INSERT INTO t6(b) SELECT SLEEP(p1()); +connection con2; +INSERT INTO t6(b) SELECT SLEEP(p1()); +connection con3; +UPDATE t1,t2,t3,t4,t5 SET t1.a=0,t2.a=0,t3.a=0,t4.a=0,t5.a=0 +WHERE t1.a=2 AND t2.a=2 AND t3.a=2 AND t4.a=2 AND t5.a=2; +connection default; +KILL QUERY $ID1; +KILL QUERY $ID2; +KILL QUERY $ID3; +connection con1; +disconnect con1; +connection con2; +disconnect con2; +connection con3; +disconnect con3; +connection default; +DROP FUNCTION p1; +DROP TABLE t1,t2,t3,t4,t5,t6; diff --git a/mysql-test/suite/innodb/r/avoid_deadlock_with_blocked.result b/mysql-test/suite/innodb/r/avoid_deadlock_with_blocked.result new file mode 100644 index 00000000000..4e0cca42898 --- /dev/null +++ b/mysql-test/suite/innodb/r/avoid_deadlock_with_blocked.result @@ -0,0 +1,198 @@ +connect stop_purge,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connect con1,localhost,root,,; +connect con2,localhost,root,,; +connect con3,localhost,root,,; +connection default; +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; +INSERT INTO t1 (id) VALUES (1); +# Simplest scenario: +# , +# , , +# Before MDEV-34877: +# , , +# After MDEV-34877: +# , , +# Expected: instead of deadlocking, the con1's request should ingore con2's +connection con1; +BEGIN; +SELECT * FROM t1 LOCK IN SHARE MODE; +id +1 +connection con2; +BEGIN; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con2_will_wait'; +SELECT * FROM t1 FOR UPDATE; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; +SELECT * FROM t1 FOR UPDATE; +id +1 +COMMIT; +connection con2; +id +1 +COMMIT; +# The scenario when we bypass X<-S pair: +# , +# , , +# , , +# , , , +connection con1; +BEGIN; +SELECT * FROM t1 LOCK IN SHARE MODE; +id +1 +connection con2; +BEGIN; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con2_will_wait'; +SELECT * FROM t1 FOR UPDATE; +connection con3; +SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; +BEGIN; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; +SELECT * FROM t1 LOCK IN SHARE MODE;; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; +SELECT * FROM t1 FOR UPDATE; +id +1 +COMMIT; +connection con2; +id +1 +COMMIT; +connection con3; +id +1 +COMMIT; +# A variant of the above scenario: +# , +# , , +# , , +# Expected: a deadlock, as INSERT INTENTION should not overtake locks on gap, to not slice them +connection con1; +BEGIN; +SELECT * FROM t1 WHERE id=1 FOR UPDATE; +id +1 +connection con2; +BEGIN; +SET DEBUG_SYNC = 'lock_wait_start SIGNAL con2_will_wait'; +SELECT * FROM t1 LOCK IN SHARE MODE; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; +INSERT INTO t1 VALUES (0); +ROLLBACK; +connection con2; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +COMMIT; +# More complicated scenario: +# , +# , , +# , , +# , , , +# , , +# Expected: a deadlock, as INSERT INTENTION should not overtake locks on gap, to not slice them +connection con1; +BEGIN; +SELECT * FROM t1 LOCK IN SHARE MODE; +id +1 +connection con2; +BEGIN; +SELECT * FROM t1 WHERE id=1 LOCK IN SHARE MODE; +id +1 +connection con3; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; +SELECT * FROM t1 FOR UPDATE; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; +SET DEBUG_SYNC = 'lock_wait_start SIGNAL con1_will_wait'; +INSERT INTO t1 VALUES (0); +connection con2; +SET DEBUG_SYNC = 'now WAIT_FOR con1_will_wait'; +COMMIT; +connection con1; +ROLLBACK; +connection con3; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +# More complicated scenario. +# , +# , , +# , , +# , , , +# Before MDEV-34877: +# , , +# After MDEV-34877: +# , , +connection con1; +BEGIN; +SELECT * FROM t1 LOCK IN SHARE MODE; +id +1 +connection con2; +BEGIN; +SELECT * FROM t1 WHERE id=1 LOCK IN SHARE MODE; +id +1 +connection default; +connection con3; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; +SELECT * FROM t1 FOR UPDATE; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con1_will_wait'; +SELECT * FROM t1 WHERE id=1 FOR UPDATE; +connection con2; +SET DEBUG_SYNC = 'now WAIT_FOR con1_will_wait'; +COMMIT; +connection con1; +id +1 +COMMIT; +connection con3; +id +1 +COMMIT; +# A secenario, where con1 has to bypass two transactions: +# +# +# +# Before MDEV-34877: +# +# After MDEV-34877: +# +connection con1; +BEGIN; +SELECT * FROM t1 LOCK IN SHARE MODE; +id +1 +connection con2; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con2_will_wait'; +SELECT * FROM t1 FOR UPDATE; +connection con3; +SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; +SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; +SELECT * FROM t1 FOR UPDATE; +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; +SELECT * FROM t1 WHERE id=1 FOR UPDATE; +id +1 +COMMIT; +connection con2; +id +1 +COMMIT; +connection con3; +id +1 +COMMIT; +connection default; +disconnect con1; +disconnect con2; +disconnect con3; +disconnect stop_purge; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/bulk_load.result b/mysql-test/suite/innodb/r/bulk_load.result new file mode 100644 index 00000000000..1e3d9ba877a --- /dev/null +++ b/mysql-test/suite/innodb/r/bulk_load.result @@ -0,0 +1,50 @@ +CREATE TABLE t1(f1 INT NOT NULL,f2 INT NOT NULL)ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, seq from seq_1_to_131072; +INSERT INTO t1 VALUES(131073, 131073), (131074, 131073); +SELECT * INTO OUTFILE "VARDIR/tmp/t1.outfile" FROM t1; +# successful load statement using bulk insert +CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY, +f2 INT NOT NULL)ENGINE=InnoDB; +SET unique_checks=0, foreign_key_checks=0; +LOAD DATA INFILE 'VARDIR/tmp/t1.outfile' INTO TABLE t2; +SELECT COUNT(*) FROM t2; +COUNT(*) +131074 +CHECK TABLE t2 EXTENDED; +Table Op Msg_type Msg_text +test.t2 check status OK +DROP TABLE t2; +CREATE TABLE t2(f1 INT NOT NULL, PRIMARY KEY(f1 DESC), +f2 INT NOT NULL)ENGINE=InnoDB; +LOAD DATA INFILE 'VARDIR/tmp/t1.outfile' INTO TABLE t2; +SELECT COUNT(*) FROM t2; +COUNT(*) +131074 +CHECK TABLE t2 EXTENDED; +Table Op Msg_type Msg_text +test.t2 check status OK +DROP TABLE t2; +# load statement using bulk insert fails during secondary index +CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY, +f2 INT NOT NULL UNIQUE KEY)ENGINE=InnoDB; +LOAD DATA INFILE 'VARDIR/tmp/t1.outfile' INTO TABLE t2; +ERROR HY000: Got error 1 "Operation not permitted" during COMMIT +SELECT COUNT(*) FROM t2; +COUNT(*) +0 +CHECK TABLE t2 EXTENDED; +Table Op Msg_type Msg_text +test.t2 check status OK +DROP TABLE t2; +# load statement using bulk insert fails during primary index +CREATE TABLE t2(f1 INT NOT NULL, +f2 INT NOT NULL PRIMARY KEY)ENGINE=InnoDB; +LOAD DATA INFILE 'VARDIR/tmp/t1.outfile' INTO TABLE t2; +ERROR 23000: Duplicate entry '131073' for key 'PRIMARY' +SELECT COUNT(*) FROM t2; +COUNT(*) +0 +CHECK TABLE t2 EXTENDED; +Table Op Msg_type Msg_text +test.t2 check status OK +DROP TABLE t2, t1; diff --git a/mysql-test/suite/innodb/r/create_select.result b/mysql-test/suite/innodb/r/create_select.result index 183705680bd..e3c130c3ad1 100644 --- a/mysql-test/suite/innodb/r/create_select.result +++ b/mysql-test/suite/innodb/r/create_select.result @@ -3,7 +3,6 @@ connection default; CREATE TABLE t1 ENGINE=InnoDB SELECT * FROM seq_1_to_100000000; connection con1; KILL QUERY @id; -disconnect con1; connection default; ERROR 70100: Query execution was interrupted CREATE TABLE t1 (a SERIAL) ENGINE=InnoDB; @@ -18,3 +17,26 @@ execute stmt; execute stmt; drop table t; # End of 10.5 tests +# +# MDEV-35647 Possible hang during CREATE TABLE…SELECT error handling +# +call mtr.add_suppression("InnoDB: DROP TABLE `test`\\.`t4`: Record changed"); +SET @save_debug= @@GLOBAL.innodb_evict_tables_on_commit_debug; +SET GLOBAL innodb_evict_tables_on_commit_debug=on; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +SET GLOBAL innodb_evict_tables_on_commit_debug=@save_debug; +connection con1; +CREATE TABLE t2 (b BLOB) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),('2025-01-21 00:00:00'); +SET STATEMENT innodb_snapshot_isolation=ON FOR +CREATE TABLE t3 ENGINE=InnoDB AS SELECT * FROM t1; +connection default; +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; +SET STATEMENT innodb_snapshot_isolation=ON FOR +CREATE TABLE t4 (b BLOB CHECK (b)) ENGINE=InnoDB AS SELECT b FROM t2; +ERROR 22007: Truncated incorrect DOUBLE value: '2025-01-21 00:00:00' +connection con1; +disconnect con1; +connection default; +DROP TABLE t3,t2,t1; +# End of 10.6 tests diff --git a/mysql-test/suite/innodb/r/foreign-keys.result b/mysql-test/suite/innodb/r/foreign-keys.result index 0cc016bbc8f..d609efb1fd4 100644 --- a/mysql-test/suite/innodb/r/foreign-keys.result +++ b/mysql-test/suite/innodb/r/foreign-keys.result @@ -243,3 +243,25 @@ Level Code Message Warning 140 InnoDB: PAGE_COMPRESSED table can't have ROW_TYPE=COMPRESSED 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 +# End of 10.5 tests +# +# MDEV-35598 foreign key error is unnecessary truncated +# +set names utf8; +create table t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш +(f1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш int not null primary key, +f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш int not null +) engine=innodb; +create table t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш +(f1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш varchar(100), +f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш int not null, +index i2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш +(f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш) +) engine=innodb; +insert t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш values(99, 2); +alter table t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш add foreign key(f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш) references t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш(f1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш); +insert t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш values('g', 3); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш`, CONSTRAINT `t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш_ibfk_1` FOREIGN KEY (`f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш`) REFERENCES `t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш` (`f1яяяяяяяяяяььььььььььззззз +drop table t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш, +t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш; +# End of 10.6 tests diff --git a/mysql-test/suite/innodb/r/foreign_key.result b/mysql-test/suite/innodb/r/foreign_key.result index 65edeb4b9c3..7826a88a750 100644 --- a/mysql-test/suite/innodb/r/foreign_key.result +++ b/mysql-test/suite/innodb/r/foreign_key.result @@ -164,9 +164,6 @@ DELETE FROM parent; ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `parent` (`a`) ON DELETE CASCADE) ALTER TABLE child ADD INDEX(a); DELETE FROM parent; -ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `parent` (`a`) ON DELETE CASCADE) -ALTER TABLE child FORCE; -DELETE FROM parent; DROP TABLE child,parent; SELECT unique_constraint_name FROM information_schema.referential_constraints WHERE table_name = 't2'; @@ -1027,6 +1024,23 @@ t2 CREATE TABLE `t2` ( CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci drop tables t2, t1; +# +# MDEV-29182 Assertion fld->field_no < table->n_v_def failed on cascade +# +CREATE TABLE t1(a INT PRIMARY KEY, b VARCHAR(3), c INT AS (LENGTH(b)) VIRTUAL, +INDEX(c)) ENGINE=InnoDB; +CREATE TABLE t2(a INT REFERENCES t1(a) ON UPDATE CASCADE, +b INT GENERATED ALWAYS AS(a) VIRTUAL, INDEX(b)) ENGINE=InnoDB; +INSERT INTO t1 SET a=1,b='fu'; +INSERT INTO t2 SET a=1; +UPDATE t1 SET a=2,b='bar'; +SELECT * FROM t1; +a b c +2 bar 3 +SELECT * FROM t2; +a b +2 2 +DROP TABLE t2,t1; # End of 10.5 tests # # MDEV-26554 Table-rebuilding DDL on parent table causes crash @@ -1122,6 +1136,56 @@ test.binaries check status OK test.collections check status OK disconnect con1; DROP TABLE binaries, collections; +CREATE SCHEMA `#mysql50##mysql50#d-b`; +CREATE TABLE `#mysql50##mysql50#d-b`.t1 (a INT PRIMARY KEY, b INT UNIQUE) engine=InnoDB; +USE `#mysql50##mysql50#d-b`; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT UNIQUE REFERENCES t1(b)) ENGINE=InnoDB; +SET STATEMENT foreign_key_checks=0 FOR +ALTER TABLE t2 ADD FOREIGN KEY (a) REFERENCES t1(a); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) NOT NULL, + `b` int(11) DEFAULT NULL, + PRIMARY KEY (`a`), + UNIQUE KEY `b` (`b`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`b`), + CONSTRAINT `t2_ibfk_2` FOREIGN KEY (`a`) REFERENCES `t1` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +INSERT INTO t1 SET a=1; +INSERT INTO t2 SET a=1; +DELETE FROM t1; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`#mysql50#d-b`.`t2`, CONSTRAINT `t2_ibfk_2` FOREIGN KEY (`a`) REFERENCES `t1` (`a`)) +DELETE FROM t2; +DELETE FROM t1; +DROP DATABASE `#mysql50##mysql50#d-b`; +USE test; +# +# MDEV-35962 CREATE INDEX fails to heal a FOREIGN KEY constraint +# +CREATE TABLE t2 (b INT, FOREIGN KEY (b) REFERENCES t1(a)) ENGINE=InnoDB; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +SET STATEMENT foreign_key_checks=0 FOR +CREATE TABLE t2 (b INT, FOREIGN KEY (b) REFERENCES t1(a)) ENGINE=InnoDB; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed") +SET STATEMENT foreign_key_checks=0 FOR +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`a`)) +ALTER TABLE t1 ADD KEY(a), ALGORITHM=NOCOPY; +INSERT INTO t2 VALUES (1); +DROP INDEX b ON t2; +ERROR HY000: Cannot drop index 'b': needed in a foreign key constraint +SET STATEMENT foreign_key_checks=0 FOR +DROP INDEX b ON t2; +DELETE FROM t2; +DELETE FROM t1; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`b`) REFERENCES `t1` (`a`)) +ALTER TABLE t2 ADD KEY(b), ALGORITHM=NOCOPY; +DELETE FROM t1; +DROP TABLE t2, t1; # End of 10.6 tests CREATE TABLE t1 ( diff --git a/mysql-test/suite/innodb/r/foreign_sql_mode,COPY,NON-STRICT.rdiff b/mysql-test/suite/innodb/r/foreign_sql_mode,COPY,NON-STRICT.rdiff new file mode 100644 index 00000000000..66e39ca633e --- /dev/null +++ b/mysql-test/suite/innodb/r/foreign_sql_mode,COPY,NON-STRICT.rdiff @@ -0,0 +1,57 @@ +--- foreign_sql_mode.result ++++ foreign_sql_mode,COPY,NON-STRICT.rdiff +@@ -3,14 +3,14 @@ + CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; + CREATE TABLE t2(f1 INT, FOREIGN KEY(f1) REFERENCES t1(f2) ON UPDATE CASCADE)ENGINE=InnoDB; + ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL; +-ERROR HY000: Column 'f1' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t2 VALUES(1); + UPDATE t1 SET f2= NULL; ++ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f2`) ON UPDATE CASCADE) + DELETE FROM t2; + SELECT * FROM t1; + f1 f2 +-1 NULL ++1 1 + UPDATE t1 SET f2 = NULL; + SELECT * FROM t1; + f1 f2 +@@ -20,7 +20,7 @@ + CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; + CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY(f1) REFERENCES t1(f1) ON UPDATE SET NULL)ENGINE=InnoDB; + ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL; +-ERROR HY000: Column 'f1' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL ++ERROR HY000: Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME' (errno: 150 "Foreign key constraint is incorrectly formed") + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t2 VALUES(1, 1); + UPDATE t1 SET f1= 2; +@@ -32,7 +32,7 @@ + CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; + CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY (f2) REFERENCES t1(f2) ON DELETE SET NULL)ENGINE=InnoDB; + ALTER TABLE t2 MODIFY COLUMN f2 INT NOT NULL; +-ERROR HY000: Column 'f2' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL ++ERROR HY000: Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME' (errno: 150 "Foreign key constraint is incorrectly formed") + DROP TABLE t2, t1; + # modify parent column NULL ON UPDATE CASCADE child column NOT NULL + CREATE TABLE `t#1`(f1 INT, f2 INT NOT NULL, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +@@ -40,11 +40,10 @@ + FOREIGN KEY(f1) REFERENCES `t#1`(f2) + ON UPDATE CASCADE)ENGINE=InnoDB; + ALTER TABLE `t#1` MODIFY COLUMN f2 INT; +-ERROR HY000: Cannot change column 'f2': used in a foreign key constraint 't#2_ibfk_1' of table 'test.t#2' + INSERT INTO `t#1` VALUES(1, 1); + INSERT INTO `t#2` VALUES(1); + UPDATE `t#1` SET f2= NULL; +-ERROR 23000: Column 'f2' cannot be null ++ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t#2`, CONSTRAINT `t#2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t#1` (`f2`) ON UPDATE CASCADE) + DELETE FROM `t#2`; + SELECT * FROM `t#1`; + f1 f2 +@@ -60,6 +59,5 @@ + PRIMARY KEY(f1, f2), + FOREIGN KEY(f2, f3) REFERENCES t1(f2, f1) + ON UPDATE CASCADE)ENGINE=InnoDB; +-ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") + DROP TABLE IF EXISTS t2; + DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/innodb/r/foreign_sql_mode,COPY,NOSTRICT.rdiff b/mysql-test/suite/innodb/r/foreign_sql_mode,COPY,NOSTRICT.rdiff new file mode 100644 index 00000000000..95df1bfa7d3 --- /dev/null +++ b/mysql-test/suite/innodb/r/foreign_sql_mode,COPY,NOSTRICT.rdiff @@ -0,0 +1,55 @@ +--- foreign_sql_mode.result 2025-01-21 17:23:46.014938931 +0530 ++++ foreign_sql_mode.reject 2025-01-21 17:24:11.783981181 +0530 +@@ -3,20 +3,20 @@ + CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; + CREATE TABLE t2(f1 INT, FOREIGN KEY(f1) REFERENCES t1(f2) ON UPDATE CASCADE)ENGINE=InnoDB; + ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL; +-ERROR HY000: Column 'f1' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t2 VALUES(1); + UPDATE t1 SET f2= NULL; ++ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f2`) ON UPDATE CASCADE) + DELETE FROM t2; + SELECT * FROM t1; + f1 f2 +-1 NULL ++1 1 + DROP TABLE t2, t1; + # modify child column NOT NULL ON UPDATE SET NULL + CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; + CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY(f1) REFERENCES t1(f1) ON UPDATE SET NULL)ENGINE=InnoDB; + ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL; +-ERROR HY000: Column 'f1' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL ++ERROR HY000: Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME' (errno: 150 "Foreign key constraint is incorrectly formed") + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t2 VALUES(1, 1); + UPDATE t1 SET f1= 2; +@@ -28,7 +28,7 @@ + CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; + CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY (f2) REFERENCES t1(f2) ON DELETE SET NULL)ENGINE=InnoDB; + ALTER TABLE t2 MODIFY COLUMN f2 INT NOT NULL; +-ERROR HY000: Column 'f2' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL ++ERROR HY000: Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME' (errno: 150 "Foreign key constraint is incorrectly formed") + DROP TABLE t2, t1; + # modify parent column NULL ON UPDATE CASCADE child column NOT NULL + CREATE TABLE `t#1`(f1 INT, f2 INT NOT NULL, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +@@ -36,11 +36,10 @@ + FOREIGN KEY(f1) REFERENCES `t#1`(f2) + ON UPDATE CASCADE)ENGINE=InnoDB; + ALTER TABLE `t#1` MODIFY COLUMN f2 INT; +-ERROR HY000: Cannot change column 'f2': used in a foreign key constraint 't#2_ibfk_1' of table 'test.t#2' + INSERT INTO `t#1` VALUES(1, 1); + INSERT INTO `t#2` VALUES(1); + UPDATE `t#1` SET f2= NULL; +-ERROR 23000: Column 'f2' cannot be null ++ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t#2`, CONSTRAINT `t#2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t#1` (`f2`) ON UPDATE CASCADE) + DELETE FROM `t#2`; + SELECT * FROM `t#1`; + f1 f2 +@@ -56,6 +55,5 @@ + PRIMARY KEY(f1, f2), + FOREIGN KEY(f2, f3) REFERENCES t1(f2, f1) + ON UPDATE CASCADE)ENGINE=InnoDB; +-ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") + DROP TABLE IF EXISTS t2; + DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/innodb/r/foreign_sql_mode,INPLACE,NON-STRICT.rdiff b/mysql-test/suite/innodb/r/foreign_sql_mode,INPLACE,NON-STRICT.rdiff new file mode 100644 index 00000000000..8919244e810 --- /dev/null +++ b/mysql-test/suite/innodb/r/foreign_sql_mode,INPLACE,NON-STRICT.rdiff @@ -0,0 +1,39 @@ +--- foreign_sql_mode.result ++++ foreign_sql_mode,INPLACE,NON-STRICT.rdiff +@@ -3,14 +3,14 @@ + CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; + CREATE TABLE t2(f1 INT, FOREIGN KEY(f1) REFERENCES t1(f2) ON UPDATE CASCADE)ENGINE=InnoDB; + ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL; +-ERROR HY000: Column 'f1' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t2 VALUES(1); + UPDATE t1 SET f2= NULL; ++ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f2`) ON UPDATE CASCADE) + DELETE FROM t2; + SELECT * FROM t1; + f1 f2 +-1 NULL ++1 1 + UPDATE t1 SET f2 = NULL; + SELECT * FROM t1; + f1 f2 +@@ -40,11 +40,10 @@ + FOREIGN KEY(f1) REFERENCES `t#1`(f2) + ON UPDATE CASCADE)ENGINE=InnoDB; + ALTER TABLE `t#1` MODIFY COLUMN f2 INT; +-ERROR HY000: Cannot change column 'f2': used in a foreign key constraint 't#2_ibfk_1' of table 'test.t#2' + INSERT INTO `t#1` VALUES(1, 1); + INSERT INTO `t#2` VALUES(1); + UPDATE `t#1` SET f2= NULL; +-ERROR 23000: Column 'f2' cannot be null ++ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t#2`, CONSTRAINT `t#2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t#1` (`f2`) ON UPDATE CASCADE) + DELETE FROM `t#2`; + SELECT * FROM `t#1`; + f1 f2 +@@ -60,6 +59,5 @@ + PRIMARY KEY(f1, f2), + FOREIGN KEY(f2, f3) REFERENCES t1(f2, f1) + ON UPDATE CASCADE)ENGINE=InnoDB; +-ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") + DROP TABLE IF EXISTS t2; + DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/innodb/r/foreign_sql_mode.result b/mysql-test/suite/innodb/r/foreign_sql_mode.result new file mode 100644 index 00000000000..7044e402745 --- /dev/null +++ b/mysql-test/suite/innodb/r/foreign_sql_mode.result @@ -0,0 +1,65 @@ +call mtr.add_suppression("InnoDB: In ALTER TABLE .* has or is referenced in foreign key constraints which are not compatible with the new table definition."); +# modify child column NOT NULL on UPDATE CASCADE..parent column NULL +CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, FOREIGN KEY(f1) REFERENCES t1(f2) ON UPDATE CASCADE)ENGINE=InnoDB; +ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL; +ERROR HY000: Column 'f1' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL +INSERT INTO t1 VALUES(1, 1); +INSERT INTO t2 VALUES(1); +UPDATE t1 SET f2= NULL; +DELETE FROM t2; +SELECT * FROM t1; +f1 f2 +1 NULL +UPDATE t1 SET f2 = NULL; +SELECT * FROM t1; +f1 f2 +1 NULL +DROP TABLE t2, t1; +# modify child column NOT NULL ON UPDATE SET NULL +CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY(f1) REFERENCES t1(f1) ON UPDATE SET NULL)ENGINE=InnoDB; +ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL; +ERROR HY000: Column 'f1' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL +INSERT INTO t1 VALUES(1, 1); +INSERT INTO t2 VALUES(1, 1); +UPDATE t1 SET f1= 2; +SELECT * FROM t2; +f1 f2 +NULL 1 +DROP TABLE t2, t1; +# modify child column NOT NULL ON DELETE SET NULL +CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY (f2) REFERENCES t1(f2) ON DELETE SET NULL)ENGINE=InnoDB; +ALTER TABLE t2 MODIFY COLUMN f2 INT NOT NULL; +ERROR HY000: Column 'f2' cannot be NOT NULL: needed in a foreign key constraint 't2_ibfk_1' SET NULL +DROP TABLE t2, t1; +# modify parent column NULL ON UPDATE CASCADE child column NOT NULL +CREATE TABLE `t#1`(f1 INT, f2 INT NOT NULL, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE `t#2`(f1 INT NOT NULL, +FOREIGN KEY(f1) REFERENCES `t#1`(f2) +ON UPDATE CASCADE)ENGINE=InnoDB; +ALTER TABLE `t#1` MODIFY COLUMN f2 INT; +ERROR HY000: Cannot change column 'f2': used in a foreign key constraint 't#2_ibfk_1' of table 'test.t#2' +INSERT INTO `t#1` VALUES(1, 1); +INSERT INTO `t#2` VALUES(1); +UPDATE `t#1` SET f2= NULL; +ERROR 23000: Column 'f2' cannot be null +DELETE FROM `t#2`; +SELECT * FROM `t#1`; +f1 f2 +1 1 +DROP TABLE `t#2`, `t#1`; +CREATE TABLE t1(f1 INT NOT NULL AUTO_INCREMENT, +f2 INT DEFAULT NULL, +PRIMARY KEY(f1), +FOREIGN KEY(f2) REFERENCES t1(f1))ENGINE=InnoDB; +CREATE TABLE t2 (f1 INT NOT NULL, +f2 INT NOT NULL, +f3 INT DEFAULT NULL, +PRIMARY KEY(f1, f2), +FOREIGN KEY(f2, f3) REFERENCES t1(f2, f1) +ON UPDATE CASCADE)ENGINE=InnoDB; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +DROP TABLE IF EXISTS t2; +DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/innodb/r/import_cfg.result b/mysql-test/suite/innodb/r/import_cfg.result new file mode 100644 index 00000000000..163252c4dac --- /dev/null +++ b/mysql-test/suite/innodb/r/import_cfg.result @@ -0,0 +1,67 @@ +# +# MDEV-35169 ALTER TABLE...IMPORT TABLESPACE does not +# work with INDEX DESC +# +# prepare cfg for primary key with desc column +create table t1 (pk int, a int, primary key(pk desc)) engine=InnoDB; +insert into t1 values (1,10),(2,20),(3,15); +flush table t1 for export; +unlock tables; +drop table t1; +# prepare cfg for secondary index with desc column +create table t1 (pk int primary key, a int,key(a desc)) engine=InnoDB; +insert into t1 values (1,10),(2,20),(3,15); +flush table t1 for export; +unlock tables; +drop table t1; +# prepare cfg for secondary index with ascending column +create table t1 (pk int primary key, a int, key(a)) engine=InnoDB; +insert into t1 values (1,10),(2,20),(3,15); +flush table t1 for export; +unlock tables; +drop table t1; +# Import desc tablespace into desc frm +# Import into table with desc primary key column +create table t1 (pk int, a int, primary key(pk desc)) engine=InnoDB; +alter table t1 discard tablespace; +alter table t1 import tablespace; +check table t1 extended; +Table Op Msg_type Msg_text +test.t1 check status OK +drop table t1; +# Import into table with desc secondary index +create table t1 (pk int primary key, a int, key(a desc))engine=InnoDB; +alter table t1 discard tablespace; +alter table t1 import tablespace; +check table t1 extended; +Table Op Msg_type Msg_text +test.t1 check status OK +drop table t1; +# Import asc tablespace into desc frm +create table t1 (pk int primary key, a int, key(a desc))engine=InnoDB; +alter table t1 discard tablespace; +alter table t1 import tablespace; +ERROR HY000: Schema mismatch (Index a field a is DESC which does not match with .cfg file) +check table t1 extended; +Table Op Msg_type Msg_text +test.t1 check Error Tablespace has been discarded for table `t1` +test.t1 check error Corrupt +drop table t1; +# Import desc tablespace into asc frm +create table t1 (pk int primary key, a int, key(a)) engine=InnoDB; +alter table t1 discard tablespace; +alter table t1 import tablespace; +ERROR HY000: Schema mismatch (Index a field a is ASC which does not match with .cfg file) +check table t1 extended; +Table Op Msg_type Msg_text +test.t1 check Error Tablespace has been discarded for table `t1` +test.t1 check error Corrupt +drop table t1; +# Import asc tablespace into asc frm +create table t1 (pk int primary key, a int, key(a)) engine=InnoDB; +alter table t1 discard tablespace; +alter table t1 import tablespace; +check table t1 extended; +Table Op Msg_type Msg_text +test.t1 check status OK +drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb-autoinc-56228.result b/mysql-test/suite/innodb/r/innodb-autoinc-56228.result index 6a3fd85ebd3..f8616772151 100644 --- a/mysql-test/suite/innodb/r/innodb-autoinc-56228.result +++ b/mysql-test/suite/innodb/r/innodb-autoinc-56228.result @@ -1,15 +1,6 @@ -DROP TABLE IF EXISTS t1_56228; -Warnings: -Note 1051 Unknown table 'test.t1_56228' -DROP TABLE IF EXISTS t2_56228; -Warnings: -Note 1051 Unknown table 'test.t2_56228' -DROP FUNCTION IF EXISTS bug56228; -Warnings: -Note 1305 FUNCTION test.bug56228 does not exist -CREATE TEMPORARY TABLE t1_56228( +CREATE TABLE t1_56228( c1 iNT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; -CREATE TEMPORARY TABLE t2_56228( +CREATE TABLE t2_56228( c1 iNT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; CREATE FUNCTION bug56228() RETURNS INT DETERMINISTIC BEGIN @@ -17,14 +8,18 @@ INSERT INTO t1_56228 VALUES(NULL); INSERT INTO t2_56228 VALUES(NULL); INSERT INTO t1_56228 VALUES(NULL); INSERT INTO t2_56228 VALUES(NULL); -DROP TEMPORARY TABLE t1_56228; +DROP TABLE t1_56228; RETURN 42; END // -SELECT bug56228(); -bug56228() -42 -DROP FUNCTION bug56228; -DROP TEMPORARY TABLE t2_56228; -DROP TEMPORARY TABLE IF EXISTS t1_56228; -Warnings: -Note 1051 Unknown table 'test.t1_56228' +ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger +CREATE PROCEDURE bug56228() +BEGIN +INSERT INTO t1_56228 VALUES(NULL); +INSERT INTO t2_56228 VALUES(NULL); +INSERT INTO t1_56228 VALUES(NULL); +INSERT INTO t2_56228 VALUES(NULL); +DROP TABLE t1_56228; +END // +CALL bug56228(); +DROP PROCEDURE bug56228; +DROP TABLE t2_56228; diff --git a/mysql-test/suite/innodb/r/innodb-wl5522-1.result b/mysql-test/suite/innodb/r/innodb-wl5522-1.result index 42c0631dd29..72d7268244f 100644 --- a/mysql-test/suite/innodb/r/innodb-wl5522-1.result +++ b/mysql-test/suite/innodb/r/innodb-wl5522-1.result @@ -659,6 +659,8 @@ NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 15000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 16000 ALTER TABLE testdb_wl5522.t1 ADD INDEX idx1 (col_1); ALTER TABLE testdb_wl5522.t1 ADD INDEX idx6 (col_1(255)); +Warnings: +Note 1831 Duplicate index `idx6`. This is deprecated and will be disallowed in a future release ALTER TABLE testdb_wl5522.t1 ADD INDEX idx10 (col_10(255)); SELECT col_1 = REPEAT("col1_00001",10), diff --git a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result index d28ae118705..4469db20c96 100644 --- a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result +++ b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result @@ -153,16 +153,6 @@ SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; CREATE TABLE t1 (c1 INT) ENGINE = Innodb; INSERT INTO t1 VALUES (1); -SET SESSION debug_dbug="+d,ib_export_io_write_failure_9"; -FLUSH TABLES t1 FOR EXPORT; -Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed -UNLOCK TABLES; -SET SESSION debug_dbug=@saved_debug_dbug; -DROP TABLE t1; -CREATE TABLE t1 (c1 INT) ENGINE = Innodb; -INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_10"; FLUSH TABLES t1 FOR EXPORT; Warnings: diff --git a/mysql-test/suite/innodb/r/innodb.result b/mysql-test/suite/innodb/r/innodb.result index 212d003015b..d2cdcdf9752 100644 --- a/mysql-test/suite/innodb/r/innodb.result +++ b/mysql-test/suite/innodb/r/innodb.result @@ -3353,4 +3353,10 @@ Table Op Msg_type Msg_text test.t1 check status OK ALTER TABLE t1 FORCE; DROP TABLE t1; +# +# MDEV-35723: applying zero offset to null pointer on INSERT +# +CREATE TABLE t1(c TEXT(1) NOT NULL, INDEX (c)) ENGINE=InnoDB; +INSERT INTO t1 SET c=''; +DROP TABLE t1; ALTER DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci; diff --git a/mysql-test/suite/innodb/r/innodb_information_schema.result b/mysql-test/suite/innodb/r/innodb_information_schema.result index 921b062eae3..608db358802 100644 Binary files a/mysql-test/suite/innodb/r/innodb_information_schema.result and b/mysql-test/suite/innodb/r/innodb_information_schema.result differ diff --git a/mysql-test/suite/innodb/r/log_file_size_online.result b/mysql-test/suite/innodb/r/log_file_size_online.result index 7b2b23bd776..8dcd9a47b2f 100644 --- a/mysql-test/suite/innodb/r/log_file_size_online.result +++ b/mysql-test/suite/innodb/r/log_file_size_online.result @@ -25,8 +25,14 @@ SET GLOBAL innodb_log_file_buffering=ON; SET GLOBAL innodb_log_file_buffering=@save; SET GLOBAL innodb_log_file_mmap=OFF; Got one of the listed errors -SET GLOBAL innodb_log_file_size=5242880; connect con1,localhost,root; +SET GLOBAL innodb_log_file_size=7340032; +connection default; +KILL QUERY @id; +connection con1; +connection default; +SET GLOBAL innodb_log_file_size=5242880; +connection con1; UPDATE t SET b='' WHERE a<10; connection default; SHOW VARIABLES LIKE 'innodb_log_file_size'; diff --git a/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff b/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff index 812632aceae..a5e4679eab6 100644 --- a/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff +++ b/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff @@ -1,2 +1,17 @@ -91a92 -> ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs +--- a/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result ++++ b/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result +@@ -81,7 +81,7 @@ f25(10), f26(10), f27(10), f28(10), + f29(10), f30(10), f31(10), f32(10), + f33(10))) + ENGINE=InnoDB; +-ERROR 42000: Too many key parts specified; max 32 parts allowed ++ERROR 42000: Specified key was too long; max key length is 1173 bytes + # + # MDEV-31161 Assertion failures upon adding a too long key + # to table with COMPRESSED row format +@@ -89,4 +89,5 @@ ERROR 42000: Too many key parts specified; max 32 parts allowed + CREATE TABLE t1(pk INT PRIMARY KEY, f1 INT, f2 TEXT)ENGINE=InnoDB ROW_FORMAT=COMPRESSED; + INSERT INTO t1 (pk) VALUES (1); + ALTER TABLE t1 ADD KEY (f1), ADD KEY (f2(1000)); ++ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs + DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/auto_increment_lock_mode.combinations b/mysql-test/suite/innodb/t/auto_increment_lock_mode.combinations new file mode 100644 index 00000000000..efaee252a4e --- /dev/null +++ b/mysql-test/suite/innodb/t/auto_increment_lock_mode.combinations @@ -0,0 +1,6 @@ +[old] +--innodb-autoinc-lock-mode=0 +[new] +--innodb-autoinc-lock-mode=1 +[none] +--innodb-autoinc-lock-mode=2 diff --git a/mysql-test/suite/innodb/t/auto_increment_lock_mode.test b/mysql-test/suite/innodb/t/auto_increment_lock_mode.test new file mode 100644 index 00000000000..27497960e72 --- /dev/null +++ b/mysql-test/suite/innodb/t/auto_increment_lock_mode.test @@ -0,0 +1,61 @@ +--source include/have_innodb.inc + +CREATE TABLE t1(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t3(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t4(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t5(a TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t6(a SERIAL, b INT) ENGINE=InnoDB; + +DELIMITER $$; +CREATE FUNCTION p1() RETURNS INT +BEGIN + INSERT INTO t1() VALUES(); + INSERT INTO t2() VALUES(); + INSERT INTO t3() VALUES(); + INSERT INTO t4() VALUES(); + INSERT INTO t5() VALUES(); + RETURN 1; +END$$ +DELIMITER ;$$ + +INSERT INTO t6(b) SELECT p1(); + +UPDATE t1,t2,t3,t4,t5 SET t1.a=2,t2.a=2,t3.a=2,t4.a=2,t5.a=2; +SELECT * FROM t1; +--source include/count_sessions.inc + +--connect(con1,localhost,root,,) +let $ID1= `SELECT @id := CONNECTION_ID()`; +--connect(con2,localhost,root,,) +let $ID2= `SELECT @id := CONNECTION_ID()`; +--connect(con3,localhost,root,,) +let $ID3= `SELECT @id := CONNECTION_ID()`; +--connection con1 +send INSERT INTO t6(b) SELECT SLEEP(p1()); +--connection con2 +send INSERT INTO t6(b) SELECT SLEEP(p1()); +--connection con3 +send UPDATE t1,t2,t3,t4,t5 SET t1.a=0,t2.a=0,t3.a=0,t4.a=0,t5.a=0 +WHERE t1.a=2 AND t2.a=2 AND t3.a=2 AND t4.a=2 AND t5.a=2; +--connection default +evalp KILL QUERY $ID1; +evalp KILL QUERY $ID2; +evalp KILL QUERY $ID3; +--connection con1 +--error 0,ER_QUERY_INTERRUPTED,ER_AUTOINC_READ_FAILED +--reap +--disconnect con1 +--connection con2 +--error 0,ER_QUERY_INTERRUPTED,ER_AUTOINC_READ_FAILED +--reap +--disconnect con2 +--connection con3 +--error 0,ER_QUERY_INTERRUPTED,ER_AUTOINC_READ_FAILED +--reap +--disconnect con3 +--connection default + +DROP FUNCTION p1; +DROP TABLE t1,t2,t3,t4,t5,t6; +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/avoid_deadlock_with_blocked.test b/mysql-test/suite/innodb/t/avoid_deadlock_with_blocked.test new file mode 100644 index 00000000000..aa55b1ba008 --- /dev/null +++ b/mysql-test/suite/innodb/t/avoid_deadlock_with_blocked.test @@ -0,0 +1,228 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/count_sessions.inc + +--disable_query_log +call mtr.add_suppression("InnoDB: Transaction was aborted due to "); +--enable_query_log + +connect stop_purge,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; + +--connect (con1,localhost,root,,) +--connect (con2,localhost,root,,) +--connect (con3,localhost,root,,) + +--connection default +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; +INSERT INTO t1 (id) VALUES (1); + +--echo # Simplest scenario: +--echo # , +--echo # , , +--echo # Before MDEV-34877: +--echo # , , +--echo # After MDEV-34877: +--echo # , , +--echo # Expected: instead of deadlocking, the con1's request should ingore con2's + +--connection con1 + BEGIN; + SELECT * FROM t1 LOCK IN SHARE MODE; + +--connection con2 + BEGIN; + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con2_will_wait'; + --send SELECT * FROM t1 FOR UPDATE + +--connection con1 + SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; + SELECT * FROM t1 FOR UPDATE; + COMMIT; + +--connection con2 + --reap + COMMIT; + +--echo # The scenario when we bypass X<-S pair: +--echo # , +--echo # , , +--echo # , , +--echo # , , , + +--connection con1 + BEGIN; + SELECT * FROM t1 LOCK IN SHARE MODE; + +--connection con2 + BEGIN; + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con2_will_wait'; + --send SELECT * FROM t1 FOR UPDATE + +--connection con3 + SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; + BEGIN; + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; + --send SELECT * FROM t1 LOCK IN SHARE MODE; + +--connection con1 + SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; + SELECT * FROM t1 FOR UPDATE; + COMMIT; + +--connection con2 + --reap + COMMIT; + +--connection con3 + --reap + COMMIT; + +# +--echo # A variant of the above scenario: +--echo # , +--echo # , , +--echo # , , +--echo # Expected: a deadlock, as INSERT INTENTION should not overtake locks on gap, to not slice them +--connection con1 + BEGIN; + SELECT * FROM t1 WHERE id=1 FOR UPDATE; + +--connection con2 + BEGIN; + SET DEBUG_SYNC = 'lock_wait_start SIGNAL con2_will_wait'; + --send SELECT * FROM t1 LOCK IN SHARE MODE + +--connection con1 + SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; + INSERT INTO t1 VALUES (0); + ROLLBACK; + +--connection con2 + --error ER_LOCK_DEADLOCK + --reap + COMMIT; + +--echo # More complicated scenario: +--echo # , +--echo # , , +--echo # , , +--echo # , , , +--echo # , , +--echo # Expected: a deadlock, as INSERT INTENTION should not overtake locks on gap, to not slice them + +--connection con1 + BEGIN; + SELECT * FROM t1 LOCK IN SHARE MODE; + +--connection con2 + BEGIN; + SELECT * FROM t1 WHERE id=1 LOCK IN SHARE MODE; + +--connection con3 + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; + --send SELECT * FROM t1 FOR UPDATE + +--connection con1 + SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; + SET DEBUG_SYNC = 'lock_wait_start SIGNAL con1_will_wait'; + --send INSERT INTO t1 VALUES (0) + +--connection con2 + SET DEBUG_SYNC = 'now WAIT_FOR con1_will_wait'; + COMMIT; + +--connection con1 + --reap + ROLLBACK; + +--connection con3 + --error ER_LOCK_DEADLOCK + --reap + +--echo # More complicated scenario. +--echo # , +--echo # , , +--echo # , , +--echo # , , , +--echo # Before MDEV-34877: +--echo # , , +--echo # After MDEV-34877: +--echo # , , + + +--connection con1 + BEGIN; + SELECT * FROM t1 LOCK IN SHARE MODE; + +--connection con2 + BEGIN; + SELECT * FROM t1 WHERE id=1 LOCK IN SHARE MODE; + +--connection default + +--connection con3 + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; + --send SELECT * FROM t1 FOR UPDATE + +--connection con1 + SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con1_will_wait'; + --send SELECT * FROM t1 WHERE id=1 FOR UPDATE + +--connection con2 + SET DEBUG_SYNC = 'now WAIT_FOR con1_will_wait'; + COMMIT; + +--connection con1 + --reap + COMMIT; + +--connection con3 + --reap + COMMIT; + +--echo # A secenario, where con1 has to bypass two transactions: +--echo # +--echo # +--echo # +--echo # Before MDEV-34877: +--echo # +--echo # After MDEV-34877: +--echo # +--connection con1 + BEGIN; + SELECT * FROM t1 LOCK IN SHARE MODE; + +--connection con2 + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con2_will_wait'; + --send SELECT * FROM t1 FOR UPDATE + +--connection con3 + SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait'; + SET DEBUG_SYNC = 'lock_wait_before_suspend SIGNAL con3_will_wait'; + --send SELECT * FROM t1 FOR UPDATE + +--connection con1 + SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait'; + SELECT * FROM t1 WHERE id=1 FOR UPDATE; + COMMIT; + +--connection con2 + --reap + COMMIT; + +--connection con3 + --reap + COMMIT; + +--connection default +--disconnect con1 +--disconnect con2 +--disconnect con3 +--disconnect stop_purge + +DROP TABLE t1; + +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/bulk_load.opt b/mysql-test/suite/innodb/t/bulk_load.opt new file mode 100644 index 00000000000..c856c2d215a --- /dev/null +++ b/mysql-test/suite/innodb/t/bulk_load.opt @@ -0,0 +1 @@ +--innodb_sort_buffer_size=65536 diff --git a/mysql-test/suite/innodb/t/bulk_load.test b/mysql-test/suite/innodb/t/bulk_load.test new file mode 100644 index 00000000000..30c25839ba2 --- /dev/null +++ b/mysql-test/suite/innodb/t/bulk_load.test @@ -0,0 +1,52 @@ +--source include/have_innodb.inc +--source include/have_sequence.inc +--source include/big_test.inc + +CREATE TABLE t1(f1 INT NOT NULL,f2 INT NOT NULL)ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, seq from seq_1_to_131072; +INSERT INTO t1 VALUES(131073, 131073), (131074, 131073); +--replace_result $MYSQLTEST_VARDIR VARDIR +--disable_cursor_protocol +--disable_ps2_protocol +eval SELECT * INTO OUTFILE "$MYSQLTEST_VARDIR/tmp/t1.outfile" FROM t1; +--enable_ps2_protocol +--enable_cursor_protocol + +--echo # successful load statement using bulk insert +CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY, + f2 INT NOT NULL)ENGINE=InnoDB; +SET unique_checks=0, foreign_key_checks=0; +--replace_result $MYSQLTEST_VARDIR VARDIR +eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2; +SELECT COUNT(*) FROM t2; +CHECK TABLE t2 EXTENDED; +DROP TABLE t2; + +CREATE TABLE t2(f1 INT NOT NULL, PRIMARY KEY(f1 DESC), + f2 INT NOT NULL)ENGINE=InnoDB; +--replace_result $MYSQLTEST_VARDIR VARDIR +eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2; +SELECT COUNT(*) FROM t2; +CHECK TABLE t2 EXTENDED; +DROP TABLE t2; + +--echo # load statement using bulk insert fails during secondary index +CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY, + f2 INT NOT NULL UNIQUE KEY)ENGINE=InnoDB; +--replace_result $MYSQLTEST_VARDIR VARDIR +--error ER_ERROR_DURING_COMMIT +eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2; +SELECT COUNT(*) FROM t2; +CHECK TABLE t2 EXTENDED; +DROP TABLE t2; + +--echo # load statement using bulk insert fails during primary index +CREATE TABLE t2(f1 INT NOT NULL, + f2 INT NOT NULL PRIMARY KEY)ENGINE=InnoDB; +--replace_result $MYSQLTEST_VARDIR VARDIR +--error ER_DUP_ENTRY +eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2; +SELECT COUNT(*) FROM t2; +CHECK TABLE t2 EXTENDED; +--remove_file $MYSQLTEST_VARDIR/tmp/t1.outfile +DROP TABLE t2, t1; diff --git a/mysql-test/suite/innodb/t/create_select.test b/mysql-test/suite/innodb/t/create_select.test index 053db79b8f4..46f793295bf 100644 --- a/mysql-test/suite/innodb/t/create_select.test +++ b/mysql-test/suite/innodb/t/create_select.test @@ -1,6 +1,7 @@ --source include/have_innodb.inc --source include/have_sequence.inc --source include/count_sessions.inc +--source include/maybe_debug.inc let $ID= `SELECT @id := CONNECTION_ID()`; @@ -17,7 +18,6 @@ let $wait_condition= and info = 'CREATE TABLE t1 ENGINE=InnoDB SELECT * FROM seq_1_to_100000000'; --source include/wait_condition.inc KILL QUERY @id; -disconnect con1; connection default; --error ER_QUERY_INTERRUPTED @@ -25,7 +25,6 @@ reap; CREATE TABLE t1 (a SERIAL) ENGINE=InnoDB; DROP TABLE t1; ---source include/wait_until_count_sessions.inc --echo # End of 10.2 tests @@ -39,3 +38,38 @@ execute stmt; drop table t; --echo # End of 10.5 tests + +--echo # +--echo # MDEV-35647 Possible hang during CREATE TABLE…SELECT error handling +--echo # +call mtr.add_suppression("InnoDB: DROP TABLE `test`\\.`t4`: Record changed"); + +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE +SET @save_debug= @@GLOBAL.innodb_evict_tables_on_commit_debug; +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE +SET GLOBAL innodb_evict_tables_on_commit_debug=on; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE +SET GLOBAL innodb_evict_tables_on_commit_debug=@save_debug; + +connection con1; +CREATE TABLE t2 (b BLOB) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1),('2025-01-21 00:00:00'); +--send +SET STATEMENT innodb_snapshot_isolation=ON FOR +CREATE TABLE t3 ENGINE=InnoDB AS SELECT * FROM t1; + +connection default; +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; +--error ER_TRUNCATED_WRONG_VALUE +SET STATEMENT innodb_snapshot_isolation=ON FOR +CREATE TABLE t4 (b BLOB CHECK (b)) ENGINE=InnoDB AS SELECT b FROM t2; +connection con1; +reap; +disconnect con1; +connection default; +DROP TABLE t3,t2,t1; + +--source include/wait_until_count_sessions.inc + +--echo # End of 10.6 tests diff --git a/mysql-test/suite/innodb/t/foreign-keys.test b/mysql-test/suite/innodb/t/foreign-keys.test index aeff7009402..6010ff0e3fc 100644 --- a/mysql-test/suite/innodb/t/foreign-keys.test +++ b/mysql-test/suite/innodb/t/foreign-keys.test @@ -272,3 +272,30 @@ SET FOREIGN_KEY_CHECKS=DEFAULT; --error ER_CANT_CREATE_TABLE CREATE TABLE t1(a SERIAL) ENGINE=InnoDB ROW_FORMAT=COMPRESSED PAGE_COMPRESSED=1; SHOW WARNINGS; + +--echo # End of 10.5 tests + +--echo # +--echo # MDEV-35598 foreign key error is unnecessary truncated +--echo # +set names utf8; +create table t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш +(f1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш int not null primary key, + f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш int not null +) engine=innodb; +create table t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш +(f1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш varchar(100), + f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш int not null, + index i2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш + (f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш) +) engine=innodb; + +insert t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш values(99, 2); +alter table t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш add foreign key(f2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш) references t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш(f1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш); + +--error ER_NO_REFERENCED_ROW_2 +insert t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш values('g', 3); +drop table t2яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш, + t1яяяяяяяяяяььььььььььззззззззззшшшшшшшшшш; + +--echo # End of 10.6 tests diff --git a/mysql-test/suite/innodb/t/foreign_key.test b/mysql-test/suite/innodb/t/foreign_key.test index 4b0dcc97e58..22fe7562558 100644 --- a/mysql-test/suite/innodb/t/foreign_key.test +++ b/mysql-test/suite/innodb/t/foreign_key.test @@ -4,6 +4,7 @@ --disable_query_log call mtr.add_suppression("InnoDB: Transaction was aborted due to "); +call mtr.add_suppression("Invalid \\(old\\?\\) table or database name '#mysql50#d-b'"); --enable_query_log SET GLOBAL innodb_stats_persistent = 0; @@ -141,9 +142,6 @@ INSERT INTO child SET a=1; --error ER_ROW_IS_REFERENCED_2 DELETE FROM parent; ALTER TABLE child ADD INDEX(a); ---error ER_ROW_IS_REFERENCED_2 -DELETE FROM parent; -ALTER TABLE child FORCE; DELETE FROM parent; DROP TABLE child,parent; @@ -1067,6 +1065,21 @@ alter table t2 add foreign key(a) references t1; show create table t2; drop tables t2, t1; + +--echo # +--echo # MDEV-29182 Assertion fld->field_no < table->n_v_def failed on cascade +--echo # +CREATE TABLE t1(a INT PRIMARY KEY, b VARCHAR(3), c INT AS (LENGTH(b)) VIRTUAL, + INDEX(c)) ENGINE=InnoDB; +CREATE TABLE t2(a INT REFERENCES t1(a) ON UPDATE CASCADE, + b INT GENERATED ALWAYS AS(a) VIRTUAL, INDEX(b)) ENGINE=InnoDB; +INSERT INTO t1 SET a=1,b='fu'; +INSERT INTO t2 SET a=1; +UPDATE t1 SET a=2,b='bar'; +SELECT * FROM t1; +SELECT * FROM t2; +DROP TABLE t2,t1; + --echo # End of 10.5 tests --echo # @@ -1188,6 +1201,50 @@ CHECK TABLE binaries, collections EXTENDED; # Cleanup DROP TABLE binaries, collections; +CREATE SCHEMA `#mysql50##mysql50#d-b`; +CREATE TABLE `#mysql50##mysql50#d-b`.t1 (a INT PRIMARY KEY, b INT UNIQUE) engine=InnoDB; +USE `#mysql50##mysql50#d-b`; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT UNIQUE REFERENCES t1(b)) ENGINE=InnoDB; +SET STATEMENT foreign_key_checks=0 FOR +ALTER TABLE t2 ADD FOREIGN KEY (a) REFERENCES t1(a); +SHOW CREATE TABLE t2; +INSERT INTO t1 SET a=1; +INSERT INTO t2 SET a=1; +--error ER_ROW_IS_REFERENCED_2 +DELETE FROM t1; +DELETE FROM t2; +DELETE FROM t1; +DROP DATABASE `#mysql50##mysql50#d-b`; +USE test; + +--echo # +--echo # MDEV-35962 CREATE INDEX fails to heal a FOREIGN KEY constraint +--echo # + +--error ER_CANT_CREATE_TABLE +CREATE TABLE t2 (b INT, FOREIGN KEY (b) REFERENCES t1(a)) ENGINE=InnoDB; +SET STATEMENT foreign_key_checks=0 FOR +CREATE TABLE t2 (b INT, FOREIGN KEY (b) REFERENCES t1(a)) ENGINE=InnoDB; +--error ER_CANT_CREATE_TABLE +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +SET STATEMENT foreign_key_checks=0 FOR +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO t2 VALUES (1); +ALTER TABLE t1 ADD KEY(a), ALGORITHM=NOCOPY; +INSERT INTO t2 VALUES (1); +--error ER_DROP_INDEX_FK +DROP INDEX b ON t2; +SET STATEMENT foreign_key_checks=0 FOR +DROP INDEX b ON t2; +DELETE FROM t2; +--error ER_ROW_IS_REFERENCED_2 +DELETE FROM t1; +ALTER TABLE t2 ADD KEY(b), ALGORITHM=NOCOPY; +DELETE FROM t1; +DROP TABLE t2, t1; + --echo # End of 10.6 tests CREATE TABLE t1 diff --git a/mysql-test/suite/innodb/t/foreign_sql_mode.combinations b/mysql-test/suite/innodb/t/foreign_sql_mode.combinations new file mode 100644 index 00000000000..e84e17b06ac --- /dev/null +++ b/mysql-test/suite/innodb/t/foreign_sql_mode.combinations @@ -0,0 +1,2 @@ +[COPY] +[INPLACE] diff --git a/mysql-test/suite/innodb/t/foreign_sql_mode.test b/mysql-test/suite/innodb/t/foreign_sql_mode.test new file mode 100644 index 00000000000..1569348df07 --- /dev/null +++ b/mysql-test/suite/innodb/t/foreign_sql_mode.test @@ -0,0 +1,129 @@ +--source include/have_innodb.inc +--source alter_sql_mode.inc +call mtr.add_suppression("InnoDB: In ALTER TABLE .* has or is referenced in foreign key constraints which are not compatible with the new table definition."); + +let $combination=`select regexp_replace('$MTR_COMBINATIONS', 'innodb,\|,innodb', '')`; + +let $copy_algo=`select ((strcmp(substring_index('$combination', ",", 1), "COPY") = 0) or (strcmp(substring_index('$combination', ",", -1), "COPY") = 0))`; + +let $inplace_algo=`select ((strcmp(substring_index('$combination', ",", 1), "INPLACE") = 0) or (strcmp(substring_index('$combination', ",", -1), "INPLACE") = 0))`; + +let $algorithm=COPY; +if ($inplace_algo) +{ + let $algorithm=INPLACE; +} +let $sql_mode = `SELECT @@SQL_MODE`; +let $error_code = 0; +if ($sql_mode == "STRICT_TRANS_TABLES") { + let $error_code = ER_FK_COLUMN_NOT_NULL; +} + +--echo # modify child column NOT NULL on UPDATE CASCADE..parent column NULL +CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, FOREIGN KEY(f1) REFERENCES t1(f2) ON UPDATE CASCADE)ENGINE=InnoDB; +replace_result ,ALGORITHM=COPY '' ,ALGORITHM=INPLACE ''; +--error $error_code +eval ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL,ALGORITHM=$algorithm; +INSERT INTO t1 VALUES(1, 1); +INSERT INTO t2 VALUES(1); + +let $dml_error_code = ER_ROW_IS_REFERENCED_2; +if ($sql_mode == "STRICT_TRANS_TABLES") +{ + let $dml_error_code = 0; +} + +--error $dml_error_code +UPDATE t1 SET f2= NULL; +DELETE FROM t2; +SELECT * FROM t1; +UPDATE t1 SET f2 = NULL; +SELECT * FROM t1; +DROP TABLE t2, t1; + +let $error_code= ER_ERROR_ON_RENAME; +if ($algorithm == "INPLACE") +{ + let $error_code= ER_FK_COLUMN_NOT_NULL; +} + +if ($sql_mode == "STRICT_TRANS_TABLES") +{ + let $error_code = ER_FK_COLUMN_NOT_NULL; +} + +# Modifying referenced column from NULL to NOT NULL fails when foreign +# clause is ON UPDATE SET NULL or ON DELETE SET NULL irrespective +# of SQL_MODE variable. This is the behaviour even before MDEV-34392 + +--echo # modify child column NOT NULL ON UPDATE SET NULL +CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY(f1) REFERENCES t1(f1) ON UPDATE SET NULL)ENGINE=InnoDB; +replace_result ,ALGORITHM=COPY '' ,ALGORITHM=INPLACE ''; +--replace_regex /Error on rename of '.*' to '.*'/Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME'/ +--error $error_code +eval ALTER TABLE t2 MODIFY COLUMN f1 INT NOT NULL,ALGORITHM=$algorithm; +INSERT INTO t1 VALUES(1, 1); +INSERT INTO t2 VALUES(1, 1); +UPDATE t1 SET f1= 2; +SELECT * FROM t2; +DROP TABLE t2, t1; + +--echo # modify child column NOT NULL ON DELETE SET NULL +CREATE TABLE t1(f1 INT, f2 INT, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, f2 INT, FOREIGN KEY (f2) REFERENCES t1(f2) ON DELETE SET NULL)ENGINE=InnoDB; +replace_result ,ALGORITHM=COPY '' ,ALGORITHM=INPLACE ''; +--replace_regex /Error on rename of '.*' to '.*'/Error on rename of 'OLD_FILE_NAME' to 'NEW_FILE_NAME'/ +--error $error_code +eval ALTER TABLE t2 MODIFY COLUMN f2 INT NOT NULL,ALGORITHM=$algorithm; +DROP TABLE t2, t1; + +if ($sql_mode == "STRICT_TRANS_TABLES") +{ + let $dml_error_code = ER_BAD_NULL_ERROR; +} + +let $error_code= 0; +if ($sql_mode == "STRICT_TRANS_TABLES") +{ + let $error_code = ER_FK_COLUMN_CANNOT_CHANGE_CHILD; +} + +--echo # modify parent column NULL ON UPDATE CASCADE child column NOT NULL +CREATE TABLE `t#1`(f1 INT, f2 INT NOT NULL, PRIMARY KEY(f1), KEY(f2))ENGINE=InnoDB; +CREATE TABLE `t#2`(f1 INT NOT NULL, + FOREIGN KEY(f1) REFERENCES `t#1`(f2) + ON UPDATE CASCADE)ENGINE=InnoDB; +replace_result ,ALGORITHM=COPY '' ,ALGORITHM=INPLACE ''; +--error $error_code +eval ALTER TABLE `t#1` MODIFY COLUMN f2 INT,ALGORITHM=$algorithm; +INSERT INTO `t#1` VALUES(1, 1); +INSERT INTO `t#2` VALUES(1); +--error $dml_error_code +UPDATE `t#1` SET f2= NULL; +DELETE FROM `t#2`; +SELECT * FROM `t#1`; +DROP TABLE `t#2`, `t#1`; + +let $error_code= 0; +if ($sql_mode == "STRICT_TRANS_TABLES") +{ + let $error_code = ER_CANT_CREATE_TABLE; +} + +CREATE TABLE t1(f1 INT NOT NULL AUTO_INCREMENT, + f2 INT DEFAULT NULL, + PRIMARY KEY(f1), + FOREIGN KEY(f2) REFERENCES t1(f1))ENGINE=InnoDB; +--error $error_code +CREATE TABLE t2 (f1 INT NOT NULL, + f2 INT NOT NULL, + f3 INT DEFAULT NULL, + PRIMARY KEY(f1, f2), + FOREIGN KEY(f2, f3) REFERENCES t1(f2, f1) + ON UPDATE CASCADE)ENGINE=InnoDB; +--disable_warnings +DROP TABLE IF EXISTS t2; +--enable_warnings +DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/innodb/t/import_cfg.test b/mysql-test/suite/innodb/t/import_cfg.test new file mode 100644 index 00000000000..1f518c65886 --- /dev/null +++ b/mysql-test/suite/innodb/t/import_cfg.test @@ -0,0 +1,85 @@ +--source include/have_innodb.inc +--let $datadir= `select @@datadir` + +--echo # +--echo # MDEV-35169 ALTER TABLE...IMPORT TABLESPACE does not +--echo # work with INDEX DESC +--echo # + +--echo # prepare cfg for primary key with desc column +create table t1 (pk int, a int, primary key(pk desc)) engine=InnoDB; +insert into t1 values (1,10),(2,20),(3,15); +flush table t1 for export; +--copy_file $datadir/test/t1.ibd $datadir/test/t1_pk.ibd.desc +--copy_file $datadir/test/t1.cfg $datadir/test/t1_pk.cfg.desc +unlock tables; +drop table t1; + +--echo # prepare cfg for secondary index with desc column +create table t1 (pk int primary key, a int,key(a desc)) engine=InnoDB; +insert into t1 values (1,10),(2,20),(3,15); +flush table t1 for export; +--copy_file $datadir/test/t1.ibd $datadir/test/t1.ibd.desc +--copy_file $datadir/test/t1.cfg $datadir/test/t1.cfg.desc +unlock tables; +drop table t1; + +--echo # prepare cfg for secondary index with ascending column +create table t1 (pk int primary key, a int, key(a)) engine=InnoDB; +insert into t1 values (1,10),(2,20),(3,15); +flush table t1 for export; +--copy_file $datadir/test/t1.ibd $datadir/test/t1.ibd.asc +--copy_file $datadir/test/t1.cfg $datadir/test/t1.cfg.asc +unlock tables; +drop table t1; + +--echo # Import desc tablespace into desc frm + +--echo # Import into table with desc primary key column +create table t1 (pk int, a int, primary key(pk desc)) engine=InnoDB; +alter table t1 discard tablespace; +--copy_file $datadir/test/t1_pk.ibd.desc $datadir/test/t1.ibd +--copy_file $datadir/test/t1_pk.cfg.desc $datadir/test/t1.cfg +alter table t1 import tablespace; +check table t1 extended; +drop table t1; + +--echo # Import into table with desc secondary index +create table t1 (pk int primary key, a int, key(a desc))engine=InnoDB; +alter table t1 discard tablespace; +--copy_file $datadir/test/t1.ibd.desc $datadir/test/t1.ibd +--copy_file $datadir/test/t1.cfg.desc $datadir/test/t1.cfg +alter table t1 import tablespace; +check table t1 extended; +drop table t1; + +--echo # Import asc tablespace into desc frm +create table t1 (pk int primary key, a int, key(a desc))engine=InnoDB; +alter table t1 discard tablespace; +--copy_file $datadir/test/t1.ibd.asc $datadir/test/t1.ibd +--copy_file $datadir/test/t1.cfg.asc $datadir/test/t1.cfg +--error ER_TABLE_SCHEMA_MISMATCH +alter table t1 import tablespace; +check table t1 extended; +drop table t1; + +--echo # Import desc tablespace into asc frm +create table t1 (pk int primary key, a int, key(a)) engine=InnoDB; +alter table t1 discard tablespace; +--copy_file $datadir/test/t1.ibd.desc $datadir/test/t1.ibd +--copy_file $datadir/test/t1.cfg.desc $datadir/test/t1.cfg +--error ER_TABLE_SCHEMA_MISMATCH +alter table t1 import tablespace; +check table t1 extended; +drop table t1; + +--echo # Import asc tablespace into asc frm +create table t1 (pk int primary key, a int, key(a)) engine=InnoDB; +alter table t1 discard tablespace; +--copy_file $datadir/test/t1.ibd.asc $datadir/test/t1.ibd +--copy_file $datadir/test/t1.cfg.asc $datadir/test/t1.cfg +alter table t1 import tablespace; +check table t1 extended; +drop table t1; + +--remove_files_wildcard $datadir/test t1*sc diff --git a/mysql-test/suite/innodb/t/innodb-autoinc-56228.test b/mysql-test/suite/innodb/t/innodb-autoinc-56228.test index a02f7b4383a..e1d8741c730 100644 --- a/mysql-test/suite/innodb/t/innodb-autoinc-56228.test +++ b/mysql-test/suite/innodb/t/innodb-autoinc-56228.test @@ -2,33 +2,45 @@ ## # Bug #56228: dropping tables from within an active statement crashes server # -DROP TABLE IF EXISTS t1_56228; -DROP TABLE IF EXISTS t2_56228; -DROP FUNCTION IF EXISTS bug56228; -CREATE TEMPORARY TABLE t1_56228( +# This test used to use TEMPORARY TABLE, which before MySQL 5.7 or +# MariaDB Server 10.2 were covered by InnoDB locks. +# In MariaDB Server 10.6, the locking and logging was corrected for Atomic DDL. +# Hence, even if we tweaked create_table_info_t::innobase_table_flags() +# so that TEMPORARY TABLE are created as persistent tables, +# the DROP TEMPORARY TABLE statement inside the function would +# fail due to HA_ERR_LOCK_WAIT_TIMEOUT, instead of breaking locks +# like it used to do before MDEV-26603 and possibly other changes. +CREATE TABLE t1_56228( c1 iNT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; -CREATE TEMPORARY TABLE t2_56228( +CREATE TABLE t2_56228( c1 iNT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; DELIMITER //; +--error ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG CREATE FUNCTION bug56228() RETURNS INT DETERMINISTIC BEGIN INSERT INTO t1_56228 VALUES(NULL); INSERT INTO t2_56228 VALUES(NULL); INSERT INTO t1_56228 VALUES(NULL); INSERT INTO t2_56228 VALUES(NULL); - DROP TEMPORARY TABLE t1_56228; + DROP TABLE t1_56228; RETURN 42; END // +CREATE PROCEDURE bug56228() +BEGIN + INSERT INTO t1_56228 VALUES(NULL); + INSERT INTO t2_56228 VALUES(NULL); + INSERT INTO t1_56228 VALUES(NULL); + INSERT INTO t2_56228 VALUES(NULL); + DROP TABLE t1_56228; +END // + DELIMITER ;// ---disable_ps_protocol -SELECT bug56228(); ---enable_ps2_protocol +CALL bug56228(); -DROP FUNCTION bug56228; -DROP TEMPORARY TABLE t2_56228; -DROP TEMPORARY TABLE IF EXISTS t1_56228; +DROP PROCEDURE bug56228; +DROP TABLE t2_56228; diff --git a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test index db5a0525f8b..9f0d5055d85 100644 --- a/mysql-test/suite/innodb/t/innodb-wl5522-debug.test +++ b/mysql-test/suite/innodb/t/innodb-wl5522-debug.test @@ -272,22 +272,6 @@ SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; -CREATE TABLE t1 (c1 INT) ENGINE = Innodb; -INSERT INTO t1 VALUES (1); - -SET SESSION debug_dbug="+d,ib_export_io_write_failure_9"; - ---replace_regex /, .*\).*t1.cfg/, Bad file descriptor) t1.cfg/ - -FLUSH TABLES t1 FOR EXPORT; - -UNLOCK TABLES; - -SET SESSION debug_dbug=@saved_debug_dbug; - -DROP TABLE t1; - - CREATE TABLE t1 (c1 INT) ENGINE = Innodb; INSERT INTO t1 VALUES (1); diff --git a/mysql-test/suite/innodb/t/innodb.test b/mysql-test/suite/innodb/t/innodb.test index a53b73a951b..3200582b936 100644 --- a/mysql-test/suite/innodb/t/innodb.test +++ b/mysql-test/suite/innodb/t/innodb.test @@ -2618,4 +2618,11 @@ ALTER TABLE t1 FORCE; # Cleanup DROP TABLE t1; +--echo # +--echo # MDEV-35723: applying zero offset to null pointer on INSERT +--echo # +CREATE TABLE t1(c TEXT(1) NOT NULL, INDEX (c)) ENGINE=InnoDB; +INSERT INTO t1 SET c=''; +DROP TABLE t1; + --source include/test_db_charset_restore.inc diff --git a/mysql-test/suite/innodb/t/innodb_information_schema.test b/mysql-test/suite/innodb/t/innodb_information_schema.test index 88e2d3601a6..1fbf9f7eb57 100644 --- a/mysql-test/suite/innodb/t/innodb_information_schema.test +++ b/mysql-test/suite/innodb/t/innodb_information_schema.test @@ -12,15 +12,8 @@ # get NULL -- source include/not_encrypted.inc --- disable_query_log --- disable_result_log - SET default_storage_engine=InnoDB; --- disable_warnings -DROP TABLE IF EXISTS t_min, t_max; --- enable_warnings - let $table_def = ( c01 TINYINT, @@ -118,7 +111,6 @@ SELECT * FROM ```t'\"_str` WHERE c1 = '3' FOR UPDATE; -- send SELECT * FROM ```t'\"_str` WHERE c1 = '4' FOR UPDATE; --- enable_result_log -- connection con_verify_innodb_locks # Wait for the above queries to execute before continuing. # Without this, it sometimes happens that the SELECT from innodb_locks @@ -161,7 +153,6 @@ SET SQL_MODE='ANSI_QUOTES'; SELECT lock_table,COUNT(*) FROM INFORMATION_SCHEMA.INNODB_LOCKS GROUP BY lock_table; SET @@sql_mode=@save_sql_mode; --- disable_result_log -- connection default @@ -184,9 +175,7 @@ DROP TABLE t_min, t_max, ```t'\"_str`; # INFORMATION_SCHEMA.INNODB_TRX # --- enable_result_log DESCRIBE INFORMATION_SCHEMA.INNODB_TRX; --- disable_result_log -- disable_warnings DROP TABLE IF EXISTS t1; @@ -222,17 +211,14 @@ SELECT * FROM t1 FOR UPDATE; let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_TRX; --source include/wait_condition.inc --- disable_query_log -- connection con_verify_innodb_trx --- enable_result_log SELECT trx_state, trx_weight, trx_tables_in_use, trx_tables_locked, trx_rows_locked, trx_rows_modified, trx_concurrency_tickets, trx_isolation_level, trx_unique_checks, trx_foreign_key_checks FROM INFORMATION_SCHEMA.INNODB_TRX; -- connection con_trx --- disable_result_log ROLLBACK; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; @@ -243,14 +229,11 @@ INSERT INTO t1 VALUES (6,12); let $wait_condition= SELECT trx_unique_checks = 0 FROM INFORMATION_SCHEMA.INNODB_TRX; --source include/wait_condition.inc --- disable_query_log -- connection con_verify_innodb_trx --- enable_result_log SELECT trx_isolation_level, trx_unique_checks, trx_foreign_key_checks FROM INFORMATION_SCHEMA.INNODB_TRX; --- disable_result_log -- connection con_trx ROLLBACK; SET FOREIGN_KEY_CHECKS = 1; @@ -262,13 +245,10 @@ INSERT INTO t2 VALUES (4,10); let $wait_condition= SELECT trx_unique_checks = 1 FROM INFORMATION_SCHEMA.INNODB_TRX; --source include/wait_condition.inc --- disable_query_log --- enable_result_log -- connection con_verify_innodb_trx SELECT trx_state, trx_isolation_level, trx_last_foreign_key_error FROM INFORMATION_SCHEMA.INNODB_TRX; --- disable_result_log -- connection default diff --git a/mysql-test/suite/innodb/t/log_file_size_online.test b/mysql-test/suite/innodb/t/log_file_size_online.test index bf9f3510592..fb6722ee8d7 100644 --- a/mysql-test/suite/innodb/t/log_file_size_online.test +++ b/mysql-test/suite/innodb/t/log_file_size_online.test @@ -36,9 +36,19 @@ SET GLOBAL innodb_log_file_buffering=@save; --error ER_INCORRECT_GLOBAL_LOCAL_VAR,ER_UNKNOWN_SYSTEM_VARIABLE SET GLOBAL innodb_log_file_mmap=OFF; +--connect con1,localhost,root +let $ID= `SELECT @id := CONNECTION_ID()`; +send SET GLOBAL innodb_log_file_size=7340032; +--connection default +let $ignore= `SELECT @id := $ID`; +KILL QUERY @id; +--connection con1 +reap; + +--connection default send SET GLOBAL innodb_log_file_size=5242880; ---connect con1,localhost,root +--connection con1 send UPDATE t SET b='' WHERE a<10; --connection default diff --git a/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test b/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test index 47fedc52725..8eb1a67a289 100644 --- a/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test +++ b/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test @@ -63,7 +63,7 @@ set global innodb_compression_level=default; # Maximum field in the index ---error ER_TOO_MANY_KEY_PARTS +--disable_abort_on_error CREATE TABLE t1(f1 char(200), f2 char(200), f3 char(200), f4 char(200), f5 char(200), f6 char(200), f7 char(200), f8 char(200), f9 char(200), @@ -85,19 +85,15 @@ CREATE TABLE t1(f1 char(200), f2 char(200), f3 char(200), f29(10), f30(10), f31(10), f32(10), f33(10))) ENGINE=InnoDB; +--enable_abort_on_error --echo # --echo # MDEV-31161 Assertion failures upon adding a too long key --echo # to table with COMPRESSED row format --echo # ---let $page_size= `SELECT @@GLOBAL.innodb_page_size` CREATE TABLE t1(pk INT PRIMARY KEY, f1 INT, f2 TEXT)ENGINE=InnoDB ROW_FORMAT=COMPRESSED; INSERT INTO t1 (pk) VALUES (1); -let $error_code = 0; -if ($page_size == 4096) { -let $error_code = ER_TOO_BIG_ROWSIZE; -} - ---error $error_code +--disable_abort_on_error ALTER TABLE t1 ADD KEY (f1), ADD KEY (f2(1000)); +--enable_abort_on_error DROP TABLE t1; diff --git a/mysql-test/suite/innodb_gis/r/point_basic.result b/mysql-test/suite/innodb_gis/r/point_basic.result index f71e5b4b91c..58b9c6bb51c 100644 --- a/mysql-test/suite/innodb_gis/r/point_basic.result +++ b/mysql-test/suite/innodb_gis/r/point_basic.result @@ -1562,7 +1562,7 @@ ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p); ERROR HY000: Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed") show warnings; Level Code Message -Warning 150 Alter table `test`.`child` with foreign key (p) constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. +Warning 150 Alter table `test`.`child` with foreign key (p) constraint failed. There is only prefix index in the referenced table where the referenced columns appear as the first columns. Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed") Warning 1215 Cannot add foreign key constraint for `child` ALTER TABLE parent DROP INDEX idx1; @@ -1570,7 +1570,7 @@ ALTER TABLE child ADD FOREIGN KEY(p) REFERENCES parent(p); Got one of the listed errors show warnings; Level Code Message -Warning 150 Alter table `test`.`child` with foreign key (p) constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. +Warning 150 Alter table `test`.`child` with foreign key (p) constraint failed. There is only prefix index in the referenced table where the referenced columns appear as the first columns. Error 1005 Can't create table `test`.`child` (errno: 150 "Foreign key constraint is incorrectly formed") Warning 1215 Cannot add foreign key constraint for `child` ALTER TABLE child DROP INDEX idx2; diff --git a/mysql-test/suite/innodb_zip/r/index_large_prefix_8k.result b/mysql-test/suite/innodb_zip/r/index_large_prefix_8k.result index df81637974e..485b2008a67 100644 --- a/mysql-test/suite/innodb_zip/r/index_large_prefix_8k.result +++ b/mysql-test/suite/innodb_zip/r/index_large_prefix_8k.result @@ -171,9 +171,11 @@ Note 1071 Specified key was too long; max key length is 1536 bytes create index idx3 on worklog5743_8(a2(3072)); Warnings: Note 1071 Specified key was too long; max key length is 1536 bytes +Note 1831 Duplicate index `idx3`. This is deprecated and will be disallowed in a future release show warnings; Level Code Message Note 1071 Specified key was too long; max key length is 1536 bytes +Note 1831 Duplicate index `idx3`. This is deprecated and will be disallowed in a future release create index idx4 on worklog5743_8(a1, a2(1533)); ERROR 42000: Specified key was too long; max key length is 1536 bytes show warnings; @@ -355,6 +357,7 @@ Note 1071 Specified key was too long; max key length is 1536 bytes create index idx2 on worklog5743(a(3072)); Warnings: Note 1071 Specified key was too long; max key length is 1536 bytes +Note 1831 Duplicate index `idx2`. This is deprecated and will be disallowed in a future release SET sql_mode= default; show create table worklog5743; Table Create Table diff --git a/mysql-test/suite/mariabackup/backup_ssl_system_ca.opt b/mysql-test/suite/mariabackup/backup_ssl_system_ca.opt new file mode 100644 index 00000000000..9fd05d254fb --- /dev/null +++ b/mysql-test/suite/mariabackup/backup_ssl_system_ca.opt @@ -0,0 +1,2 @@ +--ssl-key=$MYSQL_TEST_DIR/std_data/server8k-key.pem +--ssl-cert=$MYSQL_TEST_DIR/std_data/server8k-cert.pem diff --git a/mysql-test/suite/mariabackup/backup_ssl_system_ca.result b/mysql-test/suite/mariabackup/backup_ssl_system_ca.result new file mode 100644 index 00000000000..e3f3f4750c2 --- /dev/null +++ b/mysql-test/suite/mariabackup/backup_ssl_system_ca.result @@ -0,0 +1,8 @@ +# +# MDEV-35368 Validation of SSL certificate fails for mariadb-backup +# +GRANT ALL PRIVILEGES on *.* TO backup_user IDENTIFIED by 'x' REQUIRE SSL; +# localhost, not self-signed cert with a wrong hostname: ok +# tcp, not self-signed cert with a wrong hostname: fails +# tcp, not self-signed cert with a wrong hostname: fails even with a password (no auto-verification) +DROP USER backup_user; diff --git a/mysql-test/suite/mariabackup/backup_ssl_system_ca.test b/mysql-test/suite/mariabackup/backup_ssl_system_ca.test new file mode 100644 index 00000000000..18db74fe431 --- /dev/null +++ b/mysql-test/suite/mariabackup/backup_ssl_system_ca.test @@ -0,0 +1,30 @@ +source include/not_embedded.inc; +source include/not_windows.inc; +if (`select @@version_ssl_library not like 'OpenSSL%'`) { + skip Needs OpenSSL; +} + + +--echo # +--echo # MDEV-35368 Validation of SSL certificate fails for mariadb-backup +--echo # +GRANT ALL PRIVILEGES on *.* TO backup_user IDENTIFIED by 'x' REQUIRE SSL; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; + +let SSL_CERT_DIR=$MYSQL_TMP_DIR; +copy_file $MYSQL_TEST_DIR/std_data/cacert.pem $MYSQL_TMP_DIR/ed1f42db.0; + +echo # localhost, not self-signed cert with a wrong hostname: ok; +exec $XTRABACKUP --user=root --socket=$MASTER_MYSOCK --backup --target-dir=$targetdir; +rmdir $targetdir; + +echo # tcp, not self-signed cert with a wrong hostname: fails; +error 1; +exec $XTRABACKUP --protocol=tcp --user=root --port=$MASTER_MYPORT --backup --target-dir=$targetdir; + +echo # tcp, not self-signed cert with a wrong hostname: fails even with a password (no auto-verification); +error 1; +exec $XTRABACKUP --protocol=tcp --user=backup_user --password=x --port=$MASTER_MYPORT --backup --target-dir=$targetdir; + +remove_file $MYSQL_TMP_DIR/ed1f42db.0; +DROP USER backup_user; diff --git a/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.combinations b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.combinations new file mode 100644 index 00000000000..5221a9747be --- /dev/null +++ b/mysql-test/suite/mariabackup/innodb_redo_log_overwrite.combinations @@ -0,0 +1,4 @@ +[pread] +--innodb-log-file-mmap=OFF +[mmap] +--innodb-log-file-mmap=ON diff --git a/mysql-test/suite/mariabackup/undo_truncate.combinations b/mysql-test/suite/mariabackup/undo_truncate.combinations new file mode 100644 index 00000000000..fe6a3ba58fd --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_truncate.combinations @@ -0,0 +1,4 @@ +[clear] +--innodb-encrypt-log=OFF +[crypt] +--innodb-encrypt-log=ON diff --git a/mysql-test/suite/mariabackup/undo_truncate.opt b/mysql-test/suite/mariabackup/undo_truncate.opt new file mode 100644 index 00000000000..9b4f76ab5de --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_truncate.opt @@ -0,0 +1,6 @@ +--innodb-undo-tablespaces=2 +--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/undo_truncate.result b/mysql-test/suite/mariabackup/undo_truncate.result new file mode 100644 index 00000000000..a3bfb182dd8 --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_truncate.result @@ -0,0 +1,39 @@ +SET GLOBAL innodb_undo_log_truncate = 0; +create table t1 (keyc int primary key default 0, c char(6)) engine=innodb; +create table t2 (keyc int primary key default 0, c char(6)) engine=innodb; +CREATE PROCEDURE p(t VARCHAR(64)) +BEGIN +DECLARE i TEXT DEFAULT 'insert into t1 select seq,repeat(chr(48),6) + from seq_1_to_20000'; +DECLARE u1 TEXT DEFAULT 'update t1 set c=repeat(chr(32),6)'; +DECLARE u2 TEXT DEFAULT 'update t1 set c=repeat(chr(64),6)'; +EXECUTE IMMEDIATE REPLACE(i,'t1', t); +EXECUTE IMMEDIATE REPLACE(u1,'t1', t); +EXECUTE IMMEDIATE REPLACE(u2,'t1', t); +END; +$$ +connect con1,localhost,root,,; +begin; +call p('t1'); +connection default; +call p('t2'); +connection con1; +commit; +disconnect con1; +connection default; +DROP PROCEDURE p; +SET GLOBAL innodb_undo_log_truncate = 1; +SET GLOBAL innodb_max_undo_log_size=DEFAULT; +SET GLOBAL innodb_max_purge_lag_wait=0; +# Prepare full backup +# shutdown server +# remove datadir +# xtrabackup move back +# restart +select count(*) from t1; +count(*) +20000 +select count(*) from t2; +count(*) +20000 +DROP TABLE t1,t2; diff --git a/mysql-test/suite/mariabackup/undo_truncate.test b/mysql-test/suite/mariabackup/undo_truncate.test new file mode 100644 index 00000000000..a23c9cf64ff --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_truncate.test @@ -0,0 +1,59 @@ +--source include/have_innodb.inc +--source include/not_embedded.inc +--source include/have_sequence.inc +--source include/have_file_key_management.inc + +SET GLOBAL innodb_undo_log_truncate = 0; + +# +# Perform DML action using multiple clients and multiple undo tablespace. +# + +create table t1 (keyc int primary key default 0, c char(6)) engine=innodb; +create table t2 (keyc int primary key default 0, c char(6)) engine=innodb; + +DELIMITER $$; +CREATE PROCEDURE p(t VARCHAR(64)) +BEGIN + DECLARE i TEXT DEFAULT 'insert into t1 select seq,repeat(chr(48),6) + from seq_1_to_20000'; + DECLARE u1 TEXT DEFAULT 'update t1 set c=repeat(chr(32),6)'; + DECLARE u2 TEXT DEFAULT 'update t1 set c=repeat(chr(64),6)'; + EXECUTE IMMEDIATE REPLACE(i,'t1', t); + EXECUTE IMMEDIATE REPLACE(u1,'t1', t); + EXECUTE IMMEDIATE REPLACE(u2,'t1', t); +END; +$$ +DELIMITER ;$$ + +connect (con1,localhost,root,,); +begin; +send call p('t1'); + +connection default; +call p('t2'); + +connection con1; +reap; +commit; +disconnect con1; +connection default; +DROP PROCEDURE p; + +SET GLOBAL innodb_undo_log_truncate = 1; +SET GLOBAL innodb_max_undo_log_size=DEFAULT; +SET GLOBAL innodb_max_purge_lag_wait=0; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --throttle=1000; +--echo # Prepare full backup +exec $XTRABACKUP --prepare --target-dir=$targetdir; +--enable_result_log + +source include/restart_and_restore.inc; +select count(*) from t1; +select count(*) from t2; +# Cleanup +rmdir $targetdir; +DROP TABLE t1,t2; diff --git a/mysql-test/suite/parts/r/alter_table.result b/mysql-test/suite/parts/r/alter_table.result index 24fbd6b8031..558b8f4845c 100644 --- a/mysql-test/suite/parts/r/alter_table.result +++ b/mysql-test/suite/parts/r/alter_table.result @@ -35,6 +35,20 @@ ALTER TABLE v1 EXCHANGE PARTITION p2 WITH TABLE t2 ; ERROR 42000: Can't open table DROP VIEW v1; DROP TABLE t1, t2; +# +# MDEV-34813 ALGORITHM=INSTANT does not work for partitioned tables on indexed column +# +CREATE TABLE `t1` ( +`f1` datetime , +`f2` VARCHAR(2) , +`f3` VARCHAR(200) , +`f4` VARCHAR(100) , +INDEX `i3` (`f4`) ) +PARTITION BY RANGE COLUMNS(`f2`) +(PARTITION `p_01` VALUES LESS THAN ('02') ENGINE = InnoDB, +PARTITION `p_31` VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB); +ALTER online TABLE t1 MODIFY COLUMN `f4` VARCHAR(500) , ALGORITHM=INSTANT, LOCK=NONE; +drop table t1; # End of 10.5 tests # # MDEV-22165 CONVERT PARTITION: move in partition from existing table diff --git a/mysql-test/suite/parts/t/alter_table.test b/mysql-test/suite/parts/t/alter_table.test index 31a50897d6c..8a4de46a03c 100644 --- a/mysql-test/suite/parts/t/alter_table.test +++ b/mysql-test/suite/parts/t/alter_table.test @@ -40,6 +40,25 @@ ALTER TABLE v1 EXCHANGE PARTITION p2 WITH TABLE t2 ; DROP VIEW v1; DROP TABLE t1, t2; +--echo # +--echo # MDEV-34813 ALGORITHM=INSTANT does not work for partitioned tables on indexed column +--echo # + +--source include/have_innodb.inc +CREATE TABLE `t1` ( + `f1` datetime , + `f2` VARCHAR(2) , + `f3` VARCHAR(200) , + `f4` VARCHAR(100) , + INDEX `i3` (`f4`) ) + PARTITION BY RANGE COLUMNS(`f2`) + (PARTITION `p_01` VALUES LESS THAN ('02') ENGINE = InnoDB, + PARTITION `p_31` VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB); + +ALTER online TABLE t1 MODIFY COLUMN `f4` VARCHAR(500) , ALGORITHM=INSTANT, LOCK=NONE; + +drop table t1; + --echo # End of 10.5 tests --echo # diff --git a/mysql-test/suite/perfschema/r/grant.result b/mysql-test/suite/perfschema/r/grant.result index 4679499279f..985473c80f0 100644 --- a/mysql-test/suite/perfschema/r/grant.result +++ b/mysql-test/suite/perfschema/r/grant.result @@ -5,3 +5,19 @@ VARIABLE_NAME VARIABLE_VALUE connection default; disconnect a; drop user a@localhost; +# +# MDEV-35384 Table performance_schema.session_status and other two tables are not shown in information_schema.tables for normal users +# +create user foo@localhost; +connect foo,localhost,foo; +select table_schema,engine from information_schema.tables where table_name='session_status'; +table_schema engine +information_schema MEMORY +performance_schema PERFORMANCE_SCHEMA +select count(*) > 0 as 'table is readable' from performance_schema.session_status; +table is readable +1 +connection default; +disconnect foo; +drop user foo@localhost; +# End of 10.6 tests diff --git a/mysql-test/suite/perfschema/r/threads_innodb.result b/mysql-test/suite/perfschema/r/threads_innodb.result index 8b9512d161c..7a84c01f28b 100644 --- a/mysql-test/suite/perfschema/r/threads_innodb.result +++ b/mysql-test/suite/perfschema/r/threads_innodb.result @@ -7,3 +7,4 @@ GROUP BY name; name type processlist_user processlist_host processlist_db processlist_command processlist_time processlist_state processlist_info parent_thread_id role instrumented thread/innodb/ib_tpool_worker BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES thread/innodb/page_cleaner BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES +thread/innodb/page_encrypt BACKGROUND NULL NULL NULL NULL NULL NULL NULL NULL NULL YES diff --git a/mysql-test/suite/perfschema/t/grant.test b/mysql-test/suite/perfschema/t/grant.test index 446965dfe9d..7c9bc31104e 100644 --- a/mysql-test/suite/perfschema/t/grant.test +++ b/mysql-test/suite/perfschema/t/grant.test @@ -10,3 +10,16 @@ connection default; disconnect a; drop user a@localhost; +--echo # +--echo # MDEV-35384 Table performance_schema.session_status and other two tables are not shown in information_schema.tables for normal users +--echo # +create user foo@localhost; +connect foo,localhost,foo; +sorted_result; +select table_schema,engine from information_schema.tables where table_name='session_status'; +select count(*) > 0 as 'table is readable' from performance_schema.session_status; +connection default; +disconnect foo; +drop user foo@localhost; + +--echo # End of 10.6 tests diff --git a/mysql-test/suite/perfschema/t/threads_innodb.opt b/mysql-test/suite/perfschema/t/threads_innodb.opt new file mode 100644 index 00000000000..bd33f76701e --- /dev/null +++ b/mysql-test/suite/perfschema/t/threads_innodb.opt @@ -0,0 +1 @@ +--innodb-encryption-threads=2 diff --git a/mysql-test/suite/period/r/create.result b/mysql-test/suite/period/r/create.result index 815a9a11b17..d2fac1fe870 100644 --- a/mysql-test/suite/period/r/create.result +++ b/mysql-test/suite/period/r/create.result @@ -20,10 +20,10 @@ Warning 1286 Unknown storage engine 'InnoDB' Warning 1286 Unknown storage engine 'InnoDB' select * from information_schema.key_period_usage; CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PERIOD_NAME -Warning 1286 Unknown storage engine 'InnoDB' -Warning 1286 Unknown storage engine 'InnoDB' -Warning 1286 Unknown storage engine 'InnoDB' Warnings: +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1286 Unknown storage engine 'InnoDB' drop view v; create or replace table t (id int primary key, s timestamp(6), e timestamp(6), period for mytime(s,e)); @@ -145,11 +145,11 @@ create table t (a date) engine=myisam; create table t1 (a int) engine=merge union = (t) ; select 1 from information_schema.key_period_usage; 1 +Warnings: Warning 1168 Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist Warning 1286 Unknown storage engine 'InnoDB' Warning 1286 Unknown storage engine 'InnoDB' Warning 1286 Unknown storage engine 'InnoDB' -Warnings: drop table t1; drop table t; create view v1 as select 1; @@ -157,9 +157,9 @@ create view v2 as select * from v1; drop view v1; select * from information_schema.key_period_usage; CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PERIOD_NAME +Warnings: Warning 1286 Unknown storage engine 'InnoDB' Warning 1286 Unknown storage engine 'InnoDB' Warning 1286 Unknown storage engine 'InnoDB' Warning 1356 View 'test.v2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them -Warnings: drop view v2; diff --git a/mysql-test/suite/roles/definer.result b/mysql-test/suite/roles/definer.result index b5b2f8d227a..5b8e4bd728c 100644 --- a/mysql-test/suite/roles/definer.result +++ b/mysql-test/suite/roles/definer.result @@ -286,32 +286,32 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v1` AS SELECT 1 AS `a+b`, 1 AS `c` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v2` AS SELECT 1 AS `a+b`, 1 AS `c`, 1 AS `current_role()` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v3` AS SELECT 1 AS `a+b`, 1 AS `c` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v4` AS SELECT 1 AS `a+b`, 1 AS `c` */; SET character_set_client = @saved_cs_client; SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; +SET character_set_client = utf8mb4; /*!50001 CREATE VIEW `v5` AS SELECT 1 AS `a+b`, 1 AS `c` */; @@ -321,7 +321,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER USE `mysqltest1`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, @@ -332,7 +332,7 @@ INSERT INTO `t1` VALUES (1,10,100), (2,20,200); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, diff --git a/mysql-test/suite/rpl/r/rpl_from_mysql80.result b/mysql-test/suite/rpl/r/rpl_from_mysql80.result index 0c9d5c17943..1fac65adbad 100644 --- a/mysql-test/suite/rpl/r/rpl_from_mysql80.result +++ b/mysql-test/suite/rpl/r/rpl_from_mysql80.result @@ -11,10 +11,6 @@ START SLAVE IO_THREAD; include/wait_for_slave_io_to_start.inc START SLAVE UNTIL Master_log_file='master-bin.000001', Master_log_pos= 1178; SELECT MASTER_POS_WAIT('master-bin.000001', 1178, 60); -MASTER_POS_WAIT('master-bin.000001', 1178, 60) -NULL -Warnings: -Note 1105 master_pos_wait() was aborted because slave is not running SELECT * FROM t1 ORDER BY a; a b c 1 0 diff --git a/mysql-test/suite/rpl/r/rpl_system_versioning_partitions.result b/mysql-test/suite/rpl/r/rpl_system_versioning_partitions.result new file mode 100644 index 00000000000..b869037c729 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_system_versioning_partitions.result @@ -0,0 +1,71 @@ +include/master-slave.inc +[connection master] +# +# Initialize system-versioned and partitioned table and its data +connection master; +SET timestamp=UNIX_TIMESTAMP('2025-01-01 01:00:00.000000'); +RESET MASTER; +create table t1 (x int) engine=InnoDB with system versioning partition by system_time limit 3 partitions 5; +insert into t1 values(1); +insert into t1 values(2); +insert into t1 values(3); +insert into t1 values(4); +insert into t1 values(5); +# Verifying master partitions are correct after data insertion.. +# .. done +connection slave; +connection slave; +# Verifying partitions of master and slave match on data setup.. +# .. done +# +# "Delete" each row -- these are the BINLOG commands generated by +# mysqlbinlog from `delete from t1 where x=` statments. Because the +# table uses system versioning and system_time partition, the actual +# events are updates, with added fields for the `row_start` and `row_end` +# columns. +connection master; +# BINLOG for Format Description event +BINLOG ' +APZ0Zw8BAAAA/AAAAAABAAAAAAQAMTEuNy4yLU1hcmlhREItZGVidWctbG9nAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAA9nRnEzgNAAgAEgAEBAQEEgAA5AAEGggAAAAICAgCAAAACgoKAAAAAAAA +CgoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAEEwQADQgICAoKCgGuUmo6 +'; +# BINLOG for delete from t1 where x=1; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AEAAABndPYAAAAA/////w9CP/gBAAAAZ3T2 +AAAAAGd09gAAAAAuqwNP +'; +# BINLOG for delete from t1 where x=2; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AIAAABndPYAAAAA/////w9CP/gCAAAAZ3T2 +AAAAAGd09gAAAAAsSeT/ +'; +# BINLOG for delete from t1 where x=3; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AMAAABndPYAAAAA/////w9CP/gDAAAAZ3T2 +AAAAAGd09gAAAADS6EaQ +'; +# BINLOG for delete from t1 where x=4; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AQAAABndPYAAAAA/////w9CP/gEAAAAZ3T2 +AAAAAGd09gAAAABpi1pF +'; +# BINLOG for delete from t1 where x=5; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AUAAABndPYAAAAA/////w9CP/gFAAAAZ3T2 +AAAAAGd09gAAAACXKvgq +'; +# Verifying master partitions are correct after deletion BINLOG stmts.. +# .. done +connection slave; +connection slave; +connection master; +drop table t1; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_from_mysql80.test b/mysql-test/suite/rpl/t/rpl_from_mysql80.test index ec4a22056f9..a5723486ee9 100644 --- a/mysql-test/suite/rpl/t/rpl_from_mysql80.test +++ b/mysql-test/suite/rpl/t/rpl_from_mysql80.test @@ -81,7 +81,9 @@ START SLAVE IO_THREAD; # The position 1178 is the start of: INSERT INTO t1 VALUES (4, 0, 'skip'); # After that comes unknown MySQL 8.0 events, which we test error for below. START SLAVE UNTIL Master_log_file='master-bin.000001', Master_log_pos= 1178; +--disable_result_log SELECT MASTER_POS_WAIT('master-bin.000001', 1178, 60); +--enable_result_log SELECT * FROM t1 ORDER BY a; --source include/wait_for_slave_sql_to_stop.inc diff --git a/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test b/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test index c34c4f20dc0..8414b31947a 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test @@ -300,7 +300,7 @@ SET GLOBAL slave_parallel_threads=10; # Find the thread id of the driver SQL thread that we want to kill. --let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Slave has read all relay log%' --source include/wait_condition.inc ---let $thd_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%relay log%'` +--let $thd_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND LIKE 'Slave_SQL'` SET @old_max_queued= @@GLOBAL.slave_parallel_max_queued; SET GLOBAL slave_parallel_max_queued=9000; diff --git a/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test b/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test index 9d8f87b4345..1a7b3abfde0 100644 --- a/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test +++ b/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test @@ -86,6 +86,10 @@ if (`SELECT $slave1_sent_ack`) --connection server_3 --echo # Verifying server_3 did send ACK +--let $status_var= Rpl_semi_sync_slave_send_ack +--let $status_var_comparsion= > +--let $status_var_value= 0 +--source include/wait_for_status_var.inc --let $slave2_sent_ack= query_get_value(SHOW STATUS LIKE 'rpl_semi_sync_slave_send_ack', Value, 1) if (`SELECT NOT $slave2_sent_ack`) { diff --git a/mysql-test/suite/rpl/t/rpl_system_versioning_partitions.cnf b/mysql-test/suite/rpl/t/rpl_system_versioning_partitions.cnf new file mode 100644 index 00000000000..53153614f0a --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_system_versioning_partitions.cnf @@ -0,0 +1,4 @@ +!include ../my.cnf + +[mysqld] +default_time_zone="-7:00" diff --git a/mysql-test/suite/rpl/t/rpl_system_versioning_partitions.test b/mysql-test/suite/rpl/t/rpl_system_versioning_partitions.test new file mode 100644 index 00000000000..84fa573bdca --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_system_versioning_partitions.test @@ -0,0 +1,249 @@ +# +# Ensure that executing row-injected events (i.e. via BINLOG statments and +# row-based binlog events) uses historical partitions. That is, for tables +# which use system versioning and system_time partitions, MDEV-35096 reported +# that row-injected events would not be stored into the correct historical +# partition. This test considers both use cases of row-injected events. +# +# The test setup creates a system-versioned table with system_time-based +# partitioning and fills the table up with enough records that bypass the size +# limit of each historical partition. +# +# To test BINLOG statements, a series of BINLOG statements are used to delete +# all the records in the test tables, and the resulting partitions are analyzed +# to ensure that they match the partition specification. The BINLOG events +# were collected by running an original set of delete statements on the table +# data, and taking their binlog data from mysqlbinlog. Note these binary log +# events are actually Update events, because system versioning just archives +# the rows, rather than deleting them. +# +# To test row-based event replication, a slave replicates the master's +# events, and the partitions are compared between the slave and master for +# consistency. +# +# Note that the TIMESTAMP of this test is fixed so the BINLOG statements can +# identify the correct rows to delete (system versioning adds implicit fields +# `row_start` and `row_end`, which are automatically populated using the current +# timestamp). +# +# +# References: +# MDEV-35096: History is stored in different partitions on different nodes +# when using SYSTEM VERSION +# +--source include/have_64bit_timestamp.inc +--source include/have_binlog_format_row.inc +--source include/have_innodb.inc +--source include/have_partition.inc +--source include/master-slave.inc + +--echo # +--echo # Initialize system-versioned and partitioned table and its data +--connection master + +# Fix the timestamp for the system versioned row_start and row_end fields, so +# the later hard-coded BINLOG base64 data can find the rows. +SET timestamp=UNIX_TIMESTAMP('2025-01-01 01:00:00.000000'); +RESET MASTER; + +create table t1 (x int) engine=InnoDB with system versioning partition by system_time limit 3 partitions 5; +insert into t1 values(1); +insert into t1 values(2); +insert into t1 values(3); +insert into t1 values(4); +insert into t1 values(5); +--let $master_total_size= `select count(*) from t1` +--let $master_p0_size= `select count(*) from t1 partition (p0)` +--let $master_p1_size= `select count(*) from t1 partition (p1)` +--let $master_p2_size= `select count(*) from t1 partition (p2)` + +--echo # Verifying master partitions are correct after data insertion.. +if ($master_total_size != 5) +{ + --echo # Master t1 count: $master_total_size + --die Master table t1 should have 5 entries +} +if ($master_p0_size) +{ + --echo # Master t1,p0 count: $master_p0_size + --die Master t1 partition p0 should be empty +} +if ($master_p1_size) +{ + --echo # Master t1,p1 count: $master_p1_size + --die Master t1 partition p1 should be empty +} +if ($master_p2_size) +{ + --echo # Master t1,p2 count: $master_p2_size + --die Master t1 partition p2 should be empty +} +--echo # .. done + +--sync_slave_with_master + +--connection slave +--let $slave_total_size= `select count(*) from t1` +--let $slave_p0_size= `select count(*) from t1 partition (p0)` +--let $slave_p1_size= `select count(*) from t1 partition (p1)` +--let $slave_p2_size= `select count(*) from t1 partition (p2)` + +--echo # Verifying partitions of master and slave match on data setup.. +if ($slave_total_size != $master_total_size) +{ + --connection master + select count(*) from t0; + --connection slave + select count(*) from t1; + --die Size of t1 differs between master and slave +} +if ($slave_p0_size != $master_p0_size) +{ + --connection master + select count(*) from t1 partition (p0); + --connection slave + select count(*) from t1 partition (p0); + --die Size of t1 partition p0 differs between master and slave +} +if ($slave_p1_size != $master_p1_size) +{ + --connection master + select count(*) from t1 partition (p1); + --connection slave + select count(*) from t1 partition (p1); + --die Size of t1 partition p1 differs between master and slave +} +if ($slave_p2_size != $master_p2_size) +{ + --connection master + select count(*) from t1 partition (p2); + --connection slave + select count(*) from t1 partition (p2); + --die Size of t1 partition p2 differs between master and slave +} +--echo # .. done + +--echo # +--echo # "Delete" each row -- these are the BINLOG commands generated by +--echo # mysqlbinlog from `delete from t1 where x=` statments. Because the +--echo # table uses system versioning and system_time partition, the actual +--echo # events are updates, with added fields for the `row_start` and `row_end` +--echo # columns. +--connection master + +--echo # BINLOG for Format Description event +BINLOG ' +APZ0Zw8BAAAA/AAAAAABAAAAAAQAMTEuNy4yLU1hcmlhREItZGVidWctbG9nAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAA9nRnEzgNAAgAEgAEBAQEEgAA5AAEGggAAAAICAgCAAAACgoKAAAAAAAA +CgoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAEEwQADQgICAoKCgGuUmo6 +'; + +--echo # BINLOG for delete from t1 where x=1; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AEAAABndPYAAAAA/////w9CP/gBAAAAZ3T2 +AAAAAGd09gAAAAAuqwNP +'; + +--echo # BINLOG for delete from t1 where x=2; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AIAAABndPYAAAAA/////w9CP/gCAAAAZ3T2 +AAAAAGd09gAAAAAsSeT/ +'; + + +--echo # BINLOG for delete from t1 where x=3; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AMAAABndPYAAAAA/////w9CP/gDAAAAZ3T2 +AAAAAGd09gAAAADS6EaQ +'; + +--echo # BINLOG for delete from t1 where x=4; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AQAAABndPYAAAAA/////w9CP/gEAAAAZ3T2 +AAAAAGd09gAAAABpi1pF +'; + +--echo # BINLOG for delete from t1 where x=5; +BINLOG ' +APZ0ZxMBAAAAMQAAAAAAAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBoCHyJQ== +APZ0ZxgBAAAASAAAAAAAAAAAACEAAAAAAAEAAwcH+AUAAABndPYAAAAA/////w9CP/gFAAAAZ3T2 +AAAAAGd09gAAAACXKvgq +'; + +--let $master_total_size= `select count(*) from t1` +--let $master_p0_size= `select count(*) from t1 partition (p0)` +--let $master_p1_size= `select count(*) from t1 partition (p1)` +--let $master_p2_size= `select count(*) from t1 partition (p2)` +--echo # Verifying master partitions are correct after deletion BINLOG stmts.. +if ($master_total_size > 0) +{ + --echo # Master t1 count: $master_total_size + --die Master table t1 should have 0 count +} +if ($master_p0_size != 3) +{ + --echo # Master t1,p0 count: $master_p0_size + --die Master t1 partition p0 should have 3 entries +} +if ($master_p1_size != 2) +{ + --echo # Master t1,p1 count: $master_p1_size + --die Master t1 partition p1 should have 2 entries +} +if ($master_p2_size) +{ + --echo # Master t1,p2 count: $master_p2_size + --die Master t1 partition p2 should be empty +} +--echo # .. done +--sync_slave_with_master + +--connection slave +--let $slave_total_size= `select count(*) from t1` +--let $slave_p0_size= `select count(*) from t1 partition (p0)` +--let $slave_p1_size= `select count(*) from t1 partition (p1)` +--let $slave_p2_size= `select count(*) from t1 partition (p2)` + +if ($slave_total_size != $master_total_size) +{ + --connection master + select count(*) from t1; + --connection slave + select count(*) from t1; + --die Size of t1 differs between master and slave +} +if ($slave_p0_size != $master_p0_size) +{ + --connection master + select count(*) from t1 partition (p0); + --connection slave + select count(*) from t1 partition (p0); + --die Size of t1 partition p0 differs between master and slave +} +if ($slave_p1_size != $master_p1_size) +{ + --connection master + select count(*) from t1 partition (p1); + --connection slave + select count(*) from t1 partition (p1); + --die Size of t1 partition p1 differs between master and slave +} +if ($slave_p2_size != $master_p2_size) +{ + --connection master + select count(*) from t1 partition (p2); + --connection slave + select count(*) from t1 partition (p2); + --die Size of t1 partition p2 differs between master and slave +} + +--connection master +drop table t1; + +--source include/rpl_end.inc diff --git a/mysql-test/suite/s3/mysqldump.result b/mysql-test/suite/s3/mysqldump.result index c49916d74a9..f7beb1ec244 100644 --- a/mysql-test/suite/s3/mysqldump.result +++ b/mysql-test/suite/s3/mysqldump.result @@ -18,7 +18,7 @@ alter table t1 engine=S3; ### /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `pk` int(11) NOT NULL, `a` int(11) DEFAULT NULL, diff --git a/mysql-test/suite/sql_sequence/mysqldump.result b/mysql-test/suite/sql_sequence/mysqldump.result index b8460467197..acece49cc79 100644 --- a/mysql-test/suite/sql_sequence/mysqldump.result +++ b/mysql-test/suite/sql_sequence/mysqldump.result @@ -9,7 +9,7 @@ DO SETVAL(`a1`, 1, 0); CREATE SEQUENCE `x1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; DO SETVAL(`x1`, 1, 0); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, KEY `a` (`a`) @@ -25,7 +25,7 @@ DO SETVAL(`a1`, 1, 0); CREATE SEQUENCE `x1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; DO SETVAL(`x1`, 1, 0); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, KEY `a` (`a`) @@ -41,7 +41,7 @@ DO SETVAL(`a1`, 1, 0); CREATE SEQUENCE `x1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; DO SETVAL(`x1`, 1, 0); /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, KEY `a` (`a`) @@ -53,7 +53,7 @@ INSERT INTO `t1` VALUES # dump by tables only tables /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, KEY `a` (`a`) diff --git a/mysql-test/suite/sql_sequence/temporary.result b/mysql-test/suite/sql_sequence/temporary.result index b5c70fd3a50..78ad40c2582 100644 --- a/mysql-test/suite/sql_sequence/temporary.result +++ b/mysql-test/suite/sql_sequence/temporary.result @@ -41,3 +41,18 @@ select nextval(s1); nextval(s1) 2 drop temporary sequence s1; +# End of 10.6 test +# +# MDEV-31298 Assertion `!check_foreigns' failed in trx_mod_table_time_t* trx_t::check_bulk_buffer(dict_table_t*), Assertion `table->skip_alter_undo || !check_unique_secondary' failed in trx_t::check_bulk_buffer +# +set foreign_key_checks=0,unique_checks=0; +create table t1 (c1 char,index (c1)) engine=innodb; +xa start 'a'; +insert into t1 values(); +set foreign_key_checks=1,unique_checks=1; +create temporary sequence f engine=innodb; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state +xa end 'a'; +xa rollback 'a'; +drop table t1; +# End of 10.11 test diff --git a/mysql-test/suite/sql_sequence/temporary.test b/mysql-test/suite/sql_sequence/temporary.test index e57dc693304..cdb50d9ee20 100644 --- a/mysql-test/suite/sql_sequence/temporary.test +++ b/mysql-test/suite/sql_sequence/temporary.test @@ -45,3 +45,21 @@ select nextval(s1); select nextval(s1); drop temporary sequence s1; --enable_ps2_protocol + +--echo # End of 10.6 test + +--echo # +--echo # MDEV-31298 Assertion `!check_foreigns' failed in trx_mod_table_time_t* trx_t::check_bulk_buffer(dict_table_t*), Assertion `table->skip_alter_undo || !check_unique_secondary' failed in trx_t::check_bulk_buffer +--echo # +set foreign_key_checks=0,unique_checks=0; +create table t1 (c1 char,index (c1)) engine=innodb; +xa start 'a'; +insert into t1 values(); +set foreign_key_checks=1,unique_checks=1; +--error ER_XAER_RMFAIL +create temporary sequence f engine=innodb; +xa end 'a'; +xa rollback 'a'; +drop table t1; + +--echo # End of 10.11 test diff --git a/mysql-test/suite/sys_vars/r/replicate_do_db_basic.result b/mysql-test/suite/sys_vars/r/replicate_do_db_basic.result index 26489a83344..c3f1945fe1d 100644 --- a/mysql-test/suite/sys_vars/r/replicate_do_db_basic.result +++ b/mysql-test/suite/sys_vars/r/replicate_do_db_basic.result @@ -59,3 +59,9 @@ SELECT @@GLOBAL.replicate_do_db; # Cleanup. SET @@GLOBAL.replicate_do_db = @save_replicate_do_db; +# +# MDEV-35688 UBSAN: SUMMARY: UndefinedBehaviorSanitizer: nullptr-with-offset in my_casedn_utf8mb3 +# +show variables like 'replicate_do_db'; +Variable_name Value +replicate_do_db diff --git a/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff index 57f9d6746d5..1e3ca94f215 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff @@ -1,5 +1,5 @@ ---- suite/sys_vars/r/sysvars_aria.result -+++ suite/sys_vars/r/sysvars_aria,32bit.reject +--- a/mysql-test/suite/sys_vars/r/sysvars_aria.result ++++ b/mysql-test/suite/sys_vars/r/sysvars_aria.result @@ -5,7 +5,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 8192 @@ -97,7 +97,7 @@ @@ -224,7 +224,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE - NUMERIC_MIN_VALUE 16376 + NUMERIC_MIN_VALUE 16352 -NUMERIC_MAX_VALUE 1152921504606846975 +NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index c5b8784dd96..fe7c07ce6c8 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -4,7 +4,6 @@ variable_name not in ( 'innodb_numa_interleave', # only available WITH_NUMA 'innodb_evict_tables_on_commit_debug', # one may want to override this 'innodb_use_native_aio', # default value depends on OS -'innodb_log_file_mmap', # only available on 64-bit 'innodb_log_file_buffering', # only available on Linux and Windows 'innodb_buffer_pool_load_pages_abort') # debug build only, and is only for testing order by variable_name; @@ -932,6 +931,18 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_LOG_FILE_MMAP +SESSION_VALUE NULL +DEFAULT_VALUE ON +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Whether ib_logfile0 resides in persistent memory (when supported) or should initially be memory-mapped +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY YES +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_LOG_FILE_SIZE SESSION_VALUE NULL DEFAULT_VALUE 100663296 diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff index 2069ee9b06f..a3cad30af87 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff @@ -97,7 +97,7 @@ @@ -227,7 +227,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE - NUMERIC_MIN_VALUE 16376 + NUMERIC_MIN_VALUE 16352 -NUMERIC_MAX_VALUE 1152921504606846975 +NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 @@ -398,7 +398,7 @@ VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -1754,7 +1754,7 @@ READ_ONLY NO +@@ -1764,7 +1764,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_MAX_WARNINGS VARIABLE_SCOPE SESSION @@ -407,7 +407,7 @@ VARIABLE_COMMENT Max numbers of warnings printed to slow query log per statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -1764,7 +1764,7 @@ READ_ONLY NO +@@ -1774,7 +1774,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_MIN_EXAMINED_ROW_LIMIT VARIABLE_SCOPE SESSION @@ -416,7 +416,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1804,7 +1804,7 @@ READ_ONLY NO +@@ -1814,7 +1814,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_RATE_LIMIT VARIABLE_SCOPE SESSION @@ -425,7 +425,7 @@ VARIABLE_COMMENT Write to slow log every #th slow query. Set to 1 to log everything. Increase it to reduce the size of the slow or the performance impact of slow logging NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1834,7 +1834,7 @@ READ_ONLY NO +@@ -1844,7 +1844,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_WARNINGS VARIABLE_SCOPE SESSION @@ -434,7 +434,7 @@ VARIABLE_COMMENT Log some non-critical warnings to the error log. Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1884,7 +1884,7 @@ READ_ONLY NO +@@ -1894,7 +1894,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MAX_ALLOWED_PACKET VARIABLE_SCOPE SESSION @@ -443,7 +443,7 @@ VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -1897,14 +1897,14 @@ VARIABLE_SCOPE GLOBAL +@@ -1907,14 +1907,14 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the transactional cache NUMERIC_MIN_VALUE 4096 @@ -460,7 +460,7 @@ VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value, unless `binlog_large_commit_threshold` causes rotation prematurely NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -1917,7 +1917,7 @@ VARIABLE_SCOPE GLOBAL +@@ -1927,7 +1927,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the statement cache NUMERIC_MIN_VALUE 4096 @@ -469,7 +469,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1934,7 +1934,7 @@ READ_ONLY NO +@@ -1944,7 +1944,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_CONNECTIONS VARIABLE_SCOPE GLOBAL @@ -478,7 +478,7 @@ VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100000 -@@ -1944,7 +1944,7 @@ READ_ONLY NO +@@ -1954,7 +1954,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_CONNECT_ERRORS VARIABLE_SCOPE GLOBAL @@ -487,7 +487,7 @@ VARIABLE_COMMENT If there is more than this number of interrupted connections from a host this host will be blocked from further connections NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1954,7 +1954,7 @@ READ_ONLY NO +@@ -1964,7 +1964,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_DELAYED_THREADS VARIABLE_SCOPE SESSION @@ -496,7 +496,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -1974,7 +1974,7 @@ READ_ONLY YES +@@ -1984,7 +1984,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_ERROR_COUNT VARIABLE_SCOPE SESSION @@ -505,7 +505,7 @@ VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -1987,14 +1987,14 @@ VARIABLE_SCOPE SESSION +@@ -1997,14 +1997,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -522,7 +522,7 @@ VARIABLE_COMMENT Alias for max_delayed_threads. Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -2014,7 +2014,7 @@ READ_ONLY NO +@@ -2024,7 +2024,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_LENGTH_FOR_SORT_DATA VARIABLE_SCOPE SESSION @@ -531,7 +531,7 @@ VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -2044,7 +2044,7 @@ READ_ONLY NO +@@ -2054,7 +2054,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_RECURSIVE_ITERATIONS VARIABLE_SCOPE SESSION @@ -540,7 +540,7 @@ VARIABLE_COMMENT Maximum number of iterations when executing recursive queries NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2057,14 +2057,14 @@ VARIABLE_SCOPE SESSION +@@ -2067,14 +2067,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The maximum size of the container of a rowid filter NUMERIC_MIN_VALUE 1024 @@ -557,7 +557,7 @@ VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2084,7 +2084,7 @@ READ_ONLY NO +@@ -2094,7 +2094,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SORT_LENGTH VARIABLE_SCOPE SESSION @@ -566,7 +566,7 @@ VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) NUMERIC_MIN_VALUE 64 NUMERIC_MAX_VALUE 8388608 -@@ -2094,7 +2094,7 @@ READ_ONLY NO +@@ -2104,7 +2104,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SP_RECURSION_DEPTH VARIABLE_SCOPE SESSION @@ -575,7 +575,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -2144,7 +2144,7 @@ READ_ONLY NO +@@ -2154,7 +2154,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_WRITE_LOCK_COUNT VARIABLE_SCOPE GLOBAL @@ -584,7 +584,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2154,7 +2154,7 @@ READ_ONLY NO +@@ -2164,7 +2164,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -593,7 +593,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2164,7 +2164,7 @@ READ_ONLY YES +@@ -2174,7 +2174,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_HASH_INSTANCES VARIABLE_SCOPE GLOBAL @@ -602,16 +602,15 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2167,7 +2167,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2217,14 +2217,14 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT Size of the cache for the MHNSW vector index + VARIABLE_COMMENT Upper limit for one MHNSW vector index cache NUMERIC_MIN_VALUE 1048576 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2204,7 +2204,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MIN_EXAMINED_ROW_LIMIT VARIABLE_SCOPE SESSION @@ -620,7 +619,7 @@ VARIABLE_COMMENT Alias for log_slow_min_examined_row_limit. Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2184,7 +2184,7 @@ READ_ONLY NO +@@ -2234,7 +2234,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MRR_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -629,7 +628,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2194,7 +2194,7 @@ READ_ONLY NO +@@ -2244,7 +2244,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_BLOCK_SIZE VARIABLE_SCOPE GLOBAL @@ -638,7 +637,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2204,7 +2204,7 @@ READ_ONLY YES +@@ -2254,7 +2254,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_DATA_POINTER_SIZE VARIABLE_SCOPE GLOBAL @@ -647,7 +646,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2227,7 +2227,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2277,7 +2277,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Restricts the total memory used for memory mapping of MyISAM tables NUMERIC_MIN_VALUE 7 @@ -656,7 +655,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2244,10 +2244,10 @@ READ_ONLY YES +@@ -2294,10 +2294,10 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MYISAM_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -669,7 +668,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2257,7 +2257,7 @@ VARIABLE_SCOPE SESSION +@@ -2307,7 +2307,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 @@ -678,7 +677,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2294,7 +2294,7 @@ READ_ONLY NO +@@ -2344,7 +2344,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME NET_BUFFER_LENGTH VARIABLE_SCOPE SESSION @@ -687,7 +686,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2304,7 +2304,7 @@ READ_ONLY NO +@@ -2354,7 +2354,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_READ_TIMEOUT VARIABLE_SCOPE SESSION @@ -696,7 +695,7 @@ VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2314,7 +2314,7 @@ READ_ONLY NO +@@ -2364,7 +2364,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_RETRY_COUNT VARIABLE_SCOPE SESSION @@ -705,7 +704,7 @@ VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2324,7 +2324,7 @@ READ_ONLY NO +@@ -2374,7 +2374,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_WRITE_TIMEOUT VARIABLE_SCOPE SESSION @@ -714,7 +713,7 @@ VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2374,7 +2374,7 @@ READ_ONLY NO +@@ -2424,7 +2424,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -723,7 +722,7 @@ VARIABLE_COMMENT If this is not 0, then mariadbd will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 or autoset then mariadbd will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2384,7 +2384,7 @@ READ_ONLY YES +@@ -2434,7 +2434,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS VARIABLE_SCOPE SESSION @@ -732,7 +731,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -2414,7 +2414,7 @@ READ_ONLY NO +@@ -2464,7 +2464,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_EXTRA_PRUNING_DEPTH VARIABLE_SCOPE SESSION @@ -741,7 +740,7 @@ VARIABLE_COMMENT If the optimizer needs to enumerate join prefix of this size or larger, then it will try aggressively prune away the search space NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2484,7 +2484,7 @@ READ_ONLY NO +@@ -2534,7 +2534,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARGS VARIABLE_SCOPE SESSION @@ -750,7 +749,7 @@ VARIABLE_COMMENT The maximum number of SEL_ARG objects created when optimizing a range. If more objects would be needed, the range will not be used by the optimizer NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2494,7 +2494,7 @@ READ_ONLY NO +@@ -2544,7 +2544,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARG_WEIGHT VARIABLE_SCOPE SESSION @@ -759,7 +758,7 @@ VARIABLE_COMMENT The maximum weight of the SEL_ARG graph. Set to 0 for no limit NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2504,7 +2504,7 @@ READ_ONLY NO +@@ -2554,7 +2554,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_PRUNE_LEVEL VARIABLE_SCOPE SESSION @@ -768,7 +767,7 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search: 1 - prune plans based on cost and number of retrieved rows eq_ref: 2 - prune also if we find an eq_ref chain NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -2574,7 +2574,7 @@ READ_ONLY NO +@@ -2624,7 +2624,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH VARIABLE_SCOPE SESSION @@ -777,7 +776,7 @@ VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2584,7 +2584,7 @@ READ_ONLY NO +@@ -2634,7 +2634,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT VARIABLE_SCOPE SESSION @@ -786,7 +785,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2614,17 +2614,17 @@ READ_ONLY NO +@@ -2664,17 +2664,17 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE VARIABLE_SCOPE SESSION @@ -807,7 +806,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join. 5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2654,7 +2654,7 @@ READ_ONLY YES +@@ -2704,7 +2704,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE VARIABLE_SCOPE GLOBAL @@ -816,7 +815,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2664,7 +2664,7 @@ READ_ONLY YES +@@ -2714,7 +2714,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE VARIABLE_SCOPE GLOBAL @@ -825,7 +824,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2674,7 +2674,7 @@ READ_ONLY YES +@@ -2724,7 +2724,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -834,7 +833,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2684,7 +2684,7 @@ READ_ONLY YES +@@ -2734,7 +2734,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -843,7 +842,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2694,7 +2694,7 @@ READ_ONLY YES +@@ -2744,7 +2744,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -852,7 +851,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2704,7 +2704,7 @@ READ_ONLY YES +@@ -2754,7 +2754,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -861,7 +860,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2714,7 +2714,7 @@ READ_ONLY YES +@@ -2764,7 +2764,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -870,7 +869,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_TRANSACTIONS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2724,7 +2724,7 @@ READ_ONLY YES +@@ -2774,7 +2774,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -879,7 +878,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_TRANSACTIONS_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2734,7 +2734,7 @@ READ_ONLY YES +@@ -2784,7 +2784,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -888,7 +887,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2744,7 +2744,7 @@ READ_ONLY YES +@@ -2794,7 +2794,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -897,7 +896,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2754,7 +2754,7 @@ READ_ONLY YES +@@ -2804,7 +2804,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE VARIABLE_SCOPE GLOBAL @@ -906,7 +905,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2764,7 +2764,7 @@ READ_ONLY YES +@@ -2814,7 +2814,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES VARIABLE_SCOPE GLOBAL @@ -915,7 +914,7 @@ VARIABLE_COMMENT Maximum number of condition instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2774,7 +2774,7 @@ READ_ONLY YES +@@ -2824,7 +2824,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES VARIABLE_SCOPE GLOBAL @@ -924,7 +923,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2784,7 +2784,7 @@ READ_ONLY YES +@@ -2834,7 +2834,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH VARIABLE_SCOPE GLOBAL @@ -933,7 +932,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2794,7 +2794,7 @@ READ_ONLY YES +@@ -2844,7 +2844,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES VARIABLE_SCOPE GLOBAL @@ -942,7 +941,7 @@ VARIABLE_COMMENT Maximum number of file instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2804,7 +2804,7 @@ READ_ONLY YES +@@ -2854,7 +2854,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES VARIABLE_SCOPE GLOBAL @@ -951,7 +950,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2814,7 +2814,7 @@ READ_ONLY YES +@@ -2864,7 +2864,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -960,7 +959,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2824,7 +2824,7 @@ READ_ONLY YES +@@ -2874,7 +2874,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_INDEX_STAT VARIABLE_SCOPE GLOBAL @@ -969,7 +968,7 @@ VARIABLE_COMMENT Maximum number of index statistics for instrumented tables. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2834,7 +2834,7 @@ READ_ONLY YES +@@ -2884,7 +2884,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MEMORY_CLASSES VARIABLE_SCOPE GLOBAL @@ -978,7 +977,7 @@ VARIABLE_COMMENT Maximum number of memory pool instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2844,7 +2844,7 @@ READ_ONLY YES +@@ -2894,7 +2894,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_METADATA_LOCKS VARIABLE_SCOPE GLOBAL @@ -987,7 +986,7 @@ VARIABLE_COMMENT Maximum number of metadata locks. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2854,7 +2854,7 @@ READ_ONLY YES +@@ -2904,7 +2904,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES VARIABLE_SCOPE GLOBAL @@ -996,7 +995,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2864,7 +2864,7 @@ READ_ONLY YES +@@ -2914,7 +2914,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1005,7 +1004,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2874,7 +2874,7 @@ READ_ONLY YES +@@ -2924,7 +2924,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PREPARED_STATEMENTS_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1014,7 +1013,7 @@ VARIABLE_COMMENT Maximum number of instrumented prepared statements. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2884,7 +2884,7 @@ READ_ONLY YES +@@ -2934,7 +2934,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PROGRAM_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1023,7 +1022,7 @@ VARIABLE_COMMENT Maximum number of instrumented programs. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2894,7 +2894,7 @@ READ_ONLY YES +@@ -2944,7 +2944,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES VARIABLE_SCOPE GLOBAL @@ -1032,7 +1031,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2904,7 +2904,7 @@ READ_ONLY YES +@@ -2954,7 +2954,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1041,7 +1040,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2914,7 +2914,7 @@ READ_ONLY YES +@@ -2964,7 +2964,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES VARIABLE_SCOPE GLOBAL @@ -1050,7 +1049,7 @@ VARIABLE_COMMENT Maximum number of socket instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2924,7 +2924,7 @@ READ_ONLY YES +@@ -2974,7 +2974,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1059,7 +1058,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2934,7 +2934,7 @@ READ_ONLY YES +@@ -2984,7 +2984,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SQL_TEXT_LENGTH VARIABLE_SCOPE GLOBAL @@ -1068,7 +1067,7 @@ VARIABLE_COMMENT Maximum length of displayed sql text NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2944,7 +2944,7 @@ READ_ONLY YES +@@ -2994,7 +2994,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES VARIABLE_SCOPE GLOBAL @@ -1077,7 +1076,7 @@ VARIABLE_COMMENT Maximum number of stage instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2954,7 +2954,7 @@ READ_ONLY YES +@@ -3004,7 +3004,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES VARIABLE_SCOPE GLOBAL @@ -1086,7 +1085,7 @@ VARIABLE_COMMENT Maximum number of statement instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2964,7 +2964,7 @@ READ_ONLY YES +@@ -3014,7 +3014,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_STACK VARIABLE_SCOPE GLOBAL @@ -1095,7 +1094,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_CURRENT NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 256 -@@ -2974,7 +2974,7 @@ READ_ONLY YES +@@ -3024,7 +3024,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES VARIABLE_SCOPE GLOBAL @@ -1104,7 +1103,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2984,7 +2984,7 @@ READ_ONLY YES +@@ -3034,7 +3034,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1113,7 +1112,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2994,7 +2994,7 @@ READ_ONLY YES +@@ -3044,7 +3044,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_LOCK_STAT VARIABLE_SCOPE GLOBAL @@ -1122,7 +1121,7 @@ VARIABLE_COMMENT Maximum number of lock statistics for instrumented tables. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3004,7 +3004,7 @@ READ_ONLY YES +@@ -3054,7 +3054,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES VARIABLE_SCOPE GLOBAL @@ -1131,7 +1130,7 @@ VARIABLE_COMMENT Maximum number of thread instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3014,7 +3014,7 @@ READ_ONLY YES +@@ -3064,7 +3064,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1140,7 +1139,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3024,7 +3024,7 @@ READ_ONLY YES +@@ -3074,7 +3074,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE VARIABLE_SCOPE GLOBAL @@ -1149,7 +1148,7 @@ VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3034,7 +3034,7 @@ READ_ONLY YES +@@ -3084,7 +3084,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE VARIABLE_SCOPE GLOBAL @@ -1158,7 +1157,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -3044,7 +3044,7 @@ READ_ONLY YES +@@ -3094,7 +3094,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE VARIABLE_SCOPE GLOBAL @@ -1167,7 +1166,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3054,7 +3054,7 @@ READ_ONLY YES +@@ -3104,7 +3104,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE VARIABLE_SCOPE GLOBAL @@ -1176,7 +1175,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3104,7 +3104,7 @@ READ_ONLY YES +@@ -3154,7 +3154,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PRELOAD_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1185,7 +1184,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3124,7 +3124,7 @@ READ_ONLY NO +@@ -3174,7 +3174,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME PROFILING_HISTORY_SIZE VARIABLE_SCOPE SESSION @@ -1194,7 +1193,7 @@ VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -3134,7 +3134,7 @@ READ_ONLY NO +@@ -3184,7 +3184,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PROGRESS_REPORT_TIME VARIABLE_SCOPE SESSION @@ -1203,7 +1202,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3194,7 +3194,7 @@ READ_ONLY NO +@@ -3244,7 +3244,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE VARIABLE_SCOPE SESSION @@ -1212,7 +1211,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3204,7 +3204,7 @@ READ_ONLY NO +@@ -3254,7 +3254,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_LIMIT VARIABLE_SCOPE GLOBAL @@ -1221,7 +1220,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3214,7 +3214,7 @@ READ_ONLY NO +@@ -3264,7 +3264,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT VARIABLE_SCOPE GLOBAL @@ -1230,7 +1229,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3227,7 +3227,7 @@ VARIABLE_SCOPE GLOBAL +@@ -3277,7 +3277,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1239,7 +1238,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3264,7 +3264,7 @@ READ_ONLY NO +@@ -3314,7 +3314,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME QUERY_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1248,7 +1247,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3277,7 +3277,7 @@ VARIABLE_SCOPE SESSION ONLY +@@ -3327,7 +3327,7 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1257,7 +1256,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3287,14 +3287,14 @@ VARIABLE_SCOPE SESSION ONLY +@@ -3337,14 +3337,14 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1274,7 +1273,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3304,7 +3304,7 @@ READ_ONLY NO +@@ -3354,7 +3354,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME READ_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1283,7 +1282,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3324,7 +3324,7 @@ READ_ONLY NO +@@ -3374,7 +3374,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME READ_RND_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1292,7 +1291,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3344,10 +3344,10 @@ READ_ONLY NO +@@ -3394,10 +3394,10 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ROWID_MERGE_BUFF_SIZE VARIABLE_SCOPE SESSION @@ -1305,7 +1304,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3384,7 +3384,7 @@ READ_ONLY YES +@@ -3434,7 +3434,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SERVER_ID VARIABLE_SCOPE SESSION @@ -1314,7 +1313,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -3484,7 +3484,7 @@ READ_ONLY NO +@@ -3534,7 +3534,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET VARIABLE_SCOPE GLOBAL @@ -1323,7 +1322,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3494,7 +3494,7 @@ READ_ONLY NO +@@ -3544,7 +3544,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLOW_LAUNCH_TIME VARIABLE_SCOPE GLOBAL @@ -1332,7 +1331,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -3537,7 +3537,7 @@ VARIABLE_SCOPE SESSION +@@ -3587,7 +3587,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1341,7 +1340,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3754,7 +3754,7 @@ READ_ONLY NO +@@ -3804,7 +3804,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME STORED_PROGRAM_CACHE VARIABLE_SCOPE GLOBAL @@ -1350,7 +1349,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -3844,7 +3844,7 @@ READ_ONLY NO +@@ -3894,7 +3894,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME TABLE_DEFINITION_CACHE VARIABLE_SCOPE GLOBAL @@ -1359,7 +1358,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 2097152 -@@ -3854,7 +3854,7 @@ READ_ONLY NO +@@ -3904,7 +3904,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE VARIABLE_SCOPE GLOBAL @@ -1368,7 +1367,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 -@@ -3914,7 +3914,7 @@ READ_ONLY NO +@@ -3964,7 +3964,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME THREAD_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -1377,7 +1376,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -3977,7 +3977,7 @@ VARIABLE_SCOPE SESSION +@@ -4027,7 +4027,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table NUMERIC_MIN_VALUE 1024 @@ -1386,22 +1385,22 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3987,7 +3987,7 @@ VARIABLE_SCOPE SESSION +@@ -4037,7 +4037,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 + NUMERIC_BLOCK_SIZE 16384 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3997,14 +3997,14 @@ VARIABLE_SCOPE SESSION +@@ -4047,14 +4047,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 + NUMERIC_BLOCK_SIZE 16384 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -1412,7 +1411,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4024,7 +4024,7 @@ READ_ONLY NO +@@ -4074,7 +4074,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME TRANSACTION_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1421,7 +1420,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4174,7 +4174,7 @@ READ_ONLY YES +@@ -4224,7 +4224,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -1430,7 +1429,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -4201,7 +4201,7 @@ order by variable_name; +@@ -4251,7 +4251,7 @@ order by variable_name; VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO 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 5a2046bb7cd..2c1da015576 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -3237,7 +3237,7 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT This variable is for internal server use NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff index 16eb033849e..e443c116e53 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff @@ -1,5 +1,3 @@ -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 0906f942121..1521ce1a728 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -44,7 +44,7 @@ READ_ONLY NO @@ -99,7 +97,7 @@ index 0906f942121..1521ce1a728 100644 @@ -227,7 +227,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE - NUMERIC_MIN_VALUE 16376 + NUMERIC_MIN_VALUE 16352 -NUMERIC_MAX_VALUE 1152921504606846975 +NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 @@ -409,7 +407,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -1944,7 +1944,7 @@ READ_ONLY NO +@@ -1954,7 +1954,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_MAX_WARNINGS VARIABLE_SCOPE SESSION @@ -418,7 +416,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Max numbers of warnings printed to slow query log per statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -1954,7 +1954,7 @@ READ_ONLY NO +@@ -1964,7 +1964,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_MIN_EXAMINED_ROW_LIMIT VARIABLE_SCOPE SESSION @@ -427,7 +425,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1994,7 +1994,7 @@ READ_ONLY NO +@@ -2004,7 +2004,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_RATE_LIMIT VARIABLE_SCOPE SESSION @@ -436,7 +434,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Write to slow log every #th slow query. Set to 1 to log everything. Increase it to reduce the size of the slow or the performance impact of slow logging NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2024,7 +2024,7 @@ READ_ONLY NO +@@ -2034,7 +2034,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_WARNINGS VARIABLE_SCOPE SESSION @@ -445,7 +443,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Log some non-critical warnings to the error log. Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2084,7 +2084,7 @@ READ_ONLY NO +@@ -2094,7 +2094,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MAX_ALLOWED_PACKET VARIABLE_SCOPE SESSION @@ -454,7 +452,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -2097,14 +2097,14 @@ VARIABLE_SCOPE GLOBAL +@@ -2107,14 +2107,14 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the transactional cache NUMERIC_MIN_VALUE 4096 @@ -471,7 +469,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value, unless `binlog_large_commit_threshold` causes rotation prematurely NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -2117,7 +2117,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2127,7 +2127,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the statement cache NUMERIC_MIN_VALUE 4096 @@ -480,7 +478,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2134,7 +2134,7 @@ READ_ONLY NO +@@ -2144,7 +2144,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_CONNECTIONS VARIABLE_SCOPE GLOBAL @@ -489,7 +487,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100000 -@@ -2144,7 +2144,7 @@ READ_ONLY NO +@@ -2154,7 +2154,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_CONNECT_ERRORS VARIABLE_SCOPE GLOBAL @@ -498,7 +496,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT If there is more than this number of interrupted connections from a host this host will be blocked from further connections NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2154,7 +2154,7 @@ READ_ONLY NO +@@ -2164,7 +2164,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_DELAYED_THREADS VARIABLE_SCOPE SESSION @@ -507,7 +505,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -2174,7 +2174,7 @@ READ_ONLY YES +@@ -2184,7 +2184,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_ERROR_COUNT VARIABLE_SCOPE SESSION @@ -516,7 +514,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -2187,14 +2187,14 @@ VARIABLE_SCOPE SESSION +@@ -2197,14 +2197,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -533,7 +531,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Alias for max_delayed_threads. Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -2214,7 +2214,7 @@ READ_ONLY NO +@@ -2224,7 +2224,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_LENGTH_FOR_SORT_DATA VARIABLE_SCOPE SESSION @@ -542,7 +540,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -2244,7 +2244,7 @@ READ_ONLY NO +@@ -2254,7 +2254,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_RECURSIVE_ITERATIONS VARIABLE_SCOPE SESSION @@ -551,7 +549,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of iterations when executing recursive queries NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2267,14 +2267,14 @@ VARIABLE_SCOPE SESSION +@@ -2277,14 +2277,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The maximum size of the container of a rowid filter NUMERIC_MIN_VALUE 1024 @@ -568,7 +566,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2294,7 +2294,7 @@ READ_ONLY NO +@@ -2304,7 +2304,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SORT_LENGTH VARIABLE_SCOPE SESSION @@ -577,7 +575,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) NUMERIC_MIN_VALUE 64 NUMERIC_MAX_VALUE 8388608 -@@ -2304,7 +2304,7 @@ READ_ONLY NO +@@ -2314,7 +2314,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SP_RECURSION_DEPTH VARIABLE_SCOPE SESSION @@ -586,7 +584,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -2354,7 +2354,7 @@ READ_ONLY NO +@@ -2364,7 +2364,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_WRITE_LOCK_COUNT VARIABLE_SCOPE GLOBAL @@ -595,7 +593,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2364,7 +2364,7 @@ READ_ONLY NO +@@ -2374,7 +2374,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -604,7 +602,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2374,7 +2374,7 @@ READ_ONLY YES +@@ -2384,7 +2384,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_HASH_INSTANCES VARIABLE_SCOPE GLOBAL @@ -613,16 +611,15 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2377,7 +2377,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2427,14 +2427,14 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT Size of the cache for the MHNSW vector index + VARIABLE_COMMENT Upper limit for one MHNSW vector index cache NUMERIC_MIN_VALUE 1048576 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2414,7 +2414,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MIN_EXAMINED_ROW_LIMIT VARIABLE_SCOPE SESSION @@ -631,7 +628,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Alias for log_slow_min_examined_row_limit. Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2394,7 +2394,7 @@ READ_ONLY NO +@@ -2444,7 +2444,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MRR_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -640,7 +637,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2404,7 +2404,7 @@ READ_ONLY NO +@@ -2454,7 +2454,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_BLOCK_SIZE VARIABLE_SCOPE GLOBAL @@ -649,7 +646,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2414,7 +2414,7 @@ READ_ONLY YES +@@ -2464,7 +2464,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_DATA_POINTER_SIZE VARIABLE_SCOPE GLOBAL @@ -658,7 +655,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2437,7 +2437,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2487,7 +2487,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Restricts the total memory used for memory mapping of MyISAM tables NUMERIC_MIN_VALUE 7 @@ -667,7 +664,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2454,10 +2454,10 @@ READ_ONLY YES +@@ -2504,10 +2504,10 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MYISAM_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -680,7 +677,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2467,7 +2467,7 @@ VARIABLE_SCOPE SESSION +@@ -2517,7 +2517,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 @@ -689,7 +686,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2504,7 +2504,7 @@ READ_ONLY NO +@@ -2554,7 +2554,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME NET_BUFFER_LENGTH VARIABLE_SCOPE SESSION @@ -698,7 +695,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2514,7 +2514,7 @@ READ_ONLY NO +@@ -2564,7 +2564,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_READ_TIMEOUT VARIABLE_SCOPE SESSION @@ -707,7 +704,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2524,7 +2524,7 @@ READ_ONLY NO +@@ -2574,7 +2574,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_RETRY_COUNT VARIABLE_SCOPE SESSION @@ -716,7 +713,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2534,7 +2534,7 @@ READ_ONLY NO +@@ -2584,7 +2584,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_WRITE_TIMEOUT VARIABLE_SCOPE SESSION @@ -725,7 +722,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2584,7 +2584,7 @@ READ_ONLY NO +@@ -2634,7 +2634,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -734,7 +731,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT If this is not 0, then mariadbd will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 or autoset then mariadbd will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2594,7 +2594,7 @@ READ_ONLY YES +@@ -2644,7 +2644,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS VARIABLE_SCOPE SESSION @@ -743,7 +740,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -2624,7 +2624,7 @@ READ_ONLY NO +@@ -2674,7 +2674,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_EXTRA_PRUNING_DEPTH VARIABLE_SCOPE SESSION @@ -752,7 +749,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT If the optimizer needs to enumerate join prefix of this size or larger, then it will try aggressively prune away the search space NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2694,7 +2694,7 @@ READ_ONLY NO +@@ -2744,7 +2744,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARGS VARIABLE_SCOPE SESSION @@ -761,7 +758,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The maximum number of SEL_ARG objects created when optimizing a range. If more objects would be needed, the range will not be used by the optimizer NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2704,7 +2704,7 @@ READ_ONLY NO +@@ -2754,7 +2754,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARG_WEIGHT VARIABLE_SCOPE SESSION @@ -770,7 +767,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The maximum weight of the SEL_ARG graph. Set to 0 for no limit NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2714,7 +2714,7 @@ READ_ONLY NO +@@ -2764,7 +2764,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_PRUNE_LEVEL VARIABLE_SCOPE SESSION @@ -779,7 +776,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search: 1 - prune plans based on cost and number of retrieved rows eq_ref: 2 - prune also if we find an eq_ref chain NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -2784,7 +2784,7 @@ READ_ONLY NO +@@ -2834,7 +2834,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH VARIABLE_SCOPE SESSION @@ -788,7 +785,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2794,7 +2794,7 @@ READ_ONLY NO +@@ -2844,7 +2844,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT VARIABLE_SCOPE SESSION @@ -797,7 +794,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2824,17 +2824,17 @@ READ_ONLY NO +@@ -2874,17 +2874,17 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE VARIABLE_SCOPE SESSION @@ -818,7 +815,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join. 5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2864,7 +2864,7 @@ READ_ONLY YES +@@ -2914,7 +2914,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE VARIABLE_SCOPE GLOBAL @@ -827,7 +824,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2874,7 +2874,7 @@ READ_ONLY YES +@@ -2924,7 +2924,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE VARIABLE_SCOPE GLOBAL @@ -836,7 +833,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2884,7 +2884,7 @@ READ_ONLY YES +@@ -2934,7 +2934,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -845,7 +842,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2894,7 +2894,7 @@ READ_ONLY YES +@@ -2944,7 +2944,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -854,7 +851,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2904,7 +2904,7 @@ READ_ONLY YES +@@ -2954,7 +2954,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -863,7 +860,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2914,7 +2914,7 @@ READ_ONLY YES +@@ -2964,7 +2964,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -872,7 +869,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2924,7 +2924,7 @@ READ_ONLY YES +@@ -2974,7 +2974,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -881,7 +878,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows in EVENTS_TRANSACTIONS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2934,7 +2934,7 @@ READ_ONLY YES +@@ -2984,7 +2984,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -890,7 +887,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows per thread in EVENTS_TRANSACTIONS_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2944,7 +2944,7 @@ READ_ONLY YES +@@ -2994,7 +2994,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -899,7 +896,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2954,7 +2954,7 @@ READ_ONLY YES +@@ -3004,7 +3004,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -908,7 +905,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2964,7 +2964,7 @@ READ_ONLY YES +@@ -3014,7 +3014,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE VARIABLE_SCOPE GLOBAL @@ -917,7 +914,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2974,7 +2974,7 @@ READ_ONLY YES +@@ -3024,7 +3024,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES VARIABLE_SCOPE GLOBAL @@ -926,7 +923,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of condition instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2984,7 +2984,7 @@ READ_ONLY YES +@@ -3034,7 +3034,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES VARIABLE_SCOPE GLOBAL @@ -935,7 +932,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2994,7 +2994,7 @@ READ_ONLY YES +@@ -3044,7 +3044,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH VARIABLE_SCOPE GLOBAL @@ -944,7 +941,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -3004,7 +3004,7 @@ READ_ONLY YES +@@ -3054,7 +3054,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES VARIABLE_SCOPE GLOBAL @@ -953,7 +950,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of file instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3014,7 +3014,7 @@ READ_ONLY YES +@@ -3064,7 +3064,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES VARIABLE_SCOPE GLOBAL @@ -962,7 +959,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of opened instrumented files NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -3024,7 +3024,7 @@ READ_ONLY YES +@@ -3074,7 +3074,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -971,7 +968,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3034,7 +3034,7 @@ READ_ONLY YES +@@ -3084,7 +3084,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_INDEX_STAT VARIABLE_SCOPE GLOBAL @@ -980,7 +977,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of index statistics for instrumented tables. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3044,7 +3044,7 @@ READ_ONLY YES +@@ -3094,7 +3094,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MEMORY_CLASSES VARIABLE_SCOPE GLOBAL @@ -989,7 +986,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of memory pool instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -3054,7 +3054,7 @@ READ_ONLY YES +@@ -3104,7 +3104,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_METADATA_LOCKS VARIABLE_SCOPE GLOBAL @@ -998,7 +995,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of metadata locks. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -3064,7 +3064,7 @@ READ_ONLY YES +@@ -3114,7 +3114,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES VARIABLE_SCOPE GLOBAL @@ -1007,7 +1004,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of mutex instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3074,7 +3074,7 @@ READ_ONLY YES +@@ -3124,7 +3124,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1016,7 +1013,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -3084,7 +3084,7 @@ READ_ONLY YES +@@ -3134,7 +3134,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PREPARED_STATEMENTS_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1025,7 +1022,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented prepared statements. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3094,7 +3094,7 @@ READ_ONLY YES +@@ -3144,7 +3144,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PROGRAM_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1034,7 +1031,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented programs. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3104,7 +3104,7 @@ READ_ONLY YES +@@ -3154,7 +3154,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES VARIABLE_SCOPE GLOBAL @@ -1043,7 +1040,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of rwlock instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3114,7 +3114,7 @@ READ_ONLY YES +@@ -3164,7 +3164,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1052,7 +1049,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -3124,7 +3124,7 @@ READ_ONLY YES +@@ -3174,7 +3174,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES VARIABLE_SCOPE GLOBAL @@ -1061,7 +1058,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of socket instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3134,7 +3134,7 @@ READ_ONLY YES +@@ -3184,7 +3184,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1070,7 +1067,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3144,7 +3144,7 @@ READ_ONLY YES +@@ -3194,7 +3194,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SQL_TEXT_LENGTH VARIABLE_SCOPE GLOBAL @@ -1079,7 +1076,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum length of displayed sql text NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -3154,7 +3154,7 @@ READ_ONLY YES +@@ -3204,7 +3204,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES VARIABLE_SCOPE GLOBAL @@ -1088,7 +1085,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of stage instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3164,7 +3164,7 @@ READ_ONLY YES +@@ -3214,7 +3214,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES VARIABLE_SCOPE GLOBAL @@ -1097,7 +1094,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of statement instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3174,7 +3174,7 @@ READ_ONLY YES +@@ -3224,7 +3224,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_STACK VARIABLE_SCOPE GLOBAL @@ -1106,7 +1103,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_CURRENT NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 256 -@@ -3184,7 +3184,7 @@ READ_ONLY YES +@@ -3234,7 +3234,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES VARIABLE_SCOPE GLOBAL @@ -1115,7 +1112,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3194,7 +3194,7 @@ READ_ONLY YES +@@ -3244,7 +3244,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1124,7 +1121,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3204,7 +3204,7 @@ READ_ONLY YES +@@ -3254,7 +3254,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_LOCK_STAT VARIABLE_SCOPE GLOBAL @@ -1133,7 +1130,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of lock statistics for instrumented tables. Use 0 to disable, -1 for automated scaling NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3214,7 +3214,7 @@ READ_ONLY YES +@@ -3264,7 +3264,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES VARIABLE_SCOPE GLOBAL @@ -1142,7 +1139,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of thread instruments NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -3224,7 +3224,7 @@ READ_ONLY YES +@@ -3274,7 +3274,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1151,7 +1148,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3234,7 +3234,7 @@ READ_ONLY YES +@@ -3284,7 +3284,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE VARIABLE_SCOPE GLOBAL @@ -1160,7 +1157,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3244,7 +3244,7 @@ READ_ONLY YES +@@ -3294,7 +3294,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE VARIABLE_SCOPE GLOBAL @@ -1169,7 +1166,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -3254,7 +3254,7 @@ READ_ONLY YES +@@ -3304,7 +3304,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE VARIABLE_SCOPE GLOBAL @@ -1178,7 +1175,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3264,7 +3264,7 @@ READ_ONLY YES +@@ -3314,7 +3314,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE VARIABLE_SCOPE GLOBAL @@ -1187,7 +1184,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3314,7 +3314,7 @@ READ_ONLY YES +@@ -3364,7 +3364,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PRELOAD_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1196,7 +1193,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3334,7 +3334,7 @@ READ_ONLY NO +@@ -3384,7 +3384,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME PROFILING_HISTORY_SIZE VARIABLE_SCOPE SESSION @@ -1205,7 +1202,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -3344,7 +3344,7 @@ READ_ONLY NO +@@ -3394,7 +3394,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PROGRESS_REPORT_TIME VARIABLE_SCOPE SESSION @@ -1214,7 +1211,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3404,7 +3404,7 @@ READ_ONLY NO +@@ -3454,7 +3454,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE VARIABLE_SCOPE SESSION @@ -1223,7 +1220,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3414,7 +3414,7 @@ READ_ONLY NO +@@ -3464,7 +3464,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_LIMIT VARIABLE_SCOPE GLOBAL @@ -1232,7 +1229,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3424,7 +3424,7 @@ READ_ONLY NO +@@ -3474,7 +3474,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT VARIABLE_SCOPE GLOBAL @@ -1241,7 +1238,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3437,7 +3437,7 @@ VARIABLE_SCOPE GLOBAL +@@ -3487,7 +3487,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1250,7 +1247,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3474,7 +3474,7 @@ READ_ONLY NO +@@ -3524,7 +3524,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME QUERY_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1259,7 +1256,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3487,7 +3487,7 @@ VARIABLE_SCOPE SESSION ONLY +@@ -3537,7 +3537,7 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1268,7 +1265,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3497,14 +3497,14 @@ VARIABLE_SCOPE SESSION ONLY +@@ -3547,14 +3547,14 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1285,7 +1282,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3517,14 +3517,14 @@ VARIABLE_SCOPE GLOBAL +@@ -3567,14 +3567,14 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Maximum speed(KB/s) to read binlog from master (0 = no limit) NUMERIC_MIN_VALUE 0 @@ -1302,7 +1299,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3544,7 +3544,7 @@ READ_ONLY NO +@@ -3594,7 +3594,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME READ_RND_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1311,7 +1308,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3774,10 +3774,10 @@ READ_ONLY NO +@@ -3824,10 +3824,10 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ROWID_MERGE_BUFF_SIZE VARIABLE_SCOPE SESSION @@ -1324,7 +1321,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3794,20 +3794,20 @@ READ_ONLY NO +@@ -3844,20 +3844,20 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_MASTER_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -1349,7 +1346,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3864,10 +3864,10 @@ READ_ONLY NO +@@ -3914,10 +3914,10 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_TRACE_LEVEL VARIABLE_SCOPE GLOBAL @@ -1362,7 +1359,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3904,7 +3904,7 @@ READ_ONLY YES +@@ -3954,7 +3954,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SERVER_ID VARIABLE_SCOPE SESSION @@ -1371,7 +1368,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -4074,7 +4074,7 @@ READ_ONLY NO +@@ -4124,7 +4124,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_DOMAIN_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1380,7 +1377,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Maximum number of parallel threads to use on slave for events in a single replication domain. When using multiple domains, this can be used to limit a single domain from grabbing all threads and thus stalling other domains. The default of 0 means to allow a domain to grab as many threads as it wants, up to the value of slave_parallel_threads NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -4104,7 +4104,7 @@ READ_ONLY YES +@@ -4154,7 +4154,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET VARIABLE_SCOPE GLOBAL @@ -1389,7 +1386,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -4134,7 +4134,7 @@ READ_ONLY NO +@@ -4184,7 +4184,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_MAX_QUEUED VARIABLE_SCOPE GLOBAL @@ -1398,7 +1395,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Limit on how much memory SQL threads should use per parallel replication thread when reading ahead in the relay log looking for opportunities for parallel replication. Only used when --slave-parallel-threads > 0 NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2147483647 -@@ -4154,7 +4154,7 @@ READ_ONLY NO +@@ -4204,7 +4204,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SLAVE_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1407,7 +1404,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT If non-zero, number of threads to spawn to apply in parallel events on the slave that were group-committed on the master or were logged with GTID in different replication domains. Note that these threads are in addition to the IO and SQL threads, which are always created by a replication slave NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -4164,7 +4164,7 @@ READ_ONLY NO +@@ -4214,7 +4214,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_WORKERS VARIABLE_SCOPE GLOBAL @@ -1416,7 +1413,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Alias for slave_parallel_threads NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -4204,7 +4204,7 @@ READ_ONLY NO +@@ -4254,7 +4254,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME SLAVE_TRANSACTION_RETRIES VARIABLE_SCOPE GLOBAL @@ -1425,7 +1422,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock, elapsed lock wait timeout or listed in slave_transaction_retry_errors, before giving up and stopping NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -4224,7 +4224,7 @@ READ_ONLY YES +@@ -4274,7 +4274,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_TRANSACTION_RETRY_INTERVAL VARIABLE_SCOPE GLOBAL @@ -1434,7 +1431,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3600 -@@ -4244,7 +4244,7 @@ READ_ONLY NO +@@ -4294,7 +4294,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLOW_LAUNCH_TIME VARIABLE_SCOPE GLOBAL @@ -1443,7 +1440,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -4287,7 +4287,7 @@ VARIABLE_SCOPE SESSION +@@ -4337,7 +4337,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1452,7 +1449,7 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4514,7 +4514,7 @@ READ_ONLY NO +@@ -4564,7 +4564,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME STORED_PROGRAM_CACHE VARIABLE_SCOPE GLOBAL @@ -1461,7 +1458,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -4624,7 +4624,7 @@ READ_ONLY NO +@@ -4674,7 +4674,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME TABLE_DEFINITION_CACHE VARIABLE_SCOPE GLOBAL @@ -1470,7 +1467,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 2097152 -@@ -4634,7 +4634,7 @@ READ_ONLY NO +@@ -4684,7 +4684,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE VARIABLE_SCOPE GLOBAL @@ -1479,7 +1476,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 -@@ -4694,7 +4694,7 @@ READ_ONLY NO +@@ -4744,7 +4744,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME THREAD_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -1488,7 +1485,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -4847,7 +4847,7 @@ VARIABLE_SCOPE SESSION +@@ -4897,7 +4897,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table NUMERIC_MIN_VALUE 1024 @@ -1497,22 +1494,22 @@ index 0906f942121..1521ce1a728 100644 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4857,7 +4857,7 @@ VARIABLE_SCOPE SESSION +@@ -4907,7 +4907,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 + NUMERIC_BLOCK_SIZE 16384 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4867,14 +4867,14 @@ VARIABLE_SCOPE SESSION +@@ -4917,14 +4917,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 + NUMERIC_BLOCK_SIZE 16384 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -1523,7 +1520,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4894,7 +4894,7 @@ READ_ONLY NO +@@ -4944,7 +4944,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME TRANSACTION_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1532,7 +1529,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -5044,7 +5044,7 @@ READ_ONLY YES +@@ -5094,7 +5094,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -1541,7 +1538,7 @@ index 0906f942121..1521ce1a728 100644 VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -5071,7 +5071,7 @@ order by variable_name; +@@ -5121,7 +5121,7 @@ order by variable_name; VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL 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 165c2bf9991..00f5095a49d 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -3447,7 +3447,7 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT This variable is for internal server use NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/t/replicate_do_db_basic.test b/mysql-test/suite/sys_vars/t/replicate_do_db_basic.test index 2ff32df8e15..41095ef9f65 100644 --- a/mysql-test/suite/sys_vars/t/replicate_do_db_basic.test +++ b/mysql-test/suite/sys_vars/t/replicate_do_db_basic.test @@ -59,3 +59,9 @@ SELECT @@GLOBAL.replicate_do_db; --echo # Cleanup. SET @@GLOBAL.replicate_do_db = @save_replicate_do_db; + +--echo # +--echo # MDEV-35688 UBSAN: SUMMARY: UndefinedBehaviorSanitizer: nullptr-with-offset in my_casedn_utf8mb3 +--echo # + +show variables like 'replicate_do_db'; diff --git a/mysql-test/suite/sys_vars/t/sysvars_innodb.test b/mysql-test/suite/sys_vars/t/sysvars_innodb.test index 86f5ffddf1c..2680e442da4 100644 --- a/mysql-test/suite/sys_vars/t/sysvars_innodb.test +++ b/mysql-test/suite/sys_vars/t/sysvars_innodb.test @@ -11,7 +11,6 @@ select VARIABLE_NAME, SESSION_VALUE, DEFAULT_VALUE, VARIABLE_SCOPE, VARIABLE_TYP 'innodb_numa_interleave', # only available WITH_NUMA 'innodb_evict_tables_on_commit_debug', # one may want to override this 'innodb_use_native_aio', # default value depends on OS - 'innodb_log_file_mmap', # only available on 64-bit 'innodb_log_file_buffering', # only available on Linux and Windows 'innodb_buffer_pool_load_pages_abort') # debug build only, and is only for testing order by variable_name; diff --git a/mysql-test/suite/vcol/r/vcol_misc.result b/mysql-test/suite/vcol/r/vcol_misc.result index 3aa1e472685..bf5495b92e1 100644 --- a/mysql-test/suite/vcol/r/vcol_misc.result +++ b/mysql-test/suite/vcol/r/vcol_misc.result @@ -577,3 +577,17 @@ drop table t; # # End of 10.4 tests # +# +# MDEV-26891 Segfault in Field::register_field_in_read_map upon INSERT DELAYED with virtual columns +# +CREATE TABLE t ( +id INT AUTO_INCREMENT, +a varchar(16) NOT NULL DEFAULT '', +b varchar(16) GENERATED ALWAYS AS (a) VIRTUAL, +KEY `col_year` (b(8),id) +) ENGINE=MyISAM; +INSERT DELAYED INTO t (a) VALUES ('foo'),('bar'); +DROP TABLE t; +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/vcol/t/vcol_misc.test b/mysql-test/suite/vcol/t/vcol_misc.test index d788f502b6a..91654923bd6 100644 --- a/mysql-test/suite/vcol/t/vcol_misc.test +++ b/mysql-test/suite/vcol/t/vcol_misc.test @@ -541,3 +541,22 @@ drop table t; --echo # --echo # End of 10.4 tests --echo # + +--echo # +--echo # MDEV-26891 Segfault in Field::register_field_in_read_map upon INSERT DELAYED with virtual columns +--echo # +CREATE TABLE t ( + id INT AUTO_INCREMENT, + a varchar(16) NOT NULL DEFAULT '', + b varchar(16) GENERATED ALWAYS AS (a) VIRTUAL, + KEY `col_year` (b(8),id) +) ENGINE=MyISAM; + +INSERT DELAYED INTO t (a) VALUES ('foo'),('bar'); + +# Cleanup +DROP TABLE t; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/suite/versioning/r/data.result b/mysql-test/suite/versioning/r/data.result index fbd0da43696..b06744998ca 100644 --- a/mysql-test/suite/versioning/r/data.result +++ b/mysql-test/suite/versioning/r/data.result @@ -12,7 +12,7 @@ set timestamp=default; #MYSQL_DUMP --compact test /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `x` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci WITH SYSTEM VERSIONING; @@ -22,7 +22,7 @@ INSERT INTO `t1` VALUES #MYSQL_DUMP --compact --as-of="1990-01-02 00:00" test /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `x` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci WITH SYSTEM VERSIONING; @@ -38,7 +38,7 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET u USE `test`; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `x` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci WITH SYSTEM VERSIONING; @@ -50,7 +50,7 @@ INSERT INTO `t1` VALUES #MYSQL_DUMP --compact --as-of="1990-08-04 00:00" test t1 /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `x` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci WITH SYSTEM VERSIONING; @@ -93,7 +93,7 @@ x check_fields(x, row_start, row_end) 2 [CORRECT] /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `x` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci WITH SYSTEM VERSIONING; @@ -103,7 +103,7 @@ INSERT INTO `t1` (`x`, row_start, row_end) VALUES (1,'2010-10-10 10:10:10.101010 (2,'2010-10-10 10:10:10.101010','MAX_TIME'); /*M!101100 SET system_versioning_insert_history=@old_system_versioning_insert_history */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `x` int(11) DEFAULT NULL, `row_start` timestamp(6) GENERATED ALWAYS AS ROW START INVISIBLE, @@ -201,7 +201,7 @@ mariadb-dump: Cannot use --dump-history for table `t1` with transaction-precise mariadb-dump: Cannot use --dump-history for table `t1` with transaction-precise history /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t1` ( `x` int(11) DEFAULT NULL, `rs` bigint(20) unsigned GENERATED ALWAYS AS ROW START, diff --git a/mysql-test/suite/versioning/r/old_timestamp.result b/mysql-test/suite/versioning/r/old_timestamp.result index 72e94b89019..64a2aae612d 100644 --- a/mysql-test/suite/versioning/r/old_timestamp.result +++ b/mysql-test/suite/versioning/r/old_timestamp.result @@ -1,6 +1,6 @@ /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `sv_basic` ( `a` int(11) NOT NULL, PRIMARY KEY (`a`) @@ -12,7 +12,7 @@ INSERT INTO `sv_basic` (`a`, row_start, row_end) VALUES (1,'2023-12-19 14:23:22. (3,'2023-12-19 14:23:22.304434','2038-01-19 03:14:07.999999'); /*M!101100 SET system_versioning_insert_history=@old_system_versioning_insert_history */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `sv_explicit` ( `a` int(11) DEFAULT NULL, `row_foo_start` timestamp(6) GENERATED ALWAYS AS ROW START, @@ -27,7 +27,7 @@ INSERT INTO `sv_explicit` VALUES (3,'2023-12-19 14:23:22.358302','2038-01-19 03:14:07.999999'); /*M!101100 SET system_versioning_insert_history=@old_system_versioning_insert_history */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `sv_partition` ( `a` int(11) NOT NULL, PRIMARY KEY (`a`) @@ -43,7 +43,7 @@ INSERT INTO `sv_partition` (`a`, row_start, row_end) VALUES (2,'2023-12-19 14:23 /*M!101100 SET system_versioning_insert_history=@old_system_versioning_insert_history */; /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `sv_basic` ( `a` int(11) NOT NULL, PRIMARY KEY (`a`) @@ -55,7 +55,7 @@ INSERT INTO `sv_basic` (`a`, row_start, row_end) VALUES (1,'2023-12-19 14:23:22. (3,'2023-12-19 14:23:22.304434','2106-02-07 06:28:15.999999'); /*M!101100 SET system_versioning_insert_history=@old_system_versioning_insert_history */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `sv_explicit` ( `a` int(11) DEFAULT NULL, `row_foo_start` timestamp(6) GENERATED ALWAYS AS ROW START, @@ -70,7 +70,7 @@ INSERT INTO `sv_explicit` VALUES (3,'2023-12-19 14:23:22.358302','2106-02-07 06:28:15.999999'); /*M!101100 SET system_versioning_insert_history=@old_system_versioning_insert_history */; /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `sv_partition` ( `a` int(11) NOT NULL, PRIMARY KEY (`a`) diff --git a/mysql-test/suite/versioning/r/replace.result b/mysql-test/suite/versioning/r/replace.result index 8ac4047c5ff..c64f42ee7cf 100644 --- a/mysql-test/suite/versioning/r/replace.result +++ b/mysql-test/suite/versioning/r/replace.result @@ -27,7 +27,9 @@ id x current 1 2 0 1 3 1 drop table t; +# # MDEV-15645 Assertion `table->insert_values' failed in write_record upon REPLACE into a view with underlying versioned table +# create or replace table t1 (a int, b int, primary key (a), unique(b)) with system versioning; insert into t1 values (1,1); create or replace table t2 (c int); @@ -48,7 +50,9 @@ INSERT INTO t1 () VALUES (),(),(),(),(),(); UPDATE IGNORE t1 SET f = 1; REPLACE t1 SELECT * FROM t1; DROP TABLE t1; +# # MDEV-22540 ER_DUP_ENTRY upon REPLACE or Assertion failed +# set timestamp=1589245268.41934; create table t1 (a int primary key) with system versioning; insert into t1 values (1),(2); @@ -72,3 +76,15 @@ Warnings: Warning 1062 Duplicate entry '1' for key 'a' load data infile '15330.data' replace into table t1 (a,b,c); drop table t1; +# +# MDEV-35343 unexpected replace behaviour when long unique index on system versioned table +# +create table t1 (data char(10)); +insert into t1 values ('o'); +alter ignore table t1 add unique index (data); +alter ignore table t1 add unique index (data); +Warnings: +Note 1831 Duplicate index `data_2`. This is deprecated and will be disallowed in a future release +alter table t1 add system versioning; +replace into t1 values ('o'), ('o'); +drop table t1; diff --git a/mysql-test/suite/versioning/t/replace.test b/mysql-test/suite/versioning/t/replace.test index d69eebd1b9c..c10b6aa443d 100644 --- a/mysql-test/suite/versioning/t/replace.test +++ b/mysql-test/suite/versioning/t/replace.test @@ -35,7 +35,9 @@ replace t values (1, 3); select *, current_row(row_end) as current from t for system_time all order by x; drop table t; +--echo # --echo # MDEV-15645 Assertion `table->insert_values' failed in write_record upon REPLACE into a view with underlying versioned table +--echo # create or replace table t1 (a int, b int, primary key (a), unique(b)) with system versioning; insert into t1 values (1,1); create or replace table t2 (c int); @@ -59,7 +61,9 @@ UPDATE IGNORE t1 SET f = 1; REPLACE t1 SELECT * FROM t1; DROP TABLE t1; +--echo # --echo # MDEV-22540 ER_DUP_ENTRY upon REPLACE or Assertion failed +--echo # set timestamp=1589245268.41934; create table t1 (a int primary key) with system versioning; insert into t1 values (1),(2); @@ -105,4 +109,15 @@ drop table t1; eval set default_storage_engine= $default_engine; --enable_query_log +--echo # +--echo # MDEV-35343 unexpected replace behaviour when long unique index on system versioned table +--echo # +create table t1 (data char(10)); +insert into t1 values ('o'); +alter ignore table t1 add unique index (data); +alter ignore table t1 add unique index (data); +alter table t1 add system versioning; +replace into t1 values ('o'), ('o'); +drop table t1; + --source suite/versioning/common_finish.inc diff --git a/mysql-test/suite/wsrep/disabled.def b/mysql-test/suite/wsrep/disabled.def index f4145211680..fcaf38a3d7b 100644 --- a/mysql-test/suite/wsrep/disabled.def +++ b/mysql-test/suite/wsrep/disabled.def @@ -9,5 +9,3 @@ # Do not use any TAB characters for whitespace. # ############################################################################## - - diff --git a/mysql-test/suite/wsrep/r/wsrep_provider_plugin_defaults.result b/mysql-test/suite/wsrep/r/wsrep_provider_plugin_defaults.result index cefeb85d3e3..e5651383235 100644 --- a/mysql-test/suite/wsrep/r/wsrep_provider_plugin_defaults.result +++ b/mysql-test/suite/wsrep/r/wsrep_provider_plugin_defaults.result @@ -1184,16 +1184,16 @@ COMMAND_LINE_ARGUMENT REQUIRED GLOBAL_VALUE_PATH NULL VARIABLE_NAME WSREP_PROVIDER_SOCKET_SSL_CIPHER SESSION_VALUE NULL -GLOBAL_VALUE OFF +GLOBAL_VALUE GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE OFF +DEFAULT_VALUE VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BOOLEAN +VARIABLE_TYPE VARCHAR VARIABLE_COMMENT Wsrep provider option NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST OFF,ON +ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED GLOBAL_VALUE_PATH NULL diff --git a/mysql-test/suite/wsrep/t/MDEV-23081.test b/mysql-test/suite/wsrep/t/MDEV-23081.test index 04305b22b24..6cd7d6dd037 100644 --- a/mysql-test/suite/wsrep/t/MDEV-23081.test +++ b/mysql-test/suite/wsrep/t/MDEV-23081.test @@ -7,6 +7,11 @@ --source include/have_wsrep_provider.inc --source include/have_debug_sync.inc +--let $log_bin=1 +if (`select not @@log_bin`) { +--let $log_bin=0 +} + CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; # @@ -40,7 +45,14 @@ SET DEBUG_SYNC = "now WAIT_FOR before_commit_order_reached_1"; # and restart it with wsrep-on=OFF # let $restart_noprint=2; ---let $restart_parameters=--wsrep-on=OFF +if ($log_bin == 0) { +# The database could have been created with --log-bin +# and so let's add this parameter explicitly: +--let $restart_parameters=--wsrep-on=OFF --loose-innodb --loose-log-bin +} +if ($log_bin == 1) { +--let $restart_parameters=--wsrep-on=OFF --loose-innodb +} --source include/start_mysqld.inc # diff --git a/mysql-test/suite/wsrep/t/wsrep_provider_plugin_defaults.test b/mysql-test/suite/wsrep/t/wsrep_provider_plugin_defaults.test index d8512aaa6f1..78198051f34 100644 --- a/mysql-test/suite/wsrep/t/wsrep_provider_plugin_defaults.test +++ b/mysql-test/suite/wsrep/t/wsrep_provider_plugin_defaults.test @@ -1,7 +1,7 @@ --source include/have_wsrep.inc --source include/have_innodb.inc ---let $galera_version=26.4.17 +--let $galera_version=26.4.21 source include/check_galera_version.inc; SELECT COUNT(*) FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_provider%' AND VARIABLE_NAME NOT IN ( diff --git a/mysys/charset.c b/mysys/charset.c index 44680a02ce9..5ac78b9667b 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -646,8 +646,8 @@ void add_compiled_extra_collation(struct charset_info_st *cs) corresponding utf8mb4_1400 collation */ -my_bool add_alias_for_collation(LEX_CSTRING *collation_name, LEX_CSTRING *alias, - uint alias_id) +my_bool add_alias_for_collation(LEX_CSTRING *collation_name, uint org_id, + LEX_CSTRING *alias, uint alias_id) { char *coll_name, *comment; struct charset_info_st *new_ci; @@ -655,12 +655,17 @@ my_bool add_alias_for_collation(LEX_CSTRING *collation_name, LEX_CSTRING *alias, MY_CHARSET_LOADER loader; char comment_buff[64+15]; size_t comment_length; - uint org_id= get_collation_number_internal(collation_name->str); - DBUG_ASSERT(org_id); DBUG_ASSERT(all_charsets[org_id]); if (!(org= all_charsets[org_id])) return 1; + + DBUG_ASSERT(!strcmp(org->coll_name.str, collation_name->str)); +#ifdef DEBUG_PRINT_ALIAS + fprintf(stderr, "alias: %s collation: %s org_id: %u\n", + alias->str, collation_name->str, org_id); +#endif + /* We have to init the character set to ensure it is not changed after we copy it. diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index 54d0a376a8c..2641281ad07 100644 --- a/mysys/mf_iocache.c +++ b/mysys/mf_iocache.c @@ -1820,7 +1820,7 @@ int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock) info->write_pos= info->write_buffer; ++info->disk_writes; UNLOCK_APPEND_BUFFER; - DBUG_RETURN(info->error); + DBUG_RETURN(0); } } UNLOCK_APPEND_BUFFER; diff --git a/mysys/tree.c b/mysys/tree.c index cd44f779e6f..db0442fa827 100644 --- a/mysys/tree.c +++ b/mysys/tree.c @@ -494,6 +494,9 @@ void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs, int r_offs) { TREE_ELEMENT *x= **last_pos; + + if (x == &null_element) + return NULL; if (ELEMENT_CHILD(x, r_offs) != &null_element) { diff --git a/mysys_ssl/openssl.c b/mysys_ssl/openssl.c index e0271817309..3890e3524be 100644 --- a/mysys_ssl/openssl.c +++ b/mysys_ssl/openssl.c @@ -36,8 +36,12 @@ int check_openssl_compatibility() static uint testing; static size_t alloc_size, alloc_count; -static void *coc_malloc(size_t size, const char *f __attribute__((unused)), - int l __attribute__((unused))) +static void *coc_malloc(size_t size +#ifndef LIBRESSL_VERSION_NUMBER + , const char *f __attribute__((unused)), + int l __attribute__((unused)) +#endif +) { if (unlikely(testing)) { @@ -47,15 +51,22 @@ static void *coc_malloc(size_t size, const char *f __attribute__((unused)), return malloc(size); } -static void *coc_realloc(void *addr, size_t num, - const char *file __attribute__((unused)), - int line __attribute__((unused))) +static void *coc_realloc(void *addr, size_t num +#ifndef LIBRESSL_VERSION_NUMBER + , const char *file __attribute__((unused)), + int line __attribute__((unused)) +#endif +) { return realloc(addr, num); } -static void coc_free(void *addr, const char *file __attribute__((unused)), - int line __attribute__((unused))) +static void coc_free(void *addr +#ifndef LIBRESSL_VERSION_NUMBER + , const char *file __attribute__((unused)), + int line __attribute__((unused)) +#endif +) { free(addr); } diff --git a/plugin/feedback/feedback.cc b/plugin/feedback/feedback.cc index bc8a98c11ae..aebd92b0a81 100644 --- a/plugin/feedback/feedback.cc +++ b/plugin/feedback/feedback.cc @@ -28,7 +28,7 @@ ulong debug_startup_interval, debug_first_interval, debug_interval; /* backing store for system variables */ static char *url, *http_proxy; -char *user_info; +char *user_info, *server_uid_ptr= server_uid; ulong send_timeout, send_retry_wait; /** @@ -356,6 +356,9 @@ static int free(void *p) #define DEFAULT_PROTO "http://" #endif +static MYSQL_SYSVAR_STR(server_uid, server_uid_ptr, + PLUGIN_VAR_READONLY | PLUGIN_VAR_NOCMDOPT, + "Automatically calculated server unique id hash", NULL, NULL, 0); static MYSQL_SYSVAR_STR(user_info, user_info, PLUGIN_VAR_READONLY | PLUGIN_VAR_RQCMDARG, "User specified string that will be included in the feedback report", @@ -386,6 +389,7 @@ static MYSQL_SYSVAR_ULONG(debug_interval, debug_interval, #endif static struct st_mysql_sys_var* settings[] = { + MYSQL_SYSVAR(server_uid), MYSQL_SYSVAR(user_info), MYSQL_SYSVAR(url), MYSQL_SYSVAR(send_timeout), diff --git a/plugin/handler_socket/client/hslongrun.cpp b/plugin/handler_socket/client/hslongrun.cpp index b7c02951340..a9fba1dc7c3 100644 --- a/plugin/handler_socket/client/hslongrun.cpp +++ b/plugin/handler_socket/client/hslongrun.cpp @@ -927,7 +927,7 @@ hs_longrun_main(int argc, char **argv) shared.verbose = shared.conf.get_int("verbose", 1); const int table_size = shared.conf.get_int("table_size", 10000); for (int i = 0; i < table_size; ++i) { - std::auto_ptr rec(new record_value()); + std::unique_ptr rec(new record_value()); rec->key = to_stdstring(i); shared.records.push_back_ptr(rec); } @@ -966,7 +966,7 @@ hs_longrun_main(int argc, char **argv) int id = thrs.size(); const hs_longrun_thread_hs::arg_type arg(id, e.type, e.op, e.lock, shared); - std::auto_ptr thr; + std::unique_ptr thr; if (e.hs) { thr.reset(new hs_longrun_thread_hs(arg)); } else { diff --git a/plugin/handler_socket/client/hstest.cpp b/plugin/handler_socket/client/hstest.cpp index b5551fed81c..72e8a225de9 100644 --- a/plugin/handler_socket/client/hstest.cpp +++ b/plugin/handler_socket/client/hstest.cpp @@ -561,7 +561,7 @@ hstest_thread::test_9(int test_num) flds += std::string(buf); } int connected = 0; - std::auto_ptr stmt; + std::unique_ptr stmt; string_buffer wbuf; for (int i = 0; i < num; ++i) { const double tm1 = gettimeofday_double(); @@ -1474,7 +1474,7 @@ hstest_main(int argc, char **argv) #endif const int num_thrs = shared.num_threads; typedef thread thread_type; - typedef std::auto_ptr thread_ptr; + typedef std::unique_ptr thread_ptr; typedef auto_ptrcontainer< std::vector > thrs_type; thrs_type thrs; for (int i = 0; i < num_thrs; ++i) { diff --git a/plugin/handler_socket/handlersocket/database.cpp b/plugin/handler_socket/handlersocket/database.cpp index 0a006a42f00..9441863070c 100644 --- a/plugin/handler_socket/handlersocket/database.cpp +++ b/plugin/handler_socket/handlersocket/database.cpp @@ -175,7 +175,7 @@ struct dbcontext : public dbcontext_i, private noncopyable { THD *thd; MYSQL_LOCK *lock; bool lock_failed; - std::auto_ptr user_lock; + std::unique_ptr user_lock; int user_level_lock_timeout; bool user_level_lock_locked; bool commit_error; diff --git a/plugin/handler_socket/handlersocket/database.hpp b/plugin/handler_socket/handlersocket/database.hpp index 9e2aadf7380..87761050704 100644 --- a/plugin/handler_socket/handlersocket/database.hpp +++ b/plugin/handler_socket/handlersocket/database.hpp @@ -9,11 +9,6 @@ #ifndef DENA_DATABASE_HPP #define DENA_DATABASE_HPP -#ifdef __GNUC__ -/* auto_ptr is deprecated */ -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - #include #include #include @@ -26,10 +21,10 @@ namespace dena { struct database_i; -typedef std::auto_ptr database_ptr; +typedef std::unique_ptr database_ptr; struct dbcontext_i; -typedef std::auto_ptr dbcontext_ptr; +typedef std::unique_ptr dbcontext_ptr; struct database_i { virtual ~database_i() = default; diff --git a/plugin/handler_socket/handlersocket/handlersocket.cpp b/plugin/handler_socket/handlersocket/handlersocket.cpp index 45c9e13b2ca..c513afb7dd5 100644 --- a/plugin/handler_socket/handlersocket/handlersocket.cpp +++ b/plugin/handler_socket/handlersocket/handlersocket.cpp @@ -76,7 +76,7 @@ daemon_handlersocket_init(void *p) conf["readsize"] = to_stdstring(handlersocket_readsize); conf["accept_balance"] = to_stdstring(handlersocket_accept_balance); conf["wrlock_timeout"] = to_stdstring(handlersocket_wrlock_timeout); - std::auto_ptr ap(new daemon_handlersocket_data); + std::unique_ptr ap(new daemon_handlersocket_data); if (handlersocket_port != 0 && handlersocket_port_wr != handlersocket_port) { conf["port"] = handlersocket_port; if (handlersocket_plain_secret) { diff --git a/plugin/handler_socket/handlersocket/hstcpsvr.cpp b/plugin/handler_socket/handlersocket/hstcpsvr.cpp index 336d36422b0..72435b80331 100644 --- a/plugin/handler_socket/handlersocket/hstcpsvr.cpp +++ b/plugin/handler_socket/handlersocket/hstcpsvr.cpp @@ -115,7 +115,7 @@ hstcpsvr::start_listen() arg.cshared = &cshared; arg.vshared = &vshared; arg.worker_id = i; - std::auto_ptr< thread > thr( + std::unique_ptr< thread > thr( new thread(arg, stack_size)); threads.push_back_ptr(thr); } diff --git a/plugin/handler_socket/handlersocket/hstcpsvr.hpp b/plugin/handler_socket/handlersocket/hstcpsvr.hpp index 5fbed92402b..3bb17c9ea0b 100644 --- a/plugin/handler_socket/handlersocket/hstcpsvr.hpp +++ b/plugin/handler_socket/handlersocket/hstcpsvr.hpp @@ -44,7 +44,7 @@ struct hstcpsvr_shared_v : public mutex { }; struct hstcpsvr_i; -typedef std::auto_ptr hstcpsvr_ptr; +typedef std::unique_ptr hstcpsvr_ptr; struct hstcpsvr_i { virtual ~hstcpsvr_i() = default; diff --git a/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp b/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp index 0796546cb5e..818d7327896 100644 --- a/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp +++ b/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp @@ -451,7 +451,7 @@ hstcpsvr_worker::run_one_nb() { pollfd& pfd = pfds[nfds - 1]; if ((pfd.revents & mask_in) != 0) { - std::auto_ptr c(new hstcpsvr_conn()); + std::unique_ptr c(new hstcpsvr_conn()); c->nonblocking = true; c->readsize = cshared.readsize; c->accept(cshared); @@ -498,7 +498,7 @@ hstcpsvr_worker::run_one_ep() /* listener */ ++accept_count; DBG_EP(fprintf(stderr, "IN listener\n")); - std::auto_ptr c(new hstcpsvr_conn()); + std::unique_ptr c(new hstcpsvr_conn()); c->nonblocking = true; c->readsize = cshared.readsize; c->accept(cshared); diff --git a/plugin/handler_socket/handlersocket/hstcpsvr_worker.hpp b/plugin/handler_socket/handlersocket/hstcpsvr_worker.hpp index 25612adec0f..2a2a5083e31 100644 --- a/plugin/handler_socket/handlersocket/hstcpsvr_worker.hpp +++ b/plugin/handler_socket/handlersocket/hstcpsvr_worker.hpp @@ -14,7 +14,7 @@ namespace dena { struct hstcpsvr_worker_i; -typedef std::auto_ptr hstcpsvr_worker_ptr; +typedef std::unique_ptr hstcpsvr_worker_ptr; struct hstcpsvr_worker_arg { const hstcpsvr_shared_c *cshared; diff --git a/plugin/handler_socket/libhsclient/hstcpcli.hpp b/plugin/handler_socket/libhsclient/hstcpcli.hpp index d078bdfd533..3428c2f240e 100644 --- a/plugin/handler_socket/libhsclient/hstcpcli.hpp +++ b/plugin/handler_socket/libhsclient/hstcpcli.hpp @@ -19,11 +19,6 @@ #include "string_ref.hpp" #include "string_buffer.hpp" -#ifdef __GNUC__ -/* auto_ptr is deprecated */ -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - namespace dena { struct hstcpcli_filter { @@ -35,7 +30,7 @@ struct hstcpcli_filter { }; struct hstcpcli_i; -typedef std::auto_ptr hstcpcli_ptr; +typedef std::unique_ptr hstcpcli_ptr; struct hstcpcli_i { virtual ~hstcpcli_i() = default; diff --git a/plugin/type_uuid/mysql-test/type_uuid/order.result b/plugin/type_uuid/mysql-test/type_uuid/order.result index f89aa256cfa..abbae90a382 100644 --- a/plugin/type_uuid/mysql-test/type_uuid/order.result +++ b/plugin/type_uuid/mysql-test/type_uuid/order.result @@ -625,6 +625,7 @@ a b a b 15901234-5566-e777-e888-99aabbccddee 59 15901234-5566-e777-e888-99aabbccddee 59 16101234-5566-f777-8888-99aabbccddee 61 16101234-5566-f777-8888-99aabbccddee 61 16301234-5566-f777-e888-99aabbccddee 63 16301234-5566-f777-e888-99aabbccddee 63 +Warnings: Warning 1292 Incorrect uuid value: '03201234-5566-8777-0888-99aabbccddee' Warning 1292 Incorrect uuid value: '03201234-5566-8777-0888-99aabbccddee' Warning 1292 Incorrect uuid value: '03201234-5566-8777-0888-99aabbccddee' @@ -689,7 +690,6 @@ Warning 1292 Incorrect uuid value: '05601234-5566-e777-0888-99aabbccddee' Warning 1292 Incorrect uuid value: '05601234-5566-e777-0888-99aabbccddee' Warning 1292 Incorrect uuid value: '05601234-5566-e777-0888-99aabbccddee' Warning 1292 Incorrect uuid value: '06001234-5566-f777-0888-99aabbccddee' -Warnings: select * from t1 union select * from t2; a b 00001234-5566-0777-0888-99aabbccddee 0 diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_in.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_in.result new file mode 100644 index 00000000000..4e47aeebfe8 --- /dev/null +++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_in.result @@ -0,0 +1,101 @@ +CREATE TABLE t1 (id UUID NOT NULL); +INSERT INTO t1 (`id`) VALUES ('e8748eee-fabe-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('036d4fc5-fabf-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('2acf42cc-fabf-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('594a8970-fabf-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('4238a6e5-fac1-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('6d001a4d-fac1-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('e4e67615-fad5-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('1ec69927-30f3-62ca-a0a0-4b98bb6957f8'); +INSERT INTO t1 (`id`) VALUES ('1ec6992e-5c9e-6b2a-a21b-fbc054a2075e'); +INSERT INTO t1 (`id`) VALUES ('1ec6992e-e5be-6342-8293-e107448b2cd5'); +SELECT * FROM t1 WHERE id IN ( +'036d4fc5-fabf-11eb-af18-005056bc575d', +'e8748eee-fabe-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8', +'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e', +'1ec6992e-e5be-6342-8293-e107448b2cd5' +) ORDER BY id; +id +e8748eee-fabe-11eb-af18-005056bc575d +036d4fc5-fabf-11eb-af18-005056bc575d +2acf42cc-fabf-11eb-af18-005056bc575d +594a8970-fabf-11eb-af18-005056bc575d +4238a6e5-fac1-11eb-af18-005056bc575d +6d001a4d-fac1-11eb-af18-005056bc575d +e4e67615-fad5-11eb-af18-005056bc575d +1ec69927-30f3-62ca-a0a0-4b98bb6957f8 +1ec6992e-5c9e-6b2a-a21b-fbc054a2075e +1ec6992e-e5be-6342-8293-e107448b2cd5 +SELECT * FROM t1 WHERE id IN ( +'e8748eee-fabe-11eb-af18-005056bc575d', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8', +'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e', +'1ec6992e-e5be-6342-8293-e107448b2cd5' +) ORDER BY id; +id +e8748eee-fabe-11eb-af18-005056bc575d +036d4fc5-fabf-11eb-af18-005056bc575d +2acf42cc-fabf-11eb-af18-005056bc575d +594a8970-fabf-11eb-af18-005056bc575d +4238a6e5-fac1-11eb-af18-005056bc575d +6d001a4d-fac1-11eb-af18-005056bc575d +e4e67615-fad5-11eb-af18-005056bc575d +1ec69927-30f3-62ca-a0a0-4b98bb6957f8 +1ec6992e-5c9e-6b2a-a21b-fbc054a2075e +1ec6992e-e5be-6342-8293-e107448b2cd5 +DROP TABLE t1; +CREATE TABLE t1 (id uuid); +INSERT INTO t1 (id) VALUES +('e8748eee-fabe-11eb-af18-005056bc575d'), +('036d4fc5-fabf-11eb-af18-005056bc575d'); +SELECT * FROM t1 WHERE id IN ( +'e8748eee-fabe-11eb-af18-005056bc575d', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8' +) ORDER BY id; +id +e8748eee-fabe-11eb-af18-005056bc575d +036d4fc5-fabf-11eb-af18-005056bc575d +SELECT * FROM t1 WHERE id IN ( +'e8748eee-fabe-11eb-af18-005056bc575d', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d' +) ORDER BY id; +id +e8748eee-fabe-11eb-af18-005056bc575d +036d4fc5-fabf-11eb-af18-005056bc575d +SELECT * FROM t1 WHERE id IN ( +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'e8748eee-fabe-11eb-af18-005056bc575d' +) ORDER BY id; +id +e8748eee-fabe-11eb-af18-005056bc575d +036d4fc5-fabf-11eb-af18-005056bc575d +DROP TABLE t1; diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_in.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_in.test new file mode 100644 index 00000000000..c2545a423b7 --- /dev/null +++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_in.test @@ -0,0 +1,82 @@ +# Start of 10.11 tests + +# +# MDEV-35468 UUID primary key filtering return incorrect results +# +CREATE TABLE t1 (id UUID NOT NULL); + +INSERT INTO t1 (`id`) VALUES ('e8748eee-fabe-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('036d4fc5-fabf-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('2acf42cc-fabf-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('594a8970-fabf-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('4238a6e5-fac1-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('6d001a4d-fac1-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('e4e67615-fad5-11eb-af18-005056bc575d'); +INSERT INTO t1 (`id`) VALUES ('1ec69927-30f3-62ca-a0a0-4b98bb6957f8'); +INSERT INTO t1 (`id`) VALUES ('1ec6992e-5c9e-6b2a-a21b-fbc054a2075e'); +INSERT INTO t1 (`id`) VALUES ('1ec6992e-e5be-6342-8293-e107448b2cd5'); + +SELECT * FROM t1 WHERE id IN ( +'036d4fc5-fabf-11eb-af18-005056bc575d', +'e8748eee-fabe-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8', +'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e', +'1ec6992e-e5be-6342-8293-e107448b2cd5' +) ORDER BY id; + +SELECT * FROM t1 WHERE id IN ( +'e8748eee-fabe-11eb-af18-005056bc575d', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8', +'1ec6992e-5c9e-6b2a-a21b-fbc054a2075e', +'1ec6992e-e5be-6342-8293-e107448b2cd5' +) ORDER BY id; + +DROP TABLE t1; + +CREATE TABLE t1 (id uuid); +INSERT INTO t1 (id) VALUES +('e8748eee-fabe-11eb-af18-005056bc575d'), +('036d4fc5-fabf-11eb-af18-005056bc575d'); +SELECT * FROM t1 WHERE id IN ( +'e8748eee-fabe-11eb-af18-005056bc575d', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8' +) ORDER BY id; +SELECT * FROM t1 WHERE id IN ( +'e8748eee-fabe-11eb-af18-005056bc575d', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d' +) ORDER BY id; +SELECT * FROM t1 WHERE id IN ( +'1ec69927-30f3-62ca-a0a0-4b98bb6957f8', +'036d4fc5-fabf-11eb-af18-005056bc575d', +'2acf42cc-fabf-11eb-af18-005056bc575d', +'594a8970-fabf-11eb-af18-005056bc575d', +'4238a6e5-fac1-11eb-af18-005056bc575d', +'6d001a4d-fac1-11eb-af18-005056bc575d', +'e4e67615-fad5-11eb-af18-005056bc575d', +'e8748eee-fabe-11eb-af18-005056bc575d' +) ORDER BY id; +DROP TABLE t1; + +# End of 10.11 tests diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_ps.result b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_ps.result new file mode 100644 index 00000000000..ddb818f4dd3 --- /dev/null +++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_ps.result @@ -0,0 +1,17 @@ +# Start of 10.11 tests +# +# MDEV-35427 Assertion `is_null() >= item->null_value' failed in Timestamp_or_zero_datetime_native_null::Timestamp_or_zero_datetime_native_null on EXECUTE +# +SET time_zone='+00:00'; +SET timestamp=UNIX_TIMESTAMP('2025-01-15 00:00:00'); +PREPARE s FROM 'SELECT CONCAT (UNIX_TIMESTAMP(?))'; +EXECUTE s USING CAST('00000000-0000-0000-0000-000000000001' AS UUID); +CONCAT (UNIX_TIMESTAMP(?)) +1736899200 +EXECUTE s USING @unknown_variable; +CONCAT (UNIX_TIMESTAMP(?)) +NULL +DEALLOCATE PREPARE s; +SET timestamp=DEFAULT; +SET time_zone=DEFAULT; +# End of 10.11 tests diff --git a/plugin/type_uuid/mysql-test/type_uuid/type_uuid_ps.test b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_ps.test new file mode 100644 index 00000000000..776859e7354 --- /dev/null +++ b/plugin/type_uuid/mysql-test/type_uuid/type_uuid_ps.test @@ -0,0 +1,16 @@ +--echo # Start of 10.11 tests + +--echo # +--echo # MDEV-35427 Assertion `is_null() >= item->null_value' failed in Timestamp_or_zero_datetime_native_null::Timestamp_or_zero_datetime_native_null on EXECUTE +--echo # + +SET time_zone='+00:00'; +SET timestamp=UNIX_TIMESTAMP('2025-01-15 00:00:00'); +PREPARE s FROM 'SELECT CONCAT (UNIX_TIMESTAMP(?))'; +EXECUTE s USING CAST('00000000-0000-0000-0000-000000000001' AS UUID); +EXECUTE s USING @unknown_variable; +DEALLOCATE PREPARE s; +SET timestamp=DEFAULT; +SET time_zone=DEFAULT; + +--echo # End of 10.11 tests diff --git a/plugin/type_uuid/sql_type_uuid.h b/plugin/type_uuid/sql_type_uuid.h index 1fbf1c13261..2aa190087f8 100644 --- a/plugin/type_uuid/sql_type_uuid.h +++ b/plugin/type_uuid/sql_type_uuid.h @@ -157,6 +157,10 @@ public: { return memcmp(a + m_memory_pos, b + m_memory_pos, m_length); } + int cmp_swap_noswap(const char *a, const char *b) const + { + return memcmp(a + m_memory_pos, b + m_record_pos, m_length); + } void hash_record(const uchar *ptr, Hasher *hasher) const { hasher->add(&my_charset_bin, ptr + m_record_pos, m_length); @@ -239,6 +243,18 @@ public: segment(4).hash_record(ptr, hasher); } + static int cmp_swap_noswap(const LEX_CSTRING &a, const LEX_CSTRING &b) + { + int res; + if ((res= segment(4).cmp_swap_noswap(a.str, b.str)) || + (res= segment(3).cmp_swap_noswap(a.str, b.str)) || + (res= segment(2).cmp_swap_noswap(a.str, b.str)) || + (res= segment(1).cmp_swap_noswap(a.str, b.str)) || + (res= segment(0).cmp_swap_noswap(a.str, b.str))) + return res; + return 0; + } + // Compare two in-memory values static int cmp(const LEX_CSTRING &a, const LEX_CSTRING &b) { @@ -257,6 +273,10 @@ public: return res; return 0; } + else if (swap_a && !swap_b) + return cmp_swap_noswap(a, b); + else if (!swap_a && swap_b) + return -cmp_swap_noswap(b, a); return memcmp(a.str, b.str, binary_length()); } diff --git a/sql-common/client.c b/sql-common/client.c index b6fceaa1b11..2d5c6742541 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -1586,7 +1586,7 @@ mysql_get_ssl_cipher(MYSQL *mysql __attribute__((unused))) #include -static int ssl_verify_server_cert(MYSQL *mysql, const char **errptr) +static int ssl_verify_server_cert(MYSQL *mysql, const char **errptr, int is_local) { SSL *ssl; X509 *server_cert= NULL; @@ -1627,7 +1627,8 @@ static int ssl_verify_server_cert(MYSQL *mysql, const char **errptr) mysql->tls_self_signed_error= *errptr= "SSL certificate is self-signed"; break; case X509_V_OK: - ret_validation= X509_check_host(server_cert, mysql->host, + ret_validation= !is_local && + X509_check_host(server_cert, mysql->host, strlen(mysql->host), 0, 0) != 1 && X509_check_ip_asc(server_cert, mysql->host, 0) != 1; *errptr= "SSL certificate validation failure"; @@ -2170,7 +2171,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, /* Verify server cert */ if ((!mysql->options.extension || !mysql->options.extension->tls_allow_invalid_server_cert) && - ssl_verify_server_cert(mysql, &cert_error)) + ssl_verify_server_cert(mysql, &cert_error, vio_type == VIO_TYPE_SOCKET)) { set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, ER(CR_SSL_CONNECTION_ERROR), cert_error); diff --git a/sql/field.cc b/sql/field.cc index 1874cba662a..2c7587dabd2 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -9701,8 +9701,7 @@ String *Field_set::val_str(String *val_buffer, ulonglong tmp=(ulonglong) Field_enum::val_int(); uint bitnr=0; - val_buffer->set_charset(field_charset()); - val_buffer->length(0); + val_buffer->copy("", 0, field_charset()); while (tmp && bitnr < (uint) m_typelib->count) { diff --git a/sql/field.h b/sql/field.h index 19080ba8e3a..857c546f02c 100644 --- a/sql/field.h +++ b/sql/field.h @@ -653,6 +653,9 @@ public: bool cleanup_session_expr(); bool fix_and_check_expr(THD *thd, TABLE *table); inline bool is_equal(const Virtual_column_info* vcol) const; + /* Same as is_equal() but for comparing with different table */ + bool is_equivalent(THD *thd, TABLE_SHARE *share, TABLE_SHARE *vcol_share, + const Virtual_column_info* vcol, bool &error) const; inline void print(String*); }; @@ -5972,7 +5975,7 @@ uint pack_length_to_packflag(uint type); enum_field_types get_blob_type_from_length(ulong length); int set_field_to_null(Field *field); int set_field_to_null_with_conversions(Field *field, bool no_conversions); -int convert_null_to_field_value_or_error(Field *field); +int convert_null_to_field_value_or_error(Field *field, uint err); bool check_expression(Virtual_column_info *vcol, const Lex_ident_column &name, enum_vcol_info_type type, Alter_info *alter_info= NULL); diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 2a9e0b37884..ce490658dcb 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -126,7 +126,7 @@ static int set_bad_null_error(Field *field, int err) return 0; case CHECK_FIELD_ERROR_FOR_NULL: if (!field->table->in_use->no_errors) - my_error(ER_BAD_NULL_ERROR, MYF(0), field->field_name.str); + my_error(err, MYF(0), field->field_name.str); return -1; } DBUG_ASSERT(0); // impossible @@ -164,7 +164,7 @@ int set_field_to_null(Field *field) If no_conversion was not set, an error message is printed */ -int convert_null_to_field_value_or_error(Field *field) +int convert_null_to_field_value_or_error(Field *field, uint err) { if (field->type() == MYSQL_TYPE_TIMESTAMP) { @@ -172,14 +172,16 @@ int convert_null_to_field_value_or_error(Field *field) return 0; } + MY_BITMAP *old_map= dbug_tmp_use_all_columns(field->table, &field->table->write_set); field->reset(); // Note: we ignore any potential failure of reset() here. + dbug_tmp_restore_column_map(&field->table->write_set, old_map); if (field == field->table->next_number_field) { field->table->auto_increment_field_not_null= FALSE; return 0; // field is set in fill_record() } - return set_bad_null_error(field, ER_BAD_NULL_ERROR); + return set_bad_null_error(field, err); } /** @@ -216,7 +218,7 @@ set_field_to_null_with_conversions(Field *field, bool no_conversions) if (no_conversions) return -1; - return convert_null_to_field_value_or_error(field); + return convert_null_to_field_value_or_error(field, ER_BAD_NULL_ERROR); } diff --git a/sql/filesort.cc b/sql/filesort.cc index b27eaae05d8..3e61e56c294 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -730,13 +730,6 @@ static uchar *read_buffpek_from_file(IO_CACHE *buffpek_pointers, uint count, } #ifndef DBUG_OFF - -/* Buffer where record is returned */ -char dbug_print_row_buff[512]; - -/* Temporary buffer for printing a column */ -char dbug_print_row_buff_tmp[512]; - /* Print table's current row into a buffer and return a pointer to it. @@ -749,38 +742,53 @@ char dbug_print_row_buff_tmp[512]; Only columns in table->read_set are printed */ -const char* dbug_print_table_row(TABLE *table) +const char* dbug_print_row(TABLE *table, const uchar *rec, bool print_names) { Field **pfield; - String tmp(dbug_print_row_buff_tmp, - sizeof(dbug_print_row_buff_tmp),&my_charset_bin); + const size_t alloc_size= 512; + char *row_buff= (char *) alloc_root(&table->mem_root, alloc_size); + char *row_buff_tmp= (char *) alloc_root(&table->mem_root, alloc_size); + String tmp(row_buff_tmp, alloc_size, &my_charset_bin); + String output(row_buff, alloc_size, &my_charset_bin); - String output(dbug_print_row_buff, sizeof(dbug_print_row_buff), - &my_charset_bin); + auto move_back_lambda= [table, rec]() mutable { + table->move_fields(table->field, table->record[0], rec); + }; + auto move_back_guard= make_scope_exit(move_back_lambda, false); + + if (rec != table->record[0]) + { + table->move_fields(table->field, rec, table->record[0]); + move_back_guard.engage(); + } + + SCOPE_VALUE(table->read_set, (table->read_set && table->write_set) ? + table->write_set : table->read_set); output.length(0); output.append(table->alias); output.append('('); bool first= true; - - for (pfield= table->field; *pfield ; pfield++) + if (print_names) { - const LEX_CSTRING *name; - if (table->read_set && !bitmap_is_set(table->read_set, (*pfield)->field_index)) - continue; - - if (first) - first= false; - else - output.append(','); + for (pfield= table->field; *pfield ; pfield++) + { + if (table->read_set && !bitmap_is_set(table->read_set, (*pfield)->field_index)) + continue; - name= (*pfield)->field_name.str ? &(*pfield)->field_name: &NULL_clex_str; - output.append(name); + if (first) + first= false; + else + output.append(STRING_WITH_LEN(", ")); + + output.append((*pfield)->field_name.str + ? (*pfield)->field_name : NULL_clex_str); + } + + output.append(STRING_WITH_LEN(")=(")); + first= true; } - output.append(STRING_WITH_LEN(")=(")); - - first= true; for (pfield= table->field; *pfield ; pfield++) { Field *field= *pfield; @@ -791,7 +799,7 @@ const char* dbug_print_table_row(TABLE *table) if (first) first= false; else - output.append(','); + output.append(STRING_WITH_LEN(", ")); if (field->is_null()) output.append(&NULL_clex_str); @@ -805,17 +813,14 @@ const char* dbug_print_table_row(TABLE *table) } } output.append(')'); - + return output.c_ptr_safe(); } -const char* dbug_print_row(TABLE *table, uchar *rec) +const char* dbug_print_table_row(TABLE *table) { - table->move_fields(table->field, rec, table->record[0]); - const char* ret= dbug_print_table_row(table); - table->move_fields(table->field, table->record[0], rec); - return ret; + return dbug_print_row(table, table->record[0]); } diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 06e6f95821b..078ecee4b9e 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -3226,6 +3226,24 @@ err1: DBUG_RETURN(2); } +Compare_keys ha_partition::compare_key_parts( + const Field &old_field, + const Column_definition &new_field, + const KEY_PART_INFO &old_part, + const KEY_PART_INFO &new_part) const +{ + Compare_keys res= m_file[0]->compare_key_parts(old_field, new_field, + old_part, new_part); + /* + Partitions have the same storage engine (until MDEV-22168) so the + calls should all return the same value for now. + */ + for (uint i= 1; i < m_tot_parts; i++) + if (res != m_file[i]->compare_key_parts(old_field, new_field, + old_part, new_part)) + return Compare_keys::NotEqual; + return res; +} /** Setup m_engine_array diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 1eb90bbf62f..00fab4cdab9 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -484,6 +484,11 @@ public: m_part_info= part_info; m_is_sub_partitioned= part_info->is_sub_partitioned(); } + Compare_keys compare_key_parts( + const Field &old_field, + const Column_definition &new_field, + const KEY_PART_INFO &old_part, + const KEY_PART_INFO &new_part) const override; void return_record_by_parent() override; diff --git a/sql/handler.cc b/sql/handler.cc index 2e092926baf..cc93963eade 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1800,7 +1800,7 @@ int ha_commit_trans(THD *thd, bool all) thd->m_transaction_psi= NULL; } #ifdef WITH_WSREP - if (wsrep_is_active(thd) && is_real_trans && !error) + if (WSREP(thd) && wsrep_is_active(thd) && is_real_trans && !error) wsrep_commit_empty(thd, all); #endif /* WITH_WSREP */ @@ -2347,9 +2347,14 @@ int ha_rollback_trans(THD *thd, bool all) my_error(ER_ERROR_DURING_ROLLBACK, MYF(0), err); error=1; #ifdef WITH_WSREP - WSREP_WARN("handlerton rollback failed, thd %lld %lld conf %d SQL %s", - thd->thread_id, thd->query_id, thd->wsrep_trx().state(), - thd->query()); + if (WSREP(thd)) + { + WSREP_WARN("handlerton rollback failed, thd %lld %lld " + "conf %d wsrep_err %s SQL %s", + thd->thread_id, thd->query_id, thd->wsrep_trx().state(), + wsrep::to_c_string(thd->wsrep_cs().current_error()), + thd->query()); + } #endif /* WITH_WSREP */ } status_var_increment(thd->status_var.ha_rollback_count); @@ -2361,11 +2366,12 @@ int ha_rollback_trans(THD *thd, bool all) } #ifdef WITH_WSREP - if (thd->is_error()) + if (WSREP(thd) && thd->is_error()) { - WSREP_DEBUG("ha_rollback_trans(%lld, %s) rolled back: %s: %s; is_real %d", - thd->thread_id, all?"TRUE":"FALSE", wsrep_thd_query(thd), - thd->get_stmt_da()->message(), is_real_trans); + WSREP_DEBUG("ha_rollback_trans(%lld, %s) rolled back: msg %s is_real %d wsrep_err %s", + thd->thread_id, all? "TRUE" : "FALSE", + thd->get_stmt_da()->message(), is_real_trans, + wsrep::to_c_string(thd->wsrep_cs().current_error())); } // REPLACE|INSERT INTO ... SELECT uses TOI in consistency check @@ -6283,7 +6289,10 @@ int handler::calculate_checksum() for (;;) { if (thd->killed) - return HA_ERR_ABORTED_BY_USER; + { + error= HA_ERR_ABORTED_BY_USER; + break; + } ha_checksum row_crc= 0; error= ha_rnd_next(table->record[0]); @@ -8187,6 +8196,7 @@ int handler::ha_write_row(const uchar *buf) TABLE_IO_WAIT(tracker, PSI_TABLE_WRITE_ROW, MAX_KEY, error, { error= write_row(buf); }) + DBUG_PRINT("dml", ("INSERT: %s = %d", dbug_print_row(table, buf, false), error)); MYSQL_INSERT_ROW_DONE(error); if (!error && !((error= table->hlindexes_on_insert()))) @@ -8200,6 +8210,7 @@ int handler::ha_write_row(const uchar *buf) ht->flags & HTON_WSREP_REPLICATION && !error && (error= wsrep_after_row(ha_thd()))) { + DEBUG_SYNC_C("ha_write_row_end"); DBUG_RETURN(error); } #endif /* WITH_WSREP */ @@ -8238,6 +8249,8 @@ int handler::ha_update_row(const uchar *old_data, const uchar *new_data) TABLE_IO_WAIT(tracker, PSI_TABLE_UPDATE_ROW, active_index, 0, { error= update_row(old_data, new_data);}) + DBUG_PRINT("dml", ("UPDATE: %s => %s = %d", dbug_print_row(table, old_data, false), + dbug_print_row(table, new_data, false), error)); MYSQL_UPDATE_ROW_DONE(error); if (likely(!error) && !(error= table->hlindexes_on_update())) @@ -8315,6 +8328,7 @@ int handler::ha_delete_row(const uchar *buf) TABLE_IO_WAIT(tracker, PSI_TABLE_DELETE_ROW, active_index, error, { error= delete_row(buf);}) + DBUG_PRINT("dml", ("DELETE: %s = %d", dbug_print_row(table, buf, false), error)); MYSQL_DELETE_ROW_DONE(error); if (likely(!error) && !(error= table->hlindexes_on_delete(buf))) { diff --git a/sql/handler.h b/sql/handler.h index 82a86572fa6..a4da2287565 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -5835,4 +5835,8 @@ inline void Cost_estimate::reset(handler *file) int get_select_field_pos(Alter_info *alter_info, int select_field_count, bool versioned); + +#ifndef DBUG_OFF +const char* dbug_print_row(TABLE *table, const uchar *rec, bool print_names= true); +#endif /* DBUG_OFF */ #endif /* HANDLER_INCLUDED */ diff --git a/sql/item.cc b/sql/item.cc index 135d05f5755..fc5acda056e 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -839,6 +839,30 @@ bool Item_field::rename_fields_processor(void *arg) return 0; } +/** + Rename table and clean field for EXCHANGE comparison +*/ + +bool Item_field::rename_table_processor(void *arg) +{ + Item::func_processor_rename_table *p= (Item::func_processor_rename_table*) arg; + + /* If (db_name, table_name) matches (p->old_db, p->old_table) + rename to (p->new_db, p->new_table) */ + if (((!db_name.str && !p->old_db.str) || + db_name.streq(p->old_db)) && + ((!table_name.str && !p->old_table.str) || + table_name.streq(p->old_table))) + { + db_name= p->new_db; + table_name= p->new_table; + } + + /* Item_field equality is done by field pointer if it is set, we need to avoid that */ + field= NULL; + return 0; +} + /** Check if an Item_field references some field from a list of fields. @@ -4008,7 +4032,7 @@ void Item_string::print(String *str, enum_query_type query_type) } else { - str_value.print(str, system_charset_info); + str_value.print(str, &my_charset_utf8mb4_general_ci); } } else @@ -4275,6 +4299,7 @@ void Item_param::set_null(const DTCollation &c) decimals= 0; collation= c; state= NULL_VALUE; + value.set_handler(&type_handler_null); DBUG_VOID_RETURN; } @@ -5104,7 +5129,10 @@ void Item_param::set_default(bool set_type_handler_null) */ null_value= true; if (set_type_handler_null) + { + value.set_handler(&type_handler_null); set_handler(&type_handler_null); + } } void Item_param::set_ignore(bool set_type_handler_null) @@ -5113,7 +5141,10 @@ void Item_param::set_ignore(bool set_type_handler_null) state= IGNORE_VALUE; null_value= true; if (set_type_handler_null) + { + value.set_handler(&type_handler_null); set_handler(&type_handler_null); + } } /** diff --git a/sql/item.h b/sql/item.h index 27269d60b03..fe59d3d648d 100644 --- a/sql/item.h +++ b/sql/item.h @@ -2370,6 +2370,7 @@ public: virtual bool check_partition_func_processor(void *arg) { return true; } virtual bool post_fix_fields_part_expr_processor(void *arg) { return 0; } virtual bool rename_fields_processor(void *arg) { return 0; } + virtual bool rename_table_processor(void *arg) { return 0; } /* TRUE if the function is knowingly TRUE or FALSE. Not to be used for AND/OR formulas. @@ -2398,6 +2399,13 @@ public: LEX_CSTRING table_name; List fields; }; + struct func_processor_rename_table + { + Lex_ident_db old_db; + Lex_ident_table old_table; + Lex_ident_db new_db; + Lex_ident_table new_table; + }; virtual bool check_vcol_func_processor(void *arg) { return mark_unsupported_function(full_name(), arg, VCOL_IMPOSSIBLE); @@ -3269,8 +3277,9 @@ public: bool append_for_log(THD *thd, String *str) override; - Item *do_get_copy(THD *) const override { return nullptr; } - Item *do_build_clone(THD *thd) const override { return nullptr; } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } /* Override the inherited create_field_for_create_select(), @@ -3865,6 +3874,7 @@ public: bool switch_to_nullable_fields_processor(void *arg) override; bool update_vcol_processor(void *arg) override; bool rename_fields_processor(void *arg) override; + bool rename_table_processor(void *arg) override; bool check_vcol_func_processor(void *arg) override; bool set_fields_as_dependent_processor(void *arg) override { diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 2462d8eb210..862bba23484 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -6155,7 +6155,7 @@ String *Item_func_wsrep_last_written_gtid::val_str_ascii(String *str) { if (gtid_str.alloc(WSREP_MAX_WSREP_SERVER_GTID_STR_LEN+1)) { - my_error(ER_OUTOFMEMORY, WSREP_MAX_WSREP_SERVER_GTID_STR_LEN); + my_error(ER_OUTOFMEMORY, MYF(0), WSREP_MAX_WSREP_SERVER_GTID_STR_LEN); null_value= TRUE; return 0; } @@ -6180,7 +6180,7 @@ String *Item_func_wsrep_last_seen_gtid::val_str_ascii(String *str) { if (gtid_str.alloc(WSREP_MAX_WSREP_SERVER_GTID_STR_LEN+1)) { - my_error(ER_OUTOFMEMORY, WSREP_MAX_WSREP_SERVER_GTID_STR_LEN); + my_error(ER_OUTOFMEMORY, MYF(0), WSREP_MAX_WSREP_SERVER_GTID_STR_LEN); null_value= TRUE; return 0; } @@ -6225,7 +6225,7 @@ longlong Item_func_wsrep_sync_wait_upto::val_int() if (!(gtid_list= gtid_parse_string_to_list(gtid_str->ptr(), gtid_str->length(), &count))) { - my_error(ER_INCORRECT_GTID_STATE, MYF(0), func_name()); + my_error(ER_INCORRECT_GTID_STATE, MYF(0)); null_value= TRUE; return 0; } @@ -6237,12 +6237,12 @@ longlong Item_func_wsrep_sync_wait_upto::val_int() wait_gtid_ret= wsrep_gtid_server.wait_gtid_upto(gtid_list[0].seq_no, timeout); if ((wait_gtid_ret == ETIMEDOUT) || (wait_gtid_ret == ETIME)) { - my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0), func_name()); + my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0)); ret= 0; } else if (wait_gtid_ret == ENOMEM) { - my_error(ER_OUTOFMEMORY, MYF(0), func_name()); + my_error(ER_OUTOFMEMORY, MYF(0), sizeof(std::pair)); ret= 0; } } diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 2b21d117ae1..551df71c301 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -1277,6 +1277,8 @@ public: return mark_unsupported_function(fully_qualified_func_name().str, arg, VCOL_SESSION_FUNC); } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } }; class Item_func_session_user :public Item_func_user diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 008384a6590..dc410029cea 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -1243,6 +1243,7 @@ Item_singlerow_subselect::select_transformer(JOIN *join) Item *item) { return !item->with_sum_func() && + !item->with_window_func() && /* We can't change name of Item_field or Item_ref, because it will prevent its correct resolving, but we should save name of @@ -3850,7 +3851,7 @@ void subselect_single_select_engine::cleanup() DBUG_ENTER("subselect_single_select_engine::cleanup"); prepared= executed= 0; join= 0; - result->cleanup(); + result->reset_for_next_ps_execution(); select_lex->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED; DBUG_VOID_RETURN; } @@ -3860,7 +3861,7 @@ void subselect_union_engine::cleanup() { DBUG_ENTER("subselect_union_engine::cleanup"); unit->reinit_exec_mechanism(); - result->cleanup(); + result->reset_for_next_ps_execution(); unit->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED; for (SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select()) sl->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED; @@ -5538,7 +5539,7 @@ void subselect_hash_sj_engine::cleanup() } DBUG_ASSERT(lookup_engine->engine_type() == UNIQUESUBQUERY_ENGINE); lookup_engine->cleanup(); - result->cleanup(); /* Resets the temp table as well. */ + result->reset_for_next_ps_execution(); /* Resets the temp table as well. */ DBUG_ASSERT(tmp_table); free_tmp_table(thd, tmp_table); tmp_table= NULL; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 3bbcfe50786..69733544fbc 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -540,35 +540,6 @@ void Item_sum::fix_num_length_and_dec() max_length=float_length(decimals); } -Item *Item_sum::get_tmp_table_item(THD *thd) -{ - Item_sum* sum_item= (Item_sum *) copy_or_same(thd); - if (sum_item && sum_item->result_field) // If not a const sum func - { - Field *result_field_tmp= sum_item->result_field; - for (uint i=0 ; i < sum_item->arg_count ; i++) - { - Item *arg= sum_item->args[i]; - if (!arg->const_item()) - { - if (arg->type() == Item::FIELD_ITEM) - { - ((Item_field*) arg)->field= result_field_tmp++; - } - else - { - auto item_field= - new (thd->mem_root) Item_field(thd, result_field_tmp++); - if (item_field) - item_field->set_refers_to_temp_table(); - sum_item->args[i]= item_field; - } - } - } - } - return sum_item; -} - void Item_sum::update_used_tables () { diff --git a/sql/item_sum.h b/sql/item_sum.h index ef6cb1a4a2d..62a5fd38fac 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -521,7 +521,6 @@ public: aggregator_clear(); } virtual void make_unique() { force_copy_fields= TRUE; } - Item *get_tmp_table_item(THD *thd) override; virtual Field *create_tmp_field(MEM_ROOT *root, bool group, TABLE *table); Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src, const Tmp_field_param *param) override diff --git a/sql/log.cc b/sql/log.cc index 1995c164e08..2fc87ade6ae 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -811,6 +811,7 @@ bool Log_to_csv_event_handler:: { TABLE_LIST table_list; TABLE *table; + const char *cause= 0; bool result= TRUE; bool need_close= FALSE; bool need_pop= FALSE; @@ -844,13 +845,19 @@ bool Log_to_csv_event_handler:: need_pop= TRUE; if (!(table= open_log_table(thd, &table_list, &open_tables_backup))) + { + cause= "can't open file"; goto err; + } need_close= TRUE; if (table->file->extra(HA_EXTRA_MARK_AS_LOG_TABLE) || table->file->ha_rnd_init_with_error(0)) + { + cause= "can't initialize table handler"; goto err; + } need_rnd_end= TRUE; @@ -869,12 +876,20 @@ bool Log_to_csv_event_handler:: /* check that all columns exist */ if (table->s->fields < 6) + { + cause= "incorrect number of fields in the log table"; goto err; + } DBUG_ASSERT(table->field[0]->type() == MYSQL_TYPE_TIMESTAMP); - table->field[0]->store_timestamp( - hrtime_to_my_time(event_time), hrtime_sec_part(event_time)); + if (table->field[0]->store_timestamp(hrtime_to_my_time(event_time), + hrtime_sec_part(event_time))) + { + cause= "Can't write data (possible incorrect log table structure)"; + goto err; + } + /* do a write */ if (table->field[1]->store(user_host, user_host_len, client_cs) || @@ -882,7 +897,10 @@ bool Log_to_csv_event_handler:: table->field[3]->store((longlong) global_system_variables.server_id, TRUE) || table->field[4]->store(command_type, command_type_len, client_cs)) + { + cause= "Can't write data (possible incorrect log table structure)"; goto err; + } /* A positive return value in store() means truncation. @@ -890,7 +908,10 @@ bool Log_to_csv_event_handler:: */ table->field[5]->flags|= FIELDFLAG_HEX_ESCAPE; if (table->field[5]->store(sql_text, sql_text_len, client_cs) < 0) + { + cause= "Can't write data (possible incorrect log table structure)"; goto err; + } /* mark all fields as not null */ table->field[1]->set_notnull(); @@ -906,14 +927,22 @@ bool Log_to_csv_event_handler:: } if (table->file->ha_write_row(table->record[0])) + { + cause= "Can't write record"; goto err; + } result= FALSE; err: if (result && !thd->killed) + { + const char *msg= error_handler.message(); + if (!msg || !msg[0]) + msg= cause; sql_print_error("Failed to write to mysql.general_log: %s", - error_handler.message()); + msg); + } if (need_rnd_end) { @@ -966,6 +995,8 @@ bool Log_to_csv_event_handler:: { TABLE_LIST table_list; TABLE *table; + const char *cause= 0; + const char *msg; bool result= TRUE; bool need_close= FALSE; bool need_rnd_end= FALSE; @@ -985,13 +1016,19 @@ bool Log_to_csv_event_handler:: TL_WRITE_CONCURRENT_INSERT); if (!(table= open_log_table(thd, &table_list, &open_tables_backup))) + { + cause= "can't open file"; goto err; + } need_close= TRUE; if (table->file->extra(HA_EXTRA_MARK_AS_LOG_TABLE) || table->file->ha_rnd_init_with_error(0)) + { + cause= "can't initialize table handler"; goto err; + } need_rnd_end= TRUE; @@ -1002,12 +1039,19 @@ bool Log_to_csv_event_handler:: /* check that all columns exist */ if (table->s->fields < 13) + { + cause= "incorrect number of fields in the log table"; goto err; + } + + // It can be used in 13 places below so assign it here + cause= "Can't write data (possible incorrect log table structure)"; /* store the time and user values */ DBUG_ASSERT(table->field[0]->type() == MYSQL_TYPE_TIMESTAMP); - table->field[0]->store_timestamp( - hrtime_to_my_time(current_time), hrtime_sec_part(current_time)); + if(table->field[0]->store_timestamp(hrtime_to_my_time(current_time), + hrtime_sec_part(current_time))) + goto err; if (table->field[1]->store(user_host, user_host_len, client_cs)) goto err; @@ -1087,9 +1131,13 @@ bool Log_to_csv_event_handler:: (longlong) thd->get_stmt_da()->affected_rows() : 0, TRUE)) goto err; + cause= 0; // just for safety if (table->file->ha_write_row(table->record[0])) + { + cause= "Can't write record"; goto err; + } result= FALSE; @@ -1097,8 +1145,13 @@ err: thd->pop_internal_handler(); if (result && !thd->killed) + { + msg= error_handler.message(); + if (!msg || !msg[0]) + msg= cause; sql_print_error("Failed to write to mysql.slow_log: %s", - error_handler.message()); + msg); + } if (need_rnd_end) { @@ -3720,6 +3773,9 @@ void MYSQL_BIN_LOG::init_pthread_objects() &COND_binlog_background_thread, 0); mysql_cond_init(key_BINLOG_COND_binlog_background_thread_end, &COND_binlog_background_thread_end, 0); + + /* Fix correct mutex order to catch violations quicker (MDEV-35197). */ + mysql_mutex_record_order(&LOCK_log, &LOCK_global_system_variables); } @@ -12311,7 +12367,8 @@ int TC_LOG_BINLOG::recover(LOG_INFO *linfo, const char *last_log_name, cur_log= first_log; for (round= 1;;) { - while ((ev= Log_event::read_log_event(cur_log, fdle, + int error; + while ((ev= Log_event::read_log_event(cur_log, &error, fdle, opt_master_verify_checksum)) && ev->is_valid()) { @@ -12705,7 +12762,8 @@ MYSQL_BIN_LOG::do_binlog_recovery(const char *opt_name, bool do_xa_recovery) return 1; } - if ((ev= Log_event::read_log_event(&log, &fdle, + int read_error; + if ((ev= Log_event::read_log_event(&log, &read_error, &fdle, opt_master_verify_checksum)) && ev->get_type_code() == FORMAT_DESCRIPTION_EVENT) { @@ -12790,6 +12848,7 @@ binlog_checksum_update(MYSQL_THD thd, struct st_mysql_sys_var *var, bool check_purge= false; ulong UNINIT_VAR(prev_binlog_id); + mysql_mutex_unlock(&LOCK_global_system_variables); mysql_mutex_lock(mysql_bin_log.get_log_lock()); if(mysql_bin_log.is_open()) { @@ -12808,6 +12867,7 @@ binlog_checksum_update(MYSQL_THD thd, struct st_mysql_sys_var *var, mysql_mutex_unlock(mysql_bin_log.get_log_lock()); if (check_purge) mysql_bin_log.checkpoint_and_purge(prev_binlog_id); + mysql_mutex_lock(&LOCK_global_system_variables); } @@ -12928,10 +12988,11 @@ get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list) Format_description_log_event *fdle; Log_event *ev; const char *errormsg = NULL; + int read_error; *out_gtid_list= NULL; - if (!(ev= Log_event::read_log_event(cache, &init_fdle, + if (!(ev= Log_event::read_log_event(cache, &read_error, &init_fdle, opt_master_verify_checksum)) || ev->get_type_code() != FORMAT_DESCRIPTION_EVENT) { @@ -12947,7 +13008,8 @@ get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list) { Log_event_type typ; - ev= Log_event::read_log_event(cache, fdle, opt_master_verify_checksum); + ev= Log_event::read_log_event(cache, &read_error, fdle, + opt_master_verify_checksum); if (!ev) { errormsg= "Could not read GTID list event while looking for GTID " diff --git a/sql/log_event.cc b/sql/log_event.cc index 03f685ec44f..c162f7058f0 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -874,7 +874,7 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet, DBUG_RETURN(0); } -Log_event* Log_event::read_log_event(IO_CACHE* file, +Log_event* Log_event::read_log_event(IO_CACHE* file, int *out_error, const Format_description_log_event *fdle, my_bool crc_check, my_bool print_errors, size_t max_allowed_packet) @@ -885,6 +885,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, const char *error= 0; Log_event *res= 0; + *out_error= 0; switch (read_log_event(file, &event, fdle, BINLOG_CHECKSUM_ALG_OFF, max_allowed_packet)) { @@ -935,14 +936,22 @@ err: #endif /* - The SQL slave thread will check if file->error<0 to know + The SQL slave thread will check *out_error to know if there was an I/O error. Even if there is no "low-level" I/O errors with 'file', any of the high-level above errors is worrying enough to stop the SQL thread now ; as we are skipping the current event, going on with reading and successfully executing other events can only corrupt the slave's databases. So stop. */ - file->error= -1; + *out_error= 1; + /* + Clear any error that might have been set in the IO_CACHE from a read + error, while we are still holding the relay log mutex (if reading from + the hot log). Otherwise the error might interfere unpredictably with + write operations to the same IO_CACHE in the IO thread. + */ + file->error= 0; + #ifndef MYSQL_CLIENT if (!print_errors) diff --git a/sql/log_event.h b/sql/log_event.h index 486e89b9324..62369fb54ee 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -1431,18 +1431,18 @@ public: we detect the event's type, then call the specific event's constructor and pass description_event as an argument. */ - static Log_event* read_log_event(IO_CACHE* file, + static Log_event* read_log_event(IO_CACHE* file, int *out_error, const Format_description_log_event *description_event, my_bool crc_check, my_bool print_errors, size_t max_allowed_packet); - static Log_event* read_log_event(IO_CACHE* file, + static Log_event* read_log_event(IO_CACHE* file, int *out_error, const Format_description_log_event *description_event, my_bool crc_check, my_bool print_errors= 1) { - return read_log_event(file, description_event, crc_check, print_errors, - get_max_packet()); + return read_log_event(file, out_error, description_event, crc_check, + print_errors, get_max_packet()); } /** @@ -3418,7 +3418,8 @@ public: #ifdef MYSQL_SERVER static const uint max_data_length= GTID_HEADER_LEN + 2 + sizeof(XID) + 1 /* flags_extra: */ - + 4 /* Extra Engines */ + + 1 /* Extra Engines */ + + 8 /* sa_seq_no */ + 4 /* FL_EXTRA_THREAD_ID */; Gtid_log_event(THD *thd_arg, uint64 seq_no, uint32 domain_id, bool standalone, diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc index 57bd3313acc..f439500d41f 100644 --- a/sql/log_event_server.cc +++ b/sql/log_event_server.cc @@ -1865,8 +1865,11 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, DBUG_PRINT("query",("%s", thd->query())); #ifdef WITH_WSREP - WSREP_DEBUG("Query_log_event thread=%llu for query=%s", - thd_get_thread_id(thd), wsrep_thd_query(thd)); + if (WSREP(thd)) + { + WSREP_DEBUG("Query_log_event thread=%llu for query=%s", + thd_get_thread_id(thd), wsrep_thd_query(thd)); + } #endif if (unlikely(!(expected_error= !is_rb_alter ? error_code : 0)) || diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 89d9cc646c8..5cad7ac7a3e 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3350,10 +3350,13 @@ void my_message_sql(uint error, const char *str, myf MyFlags) MyFlags)); DBUG_ASSERT(str != NULL); + DBUG_ASSERT(*str != '\0'); DBUG_ASSERT(error != 0); DBUG_ASSERT((MyFlags & ~(ME_BELL | ME_ERROR_LOG | ME_ERROR_LOG_ONLY | ME_NOTE | ME_WARNING | ME_FATAL)) == 0); + DBUG_ASSERT(str[strlen(str)-1] != '\n'); + if (MyFlags & ME_NOTE) { level= Sql_condition::WARN_LEVEL_NOTE; @@ -3752,22 +3755,14 @@ static void my_malloc_size_cb_func(long long size, my_bool is_thread_specific) LOCK_thd_kill here (the limit will be enforced on the next allocation). */ if (!mysql_mutex_trylock(&thd->LOCK_thd_kill)) { - char buf[50], *buf2; + char buf[50], buf2[256]; thd->set_killed_no_mutex(KILL_QUERY); my_snprintf(buf, sizeof(buf), "--max-session-mem-used=%llu", thd->variables.max_mem_used); - if ((buf2= thd->alloc(256))) - { - my_snprintf(buf2, 256, - ER_THD(thd, ER_OPTION_PREVENTS_STATEMENT), buf); - thd->set_killed_no_mutex(KILL_QUERY, - ER_OPTION_PREVENTS_STATEMENT, buf2); - } - else - { - thd->set_killed_no_mutex(KILL_QUERY, ER_OPTION_PREVENTS_STATEMENT, - "--max-session-mem-used"); - } + my_snprintf(buf2, 256, + ER_THD(thd, ER_OPTION_PREVENTS_STATEMENT), buf); + thd->set_killed_no_mutex(KILL_QUERY, + ER_OPTION_PREVENTS_STATEMENT, buf2); mysql_mutex_unlock(&thd->LOCK_thd_kill); } } @@ -7468,7 +7463,7 @@ static int show_max_memory_used(THD *thd, SHOW_VAR *var, void *buff, } -static int show_binlog_space_total(THD *thd, SHOW_VAR *var, char *buff, +static int show_binlog_space_total(THD *thd, SHOW_VAR *var, void *buff, struct system_status_var *status_var, enum enum_var_type scope) { @@ -7556,8 +7551,8 @@ static int show_threadpool_threads(THD *, SHOW_VAR *var, void *buff, #endif -static int show_cached_thread_count(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_cached_thread_count(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum enum_var_type scope) { var->type= SHOW_LONG; var->value= buff; @@ -10064,7 +10059,7 @@ void init_server_psi_keys(void) */ -static my_thread_id thread_id_max= UINT_MAX32; +static my_thread_id thread_id_max= MY_THREAD_ID_MAX; #include #include diff --git a/sql/rpl_gtid.cc b/sql/rpl_gtid.cc index db5c26b6237..94e8f188f77 100644 --- a/sql/rpl_gtid.cc +++ b/sql/rpl_gtid.cc @@ -29,10 +29,6 @@ #include "rpl_rli.h" #include "slave.h" #include "log_event.h" -#ifdef WITH_WSREP -#include "wsrep_mysqld.h" // wsrep_thd_is_local -#include "wsrep_trans_observer.h" // wsrep_start_trx_if_not_started -#endif const LEX_CSTRING rpl_gtid_slave_state_table_name= { STRING_WITH_LEN("gtid_slave_pos") }; @@ -714,23 +710,7 @@ rpl_slave_state::record_gtid(THD *thd, const rpl_gtid *gtid, uint64 sub_id, goto end; #ifdef WITH_WSREP - /* - We should replicate local gtid_slave_pos updates to other nodes if - wsrep gtid mode is set. - In applier we should not append them to galera writeset. - */ - if (WSREP_ON_ && wsrep_gtid_mode && wsrep_thd_is_local(thd)) - { - thd->wsrep_ignore_table= false; - table->file->row_logging= 1; // replication requires binary logging - if (thd->wsrep_next_trx_id() == WSREP_UNDEFINED_TRX_ID) - thd->set_query_id(next_query_id()); - wsrep_start_trx_if_not_started(thd); - } - else - { - thd->wsrep_ignore_table= true; - } + thd->wsrep_ignore_table= true; // Do not replicate mysql.gtid_slave_pos table #endif if (!in_transaction) @@ -767,10 +747,6 @@ rpl_slave_state::record_gtid(THD *thd, const rpl_gtid *gtid, uint64 sub_id, } end: -#ifdef WITH_WSREP - thd->wsrep_ignore_table= false; -#endif - if (table_opened) { if (err || (err= ha_commit_trans(thd, FALSE))) @@ -793,6 +769,10 @@ end: mysql_mutex_unlock(&thd->LOCK_thd_data); thd->mdl_context.rollback_to_savepoint(m_start_of_statement_svp); } + +#ifdef WITH_WSREP + thd->wsrep_ignore_table= false; +#endif thd->lex->restore_backup_query_tables_list(&lex_backup); thd->variables.option_bits= thd_saved_option; thd->resume_subsequent_commits(suspended_wfc); @@ -906,25 +886,7 @@ rpl_slave_state::gtid_delete_pending(THD *thd, return; #ifdef WITH_WSREP - /* - We should replicate local gtid_slave_pos updates to other nodes if - wsrep gtid mode is set. - In applier we should not append them to galera writeset. - */ - if (WSREP_ON_ && wsrep_gtid_mode && - wsrep_thd_is_local(thd) && - thd->wsrep_cs().state() != wsrep::client_state::s_none) - { - if (thd->wsrep_trx().active() == false) - { - if (thd->wsrep_next_trx_id() == WSREP_UNDEFINED_TRX_ID) - thd->set_query_id(next_query_id()); - wsrep_start_transaction(thd, thd->wsrep_next_trx_id()); - } - thd->wsrep_ignore_table= false; - } - else - thd->wsrep_ignore_table= true; + thd->wsrep_ignore_table= true; // No Galera replication for mysql.gtid_pos_table #endif thd_saved_option= thd->variables.option_bits; diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc index c3245ba0c10..ffadfdcaf39 100644 --- a/sql/rpl_mi.cc +++ b/sql/rpl_mi.cc @@ -1379,7 +1379,9 @@ Master_info_index::get_master_info(const LEX_CSTRING *connection_name, connection_name->str)); /* Make name lower case for comparison */ - IdentBufferCasedn buff(*connection_name); + IdentBufferCasedn buff(connection_name->str ? + *connection_name : + empty_clex_str); mi= (Master_info*) my_hash_search(&master_info_hash, (const uchar*) buff.ptr(), buff.length()); if (!mi && warning != Sql_condition::WARN_LEVEL_NOTE) diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 5bf3439cbbb..b4746ed6d55 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -1072,14 +1072,15 @@ do_retry: /* The loop is here so we can try again the next relay log file on EOF. */ for (;;) { + int error; old_offset= cur_offset; - ev= Log_event::read_log_event(&rlog, description_event, + ev= Log_event::read_log_event(&rlog, &error, description_event, opt_slave_sql_verify_checksum); cur_offset= my_b_tell(&rlog); if (ev) break; - if (unlikely(rlog.error < 0)) + if (unlikely(error)) { errmsg= "slave SQL thread aborted because of I/O error"; err= 1; diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index a8c00b67cac..51f45f9cc83 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -541,12 +541,13 @@ read_relay_log_description_event(IO_CACHE *cur_log, ulonglong start_pos, if (my_b_tell(cur_log) >= start_pos) break; - if (!(ev= Log_event::read_log_event(cur_log, fdev, + int read_error; + if (!(ev= Log_event::read_log_event(cur_log, &read_error, fdev, opt_slave_sql_verify_checksum))) { - DBUG_PRINT("info",("could not read event, cur_log->error=%d", - cur_log->error)); - if (cur_log->error) /* not EOF */ + DBUG_PRINT("info",("could not read event, read_error=%d", + read_error)); + if (read_error) /* not EOF */ { *errmsg= "I/O error reading event at position 4"; delete fdev; diff --git a/sql/semisync_master.cc b/sql/semisync_master.cc index d6fa3d771af..888085c0d7d 100644 --- a/sql/semisync_master.cc +++ b/sql/semisync_master.cc @@ -938,8 +938,8 @@ int Repl_semi_sync_master::commit_trx(const char *trx_wait_binlog_name, sql_print_information( "Skipping semi-sync wait for transaction at pos %s, %lu. This " "should be because semi-sync turned off and on during the " - "lifetime of this transaction.", - trx_wait_binlog_name, trx_wait_binlog_pos);); + "lifetime of this transaction.", trx_wait_binlog_name, + static_cast(trx_wait_binlog_pos));); /* The only known reason for a missing entry at this point is if * semi-sync was turned off then on, so on debug builds, we track diff --git a/sql/service_wsrep.cc b/sql/service_wsrep.cc index d58a05b3eb5..9d04849aadb 100644 --- a/sql/service_wsrep.cc +++ b/sql/service_wsrep.cc @@ -1,4 +1,4 @@ -/* Copyright 2018-2024 Codership Oy +/* Copyright 2018-2025 Codership Oy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -82,11 +82,12 @@ extern "C" const char *wsrep_thd_query(const THD *thd) case SQLCOM_REVOKE: return "REVOKE"; case SQLCOM_SET_OPTION: - if (thd->lex->definer) - return "SET PASSWORD"; + return "SET OPTION"; /* fallthrough */ default: + { return (thd->query() ? thd->query() : "NULL"); + } } return "NULL"; } diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index f6bb485c023..4eb5579d78d 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7207,19 +7207,19 @@ ER_FORBID_SCHEMA_CHANGE spa "Vd no estΓ‘ autorizado a cambiar el esquema de '%-.192s' a '%-.192s'" sw "Kubadilisha schema kutoka '%-.192s' hadi '%-.192s' hairuhusiwi" ER_ROW_IS_REFERENCED_2 23000 - chi "ζ— ζ³•εˆ ι™€ζˆ–ζ›΄ζ–°ηˆΆθ‘ŒοΌšε€–ι”ηΊ¦ζŸε€±θ΄₯(%.192sοΌ‰" - eng "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)" - ger "Kann Eltern-Zeile nicht lΓΆschen oder aktualisieren: eine FremdschlΓΌsselbedingung schlΓ€gt fehl (%.192s)" - geo "αƒ›αƒ¨αƒαƒ‘αƒ”αƒšαƒ˜ αƒ›αƒ¬αƒ™αƒ αƒ˜αƒ•αƒ˜αƒ‘ αƒ¬αƒαƒ¨αƒšαƒ αƒαƒœ αƒ’αƒαƒœαƒαƒαƒšαƒ”ბა αƒ¨αƒ”αƒ£αƒ«αƒšαƒ”αƒ‘αƒ”αƒšαƒ˜αƒ: გარე αƒ’αƒαƒ‘αƒαƒ¦αƒ”αƒ‘αƒ˜αƒ‘ შეზღუდვა შეαƒͺდომაბ αƒ¨αƒ”αƒ˜αƒͺავბ (%.192s)" - spa "No puedo borrar o actualizar una fila padre: falla una restricciΓ³n de clave forΓ‘nea (%.192s)" - sw "Haiwezi kufuta au kusasisha safu mlalo kuu: kizuizi cha ufunguo wa kigeni hakifaulu (%.192s)" + chi "ζ— ζ³•εˆ ι™€ζˆ–ζ›΄ζ–°ηˆΆθ‘ŒοΌšε€–ι”ηΊ¦ζŸε€±θ΄₯(%sοΌ‰" + eng "Cannot delete or update a parent row: a foreign key constraint fails (%s)" + ger "Kann Eltern-Zeile nicht lΓΆschen oder aktualisieren: eine FremdschlΓΌsselbedingung schlΓ€gt fehl (%s)" + geo "αƒ›αƒ¨αƒαƒ‘αƒ”αƒšαƒ˜ αƒ›αƒ¬αƒ™αƒ αƒ˜αƒ•αƒ˜αƒ‘ αƒ¬αƒαƒ¨αƒšαƒ αƒαƒœ αƒ’αƒαƒœαƒαƒαƒšαƒ”ბა αƒ¨αƒ”αƒ£αƒ«αƒšαƒ”αƒ‘αƒ”αƒšαƒ˜αƒ: გარე αƒ’αƒαƒ‘αƒαƒ¦αƒ”αƒ‘αƒ˜αƒ‘ შეზღუდვა შეαƒͺდომაბ αƒ¨αƒ”αƒ˜αƒͺავბ (%s)" + spa "No puedo borrar o actualizar una fila padre: falla una restricciΓ³n de clave forΓ‘nea (%s)" + sw "Haiwezi kufuta au kusasisha safu mlalo kuu: kizuizi cha ufunguo wa kigeni hakifaulu (%s)" ER_NO_REFERENCED_ROW_2 23000 - chi "ζ— ζ³•ζ·»εŠ ζˆ–ζ›΄ζ–°ε­θ‘ŒοΌšε€–ι”ηΊ¦ζŸε€±θ΄₯(%.192sοΌ‰" - eng "Cannot add or update a child row: a foreign key constraint fails (%.192s)" - ger "Kann Kind-Zeile nicht hinzufΓΌgen oder aktualisieren: eine FremdschlΓΌsselbedingung schlΓ€gt fehl (%.192s)" - geo "αƒ¨αƒ•αƒ˜αƒšαƒ˜ αƒ›αƒ¬αƒ™αƒ αƒ˜αƒ•αƒ˜αƒ‘ αƒ¬αƒαƒ¨αƒšαƒ αƒαƒœ αƒ’αƒαƒœαƒαƒαƒšαƒ”ბა αƒ¨αƒ”αƒ£αƒ«αƒšαƒ”αƒ‘αƒ”αƒšαƒ˜αƒ: გარე αƒ’αƒαƒ‘αƒαƒ¦αƒ”αƒ‘αƒ˜αƒ‘ შეზღუდვა შეαƒͺდომაბ αƒ¨αƒ”αƒ˜αƒͺავბ (%.192s)" - spa "No puedo aΓ±adir o actualizar una fila hija: falla una restricciΓ³n de clave forΓ‘nea (%.192s)" - sw "Haiwezi kuongeza au kusasisha safu mlalo ya mtoto: kizuizi cha ufunguo wa kigeni hakifaulu (%.192s)" + chi "ζ— ζ³•ζ·»εŠ ζˆ–ζ›΄ζ–°ε­θ‘ŒοΌšε€–ι”ηΊ¦ζŸε€±θ΄₯(%sοΌ‰" + eng "Cannot add or update a child row: a foreign key constraint fails (%s)" + ger "Kann Kind-Zeile nicht hinzufΓΌgen oder aktualisieren: eine FremdschlΓΌsselbedingung schlΓ€gt fehl (%s)" + geo "αƒ¨αƒ•αƒ˜αƒšαƒ˜ αƒ›αƒ¬αƒ™αƒ αƒ˜αƒ•αƒ˜αƒ‘ αƒ¬αƒαƒ¨αƒšαƒ αƒαƒœ αƒ’αƒαƒœαƒαƒαƒšαƒ”ბა αƒ¨αƒ”αƒ£αƒ«αƒšαƒ”αƒ‘αƒ”αƒšαƒ˜αƒ: გარე αƒ’αƒαƒ‘αƒαƒ¦αƒ”αƒ‘αƒ˜αƒ‘ შეზღუდვა შეαƒͺდომაბ αƒ¨αƒ”αƒ˜αƒͺავბ (%s)" + spa "No puedo aΓ±adir o actualizar una fila hija: falla una restricciΓ³n de clave forΓ‘nea (%s)" + sw "Haiwezi kuongeza au kusasisha safu mlalo ya mtoto: kizuizi cha ufunguo wa kigeni hakifaulu (%s)" ER_SP_BAD_VAR_SHADOW 42000 chi "ε˜ι‡'%-.64s'必鑻用`...`οΌŒζˆ–ι‡ε‘½ε" eng "Variable '%-.64s' must be quoted with `...`, or renamed" diff --git a/sql/slave.cc b/sql/slave.cc index 25e948c6413..ab8cf495055 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -7228,7 +7228,8 @@ static Log_event* next_event(rpl_group_info *rgi, ulonglong *event_size) MYSQL_BIN_LOG::open() will write the buffered description event. */ old_pos= rli->event_relay_log_pos; - if ((ev= Log_event::read_log_event(cur_log, + int error; + if ((ev= Log_event::read_log_event(cur_log, &error, rli->relay_log.description_event_for_exec, opt_slave_sql_verify_checksum))) @@ -7245,8 +7246,8 @@ static Log_event* next_event(rpl_group_info *rgi, ulonglong *event_size) DBUG_RETURN(ev); } if (opt_reckless_slave) // For mysql-test - cur_log->error = 0; - if (unlikely(cur_log->error < 0)) + error = 0; + if (unlikely(error)) { errmsg = "slave SQL thread aborted because of I/O error"; if (hot_log) diff --git a/sql/sp_instr.h b/sql/sp_instr.h index 87937d08d20..2717bc85c3b 100644 --- a/sql/sp_instr.h +++ b/sql/sp_instr.h @@ -281,6 +281,7 @@ public: m_lex_resp= false; /* Prevent endless recursion. */ m_lex->sphead= nullptr; + delete m_lex->result; lex_end(m_lex); delete m_lex; } diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index aa77c407895..67fed298066 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -54,6 +54,7 @@ #include "sql_array.h" #include "sql_hset.h" #include "password.h" +#include "scope.h" #include "sql_plugin_compat.h" #include "wsrep_mysqld.h" @@ -2646,10 +2647,9 @@ static LEX_STRING make_and_check_db_name(MEM_ROOT *mem_root, static bool acl_load(THD *thd, const Grant_tables& tables) { READ_RECORD read_record_info; - Sql_mode_save old_mode_save(thd); DBUG_ENTER("acl_load"); - thd->variables.sql_mode&= ~MODE_PAD_CHAR_TO_FULL_LENGTH; + SCOPE_CLEAR(thd->variables.sql_mode, MODE_PAD_CHAR_TO_FULL_LENGTH); grant_version++; /* Privileges updated */ @@ -3467,7 +3467,7 @@ end: switch (result) { case ER_INVALID_CURRENT_USER: - my_error(ER_INVALID_CURRENT_USER, MYF(0), rolename.str); + my_error(ER_INVALID_CURRENT_USER, MYF(0)); break; case ER_INVALID_ROLE: /* Role doesn't exist at all */ @@ -8529,7 +8529,8 @@ bool check_grant(THD *thd, privilege_t want_access, TABLE_LIST *tables, if (access) { - switch(access->check(orig_want_access, &t_ref->grant.privilege)) + switch(access->check(orig_want_access, &t_ref->grant.privilege, + any_combination_will_do)) { case ACL_INTERNAL_ACCESS_GRANTED: t_ref->grant.privilege|= orig_want_access; diff --git a/sql/sql_acl.h b/sql/sql_acl.h index 866c32958fb..5e3892ed3be 100644 --- a/sql/sql_acl.h +++ b/sql/sql_acl.h @@ -213,7 +213,7 @@ public: in save_priv. */ virtual ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const= 0; + privilege_t *save_priv, bool any_combination_will_do) const= 0; }; /** diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index f03fe0ea094..6f31b170672 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -636,7 +636,7 @@ bool Sql_cmd_alter_table::execute(THD *thd) DBUG_RETURN(TRUE); /* purecov: inspected */ #ifdef WITH_WSREP - if (WSREP(thd) && + if (WSREP(thd) && wsrep_thd_is_local(thd) && (!thd->is_current_stmt_binlog_format_row() || !thd->find_temporary_table(first_table))) { diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 2c0d8323059..a81bebe15ee 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -439,6 +439,7 @@ public: /** Name of table for the above error. */ const char *fk_error_table= nullptr; bool modified_primary_key= false; + bool fast_alter_partition= false; /** Indicates that we are altering temporary table */ bool tmp_table= false; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 6165575b300..c2ec97b7221 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -784,6 +784,22 @@ close_all_tables_for_name(THD *thd, TABLE_SHARE *share, } } +static inline bool check_field_pointers(const TABLE *table) +{ + for (Field **pf= table->field; *pf; pf++) + { + Field *f= *pf; + if (f->ptr < table->record[0] || f->ptr > table->record[0] + + table->s->reclength) + return false; + if (f->null_ptr && + (f->null_ptr < table->record[0] || f->null_ptr > table->record[0] + + table->s->reclength)) + return false; + } + return true; +} + int close_thread_tables_for_query(THD *thd) { @@ -847,6 +863,8 @@ int close_thread_tables(THD *thd) DBUG_PRINT("tcache", ("table: '%s' query_id: %lu", table->s->table_name.str, (ulong) table->query_id)); + DBUG_SLOW_ASSERT(check_field_pointers(table)); + if (thd->locked_tables_mode) { #ifdef WITH_PARTITION_STORAGE_ENGINE @@ -8927,6 +8945,23 @@ static bool vers_update_or_validate_fields(TABLE *table) } +static void unwind_stored_field_offsets(const List &fields, Field *end) +{ + for (Item &item_field: fields) + { + Field *f= item_field.field_for_view_update()->field; + if (f == end) + break; + + if (f->stored_in_db()) + { + TABLE *table= f->table; + f->move_field_offset((my_ptrdiff_t) (table->record[0] - + table->record[1])); + } + } +} + /****************************************************************************** ** Fill a record with data (for INSERT or UPDATE) ** Returns : 1 if some field has wrong type @@ -8982,7 +9017,7 @@ fill_record(THD *thd, TABLE *table_arg, List &fields, List &values, if (!(field= fld->field_for_view_update())) { my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name.str); - goto err; + goto err_unwind_fields; } value=v++; DBUG_ASSERT(value); @@ -9014,7 +9049,7 @@ fill_record(THD *thd, TABLE *table_arg, List &fields, List &values, if (value->save_in_field(rfield, 0) < 0 && !ignore_errors) { my_message(ER_UNKNOWN_ERROR, ER_THD(thd, ER_UNKNOWN_ERROR), MYF(0)); - goto err; + goto err_unwind_fields; } rfield->set_has_explicit_value(); } @@ -9030,20 +9065,7 @@ fill_record(THD *thd, TABLE *table_arg, List &fields, List &values, } if (update && thd->variables.sql_mode & MODE_SIMULTANEOUS_ASSIGNMENT) - { - // restore fields pointers on record[0] - f.rewind(); - while ((fld= f++)) - { - rfield= fld->field_for_view_update()->field; - if (rfield->stored_in_db()) - { - table= rfield->table; - rfield->move_field_offset((my_ptrdiff_t) (table->record[0] - - table->record[1])); - } - } - } + unwind_stored_field_offsets(fields, NULL); if (update) table_arg->evaluate_update_default_function(); @@ -9062,6 +9084,9 @@ fill_record(THD *thd, TABLE *table_arg, List &fields, List &values, thd->abort_on_warning= save_abort_on_warning; thd->no_errors= save_no_errors; DBUG_RETURN(thd->is_error()); +err_unwind_fields: + if (update && thd->variables.sql_mode & MODE_SIMULTANEOUS_ASSIGNMENT) + unwind_stored_field_offsets(fields, rfield); err: DBUG_PRINT("error",("got error")); thd->abort_on_warning= save_abort_on_warning; @@ -9090,7 +9115,6 @@ void switch_to_nullable_trigger_fields(List &items, TABLE *table) while ((item= it++)) item->walk(&Item::switch_to_nullable_fields_processor, 1, field); - table->triggers->reset_extra_null_bitmap(); } } @@ -9144,8 +9168,14 @@ static bool not_null_fields_have_null_values(TABLE *table) swap_variables(uint32, of->flags, ff->flags); if (ff->is_real_null()) { + uint err= ER_BAD_NULL_ERROR; + if (ff->flags & NO_DEFAULT_VALUE_FLAG && !ff->has_explicit_value()) + { + err= ER_NO_DEFAULT_FOR_FIELD; + table->in_use->count_cuted_fields= CHECK_FIELD_WARN; + } ff->set_notnull(); // for next row WHERE condition in UPDATE - if (convert_null_to_field_value_or_error(of) || thd->is_error()) + if (convert_null_to_field_value_or_error(of, err) || thd->is_error()) return true; } } @@ -9425,8 +9455,9 @@ my_bool mysql_rm_tmp_tables(void) memcpy(path_copy, path, path_len - ext_len); path_copy[path_len - ext_len]= 0; init_tmp_table_share(thd, &share, "", 0, "", path_copy, true); + handlerton *ht= share.db_type(); if (!open_table_def(thd, &share)) - share.db_type()->drop_table(share.db_type(), path_copy); + ht->drop_table(share.db_type(), path_copy); free_table_share(&share); } /* diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 5b39e5931c4..2d09103f84b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -169,7 +169,8 @@ Key::Key(const Key &rhs, MEM_ROOT *mem_root) name(rhs.name), option_list(rhs.option_list), generated(rhs.generated), invisible(false), - without_overlaps(rhs.without_overlaps), old(rhs.old), period(rhs.period) + without_overlaps(rhs.without_overlaps), old(rhs.old), length(rhs.length), + period(rhs.period) { list_copy_and_replace_each_value(columns, mem_root); } @@ -196,7 +197,7 @@ Foreign_key::Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root) /* Test if a foreign key (= generated key) is a prefix of the given key - (ignoring key name, key type and order of columns) + (ignoring key name and type, but minding the algorithm) NOTES: This is only used to test if an index for a FOREIGN KEY exists @@ -211,6 +212,16 @@ Foreign_key::Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root) bool is_foreign_key_prefix(Key *a, Key *b) { + ha_key_alg a_alg= a->key_create_info.algorithm; + ha_key_alg b_alg= b->key_create_info.algorithm; + + // The real algorithm in InnoDB will be BTREE if none was given by user. + a_alg= a_alg == HA_KEY_ALG_UNDEF ? HA_KEY_ALG_BTREE : a_alg; + b_alg= b_alg == HA_KEY_ALG_UNDEF ? HA_KEY_ALG_BTREE : b_alg; + + if (a_alg != b_alg) + return false; + /* Ensure that 'a' is the generated key */ if (a->generated) { @@ -3187,7 +3198,7 @@ void Item_change_list::rollback_item_tree_changes() ** Functions to provide a interface to select results *****************************************************************************/ -void select_result::cleanup() +void select_result::reset_for_next_ps_execution() { /* do nothing */ } @@ -3256,6 +3267,7 @@ void select_send::abort_result_set() */ thd->spcont->end_partial_result_set= TRUE; } + reset_for_next_ps_execution(); DBUG_VOID_RETURN; } @@ -3266,7 +3278,7 @@ void select_send::abort_result_set() stored procedure statement. */ -void select_send::cleanup() +void select_send::reset_for_next_ps_execution() { is_result_set_started= FALSE; } @@ -3304,7 +3316,7 @@ bool select_send::send_eof() if (unlikely(thd->is_error())) return TRUE; ::my_eof(thd); - is_result_set_started= 0; + reset_for_next_ps_execution(); return FALSE; } @@ -3313,10 +3325,22 @@ bool select_send::send_eof() Handling writing to file ************************************************************************/ +bool select_to_file::free_recources() +{ + if (file >= 0) + { + (void) end_io_cache(&cache); + bool error= mysql_file_close(file, MYF(MY_WME)); + file= -1; + return error; + } + return FALSE; +} + bool select_to_file::send_eof() { - int error= MY_TEST(end_io_cache(&cache)); - if (unlikely(mysql_file_close(file, MYF(MY_WME))) || + int error= false; + if (unlikely(free_recources()) || unlikely(thd->is_error())) error= true; @@ -3324,20 +3348,19 @@ bool select_to_file::send_eof() { ::my_ok(thd,row_count); } - file= -1; return error; } +void select_to_file::abort_result_set() +{ + select_result_interceptor::abort_result_set(); + free_recources(); +} -void select_to_file::cleanup() +void select_to_file::reset_for_next_ps_execution() { /* In case of error send_eof() may be not called: close the file here. */ - if (file >= 0) - { - (void) end_io_cache(&cache); - mysql_file_close(file, MYF(0)); - file= -1; - } + free_recources(); path[0]= '\0'; row_count= 0; } @@ -3345,12 +3368,8 @@ void select_to_file::cleanup() select_to_file::~select_to_file() { - if (file >= 0) - { // This only happens in case of error - (void) end_io_cache(&cache); - mysql_file_close(file, MYF(0)); - file= -1; - } + DBUG_ASSERT(file < 0); + free_recources(); // just in case } /*************************************************************************** @@ -3840,9 +3859,9 @@ int select_singlerow_subselect::send_data(List &items) } -void select_max_min_finder_subselect::cleanup() +void select_max_min_finder_subselect::reset_for_next_ps_execution() { - DBUG_ENTER("select_max_min_finder_subselect::cleanup"); + DBUG_ENTER("select_max_min_finder_subselect::reset_for_next_ps_execution"); cache= 0; DBUG_VOID_RETURN; } @@ -4067,7 +4086,7 @@ bool select_dumpvar::check_simple_select() const } -void select_dumpvar::cleanup() +void select_dumpvar::reset_for_next_ps_execution() { row_count= 0; } @@ -4540,10 +4559,10 @@ void select_materialize_with_stats::reset() } -void select_materialize_with_stats::cleanup() +void select_materialize_with_stats::reset_for_next_ps_execution() { reset(); - select_unit::cleanup(); + select_unit::reset_for_next_ps_execution(); } diff --git a/sql/sql_class.h b/sql/sql_class.h index 92cca6e4448..f04ecf6bc43 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -52,6 +52,7 @@ #include "session_tracker.h" #include "backup.h" #include "xa.h" +#include "scope.h" #include "ddl_log.h" /* DDL_LOG_STATE */ #include "ha_handler_stats.h" // ha_handler_stats */ @@ -473,6 +474,7 @@ public: bool invisible; bool without_overlaps; bool old; + uint length; Lex_ident_column period; Key(enum Keytype type_par, const LEX_CSTRING *name_arg, @@ -480,7 +482,7 @@ public: :DDL_options(ddl_options), type(type_par), key_create_info(default_key_create_info), name(*name_arg), option_list(NULL), generated(generated_arg), - invisible(false), without_overlaps(false), old(false) + invisible(false), without_overlaps(false), old(false), length(0) { key_create_info.algorithm= algorithm_arg; } @@ -491,7 +493,7 @@ public: :DDL_options(ddl_options), type(type_par), key_create_info(*key_info_arg), columns(*cols), name(*name_arg), option_list(create_opt), generated(generated_arg), - invisible(false), without_overlaps(false), old(false) + invisible(false), without_overlaps(false), old(false), length(0) {} Key(const Key &rhs, MEM_ROOT *mem_root); virtual ~Key() = default; @@ -6248,7 +6250,8 @@ public: */ virtual int send_data(List &items)=0; virtual ~select_result_sink() = default; - void reset(THD *thd_arg) { thd= thd_arg; } + // Used in cursors to initialize and reset + void reinit(THD *thd_arg) { thd= thd_arg; } }; class select_result_interceptor; @@ -6322,15 +6325,11 @@ public: */ virtual bool check_simple_select() const; virtual void abort_result_set() {} - /* - Cleanup instance of this class for next execution of a prepared - statement/stored procedure. - */ - virtual void cleanup(); + virtual void reset_for_next_ps_execution(); void set_thd(THD *thd_arg) { thd= thd_arg; } - void reset(THD *thd_arg) + void reinit(THD *thd_arg) { - select_result_sink::reset(thd_arg); + select_result_sink::reinit(thd_arg); unit= NULL; } #ifdef EMBEDDED_LIBRARY @@ -6436,9 +6435,9 @@ public: elsewhere. (this is used by ANALYZE $stmt feature). */ void disable_my_ok_calls() { suppress_my_ok= true; } - void reset(THD *thd_arg) + void reinit(THD *thd_arg) { - select_result::reset(thd_arg); + select_result::reinit(thd_arg); suppress_my_ok= false; } protected: @@ -6492,7 +6491,7 @@ private: {} void reset(THD *thd_arg) { - select_result_interceptor::reset(thd_arg); + select_result_interceptor::reinit(thd_arg); spvar_list= NULL; field_count= 0; } @@ -6534,7 +6533,7 @@ public: void reset(THD *thd_arg) { sp_cursor_statistics::reset(); - result.reset(thd_arg); + result.reinit(thd_arg); server_side_cursor= NULL; } @@ -6561,7 +6560,7 @@ public: bool send_eof() override; bool check_simple_select() const override { return FALSE; } void abort_result_set() override; - void cleanup() override; + void reset_for_next_ps_execution() override; select_result_interceptor *result_interceptor() override { return NULL; } }; @@ -6596,7 +6595,9 @@ public: { path[0]=0; } ~select_to_file(); bool send_eof() override; - void cleanup() override; + void abort_result_set() override; + void reset_for_next_ps_execution() override; + bool free_recources(); }; @@ -6673,7 +6674,7 @@ class select_insert :public select_result_interceptor { bool send_eof() override; void abort_result_set() override; /* not implemented: select_insert is never re-used in prepared statements */ - void cleanup() override; + void reset_for_next_ps_execution() override; }; @@ -6900,7 +6901,7 @@ public: int delete_record(); bool send_eof() override; virtual bool flush(); - void cleanup() override; + void reset_for_next_ps_execution() override; virtual bool create_result_table(THD *thd, List *column_types, bool is_distinct, ulonglong options, const LEX_CSTRING *alias, @@ -7075,9 +7076,10 @@ class select_union_recursive :public select_unit */ List rec_table_refs; /* - The count of how many times cleanup() was called with cleaned==false - for the unit specifying the recursive CTE for which this object was created - or for the unit specifying a CTE that mutually recursive with this CTE. + The count of how many times reset_for_next_ps_execution() was called with + cleaned==false for the unit specifying the recursive CTE for which this + object was created or for the unit specifying a CTE that mutually + recursive with this CTE. */ uint cleanup_count; long row_counter; @@ -7096,7 +7098,7 @@ class select_union_recursive :public select_unit bool create_table, bool keep_row_order, uint hidden) override; - void cleanup() override; + void reset_for_next_ps_execution() override; }; /** @@ -7166,7 +7168,7 @@ public: { result->abort_result_set(); /* purecov: inspected */ } - void cleanup() override + void reset_for_next_ps_execution() override { send_records= 0; } @@ -7269,7 +7271,7 @@ public: uint hidden) override; bool init_result_table(ulonglong select_options); int send_data(List &items) override; - void cleanup() override; + void reset_for_next_ps_execution() override; ha_rows get_null_count_of_col(uint idx) { DBUG_ASSERT(idx < table->s->fields); @@ -7302,7 +7304,7 @@ public: bool mx, bool all): select_subselect(thd_arg, item_arg), cache(0), fmax(mx), is_all(all) {} - void cleanup() override; + void reset_for_next_ps_execution() override; int send_data(List &items) override; bool cmp_real(); bool cmp_int(); @@ -7732,7 +7734,7 @@ public: int send_data(List &items) override; bool send_eof() override; bool check_simple_select() const override; - void cleanup() override; + void reset_for_next_ps_execution() override; }; /* Bits in sql_command_flags */ diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 3fd4bd7c430..1f1c88e301c 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -773,8 +773,8 @@ bool Sql_cmd_delete::delete_from_single_table(THD *thd) table->mark_columns_needed_for_delete(); } - if ((table->file->ha_table_flags() & HA_CAN_FORCE_BULK_DELETE) && - !table->prepare_triggers_for_delete_stmt_or_event()) + if (!table->prepare_triggers_for_delete_stmt_or_event() && + table->file->ha_table_flags() & HA_CAN_FORCE_BULK_DELETE) will_batch= !table->file->start_bulk_delete(); /* @@ -806,27 +806,21 @@ bool Sql_cmd_delete::delete_from_single_table(THD *thd) MEM_STRIP_BUF_SIZE); THD_STAGE_INFO(thd, stage_searching_rows_for_update); - while (!(error=info.read_record()) && !thd->killed && - ! thd->is_error()) + while (!(error=info.read_record()) && !thd->killed && !thd->is_error()) { if (record_should_be_deleted(thd, table, select, explain, delete_history)) { table->file->position(table->record[0]); - if (unlikely((error= - deltempfile->unique_add((char*) table->file->ref)))) - { - error= 1; - goto terminate_delete; - } + if ((error= deltempfile->unique_add((char*) table->file->ref))) + break; if (!--tmplimit && using_limit) break; } } end_read_record(&info); - if (unlikely(deltempfile->get(table)) || - unlikely(table->file->ha_index_or_rnd_end()) || - unlikely(init_read_record(&info, thd, table, 0, &deltempfile->sort, 0, - 1, false))) + if (table->file->ha_index_or_rnd_end() || error > 0 || + deltempfile->get(table) || + init_read_record(&info, thd, table, 0, &deltempfile->sort, 0, 1, 0)) { error= 1; goto terminate_delete; @@ -1300,6 +1294,13 @@ void multi_delete::abort_result_set() { DBUG_ENTER("multi_delete::abort_result_set"); + /**************************************************************************** + + NOTE: if you change here be aware that almost the same code is in + multi_delete::send_eof(). + + ***************************************************************************/ + /* the error was handled or nothing deleted and no side effects return */ if (error_handled || (!thd->transaction->stmt.modified_non_trans_table && !deleted)) @@ -1502,6 +1503,13 @@ bool multi_delete::send_eof() /* reset used flags */ THD_STAGE_INFO(thd, stage_end); + /**************************************************************************** + + NOTE: if you change here be aware that almost the same code is in + multi_delete::abort_result_set(). + + ***************************************************************************/ + if (thd->transaction->stmt.modified_non_trans_table) thd->transaction->all.modified_non_trans_table= TRUE; thd->transaction->all.m_unsafe_rollback_flags|= diff --git a/sql/sql_error.cc b/sql/sql_error.cc index 89dde3cf190..6a47e4b9cac 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -693,7 +693,6 @@ Sql_condition *Warning_info::push_warning(THD *thd, ulong current_row_number) { Sql_condition *cond= NULL; - DBUG_ASSERT(msg[strlen(msg)-1] != '\n'); if (! m_read_only) { @@ -753,6 +752,7 @@ void push_warning(THD *thd, Sql_condition::enum_warning_level level, if (level == Sql_condition::WARN_LEVEL_ERROR) level= Sql_condition::WARN_LEVEL_WARN; + DBUG_ASSERT(msg[strlen(msg)-1] != '\n'); (void) thd->raise_condition(code, "\0\0\0\0\0", level, msg); /* Make sure we also count warnings pushed after calling set_ok_status(). */ diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 74b84ddb60d..d19821a28e6 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -990,8 +990,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list, if (fields.elements || !value_count || table_list->view != 0) { - if (table->triggers && - table->triggers->has_triggers(TRG_EVENT_INSERT, TRG_ACTION_BEFORE)) + if (table->field != table->field_to_fill()) { /* BEFORE INSERT triggers exist, the check will be done later, per row */ } @@ -1065,7 +1064,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list, INSERT INTO t1 (fields) VALUES ... INSERT INTO t1 VALUES () */ - restore_record(table,s->default_values); // Get empty record + restore_default_record_for_insert(table); table->reset_default_fields(); if (unlikely(fill_record_n_invoke_before_triggers(thd, table, fields, @@ -1094,7 +1093,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list, */ if (thd->lex->used_tables || // Column used in values() table->s->visible_fields != table->s->fields) - restore_record(table,s->default_values); // Get empty record + restore_default_record_for_insert(table); else { TABLE_SHARE *share= table->s; @@ -1131,24 +1130,6 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list, } } - /* - with triggers a field can get a value *conditionally*, so we have to - repeat has_no_default_value() check for every row - */ - if (table->triggers && - table->triggers->has_triggers(TRG_EVENT_INSERT, TRG_ACTION_BEFORE)) - { - for (Field **f=table->field ; *f ; f++) - { - if (unlikely(!(*f)->has_explicit_value() && - has_no_default_value(thd, *f, table_list))) - { - error= 1; - goto values_loop_end; - } - } - } - if ((res= table_list->view_check_option(thd, ignore)) == VIEW_CHECK_SKIP) continue; else if (res == VIEW_CHECK_ERROR) @@ -2219,6 +2200,9 @@ int write_record(THD *thd, TABLE *table, COPY_INFO *info, select_result *sink) !table->file->referenced_by_foreign_key() && (!table->triggers || !table->triggers->has_delete_triggers())) { + /* + Optimized dup handling via UPDATE (and insert history for versioned). + */ if (table->versioned(VERS_TRX_ID)) { DBUG_ASSERT(table->vers_write); @@ -2254,25 +2238,39 @@ int write_record(THD *thd, TABLE *table, COPY_INFO *info, select_result *sink) } else { + /* + Normal dup handling via DELETE (or UPDATE to history for versioned) + and repeating the cycle of INSERT. + */ if (table->triggers && table->triggers->process_triggers(thd, TRG_EVENT_DELETE, TRG_ACTION_BEFORE, TRUE)) goto before_trg_err; - if (!table->versioned(VERS_TIMESTAMP)) + bool do_delete= !table->versioned(VERS_TIMESTAMP); + if (do_delete) error= table->file->ha_delete_row(table->record[1]); else { + /* Update existing row to history */ store_record(table, record[2]); restore_record(table, record[1]); table->vers_update_end(); error= table->file->ha_update_row(table->record[1], table->record[0]); restore_record(table, record[2]); + if (error == HA_ERR_FOUND_DUPP_KEY || /* Unique index, any SE */ + error == HA_ERR_FOREIGN_DUPLICATE_KEY || /* Unique index, InnoDB */ + error == HA_ERR_RECORD_IS_THE_SAME) /* No index */ + { + /* Such history row was already generated from previous cycles */ + error= table->file->ha_delete_row(table->record[1]); + do_delete= true; + } } if (unlikely(error)) goto err; - if (!table->versioned(VERS_TIMESTAMP)) + if (do_delete) info->deleted++; else info->updated++; @@ -2520,6 +2518,7 @@ public: delayed_insert_threads--; my_free(thd.query()); + thd.reset_query_inner(); thd.security_ctx->user= 0; thd.security_ctx->host= 0; } @@ -2772,12 +2771,21 @@ end_create: DBUG_RETURN(thd->is_error()); } -#define memdup_vcol(thd, vcol) \ - if (vcol) \ - { \ - (vcol)= (Virtual_column_info*)(thd)->memdup((vcol), sizeof(*(vcol))); \ - (vcol)->expr= NULL; \ +static inline +bool memdup_vcol(THD *thd, Virtual_column_info *&vcol) +{ + if (vcol) + { + vcol= (Virtual_column_info*)(thd->memdup(vcol, sizeof(*vcol))); + if (!vcol) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + return true; + } + vcol->expr= NULL; } + return false; +} /** As we can't let many client threads modify the same TABLE @@ -2921,9 +2929,12 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd) (*field)->move_field_offset(adjust_ptrs); // Point at copy->record[0] (*field)->flags|= ((*org_field)->flags & LONG_UNIQUE_HASH_FIELD); (*field)->invisible= (*org_field)->invisible; - memdup_vcol(client_thd, (*field)->vcol_info); - memdup_vcol(client_thd, (*field)->default_value); - memdup_vcol(client_thd, (*field)->check_constraint); + if (memdup_vcol(client_thd, (*field)->vcol_info)) + goto error; + if (memdup_vcol(client_thd, (*field)->default_value)) + goto error; + if (memdup_vcol(client_thd, (*field)->check_constraint)) + goto error; if (*org_field == found_next_number_field) (*field)->table->found_next_number_field= *field; } @@ -2940,6 +2951,8 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd) &error_reported, VCOL_INIT_DEPENDENCY_FAILURE_IS_WARNING))) goto error; + + copy->update_keypart_vcol_info(); } switch_defaults_to_nullable_trigger_fields(copy); @@ -4172,7 +4185,7 @@ select_insert::prepare(List &values, SELECT_LEX_UNIT *u) */ table->file->ha_start_bulk_insert((ha_rows) 0); } - restore_record(table,s->default_values); // Get empty record + restore_default_record_for_insert(table); table->reset_default_fields(); table->next_number_field=table->found_next_number_field; @@ -4253,7 +4266,7 @@ int select_insert::prepare2(JOIN *) } -void select_insert::cleanup() +void select_insert::reset_for_next_ps_execution() { /* select_insert/select_create are never re-used in prepared statement */ DBUG_ASSERT(0); @@ -4315,7 +4328,7 @@ int select_insert::send_data(List &values) originally touched by INSERT ... SELECT, so we have to restore their original values for the next row. */ - restore_record(table, s->default_values); + restore_default_record_for_insert(table); } if (table->next_number_field) { @@ -4365,6 +4378,13 @@ bool select_insert::prepare_eof() DBUG_PRINT("enter", ("trans_table: %d, table_type: '%s'", trans_table, table->file->table_type())); + /**************************************************************************** + + NOTE: if you change here be aware that almost the same code is in + select_insert::abort_result_set(). + + ****************************************************************************/ + error= IF_WSREP(thd->wsrep_cs().current_error(), 0) ? -1 : (thd->locked_tables_mode <= LTM_LOCK_TABLES) ? table->file->ha_end_bulk_insert() : 0; @@ -4506,6 +4526,12 @@ void select_insert::abort_result_set() */ if (table && table->file->is_open()) { + /**************************************************************************** + + NOTE: if you change here be aware that almost the same code is in + select_insert::prepare_eof(). + + ****************************************************************************/ bool changed, transactional_table; /* If we are not in prelocked mode, we end the bulk insert started @@ -4533,7 +4559,14 @@ void select_insert::abort_result_set() If table creation failed, the number of rows modified will also be zero, so no check for that is made. */ - changed= (info.copied || info.deleted || info.updated); + if ((changed= (info.copied || info.deleted || info.updated))) + { + /* + We must invalidate the table in the query cache before binlog writing + and ha_autocommit_or_rollback. + */ + query_cache_invalidate3(thd, table, 1); + } transactional_table= table->file->has_transactions_and_rollback(); if (thd->transaction->stmt.modified_non_trans_table || thd->log_current_statement()) diff --git a/sql/sql_insert.h b/sql/sql_insert.h index 8b034c25877..2080761a0dc 100644 --- a/sql/sql_insert.h +++ b/sql/sql_insert.h @@ -47,6 +47,13 @@ void kill_delayed_threads(void); bool binlog_create_table(THD *thd, TABLE *table, bool replace); bool binlog_drop_table(THD *thd, TABLE *table); +static inline void restore_default_record_for_insert(TABLE *t) +{ + restore_record(t,s->default_values); + if (t->triggers) + t->triggers->default_extra_null_bitmap(); +} + #ifdef EMBEDDED_LIBRARY inline void kill_delayed_threads(void) {} #endif diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 07b50743b31..9acbf0d94a1 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -4616,7 +4616,11 @@ public: case SQLCOM_LOAD: return duplicates == DUP_REPLACE; default: - return false; + /* + Row injections (i.e. row binlog events and BINLOG statements) should + generate history. + */ + return is_stmt_row_injection(); } } diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 04913182f29..91f0749c726 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -23,7 +23,6 @@ #include "sql_priv.h" #include "unireg.h" #include "sql_load.h" -#include "sql_load.h" #include "sql_cache.h" // query_cache_* #include "sql_base.h" // fill_record_n_invoke_before_triggers #include @@ -725,7 +724,15 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list, table->file->print_error(my_errno, MYF(0)); error= 1; } - table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); + if (!error) + { + int err= table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); + if (err == HA_ERR_FOUND_DUPP_KEY) + { + error= 1; + my_error(ER_ERROR_DURING_COMMIT, MYF(0), 1); + } + } table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE); table->next_number_field=0; } @@ -1057,8 +1064,7 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, read_info.row_end[0]=0; #endif - restore_record(table, s->default_values); - + restore_default_record_for_insert(table); while ((item= it++)) { Load_data_outvar *dst= item->get_load_data_outvar(); @@ -1171,8 +1177,8 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, thd->progress.max_counter); } } - restore_record(table, s->default_values); + restore_default_record_for_insert(table); while ((item= it++)) { uint length; @@ -1326,8 +1332,7 @@ read_xml_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, } #endif - restore_record(table, s->default_values); - + restore_default_record_for_insert(table); while ((item= it++)) { /* If this line is to be skipped we don't want to fill field or var */ diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 62acd758699..385be58ecc2 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -439,7 +439,6 @@ bool stmt_causes_implicit_commit(THD *thd, uint mask) case SQLCOM_DROP_TABLE: case SQLCOM_DROP_SEQUENCE: case SQLCOM_CREATE_TABLE: - case SQLCOM_CREATE_SEQUENCE: /* If CREATE TABLE of non-temporary table and the table is not part if a BEGIN GTID ... COMMIT group, do a implicit commit. @@ -4778,17 +4777,18 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt) lex->create_info.set(DDL_options_st::OPT_IF_EXISTS); #ifdef WITH_WSREP - if (WSREP(thd)) + if (WSREP(thd) && !lex->tmp_table() && wsrep_thd_is_local(thd) && + (!thd->is_current_stmt_binlog_format_row() || + wsrep_table_list_has_non_temp_tables(thd, all_tables))) { - for (TABLE_LIST *table= all_tables; table; table= table->next_global) + wsrep::key_array keys; + if (wsrep_append_fk_parent_table(thd, all_tables, &keys)) { - if (!lex->tmp_table() && - (!thd->is_current_stmt_binlog_format_row() || - !is_temporary_table(table))) - { - WSREP_TO_ISOLATION_BEGIN(NULL, NULL, all_tables); - break; - } + goto wsrep_error_label; + } + if (wsrep_to_isolation_begin(thd, NULL, NULL, all_tables, NULL, &keys)) + { + goto wsrep_error_label; } } #endif /* WITH_WSREP */ diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index fdd35d7cef5..6482f77bd6c 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -712,9 +712,11 @@ static bool handle_list_of_fields(THD *thd, List_iterator it, } else { - if (table->s->db_type()->partition_flags && - (table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION) && - (table->s->db_type()->partition_flags() & HA_CAN_PARTITION)) + handlerton *ht= table->s->db_type(); + if (ht->partition_flags && + ((ht->partition_flags() & + (HA_USE_AUTO_PARTITION | HA_CAN_PARTITION)) == + (HA_USE_AUTO_PARTITION | HA_CAN_PARTITION))) { /* This engine can handle automatic partitioning and there is no @@ -1917,6 +1919,7 @@ bool fix_partition_func(THD *thd, TABLE *table, bool is_create_table_ind) bool result= TRUE; partition_info *part_info= table->part_info; enum_column_usage saved_column_usage= thd->column_usage; + handlerton *ht; DBUG_ENTER("fix_partition_func"); if (part_info->fixed) @@ -2046,8 +2049,9 @@ bool fix_partition_func(THD *thd, TABLE *table, bool is_create_table_ind) goto end; if (unlikely(check_primary_key(table))) goto end; - if (unlikely((!(table->s->db_type()->partition_flags && - (table->s->db_type()->partition_flags() & HA_CAN_PARTITION_UNIQUE))) && + ht= table->s->db_type(); + if (unlikely((!(ht->partition_flags && + (ht->partition_flags() & HA_CAN_PARTITION_UNIQUE))) && check_unique_keys(table))) goto end; if (unlikely(set_up_partition_bitmaps(thd, part_info))) @@ -2768,12 +2772,14 @@ bool partition_key_modified(TABLE *table, const MY_BITMAP *fields) { Field **fld; partition_info *part_info= table->part_info; + handlerton *ht; DBUG_ENTER("partition_key_modified"); if (!part_info) DBUG_RETURN(FALSE); - if (table->s->db_type()->partition_flags && - (table->s->db_type()->partition_flags() & HA_CAN_UPDATE_PARTITION_KEY)) + ht= table->s->db_type(); + if (ht->partition_flags && + (ht->partition_flags() & HA_CAN_UPDATE_PARTITION_KEY)) DBUG_RETURN(FALSE); for (fld= part_info->full_part_field_array; *fld; fld++) if (bitmap_is_set(fields, (*fld)->field_index)) @@ -4990,11 +4996,10 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info, if default partitioning is used. */ + handlerton *ht= table->s->db_type(); if (tab_part_info->part_type != HASH_PARTITION || - ((table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION) && - !tab_part_info->use_default_num_partitions) || - ((!(table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION)) && - tab_part_info->use_default_num_partitions)) + !(ht->partition_flags() & HA_USE_AUTO_PARTITION) == + tab_part_info->use_default_num_partitions) { my_error(ER_REORG_NO_PARAM_ERROR, MYF(0)); goto err; diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index 0238406b737..1876d025801 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -241,6 +241,8 @@ bool compare_table_with_partition(THD *thd, TABLE *table, TABLE *part_table, part_create_info.row_type= table->s->row_type; } + part_create_info.table= part_table; + /* NOTE: ha_blackhole does not support check_if_compatible_data, so this always fail for blackhole tables. diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 3f2099aef26..0c297db34be 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -3178,14 +3178,14 @@ void sync_dynamic_session_variables(THD* thd, bool global_lock) If required, will sync with global variables if the requested variable has not yet been allocated in the current thread. */ -static uchar *intern_sys_var_ptr(THD* thd, int offset, bool global_lock) +static void *intern_sys_var_ptr(THD* thd, int offset, bool global_lock) { DBUG_ENTER("intern_sys_var_ptr"); DBUG_ASSERT(offset >= 0); DBUG_ASSERT((uint)offset <= global_system_variables.dynamic_variables_head); if (!thd) - DBUG_RETURN((uchar*) global_system_variables.dynamic_variables_ptr + offset); + DBUG_RETURN(global_system_variables.dynamic_variables_ptr + offset); /* dynamic_variables_head points to the largest valid offset @@ -3197,7 +3197,7 @@ static uchar *intern_sys_var_ptr(THD* thd, int offset, bool global_lock) sync_dynamic_session_variables(thd, global_lock); mysql_prlock_unlock(&LOCK_system_variables_hash); } - DBUG_RETURN((uchar*)thd->variables.dynamic_variables_ptr + offset); + DBUG_RETURN(thd->variables.dynamic_variables_ptr + offset); } @@ -3211,42 +3211,47 @@ static uchar *intern_sys_var_ptr(THD* thd, int offset, bool global_lock) static char *mysql_sys_var_char(THD* thd, int offset) { - return (char *) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); } static int *mysql_sys_var_int(THD* thd, int offset) { - return (int *) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); +} + +static unsigned int *mysql_sys_var_uint(THD* thd, int offset) +{ + return static_cast(intern_sys_var_ptr(thd, offset, true)); } static long *mysql_sys_var_long(THD* thd, int offset) { - return (long *) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); } static unsigned long *mysql_sys_var_ulong(THD* thd, int offset) { - return (unsigned long *) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); } static long long *mysql_sys_var_longlong(THD* thd, int offset) { - return (long long *) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); } static unsigned long long *mysql_sys_var_ulonglong(THD* thd, int offset) { - return (unsigned long long *) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); } static char **mysql_sys_var_str(THD* thd, int offset) { - return (char **) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); } static double *mysql_sys_var_double(THD* thd, int offset) { - return (double *) intern_sys_var_ptr(thd, offset, true); + return static_cast(intern_sys_var_ptr(thd, offset, true)); } void plugin_thdvar_init(THD *thd) @@ -3527,7 +3532,7 @@ uchar* sys_var_pluginvar::real_value_ptr(THD *thd, enum_var_type type) const if (type == OPT_GLOBAL) thd= NULL; - return intern_sys_var_ptr(thd, *(int*) (plugin_var+1), false); + return (uchar*) intern_sys_var_ptr(thd, *(int*) (plugin_var+1), false); } return *(uchar**) (plugin_var+1); } @@ -3536,8 +3541,8 @@ uchar* sys_var_pluginvar::real_value_ptr(THD *thd, enum_var_type type) const bool sys_var_pluginvar::session_is_default(THD *thd) { uchar *value= plugin_var->flags & PLUGIN_VAR_THDLOCAL - ? intern_sys_var_ptr(thd, *(int*) (plugin_var+1), true) - : *(uchar**) (plugin_var+1); + ? static_cast(intern_sys_var_ptr(thd, *(int*) (plugin_var+1), true)) + : *reinterpret_cast(plugin_var+1); real_value_ptr(thd, OPT_SESSION); @@ -3777,27 +3782,27 @@ void plugin_opt_set_limits(struct my_option *options, break; case PLUGIN_VAR_ENUM | PLUGIN_VAR_THDLOCAL: options->var_type= GET_ENUM; - options->typelib= ((thdvar_enum_t*) opt)->typelib; - options->def_value= ((thdvar_enum_t*) opt)->def_val; + options->typelib= reinterpret_cast(opt)->typelib; + options->def_value= reinterpret_cast(opt)->def_val; options->min_value= options->block_size= 0; options->max_value= options->typelib->count - 1; break; case PLUGIN_VAR_SET | PLUGIN_VAR_THDLOCAL: options->var_type= GET_SET; - options->typelib= ((thdvar_set_t*) opt)->typelib; - options->def_value= ((thdvar_set_t*) opt)->def_val; + options->typelib= reinterpret_cast(opt)->typelib; + options->def_value= reinterpret_cast(opt)->def_val; options->min_value= options->block_size= 0; options->max_value= (1ULL << options->typelib->count) - 1; break; case PLUGIN_VAR_BOOL | PLUGIN_VAR_THDLOCAL: options->var_type= GET_BOOL; - options->def_value= ((thdvar_bool_t*) opt)->def_val; + options->def_value= reinterpret_cast(opt)->def_val; options->typelib= &bool_typelib; break; case PLUGIN_VAR_STR | PLUGIN_VAR_THDLOCAL: options->var_type= ((opt->flags & PLUGIN_VAR_MEMALLOC) ? GET_STR_ALLOC : GET_STR); - options->def_value= (intptr) ((thdvar_str_t*) opt)->def_val; + options->def_value= reinterpret_cast(reinterpret_cast(opt)->def_val); break; default: DBUG_ASSERT(0); @@ -3836,7 +3841,7 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp, size_t plugin_name_len= strlen(plugin_name); size_t optnamelen; const int max_comment_len= 255; - char *comment= (char *) alloc_root(mem_root, max_comment_len + 1); + char *comment= static_cast(alloc_root(mem_root, max_comment_len + 1)); char *optname; int index= 0, UNINIT_VAR(offset); @@ -3848,7 +3853,7 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp, DBUG_ENTER("construct_options"); - plugin_name_ptr= (char*) alloc_root(mem_root, plugin_name_len + 1); + plugin_name_ptr= static_cast(alloc_root(mem_root, plugin_name_len + 1)); safe_strcpy(plugin_name_ptr, plugin_name_len + 1, plugin_name); my_casedn_str_latin1(plugin_name_ptr); // Plugin names are pure ASCII convert_underscore_to_dash(plugin_name_ptr, plugin_name_len); @@ -3907,19 +3912,28 @@ static int construct_options(MEM_ROOT *mem_root, struct st_plugin_int *tmp, continue; if (!(register_var(plugin_name_ptr, opt->name, opt->flags))) continue; - switch (opt->flags & PLUGIN_VAR_TYPEMASK) { + switch (opt->flags & (PLUGIN_VAR_TYPEMASK | PLUGIN_VAR_UNSIGNED)) { case PLUGIN_VAR_BOOL: ((thdvar_bool_t *) opt)->resolve= mysql_sys_var_char; break; case PLUGIN_VAR_INT: ((thdvar_int_t *) opt)->resolve= mysql_sys_var_int; break; + case PLUGIN_VAR_INT | PLUGIN_VAR_UNSIGNED: + ((thdvar_uint_t *) opt)->resolve= mysql_sys_var_uint; + break; case PLUGIN_VAR_LONG: ((thdvar_long_t *) opt)->resolve= mysql_sys_var_long; break; + case PLUGIN_VAR_LONG | PLUGIN_VAR_UNSIGNED: + ((thdvar_ulong_t *) opt)->resolve= mysql_sys_var_ulong; + break; case PLUGIN_VAR_LONGLONG: ((thdvar_longlong_t *) opt)->resolve= mysql_sys_var_longlong; break; + case PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED: + ((thdvar_ulonglong_t *) opt)->resolve= mysql_sys_var_ulonglong; + break; case PLUGIN_VAR_STR: ((thdvar_str_t *) opt)->resolve= mysql_sys_var_str; break; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index df485288243..1fa872b8d55 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -2837,8 +2837,8 @@ void mysql_sql_stmt_execute_immediate(THD *thd) DBUG_VOID_RETURN; // out of memory // See comments on thd->free_list in mysql_sql_stmt_execute() - Item *free_list_backup= thd->free_list; - thd->free_list= NULL; + SCOPE_VALUE(thd->free_list, (Item *) NULL); + SCOPE_EXIT([thd]() mutable { thd->free_items(); }); /* Make sure we call Prepared_statement::execute_immediate() with an empty THD::change_list. It can be non empty as the above @@ -2861,8 +2861,6 @@ void mysql_sql_stmt_execute_immediate(THD *thd) Item_change_list_savepoint change_list_savepoint(thd); (void) stmt->execute_immediate(query.str, (uint) query.length); change_list_savepoint.rollback(thd); - thd->free_items(); - thd->free_list= free_list_backup; /* stmt->execute_immediately() sets thd->query_string with the executed @@ -3038,7 +3036,7 @@ void reinit_stmt_before_use(THD *thd, LEX *lex) if (lex->result) { - lex->result->cleanup(); + lex->result->reset_for_next_ps_execution(); lex->result->set_thd(thd); } lex->allow_sum_func.clear_all(); @@ -3431,8 +3429,13 @@ void mysql_sql_stmt_execute(THD *thd) so they don't get freed in case of re-prepare. See MDEV-10702 Crash in SET STATEMENT FOR EXECUTE */ - Item *free_list_backup= thd->free_list; - thd->free_list= NULL; // Hide the external (e.g. "SET STATEMENT") Items + /* + Hide and restore at scope exit the "external" (e.g. "SET STATEMENT") Item list. + It will be freed normally in THD::cleanup_after_query(). + */ + SCOPE_VALUE(thd->free_list, (Item *) NULL); + // Free items created by execute_loop() at scope exit + SCOPE_EXIT([thd]() mutable { thd->free_items(); }); /* Make sure we call Prepared_statement::execute_loop() with an empty THD::change_list. It can be non-empty because the above @@ -3456,12 +3459,6 @@ void mysql_sql_stmt_execute(THD *thd) (void) stmt->execute_loop(&expanded_query, FALSE, NULL, NULL); change_list_savepoint.rollback(thd); - thd->free_items(); // Free items created by execute_loop() - /* - Now restore the "external" (e.g. "SET STATEMENT") Item list. - It will be freed normally in THD::cleanup_after_query(). - */ - thd->free_list= free_list_backup; stmt->lex->restore_set_statement_var(); DBUG_VOID_RETURN; diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index a7a882521f7..2feb276bd7c 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -3353,6 +3353,8 @@ err: } else if (info->errmsg != NULL) safe_strcpy(info->error_text, sizeof(info->error_text), info->errmsg); + else if (info->error_text[0] == 0) + safe_strcpy(info->error_text, sizeof(info->error_text), ER(info->error)); my_message(info->error, info->error_text, MYF(0)); @@ -4533,7 +4535,8 @@ bool mysql_show_binlog_events(THD* thd) my_off_t scan_pos = BIN_LOG_HEADER_SIZE; while (scan_pos < pos) { - ev= Log_event::read_log_event(&log, description_event, + int error; + ev= Log_event::read_log_event(&log, &error, description_event, opt_master_verify_checksum); scan_pos = my_b_tell(&log); if (ev == NULL || !ev->is_valid()) @@ -4608,8 +4611,9 @@ bool mysql_show_binlog_events(THD* thd) writing about this in the server log would be confusing as it isn't related to server operational status. */ + int error; for (event_count = 0; - (ev = Log_event::read_log_event(&log, + (ev = Log_event::read_log_event(&log, &error, description_event, (opt_master_verify_checksum || verify_checksum_once), false)); ) @@ -4653,7 +4657,7 @@ bool mysql_show_binlog_events(THD* thd) break; } - if (unlikely(event_count < unit->lim.get_select_limit() && log.error)) + if (unlikely(event_count < unit->lim.get_select_limit() && error)) { errmsg = "Wrong offset or I/O error"; mysql_mutex_unlock(log_lock); diff --git a/sql/sql_servers.cc b/sql/sql_servers.cc index 727d45e12ec..e49eb573d99 100644 --- a/sql/sql_servers.cc +++ b/sql/sql_servers.cc @@ -287,7 +287,7 @@ end: static bool servers_load(THD *thd, TABLE_LIST *tables) { - TABLE *table; + TABLE *table= tables[0].table; READ_RECORD read_record_info; bool return_val= TRUE; DBUG_ENTER("servers_load"); @@ -296,7 +296,8 @@ static bool servers_load(THD *thd, TABLE_LIST *tables) free_root(&mem, MYF(0)); init_sql_alloc(key_memory_servers, &mem, ACL_ALLOC_BLOCK_SIZE, 0, MYF(0)); - if (init_read_record(&read_record_info,thd,table=tables[0].table, NULL, NULL, + table->use_all_columns(); + if (init_read_record(&read_record_info,thd,table, NULL, NULL, 1,0, FALSE)) DBUG_RETURN(1); while (!(read_record_info.read_record())) @@ -448,7 +449,6 @@ get_server_from_table_to_cache(TABLE *table) FOREIGN_SERVER *server= (FOREIGN_SERVER *)alloc_root(&mem, sizeof(FOREIGN_SERVER)); DBUG_ENTER("get_server_from_table_to_cache"); - table->use_all_columns(); /* get each field into the server struct ptr */ ptr= get_field(&mem, table->field[0]); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index bf2833f2ce3..c1e2e9a5518 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -70,8 +70,8 @@ #include "opt_trace.h" #include "my_cpu.h" #include "key.h" +#include "scope.h" #include "vector_mhnsw.h" - #include "lex_symbol.h" #include "mysql/plugin_function.h" @@ -1352,7 +1352,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list) { Protocol *protocol= thd->protocol; char buff[2048]; - String buffer(buff, sizeof(buff), system_charset_info); + String buffer(buff, sizeof(buff), &my_charset_utf8mb4_general_ci); List field_list; bool error= TRUE; DBUG_ENTER("mysqld_show_create"); @@ -1840,7 +1840,7 @@ static bool get_field_default_value(THD *thd, Field *field, String *def_value, def_value->length(0); if (has_default) { - StringBuffer str(field->charset()); + StringBuffer str(&my_charset_utf8mb4_general_ci); if (field->default_value) { field->default_value->print(&str); @@ -2368,11 +2368,11 @@ int show_create_table_ex(THD *thd, TABLE_LIST *table_list, const char *force_db, packet->append(STRING_WITH_LEN(" NULL")); } - def_value.set(def_value_buf, sizeof(def_value_buf), system_charset_info); + def_value.set(def_value_buf, sizeof(def_value_buf), &my_charset_utf8mb4_general_ci); if (get_field_default_value(thd, field, &def_value, 1)) { packet->append(STRING_WITH_LEN(" DEFAULT ")); - packet->append(def_value.ptr(), def_value.length(), system_charset_info); + packet->append(def_value.ptr(), def_value.length(), &my_charset_utf8mb4_general_ci); } if (field->vers_update_unversioned()) @@ -4744,6 +4744,19 @@ static void get_table_engine_for_i_s(THD *thd, char *buf, TABLE_LIST *tl, } +/* + Hide error for a non-existing table. + For example, this error can occur when we use a where condition + with a db name and table, but the table does not exist or + there is a view with the same name. +*/ +static bool hide_object_error(uint err) +{ + return err == ER_NO_SUCH_TABLE || err == ER_WRONG_OBJECT || + err == ER_NOT_SEQUENCE; +} + + /** Fill I_S table with data obtained by performing full-blown table open. @@ -4879,17 +4892,7 @@ fill_schema_table_by_open(THD *thd, MEM_ROOT *mem_root, { if (!is_show_fields_or_keys) { - /* - Hide error for a non-existing table and skip processing. - For example, this error can occur when we use a where condition - with a db name and table, but the table does not exist or - there is a view with the same name. - Some errors, like ER_UNKNOWN_STORAGE_ENGINE, can still allow table - processing, if the information schema table supports that. - */ - run= run && thd->get_stmt_da()->sql_errno() != ER_NO_SUCH_TABLE - && thd->get_stmt_da()->sql_errno() != ER_WRONG_OBJECT - && thd->get_stmt_da()->sql_errno() != ER_NOT_SEQUENCE; + run= run && !hide_object_error(thd->get_stmt_da()->sql_errno()); if (!run) { thd->clear_error(); @@ -4989,8 +4992,8 @@ static int fill_schema_table_names(THD *thd, TABLE_LIST *tables, else table->field[3]->store(STRING_WITH_LEN("ERROR"), cs); - if (unlikely(thd->is_error() && - thd->get_stmt_da()->sql_errno() == ER_NO_SUCH_TABLE)) + if (unlikely(thd->is_error()) && + hide_object_error(thd->get_stmt_da()->sql_errno())) { thd->clear_error(); return 0; @@ -5229,9 +5232,7 @@ static int fill_schema_table_from_frm(THD *thd, MEM_ROOT *mem_root, share= tdc_acquire_share(thd, &table_list, GTS_TABLE | GTS_VIEW); if (!share) { - if (thd->get_stmt_da()->sql_errno() == ER_NO_SUCH_TABLE || - thd->get_stmt_da()->sql_errno() == ER_WRONG_OBJECT || - thd->get_stmt_da()->sql_errno() == ER_NOT_SEQUENCE) + if (hide_object_error(thd->get_stmt_da()->sql_errno())) { res= 0; } @@ -5277,16 +5278,25 @@ static int fill_schema_table_from_frm(THD *thd, MEM_ROOT *mem_root, goto end_share; } - if (!open_table_from_share(thd, share, table_name, 0, - (EXTRA_RECORD | OPEN_FRM_FILE_ONLY), - thd->open_options, &tbl, FALSE)) + res= open_table_from_share(thd, share, table_name, 0, + EXTRA_RECORD | OPEN_FRM_FILE_ONLY, + thd->open_options, &tbl, FALSE); + if (res && hide_object_error(thd->get_stmt_da()->sql_errno())) + res= 0; + else { + char buf[NAME_CHAR_LEN + 1]; + if (unlikely(res)) + get_table_engine_for_i_s(thd, buf, &table_list, db_name, table_name); + tbl.s= share; table_list.table= &tbl; table_list.view= (LEX*) share->is_view; - res= schema_table->process_table(thd, &table_list, table, - res, db_name, table_name); - closefrm(&tbl); + bool res2= schema_table->process_table(thd, &table_list, table, res, + db_name, table_name); + if (res == 0) + closefrm(&tbl); + res= res2; } @@ -5414,7 +5424,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) DBUG_ENTER("get_all_tables"); LEX *lex= thd->lex; TABLE *table= tables->table; - TABLE_LIST table_acl_check; SELECT_LEX *lsel= tables->schema_select_lex; ST_SCHEMA_TABLE *schema_table= tables->schema_table; IS_table_read_plan *plan= tables->is_table_read_plan; @@ -5557,8 +5566,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) } } - bzero((char*) &table_acl_check, sizeof(table_acl_check)); - if (make_db_list(thd, &db_names, &plan->lookup_field_vals)) goto err; @@ -5567,9 +5574,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) LEX_CSTRING *db_name= db_names.at(i); DBUG_ASSERT(db_name->length <= NAME_LEN); #ifndef NO_EMBEDDED_ACCESS_CHECKS - if (!(check_access(thd, SELECT_ACL, db_name->str, - &thd->col_access, NULL, 0, 1) || - (!thd->col_access && check_grant_db(thd, db_name->str))) || + if (!check_access(thd, SELECT_ACL, db_name->str, &thd->col_access, 0,0,1) || sctx->master_access & (DB_ACLS | SHOW_DB_ACL) || acl_get_all3(sctx, db_name->str, 0)) #endif @@ -5591,6 +5596,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) #ifndef NO_EMBEDDED_ACCESS_CHECKS if (!(thd->col_access & TABLE_ACLS)) { + TABLE_LIST table_acl_check; + table_acl_check.reset(); table_acl_check.db= Lex_ident_db(*db_name); table_acl_check.table_name= Lex_ident_table(*table_name); table_acl_check.grant.privilege= thd->col_access; @@ -6995,8 +7002,7 @@ int store_schema_params(THD *thd, TABLE *table, TABLE *proc_table, if (sp) { LEX_CSTRING tmp_string; - Sql_mode_save sql_mode_backup(thd); - thd->variables.sql_mode= sql_mode; + SCOPE_VALUE(thd->variables.sql_mode, sql_mode); if (sph->type() == SP_TYPE_FUNCTION) { diff --git a/sql/sql_table.cc b/sql/sql_table.cc index be982105fa4..bf321d1efa9 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1316,7 +1316,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, char path[FN_REFLEN + 1]; LEX_CSTRING alias= null_clex_str; LEX_CUSTRING version= {0, 0}; - LEX_CSTRING partition_engine_name= null_clex_str; StringBuffer<160> unknown_tables(system_charset_info); DDL_LOG_STATE local_ddl_log_state; const char *comment_start; @@ -1401,6 +1400,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, const LEX_CSTRING db= table->db; const LEX_CSTRING table_name= table->table_name; LEX_CSTRING cpath= {0,0}; + LEX_CSTRING partition_engine_name= {NULL, 0}; handlerton *hton= 0; Table_type table_type; size_t path_length= 0; @@ -2811,6 +2811,315 @@ key_add_part_check_null(const handler *file, KEY *key_info, } +static +my_bool key_check_without_overlaps(THD *thd, HA_CREATE_INFO *create_info, + Alter_info *alter_info, + Key &key) +{ + DBUG_ENTER("key_check_without_overlaps"); + if (!key.without_overlaps) + DBUG_RETURN(FALSE); + // append_system_key_parts is already called, so we should check all the + // columns except the last two. + const auto &period_start= create_info->period_info.period.start; + const auto &period_end= create_info->period_info.period.end; + List_iterator part_it_forwarded(key.columns); + List_iterator part_it(key.columns); + part_it_forwarded++; + part_it_forwarded++; + while (part_it_forwarded++) + { + Key_part_spec *key_part= part_it++; + + if (period_start.streq(key_part->field_name) + || period_end.streq(key_part->field_name)) + { + my_error(ER_KEY_CONTAINS_PERIOD_FIELDS, MYF(0), key.name.str, + key_part->field_name.str); + DBUG_RETURN(TRUE); + } + } + + if (key.key_create_info.algorithm == HA_KEY_ALG_HASH || + key.key_create_info.algorithm == HA_KEY_ALG_LONG_HASH) + + { + my_error(ER_KEY_CANT_HAVE_WITHOUT_OVERLAPS, MYF(0), key.name.str); + DBUG_RETURN(TRUE); + } + for (Key &key2: alter_info->key_list) + { + if (key2.type != Key::FOREIGN_KEY) + continue; + DBUG_ASSERT(&key != &key2); + const Foreign_key &fk= (Foreign_key&)key2; + if (fk.update_opt != FK_OPTION_CASCADE) + continue; + for (Key_part_spec& kp: key.columns) + { + for (Key_part_spec& kp2: fk.columns) + { + if (kp.field_name.streq(kp2.field_name)) + { + my_error(ER_KEY_CANT_HAVE_WITHOUT_OVERLAPS, MYF(0), key.name.str); + DBUG_RETURN(TRUE); + } + } + } + } + create_info->period_info.unique_keys++; + + DBUG_RETURN(FALSE); +} + +static +my_bool init_key_part_spec(THD *thd, Alter_info *alter_info, + const handler *file, + const Key &key, Key_part_spec &kp, + uint max_key_length, uint max_key_part_length, + bool *is_hash_field_needed) +{ + DBUG_ENTER("init_key_part_spec"); + + const Lex_ident_column &field_name= kp.field_name; + Create_field *column= NULL; + + for (Create_field &c: alter_info->create_list) + if (c.field_name.streq(field_name)) + column= &c; + + /* + Either field is not present or field visibility is > INVISIBLE_USER + */ + if (!column || (column->invisible > INVISIBLE_USER && !kp.generated)) + { + my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), field_name.str); + DBUG_RETURN(TRUE); + } + + if (!DBUG_IF("test_invisible_index") + && column->invisible > INVISIBLE_USER + && !(column->flags & VERS_SYSTEM_FIELD) && !key.invisible) + { + my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), column->field_name.str); + DBUG_RETURN(TRUE); + } + + const Type_handler *type_handler= column->type_handler(); + switch(key.type) + { + case Key::VECTOR: + if (type_handler->Key_part_spec_init_vector(&kp, *column)) + { + my_error(ER_WRONG_ARGUMENTS, MYF(0), "VECTOR INDEX"); + DBUG_RETURN(TRUE); + } + break; + case Key::FULLTEXT: + if (type_handler->Key_part_spec_init_ft(&kp, *column)) + { + my_error(ER_BAD_FT_COLUMN, MYF(0), field_name.str); + DBUG_RETURN(-1); + } + break; + + case Key::SPATIAL: + if (type_handler->Key_part_spec_init_spatial(&kp, *column)) + DBUG_RETURN(TRUE); + break; + + case Key::PRIMARY: + if (column->vcol_info) + { + my_error(ER_PRIMARY_KEY_BASED_ON_GENERATED_COLUMN, MYF(0)); + DBUG_RETURN(TRUE); + } + if (type_handler->Key_part_spec_init_primary(&kp, *column, file)) + DBUG_RETURN(TRUE); + break; + + case Key::MULTIPLE: + if (type_handler->Key_part_spec_init_multiple(&kp, *column, file)) + DBUG_RETURN(TRUE); + break; + + case Key::FOREIGN_KEY: + if (type_handler->Key_part_spec_init_foreign(&kp, *column, file)) + DBUG_RETURN(TRUE); + break; + + case Key::UNIQUE: + if (type_handler->Key_part_spec_init_unique(&kp, *column, file, + is_hash_field_needed)) + DBUG_RETURN(TRUE); + break; + + case Key::IGNORE_KEY: + DBUG_ASSERT(0); + break; + } + + uint key_part_length= type_handler->calc_key_length(*column); + + if (kp.length) + { + if (f_is_blob(column->pack_flag)) + { + key_part_length= MY_MIN(kp.length, + blob_length_by_type(column->real_field_type()) + * column->charset->mbmaxlen); + if (key_part_length > max_key_length || + key_part_length > max_key_part_length) + { + if (key.type == Key::MULTIPLE) + { + key_part_length= MY_MIN(max_key_length, max_key_part_length); + /* not a critical problem */ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_TOO_LONG_KEY, ER_THD(thd, ER_TOO_LONG_KEY), + key_part_length); + /* Align key length to multibyte char boundary */ + key_part_length-= key_part_length % column->charset->mbmaxlen; + } + } + } + // Catch invalid use of partial keys + else if (!f_is_geom(column->pack_flag) && + // is the key partial? + kp.length != key_part_length && + // is prefix length bigger than field length? + (kp.length > key_part_length || + // can the field have a partial key? + !type_handler->type_can_have_key_part() || + // a packed field can't be used in a partial key + f_is_packed(column->pack_flag) || + // does the storage engine allow prefixed search? + ((file->ha_table_flags() & HA_NO_PREFIX_CHAR_KEYS) && + // and is this a 'unique' key? + (key.type == Key::PRIMARY || key.type == Key::UNIQUE)))) + { + my_message(ER_WRONG_SUB_KEY, ER_THD(thd, ER_WRONG_SUB_KEY), MYF(0)); + DBUG_RETURN(TRUE); + } + else if (!(file->ha_table_flags() & HA_NO_PREFIX_CHAR_KEYS)) + key_part_length= kp.length; + } + else if (key_part_length == 0 && (column->flags & NOT_NULL_FLAG) && + !*is_hash_field_needed) + { + my_error(ER_WRONG_KEY_COLUMN, MYF(0), file->table_type(), field_name.str); + DBUG_RETURN(TRUE); + } + if (key_part_length > max_key_part_length) + { + if (key.type == Key::MULTIPLE) + { + key_part_length= max_key_part_length; + /* not a critical problem */ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_TOO_LONG_KEY, ER_THD(thd, ER_TOO_LONG_KEY), + key_part_length); + /* Align key length to multibyte char boundary */ + key_part_length-= key_part_length % column->charset->mbmaxlen; + } + else if (key.type == Key::PRIMARY) + { + key_part_length= MY_MIN(max_key_length, max_key_part_length); + my_error(ER_TOO_LONG_KEY, MYF(0), key_part_length); + DBUG_RETURN(TRUE); + } + } + + if (key.type == Key::UNIQUE && key_part_length > MY_MIN(max_key_length, + max_key_part_length)) + *is_hash_field_needed= true; + + /* We can not store key_part_length more than 2^16 - 1 in frm. */ + if (*is_hash_field_needed && kp.length > UINT_MAX16) + { + my_error(ER_TOO_LONG_KEYPART, MYF(0), UINT_MAX16); + DBUG_RETURN(TRUE); + } + + kp.length= key_part_length; + + DBUG_RETURN(FALSE); +} + + +/** + @brief Initialize the key length and algorithm (if long hash). + + This function does: + 1. Append system key parts (versioning, periods) + 2. Call Type_handler key_part initialization function. + 3. Determine the length of each key_part. + 4. Calculate the total Key length. + 5. Determine if the key is long unique based on its length + smd result from type handler. It'll be saved in + key_create_info.algorithm as HA_KEY_ALG_LONG_HASH. + + @return FALSE OK + @return TRUE error + */ +static +my_bool init_key_info(THD *thd, Alter_info *alter_info, + HA_CREATE_INFO *create_info, + const handler *file) +{ + DBUG_ENTER("init_key_info"); + uint max_key_length= file->max_key_length(); + uint max_key_part_length= file->max_key_part_length(); + + for (Key &key: alter_info->key_list) + { + if (key.type == Key::FOREIGN_KEY) + continue; + + int parts_added= append_system_key_parts(thd, create_info, &key); + if (parts_added < 0) + DBUG_RETURN(true); + + bool is_hash_field_needed= false; + for (Key_part_spec &kp: key.columns) + { + if (init_key_part_spec(thd, alter_info, file, key, kp, + max_key_length, max_key_part_length, + &is_hash_field_needed)) + DBUG_RETURN(TRUE); + + key.length+= kp.length; + if (key.length > max_key_length) + { + if (key.type == Key::UNIQUE) + is_hash_field_needed= true; // for case "a BLOB UNIQUE" + else if (key.type <= Key::MULTIPLE) + { + my_error(ER_TOO_LONG_KEY, MYF(0), max_key_length); + DBUG_RETURN(TRUE); + } + } + + KEY_CREATE_INFO *key_cinfo= &key.key_create_info; + + if (is_hash_field_needed) + { + if (key_cinfo->algorithm == HA_KEY_ALG_UNDEF) + key_cinfo->algorithm= HA_KEY_ALG_LONG_HASH; + + if (key_cinfo->algorithm != HA_KEY_ALG_HASH && + key_cinfo->algorithm != HA_KEY_ALG_LONG_HASH) + { + my_error(ER_TOO_LONG_KEY, MYF(0), max_key_length); + DBUG_RETURN(TRUE); + } + } + } + } + DBUG_RETURN(FALSE); +} + + /* Prepare for a table creation. Stage 1: prepare the field list. @@ -2912,7 +3221,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, { Lex_ident_column key_name; Create_field *sql_field,*dup_field; - uint field,null_fields,max_key_length; + uint field,null_fields; ulong record_offset= 0; KEY_PART_INFO *key_part_info; int field_no,dup_no; @@ -2923,7 +3232,6 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, int select_field_count= C_CREATE_SELECT(create_table_mode); bool tmp_table= create_table_mode == C_ALTER_TABLE; const bool create_simple= thd->lex->create_simple(); - bool is_hash_field_needed= false; const CHARSET_INFO *scs= system_charset_info; DBUG_ENTER("mysql_prepare_create_table"); @@ -2941,7 +3249,6 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, create_info->versioned()); null_fields= 0; create_info->varchar= 0; - max_key_length= file->max_key_length(); /* Handle creation of sequences */ if (create_info->sequence) @@ -3110,6 +3417,9 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, Key *key, *key2; uint tmp, key_number; + if (init_key_info(thd, alter_info, create_info, file)) + DBUG_RETURN(TRUE); + /* Calculate number of key segements */ *key_count= 0; @@ -3247,10 +3557,6 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, key_info->name= key_name; key->name= key_info->name; - int parts_added= append_system_key_parts(thd, create_info, key); - if (parts_added < 0) - DBUG_RETURN(true); - key_parts += parts_added; key_info++; } tmp=file->max_keys(); @@ -3269,13 +3575,13 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, key_number=0; for (; (key=key_iterator++) ; key_number++) { - uint key_length=0; Create_field *auto_increment_key= 0; Key_part_spec *column; st_plugin_int *index_plugin= hton2plugin[create_info->db_type->slot]; ha_create_table_option *index_options= create_info->db_type->index_options; - is_hash_field_needed= false; + bool is_hash_field_needed= key->key_create_info.algorithm + == HA_KEY_ALG_LONG_HASH; if (key->type == Key::IGNORE_KEY) { /* ignore redundant keys */ @@ -3286,6 +3592,9 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, break; } + if (key_check_without_overlaps(thd, create_info, alter_info, *key)) + DBUG_RETURN(true); + switch (key->type) { case Key::MULTIPLE: key_info->flags= 0; @@ -3329,10 +3638,12 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, if (key->generated) key_info->flags|= HA_GENERATED_KEY; + key_info->key_length= key->length; key_info->user_defined_key_parts=(uint8) key->columns.elements; key_info->key_part=key_part_info; key_info->usable_key_parts= key_number; key_info->algorithm= key->key_create_info.algorithm; + key_info->without_overlaps= key->without_overlaps; key_info->option_list= key->option_list; extend_option_list(thd, index_plugin, !key->old, &key_info->option_list, index_options); @@ -3397,37 +3708,11 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, CHARSET_INFO *ft_key_charset=0; // for FULLTEXT for (uint column_nr=0 ; (column=cols++) ; column_nr++) { - Key_part_spec *dup_column; - it.rewind(); field=0; while ((sql_field=it++) && !column->field_name.streq(sql_field->field_name)) field++; - /* - Either field is not present or field visibility is > INVISIBLE_USER - */ - if (!sql_field || (sql_field->invisible > INVISIBLE_USER && - !column->generated)) - { - my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), column->field_name.str); - DBUG_RETURN(TRUE); - } - if (sql_field->invisible > INVISIBLE_USER && - !(sql_field->flags & VERS_SYSTEM_FIELD) && - !key->invisible && !DBUG_IF("test_invisible_index")) - { - my_error(ER_KEY_COLUMN_DOES_NOT_EXIST, MYF(0), column->field_name.str); - DBUG_RETURN(TRUE); - } - while ((dup_column= cols2++) != column) - { - if (column->field_name.streq(dup_column->field_name)) - { - my_error(ER_DUP_FIELDNAME, MYF(0), column->field_name.str); - DBUG_RETURN(TRUE); - } - } if (sql_field->compression_method()) { @@ -3437,15 +3722,9 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, } cols2.rewind(); - const Type_handler *field_type= sql_field->type_handler(); - switch(key->type) { - + switch(key->type) + { case Key::VECTOR: - if (field_type->Key_part_spec_init_vector(column, *sql_field)) - { - my_error(ER_WRONG_ARGUMENTS, MYF(0), "VECTOR INDEX"); - DBUG_RETURN(TRUE); - } if (sql_field->check_vcol_for_key(thd)) DBUG_RETURN(TRUE); if (!(sql_field->flags & NOT_NULL_FLAG)) @@ -3460,10 +3739,8 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, DBUG_RETURN(TRUE); } break; - case Key::FULLTEXT: - if (field_type->Key_part_spec_init_ft(column, *sql_field) || - (ft_key_charset && sql_field->charset != ft_key_charset)) + if (ft_key_charset && sql_field->charset != ft_key_charset) { my_error(ER_BAD_FT_COLUMN, MYF(0), column->field_name.str); DBUG_RETURN(-1); @@ -3471,57 +3748,48 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, ft_key_charset= sql_field->charset; break; - case Key::SPATIAL: - if (field_type->Key_part_spec_init_spatial(column, *sql_field) || - sql_field->check_vcol_for_key(thd)) - DBUG_RETURN(TRUE); - if (!(sql_field->flags & NOT_NULL_FLAG)) - { - my_error(ER_INDEX_CANNOT_HAVE_NULL, MYF(0), "SPATIAL"); - DBUG_RETURN(TRUE); - } - break; - case Key::PRIMARY: - if (sql_field->vcol_info) - { - my_error(ER_PRIMARY_KEY_BASED_ON_GENERATED_COLUMN, MYF(0)); - DBUG_RETURN(TRUE); - } - if (field_type->Key_part_spec_init_primary(column, *sql_field, file)) - DBUG_RETURN(TRUE); if (!(sql_field->flags & NOT_NULL_FLAG)) { - /* Implicitly set primary key fields to NOT NULL for ISO conf. */ + /* Implicitly set primary key fields to NOT NULL for ISO conformance. */ sql_field->flags|= NOT_NULL_FLAG; sql_field->pack_flag&= ~FIELDFLAG_MAYBE_NULL; null_fields--; } break; - case Key::MULTIPLE: - if (field_type->Key_part_spec_init_multiple(column, *sql_field, file) || - sql_field->check_vcol_for_key(thd) || - key_add_part_check_null(file, key_info, sql_field, column)) - DBUG_RETURN(TRUE); - break; - - case Key::FOREIGN_KEY: - if (field_type->Key_part_spec_init_foreign(column, *sql_field, file) || - sql_field->check_vcol_for_key(thd) || - key_add_part_check_null(file, key_info, sql_field, column)) - DBUG_RETURN(TRUE); - break; - case Key::UNIQUE: - if (field_type->Key_part_spec_init_unique(column, *sql_field, file, - &is_hash_field_needed) || - sql_field->check_vcol_for_key(thd) || - key_add_part_check_null(file, key_info, sql_field, column)) + case Key::MULTIPLE: + case Key::FOREIGN_KEY: + if (key_add_part_check_null(file, key_info, sql_field, column)) + DBUG_RETURN(TRUE); + if (sql_field->check_vcol_for_key(thd)) DBUG_RETURN(TRUE); break; + case Key::IGNORE_KEY: break; + + case Key::SPATIAL: + if (!(sql_field->flags & NOT_NULL_FLAG)) + { + my_error(ER_INDEX_CANNOT_HAVE_NULL, MYF(0), "SPATIAL"); + DBUG_RETURN(TRUE); + } + if (sql_field->check_vcol_for_key(thd)) + DBUG_RETURN(TRUE); + break; + } + + for (const Key_part_spec &kp2: key->columns) + { + if (column == &kp2) + break; + if (kp2.field_name.streq(column->field_name)) + { + my_error(ER_DUP_FIELDNAME, MYF(0), column->field_name.str); + DBUG_RETURN(TRUE); + } } if (MTYP_TYPENR(sql_field->unireg_check) == Field::NEXT_NUMBER) @@ -3537,109 +3805,21 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, key_part_info->offset= (uint16) sql_field->offset; key_part_info->key_type=sql_field->pack_flag; key_part_info->key_part_flag= column->asc ? 0 : HA_REVERSE_SORT; - uint key_part_length= field_type->calc_key_length(*sql_field); - - if (column->length) - { - if (f_is_blob(sql_field->pack_flag)) - { - key_part_length= MY_MIN(column->length, - blob_length_by_type(sql_field->real_field_type()) - * sql_field->charset->mbmaxlen); - if (key_part_length > max_key_length || - key_part_length > file->max_key_part_length()) - { - if (key->type == Key::MULTIPLE) - { - key_part_length= MY_MIN(max_key_length, file->max_key_part_length()); - /* not a critical problem */ - push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, - ER_TOO_LONG_KEY, ER_THD(thd, ER_TOO_LONG_KEY), - key_part_length); - /* Align key length to multibyte char boundary */ - key_part_length-= key_part_length % sql_field->charset->mbmaxlen; - } - } - } - // Catch invalid use of partial keys - else if (!f_is_geom(sql_field->pack_flag) && - // is the key partial? - column->length != key_part_length && - // is prefix length bigger than field length? - (column->length > key_part_length || - // can the field have a partial key? - !field_type->type_can_have_key_part() || - // a packed field can't be used in a partial key - f_is_packed(sql_field->pack_flag) || - // does the storage engine allow prefixed search? - ((file->ha_table_flags() & HA_NO_PREFIX_CHAR_KEYS) && - // and is this a 'unique' key? - (key_info->flags & HA_NOSAME)))) - { - my_message(ER_WRONG_SUB_KEY, ER_THD(thd, ER_WRONG_SUB_KEY), MYF(0)); - DBUG_RETURN(TRUE); - } - else if (!(file->ha_table_flags() & HA_NO_PREFIX_CHAR_KEYS)) - key_part_length= column->length; - } - else if (key_part_length == 0 && (sql_field->flags & NOT_NULL_FLAG) && - !is_hash_field_needed) - { - my_error(ER_WRONG_KEY_COLUMN, MYF(0), file->table_type(), - column->field_name.str); - DBUG_RETURN(TRUE); - } - if (key_part_length > file->max_key_part_length() && - key->type != Key::FULLTEXT && key->type != Key::VECTOR) - { - if (key->type == Key::MULTIPLE) - { - key_part_length= file->max_key_part_length(); - /* not a critical problem */ - push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, - ER_TOO_LONG_KEY, ER_THD(thd, ER_TOO_LONG_KEY), - key_part_length); - /* Align key length to multibyte char boundary */ - key_part_length-= key_part_length % sql_field->charset->mbmaxlen; - } - else - { - if (key->type != Key::UNIQUE) - { - key_part_length= MY_MIN(max_key_length, file->max_key_part_length()); - my_error(ER_TOO_LONG_KEY, MYF(0), key_part_length); - DBUG_RETURN(TRUE); - } - } - } - - if (key->type == Key::UNIQUE - && key_part_length > MY_MIN(max_key_length, - file->max_key_part_length())) - is_hash_field_needed= true; - - /* We can not store key_part_length more then 2^16 - 1 in frm */ - if (is_hash_field_needed && column->length > UINT_MAX16) - { - my_error(ER_TOO_LONG_KEYPART, MYF(0), UINT_MAX16); - DBUG_RETURN(TRUE); - } - else - key_part_info->length= (uint16) key_part_length; + key_part_info->length= column->length; /* Use packed keys for long strings on the first column */ if (!((*db_options) & HA_OPTION_NO_PACK_KEYS) && !((create_info->table_options & HA_OPTION_NO_PACK_KEYS)) && - (key_part_length >= KEY_DEFAULT_PACK_LENGTH) && + (column->length >= KEY_DEFAULT_PACK_LENGTH) && !is_hash_field_needed) { - key_info->flags|= field_type->KEY_pack_flags(column_nr); + key_info->flags|= sql_field->type_handler()->KEY_pack_flags(column_nr); } /* Check if the key segment is partial, set the key flag accordingly */ - if (key_part_length != field_type->calc_key_length(*sql_field) && - key_part_length != field_type->max_octet_length()) + if (column->length != sql_field->type_handler()-> + calc_key_length(*sql_field) && + column->length != sql_field->type_handler()->max_octet_length()) key_info->flags|= HA_KEY_HAS_PART_KEY_SEG; - key_length+= key_part_length; key_part_info++; } if (!key_info->name.str || check_column_name(key_info->name.str)) @@ -3649,15 +3829,6 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, } if (key->type == Key::UNIQUE && !(key_info->flags & HA_NULL_PART_KEY)) unique_key=1; - key_info->key_length=(uint16) key_length; - if (key_info->key_length > max_key_length && key->type == Key::UNIQUE) - is_hash_field_needed= true; // for case "a BLOB UNIQUE" - if (key_length > max_key_length && key->type != Key::FULLTEXT && - key->type != Key::VECTOR && !is_hash_field_needed) - { - my_error(ER_TOO_LONG_KEY, MYF(0), max_key_length); - DBUG_RETURN(TRUE); - } /* Check long unique keys */ if (is_hash_field_needed) @@ -3668,12 +3839,6 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, sql_field->field_name.str, key_info->name.str); DBUG_RETURN(TRUE); } - if (key_info->algorithm != HA_KEY_ALG_UNDEF && - key_info->algorithm != HA_KEY_ALG_HASH) - { - my_error(ER_TOO_LONG_KEY, MYF(0), max_key_length); - DBUG_RETURN(TRUE); - } } if (is_hash_field_needed || (key_info->algorithm == HA_KEY_ALG_HASH && @@ -3717,39 +3882,6 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, // Check if a duplicate index is defined. check_duplicate_key(thd, key, key_info, &alter_info->key_list); - key_info->without_overlaps= key->without_overlaps; - if (key_info->without_overlaps) - { - if (key_info->algorithm == HA_KEY_ALG_HASH || - key_info->algorithm == HA_KEY_ALG_LONG_HASH) - - { -without_overlaps_err: - my_error(ER_KEY_CANT_HAVE_WITHOUT_OVERLAPS, MYF(0), key_info->name.str); - DBUG_RETURN(true); - } - key_iterator2.rewind(); - while ((key2 = key_iterator2++)) - { - if (key2->type != Key::FOREIGN_KEY) - continue; - DBUG_ASSERT(key != key2); - Foreign_key *fk= (Foreign_key*) key2; - if (fk->update_opt != FK_OPTION_CASCADE) - continue; - for (Key_part_spec& kp: key->columns) - { - for (Key_part_spec& kp2: fk->columns) - { - if (kp.field_name.streq(kp2.field_name)) - { - goto without_overlaps_err; - } - } - } - } - create_info->period_info.unique_keys++; - } key_info->is_ignored= key->key_create_info.is_ignored; key_info++; } @@ -4167,20 +4299,6 @@ static int append_system_key_parts(THD *thd, HA_CREATE_INFO *create_info, my_error(ER_PERIOD_NOT_FOUND, MYF(0), key->period.str); return -1; } - - const auto &period_start= create_info->period_info.period.start; - const auto &period_end= create_info->period_info.period.end; - List_iterator part_it(key->columns); - while (Key_part_spec *key_part= part_it++) - { - if (period_start.streq(key_part->field_name) - || period_end.streq(key_part->field_name)) - { - my_error(ER_KEY_CONTAINS_PERIOD_FIELDS, MYF(0), key->name.str, - key_part->field_name.str); - return -1; - } - } const auto &period= create_info->period_info.period; key->columns.push_back(new (thd->mem_root) Key_part_spec(&period.end, 0, true)); @@ -7422,7 +7540,16 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, DBUG_RETURN(1); /* Some very basic checks. */ - if (table->s->fields != alter_info->create_list.elements || + uint fields= table->s->fields; + + /* There is no field count on fully-invisible fields, count them. */ + for (Field **f_ptr= table->field; *f_ptr; f_ptr++) + { + if ((*f_ptr)->invisible >= INVISIBLE_FULL) + fields--; + } + + if (fields != alter_info->create_list.elements || table->s->db_type() != create_info->db_type || table->s->tmp_table || (table->s->row_type != create_info->row_type)) @@ -7433,6 +7560,9 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, for (Field **f_ptr= table->field; *f_ptr; f_ptr++) { Field *field= *f_ptr; + /* Skip hidden generated field like long hash index. */ + if (field->invisible >= INVISIBLE_SYSTEM) + continue; Create_field *tmp_new_field= tmp_new_field_it++; /* Check that NULL behavior is the same. */ @@ -7444,8 +7574,12 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, { if (!tmp_new_field->field->vcol_info) DBUG_RETURN(false); - if (!field->vcol_info->is_equal(tmp_new_field->field->vcol_info)) + bool err; + if (!field->vcol_info->is_equivalent(thd, table->s, create_info->table->s, + tmp_new_field->field->vcol_info, err)) DBUG_RETURN(false); + if (err) + DBUG_RETURN(true); } /* @@ -7479,13 +7613,13 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, DBUG_RETURN(false); /* Go through keys and check if they are compatible. */ - KEY *table_key; - KEY *table_key_end= table->key_info + table->s->keys; + KEY *table_key= table->s->key_info; + KEY *table_key_end= table_key + table->s->keys; KEY *new_key; KEY *new_key_end= key_info_buffer + key_count; /* Step through all keys of the first table and search matching keys. */ - for (table_key= table->key_info; table_key < table_key_end; table_key++) + for (; table_key < table_key_end; table_key++) { /* Search a key with the same name. */ for (new_key= key_info_buffer; new_key < new_key_end; new_key++) @@ -7528,7 +7662,7 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, for (new_key= key_info_buffer; new_key < new_key_end; new_key++) { /* Search a key with the same name. */ - for (table_key= table->key_info; table_key < table_key_end; table_key++) + for (table_key= table->s->key_info; table_key < table_key_end; table_key++) { if (table_key->name.streq(new_key->name)) break; @@ -9069,7 +9203,14 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, bzero((char*) &key_create_info, sizeof(key_create_info)); if (key_info->algorithm == HA_KEY_ALG_LONG_HASH) - key_info->algorithm= HA_KEY_ALG_UNDEF; + key_info->algorithm= alter_ctx->fast_alter_partition ? + HA_KEY_ALG_HASH : HA_KEY_ALG_UNDEF; + /* + For fast alter partition we set HA_KEY_ALG_HASH above to make sure it + doesn't lose the hash property. + Otherwise we let mysql_prepare_create_table() decide if the hash field + is needed depending on the (possibly changed) data types. + */ key_create_info.algorithm= key_info->algorithm; /* We copy block size directly as some engines, like Area, sets this @@ -9488,6 +9629,7 @@ fk_check_column_changes(THD *thd, const TABLE *table, *bad_column_name= NULL; enum fk_column_change_type result= FK_COLUMN_NO_CHANGE; + bool strict_mode= thd->is_strict_mode(); while ((column= column_it++)) { @@ -9532,7 +9674,7 @@ fk_check_column_changes(THD *thd, const TABLE *table, goto func_exit; } - if (old_field_not_null != new_field_not_null) + if (strict_mode && old_field_not_null != new_field_not_null) { if (referenced && !new_field_not_null) { @@ -10464,7 +10606,6 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, HA_CHECK_OPT check_opt; #ifdef WITH_PARTITION_STORAGE_ENGINE bool partition_changed= false; - bool fast_alter_partition= false; #endif bool require_copy_algorithm; bool partial_alter= false; @@ -11043,7 +11184,7 @@ do_continue:; Partitioning: part_info is prepared and returned via thd->work_part_info */ if (prep_alter_part_table(thd, table, alter_info, create_info, - &partition_changed, &fast_alter_partition)) + &partition_changed, &alter_ctx.fast_alter_partition)) { DBUG_RETURN(true); } @@ -11080,7 +11221,7 @@ do_continue:; Note, one can run a separate "ALTER TABLE t1 FORCE;" statement before or after the partition change ALTER statement to upgrade data types. */ - if (IF_PARTITIONING(!fast_alter_partition, 1)) + if (!alter_ctx.fast_alter_partition) Create_field::upgrade_data_types(alter_info->create_list); if (create_info->check_fields(thd, alter_info, @@ -11092,7 +11233,7 @@ do_continue:; promote_first_timestamp_column(&alter_info->create_list); #ifdef WITH_PARTITION_STORAGE_ENGINE - if (fast_alter_partition) + if (alter_ctx.fast_alter_partition) { /* ALGORITHM and LOCK clauses are generally not allowed by the @@ -12215,7 +12356,7 @@ static int online_alter_read_from_binlog(THD *thd, rpl_group_info *rgi, do { const auto *descr_event= rgi->rli->relay_log.description_event_for_exec; - auto *ev= Log_event::read_log_event(log_file, descr_event, 0, 1, ~0UL); + auto *ev= Log_event::read_log_event(log_file, &error, descr_event, 0, 1, ~0UL); error= log_file->error; if (unlikely(!ev)) { @@ -12978,14 +13119,15 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables, protocol->store_null(); else { + DEBUG_SYNC(thd, "mysql_checksum_table_before_calculate_checksum"); int error= t->file->calculate_checksum(); + DEBUG_SYNC(thd, "mysql_checksum_table_after_calculate_checksum"); if (thd->killed) { /* we've been killed; let handler clean up, and remove the partial current row from the recordset (embedded lib) */ - t->file->ha_rnd_end(); thd->protocol->remove_last_row(); goto err; } diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 71f3aaf95cf..91b36d22e92 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -1474,8 +1474,9 @@ bool Table_triggers_list::prepare_record_accessors(TABLE *table) { int null_bytes= (table->s->fields - table->s->null_fields + 7)/8; - if (!(extra_null_bitmap= (uchar*)alloc_root(&table->mem_root, null_bytes))) + if (!(extra_null_bitmap= (uchar*)alloc_root(&table->mem_root, 2*null_bytes))) return 1; + extra_null_bitmap_init= extra_null_bitmap + null_bytes; if (!(record0_field= (Field **)alloc_root(&table->mem_root, (table->s->fields + 1) * sizeof(Field*)))) @@ -1500,13 +1501,17 @@ bool Table_triggers_list::prepare_record_accessors(TABLE *table) null_ptr++, null_bit= 1; else null_bit*= 2; + if (f->flags & NO_DEFAULT_VALUE_FLAG) + f->set_null(); + else + f->set_notnull(); } else *trg_fld= *fld; } *trg_fld= 0; DBUG_ASSERT(null_ptr <= extra_null_bitmap + null_bytes); - bzero(extra_null_bitmap, null_bytes); + memcpy(extra_null_bitmap_init, extra_null_bitmap, null_bytes); } else { diff --git a/sql/sql_trigger.h b/sql/sql_trigger.h index 5648f8f15ff..941aff031bf 100644 --- a/sql/sql_trigger.h +++ b/sql/sql_trigger.h @@ -168,7 +168,7 @@ class Table_triggers_list: public Sql_alloc BEFORE INSERT/UPDATE triggers. */ Field **record0_field; - uchar *extra_null_bitmap; + uchar *extra_null_bitmap, *extra_null_bitmap_init; /** Copy of TABLE::Field array with field pointers set to TABLE::record[1] buffer instead of TABLE::record[0] (used for OLD values in on UPDATE @@ -232,8 +232,8 @@ public: /* End of character ser context. */ Table_triggers_list(TABLE *table_arg) - :record0_field(0), extra_null_bitmap(0), record1_field(0), - trigger_table(table_arg), + :record0_field(0), extra_null_bitmap(0), extra_null_bitmap_init(0), + record1_field(0), trigger_table(table_arg), m_has_unparseable_trigger(false), count(0) { bzero((char *) triggers, sizeof(triggers)); @@ -308,11 +308,15 @@ public: TABLE_LIST *table_list); Field **nullable_fields() { return record0_field; } - void reset_extra_null_bitmap() + void clear_extra_null_bitmap() { - size_t null_bytes= (trigger_table->s->fields - - trigger_table->s->null_fields + 7)/8; - bzero(extra_null_bitmap, null_bytes); + if (size_t null_bytes= extra_null_bitmap_init - extra_null_bitmap) + bzero(extra_null_bitmap, null_bytes); + } + void default_extra_null_bitmap() + { + if (size_t null_bytes= extra_null_bitmap_init - extra_null_bitmap) + memcpy(extra_null_bitmap, extra_null_bitmap_init, null_bytes); } Trigger *find_trigger(const LEX_CSTRING *name, bool remove_from_list); diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 2c0d2b4bf25..c0f02564e68 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -7943,8 +7943,13 @@ Type_handler_datetime_common::convert_item_for_comparison( const char *msg, Sql_condition **cond_hdl) override { - hit++; - return *level >= Sql_condition::WARN_LEVEL_WARN; + if (sql_errno == ER_TRUNCATED_WRONG_VALUE || + sql_errno == ER_DATETIME_FUNCTION_OVERFLOW) + { + hit++; + return *level >= Sql_condition::WARN_LEVEL_WARN; + } + return false; } } cnt_handler; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 66f6021c1c0..cd33b81a79d 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -538,7 +538,7 @@ int select_unit::delete_record() tables of JOIN - exec_tmp_table_[1 | 2]. */ -void select_unit::cleanup() +void select_unit::reset_for_next_ps_execution() { table->file->extra(HA_EXTRA_RESET_STATE); table->file->ha_delete_all_rows(); @@ -899,11 +899,11 @@ bool select_unit_ext::send_eof() return (MY_TEST(error)); } -void select_union_recursive::cleanup() +void select_union_recursive::reset_for_next_ps_execution() { if (table) { - select_unit::cleanup(); + select_unit::reset_for_next_ps_execution(); free_tmp_table(thd, table); } @@ -2380,8 +2380,7 @@ bool st_select_lex_unit::exec_inner() if (uncacheable || !item || !item->assigned() || describe) { if (!fake_select_lex && !(with_element && with_element->is_recursive)) - union_result->cleanup(); - + union_result->reset_for_next_ps_execution(); for (SELECT_LEX *sl= select_cursor; sl; sl= sl->next_select()) { ha_rows records_at_start= 0; @@ -2777,7 +2776,7 @@ bool st_select_lex_unit::cleanup() { if (union_result) { - ((select_union_recursive *) union_result)->cleanup(); + ((select_union_recursive *) union_result)->reset_for_next_ps_execution(); delete union_result; union_result= 0; } diff --git a/sql/sql_update.cc b/sql/sql_update.cc index ba9d9eaa6f4..822f8548ea2 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -936,9 +936,9 @@ update_begin: goto update_end; } - if ((table->file->ha_table_flags() & HA_CAN_FORCE_BULK_UPDATE) && - !table->prepare_triggers_for_update_stmt_or_event() && - !thd->lex->with_rownum) + if (!table->prepare_triggers_for_update_stmt_or_event() && + !thd->lex->with_rownum && + table->file->ha_table_flags() & HA_CAN_FORCE_BULK_UPDATE) will_batch= !table->file->start_bulk_update(); /* @@ -2502,6 +2502,13 @@ void multi_update::abort_result_set() (!thd->transaction->stmt.modified_non_trans_table && !updated))) return; + /**************************************************************************** + + NOTE: if you change here be aware that almost the same code is in + multi_update::send_eof(). + + ***************************************************************************/ + /* Something already updated so we have to invalidate cache */ if (updated) query_cache_invalidate3(thd, update_tables, 1); @@ -2834,6 +2841,13 @@ bool multi_update::send_eof() killed_status= (local_error == 0) ? NOT_KILLED : thd->killed; THD_STAGE_INFO(thd, stage_end); + /**************************************************************************** + + NOTE: if you change here be aware that almost the same code is in + multi_update::abort_result_set(). + + ***************************************************************************/ + /* We must invalidate the query cache before binlog writing and ha_autocommit_... */ diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 9c892bb7d6c..4e4a77e65e7 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1256,10 +1256,14 @@ static bool update_binlog_space_limit(sys_var *, THD *, { #ifdef HAVE_REPLICATION /* Refresh summary of binlog sizes */ - mysql_bin_log.lock_index(); - binlog_space_limit= internal_binlog_space_limit; - slave_connections_needed_for_purge= + ulonglong loc_binlog_space_limit= internal_binlog_space_limit; + uint loc_slave_connections_needed_for_purge= internal_slave_connections_needed_for_purge; + mysql_mutex_unlock(&LOCK_global_system_variables); + mysql_bin_log.lock_index(); + binlog_space_limit= loc_binlog_space_limit; + slave_connections_needed_for_purge= + loc_slave_connections_needed_for_purge; if (opt_bin_log) { @@ -1269,9 +1273,11 @@ static bool update_binlog_space_limit(sys_var *, THD *, sending_new_binlog_file++; mysql_bin_log.unlock_index(); mysql_bin_log.purge(1); + mysql_mutex_lock(&LOCK_global_system_variables); return 0; } mysql_bin_log.unlock_index(); + mysql_mutex_lock(&LOCK_global_system_variables); #endif return 0; } @@ -1812,7 +1818,10 @@ Sys_max_binlog_stmt_cache_size( static bool fix_max_binlog_size(sys_var *self, THD *thd, enum_var_type type) { - mysql_bin_log.set_max_size(max_binlog_size); + ulong saved= max_binlog_size; + mysql_mutex_unlock(&LOCK_global_system_variables); + mysql_bin_log.set_max_size(saved); + mysql_mutex_lock(&LOCK_global_system_variables); return false; } static Sys_var_on_access_globalexpr->build_clone(thd); + if (!cmp_expr) + return false; + Item::func_processor_rename_table param; + param.old_db= Lex_ident_db(vcol_share->db); + param.old_table= Lex_ident_table(vcol_share->table_name); + param.new_db= Lex_ident_db(share->db); + param.new_table= Lex_ident_table(share->table_name); + cmp_expr->walk(&Item::rename_table_processor, 1, ¶m); + + error= false; + return type_handler() == vcol->type_handler() + && is_stored() == vcol->is_stored() + && expr->eq(cmp_expr, true); +} + class Vcol_expr_context { @@ -4259,6 +4280,24 @@ bool copy_keys_from_share(TABLE *outparam, MEM_ROOT *root) return 0; } +void TABLE::update_keypart_vcol_info() +{ + for (uint k= 0; k < s->keys; k++) + { + KEY &info_k= key_info[k]; + uint parts = (s->use_ext_keys ? info_k.ext_key_parts : + info_k.user_defined_key_parts); + for (uint p= 0; p < parts; p++) + { + KEY_PART_INFO &kp= info_k.key_part[p]; + if (kp.field != field[kp.fieldnr - 1]) + { + kp.field->vcol_info = field[kp.fieldnr - 1]->vcol_info; + } + } + } +} + /* Open a table based on a TABLE_SHARE @@ -4491,20 +4530,7 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, /* Update to use trigger fields */ switch_defaults_to_nullable_trigger_fields(outparam); - for (uint k= 0; k < share->keys; k++) - { - KEY *key_info= &outparam->key_info[k]; - uint parts= (share->use_ext_keys ? key_info->ext_key_parts : - key_info->user_defined_key_parts); - for (uint p=0; p < parts; p++) - { - KEY_PART_INFO *kp= &key_info->key_part[p]; - if (kp->field != outparam->field[kp->fieldnr - 1]) - { - kp->field->vcol_info= outparam->field[kp->fieldnr - 1]->vcol_info; - } - } - } + outparam->update_keypart_vcol_info(); } #ifdef WITH_PARTITION_STORAGE_ENGINE @@ -7376,6 +7402,7 @@ void Field_iterator_natural_join::next() { cur_column_ref= column_ref_it++; DBUG_ASSERT(!cur_column_ref || ! cur_column_ref->table_field || + !cur_column_ref->table_field->field || cur_column_ref->table_ref->table == cur_column_ref->table_field->field->table); } @@ -9648,8 +9675,8 @@ void TABLE::prepare_triggers_for_insert_stmt_or_event() { if (triggers) { - if (triggers->has_triggers(TRG_EVENT_DELETE, - TRG_ACTION_AFTER)) + triggers->clear_extra_null_bitmap(); + if (triggers->has_triggers(TRG_EVENT_DELETE, TRG_ACTION_AFTER)) { /* The table has AFTER DELETE triggers that might access to @@ -9658,8 +9685,7 @@ void TABLE::prepare_triggers_for_insert_stmt_or_event() */ (void) file->extra(HA_EXTRA_DELETE_CANNOT_BATCH); } - if (triggers->has_triggers(TRG_EVENT_UPDATE, - TRG_ACTION_AFTER)) + if (triggers->has_triggers(TRG_EVENT_UPDATE, TRG_ACTION_AFTER)) { /* The table has AFTER UPDATE triggers that might access to subject @@ -9674,17 +9700,19 @@ void TABLE::prepare_triggers_for_insert_stmt_or_event() bool TABLE::prepare_triggers_for_delete_stmt_or_event() { - if (triggers && - triggers->has_triggers(TRG_EVENT_DELETE, - TRG_ACTION_AFTER)) + if (triggers) { - /* - The table has AFTER DELETE triggers that might access to subject table - and therefore might need delete to be done immediately. So we turn-off - the batching. - */ - (void) file->extra(HA_EXTRA_DELETE_CANNOT_BATCH); - return TRUE; + triggers->clear_extra_null_bitmap(); + if (triggers->has_triggers(TRG_EVENT_DELETE, TRG_ACTION_AFTER)) + { + /* + The table has AFTER DELETE triggers that might access to subject table + and therefore might need delete to be done immediately. So we turn-off + the batching. + */ + (void) file->extra(HA_EXTRA_DELETE_CANNOT_BATCH); + return TRUE; + } } return FALSE; } @@ -9692,17 +9720,19 @@ bool TABLE::prepare_triggers_for_delete_stmt_or_event() bool TABLE::prepare_triggers_for_update_stmt_or_event() { - if (triggers && - triggers->has_triggers(TRG_EVENT_UPDATE, - TRG_ACTION_AFTER)) + if (triggers) { - /* - The table has AFTER UPDATE triggers that might access to subject - table and therefore might need update to be done immediately. - So we turn-off the batching. - */ - (void) file->extra(HA_EXTRA_UPDATE_CANNOT_BATCH); - return TRUE; + triggers->clear_extra_null_bitmap(); + if (triggers->has_triggers(TRG_EVENT_UPDATE, TRG_ACTION_AFTER)) + { + /* + The table has AFTER UPDATE triggers that might access to subject + table and therefore might need update to be done immediately. + So we turn-off the batching. + */ + (void) file->extra(HA_EXTRA_UPDATE_CANNOT_BATCH); + return TRUE; + } } return FALSE; } diff --git a/sql/table.h b/sql/table.h index 26eed109411..f5e4e37db8e 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1769,6 +1769,7 @@ public: bool is_filled_at_execution(); bool update_const_key_parts(COND *conds); + void update_keypart_vcol_info(); inline void initialize_opt_range_structures(); diff --git a/sql/transaction.cc b/sql/transaction.cc index 76d2149610c..0dd5e1bebab 100644 --- a/sql/transaction.cc +++ b/sql/transaction.cc @@ -115,11 +115,15 @@ bool trans_begin(THD *thd, uint flags) if (thd->in_multi_stmt_transaction_mode() || (thd->variables.option_bits & OPTION_TABLE_LOCK)) { + bool was_in_trans= thd->server_status & + (SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); thd->variables.option_bits&= ~OPTION_TABLE_LOCK; thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); res= MY_TEST(ha_commit_trans(thd, TRUE)); + if (was_in_trans) + trans_reset_one_shot_chistics(thd); #ifdef WITH_WSREP if (wsrep_thd_is_local(thd)) { diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index 04a20311771..289688c8470 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -22,6 +22,7 @@ #include "wsrep_xid.h" #include "wsrep_thd.h" #include "wsrep_trans_observer.h" +#include "wsrep_schema.h" // wsrep_schema #include "slave.h" // opt_log_slave_updates #include "debug_sync.h" @@ -180,6 +181,10 @@ int wsrep_apply_events(THD* thd, { thd->variables.gtid_seq_no= gtid_ev->seq_no; } + + if (wsrep_gtid_mode) + wsrep_schema->store_gtid_event(thd, gtid_ev); + delete ev; } continue; diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index d077533dfdc..e0d9137e9d5 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1725,6 +1725,42 @@ static void wsrep_keys_free(wsrep_key_arr_t* key_arr) key_arr->keys_len= 0; } +class Unknown_storage_engine_handler : public Internal_error_handler +{ +public: + Unknown_storage_engine_handler() + : m_handled_errors(0), m_unhandled_errors(0) + {} + + bool handle_condition(THD *thd, + uint sql_errno, + const char* sqlstate, + Sql_condition::enum_warning_level *level, + const char* msg, + Sql_condition ** cond_hdl) override + { + *cond_hdl= NULL; + if (sql_errno == ER_UNKNOWN_STORAGE_ENGINE) + { + m_handled_errors++; + } + else if (*level == Sql_condition::WARN_LEVEL_ERROR) + { + m_unhandled_errors++; + } + return FALSE; + } + + bool safely_trapped_errors() + { + return ((m_handled_errors > 0) && (m_unhandled_errors == 0)); + } + +private: + int m_handled_errors; + int m_unhandled_errors; +}; + /*! * @param thd thread * @param tables list of tables @@ -1732,99 +1768,116 @@ static void wsrep_keys_free(wsrep_key_arr_t* key_arr) * @return 0 if parent table append was successful, non-zero otherwise. */ -bool -wsrep_append_fk_parent_table(THD* thd, TABLE_LIST* tables, wsrep::key_array* keys) +bool wsrep_append_fk_parent_table(THD *thd, TABLE_LIST *tables, + wsrep::key_array *keys) { - bool fail= false; - TABLE_LIST *table; - TABLE_LIST *table_last_in_list; + assert(wsrep_thd_is_local(thd)); - for (table= tables; table; table= table->next_local) + bool fail= false; + Open_table_context ot_ctx(thd, MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL); + + for (TABLE_LIST *table= tables; table; table= table->next_local) + { + if (!table->table) { - if (is_temporary_table(table)) + TABLE_LIST *save_next_global= table->next_global; + TABLE_LIST::enum_open_strategy save_open_strategy= table->open_strategy; + table->open_strategy= TABLE_LIST::OPEN_IF_EXISTS; + + Unknown_storage_engine_handler no_storage_engine; + thd->push_internal_handler(&no_storage_engine); + + if (open_table(thd, table, &ot_ctx)) { - WSREP_DEBUG("Temporary table %s.%s already opened query=%s", table->db.str, - table->table_name.str, wsrep_thd_query(thd)); - return false; - } - } - - thd->release_transactional_locks(); - uint counter; - MDL_savepoint mdl_savepoint= thd->mdl_context.mdl_savepoint(); - - for (table_last_in_list= tables;;table_last_in_list= table_last_in_list->next_local) { - if (!table_last_in_list->next_local) { - break; - } - } - - if (open_tables(thd, &tables, &counter, MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL)) - { - WSREP_DEBUG("Unable to open table for FK checks for %s", wsrep_thd_query(thd)); - fail= true; - goto exit; - } - - for (table= tables; table; table= table->next_local) - { - if (!is_temporary_table(table) && table->table) - { - FOREIGN_KEY_INFO *f_key_info; - List f_key_list; - - table->table->file->get_foreign_key_list(thd, &f_key_list); - List_iterator_fast it(f_key_list); - while ((f_key_info=it++)) + if (no_storage_engine.safely_trapped_errors()) { - WSREP_DEBUG("appended fkey %s", f_key_info->referenced_table->str); - keys->push_back(wsrep_prepare_key_for_toi(f_key_info->referenced_db->str, - f_key_info->referenced_table->str, - wsrep::key::shared)); + Diagnostics_area *da= thd->get_stmt_da(); + da->reset_diagnostics_area(); + da->clear_warning_info(thd->query_id); + } + else + { + fail= true; } } + + thd->pop_internal_handler(); + + table->next_global= save_next_global; + table->open_strategy= save_open_strategy; + + if (fail) + { + WSREP_DEBUG("Unable to open table for FK checks for %s", + wsrep_thd_query(thd)); + goto exit; + } } + if (table->table && !is_temporary_table(table)) + { + FOREIGN_KEY_INFO *f_key_info; + List f_key_list; + + table->table->file->get_foreign_key_list(thd, &f_key_list); + List_iterator_fast it(f_key_list); + while ((f_key_info= it++)) + { + WSREP_DEBUG("appended fkey %s", f_key_info->referenced_table->str); + keys->push_back(wsrep_prepare_key_for_toi( + f_key_info->referenced_db->str, f_key_info->referenced_table->str, + wsrep::key::shared)); + } + } + } + exit: - DEBUG_SYNC(thd, "wsrep_append_fk_toi_keys_before_close_tables"); + DEBUG_SYNC(thd, "wsrep_append_fk_toi_keys_before_close_tables"); - /* close the table and release MDL locks */ - close_thread_tables(thd); - thd->mdl_context.rollback_to_savepoint(mdl_savepoint); - bool invalidate_next_global= false; - for (table= tables; table; table= table->next_local) + /* close the table and release MDL locks */ + close_thread_tables(thd); + thd->mdl_context.rollback_to_savepoint(ot_ctx.start_of_statement_svp()); + for (TABLE_LIST *table= tables; table; table= table->next_global) + { + table->table= NULL; + table->mdl_request.ticket= NULL; + } + + /* + Reopen temporary tables if necessary. + DROP TABLE pre-opens temporary tables, but the corresponding + command does not have the CF_PREOPEN_TMP_TABLES flag set. + */ + const bool preopen_tmp_tables= + thd->lex->sql_command == SQLCOM_DROP_TABLE || + (sql_command_flags[thd->lex->sql_command] & CF_PREOPEN_TMP_TABLES); + + if (preopen_tmp_tables && thd->open_temporary_tables(tables)) + { + WSREP_INFO("Unable to reopen temporary tables after FK checks"); + fail= true; + } + + /* + MDEV-32938: Check if DDL operation has been killed before. + + It may be that during collecting foreign keys this operation gets + BF-aborted by another already-running TOI operation because it got MDL + locks on the same table for checking foreign keys. After + `close_thread_tables()` has been called it's safe to assume that no-one can + BF-abort this operation as it's not holding any MDL locks any more. + */ + if (!fail) + { + mysql_mutex_lock(&thd->LOCK_thd_kill); + if (thd->killed) { - table->table= NULL; - table->mdl_request.ticket= NULL; - // We should invalidate `next_global` only for entries that are added - // in this function - if (table == table_last_in_list) { - invalidate_next_global= true; - } - if (invalidate_next_global) { - table->next_global= NULL; - } + fail= true; } + mysql_mutex_unlock(&thd->LOCK_thd_kill); + } - /* - MDEV-32938: Check if DDL operation has been killed before. - - It may be that during collecting foreign keys this operation gets BF-aborted - by another already-running TOI operation because it got MDL locks on the same - table for checking foreign keys. - After `close_thread_tables()` has been called it's safe to assume that no-one - can BF-abort this operation as it's not holding any MDL locks any more. - */ - if (!fail) - { - mysql_mutex_lock(&thd->LOCK_thd_kill); - if (thd->killed) - { - fail= true; - } - mysql_mutex_unlock(&thd->LOCK_thd_kill); - } - return fail; + return fail; } bool wsrep_reload_ssl() @@ -2234,11 +2287,18 @@ int wsrep_to_buf_helper( domain_id= wsrep_gtid_server.domain_id; server_id= wsrep_gtid_server.server_id; } - Gtid_log_event gtid_event(thd, seqno, domain_id, true, - LOG_EVENT_SUPPRESS_USE_F, true, 0); - gtid_event.server_id= server_id; - if (!gtid_event.is_valid()) ret= 0; - ret= writer.write(>id_event); + /* + * Ignore if both thd->variables.gtid_seq_no and + * thd->variables.wsrep_gtid_seq_no are not set. + */ + if (seqno) + { + Gtid_log_event gtid_event(thd, seqno, domain_id, true, + LOG_EVENT_SUPPRESS_USE_F, true, 0); + gtid_event.server_id= server_id; + if (!gtid_event.is_valid()) ret= 0; + ret= writer.write(>id_event); + } } /* It's local DDL so in case of possible gtid seqno (SET gtid_seq_no=X) @@ -2845,8 +2905,11 @@ static int wsrep_TOI_begin(THD *thd, const char *db, const char *table, if (!thd->is_error()) { - my_error(ER_LOCK_DEADLOCK, MYF(0), "WSREP replication failed. Check " - "your wsrep connection state and retry the query."); + push_warning_printf(thd, Sql_state_errno_level::WARN_LEVEL_ERROR, + ER_LOCK_DEADLOCK, + "WSREP replication failed. Check " + "your wsrep connection state and retry the query."); + my_error(ER_LOCK_DEADLOCK, MYF(0)); } } rc= -1; @@ -3352,8 +3415,6 @@ static inline bool is_committing_connection(THD *thd) static my_bool have_client_connections(THD *thd, void*) { - DBUG_PRINT("quit",("Informing thread %lld that it's time to die", - (longlong) thd->thread_id)); if (is_client_connection(thd)) { if (thd->killed == KILL_CONNECTION || @@ -3405,13 +3466,18 @@ static my_bool kill_all_threads(THD *thd, THD *caller_thd) /* We skip slave threads & scheduler on this first loop through. */ if (is_client_connection(thd) && thd != caller_thd) { - if (thd->get_stmt_da()->is_eof()) + /* the connection executing SHUTDOWN, should do clean exit, + not aborting here */ + if (thd->get_command() == COM_SHUTDOWN) { + WSREP_DEBUG("leaving SHUTDOWN executing connection alive, thread: %lld", + (longlong) thd->thread_id); return 0; } - + /* replaying connection is killed by signal */ if (is_replaying_connection(thd)) { + WSREP_DEBUG("closing connection is replaying %lld", (longlong) thd->thread_id); thd->set_killed(KILL_CONNECTION_HARD); return 0; } @@ -3420,7 +3486,7 @@ static my_bool kill_all_threads(THD *thd, THD *caller_thd) { /* replicated transactions must be skipped */ WSREP_DEBUG("closing connection %lld", (longlong) thd->thread_id); - /* instead of wsrep_close_thread() we do now soft kill by THD::awake */ + /* instead of wsrep_close_thread() we do now hard kill by THD::awake */ thd->awake(KILL_CONNECTION_HARD); return 0; } @@ -3461,8 +3527,10 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD* except_caller_thd) */ server_threads.iterate(kill_remaining_threads, except_caller_thd); - DBUG_PRINT("quit", ("Waiting for threads to die (count=%u)", THD_count::value())); - WSREP_DEBUG("waiting for client connections to close: %u", THD_count::value()); + DBUG_PRINT("quit", ("Waiting for threads to die (count=%u)", + THD_count::value())); + WSREP_DEBUG("waiting for client connections to close: %u", + THD_count::value()); while (wait_to_end && server_threads.iterate(have_client_connections)) { @@ -4018,3 +4086,15 @@ void wsrep_commit_empty(THD* thd, bool all) } DBUG_VOID_RETURN; } + +bool wsrep_table_list_has_non_temp_tables(THD *thd, TABLE_LIST *tables) +{ + for (TABLE_LIST *table= tables; table; table= table->next_global) + { + if (!is_temporary_table(table)) + { + return true; + } + } + return false; +} diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 183dc65b007..7e7398996bf 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -593,6 +593,13 @@ wsrep::key wsrep_prepare_key_for_toi(const char* db, const char* table, void wsrep_wait_ready(THD *thd); void wsrep_ready_set(bool ready_value); + +/** + * Returns true if the given list of tables contains at least one + * non-temporary table. + */ +bool wsrep_table_list_has_non_temp_tables(THD *thd, TABLE_LIST *tables); + #else /* !WITH_WSREP */ /* These macros are needed to compile MariaDB without WSREP support diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index 13780ede0e5..f8acd876a5f 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2015-2023 Codership Oy +/* Copyright (C) 2015-2025 Codership Oy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,6 +31,8 @@ #include "wsrep_storage_service.h" #include "wsrep_thd.h" #include "wsrep_server_state.h" +#include "log_event.h" +#include "sql_class.h" #include #include @@ -1652,6 +1654,64 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd) DBUG_RETURN(ret); } +int Wsrep_schema::store_gtid_event(THD* thd, + const Gtid_log_event *gtid) +{ + DBUG_ENTER("Wsrep_schema::store_gtid_event"); + int error=0; + void *hton= NULL; + const bool in_transaction= (gtid->flags2 & Gtid_log_event::FL_TRANSACTIONAL); + const bool in_ddl= (gtid->flags2 & Gtid_log_event::FL_DDL); + + DBUG_PRINT("info", ("thd: %p, in_transaction: %d, in_ddl: %d " + "in_active_multi_stmt_transaction: %d", + thd, in_transaction, in_ddl, + thd->in_active_multi_stmt_transaction())); + + Wsrep_schema_impl::wsrep_ignore_table ignore_table(thd); + Wsrep_schema_impl::binlog_off binlog_off(thd); + Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd); + + rpl_group_info *rgi= thd->wsrep_rgi; + const uint64 sub_id= rpl_global_gtid_slave_state->next_sub_id(gtid->domain_id); + rpl_gtid current_gtid; + current_gtid.domain_id= gtid->domain_id; + current_gtid.server_id= gtid->server_id; + current_gtid.seq_no= gtid->seq_no; + rgi->gtid_pending= false; + + DBUG_ASSERT(!in_transaction || thd->in_active_multi_stmt_transaction()); + + if ((error= rpl_global_gtid_slave_state->record_gtid(thd, ¤t_gtid, + sub_id, + in_transaction, false, &hton))) + goto out; + + rpl_global_gtid_slave_state->update_state_hash(sub_id, ¤t_gtid, hton, rgi); + + if (in_ddl) + { + // Commit transaction if this GTID is part of DDL-clause because + // DDL causes implicit commit assuming there is no multi statement + // transaction ongoing. + if((error= trans_commit_stmt(thd))) + goto out; + + (void)trans_commit(thd); + } + +out: + if (error) + { + WSREP_DEBUG("Wsrep_schema::store_gtid_event %llu-%llu-%llu failed error=%s (%d).", + gtid->domain_id, gtid->server_id, gtid->seq_no, strerror(error), error); + (void)trans_rollback_stmt(thd); + (void)trans_rollback(thd); + } + + DBUG_RETURN(error); +} + void Wsrep_schema::clear_allowlist() { THD* thd= new THD(next_thread_id()); diff --git a/sql/wsrep_schema.h b/sql/wsrep_schema.h index c9004d076bd..0a2e37ba1b3 100644 --- a/sql/wsrep_schema.h +++ b/sql/wsrep_schema.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2015-2023 Codership Oy +/* Copyright (C) 2015-2024 Codership Oy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,7 +22,6 @@ #include "mysqld.h" #include "wsrep_mysqld.h" - /* Forward decls */ @@ -32,6 +31,7 @@ struct TABLE; struct TABLE_LIST; struct st_mysql_lex_string; typedef struct st_mysql_lex_string LEX_STRING; +class Gtid_log_event; /** Name of the table in `wsrep_schema_str` used for storing streaming replication data. In an InnoDB full format, e.g. "database/tablename". */ @@ -133,6 +133,15 @@ class Wsrep_schema */ int recover_sr_transactions(THD* orig_thd); + /** + Store GTID-event to mysql.gtid_slave_pos table. + + @param thd The THD object of the calling thread. + @param gtid GTID event from binlog. + + @return Zero on success, non-zero on failure. + */ + int store_gtid_event(THD* thd, const Gtid_log_event *gtid); /** Delete all rows on bootstrap from `wsrep_allowlist` variable diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 2ceb298780a..b01e26c852d 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -496,7 +496,7 @@ void wsrep_backup_kill_for_commit(THD *thd) void wsrep_restore_kill_after_commit(THD *thd) { - DBUG_ASSERT(WSREP(thd)); + DBUG_ASSERT(wsrep_is_active(thd)); mysql_mutex_assert_owner(&thd->LOCK_thd_kill); thd->killed= thd->wsrep_abort_by_kill; my_free(thd->killed_err); diff --git a/storage/columnstore/CMakeLists.txt b/storage/columnstore/CMakeLists.txt index 93065847c5c..cc4780d1cef 100644 --- a/storage/columnstore/CMakeLists.txt +++ b/storage/columnstore/CMakeLists.txt @@ -47,6 +47,7 @@ SET_PROPERTY(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "${dirs}") IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + MY_CHECK_AND_SET_COMPILER_FLAG("-fno-lto") SET(PCRE_INCLUDES "${PCRE_INCLUDE_DIRS}") add_subdirectory(columnstore) diff --git a/storage/columnstore/columnstore b/storage/columnstore/columnstore index 0fd5a7919c0..9763b126517 160000 --- a/storage/columnstore/columnstore +++ b/storage/columnstore/columnstore @@ -1 +1 @@ -Subproject commit 0fd5a7919c0dc0cefb6cf1ec3caf36cc09a81d98 +Subproject commit 9763b126517c8efb716e767fd5ba4eb2b5b405fc diff --git a/storage/connect/mysql-test/connect/r/mysql.result b/storage/connect/mysql-test/connect/r/mysql.result index f09c7434441..b3058469deb 100644 --- a/storage/connect/mysql-test/connect/r/mysql.result +++ b/storage/connect/mysql-test/connect/r/mysql.result @@ -231,7 +231,7 @@ a # Start of mysqldump ------ /*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; +/*!40101 SET character_set_client = utf8mb4 */; CREATE TABLE `t2` ( `a` int(11) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci CONNECTION='mysql://root@localhost:PORT/test/t1' `TABLE_TYPE`='MYSQL'; diff --git a/storage/heap/ha_heap.cc b/storage/heap/ha_heap.cc index 193b2ca6ded..e376d8c518c 100644 --- a/storage/heap/ha_heap.cc +++ b/storage/heap/ha_heap.cc @@ -140,8 +140,6 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked) } ref_length= sizeof(HEAP_PTR); - /* Initialize variables for the opened table */ - set_keys_for_scanning(); /* We cannot run update_key_stats() here because we do not have a lock on the table. The 'records' count might just be changed @@ -182,22 +180,24 @@ handler *ha_heap::clone(const char *name, MEM_ROOT *mem_root) /* - Compute which keys to use for scanning + Return set of keys usable for scanning SYNOPSIS - set_keys_for_scanning() - no parameter + keys_to_use_for_scanning() + (no parameters) DESCRIPTION - Set the bitmap btree_keys, which is used when the upper layers ask - which keys to use for scanning. For each btree index the - corresponding bit is set. + This function populates the bitmap `btree_keys`, where each bit represents + a key that can be used for scanning the table. The bitmap is dynamically + updated on every call, ensuring it reflects the current state of the + table's keys. Caching is avoided because the set of usable keys for + MEMORY tables may change during optimization or execution. RETURN - void + Pointer to the updated bitmap of keys (`btree_keys`) */ -void ha_heap::set_keys_for_scanning(void) +const key_map *ha_heap::keys_to_use_for_scanning() { btree_keys.clear_all(); for (uint i= 0 ; i < table->s->keys ; i++) @@ -205,9 +205,9 @@ void ha_heap::set_keys_for_scanning(void) if (table->key_info[i].algorithm == HA_KEY_ALG_BTREE) btree_keys.set_bit(i); } + return &btree_keys; } - int ha_heap::can_continue_handler_scan() { int error= 0; @@ -511,8 +511,7 @@ int ha_heap::disable_indexes(key_map map, bool persist) if (!persist) { DBUG_ASSERT(map.is_clear_all()); - if (!(error= heap_disable_indexes(file))) - set_keys_for_scanning(); + error= heap_disable_indexes(file); } else { @@ -530,8 +529,7 @@ int ha_heap::disable_indexes(key_map map, bool persist) enable_indexes() DESCRIPTION - Enable indexes and set keys to use for scanning. - The indexes might have been disabled by disable_index() before. + Enable indexes taht might have been disabled by disable_index() before. The function works only if both data and indexes are empty, since the heap storage engine cannot repair the indexes. To be sure, call handler::delete_all_rows() before. @@ -551,8 +549,7 @@ int ha_heap::enable_indexes(key_map map, bool persist) if (!persist) { DBUG_ASSERT(map.is_prefix(table->s->keys)); - if (!(error= heap_enable_indexes(file))) - set_keys_for_scanning(); + error= heap_enable_indexes(file); } else { diff --git a/storage/heap/ha_heap.h b/storage/heap/ha_heap.h index df201eb8f53..51bdb2d2e1a 100644 --- a/storage/heap/ha_heap.h +++ b/storage/heap/ha_heap.h @@ -49,7 +49,7 @@ public: HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER | HA_READ_RANGE : HA_ONLY_WHOLE_INDEX | HA_KEY_SCAN_NOT_ROR); } - const key_map *keys_to_use_for_scanning() override { return &btree_keys; } + const key_map *keys_to_use_for_scanning() override; uint max_supported_keys() const override { return MAX_KEY; } uint max_supported_key_part_length() const override { return MAX_KEY_LENGTH; } IO_AND_CPU_COST scan_time() override; @@ -111,5 +111,4 @@ public: int find_unique_row(uchar *record, uint unique_idx) override; private: void update_key_stats(); - void set_keys_for_scanning(void); }; diff --git a/storage/heap/hp_rnext.c b/storage/heap/hp_rnext.c index f227ce4d274..ac21ed83da2 100644 --- a/storage/heap/hp_rnext.c +++ b/storage/heap/hp_rnext.c @@ -46,7 +46,7 @@ int heap_rnext(HP_INFO *info, uchar *record) &info->last_pos, offsetof(TREE_ELEMENT, left)); } } - else if (info->last_pos) + else if (info->last_pos && info->key_version == info->s->key_version) { /* We enter this branch for non-DELETE queries after heap_rkey() @@ -72,6 +72,7 @@ int heap_rnext(HP_INFO *info, uchar *record) */ pos= tree_search_edge(&keyinfo->rb_tree, info->parents, &info->last_pos, offsetof(TREE_ELEMENT, left)); + info->key_version= info->s->key_version; } else { @@ -87,6 +88,7 @@ int heap_rnext(HP_INFO *info, uchar *record) info->last_find_flag= HA_READ_KEY_OR_NEXT; pos = tree_search_key(&keyinfo->rb_tree, info->lastkey, info->parents, &info->last_pos, info->last_find_flag, &custom_arg); + info->key_version= info->s->key_version; } if (pos) { diff --git a/storage/heap/hp_rprev.c b/storage/heap/hp_rprev.c index 1d9420ba8b6..cc81d179570 100644 --- a/storage/heap/hp_rprev.c +++ b/storage/heap/hp_rprev.c @@ -46,7 +46,7 @@ int heap_rprev(HP_INFO *info, uchar *record) &info->last_pos, offsetof(TREE_ELEMENT, right)); } } - else if (info->last_pos) + else if (info->last_pos && info->key_version == info->s->key_version) pos = tree_search_next(&keyinfo->rb_tree, &info->last_pos, offsetof(TREE_ELEMENT, right), offsetof(TREE_ELEMENT, left)); @@ -58,6 +58,7 @@ int heap_rprev(HP_INFO *info, uchar *record) info->last_find_flag= HA_READ_KEY_OR_PREV; pos = tree_search_key(&keyinfo->rb_tree, info->lastkey, info->parents, &info->last_pos, info->last_find_flag, &custom_arg); + info->key_version= info->s->key_version; } if (pos) { diff --git a/storage/heap/hp_update.c b/storage/heap/hp_update.c index da83a9c76a8..ad56ca979de 100644 --- a/storage/heap/hp_update.c +++ b/storage/heap/hp_update.c @@ -21,7 +21,8 @@ int heap_update(HP_INFO *info, const uchar *old, const uchar *heap_new) { HP_KEYDEF *keydef, *end, *p_lastinx; - uchar *pos; + uchar *pos, *recovery_ptr; + struct st_hp_hash_info *recovery_hash_ptr; my_bool auto_key_changed= 0, key_changed= 0; HP_SHARE *share= info->s; DBUG_ENTER("heap_update"); @@ -34,6 +35,10 @@ int heap_update(HP_INFO *info, const uchar *old, const uchar *heap_new) if (--(share->records) < share->blength >> 1) share->blength>>= 1; share->changed=1; + // Save the cursor position to recover if insert fails. + recovery_ptr= info->current_ptr; + recovery_hash_ptr= info->current_hash_ptr; + p_lastinx= share->keydef + info->lastinx; for (keydef= share->keydef, end= keydef + share->keys; keydef < end; keydef++) { @@ -84,6 +89,8 @@ int heap_update(HP_INFO *info, const uchar *old, const uchar *heap_new) } keydef--; } + info->current_ptr= recovery_ptr; + info->current_hash_ptr= recovery_hash_ptr; } if (++(share->records) == share->blength) share->blength+= share->blength; diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 5552e53f115..5db9417cc38 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -49,7 +49,7 @@ IF(UNIX) LINK_LIBRARIES(numa) ENDIF() IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - IF(CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch|AARCH|p(ower)?pc|x86_|amd)64") + IF(CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch|AARCH|p(ower)?pc|x86_|amd|loongarch|riscv)64") OPTION(WITH_INNODB_PMEM "Support memory-mapped InnoDB redo log" ON) ELSE() # Disable by default on ISA that are not covered by our CI OPTION(WITH_INNODB_PMEM "Support memory-mapped InnoDB redo log" OFF) diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index 3463ac1c068..ef62fa93c8b 100644 --- a/storage/innobase/btr/btr0sea.cc +++ b/storage/innobase/btr/btr0sea.cc @@ -932,7 +932,7 @@ btr_search_failure(btr_search_t* info, btr_cur_t* cursor) } /** Clear the adaptive hash index on all pages in the buffer pool. */ -inline void buf_pool_t::clear_hash_index() +inline void buf_pool_t::clear_hash_index() noexcept { ut_ad(!resizing); ut_ad(!btr_search_enabled); @@ -984,7 +984,7 @@ inline void buf_pool_t::clear_hash_index() This function does not return if the block is not identified. @param ptr pointer to within a page frame @return pointer to block, never NULL */ -inline buf_block_t* buf_pool_t::block_from_ahi(const byte *ptr) const +inline buf_block_t* buf_pool_t::block_from_ahi(const byte *ptr) const noexcept { chunk_t::map *chunk_map = chunk_t::map_ref; ut_ad(chunk_t::map_ref == chunk_t::map_reg); diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 70614750684..7651107bf0f 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -277,7 +277,7 @@ the read requests for the whole area. #ifndef UNIV_INNOCHECKSUM # ifdef SUX_LOCK_GENERIC -void page_hash_latch::read_lock_wait() +void page_hash_latch::read_lock_wait() noexcept { /* First, try busy spinning for a while. */ for (auto spin= srv_n_spin_wait_rounds; spin--; ) @@ -292,7 +292,7 @@ void page_hash_latch::read_lock_wait() while (!read_trylock()); } -void page_hash_latch::write_lock_wait() +void page_hash_latch::write_lock_wait() noexcept { write_lock_wait_start(); @@ -486,7 +486,7 @@ bool buf_page_is_checksum_valid_crc32( const byte* read_buf, ulint checksum_field1, - ulint checksum_field2) + ulint checksum_field2) noexcept { const uint32_t crc32 = buf_calc_page_crc32(read_buf); @@ -554,7 +554,7 @@ static bool buf_page_check_lsn(bool check_lsn, const byte *read_buf) /** Check if a buffer is all zeroes. @param[in] buf data to check @return whether the buffer is all zeroes */ -bool buf_is_zeroes(span buf) +bool buf_is_zeroes(span buf) noexcept { ut_ad(buf.size() <= UNIV_PAGE_SIZE_MAX); return memcmp(buf.data(), field_ref_zero, buf.size()) == 0; @@ -566,7 +566,7 @@ bool buf_is_zeroes(span buf) @param fsp_flags contents of FIL_SPACE_FLAGS @return whether the page is corrupted */ buf_page_is_corrupted_reason -buf_page_is_corrupted(bool check_lsn, const byte *read_buf, uint32_t fsp_flags) +buf_page_is_corrupted(bool check_lsn, const byte *read_buf, uint32_t fsp_flags) noexcept { if (fil_space_t::full_crc32(fsp_flags)) { bool compressed = false, corrupted = false; @@ -1014,7 +1014,7 @@ static inline byte hex_to_ascii(byte hex_digit) @param[in] read_buf database page @param[in] zip_size compressed page size, or 0 */ ATTRIBUTE_COLD -void buf_page_print(const byte *read_buf, ulint zip_size) +void buf_page_print(const byte *read_buf, ulint zip_size) noexcept { #ifndef UNIV_DEBUG const size_t size = zip_size ? zip_size : srv_page_size; @@ -1073,7 +1073,7 @@ buf_block_init(buf_block_t* block, byte* frame) /** Allocate a chunk of buffer frames. @param bytes requested size @return whether the allocation succeeded */ -inline bool buf_pool_t::chunk_t::create(size_t bytes) +inline bool buf_pool_t::chunk_t::create(size_t bytes) noexcept { DBUG_EXECUTE_IF("ib_buf_chunk_init_fails", return false;); /* Round down to a multiple of page size, although it already should be. */ @@ -1159,7 +1159,7 @@ inline bool buf_pool_t::chunk_t::create(size_t bytes) /** Check that all file pages in the buffer chunk are in a replaceable state. @return address of a non-free block @retval nullptr if all freed */ -inline const buf_block_t *buf_pool_t::chunk_t::not_freed() const +inline const buf_block_t *buf_pool_t::chunk_t::not_freed() const noexcept { buf_block_t *block= blocks; for (auto i= size; i--; block++) @@ -1199,7 +1199,7 @@ inline const buf_block_t *buf_pool_t::chunk_t::not_freed() const /** Create the hash table. @param n the lower bound of n_cells */ -void buf_pool_t::page_hash_table::create(ulint n) +void buf_pool_t::page_hash_table::create(ulint n) noexcept { n_cells= ut_find_prime(n); const size_t size= MY_ALIGN(pad(n_cells) * sizeof *array, @@ -1337,7 +1337,7 @@ bool buf_pool_t::create() } /** Clean up after successful create() */ -void buf_pool_t::close() +void buf_pool_t::close() noexcept { ut_ad(this == &buf_pool); if (!is_initialised()) @@ -1397,7 +1397,7 @@ void buf_pool_t::close() /** Try to reallocate a control block. @param block control block to reallocate @return whether the reallocation succeeded */ -inline bool buf_pool_t::realloc(buf_block_t *block) +inline bool buf_pool_t::realloc(buf_block_t *block) noexcept { buf_block_t* new_block; @@ -1513,7 +1513,7 @@ inline bool buf_pool_t::realloc(buf_block_t *block) return(true); /* free_list was enough */ } -void buf_pool_t::io_buf_t::create(ulint n_slots) +void buf_pool_t::io_buf_t::create(ulint n_slots) noexcept { this->n_slots= n_slots; slots= static_cast @@ -1521,7 +1521,7 @@ void buf_pool_t::io_buf_t::create(ulint n_slots) memset((void*) slots, 0, n_slots * sizeof *slots); } -void buf_pool_t::io_buf_t::close() +void buf_pool_t::io_buf_t::close() noexcept { for (buf_tmp_buffer_t *s= slots, *e= slots + n_slots; s != e; s++) { @@ -1533,7 +1533,7 @@ void buf_pool_t::io_buf_t::close() n_slots= 0; } -buf_tmp_buffer_t *buf_pool_t::io_buf_t::reserve(bool wait_for_reads) +buf_tmp_buffer_t *buf_pool_t::io_buf_t::reserve(bool wait_for_reads) noexcept { for (;;) { @@ -1578,7 +1578,7 @@ buf_resize_status( /** Withdraw blocks from the buffer pool until meeting withdraw_target. @return whether retry is needed */ -inline bool buf_pool_t::withdraw_blocks() +inline bool buf_pool_t::withdraw_blocks() noexcept { buf_block_t* block; ulint loop_count = 0; @@ -1707,7 +1707,7 @@ realloc_frame: -inline void buf_pool_t::page_hash_table::write_lock_all() +inline void buf_pool_t::page_hash_table::write_lock_all() noexcept { for (auto n= pad(n_cells) & ~ELEMENTS_PER_LATCH;; n-= ELEMENTS_PER_LATCH + 1) { @@ -1718,7 +1718,7 @@ inline void buf_pool_t::page_hash_table::write_lock_all() } -inline void buf_pool_t::page_hash_table::write_unlock_all() +inline void buf_pool_t::page_hash_table::write_unlock_all() noexcept { for (auto n= pad(n_cells) & ~ELEMENTS_PER_LATCH;; n-= ELEMENTS_PER_LATCH + 1) { @@ -2367,7 +2367,7 @@ static void buf_inc_get(ha_handler_stats *stats) } TRANSACTIONAL_TARGET -buf_page_t *buf_page_get_zip(const page_id_t page_id) +buf_page_t *buf_page_get_zip(const page_id_t page_id) noexcept { ha_handler_stats *const stats= mariadb_stats; buf_inc_get(stats); @@ -2476,14 +2476,7 @@ buf_block_init_low( #endif /* BTR_CUR_HASH_ADAPT */ } -/********************************************************************//** -Decompress a block. -@return true if successful */ -bool -buf_zip_decompress( -/*===============*/ - buf_block_t* block, /*!< in/out: block */ - ibool check) /*!< in: TRUE=verify the page checksum */ +bool buf_zip_decompress(buf_block_t *block, bool check) noexcept { const byte* frame = block->page.zip.data; ulint size = page_zip_get_size(&block->page.zip); @@ -2562,6 +2555,7 @@ err_exit: ATTRIBUTE_COLD buf_block_t *buf_pool_t::unzip(buf_page_t *b, buf_pool_t::hash_chain &chain) + noexcept { buf_block_t *block= buf_LRU_get_free_block(have_no_mutex); buf_block_init_low(block); @@ -2651,7 +2645,7 @@ buf_block_t *buf_pool_t::unzip(buf_page_t *b, buf_pool_t::hash_chain &chain) buf_block_t *buf_pool_t::page_fix(const page_id_t id, dberr_t *err, - buf_pool_t::page_fix_conflicts c) + buf_pool_t::page_fix_conflicts c) noexcept { ha_handler_stats *const stats= mariadb_stats; buf_inc_get(stats); @@ -2768,7 +2762,7 @@ buf_page_get_gen( buf_block_t* guess, ulint mode, mtr_t* mtr, - dberr_t* err) + dberr_t* err) noexcept { ulint retries = 0; @@ -3038,7 +3032,7 @@ wait_for_unzip: } TRANSACTIONAL_TARGET -buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) +buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) noexcept { buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(id.fold()); transactional_shared_lock_guard g @@ -3056,7 +3050,8 @@ buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) buf_block_t *buf_page_optimistic_get(buf_block_t *block, rw_lock_type_t rw_latch, - uint64_t modify_clock, mtr_t *mtr) + uint64_t modify_clock, + mtr_t *mtr) noexcept { ut_ad(mtr->is_active()); ut_ad(rw_latch == RW_S_LATCH || rw_latch == RW_X_LATCH); @@ -3121,7 +3116,7 @@ Suitable for using when holding the lock_sys latches (as it avoids deadlock). @return the block @retval nullptr if an S-latch cannot be granted immediately */ TRANSACTIONAL_TARGET -buf_block_t *buf_page_try_get(const page_id_t page_id, mtr_t *mtr) +buf_block_t *buf_page_try_get(const page_id_t page_id, mtr_t *mtr) noexcept { ut_ad(mtr); ut_ad(mtr->is_active()); @@ -3156,7 +3151,7 @@ buf_block_t *buf_page_try_get(const page_id_t page_id, mtr_t *mtr) @param zip_size ROW_FORMAT=COMPRESSED page size, or 0 @param fix initial buf_fix_count() */ void buf_block_t::initialise(const page_id_t page_id, ulint zip_size, - uint32_t fix) + uint32_t fix) noexcept { ut_ad(!page.in_file()); buf_block_init_low(this); @@ -3168,6 +3163,7 @@ void buf_block_t::initialise(const page_id_t page_id, ulint zip_size, TRANSACTIONAL_TARGET static buf_block_t *buf_page_create_low(page_id_t page_id, ulint zip_size, mtr_t *mtr, buf_block_t *free_block) + noexcept { ut_ad(mtr->is_active()); ut_ad(page_id.space() != 0 || !zip_size); @@ -3367,7 +3363,7 @@ FILE_PAGE (the other is buf_page_get_gen). @return pointer to the block, page bufferfixed */ buf_block_t* buf_page_create(fil_space_t *space, uint32_t offset, - ulint zip_size, mtr_t *mtr, buf_block_t *free_block) + ulint zip_size, mtr_t *mtr, buf_block_t *free_block) noexcept { space->free_page(offset, false); return buf_page_create_low({space->id, offset}, zip_size, mtr, free_block); @@ -3381,7 +3377,8 @@ deferred tablespace @param free_block pre-allocated buffer block @return pointer to the block, page bufferfixed */ buf_block_t* buf_page_create_deferred(uint32_t space_id, ulint zip_size, - mtr_t *mtr, buf_block_t *free_block) + mtr_t *mtr, + buf_block_t *free_block) noexcept { return buf_page_create_low({space_id, 0}, zip_size, mtr, free_block); } @@ -3390,7 +3387,8 @@ buf_block_t* buf_page_create_deferred(uint32_t space_id, ulint zip_size, counter value in MONITOR_MODULE_BUF_PAGE. @param bpage buffer page whose read or write was completed @param read true=read, false=write */ -ATTRIBUTE_COLD void buf_page_monitor(const buf_page_t &bpage, bool read) +ATTRIBUTE_COLD +void buf_page_monitor(const buf_page_t &bpage, bool read) noexcept { monitor_id_t counter; @@ -3458,7 +3456,7 @@ ATTRIBUTE_COLD void buf_page_monitor(const buf_page_t &bpage, bool read) @param[in] is_compressed compressed page @return true if page is corrupted or false if it isn't */ static bool buf_page_full_crc32_is_corrupted(ulint space_id, const byte* d, - bool is_compressed) + bool is_compressed) noexcept { if (space_id != mach_read_from_4(d + FIL_PAGE_SPACE_ID)) return true; @@ -3548,7 +3546,7 @@ static dberr_t buf_page_check_corrupt(buf_page_t *bpage, @return whether the operation succeeded @retval DB_PAGE_CORRUPTED if the checksum or the page ID is incorrect @retval DB_DECRYPTION_FAILED if the page cannot be decrypted */ -dberr_t buf_page_t::read_complete(const fil_node_t &node) +dberr_t buf_page_t::read_complete(const fil_node_t &node) noexcept { const page_id_t expected_id{id()}; ut_ad(is_read_fixed()); @@ -3693,7 +3691,7 @@ success_page: /** Check that all blocks are in a replaceable state. @return address of a non-free block @retval nullptr if all freed */ -void buf_pool_t::assert_all_freed() +void buf_pool_t::assert_all_freed() noexcept { mysql_mutex_lock(&mutex); const chunk_t *chunk= chunks; @@ -3705,7 +3703,7 @@ void buf_pool_t::assert_all_freed() #endif /* UNIV_DEBUG */ /** Refresh the statistics used to print per-second averages. */ -void buf_refresh_io_stats() +void buf_refresh_io_stats() noexcept { buf_pool.last_printout_time = time(NULL); buf_pool.old_stat = buf_pool.stat; @@ -3713,7 +3711,7 @@ void buf_refresh_io_stats() /** Invalidate all pages in the buffer pool. All pages must be in a replaceable state (not modified or latched). */ -void buf_pool_invalidate() +void buf_pool_invalidate() noexcept { /* It is possible that a write batch that has been posted earlier is still not complete. For buffer pool invalidation to @@ -3740,7 +3738,7 @@ void buf_pool_invalidate() #ifdef UNIV_DEBUG /** Validate the buffer pool. */ -void buf_pool_t::validate() +void buf_pool_t::validate() noexcept { ulint n_lru = 0; ulint n_flushing = 0; @@ -3835,7 +3833,7 @@ void buf_pool_t::validate() #if defined UNIV_DEBUG_PRINT || defined UNIV_DEBUG /** Write information of the buf_pool to the error log. */ -void buf_pool_t::print() +void buf_pool_t::print() noexcept { index_id_t* index_ids; ulint* counts; @@ -3939,7 +3937,7 @@ void buf_pool_t::print() #ifdef UNIV_DEBUG /** @return the number of latched pages in the buffer pool */ -ulint buf_get_latched_pages_number() +ulint buf_get_latched_pages_number() noexcept { ulint fixed_pages_number= 0; @@ -3958,7 +3956,7 @@ ulint buf_get_latched_pages_number() /** Collect buffer pool metadata. @param[out] pool_info buffer pool metadata */ -void buf_stats_get_pool_info(buf_pool_info_t *pool_info) +void buf_stats_get_pool_info(buf_pool_info_t *pool_info) noexcept { time_t current_time; double time_elapsed; @@ -4191,7 +4189,7 @@ This function should be called only if tablespace contains crypt data metadata. @param page page frame @param fsp_flags contents of FSP_SPACE_FLAGS @return whether the page is encrypted and valid */ -bool buf_page_verify_crypt_checksum(const byte *page, uint32_t fsp_flags) +bool buf_page_verify_crypt_checksum(const byte *page, uint32_t fsp_flags) noexcept { if (!fil_space_t::full_crc32(fsp_flags)) { return fil_space_verify_crypt_checksum( diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index e9021afd644..51ccadd2612 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -41,13 +41,13 @@ using st_::span; buf_dblwr_t buf_dblwr; /** @return the TRX_SYS page */ -inline buf_block_t *buf_dblwr_trx_sys_get(mtr_t *mtr) +inline buf_block_t *buf_dblwr_trx_sys_get(mtr_t *mtr) noexcept { return buf_page_get(page_id_t(TRX_SYS_SPACE, TRX_SYS_PAGE_NO), 0, RW_X_LATCH, mtr); } -void buf_dblwr_t::init() +void buf_dblwr_t::init() noexcept { if (!active_slot) { @@ -60,7 +60,7 @@ void buf_dblwr_t::init() /** Initialise the persistent storage of the doublewrite buffer. @param header doublewrite page header in the TRX_SYS page */ -inline void buf_dblwr_t::init(const byte *header) +inline void buf_dblwr_t::init(const byte *header) noexcept { ut_ad(!active_slot->first_free); ut_ad(!active_slot->reserved); @@ -82,7 +82,7 @@ inline void buf_dblwr_t::init(const byte *header) /** Create or restore the doublewrite buffer in the TRX_SYS page. @return whether the operation succeeded */ -bool buf_dblwr_t::create() +bool buf_dblwr_t::create() noexcept { if (is_created()) return true; @@ -114,9 +114,9 @@ start_again: if (UT_LIST_GET_FIRST(fil_system.sys_space->chain)->size < 3 * size) { - ib::error() << "Cannot create doublewrite buffer: " - "the first file in innodb_data_file_path must be at least " - << (3 * (size >> (20U - srv_page_size_shift))) << "M."; + sql_print_error("InnoDB: Cannot create doublewrite buffer: " + "the first file in innodb_data_file_path must be at least " + "%zuM.", 3 * (size >> (20U - srv_page_size_shift))); fail: mtr.commit(); return false; @@ -128,11 +128,13 @@ fail: &mtr, &err, false, trx_sys_block); if (!b) { - ib::error() << "Cannot create doublewrite buffer: " << err; + sql_print_error("InnoDB: Cannot create doublewrite buffer: %s", + ut_strerr(err)); goto fail; } - ib::info() << "Doublewrite buffer not found: creating new"; + sql_print_information("InnoDB: Doublewrite buffer not found:" + " creating new"); /* FIXME: After this point, the doublewrite buffer creation is not atomic. The doublewrite buffer should not exist in @@ -151,9 +153,9 @@ fail: false, &mtr, &mtr, &err); if (!new_block) { - ib::error() << "Cannot create doublewrite buffer: " + sql_print_error("InnoDB: Cannot create doublewrite buffer: " " you must increase your tablespace size." - " Cannot continue operation."; + " Cannot continue operation."); /* This may essentially corrupt the doublewrite buffer. However, usually the doublewrite buffer is created at database initialization, and it @@ -239,6 +241,8 @@ fail: /* Remove doublewrite pages from LRU */ buf_pool_invalidate(); + + sql_print_information("InnoDB: Doublewrite buffer created"); goto start_again; } @@ -251,6 +255,7 @@ loads the pages from double write buffer into memory. @param path Path name of file @return DB_SUCCESS or error code */ dberr_t buf_dblwr_t::init_or_load_pages(pfs_os_file_t file, const char *path) + noexcept { ut_ad(this == &buf_dblwr); const uint32_t size= block_size; @@ -265,7 +270,8 @@ dberr_t buf_dblwr_t::init_or_load_pages(pfs_os_file_t file, const char *path) if (err != DB_SUCCESS) { - ib::error() << "Failed to read the system tablespace header page"; + sql_print_error("InnoDB: Failed to read the system tablespace" + " header page"); func_exit: aligned_free(read_buf); return err; @@ -298,7 +304,8 @@ func_exit: if (err != DB_SUCCESS) { - ib::error() << "Failed to read the first double write buffer extent"; + sql_print_error("InnoDB: Failed to read" + " the first double write buffer extent"); goto func_exit; } @@ -308,7 +315,8 @@ func_exit: size << srv_page_size_shift, nullptr); if (err != DB_SUCCESS) { - ib::error() << "Failed to read the second double write buffer extent"; + sql_print_error("InnoDB: Failed to read" + " the second double write buffer extent"); goto func_exit; } @@ -316,7 +324,8 @@ func_exit: if (UNIV_UNLIKELY(upgrade_to_innodb_file_per_table)) { - ib::info() << "Resetting space id's in the doublewrite buffer"; + sql_print_information("InnoDB: Resetting space id's in " + "the doublewrite buffer"); for (ulint i= 0; i < size * 2; i++, page += srv_page_size) { @@ -332,7 +341,7 @@ func_exit: source_page_no << srv_page_size_shift, srv_page_size); if (err != DB_SUCCESS) { - ib::error() << "Failed to upgrade the double write buffer"; + sql_print_error("InnoDB: Failed to upgrade the double write buffer"); goto func_exit; } } @@ -352,7 +361,7 @@ func_exit: } /** Process and remove the double write buffer pages for all tablespaces. */ -void buf_dblwr_t::recover() +void buf_dblwr_t::recover() noexcept { ut_ad(log_sys.last_checkpoint_lsn); if (!is_created()) @@ -477,7 +486,7 @@ next_page: } /** Free the doublewrite buffer. */ -void buf_dblwr_t::close() +void buf_dblwr_t::close() noexcept { if (!active_slot) return; @@ -498,7 +507,7 @@ void buf_dblwr_t::close() } /** Update the doublewrite buffer on write completion. */ -void buf_dblwr_t::write_completed() +void buf_dblwr_t::write_completed() noexcept { ut_ad(this == &buf_dblwr); ut_ad(!srv_read_only_mode); @@ -532,6 +541,7 @@ void buf_dblwr_t::write_completed() @param[in] page page to check @param[in] s tablespace */ static void buf_dblwr_check_page_lsn(const page_t* page, const fil_space_t& s) + noexcept { /* Ignore page_compressed or encrypted pages */ if (s.is_compressed() || buf_page_get_key_version(page, s.flags)) @@ -547,6 +557,7 @@ static void buf_dblwr_check_page_lsn(const page_t* page, const fil_space_t& s) } static void buf_dblwr_check_page_lsn(const buf_page_t &b, const byte *page) + noexcept { if (fil_space_t *space= fil_space_t::get_for_write(b.id().space())) { @@ -556,7 +567,7 @@ static void buf_dblwr_check_page_lsn(const buf_page_t &b, const byte *page) } /** Check the LSN values on the page with which this block is associated. */ -static void buf_dblwr_check_block(const buf_page_t *bpage) +static void buf_dblwr_check_block(const buf_page_t *bpage) noexcept { ut_ad(bpage->in_file()); const page_t *page= bpage->frame; @@ -588,7 +599,7 @@ static void buf_dblwr_check_block(const buf_page_t *bpage) } #endif /* UNIV_DEBUG */ -bool buf_dblwr_t::flush_buffered_writes(const ulint size) +bool buf_dblwr_t::flush_buffered_writes(const ulint size) noexcept { mysql_mutex_assert_owner(&mutex); ut_ad(size == block_size); @@ -653,7 +664,7 @@ bool buf_dblwr_t::flush_buffered_writes(const ulint size) return true; } -static void *get_frame(const IORequest &request) +static void *get_frame(const IORequest &request) noexcept { if (request.slot) return request.slot->out_buf; @@ -662,6 +673,7 @@ static void *get_frame(const IORequest &request) } void buf_dblwr_t::flush_buffered_writes_completed(const IORequest &request) + noexcept { ut_ad(this == &buf_dblwr); ut_ad(is_created()); @@ -734,7 +746,7 @@ void buf_dblwr_t::flush_buffered_writes_completed(const IORequest &request) It is very important to call this function after a batch of writes has been posted, and also when we may have to wait for a page latch! Otherwise a deadlock of threads can occur. */ -void buf_dblwr_t::flush_buffered_writes() +void buf_dblwr_t::flush_buffered_writes() noexcept { mysql_mutex_lock(&mutex); @@ -755,7 +767,7 @@ void buf_dblwr_t::flush_buffered_writes() flush_buffered_writes() will be invoked to make space. @param request asynchronous write request @param size payload size in bytes */ -void buf_dblwr_t::add_to_batch(const IORequest &request, size_t size) +void buf_dblwr_t::add_to_batch(const IORequest &request, size_t size) noexcept { ut_ad(request.bpage); ut_ad(request.bpage->in_file()); diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 8e07734f01b..5e0ebf63150 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -85,10 +85,10 @@ static struct #ifdef UNIV_DEBUG /** Validate the flush list. */ -static void buf_flush_validate_low(); +static void buf_flush_validate_low() noexcept; /** Validates the flush list some of the time. */ -static void buf_flush_validate_skip() +static void buf_flush_validate_skip() noexcept { /** Try buf_flush_validate_low() every this many times */ # define BUF_FLUSH_VALIDATE_SKIP 23 @@ -110,7 +110,7 @@ static void buf_flush_validate_skip() } #endif /* UNIV_DEBUG */ -void buf_pool_t::page_cleaner_wakeup(bool for_LRU) +void buf_pool_t::page_cleaner_wakeup(bool for_LRU) noexcept { ut_d(buf_flush_validate_skip()); if (!page_cleaner_idle()) @@ -179,7 +179,7 @@ deleting the data file of that tablespace. The pages still remain a part of LRU and are evicted from the list as they age towards the tail of the LRU. @param id tablespace identifier */ -void buf_flush_remove_pages(uint32_t id) +void buf_flush_remove_pages(uint32_t id) noexcept { const page_id_t first(id, 0), end(id + 1, 0); ut_ad(id); @@ -236,6 +236,7 @@ buf_flush_relocate_on_flush_list( /*=============================*/ buf_page_t* bpage, /*!< in/out: control block being moved */ buf_page_t* dpage) /*!< in/out: destination block */ + noexcept { buf_page_t* prev; @@ -276,6 +277,7 @@ buf_flush_relocate_on_flush_list( } void buf_page_t::write_complete(bool persistent, bool error, uint32_t state) + noexcept { ut_ad(!persistent == fsp_is_system_temporary(id().space())); ut_ad(state >= WRITE_FIX); @@ -296,13 +298,13 @@ void buf_page_t::write_complete(bool persistent, bool error, uint32_t state) lock.u_unlock(true); } -inline void buf_pool_t::n_flush_inc() +inline void buf_pool_t::n_flush_inc() noexcept { mysql_mutex_assert_owner(&flush_list_mutex); page_cleaner_status+= LRU_FLUSH; } -inline void buf_pool_t::n_flush_dec() +inline void buf_pool_t::n_flush_dec() noexcept { mysql_mutex_assert_owner(&flush_list_mutex); ut_ad(page_cleaner_status >= LRU_FLUSH); @@ -313,7 +315,7 @@ inline void buf_pool_t::n_flush_dec() /** Complete write of a file page from buf_pool. @param request write request @param error whether the write may have failed */ -void buf_page_write_complete(const IORequest &request, bool error) +void buf_page_write_complete(const IORequest &request, bool error) noexcept { ut_ad(request.is_write()); ut_ad(!srv_read_only_mode); @@ -363,7 +365,7 @@ void buf_page_write_complete(const IORequest &request, bool error) /** Calculate a ROW_FORMAT=COMPRESSED page checksum and update the page. @param[in,out] page page to update @param[in] size compressed page size */ -void buf_flush_update_zip_checksum(buf_frame_t *page, ulint size) +void buf_flush_update_zip_checksum(buf_frame_t *page, ulint size) noexcept { ut_ad(size > 0); mach_write_to_4(page + FIL_PAGE_SPACE_OR_CHKSUM, @@ -372,7 +374,7 @@ void buf_flush_update_zip_checksum(buf_frame_t *page, ulint size) /** Assign the full crc32 checksum for non-compressed page. @param[in,out] page page to be updated */ -void buf_flush_assign_full_crc32_checksum(byte* page) +void buf_flush_assign_full_crc32_checksum(byte* page) noexcept { ut_d(bool compressed = false); ut_d(bool corrupted = false); @@ -397,7 +399,7 @@ buf_flush_init_for_writing( const buf_block_t* block, byte* page, void* page_zip_, - bool use_full_checksum) + bool use_full_checksum) noexcept { if (block && block->page.frame != page) { /* If page is encrypted in full crc32 format then @@ -465,8 +467,8 @@ buf_flush_init_for_writing( /* The page type could be garbage in old files created before MySQL 5.5. Such files always had a page size of 16 kilobytes. */ - ulint page_type = fil_page_get_type(page); - ulint reset_type = page_type; + uint16_t page_type = fil_page_get_type(page); + uint16_t reset_type = page_type; switch (block->page.id().page_no() % 16384) { case 0: @@ -529,7 +531,7 @@ buf_flush_init_for_writing( /** Reserve a buffer for compression. @param[in,out] slot reserved slot */ -static void buf_tmp_reserve_compression_buf(buf_tmp_buffer_t* slot) +static void buf_tmp_reserve_compression_buf(buf_tmp_buffer_t* slot) noexcept { if (slot->comp_buf) return; @@ -548,7 +550,8 @@ static void buf_tmp_reserve_compression_buf(buf_tmp_buffer_t* slot) @param[in] s Page to encrypt @param[in,out] d Output buffer @return encrypted buffer or NULL */ -static byte* buf_tmp_page_encrypt(ulint offset, const byte* s, byte* d) +static byte *buf_tmp_page_encrypt(ulint offset, const byte *s, byte *d) + noexcept { /* Calculate the start offset in a page */ uint srclen= static_cast(srv_page_size) - @@ -578,8 +581,8 @@ a page is written to disk. @param[in,out] size payload size in bytes @return page frame to be written to file (may be src_frame or an encrypted/compressed copy of it) */ -static byte *buf_page_encrypt(fil_space_t* space, buf_page_t* bpage, byte* s, - buf_tmp_buffer_t **slot, size_t *size) +static byte *buf_page_encrypt(fil_space_t *space, buf_page_t *bpage, byte *s, + buf_tmp_buffer_t **slot, size_t *size) noexcept { ut_ad(!bpage->is_freed()); ut_ad(space->id == bpage->id().space()); @@ -725,7 +728,7 @@ ATTRIBUTE_COLD void buf_pool_t::release_freed_page(buf_page_t *bpage) noexcept /** Write a flushable page to a file or free a freeable block. @param space tablespace @return whether a page write was initiated and buf_pool.mutex released */ -bool buf_page_t::flush(fil_space_t *space) +bool buf_page_t::flush(fil_space_t *space) noexcept { mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex); ut_ad(in_file()); @@ -862,7 +865,7 @@ bool buf_page_t::flush(fil_space_t *space) @param id page identifier @param fold id.fold() @return whether the page can be flushed */ -static bool buf_flush_check_neighbor(const page_id_t id, ulint fold) +static bool buf_flush_check_neighbor(const page_id_t id, ulint fold) noexcept { mysql_mutex_assert_owner(&buf_pool.mutex); ut_ad(fold == id.fold()); @@ -881,6 +884,7 @@ static bool buf_flush_check_neighbor(const page_id_t id, ulint fold) @return last page number that can be flushed */ static page_id_t buf_flush_check_neighbors(const fil_space_t &space, page_id_t &id, bool contiguous) + noexcept { ut_ad(id.page_no() < space.size + (space.physical_size() == 2048 ? 1 @@ -941,7 +945,7 @@ MY_ATTRIBUTE((warn_unused_result)) /** Apply freed_ranges to the file. @param writable whether the file is writable @return number of pages written or hole-punched */ -uint32_t fil_space_t::flush_freed(bool writable) +uint32_t fil_space_t::flush_freed(bool writable) noexcept { const bool punch_hole= chain.start->punch_hole == 1; if (!punch_hole && !srv_immediate_scrub_data_uncompressed) @@ -1013,7 +1017,8 @@ static ulint buf_flush_try_neighbors(fil_space_t *space, const page_id_t page_id, buf_page_t *bpage, bool contiguous, - ulint n_flushed, ulint n_to_flush) + ulint n_flushed, + ulint n_to_flush) noexcept { ut_ad(space->id == page_id.space()); ut_ad(bpage->id() == page_id); @@ -1109,7 +1114,7 @@ Note that this function does not actually flush any data to disk. It just detaches the uncompressed frames from the compressed pages at the tail of the unzip_LRU and puts those freed frames in the free list. @return number of blocks moved to the free list. */ -static ulint buf_free_from_unzip_LRU_list_batch() +static ulint buf_free_from_unzip_LRU_list_batch() noexcept { ulint scanned = 0; ulint count = 0; @@ -1151,7 +1156,7 @@ static ulint buf_free_from_unzip_LRU_list_batch() @param id tablespace identifier @return tablespace @retval nullptr if the tablespace is missing or inaccessible */ -fil_space_t *fil_space_t::get_for_write(uint32_t id) +fil_space_t *fil_space_t::get_for_write(uint32_t id) noexcept { mysql_mutex_lock(&fil_system.mutex); fil_space_t *space= fil_space_get_by_id(id); @@ -1170,6 +1175,7 @@ fil_space_t *fil_space_t::get_for_write(uint32_t id) @param id tablespace identifier @return tablespace and number of pages written */ static std::pair buf_flush_space(const uint32_t id) + noexcept { if (fil_space_t *space= fil_space_t::get_for_write(id)) return {space, space->flush_freed(true)}; @@ -1186,7 +1192,7 @@ struct flush_counters_t /** Discard a dirty page, and release buf_pool.flush_list_mutex. @param bpage dirty page whose tablespace is not accessible */ -static void buf_flush_discard_page(buf_page_t *bpage) +static void buf_flush_discard_page(buf_page_t *bpage) noexcept { ut_ad(bpage->in_file()); ut_ad(bpage->oldest_modification()); @@ -1205,7 +1211,7 @@ static void buf_flush_discard_page(buf_page_t *bpage) and move clean blocks to buf_pool.free. @param max maximum number of blocks to flush @param n counts of flushed and evicted pages */ -static void buf_flush_LRU_list_batch(ulint max, flush_counters_t *n) +static void buf_flush_LRU_list_batch(ulint max, flush_counters_t *n) noexcept { ulint scanned= 0; mysql_mutex_assert_owner(&buf_pool.mutex); @@ -1362,7 +1368,7 @@ static void buf_flush_LRU_list_batch(ulint max, flush_counters_t *n) Whether LRU or unzip_LRU is used depends on the state of the system. @param max maximum number of blocks to flush @param n counts of flushed and evicted pages */ -static void buf_do_LRU_batch(ulint max, flush_counters_t *n) +static void buf_do_LRU_batch(ulint max, flush_counters_t *n) noexcept { if (buf_LRU_evict_from_unzip_LRU()) buf_free_from_unzip_LRU_list_batch(); @@ -1381,7 +1387,7 @@ The calling thread is not allowed to own any latches on pages! @param max_n maximum mumber of blocks to flush @param lsn once an oldest_modification>=lsn is found, terminate the batch @return number of blocks for which the write request was queued */ -static ulint buf_do_flush_list_batch(ulint max_n, lsn_t lsn) +static ulint buf_do_flush_list_batch(ulint max_n, lsn_t lsn) noexcept { ulint count= 0; ulint scanned= 0; @@ -1511,7 +1517,7 @@ static ulint buf_do_flush_list_batch(ulint max_n, lsn_t lsn) } /** Wait until a LRU flush batch ends. */ -void buf_flush_wait_LRU_batch_end() +void buf_flush_wait_LRU_batch_end() noexcept { mysql_mutex_assert_owner(&buf_pool.flush_list_mutex); mysql_mutex_assert_not_owner(&buf_pool.mutex); @@ -1537,7 +1543,7 @@ after releasing buf_pool.mutex. @return the number of processed pages @retval 0 if a buf_pool.flush_list batch is already running */ static ulint buf_flush_list_holding_mutex(ulint max_n= ULINT_UNDEFINED, - lsn_t lsn= LSN_MAX) + lsn_t lsn= LSN_MAX) noexcept { ut_ad(lsn); mysql_mutex_assert_owner(&buf_pool.mutex); @@ -1578,7 +1584,7 @@ nothing_to_do: @return the number of processed pages @retval 0 if a buf_pool.flush_list batch is already running */ static ulint buf_flush_list(ulint max_n= ULINT_UNDEFINED, - lsn_t lsn= LSN_MAX) + lsn_t lsn= LSN_MAX) noexcept { mysql_mutex_lock(&buf_pool.mutex); ulint n= buf_flush_list_holding_mutex(max_n, lsn); @@ -1591,7 +1597,7 @@ static ulint buf_flush_list(ulint max_n= ULINT_UNDEFINED, @param space tablespace @param n_flushed number of pages written @return whether the flush for some pages might not have been initiated */ -bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed) +bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed) noexcept { const auto space_id= space->id; ut_ad(space_id < SRV_SPACE_ID_UPPER_BOUND); @@ -1709,7 +1715,7 @@ The caller must invoke buf_dblwr.flush_buffered_writes() after releasing buf_pool.mutex. @param max_n wished maximum mumber of blocks flushed @return number of pages written */ -static ulint buf_flush_LRU(ulint max_n) +static ulint buf_flush_LRU(ulint max_n) noexcept { mysql_mutex_assert_owner(&buf_pool.mutex); @@ -1923,7 +1929,7 @@ inline void log_t::write_checkpoint(lsn_t end_lsn) noexcept @param oldest_lsn the checkpoint LSN @param end_lsn log_sys.get_lsn() @return true if success, false if a checkpoint write was already running */ -static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn) +static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn) noexcept { ut_ad(!srv_read_only_mode); ut_ad(log_sys.latch_have_wr()); @@ -1986,7 +1992,7 @@ modification in the pool, and writes information about the lsn in log file. Use log_make_checkpoint() to flush also the pool. @retval true if the checkpoint was or had been made @retval false if a checkpoint write was already running */ -static bool log_checkpoint() +static bool log_checkpoint() noexcept { if (recv_recovery_is_on()) recv_sys.apply(true); @@ -2010,7 +2016,7 @@ ATTRIBUTE_COLD void log_make_checkpoint() /** Wait for all dirty pages up to an LSN to be written out. NOTE: The calling thread is not allowed to hold any buffer page latches! */ -static void buf_flush_wait(lsn_t lsn) +static void buf_flush_wait(lsn_t lsn) noexcept { ut_ad(lsn <= log_sys.get_lsn()); @@ -2043,7 +2049,7 @@ static void buf_flush_wait(lsn_t lsn) /** Wait until all persistent pages are flushed up to a limit. @param sync_lsn buf_pool.get_oldest_modification(LSN_MAX) to wait for */ -ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) +ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) noexcept { ut_ad(sync_lsn); ut_ad(sync_lsn < LSN_MAX); @@ -2104,7 +2110,7 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) /** Initiate more eager page flushing if the log checkpoint age is too old. @param lsn buf_pool.get_oldest_modification(LSN_MAX) target @param furious true=furious flushing, false=limit to innodb_io_capacity */ -ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious) +ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious) noexcept { ut_ad(!srv_read_only_mode); @@ -2135,7 +2141,7 @@ ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious) and try to initiate checkpoints until the target is met. @param lsn minimum value of buf_pool.get_oldest_modification(LSN_MAX) */ ATTRIBUTE_COLD ATTRIBUTE_NOINLINE -static void buf_flush_sync_for_checkpoint(lsn_t lsn) +static void buf_flush_sync_for_checkpoint(lsn_t lsn) noexcept { ut_ad(!srv_read_only_mode); mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex); @@ -2218,7 +2224,7 @@ static void buf_flush_sync_for_checkpoint(lsn_t lsn) redo log capacity filled threshold. @param oldest_lsn buf_pool.get_oldest_modification() @return true if adaptive flushing is recommended. */ -static bool af_needed_for_redo(lsn_t oldest_lsn) +static bool af_needed_for_redo(lsn_t oldest_lsn) noexcept { lsn_t age= (log_sys.get_lsn() - oldest_lsn); lsn_t af_lwm= static_cast(srv_adaptive_flushing_lwm * @@ -2270,7 +2276,7 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in, lsn_t oldest_lsn, double pct_lwm, ulint dirty_blocks, - double dirty_pct) + double dirty_pct) noexcept { static lsn_t prev_lsn = 0; static ulint sum_pages = 0; @@ -2392,7 +2398,7 @@ func_exit: } TPOOL_SUPPRESS_TSAN -bool buf_pool_t::need_LRU_eviction() const +bool buf_pool_t::need_LRU_eviction() const noexcept { /* try_LRU_scan==false means that buf_LRU_get_free_block() is waiting for buf_flush_page_cleaner() to evict some blocks */ @@ -2407,7 +2413,7 @@ __attribute__((optimize(0))) #endif /** page_cleaner thread tasked with flushing dirty pages from the buffer pools. As of now we'll have only one coordinator. */ -static void buf_flush_page_cleaner() +static void buf_flush_page_cleaner() noexcept { my_thread_init(); #ifdef UNIV_PFS_THREAD @@ -2666,7 +2672,7 @@ static void buf_flush_page_cleaner() #endif } -ATTRIBUTE_COLD void buf_pool_t::LRU_warn() +ATTRIBUTE_COLD void buf_pool_t::LRU_warn() noexcept { mysql_mutex_assert_owner(&mutex); try_LRU_scan= false; @@ -2678,7 +2684,7 @@ ATTRIBUTE_COLD void buf_pool_t::LRU_warn() } /** Initialize page_cleaner. */ -ATTRIBUTE_COLD void buf_flush_page_cleaner_init() +ATTRIBUTE_COLD void buf_flush_page_cleaner_init() noexcept { ut_ad(!buf_page_cleaner_is_active); ut_ad(srv_operation <= SRV_OPERATION_EXPORT_RESTORED || @@ -2691,7 +2697,7 @@ ATTRIBUTE_COLD void buf_flush_page_cleaner_init() } /** Flush the buffer pool on shutdown. */ -ATTRIBUTE_COLD void buf_flush_buffer_pool() +ATTRIBUTE_COLD void buf_flush_buffer_pool() noexcept { ut_ad(!buf_page_cleaner_is_active); ut_ad(!buf_flush_sync_lsn); @@ -2719,7 +2725,7 @@ ATTRIBUTE_COLD void buf_flush_buffer_pool() /** Synchronously flush dirty blocks during recv_sys_t::apply(). NOTE: The calling thread is not allowed to hold any buffer page latches! */ -void buf_flush_sync_batch(lsn_t lsn) +void buf_flush_sync_batch(lsn_t lsn) noexcept { lsn= std::max(lsn, log_sys.get_lsn()); mysql_mutex_lock(&buf_pool.flush_list_mutex); @@ -2729,7 +2735,7 @@ void buf_flush_sync_batch(lsn_t lsn) /** Synchronously flush dirty blocks. NOTE: The calling thread is not allowed to hold any buffer page latches! */ -void buf_flush_sync() +void buf_flush_sync() noexcept { if (recv_recovery_is_on()) { @@ -2761,7 +2767,7 @@ void buf_flush_sync() #ifdef UNIV_DEBUG /** Functor to validate the flush list. */ struct Check { - void operator()(const buf_page_t* elem) const + void operator()(const buf_page_t* elem) const noexcept { ut_ad(elem->oldest_modification()); ut_ad(!fsp_is_system_temporary(elem->id().space())); @@ -2769,7 +2775,7 @@ struct Check { }; /** Validate the flush list. */ -static void buf_flush_validate_low() +static void buf_flush_validate_low() noexcept { buf_page_t* bpage; @@ -2798,7 +2804,7 @@ static void buf_flush_validate_low() } /** Validate the flush list. */ -void buf_flush_validate() +void buf_flush_validate() noexcept { mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_flush_validate_low(); diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index 139154e6baa..a00f6873bbd 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -46,6 +46,7 @@ Created 11/5/1995 Heikki Tuuri TRANSACTIONAL_TARGET bool buf_pool_t::page_hash_contains(const page_id_t page_id, hash_chain &chain) + noexcept { transactional_shared_lock_guard g {page_hash.lock_get(chain)}; @@ -219,7 +220,7 @@ buf_read_page_low( buf_pool_t::hash_chain& chain, fil_space_t* space, buf_block_t*& block, - bool sync = false) + bool sync = false) noexcept { buf_page_t* bpage; @@ -303,7 +304,7 @@ end up waiting for these latches! wants to access @return number of page read requests issued */ TRANSACTIONAL_TARGET -ulint buf_read_ahead_random(const page_id_t page_id) +ulint buf_read_ahead_random(const page_id_t page_id) noexcept { if (!srv_random_read_ahead || page_id.space() >= SRV_TMP_SPACE_ID) /* Disable the read-ahead for temporary tablespace */ @@ -444,7 +445,7 @@ released by the i/o-handler thread. @param[in] page_id page id @param[in] zip_size ROW_FORMAT=COMPRESSED page size, or 0 */ void buf_read_page_background(fil_space_t *space, const page_id_t page_id, - ulint zip_size) + ulint zip_size) noexcept { buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(page_id.fold()); if (buf_pool.page_hash_contains(page_id, chain)) @@ -503,7 +504,7 @@ latches! @param[in] page_id page id; see NOTE 3 above @return number of page read requests issued */ TRANSACTIONAL_TARGET -ulint buf_read_ahead_linear(const page_id_t page_id) +ulint buf_read_ahead_linear(const page_id_t page_id) noexcept { /* check if readahead is disabled. Disable the read ahead logic for temporary tablespace */ @@ -697,7 +698,7 @@ failed: @param recs log records @param init_lsn page initialization, or 0 if the page needs to be read */ void buf_read_recover(fil_space_t *space, const page_id_t page_id, - page_recv_t &recs, lsn_t init_lsn) + page_recv_t &recs, lsn_t init_lsn) noexcept { ut_ad(space->id == page_id.space()); space->reacquire(); diff --git a/storage/innobase/dict/dict0crea.cc b/storage/innobase/dict/dict0crea.cc index 0ad3f7b5d7f..c9122417066 100644 --- a/storage/innobase/dict/dict0crea.cc +++ b/storage/innobase/dict/dict0crea.cc @@ -45,6 +45,7 @@ Created 1/8/1996 Heikki Tuuri #include "fts0priv.h" #include "srv0start.h" #include "log.h" +#include "ha_innodb.h" /*****************************************************************//** Based on a table object, this function builds the entry to be inserted @@ -1753,8 +1754,9 @@ dict_create_add_foreigns_to_dictionary( return DB_ERROR; } + bool strict_mode = thd_is_strict_mode(trx->mysql_thd); for (auto fk : local_fk_set) - if (!fk->check_fk_constraint_valid()) + if (strict_mode && !fk->check_fk_constraint_valid()) return DB_CANNOT_ADD_CONSTRAINT; else if (dberr_t error= dict_create_add_foreign_to_dictionary (table->name.m_name, fk, trx)) diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index eaa727ea1a5..e80724e2174 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -1484,6 +1484,26 @@ dict_table_t::rename_tablespace(span new_name, bool replace) const return err; } +/********************************************************************** +Converts an identifier from my_charset_filename to UTF-8 charset. +@return result string length, as returned by strconvert() */ +static +uint +innobase_convert_to_filename_charset( +/*=================================*/ + char* to, /* out: converted identifier */ + const char* from, /* in: identifier to convert */ + ulint len) /* in: length of 'to', in bytes */ +{ + uint errors; + CHARSET_INFO* cs_to = &my_charset_filename; + CHARSET_INFO* cs_from = system_charset_info; + + return(static_cast(strconvert( + cs_from, from, uint(strlen(from)), + cs_to, to, static_cast(len), &errors))); +} + /**********************************************************************//** Renames a table object. @return TRUE if success */ @@ -3085,20 +3105,13 @@ dict_scan_id( mem_heap_t* heap, /*!< in: heap where to allocate the id (NULL=id will not be allocated, but it will point to string near ptr) */ - const char** id, /*!< out,own: the id; NULL if no id was + const char** id) /*!< out,own: the id; NULL if no id was scannable */ - ibool table_id,/*!< in: TRUE=convert the allocated id - as a table name; FALSE=convert to UTF-8 */ - ibool accept_also_dot) - /*!< in: TRUE if also a dot can appear in a - non-quoted id; in a quoted id it can appear - always */ { char quote = '\0'; ulint len = 0; const char* s; char* str; - char* dst; *id = NULL; @@ -3134,7 +3147,6 @@ dict_scan_id( } } else { while (!my_isspace(cs, *ptr) && *ptr != '(' && *ptr != ')' - && (accept_also_dot || *ptr != '.') && *ptr != ',' && *ptr != '\0') { ptr++; @@ -3168,115 +3180,15 @@ dict_scan_id( str = mem_heap_strdupl(heap, s, len); } - if (!table_id) { -convert_id: - /* Convert the identifier from connection character set - to UTF-8. */ - len = 3 * len + 1; - *id = dst = static_cast(mem_heap_alloc(heap, len)); - - innobase_convert_from_id(cs, dst, str, len); - } else if (!strncmp(str, srv_mysql50_table_name_prefix, - sizeof(srv_mysql50_table_name_prefix) - 1)) { - /* This is a pre-5.1 table name - containing chars other than [A-Za-z0-9]. - Discard the prefix and use raw UTF-8 encoding. */ - str += sizeof(srv_mysql50_table_name_prefix) - 1; - len -= sizeof(srv_mysql50_table_name_prefix) - 1; - goto convert_id; - } else { - /* Encode using filename-safe characters. */ - len = 5 * len + 1; - *id = dst = static_cast(mem_heap_alloc(heap, len)); - - innobase_convert_from_table_id(cs, dst, str, len); - } - + ulint dstlen = 3 * len + 1; + char *dst = static_cast(mem_heap_alloc(heap, dstlen)); + *id = dst; + uint errors; + strconvert(cs, str, uint(len), system_charset_info, dst, + uint(dstlen), &errors); return(ptr); } -/*********************************************************************//** -Open a table from its database and table name, this is currently used by -foreign constraint parser to get the referenced table. -@return complete table name with database and table name, allocated from -heap memory passed in */ -char* -dict_get_referenced_table( - const char* name, /*!< in: foreign key table name */ - const char* database_name, /*!< in: table db name */ - ulint database_name_len, /*!< in: db name length */ - const char* table_name, /*!< in: table name */ - ulint table_name_len, /*!< in: table name length */ - dict_table_t** table, /*!< out: table object or NULL */ - mem_heap_t* heap, /*!< in/out: heap memory */ - CHARSET_INFO* from_cs) /*!< in: table name charset */ -{ - char db_name[MAX_DATABASE_NAME_LEN]; - char tbl_name[MAX_TABLE_NAME_LEN]; - CHARSET_INFO* to_cs = &my_charset_filename; - uint errors; - ut_ad(database_name || name); - ut_ad(table_name); - - if (!strncmp(table_name, srv_mysql50_table_name_prefix, - sizeof(srv_mysql50_table_name_prefix) - 1)) { - /* This is a pre-5.1 table name - containing chars other than [A-Za-z0-9]. - Discard the prefix and use raw UTF-8 encoding. */ - table_name += sizeof(srv_mysql50_table_name_prefix) - 1; - table_name_len -= sizeof(srv_mysql50_table_name_prefix) - 1; - - to_cs = system_charset_info; - } - - table_name_len = strconvert(from_cs, table_name, table_name_len, to_cs, - tbl_name, MAX_TABLE_NAME_LEN, &errors); - table_name = tbl_name; - - if (database_name) { - to_cs = &my_charset_filename; - if (!strncmp(database_name, srv_mysql50_table_name_prefix, - sizeof(srv_mysql50_table_name_prefix) - 1)) { - database_name - += sizeof(srv_mysql50_table_name_prefix) - 1; - database_name_len - -= sizeof(srv_mysql50_table_name_prefix) - 1; - to_cs = system_charset_info; - } - - database_name_len = strconvert( - from_cs, database_name, database_name_len, to_cs, - db_name, MAX_DATABASE_NAME_LEN, &errors); - database_name = db_name; - } else { - /* Use the database name of the foreign key table */ - - database_name = name; - database_name_len = dict_get_db_name_len(name); - } - - /* Copy database_name, '/', table_name, '\0' */ - Identifier_chain2 ident({database_name, database_name_len}, - {table_name, table_name_len}); - size_t ref_nbytes= (database_name_len + table_name_len) * - system_charset_info->casedn_multiply() + 2; - char *ref = static_cast(mem_heap_alloc(heap, ref_nbytes)); - - /* Values; 0 = Store and compare as given; case sensitive - 1 = Store and compare in lower; case insensitive - 2 = Store as given, compare in lower; case semi-sensitive */ - - size_t len= ident.make_sep_name_opt_casedn(ref, ref_nbytes, - '/', lower_case_table_names > 0); - *table = dict_sys.load_table({ref, len}); - - if (lower_case_table_names == 2) { - ident.make_sep_name_opt_casedn(ref, ref_nbytes, '/', false); - } - - return(ref); -} - /*********************************************************************//** Removes MySQL comments from an SQL string. A comment is either (a) '#' to the end of the line, @@ -3533,7 +3445,7 @@ loop: } } - ptr = dict_scan_id(cs, ptr, heap, &id, FALSE, TRUE); + ptr = dict_scan_id(cs, ptr, heap, &id); if (id == NULL) { diff --git a/storage/innobase/dict/drop.cc b/storage/innobase/dict/drop.cc index a89d526696f..15f6c29dfdc 100644 --- a/storage/innobase/dict/drop.cc +++ b/storage/innobase/dict/drop.cc @@ -243,7 +243,7 @@ void trx_t::commit(std::vector &deleted) mutex_lock(); lock_release_on_drop(this); ut_ad(UT_LIST_GET_LEN(lock.trx_locks) == 0); - ut_ad(ib_vector_is_empty(autoinc_locks)); + ut_ad(autoinc_locks.empty()); mem_heap_empty(lock.lock_heap); lock.table_locks.clear(); /* commit_persist() already reset this. */ diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 35c6f65ddef..269ed9a2c31 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -1365,7 +1365,7 @@ the encryption parameters were changed @retval nullptr upon reaching the end of the iteration */ inline fil_space_t *fil_system_t::default_encrypt_next(fil_space_t *space, bool recheck, - bool encrypt) + bool encrypt) noexcept { mysql_mutex_assert_owner(&mutex); @@ -1432,7 +1432,7 @@ encryption parameters were changed @retval fil_system.temp_space if there is no work to do @retval end() upon reaching the end of the iteration */ space_list_t::iterator fil_space_t::next(space_list_t::iterator space, - bool recheck, bool encrypt) + bool recheck, bool encrypt) noexcept { mysql_mutex_lock(&fil_system.mutex); @@ -1481,7 +1481,7 @@ space_list_t::iterator fil_space_t::next(space_list_t::iterator space, static bool fil_crypt_find_space_to_rotate( key_state_t* key_state, rotate_thread_t* state, - bool* recheck) + bool* recheck) noexcept { /* we need iops to start rotating */ do { @@ -2008,10 +2008,18 @@ static void fil_crypt_complete_rotate_space(rotate_thread_t* state) mysql_mutex_unlock(&crypt_data->mutex); } +#ifdef UNIV_PFS_THREAD +mysql_pfs_key_t page_encrypt_thread_key; +#endif /* UNIV_PFS_THREAD */ + /** A thread which monitors global key state and rotates tablespaces accordingly */ static void fil_crypt_thread() { + my_thread_init(); +#ifdef UNIV_PFS_THREAD + pfs_register_thread(page_encrypt_thread_key); +#endif /* UNIV_PFS_THREAD */ mysql_mutex_lock(&fil_crypt_threads_mutex); rotate_thread_t thr(srv_n_fil_crypt_threads_started++); pthread_cond_signal(&fil_crypt_cond); /* signal that we started */ @@ -2089,6 +2097,7 @@ wait_for_work: pthread_cond_signal(&fil_crypt_cond); /* signal that we stopped */ mysql_mutex_unlock(&fil_crypt_threads_mutex); + my_thread_end(); #ifdef UNIV_PFS_THREAD pfs_delete_thread(); #endif diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 7a0338ab26e..2c64a6b7b10 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -74,6 +74,7 @@ ATTRIBUTE_COLD bool fil_space_t::set_corrupted() const noexcept @param print_info whether to diagnose why a file cannot be closed @return whether a file was closed */ bool fil_space_t::try_to_close(fil_space_t *ignore_space, bool print_info) + noexcept { mysql_mutex_assert_owner(&fil_system.mutex); for (fil_space_t &space : fil_system.space_list) @@ -204,10 +205,7 @@ extern uint srv_fil_crypt_rotate_key_age; /******************************************************************//** Checks the consistency of the tablespace cache some of the time. @return true if ok or the check was skipped */ -static -bool -fil_validate_skip(void) -/*===================*/ +static bool fil_validate_skip() noexcept { /** The fil_validate() call skip counter. */ static Atomic_counter fil_validate_count; @@ -234,7 +232,7 @@ or the caller should be in single-threaded crash recovery mode Normally, fil_space_t::get() should be used instead. @param[in] id tablespace ID @return tablespace, or NULL if not found */ -fil_space_t *fil_space_get(uint32_t id) +fil_space_t *fil_space_get(uint32_t id) noexcept { mysql_mutex_lock(&fil_system.mutex); fil_space_t *space= fil_space_get_by_id(id); @@ -245,7 +243,7 @@ fil_space_t *fil_space_get(uint32_t id) /** Check if the compression algorithm is loaded @param[in] comp_algo ulint compression algorithm @return whether the compression algorithm is loaded */ -bool fil_comp_algo_loaded(ulint comp_algo) +bool fil_comp_algo_loaded(ulint comp_algo) noexcept { switch (comp_algo) { case PAGE_UNCOMPRESSED: @@ -282,7 +280,7 @@ or UINT32_MAX for unlimited @return file object */ fil_node_t* fil_space_t::add(const char* name, pfs_os_file_t handle, uint32_t size, bool is_raw, bool atomic_write, - uint32_t max_pages) + uint32_t max_pages) noexcept { mysql_mutex_assert_owner(&fil_system.mutex); @@ -464,7 +462,7 @@ static bool fil_node_open_file(fil_node_t *node, const byte *page, bool no_lsn) } /** Close the file handle. */ -void fil_node_t::close() +void fil_node_t::close() noexcept { prepare_to_close_or_detach(); @@ -474,7 +472,7 @@ void fil_node_t::close() handle= OS_FILE_CLOSED; } -pfs_os_file_t fil_node_t::detach() +pfs_os_file_t fil_node_t::detach() noexcept { prepare_to_close_or_detach(); @@ -483,7 +481,7 @@ pfs_os_file_t fil_node_t::detach() return result; } -void fil_node_t::prepare_to_close_or_detach() +void fil_node_t::prepare_to_close_or_detach() noexcept { mysql_mutex_assert_owner(&fil_system.mutex); ut_ad(space->is_ready_to_close() || srv_operation == SRV_OPERATION_BACKUP || @@ -498,7 +496,7 @@ void fil_node_t::prepare_to_close_or_detach() } /** Flush any writes cached by the file system. */ -void fil_space_t::flush_low() +void fil_space_t::flush_low() noexcept { mysql_mutex_assert_not_owner(&fil_system.mutex); @@ -558,7 +556,7 @@ fil_space_extend_must_retry( fil_space_t* space, fil_node_t* node, uint32_t size, - bool* success) + bool* success) noexcept { mysql_mutex_assert_owner(&fil_system.mutex); ut_ad(UT_LIST_GET_LAST(space->chain) == node); @@ -679,7 +677,7 @@ bool recv_sys_t::check_sys_truncate() } /** @return whether the file is usable for io() */ -ATTRIBUTE_COLD bool fil_space_t::prepare_acquired() +ATTRIBUTE_COLD bool fil_space_t::prepare_acquired() noexcept { ut_ad(referenced()); mysql_mutex_assert_owner(&fil_system.mutex); @@ -733,7 +731,7 @@ clear: } /** @return whether the file is usable for io() */ -ATTRIBUTE_COLD bool fil_space_t::acquire_and_prepare() +ATTRIBUTE_COLD bool fil_space_t::acquire_and_prepare() noexcept { mysql_mutex_lock(&fil_system.mutex); const auto flags= acquire_low() & (STOPPING | CLOSING); @@ -746,7 +744,7 @@ ATTRIBUTE_COLD bool fil_space_t::acquire_and_prepare() @param[in,out] space tablespace @param[in] size desired size in pages @return whether the tablespace is at least as big as requested */ -bool fil_space_extend(fil_space_t *space, uint32_t size) +bool fil_space_extend(fil_space_t *space, uint32_t size) noexcept { ut_ad(!srv_read_only_mode || space->is_temporary()); bool success= false; @@ -763,7 +761,7 @@ bool fil_space_extend(fil_space_t *space, uint32_t size) } /** Prepare to free a file from fil_system. */ -inline pfs_os_file_t fil_node_t::close_to_free(bool detach_handle) +inline pfs_os_file_t fil_node_t::close_to_free(bool detach_handle) noexcept { mysql_mutex_assert_owner(&fil_system.mutex); ut_a(!being_extended); @@ -809,6 +807,7 @@ inline pfs_os_file_t fil_node_t::close_to_free(bool detach_handle) @return detached handle @retval OS_FILE_CLOSED if no handle was detached */ pfs_os_file_t fil_system_t::detach(fil_space_t *space, bool detach_handle) + noexcept { mysql_mutex_assert_owner(&fil_system.mutex); spaces.cell_get(space->id)->remove(*space, &fil_space_t::hash); @@ -873,10 +872,7 @@ pfs_os_file_t fil_system_t::detach(fil_space_t *space, bool detach_handle) /** Free a tablespace object on which fil_system_t::detach() was invoked. There must not be any pending i/o's or flushes on the files. @param[in,out] space tablespace */ -static -void -fil_space_free_low( - fil_space_t* space) +static void fil_space_free_low(fil_space_t *space) noexcept { /* The tablespace must not be in fil_system.named_spaces. */ ut_ad(srv_fast_shutdown == 2 || !srv_was_started @@ -912,7 +908,7 @@ There must not be any pending i/o's or flushes on the files. @param id tablespace identifier @param x_latched whether the caller holds exclusive fil_space_t::latch @return true if success */ -bool fil_space_free(uint32_t id, bool x_latched) +bool fil_space_free(uint32_t id, bool x_latched) noexcept { ut_ad(id != TRX_SYS_SPACE); @@ -1039,7 +1035,7 @@ Assigns a new space id for a new single-table tablespace. This works simply by incrementing the global counter. If 4 billion id's is not enough, we may need to recycle id's. @return true if assigned, false if not */ -bool fil_assign_new_space_id(uint32_t *space_id) +bool fil_assign_new_space_id(uint32_t *space_id) noexcept { uint32_t id = *space_id; bool success; @@ -1106,7 +1102,7 @@ bool fil_space_t::read_page0(const byte *dpage, bool no_lsn) noexcept } void fil_space_set_recv_size_and_flags(uint32_t id, uint32_t size, - uint32_t flags) + uint32_t flags) noexcept { ut_ad(id < SRV_SPACE_ID_UPPER_BOUND); mysql_mutex_assert_owner(&recv_sys.mutex); @@ -1284,7 +1280,7 @@ void fil_system_t::create(ulint hash_size) #endif } -void fil_system_t::close() +void fil_system_t::close() noexcept { ut_ad(this == &fil_system); ut_a(unflushed_spaces.empty()); @@ -1307,7 +1303,7 @@ void fil_system_t::close() #endif /* __linux__ */ } -void fil_system_t::add_opened_last_to_space_list(fil_space_t *space) +void fil_system_t::add_opened_last_to_space_list(fil_space_t *space) noexcept { if (UNIV_LIKELY(space_list_last_opened != nullptr)) space_list.insert(++space_list_t::iterator(space_list_last_opened), *space); @@ -1317,7 +1313,7 @@ void fil_system_t::add_opened_last_to_space_list(fil_space_t *space) } /** Extend all open data files to the recovered size */ -ATTRIBUTE_COLD void fil_system_t::extend_to_recv_size() +ATTRIBUTE_COLD void fil_system_t::extend_to_recv_size() noexcept { ut_ad(is_initialised()); mysql_mutex_lock(&mutex); @@ -1460,7 +1456,7 @@ void fil_system_t::set_buffered(bool buffered) } /** Close all tablespace files at shutdown */ -void fil_space_t::close_all() +void fil_space_t::close_all() noexcept { if (!fil_system.is_initialised()) return; @@ -1519,7 +1515,7 @@ void fil_space_t::close_all() /*******************************************************************//** Sets the max tablespace id counter if the given number is bigger than the previous value. */ -void fil_set_max_space_id_if_bigger(uint32_t max_id) +void fil_set_max_space_id_if_bigger(uint32_t max_id) noexcept { ut_a(max_id < SRV_SPACE_ID_UPPER_BOUND); @@ -1537,7 +1533,7 @@ void fil_set_max_space_id_if_bigger(uint32_t max_id) @param id tablespace identifier @return tablespace @retval nullptr if the tablespace is missing or inaccessible */ -fil_space_t *fil_space_t::get(uint32_t id) +fil_space_t *fil_space_t::get(uint32_t id) noexcept { mysql_mutex_lock(&fil_system.mutex); fil_space_t *space= fil_space_get_by_id(id); @@ -1736,7 +1732,7 @@ fil_space_t *fil_space_t::drop(uint32_t id, pfs_os_file_t *detached_handle) /** Close a single-table tablespace on failed IMPORT TABLESPACE. The tablespace must be cached in the memory cache. Free all pages used by the tablespace. */ -void fil_close_tablespace(uint32_t id) +void fil_close_tablespace(uint32_t id) noexcept { ut_ad(!is_system_tablespace(id)); fil_space_t* space = fil_space_t::drop(id, nullptr); @@ -1768,7 +1764,7 @@ void fil_close_tablespace(uint32_t id) @param id tablespace identifier @return detached file handle (to be closed by the caller) @return OS_FILE_CLOSED if no file existed */ -pfs_os_file_t fil_delete_tablespace(uint32_t id) +pfs_os_file_t fil_delete_tablespace(uint32_t id) noexcept { ut_ad(!is_system_tablespace(id)); pfs_os_file_t handle= OS_FILE_CLOSED; @@ -1777,17 +1773,9 @@ pfs_os_file_t fil_delete_tablespace(uint32_t id) return handle; } -/*******************************************************************//** -Allocates and builds a file name from a path, a table or tablespace name -and a suffix. The string must be freed by caller with ut_free(). -@param[in] path nullptr or the directory path or the full path and filename -@param[in] name {} if path is full, or Table/Tablespace name -@param[in] extension the file extension to use -@param[in] trim_name true if the last name on the path should be trimmed -@return own: file name */ char* fil_make_filepath_low(const char *path, const fil_space_t::name_type &name, - ib_extention extension, bool trim_name) + ib_extention extension, bool trim_name) noexcept { /* The path may contain the basename of the file, if so we do not need the name. If the path is NULL, we can use the default path, @@ -1881,7 +1869,7 @@ char* fil_make_filepath_low(const char *path, } char *fil_make_filepath(const char* path, const table_name_t name, - ib_extention suffix, bool strip_name) + ib_extention suffix, bool strip_name) noexcept { return fil_make_filepath_low(path, {name.m_name, strlen(name.m_name)}, suffix, strip_name); @@ -1890,12 +1878,12 @@ char *fil_make_filepath(const char* path, const table_name_t name, /** Wrapper function over fil_make_filepath_low() to build directory name. @param path the directory path or the full path and filename @return own: directory name */ -static inline char *fil_make_dirpath(const char *path) +static inline char *fil_make_dirpath(const char *path) noexcept { return fil_make_filepath_low(path, fil_space_t::name_type{}, NO_EXT, true); } -dberr_t fil_space_t::rename(const char *path, bool log, bool replace) +dberr_t fil_space_t::rename(const char *path, bool log, bool replace) noexcept { ut_ad(UT_LIST_GET_LEN(chain) == 1); ut_ad(!is_predefined_tablespace(id)); @@ -2500,6 +2488,7 @@ fil_ibd_discover( } bool fil_crypt_check(fil_space_crypt_t *crypt_data, const char *f_name) + noexcept { if (crypt_data->is_key_found()) return true; @@ -2523,7 +2512,7 @@ of the file in validate_for_recovery(). @param[out] space the tablespace, or NULL on error @return status of the operation */ enum fil_load_status -fil_ibd_load(uint32_t space_id, const char *filename, fil_space_t *&space) +fil_ibd_load(uint32_t space_id, const char *filename, fil_space_t *&space) noexcept { /* If the a space is already in the file system cache with this space ID, then there is nothing to do. */ @@ -2728,7 +2717,7 @@ startup, there may be many tablespaces which are not yet in the memory cache. @return the tablespace @retval NULL if no matching tablespace exists in the memory cache */ fil_space_t *fil_space_for_table_exists_in_mem(uint32_t id, - uint32_t table_flags) + uint32_t table_flags) noexcept { const uint32_t expected_flags = dict_tf_to_fsp_flags(table_flags); @@ -2765,7 +2754,7 @@ func_exit: ATTRIBUTE_COLD static void fil_invalid_page_access_msg(const char *name, os_offset_t offset, ulint len, - bool is_read) + bool is_read) noexcept { sql_print_error("%s %zu bytes at " UINT64PF " outside the bounds of the file: %s", @@ -2777,7 +2766,7 @@ static void fil_invalid_page_access_msg(const char *name, } /** Update the data structures on write completion */ -void fil_space_t::complete_write() +void fil_space_t::complete_write() noexcept { mysql_mutex_assert_not_owner(&fil_system.mutex); @@ -2802,7 +2791,7 @@ void fil_space_t::complete_write() @param bpage buffer block (for type.is_async() completion callback) @return status and file descriptor */ fil_io_t fil_space_t::io(const IORequest &type, os_offset_t offset, size_t len, - void *buf, buf_page_t *bpage) + void *buf, buf_page_t *bpage) noexcept { ut_ad(referenced()); ut_ad(offset % UNIV_ZIP_SIZE_MIN == 0); @@ -2904,7 +2893,7 @@ func_exit: #include -void IORequest::write_complete(int io_error) const +void IORequest::write_complete(int io_error) const noexcept { ut_ad(fil_validate_skip()); ut_ad(node); @@ -2932,7 +2921,7 @@ void IORequest::write_complete(int io_error) const space->release(); } -void IORequest::read_complete(int io_error) const +void IORequest::read_complete(int io_error) const noexcept { ut_ad(fil_validate_skip()); ut_ad(node); @@ -2963,7 +2952,7 @@ void IORequest::read_complete(int io_error) const /** Flush to disk the writes in file spaces of the given type possibly cached by the OS. */ -void fil_flush_file_spaces() +void fil_flush_file_spaces() noexcept { rescan: mysql_mutex_lock(&fil_system.mutex); @@ -2995,7 +2984,7 @@ struct Check { /** Visit a file node @param[in] elem file node to visit */ - void operator()(const fil_node_t* elem) + void operator()(const fil_node_t* elem) noexcept { n_open += elem->is_open(); size += elem->size; @@ -3004,7 +2993,7 @@ struct Check { /** Validate a tablespace. @param[in] space tablespace to validate @return number of open file nodes */ - static ulint validate(const fil_space_t* space) + static ulint validate(const fil_space_t* space) noexcept { mysql_mutex_assert_owner(&fil_system.mutex); Check check; @@ -3031,7 +3020,7 @@ struct Check { /******************************************************************//** Checks the consistency of the tablespace cache. @return true if ok */ -bool fil_validate() +bool fil_validate() noexcept { ulint n_open = 0; @@ -3048,24 +3037,11 @@ bool fil_validate() return(true); } -/*********************************************************************//** -Sets the file page type. */ -void -fil_page_set_type( -/*==============*/ - byte* page, /*!< in/out: file page */ - ulint type) /*!< in: type */ -{ - ut_ad(page); - - mach_write_to_2(page + FIL_PAGE_TYPE, type); -} - /********************************************************************//** Delete the tablespace file and any related files like .cfg. This should not be called for temporary tables. @param[in] ibd_filepath File path of the IBD tablespace */ -void fil_delete_file(const char *ibd_filepath) +void fil_delete_file(const char *ibd_filepath) noexcept { ib::info() << "Deleting " << ibd_filepath; os_file_delete_if_exists(innodb_data_file_key, ibd_filepath, nullptr); @@ -3083,9 +3059,7 @@ void fil_delete_file(const char *ibd_filepath) /** Check that a tablespace is valid for mtr_commit(). @param[in] space persistent tablespace that has been changed */ static -void -fil_space_validate_for_mtr_commit( - const fil_space_t* space) +void fil_space_validate_for_mtr_commit(const fil_space_t *space) noexcept { mysql_mutex_assert_not_owner(&fil_system.mutex); ut_ad(space != NULL); @@ -3102,9 +3076,7 @@ fil_space_validate_for_mtr_commit( /** Note that a non-predefined persistent tablespace has been modified by redo log. @param[in,out] space tablespace */ -void -fil_names_dirty( - fil_space_t* space) +void fil_names_dirty(fil_space_t *space) noexcept { ut_ad(log_sys.latch_have_wr()); ut_ad(recv_recovery_is_on()); @@ -3118,7 +3090,7 @@ fil_names_dirty( /** Write a FILE_MODIFY record when a non-predefined persistent tablespace was modified for the first time since fil_names_clear(). */ -ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void mtr_t::name_write() +ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void mtr_t::name_write() noexcept { ut_ad(log_sys.latch_have_wr()); ut_d(fil_space_validate_for_mtr_commit(m_user_space)); @@ -3140,7 +3112,7 @@ ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void mtr_t::name_write() and write out FILE_MODIFY if needed, and write FILE_CHECKPOINT. @param lsn checkpoint LSN @return current LSN */ -ATTRIBUTE_COLD lsn_t fil_names_clear(lsn_t lsn) +ATTRIBUTE_COLD lsn_t fil_names_clear(lsn_t lsn) noexcept { mtr_t mtr; @@ -3237,6 +3209,7 @@ test_make_filepath() @param[in] offset page number @return block size */ ulint fil_space_get_block_size(const fil_space_t *space, unsigned offset) + noexcept { ulint block_size = 512; @@ -3261,7 +3234,7 @@ ulint fil_space_get_block_size(const fil_space_t *space, unsigned offset) } /** @return the tablespace name (databasename/tablename) */ -fil_space_t::name_type fil_space_t::name() const +fil_space_t::name_type fil_space_t::name() const noexcept { switch (id) { case 0: @@ -3299,7 +3272,7 @@ fil_space_t::name_type fil_space_t::name() const #ifdef UNIV_DEBUG -fil_space_t *fil_space_t::next_in_space_list() +fil_space_t *fil_space_t::next_in_space_list() noexcept { space_list_t::iterator it(this); auto end= fil_system.space_list.end(); @@ -3309,7 +3282,7 @@ fil_space_t *fil_space_t::next_in_space_list() return it == end ? nullptr : &*it; } -fil_space_t *fil_space_t::prev_in_space_list() +fil_space_t *fil_space_t::prev_in_space_list() noexcept { space_list_t::iterator it(this); if (it == fil_system.space_list.begin()) @@ -3318,7 +3291,7 @@ fil_space_t *fil_space_t::prev_in_space_list() return &*it; } -fil_space_t *fil_space_t::next_in_unflushed_spaces() +fil_space_t *fil_space_t::next_in_unflushed_spaces() noexcept { sized_ilist::iterator it(this); auto end= fil_system.unflushed_spaces.end(); @@ -3328,7 +3301,7 @@ fil_space_t *fil_space_t::next_in_unflushed_spaces() return it == end ? nullptr : &*it; } -fil_space_t *fil_space_t::prev_in_unflushed_spaces() +fil_space_t *fil_space_t::prev_in_unflushed_spaces() noexcept { sized_ilist::iterator it(this); if (it == fil_system.unflushed_spaces.begin()) diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc index bae862f1ce2..63cbc2babd7 100644 --- a/storage/innobase/fsp/fsp0file.cc +++ b/storage/innobase/fsp/fsp0file.cc @@ -253,7 +253,7 @@ dberr_t Datafile::read_first_page_flags(const page_t *page) noexcept if (cflags == UINT32_MAX) switch (fsp_flags_is_incompatible_mysql(m_flags)) { case 0: - sql_print_error("InnoDB: Invalid flags 0x%zx in %s", + sql_print_error("InnoDB: Invalid flags 0x%" PRIx32 " in %s", m_flags, m_filepath); return DB_CORRUPTION; case 3: diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index 5d938f41025..daabf0b179e 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -1392,7 +1392,7 @@ static dberr_t fts_drop_table(trx_t *trx, const char *table_name, bool rename) char *tmp= dict_mem_create_temporary_tablename(heap, table->name.m_name, table->id); dberr_t err= row_rename_table_for_mysql(table->name.m_name, tmp, trx, - false); + RENAME_IGNORE_FK); mem_heap_free(heap); if (err != DB_SUCCESS) { @@ -1450,7 +1450,7 @@ fts_rename_one_aux_table( fts_table_new_name[table_new_name_len] = 0; return row_rename_table_for_mysql( - fts_table_old_name, fts_table_new_name, trx, false); + fts_table_old_name, fts_table_new_name, trx, RENAME_IGNORE_FK); } /****************************************************************//** diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 07de3b09c99..cab9142d350 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -609,6 +609,7 @@ is defined */ static PSI_thread_info all_innodb_threads[] = { {&page_cleaner_thread_key, "page_cleaner", 0}, {&trx_rollback_clean_thread_key, "trx_rollback", 0}, + {&page_encrypt_thread_key, "page_encrypt", 0}, {&thread_pool_thread_key,"ib_tpool_worker", 0} }; # endif /* UNIV_PFS_THREAD */ @@ -2308,14 +2309,12 @@ void innobase_mysql_print_thd( /*=====================*/ FILE* f, /*!< in: output stream */ - THD* thd, /*!< in: MySQL THD object */ - uint max_query_len) /*!< in: max query length to print, or 0 to - use the default max length */ + THD* thd) /*!< in: MySQL THD object */ { - char buffer[1024]; + char buffer[3072]; fputs(thd_get_error_context_description(thd, buffer, sizeof buffer, - max_query_len), f); + 0), f); putc('\n', f); } @@ -2384,21 +2383,6 @@ dtype_get_mblen( } } -/******************************************************************//** -Converts an identifier to a table name. */ -void -innobase_convert_from_table_id( -/*===========================*/ - CHARSET_INFO* cs, /*!< in: the 'from' character set */ - char* to, /*!< out: converted identifier */ - const char* from, /*!< in: identifier to convert */ - ulint len) /*!< in: length of 'to', in bytes */ -{ - uint errors; - - strconvert(cs, from, FN_REFLEN, &my_charset_filename, to, (uint) len, &errors); -} - /********************************************************************** Check if the length of the identifier exceeds the maximum allowed. return true when length of identifier is too long. */ @@ -3598,13 +3582,13 @@ innobase_format_name( ulint buflen, /*!< in: length of buf, in bytes */ const char* name) /*!< in: table name to format */ { - const char* bufend; + char* bufend; bufend = innobase_convert_name(buf, buflen, name, strlen(name), NULL); ut_ad((ulint) (bufend - buf) < buflen); - buf[bufend - buf] = '\0'; + *bufend = '\0'; } /**********************************************************************//** @@ -4653,9 +4637,10 @@ innobase_commit( ut_ad("invalid state" == 0); /* fall through */ case TRX_STATE_PREPARED: - ut_ad(commit_trx); + ut_ad(commit_trx || trx->is_wsrep()); ut_ad(thd_test_options(thd, OPTION_NOT_AUTOCOMMIT - | OPTION_BEGIN)); + | OPTION_BEGIN) + || trx->is_wsrep()); /* fall through */ case TRX_STATE_ACTIVE: /* Transaction is deregistered only in a commit or a @@ -5027,7 +5012,7 @@ static void innobase_kill_query(handlerton*, THD *thd, enum thd_kill_levels) may be executed as part of a multi-transaction DDL operation, such as rollback_inplace_alter_table() or ha_innobase::delete_table(). */; trx->error_state= DB_INTERRUPTED; - lock_sys_t::cancel(trx, lock); + lock_sys.cancel(trx, lock); } lock_sys.deadlock_check(); } @@ -9631,8 +9616,7 @@ ha_innobase::ft_init_ext( /* If tablespace is discarded, we should return here */ if (!ft_table->space) { - my_error(ER_TABLESPACE_MISSING, MYF(0), table->s->db.str, - table->s->table_name.str); + my_error(ER_TABLESPACE_MISSING, MYF(0), ft_table->name.m_name); return(NULL); } @@ -12286,6 +12270,53 @@ public: const char* str() { return buf; } }; +char *dict_table_lookup(LEX_CSTRING db, LEX_CSTRING name, + dict_table_t **table, mem_heap_t *heap) noexcept +{ + Identifier_chain2 ident(db, name); + const size_t ref_nbytes= (db.length + name.length) * + system_charset_info->casedn_multiply() + 2; + char *ref= static_cast(mem_heap_alloc(heap, ref_nbytes)); + + size_t len= ident.make_sep_name_opt_casedn(ref, ref_nbytes, '/', + lower_case_table_names > 0); + *table = dict_sys.load_table({ref, len}); + + if (lower_case_table_names == 2) + ident.make_sep_name_opt_casedn(ref, ref_nbytes, '/', false); + + return ref; +} + +/** Convert a schema or table name to InnoDB (and file system) format. +@param cs source character set +@param name name encoded in cs +@param buf output buffer (MAX_TABLE_NAME_LEN + 1 bytes) +@return the converted string (within buf) */ +LEX_CSTRING innodb_convert_name(CHARSET_INFO *cs, LEX_CSTRING name, char *buf) + noexcept +{ + CHARSET_INFO *to_cs= &my_charset_filename; + if (!strncmp(name.str, srv_mysql50_table_name_prefix, + sizeof srv_mysql50_table_name_prefix - 1)) + { + /* Before MySQL 5.1 introduced my_charset_filename, schema and + table names were stored in the file system as specified by the + user, hopefully in ASCII encoding, but it could also be in ISO + 8859-1 or UTF-8. Such schema or table names are distinguished by + the #mysql50# prefix. + + Let us discard that prefix and convert the name to UTF-8 + (system_charset_info). */ + name.str+= sizeof srv_mysql50_table_name_prefix - 1; + name.length-= sizeof srv_mysql50_table_name_prefix - 1; + to_cs= system_charset_info; + } + uint errors; + return LEX_CSTRING{buf, strconvert(cs, name.str, name.length, to_cs, + buf, MAX_TABLE_NAME_LEN, &errors)}; +} + /** Create InnoDB foreign keys from MySQL alter_info. Collect all dict_foreign_t items into local_fk_set and then add into system table. @return DB_SUCCESS or specific error code */ @@ -12301,6 +12332,9 @@ create_table_info_t::create_foreign_keys() const char* ref_column_names[MAX_COLS_PER_FK]; char create_name[MAX_DATABASE_NAME_LEN + 1 + MAX_TABLE_NAME_LEN + 1]; + char db_name[MAX_DATABASE_NAME_LEN + 1]; + char t_name[MAX_TABLE_NAME_LEN + 1]; + static_assert(MAX_TABLE_NAME_LEN == MAX_DATABASE_NAME_LEN, ""); dict_index_t* index = NULL; fkerr_t index_error = FK_SUCCESS; dict_index_t* err_index = NULL; @@ -12308,59 +12342,57 @@ create_table_info_t::create_foreign_keys() const bool tmp_table = m_flags2 & DICT_TF2_TEMPORARY; const CHARSET_INFO* cs = thd_charset(m_thd); const char* operation = "Create "; - const char* name = m_table_name; enum_sql_command sqlcom = enum_sql_command(thd_sql_command(m_thd)); + LEX_CSTRING name= {m_table_name, strlen(m_table_name)}; if (sqlcom == SQLCOM_ALTER_TABLE) { - dict_table_t* table_to_alter; mem_heap_t* heap = mem_heap_create(10000); - ulint highest_id_so_far; - char* n = dict_get_referenced_table( - name, LEX_STRING_WITH_LEN(m_form->s->db), - LEX_STRING_WITH_LEN(m_form->s->table_name), - &table_to_alter, heap, cs); + LEX_CSTRING t = innodb_convert_name(cs, m_form->s->table_name, + t_name); + LEX_CSTRING d = innodb_convert_name(cs, m_form->s->db, db_name); + dict_table_t* alter_table; + char* n = dict_table_lookup(d, t, &alter_table, heap); /* Starting from 4.0.18 and 4.1.2, we generate foreign key id's in the format databasename/tablename_ibfk_[number], where [number] is local to the table; look for the highest [number] - for table_to_alter, so that we can assign to new constraints + for alter_table, so that we can assign to new constraints higher numbers. */ /* If we are altering a temporary table, the table name after ALTER TABLE does not correspond to the internal table name, and - table_to_alter is NULL. TODO: should we fix this somehow? */ + alter_table=nullptr. But, we do not support FOREIGN KEY + constraints for temporary tables. */ - if (table_to_alter) { - n = table_to_alter->name.m_name; - highest_id_so_far = dict_table_get_highest_foreign_id( - table_to_alter); - } else { - highest_id_so_far = 0; + if (alter_table) { + n = alter_table->name.m_name; + number = 1 + dict_table_get_highest_foreign_id( + alter_table); } char* bufend = innobase_convert_name( create_name, sizeof create_name, n, strlen(n), m_thd); - create_name[bufend - create_name] = '\0'; - number = highest_id_so_far + 1; + *bufend = '\0'; mem_heap_free(heap); operation = "Alter "; - } else if (strstr(name, "#P#") || strstr(name, "#p#")) { + } else if (strstr(m_table_name, "#P#") + || strstr(m_table_name, "#p#")) { /* Partitioned table */ create_name[0] = '\0'; } else { char* bufend = innobase_convert_name(create_name, sizeof create_name, - name, - strlen(name), m_thd); - create_name[bufend - create_name] = '\0'; + LEX_STRING_WITH_LEN(name), + m_thd); + *bufend = '\0'; } Alter_info* alter_info = m_create_info->alter_info; ut_ad(alter_info); List_iterator_fast key_it(alter_info->key_list); - dict_table_t* table = dict_sys.find_table({name,strlen(name)}); + dict_table_t* table = dict_sys.find_table({name.str, name.length}); if (!table) { ib_foreign_warn(m_trx, DB_CANNOT_ADD_CONSTRAINT, create_name, "%s table %s foreign key constraint" @@ -12407,27 +12439,27 @@ create_table_info_t::create_foreign_keys() col->field_name.length); success = find_col(table, column_names + i); if (!success) { - key_text k(fk); ib_foreign_warn( m_trx, DB_CANNOT_ADD_CONSTRAINT, create_name, "%s table %s foreign key %s constraint" " failed. Column %s was not found.", - operation, create_name, k.str(), + operation, create_name, + key_text(fk).str(), column_names[i]); dict_foreign_free(foreign); return (DB_CANNOT_ADD_CONSTRAINT); } ++i; if (i >= MAX_COLS_PER_FK) { - key_text k(fk); ib_foreign_warn( m_trx, DB_CANNOT_ADD_CONSTRAINT, create_name, "%s table %s foreign key %s constraint" " failed. Too many columns: %u (%u " "allowed).", - operation, create_name, k.str(), i, + operation, create_name, + key_text(fk).str(), i, MAX_COLS_PER_FK); dict_foreign_free(foreign); return (DB_CANNOT_ADD_CONSTRAINT); @@ -12439,9 +12471,9 @@ create_table_info_t::create_foreign_keys() &index_error, &err_col, &err_index); if (!index) { - key_text k(fk); foreign_push_index_error(m_trx, operation, create_name, - k.str(), column_names, + key_text(fk).str(), + column_names, index_error, err_col, err_index, table); dict_foreign_free(foreign); @@ -12507,14 +12539,12 @@ create_table_info_t::create_foreign_keys() memcpy(foreign->foreign_col_names, column_names, i * sizeof(void*)); - foreign->referenced_table_name = dict_get_referenced_table( - name, LEX_STRING_WITH_LEN(fk->ref_db), - LEX_STRING_WITH_LEN(fk->ref_table), - &foreign->referenced_table, foreign->heap, cs); - - if (!foreign->referenced_table_name) { - return (DB_OUT_OF_MEMORY); - } + LEX_CSTRING t = innodb_convert_name(cs, fk->ref_table, t_name); + LEX_CSTRING d = fk->ref_db.str + ? innodb_convert_name(cs, fk->ref_db, db_name) + : LEX_CSTRING{table->name.m_name, table->name.dblen()}; + foreign->referenced_table_name = dict_table_lookup( + d, t, &foreign->referenced_table, foreign->heap); if (!foreign->referenced_table && m_trx->check_foreigns) { char buf[MAX_TABLE_NAME_LEN + 1] = ""; @@ -12524,15 +12554,15 @@ create_table_info_t::create_foreign_keys() buf, MAX_TABLE_NAME_LEN, foreign->referenced_table_name, strlen(foreign->referenced_table_name), m_thd); - buf[bufend - buf] = '\0'; - key_text k(fk); + *bufend = '\0'; ib_foreign_warn(m_trx, DB_CANNOT_ADD_CONSTRAINT, create_name, "%s table %s with foreign key %s " "constraint failed. Referenced table " "%s not found in the data dictionary.", - operation, create_name, k.str(), buf); - return (DB_CANNOT_ADD_CONSTRAINT); + operation, create_name, + key_text(fk).str(), buf); + return DB_CANNOT_ADD_CONSTRAINT; } /* Don't allow foreign keys on partitioned tables yet. */ @@ -12555,7 +12585,6 @@ create_table_info_t::create_foreign_keys() success = find_col(foreign->referenced_table, ref_column_names + j); if (!success) { - key_text k(fk); ib_foreign_warn( m_trx, DB_CANNOT_ADD_CONSTRAINT, @@ -12564,9 +12593,9 @@ create_table_info_t::create_foreign_keys() "constraint failed. " "Column %s was not found.", operation, create_name, - k.str(), ref_column_names[j]); - - return (DB_CANNOT_ADD_CONSTRAINT); + key_text(fk).str(), + ref_column_names[j]); + return DB_CANNOT_ADD_CONSTRAINT; } } ++j; @@ -12586,16 +12615,15 @@ create_table_info_t::create_foreign_keys() &err_index); if (!index) { - key_text k(fk); foreign_push_index_error( - m_trx, operation, create_name, k.str(), + m_trx, operation, create_name, + key_text(fk).str(), column_names, index_error, err_col, err_index, foreign->referenced_table); - - return (DB_CANNOT_ADD_CONSTRAINT); + return DB_CANNOT_ADD_CONSTRAINT; } } else { - ut_a(m_trx->check_foreigns == FALSE); + ut_a(!m_trx->check_foreigns); index = NULL; } @@ -12632,7 +12660,6 @@ create_table_info_t::create_foreign_keys() NULL if the column is not allowed to be NULL! */ - key_text k(fk); ib_foreign_warn( m_trx, DB_CANNOT_ADD_CONSTRAINT, @@ -12643,9 +12670,9 @@ create_table_info_t::create_foreign_keys() "but column '%s' is defined as " "NOT NULL.", operation, create_name, - k.str(), col_name); + key_text(fk).str(), col_name); - return (DB_CANNOT_ADD_CONSTRAINT); + return DB_CANNOT_ADD_CONSTRAINT; } } } @@ -13705,7 +13732,6 @@ int ha_innobase::delete_table(const char *name) if (err != DB_SUCCESS) { err_exit: - trx->dict_operation_lock_mode= false; trx->rollback(); switch (err) { case DB_CANNOT_DROP_CONSTRAINT: @@ -13727,7 +13753,7 @@ err_exit: dict_table_close(table_stats, true, thd, mdl_table); if (index_stats) dict_table_close(index_stats, true, thd, mdl_index); - dict_sys.unlock(); + row_mysql_unlock_data_dictionary(trx); if (trx != parent_trx) trx->free(); DBUG_RETURN(convert_error_code_to_mysql(err, 0, NULL)); @@ -13778,10 +13804,10 @@ err_exit: @param[in,out] trx InnoDB data dictionary transaction @param[in] from old table name @param[in] to new table name -@param[in] use_fk whether to enforce FOREIGN KEY +@param[in] fk how to handle FOREIGN KEY @return DB_SUCCESS or error code */ static dberr_t innobase_rename_table(trx_t *trx, const char *from, - const char *to, bool use_fk) + const char *to, rename_fk fk) { dberr_t error; char norm_to[FN_REFLEN]; @@ -13799,7 +13825,7 @@ static dberr_t innobase_rename_table(trx_t *trx, const char *from, ut_ad(trx->will_lock); - error = row_rename_table_for_mysql(norm_from, norm_to, trx, use_fk); + error = row_rename_table_for_mysql(norm_from, norm_to, trx, fk); if (error != DB_SUCCESS) { if (error == DB_TABLE_NOT_FOUND @@ -13826,7 +13852,8 @@ static dberr_t innobase_rename_table(trx_t *trx, const char *from, #endif /* _WIN32 */ trx_start_if_not_started(trx, true); error = row_rename_table_for_mysql( - par_case_name, norm_to, trx, false); + par_case_name, norm_to, trx, + RENAME_IGNORE_FK); } } @@ -14022,7 +14049,8 @@ int ha_innobase::truncate() if (error == DB_SUCCESS) { - error= innobase_rename_table(trx, ib_table->name.m_name, temp_name, false); + error= innobase_rename_table(trx, ib_table->name.m_name, temp_name, + RENAME_REBUILD); if (error == DB_SUCCESS) error= trx->drop_table(*ib_table); } @@ -14220,7 +14248,8 @@ ha_innobase::rename_table( row_mysql_lock_data_dictionary(trx); if (error == DB_SUCCESS) { - error = innobase_rename_table(trx, from, to, true); + error = innobase_rename_table(trx, from, to, + RENAME_ALTER_COPY); } DEBUG_SYNC(thd, "after_innobase_rename_table"); @@ -14263,7 +14292,7 @@ ha_innobase::rename_table( my_error(ER_TABLE_EXISTS_ERROR, MYF(0), to); error = DB_ERROR; } else if (error == DB_LOCK_WAIT_TIMEOUT) { - my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0), to); + my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0)); error = DB_LOCK_WAIT; } @@ -15778,7 +15807,8 @@ ha_innobase::extra( /* Allow a subsequent INSERT into an empty table if !unique_checks && !foreign_key_checks. */ if (dberr_t err = trx->bulk_insert_apply()) { - return err; + return convert_error_code_to_mysql( + err, 0, trx->mysql_thd); } break; } @@ -16193,6 +16223,7 @@ ha_innobase::external_lock( case F_UNLCK: DEBUG_SYNC_C("ha_innobase_end_statement"); m_mysql_has_locked = false; + ut_a(trx->n_mysql_tables_in_use); if (--trx->n_mysql_tables_in_use) { break; @@ -19449,18 +19480,14 @@ static MYSQL_SYSVAR_UINT(log_buffer_size, log_sys.buf_size, "Redo log buffer size in bytes", NULL, NULL, 16U << 20, 2U << 20, log_sys.buf_size_max, 4096); -#ifdef HAVE_INNODB_MMAP static constexpr const char *innodb_log_file_mmap_description= "Whether ib_logfile0" -# ifdef HAVE_PMEM - " resides in persistent memory or" -# endif + " resides in persistent memory (when supported) or" " should initially be memory-mapped"; static MYSQL_SYSVAR_BOOL(log_file_mmap, log_sys.log_mmap, PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY, innodb_log_file_mmap_description, nullptr, nullptr, log_sys.log_mmap_default); -#endif #if defined __linux__ || defined _WIN32 static MYSQL_SYSVAR_BOOL(log_file_buffering, log_sys.log_buffered, @@ -19928,9 +19955,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(deadlock_report), MYSQL_SYSVAR(page_size), MYSQL_SYSVAR(log_buffer_size), -#ifdef HAVE_INNODB_MMAP MYSQL_SYSVAR(log_file_mmap), -#endif #if defined __linux__ || defined _WIN32 MYSQL_SYSVAR(log_file_buffering), #endif @@ -20968,25 +20993,6 @@ const char* SET_TRANSACTION_MSG = const char* INNODB_PARAMETERS_MSG = "Please refer to https://mariadb.com/kb/en/library/innodb-system-variables/"; -/********************************************************************** -Converts an identifier from my_charset_filename to UTF-8 charset. -@return result string length, as returned by strconvert() */ -uint -innobase_convert_to_filename_charset( -/*=================================*/ - char* to, /* out: converted identifier */ - const char* from, /* in: identifier to convert */ - ulint len) /* in: length of 'to', in bytes */ -{ - uint errors; - CHARSET_INFO* cs_to = &my_charset_filename; - CHARSET_INFO* cs_from = system_charset_info; - - return(static_cast(strconvert( - cs_from, from, uint(strlen(from)), - cs_to, to, static_cast(len), &errors))); -} - /********************************************************************** Converts an identifier from my_charset_filename to UTF-8 charset. @return result string length, as returned by strconvert() */ @@ -21390,9 +21396,7 @@ void ins_node_t::vers_update_end(row_prebuilt_t *prebuilt, bool history_row) if needed. @param[in] size size in bytes @return aligned size */ -ulint -buf_pool_size_align( - ulint size) +ulint buf_pool_size_align(ulint size) noexcept { const size_t m = srv_buf_pool_chunk_unit; size = ut_max(size, (size_t) MYSQL_SYSVAR_NAME(buffer_pool_size).min_val); diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 73f44ba2faf..f5f31612645 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -30,6 +30,7 @@ Smart ALTER TABLE #include #include #include +#include /* Include necessary InnoDB headers */ #include "btr0sea.h" @@ -3216,6 +3217,9 @@ innobase_get_foreign_key_info( ulint num_fk = 0; Alter_info* alter_info = ha_alter_info->alter_info; const CHARSET_INFO* cs = thd_charset(trx->mysql_thd); + char db_name[MAX_DATABASE_NAME_LEN + 1]; + char t_name[MAX_TABLE_NAME_LEN + 1]; + static_assert(MAX_TABLE_NAME_LEN == MAX_DATABASE_NAME_LEN, ""); DBUG_ENTER("innobase_get_foreign_key_info"); @@ -3280,14 +3284,15 @@ innobase_get_foreign_key_info( add_fk[num_fk] = dict_mem_foreign_create(); + LEX_CSTRING t = innodb_convert_name(cs, fk_key->ref_table, + t_name); + LEX_CSTRING d = fk_key->ref_db.str + ? innodb_convert_name(cs, fk_key->ref_db, db_name) + : LEX_CSTRING{table->name.m_name, table->name.dblen()}; dict_sys.lock(SRW_LOCK_CALL); - referenced_table_name = dict_get_referenced_table( - table->name.m_name, - LEX_STRING_WITH_LEN(fk_key->ref_db), - LEX_STRING_WITH_LEN(fk_key->ref_table), - &referenced_table, - add_fk[num_fk]->heap, cs); + referenced_table_name = dict_table_lookup( + d, t, &referenced_table, add_fk[num_fk]->heap); /* Test the case when referenced_table failed to open, if trx->check_foreigns is not set, we should @@ -4433,13 +4438,15 @@ declared as NOT NULL @param n_drop_fk number of constraints that are being dropped @param col_name modified column name @param new_field_flags Modified field flags +@param strict_mode Whether the sql_mode is strict @retval true Not allowed (will call my_error()) @retval false Allowed */ static bool check_foreigns_nullability(const dict_table_t *user_table, dict_foreign_t **drop_fk, ulint n_drop_fk, - const char *col_name, uint32_t new_field_flags) + const char *col_name, uint32_t new_field_flags, + bool strict_mode) { ut_ad(dict_sys.locked()); @@ -4451,7 +4458,7 @@ bool check_foreigns_nullability(const dict_table_t *user_table, if (innobase_dropping_foreign(foreign, drop_fk, n_drop_fk)) continue; - if (foreign->on_update_cascade_null(col_name)) + if (strict_mode && foreign->on_update_cascade_null(col_name)) goto non_null_error; if (foreign->type & (foreign->DELETE_SET_NULL | @@ -4473,7 +4480,7 @@ non_null_error: { for (dict_foreign_t *foreign : user_table->referenced_set) { - if (foreign->on_update_cascade_not_null(col_name)) + if (strict_mode && foreign->on_update_cascade_not_null(col_name)) { char display_name[FN_REFLEN]; const int dblen= int(table_name_t(const_cast(foreign-> @@ -4575,6 +4582,7 @@ column that is being dropped or modified to NOT NULL. @param user_table InnoDB table as it is before the ALTER operation @param drop_fk constraints being dropped @param n_drop_fk number of constraints that are being dropped +@param strict_mode Whether the strict sql_mode is set @retval true Not allowed (will call my_error()) @retval false Allowed */ @@ -4586,7 +4594,8 @@ innobase_check_foreigns( const TABLE* old_table, const dict_table_t* user_table, dict_foreign_t** drop_fk, - ulint n_drop_fk) + ulint n_drop_fk, + bool strict_mode) { for (Field** fp = old_table->field; *fp; fp++) { ut_ad(!(*fp)->real_maybe_null() @@ -4611,7 +4620,8 @@ innobase_check_foreigns( if (check_foreigns_nullability(user_table, drop_fk, n_drop_fk, (*fp)->field_name.str, - it->flags)) { + it->flags, + strict_mode)) { return true; } } @@ -6649,7 +6659,8 @@ acquire_lock: if (new_clustered) { if (innobase_check_foreigns( ha_alter_info, old_table, - user_table, ctx->drop_fk, ctx->num_to_drop_fk)) { + user_table, ctx->drop_fk, ctx->num_to_drop_fk, + thd_is_strict_mode(ctx->trx->mysql_thd))) { new_clustered_failed: DBUG_ASSERT(ctx->trx != ctx->prebuilt->trx); ctx->trx->rollback(); @@ -10415,10 +10426,12 @@ commit_try_rebuild( char* old_name= mem_heap_strdup(ctx->heap, user_table->name.m_name); dberr_t error = row_rename_table_for_mysql(user_table->name.m_name, - ctx->tmp_name, trx, false); + ctx->tmp_name, trx, + RENAME_REBUILD); if (error == DB_SUCCESS) { error = row_rename_table_for_mysql( - rebuilt_table->name.m_name, old_name, trx, false); + rebuilt_table->name.m_name, old_name, trx, + RENAME_REBUILD); if (error == DB_SUCCESS) { /* The statistics for the surviving indexes will be re-inserted in alter_stats_rebuild(). */ @@ -11036,6 +11049,37 @@ commit_cache_norebuild( dict_index_remove_from_cache(index->table, index); } + if (ctx->num_to_add_index) { + for (dict_foreign_t* foreign: ctx->new_table->foreign_set) { + if (foreign->foreign_table == ctx->new_table + && !foreign->foreign_index) { + foreign->foreign_index = + dict_foreign_find_index( + foreign->foreign_table, + nullptr, + foreign->foreign_col_names, + foreign->n_fields, nullptr, + /*check_charsets=*/TRUE, + /*check_null=*/FALSE, + nullptr, nullptr, nullptr); + } + } + for (dict_foreign_t* foreign: ctx->new_table->referenced_set) { + if (foreign->referenced_table == ctx->new_table + && !foreign->referenced_index) { + foreign->referenced_index = + dict_foreign_find_index( + foreign->referenced_table, + nullptr, + foreign->referenced_col_names, + foreign->n_fields, nullptr, + /*check_charsets=*/TRUE, + /*check_null=*/FALSE, + nullptr, nullptr, nullptr); + } + } + } + fts_clear_all(ctx->old_table); if (!ctx->is_instant()) { diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 450fe0e2b82..8383bc9a9ec 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -150,7 +150,7 @@ operator<<( @param id expected block->page.id() @return block if it was buffer-fixed @retval nullptr if the block no longer is valid */ -buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) +buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) noexcept MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Try to acquire a page latch after buf_page_optimistic_fix(). @@ -162,7 +162,8 @@ buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) @retval nullptr if block->unfix() was called because it no longer is valid */ buf_block_t *buf_page_optimistic_get(buf_block_t *block, rw_lock_type_t rw_latch, - uint64_t modify_clock, mtr_t *mtr) + uint64_t modify_clock, + mtr_t *mtr) noexcept MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Try to S-latch a page. @@ -171,14 +172,14 @@ Suitable for using when holding the lock_sys latches (as it avoids deadlock). @param[in,out] mtr mini-transaction @return the block @retval nullptr if an S-latch cannot be granted immediately */ -buf_block_t *buf_page_try_get(const page_id_t page_id, mtr_t *mtr); +buf_block_t *buf_page_try_get(const page_id_t page_id, mtr_t *mtr) noexcept; /** Get read access to a compressed page (usually of type FIL_PAGE_TYPE_ZBLOB or FIL_PAGE_TYPE_ZBLOB2). The page must be released with s_unlock(). @param page_id page identifier @return pointer to the block, s-latched */ -buf_page_t *buf_page_get_zip(const page_id_t page_id); +buf_page_t *buf_page_get_zip(const page_id_t page_id) noexcept; /** Get access to a database page. Buffered redo log may be applied. @param[in] page_id page id @@ -199,7 +200,7 @@ buf_page_get_gen( buf_block_t* guess, ulint mode, mtr_t* mtr, - dberr_t* err = nullptr); + dberr_t* err = nullptr) noexcept; /** Initialize a page in the buffer pool. The page is usually not read from a file even if it cannot be found in the buffer buf_pool. This is one @@ -213,7 +214,8 @@ of the functions which perform to a block a state transition NOT_USED => LRU @return pointer to the block, page bufferfixed */ buf_block_t* buf_page_create(fil_space_t *space, uint32_t offset, - ulint zip_size, mtr_t *mtr, buf_block_t *free_block); + ulint zip_size, mtr_t *mtr, buf_block_t *free_block) + noexcept; /** Initialize a page in buffer pool while initializing the deferred tablespace @@ -224,7 +226,7 @@ deferred tablespace @return pointer to the block, page bufferfixed */ buf_block_t* buf_page_create_deferred(uint32_t space_id, ulint zip_size, mtr_t *mtr, - buf_block_t *free_block); + buf_block_t *free_block) noexcept; /** Mark the page status as FREED for the given tablespace and page number. @param[in,out] space tablespace @@ -261,7 +263,7 @@ buf_block_modify_clock_inc( /** Check if a buffer is all zeroes. @param[in] buf data to check @return whether the buffer is all zeroes */ -bool buf_is_zeroes(st_::span buf); +bool buf_is_zeroes(st_::span buf) noexcept; /** Reason why buf_page_is_corrupted() fails */ enum buf_page_is_corrupted_reason @@ -278,7 +280,7 @@ enum buf_page_is_corrupted_reason @return whether the page is corrupted */ buf_page_is_corrupted_reason buf_page_is_corrupted(bool check_lsn, const byte *read_buf, uint32_t fsp_flags) - MY_ATTRIBUTE((warn_unused_result)); + noexcept MY_ATTRIBUTE((warn_unused_result)); /** Read the key version from the page. In full crc32 format, key version is stored at {0-3th} bytes. In other format, it is @@ -287,7 +289,7 @@ stored in 26th position. @param[in] fsp_flags tablespace flags @return key version of the page. */ inline uint32_t buf_page_get_key_version(const byte* read_buf, - uint32_t fsp_flags) + uint32_t fsp_flags) noexcept { static_assert(FIL_PAGE_FCRC32_KEY_VERSION == 0, "compatibility"); return fil_space_t::full_crc32(fsp_flags) @@ -302,7 +304,7 @@ stored in page type. @param[in] read_buf database page @param[in] fsp_flags tablespace flags @return true if page is compressed. */ -inline bool buf_page_is_compressed(const byte* read_buf, uint32_t fsp_flags) +inline bool buf_page_is_compressed(const byte* read_buf, uint32_t fsp_flags) noexcept { uint16_t page_type= fil_page_get_type(read_buf); return fil_space_t::full_crc32(fsp_flags) @@ -315,7 +317,8 @@ inline bool buf_page_is_compressed(const byte* read_buf, uint32_t fsp_flags) @param[out] comp whether the page could be compressed @param[out] cr whether the page could be corrupted @return the payload size in the file page */ -inline uint buf_page_full_crc32_size(const byte* buf, bool* comp, bool* cr) +inline uint buf_page_full_crc32_size(const byte *buf, bool *comp, bool *cr) + noexcept { uint t = fil_page_get_type(buf); uint page_size = uint(srv_page_size); @@ -343,20 +346,17 @@ inline uint buf_page_full_crc32_size(const byte* buf, bool* comp, bool* cr) /** Dump a page to stderr. @param[in] read_buf database page @param[in] zip_size compressed page size, or 0 */ -void buf_page_print(const byte* read_buf, ulint zip_size = 0) +void buf_page_print(const byte* read_buf, ulint zip_size = 0) noexcept ATTRIBUTE_COLD __attribute__((nonnull)); -/********************************************************************//** -Decompress a block. +/** Decompress a ROW_FORMAT=COMPRESSED block. +@param block buffer page +@param check whether to verify the page checksum @return true if successful */ -bool -buf_zip_decompress( -/*===============*/ - buf_block_t* block, /*!< in/out: block */ - ibool check); /*!< in: TRUE=verify the page checksum */ +bool buf_zip_decompress(buf_block_t *block, bool check) noexcept; #ifdef UNIV_DEBUG /** @return the number of latched pages in the buffer pool */ -ulint buf_get_latched_pages_number(); +ulint buf_get_latched_pages_number() noexcept; #endif /* UNIV_DEBUG */ /*********************************************************************//** Prints info of the buffer i/o. */ @@ -366,14 +366,14 @@ buf_print_io( FILE* file); /*!< in: file where to print */ /** Collect buffer pool metadata. @param[out] pool_info buffer pool metadata */ -void buf_stats_get_pool_info(buf_pool_info_t *pool_info); +void buf_stats_get_pool_info(buf_pool_info_t *pool_info) noexcept; /** Refresh the statistics used to print per-second averages. */ -void buf_refresh_io_stats(); +void buf_refresh_io_stats() noexcept; /** Invalidate all pages in the buffer pool. All pages must be in a replaceable state (not modified or latched). */ -void buf_pool_invalidate(); +void buf_pool_invalidate() noexcept; /*======================================================================== --------------------------- LOWER LEVEL ROUTINES ------------------------- @@ -393,27 +393,26 @@ if applicable. */ counter value in MONITOR_MODULE_BUF_PAGE. @param bpage buffer page whose read or write was completed @param read true=read, false=write */ -ATTRIBUTE_COLD void buf_page_monitor(const buf_page_t &bpage, bool read); +ATTRIBUTE_COLD void buf_page_monitor(const buf_page_t &bpage, bool read) + noexcept; /** Calculate aligned buffer pool size based on srv_buf_pool_chunk_unit, if needed. @param[in] size size in bytes @return aligned size */ -ulint -buf_pool_size_align( - ulint size); +ulint buf_pool_size_align(ulint size) noexcept; /** Verify that post encryption checksum match with the calculated checksum. This function should be called only if tablespace contains crypt data metadata. @param page page frame @param fsp_flags contents of FSP_SPACE_FLAGS @return whether the page is encrypted and valid */ -bool buf_page_verify_crypt_checksum(const byte *page, uint32_t fsp_flags); +bool buf_page_verify_crypt_checksum(const byte *page, uint32_t fsp_flags) noexcept; /** Calculate a ROW_FORMAT=COMPRESSED page checksum and update the page. @param[in,out] page page to update @param[in] size compressed page size */ -void buf_flush_update_zip_checksum(buf_frame_t* page, ulint size); +void buf_flush_update_zip_checksum(buf_frame_t* page, ulint size) noexcept; /** @brief The temporary memory structure. @@ -436,14 +435,15 @@ public: byte *out_buf; /** Release the slot */ - void release() { reserved.store(false, std::memory_order_relaxed); } + void release() noexcept { reserved.store(false, std::memory_order_relaxed); } /** Acquire the slot @return whether the slot was acquired */ - bool acquire() { return !reserved.exchange(true, std::memory_order_relaxed);} + bool acquire() noexcept + { return !reserved.exchange(true, std::memory_order_relaxed);} /** Allocate a buffer for encryption, decryption or decompression. */ - void allocate() + void allocate() noexcept { if (!crypt_buf) crypt_buf= static_cast @@ -591,7 +591,7 @@ public: } /** Initialize some more fields */ - void init(uint32_t state, page_id_t id) + void init(uint32_t state, page_id_t id) noexcept { ut_ad(state < REMOVE_HASH || state >= UNFIXED); ut_ad(!lock.is_locked_or_waiting()); @@ -617,47 +617,48 @@ public: MEM_MAKE_ADDRESSABLE(frame, srv_page_size); } public: - const page_id_t &id() const { return id_; } - uint32_t state() const { return zip.fix; } - static uint32_t buf_fix_count(uint32_t s) + const page_id_t &id() const noexcept { return id_; } + uint32_t state() const noexcept { return zip.fix; } + static uint32_t buf_fix_count(uint32_t s) noexcept { ut_ad(s >= FREED); return s < UNFIXED ? (s - FREED) : (~LRU_MASK & s); } uint32_t buf_fix_count() const { return buf_fix_count(state()); } /** Check if a file block is io-fixed. @param s state() @return whether s corresponds to an io-fixed block */ - static bool is_io_fixed(uint32_t s) + static bool is_io_fixed(uint32_t s) noexcept { ut_ad(s >= FREED); return s >= READ_FIX; } /** Check if a file block is read-fixed. @param s state() @return whether s corresponds to a read-fixed block */ - static bool is_read_fixed(uint32_t s) + static bool is_read_fixed(uint32_t s) noexcept { return is_io_fixed(s) && s < WRITE_FIX; } /** Check if a file block is write-fixed. @param s state() @return whether s corresponds to a write-fixed block */ - static bool is_write_fixed(uint32_t s) + static bool is_write_fixed(uint32_t s) noexcept { ut_ad(s >= FREED); return s >= WRITE_FIX; } /** @return whether this block is read or write fixed; read_complete() or write_complete() will always release the io-fix before releasing U-lock or X-lock */ - bool is_io_fixed() const { return is_io_fixed(state()); } + bool is_io_fixed() const noexcept { return is_io_fixed(state()); } /** @return whether this block is write fixed; write_complete() will always release the write-fix before releasing U-lock */ - bool is_write_fixed() const { return is_write_fixed(state()); } + bool is_write_fixed() const noexcept { return is_write_fixed(state()); } /** @return whether this block is read fixed */ - bool is_read_fixed() const { return is_read_fixed(state()); } + bool is_read_fixed() const noexcept { return is_read_fixed(state()); } /** @return if this belongs to buf_pool.unzip_LRU */ - bool belongs_to_unzip_LRU() const + bool belongs_to_unzip_LRU() const noexcept { return UNIV_LIKELY_NULL(zip.data) && frame; } - static bool is_freed(uint32_t s) { ut_ad(s >= FREED); return s < UNFIXED; } - bool is_freed() const { return is_freed(state()); } + static bool is_freed(uint32_t s) noexcept + { ut_ad(s >= FREED); return s < UNFIXED; } + bool is_freed() const noexcept { return is_freed(state()); } bool is_reinit() const { return !(~state() & REINIT); } - void set_reinit(uint32_t prev_state) + void set_reinit(uint32_t prev_state) noexcept { ut_ad(prev_state < READ_FIX); ut_d(const auto s=) zip.fix.fetch_add(REINIT - prev_state); @@ -665,7 +666,7 @@ public: ut_ad(s < prev_state + UNFIXED); } - uint32_t read_unfix(uint32_t s) + uint32_t read_unfix(uint32_t s) noexcept { ut_ad(lock.is_write_locked()); ut_ad(s == UNFIXED + 1 || s == REINIT + 1); @@ -675,7 +676,7 @@ public: return old_state + (s - READ_FIX); } - void set_freed(uint32_t prev_state, uint32_t count= 0) + void set_freed(uint32_t prev_state, uint32_t count= 0) noexcept { ut_ad(lock.is_write_locked()); ut_ad(prev_state >= UNFIXED); @@ -684,28 +685,28 @@ public: ut_ad(!((prev_state ^ s) & LRU_MASK)); } - inline void set_state(uint32_t s); - inline void set_corrupt_id(); + inline void set_state(uint32_t s) noexcept; + inline void set_corrupt_id() noexcept; /** @return the log sequence number of the oldest pending modification @retval 0 if the block is being removed from (or not in) buf_pool.flush_list @retval 1 if the block is in buf_pool.flush_list but not modified @retval 2 if the block belongs to the temporary tablespace and has unwritten changes */ - lsn_t oldest_modification() const { return oldest_modification_; } + lsn_t oldest_modification() const noexcept { return oldest_modification_; } /** @return the log sequence number of the oldest pending modification, @retval 0 if the block is definitely not in buf_pool.flush_list @retval 1 if the block is in buf_pool.flush_list but not modified @retval 2 if the block belongs to the temporary tablespace and has unwritten changes */ - lsn_t oldest_modification_acquire() const + lsn_t oldest_modification_acquire() const noexcept { return oldest_modification_.load(std::memory_order_acquire); } /** Set oldest_modification when adding to buf_pool.flush_list */ - inline void set_oldest_modification(lsn_t lsn); + inline void set_oldest_modification(lsn_t lsn) noexcept; /** Clear oldest_modification after removing from buf_pool.flush_list */ - inline void clear_oldest_modification(); + inline void clear_oldest_modification() noexcept; /** Reset the oldest_modification when marking a persistent page freed */ - void reset_oldest_modification() + void reset_oldest_modification() noexcept { ut_ad(oldest_modification() > 2); oldest_modification_.store(1, std::memory_order_release); @@ -716,21 +717,21 @@ public: @return whether the operation succeeded @retval DB_PAGE_CORRUPTED if the checksum or the page ID is incorrect @retval DB_DECRYPTION_FAILED if the page cannot be decrypted */ - dberr_t read_complete(const fil_node_t &node); + dberr_t read_complete(const fil_node_t &node) noexcept; /** Release a write fix after a page write was completed. @param persistent whether the page belongs to a persistent tablespace @param error whether an error may have occurred while writing @param state recently read state() value with the correct io-fix */ - void write_complete(bool persistent, bool error, uint32_t state); + void write_complete(bool persistent, bool error, uint32_t state) noexcept; /** Write a flushable page to a file or free a freeable block. @param space tablespace @return whether a page write was initiated and buf_pool.mutex released */ - bool flush(fil_space_t *space); + bool flush(fil_space_t *space) noexcept; /** Notify that a page in a temporary tablespace has been modified. */ - void set_temp_modified() + void set_temp_modified() noexcept { ut_ad(fsp_is_system_temporary(id().space())); ut_ad(in_file()); @@ -739,22 +740,22 @@ public: } /** Prepare to release a file page to buf_pool.free. */ - void free_file_page() + void free_file_page() noexcept { - ut_ad((zip.fix.fetch_sub(REMOVE_HASH - MEMORY)) == REMOVE_HASH); + assert((zip.fix.fetch_sub(REMOVE_HASH - MEMORY)) == REMOVE_HASH); /* buf_LRU_block_free_non_file_page() asserts !oldest_modification() */ ut_d(oldest_modification_= 0;) id_= page_id_t(~0ULL); } - void fix_on_recovery() + void fix_on_recovery() noexcept { ut_d(const auto f=) zip.fix.fetch_sub(READ_FIX - UNFIXED - 1); ut_ad(f >= READ_FIX); ut_ad(f < WRITE_FIX); } - uint32_t fix(uint32_t count= 1) + uint32_t fix(uint32_t count= 1) noexcept { ut_ad(count); ut_ad(count < REINIT); @@ -764,7 +765,7 @@ public: return f; } - uint32_t unfix() + uint32_t unfix() noexcept { uint32_t f= zip.fix.fetch_sub(1); ut_ad(f > FREED); @@ -773,20 +774,20 @@ public: } /** @return the physical size, in bytes */ - ulint physical_size() const + ulint physical_size() const noexcept { return zip.ssize ? (UNIV_ZIP_SIZE_MIN >> 1) << zip.ssize : srv_page_size; } /** @return the ROW_FORMAT=COMPRESSED physical size, in bytes @retval 0 if not compressed */ - ulint zip_size() const + ulint zip_size() const noexcept { return zip.ssize ? (UNIV_ZIP_SIZE_MIN >> 1) << zip.ssize : 0; } /** @return the byte offset of the page within a file */ - os_offset_t physical_offset() const + os_offset_t physical_offset() const noexcept { os_offset_t o= id().page_no(); return zip.ssize @@ -795,18 +796,18 @@ public: } /** @return whether the block is mapped to a data file */ - bool in_file() const { return state() >= FREED; } + bool in_file() const noexcept { return state() >= FREED; } /** @return whether the block can be relocated in memory. The block can be dirty, but it must not be I/O-fixed or bufferfixed. */ - inline bool can_relocate() const; + inline bool can_relocate() const noexcept; /** @return whether the block has been flagged old in buf_pool.LRU */ - inline bool is_old() const; + inline bool is_old() const noexcept; /** Set whether a block is old in buf_pool.LRU */ - inline void set_old(bool old); + inline void set_old(bool old) noexcept; /** Flag a page accessed in buf_pool @return whether this is not the first access */ - bool set_accessed() + bool set_accessed() noexcept { if (is_accessed()) return true; access_time= static_cast(ut_time_ms()); @@ -814,7 +815,8 @@ public: } /** @return ut_time_ms() at the time of first access of a block in buf_pool @retval 0 if not accessed */ - unsigned is_accessed() const { ut_ad(in_file()); return access_time; } + unsigned is_accessed() const noexcept + { ut_ad(in_file()); return access_time; } }; /** The buffer control block structure */ @@ -944,21 +946,22 @@ struct buf_block_t{ # define assert_block_ahi_empty_on_init(block) /* nothing */ # define assert_block_ahi_valid(block) /* nothing */ #endif /* BTR_CUR_HASH_ADAPT */ - void fix() { page.fix(); } - uint32_t unfix() { return page.unfix(); } + void fix() noexcept { page.fix(); } + uint32_t unfix() noexcept { return page.unfix(); } /** @return the physical size, in bytes */ - ulint physical_size() const { return page.physical_size(); } + ulint physical_size() const noexcept { return page.physical_size(); } /** @return the ROW_FORMAT=COMPRESSED physical size, in bytes @retval 0 if not compressed */ - ulint zip_size() const { return page.zip_size(); } + ulint zip_size() const noexcept { return page.zip_size(); } /** Initialize the block. @param page_id page identifier @param zip_size ROW_FORMAT=COMPRESSED page size, or 0 @param state initial state() */ - void initialise(const page_id_t page_id, ulint zip_size, uint32_t state); + void initialise(const page_id_t page_id, ulint zip_size, uint32_t state) + noexcept; }; /**********************************************************************//** @@ -979,11 +982,12 @@ public: virtual ~HazardPointer() = default; /** @return current value */ - buf_page_t *get() const { mysql_mutex_assert_owner(m_mutex); return m_hp; } + buf_page_t *get() const noexcept + { mysql_mutex_assert_owner(m_mutex); return m_hp; } /** Set current value @param bpage buffer block to be set as hp */ - void set(buf_page_t *bpage) + void set(buf_page_t *bpage) noexcept { mysql_mutex_assert_owner(m_mutex); ut_ad(!bpage || bpage->in_file()); @@ -993,13 +997,13 @@ public: /** Checks if a bpage is the hp @param bpage buffer block to be compared @return true if it is hp */ - bool is_hp(const buf_page_t *bpage) const + bool is_hp(const buf_page_t *bpage) const noexcept { mysql_mutex_assert_owner(m_mutex); return bpage == m_hp; } /** Adjust the value of hp. This happens when some other thread working on the same list attempts to remove the hp from the list. */ - virtual void adjust(const buf_page_t*) = 0; + virtual void adjust(const buf_page_t*) noexcept = 0; #ifdef UNIV_DEBUG /** mutex that protects access to the m_hp. */ @@ -1022,7 +1026,7 @@ public: remove the hp from the list. @param bpage buffer block to be compared */ MY_ATTRIBUTE((nonnull)) - void adjust(const buf_page_t *bpage) override + void adjust(const buf_page_t *bpage) noexcept override { /* We only support reverse traversal for now. */ if (is_hp(bpage)) @@ -1042,7 +1046,7 @@ public: remove the hp from the list. @param bpage buffer block to be compared */ MY_ATTRIBUTE((nonnull)) - void adjust(const buf_page_t *bpage) override + void adjust(const buf_page_t *bpage) noexcept override { /** We only support reverse traversal for now. */ if (is_hp(bpage)) @@ -1064,7 +1068,7 @@ public: too deep into the LRU list it resets the value to the tail of the LRU list. @return buf_page_t from where to start scan. */ - inline buf_page_t *start(); + inline buf_page_t *start() noexcept; }; /** Struct that is embedded in the free zip blocks */ @@ -1091,7 +1095,7 @@ struct buf_buddy_free_t { protected by buf_pool.mutex unless otherwise noted. */ struct buf_pool_stat_t{ /** Initialize the counters */ - void init() { memset((void*) this, 0, sizeof *this); } + void init() noexcept { memset((void*) this, 0, sizeof *this); } ib_counter_t n_page_gets; /*!< number of page gets performed; @@ -1155,22 +1159,23 @@ class buf_pool_t static map *map_ref; /** @return the memory size bytes. */ - size_t mem_size() const { return mem_pfx.m_size; } + size_t mem_size() const noexcept { return mem_pfx.m_size; } /** Register the chunk */ - void reg() { map_reg->emplace(map::value_type(blocks->page.frame, this)); } + void reg() noexcept + { map_reg->emplace(map::value_type(blocks->page.frame, this)); } /** Allocate a chunk of buffer frames. @param bytes requested size @return whether the allocation succeeded */ - inline bool create(size_t bytes); + inline bool create(size_t bytes) noexcept; #ifdef UNIV_DEBUG /** Find a block that points to a ROW_FORMAT=COMPRESSED page @param data pointer to the start of a ROW_FORMAT=COMPRESSED page frame @return the block @retval nullptr if not found */ - const buf_block_t *contains_zip(const void *data) const + const buf_block_t *contains_zip(const void *data) const noexcept { const buf_block_t *block= blocks; for (auto i= size; i--; block++) @@ -1182,7 +1187,7 @@ class buf_pool_t /** Check that all blocks are in a replaceable state. @return address of a non-free block @retval nullptr if all freed */ - inline const buf_block_t *not_freed() const; + inline const buf_block_t *not_freed() const noexcept; #endif /* UNIV_DEBUG */ }; public: @@ -1195,13 +1200,13 @@ public: private: /** Withdraw blocks from the buffer pool until meeting withdraw_target. @return whether retry is needed */ - inline bool withdraw_blocks(); + inline bool withdraw_blocks() noexcept; /** Determine if a pointer belongs to a buf_block_t. It can be a pointer to the buf_block_t itself or a member of it. @param ptr a pointer that will not be dereferenced @return whether the ptr belongs to a buf_block_t struct */ - bool is_block_field(const void *ptr) const + bool is_block_field(const void *ptr) const noexcept { const chunk_t *chunk= chunks; const chunk_t *const echunk= chunk + ut_min(n_chunks, n_chunks_new); @@ -1218,17 +1223,17 @@ private: /** Try to reallocate a control block. @param block control block to reallocate @return whether the reallocation succeeded */ - inline bool realloc(buf_block_t *block); + inline bool realloc(buf_block_t *block) noexcept; public: - bool is_initialised() const { return chunks != nullptr; } + bool is_initialised() const noexcept { return chunks != nullptr; } /** Create the buffer pool. @return whether the creation failed */ bool create(); /** Clean up after successful create() */ - void close(); + void close() noexcept; /** Resize from srv_buf_pool_old_size to srv_buf_pool_size. */ inline void resize(); @@ -1239,13 +1244,13 @@ public: #endif /** @return whether resize() is in progress */ - bool resize_in_progress() const + bool resize_in_progress() const noexcept { return UNIV_UNLIKELY(resizing.load(std::memory_order_relaxed)); } /** @return the current size in blocks */ - size_t get_n_pages() const + size_t get_n_pages() const noexcept { ut_ad(is_initialised()); size_t size= 0; @@ -1257,7 +1262,7 @@ public: /** Determine whether a frame is intended to be withdrawn during resize(). @param ptr pointer within a buf_page_t::frame @return whether the frame will be withdrawn */ - bool will_be_withdrawn(const byte *ptr) const + bool will_be_withdrawn(const byte *ptr) const noexcept { ut_ad(n_chunks_new < n_chunks); #ifdef SAFE_MUTEX @@ -1277,7 +1282,7 @@ public: /** Determine whether a block is intended to be withdrawn during resize(). @param bpage buffer pool block @return whether the frame will be withdrawn */ - bool will_be_withdrawn(const buf_page_t &bpage) const + bool will_be_withdrawn(const buf_page_t &bpage) const noexcept { ut_ad(n_chunks_new < n_chunks); #ifdef SAFE_MUTEX @@ -1308,7 +1313,7 @@ public: @param data pointer to the start of a ROW_FORMAT=COMPRESSED page frame @return the block @retval nullptr if not found */ - const buf_block_t *contains_zip(const void *data) const + const buf_block_t *contains_zip(const void *data) const noexcept { mysql_mutex_assert_owner(&mutex); for (const chunk_t *chunk= chunks, * const end= chunks + n_chunks; @@ -1319,24 +1324,24 @@ public: } /** Assert that all buffer pool pages are in a replaceable state */ - void assert_all_freed(); + void assert_all_freed() noexcept; #endif /* UNIV_DEBUG */ #ifdef BTR_CUR_HASH_ADAPT /** Clear the adaptive hash index on all pages in the buffer pool. */ - inline void clear_hash_index(); + inline void clear_hash_index() noexcept; /** Get a buffer block from an adaptive hash index pointer. This function does not return if the block is not identified. @param ptr pointer to within a page frame @return pointer to block, never NULL */ - inline buf_block_t *block_from_ahi(const byte *ptr) const; + inline buf_block_t *block_from_ahi(const byte *ptr) const noexcept; #endif /* BTR_CUR_HASH_ADAPT */ /** @return the smallest oldest_modification lsn for any page @retval empty_lsn if all modified persistent pages have been flushed */ - lsn_t get_oldest_modification(lsn_t empty_lsn) + lsn_t get_oldest_modification(lsn_t empty_lsn) noexcept { mysql_mutex_assert_owner(&flush_list_mutex); while (buf_page_t *bpage= UT_LIST_GET_LAST(flush_list)) @@ -1356,7 +1361,7 @@ public: /** Determine if a buffer block was created by chunk_t::create(). @param block block descriptor (not dereferenced) @return whether block has been created by chunk_t::create() */ - bool is_uncompressed(const buf_block_t *block) const + bool is_uncompressed(const buf_block_t *block) const noexcept { return is_block_field(reinterpret_cast(block)); } @@ -1386,29 +1391,28 @@ public: @retval -1 if c=FIX_NOWAIT and buffer-fixing would require waiting @retval nullptr if the undo page was corrupted or freed */ buf_block_t *page_fix(const page_id_t id, dberr_t *err, - page_fix_conflicts c); + page_fix_conflicts c) noexcept; - buf_block_t *page_fix(const page_id_t id) + buf_block_t *page_fix(const page_id_t id) noexcept { return page_fix(id, nullptr, FIX_WAIT_READ); } - /** Decompress a page and relocate the block descriptor @param b buffer-fixed compressed-only ROW_FORMAT=COMPRESSED page @param chain hash table chain for b->id().fold() @return the decompressed block, x-latched and read-fixed @retval nullptr if the decompression failed (b->unfix() will be invoked) */ ATTRIBUTE_COLD __attribute__((nonnull, warn_unused_result)) - buf_block_t *unzip(buf_page_t *b, hash_chain &chain); + buf_block_t *unzip(buf_page_t *b, hash_chain &chain) noexcept; /** @return whether the buffer pool contains a page @param page_id page identifier @param chain hash table chain for page_id.fold() */ TRANSACTIONAL_TARGET - bool page_hash_contains(const page_id_t page_id, hash_chain &chain); + bool page_hash_contains(const page_id_t page_id, hash_chain &chain) noexcept; /** @return whether less than 1/4 of the buffer pool is available */ TPOOL_SUPPRESS_TSAN - bool running_out() const + bool running_out() const noexcept { return !recv_recovery_is_on() && UT_LIST_GET_LEN(free) + UT_LIST_GET_LEN(LRU) < @@ -1416,26 +1420,26 @@ public: } /** @return whether the buffer pool is running low */ - bool need_LRU_eviction() const; + bool need_LRU_eviction() const noexcept; /** @return whether the buffer pool is shrinking */ - inline bool is_shrinking() const + inline bool is_shrinking() const noexcept { return n_chunks_new < n_chunks; } #ifdef UNIV_DEBUG /** Validate the buffer pool. */ - void validate(); + void validate() noexcept; #endif /* UNIV_DEBUG */ #if defined UNIV_DEBUG_PRINT || defined UNIV_DEBUG /** Write information of the buf_pool to the error log. */ - void print(); + void print() noexcept; #endif /* UNIV_DEBUG_PRINT || UNIV_DEBUG */ /** Remove a block from the LRU list. @return the predecessor in the LRU list */ - buf_page_t *LRU_remove(buf_page_t *bpage) + buf_page_t *LRU_remove(buf_page_t *bpage) noexcept { mysql_mutex_assert_owner(&mutex); ut_ad(bpage->in_LRU_list); @@ -1503,15 +1507,16 @@ public: /** Create the hash table. @param n the lower bound of n_cells */ - void create(ulint n); + void create(ulint n) noexcept; /** Free the hash table. */ - void free() { aligned_free(array); array= nullptr; } + void free() noexcept { aligned_free(array); array= nullptr; } /** @return the index of an array element */ - ulint calc_hash(ulint fold) const { return calc_hash(fold, n_cells); } + ulint calc_hash(ulint fold) const noexcept + { return calc_hash(fold, n_cells); } /** @return raw array index converted to padded index */ - static ulint pad(ulint h) + static ulint pad(ulint h) noexcept { ulint latches= h / ELEMENTS_PER_LATCH; ulint empty_slots= latches * EMPTY_SLOTS_PER_LATCH; @@ -1525,7 +1530,7 @@ public: } public: /** @return the latch covering a hash table chain */ - static page_hash_latch &lock_get(hash_chain &chain) + static page_hash_latch &lock_get(hash_chain &chain) noexcept { static_assert(!((ELEMENTS_PER_LATCH + 1) & ELEMENTS_PER_LATCH), "must be one less than a power of 2"); @@ -1540,7 +1545,7 @@ public: { return array[calc_hash(fold, n_cells)]; } /** Append a block descriptor to a hash bucket chain. */ - void append(hash_chain &chain, buf_page_t *bpage) + void append(hash_chain &chain, buf_page_t *bpage) noexcept { ut_ad(!bpage->in_page_hash); ut_ad(!bpage->hash); @@ -1555,7 +1560,7 @@ public: } /** Remove a block descriptor from a hash bucket chain. */ - void remove(hash_chain &chain, buf_page_t *bpage) + void remove(hash_chain &chain, buf_page_t *bpage) noexcept { ut_ad(bpage->in_page_hash); buf_page_t **prev= &chain.first; @@ -1571,6 +1576,7 @@ public: /** Replace a block descriptor with another. */ void replace(hash_chain &chain, buf_page_t *old, buf_page_t *bpage) + noexcept { ut_ad(old->in_page_hash); ut_ad(bpage->in_page_hash); @@ -1587,13 +1593,14 @@ public: } /** Look up a page in a hash bucket chain. */ - inline buf_page_t *get(const page_id_t id, const hash_chain &chain) const; + inline buf_page_t *get(const page_id_t id, const hash_chain &chain) const + noexcept; /** Exclusively aqcuire all latches */ - inline void write_lock_all(); + inline void write_lock_all() noexcept; /** Release all latches */ - inline void write_unlock_all(); + inline void write_unlock_all() noexcept; }; /** Buffer pool mutex */ @@ -1666,31 +1673,31 @@ public: pthread_cond_t done_flush_list; /** @return number of pending LRU flush */ - unsigned n_flush() const + unsigned n_flush() const noexcept { mysql_mutex_assert_owner(&flush_list_mutex); return page_cleaner_status / LRU_FLUSH; } /** Increment the number of pending LRU flush */ - inline void n_flush_inc(); + inline void n_flush_inc() noexcept; /** Decrement the number of pending LRU flush */ - inline void n_flush_dec(); + inline void n_flush_dec() noexcept; /** @return whether flush_list flushing is active */ - bool flush_list_active() const + bool flush_list_active() const noexcept { mysql_mutex_assert_owner(&flush_list_mutex); return page_cleaner_status & FLUSH_LIST_ACTIVE; } - void flush_list_set_active() + void flush_list_set_active() noexcept { ut_ad(!flush_list_active()); page_cleaner_status+= FLUSH_LIST_ACTIVE; } - void flush_list_set_inactive() + void flush_list_set_inactive() noexcept { ut_ad(flush_list_active()); page_cleaner_status-= FLUSH_LIST_ACTIVE; @@ -1704,7 +1711,7 @@ public: } /** @return whether the page cleaner may be initiating writes */ - bool page_cleaner_active() const + bool page_cleaner_active() const noexcept { mysql_mutex_assert_owner(&flush_list_mutex); static_assert(PAGE_CLEANER_IDLE == 1, "efficiency"); @@ -1713,10 +1720,10 @@ public: /** Wake up the page cleaner if needed. @param for_LRU whether to wake up for LRU eviction */ - void page_cleaner_wakeup(bool for_LRU= false); + void page_cleaner_wakeup(bool for_LRU= false) noexcept; /** Register whether an explicit wakeup of the page cleaner is needed */ - void page_cleaner_set_idle(bool deep_sleep) + void page_cleaner_set_idle(bool deep_sleep) noexcept { mysql_mutex_assert_owner(&flush_list_mutex); page_cleaner_status= (page_cleaner_status & ~PAGE_CLEANER_IDLE) | @@ -1724,7 +1731,7 @@ public: } /** Update server last activity count */ - void update_last_activity_count(ulint activity_count) + void update_last_activity_count(ulint activity_count) noexcept { mysql_mutex_assert_owner(&flush_list_mutex); last_activity_count= activity_count; @@ -1805,7 +1812,7 @@ public: #endif /** Reserve a buffer. */ - buf_tmp_buffer_t *io_buf_reserve(bool wait_for_reads) + buf_tmp_buffer_t *io_buf_reserve(bool wait_for_reads) noexcept { return io_buf.reserve(wait_for_reads); } /** Remove a block from flush_list. @@ -1828,7 +1835,7 @@ public: ATTRIBUTE_COLD void release_freed_page(buf_page_t *bpage) noexcept; /** Issue a warning that we could not free up buffer pool pages. */ - ATTRIBUTE_COLD void LRU_warn(); + ATTRIBUTE_COLD void LRU_warn() noexcept; private: /** Temporary memory for page_compressed and encrypted I/O */ @@ -1839,12 +1846,12 @@ private: /** array of slots */ buf_tmp_buffer_t *slots; - void create(ulint n_slots); + void create(ulint n_slots) noexcept; - void close(); + void close() noexcept; /** Reserve a buffer */ - buf_tmp_buffer_t *reserve(bool wait_for_reads); + buf_tmp_buffer_t *reserve(bool wait_for_reads) noexcept; } io_buf; /** whether resize() is in the critical path */ @@ -1856,7 +1863,7 @@ extern buf_pool_t buf_pool; inline buf_page_t *buf_pool_t::page_hash_table::get(const page_id_t id, const hash_chain &chain) - const + const noexcept { #ifdef SAFE_MUTEX DBUG_ASSERT(mysql_mutex_is_owner(&buf_pool.mutex) || @@ -1873,21 +1880,21 @@ inline buf_page_t *buf_pool_t::page_hash_table::get(const page_id_t id, } #ifdef SUX_LOCK_GENERIC -inline void page_hash_latch::lock_shared() +inline void page_hash_latch::lock_shared() noexcept { mysql_mutex_assert_not_owner(&buf_pool.mutex); if (!read_trylock()) read_lock_wait(); } -inline void page_hash_latch::lock() +inline void page_hash_latch::lock() noexcept { if (!write_trylock()) write_lock_wait(); } #endif /* SUX_LOCK_GENERIC */ -inline void buf_page_t::set_state(uint32_t s) +inline void buf_page_t::set_state(uint32_t s) noexcept { mysql_mutex_assert_owner(&buf_pool.mutex); ut_ad(s <= REMOVE_HASH || s >= UNFIXED); @@ -1896,7 +1903,7 @@ inline void buf_page_t::set_state(uint32_t s) zip.fix= s; } -inline void buf_page_t::set_corrupt_id() +inline void buf_page_t::set_corrupt_id() noexcept { #ifdef UNIV_DEBUG switch (oldest_modification()) { @@ -1922,7 +1929,7 @@ inline void buf_page_t::set_corrupt_id() } /** Set oldest_modification when adding to buf_pool.flush_list */ -inline void buf_page_t::set_oldest_modification(lsn_t lsn) +inline void buf_page_t::set_oldest_modification(lsn_t lsn) noexcept { mysql_mutex_assert_owner(&buf_pool.flush_list_mutex); ut_ad(oldest_modification() <= 1); @@ -1931,7 +1938,7 @@ inline void buf_page_t::set_oldest_modification(lsn_t lsn) } /** Clear oldest_modification after removing from buf_pool.flush_list */ -inline void buf_page_t::clear_oldest_modification() +inline void buf_page_t::clear_oldest_modification() noexcept { #ifdef SAFE_MUTEX if (oldest_modification() != 2) @@ -1950,7 +1957,7 @@ inline void buf_page_t::clear_oldest_modification() /** @return whether the block can be relocated in memory. The block can be dirty, but it must not be I/O-fixed or bufferfixed. */ -inline bool buf_page_t::can_relocate() const +inline bool buf_page_t::can_relocate() const noexcept { mysql_mutex_assert_owner(&buf_pool.mutex); const auto f= state(); @@ -1961,7 +1968,7 @@ inline bool buf_page_t::can_relocate() const } /** @return whether the block has been flagged old in buf_pool.LRU */ -inline bool buf_page_t::is_old() const +inline bool buf_page_t::is_old() const noexcept { mysql_mutex_assert_owner(&buf_pool.mutex); ut_ad(in_file()); @@ -1970,7 +1977,7 @@ inline bool buf_page_t::is_old() const } /** Set whether a block is old in buf_pool.LRU */ -inline void buf_page_t::set_old(bool old) +inline void buf_page_t::set_old(bool old) noexcept { mysql_mutex_assert_owner(&buf_pool.mutex); ut_ad(in_LRU_list); @@ -2044,7 +2051,7 @@ REMOVE_HASH => NOT_USED (if and only if !oldest_modification()) too deep into the LRU list it resets the value to the tail of the LRU list. @return buf_page_t from where to start scan. */ -inline buf_page_t *LRUItr::start() +inline buf_page_t *LRUItr::start() noexcept { mysql_mutex_assert_owner(m_mutex); @@ -2057,12 +2064,12 @@ inline buf_page_t *LRUItr::start() #ifdef UNIV_DEBUG /** Functor to validate the LRU list. */ struct CheckInLRUList { - void operator()(const buf_page_t* elem) const + void operator()(const buf_page_t* elem) const noexcept { ut_a(elem->in_LRU_list); } - static void validate() + static void validate() noexcept { ut_list_validate(buf_pool.LRU, CheckInLRUList()); } @@ -2070,25 +2077,25 @@ struct CheckInLRUList { /** Functor to validate the LRU list. */ struct CheckInFreeList { - void operator()(const buf_page_t* elem) const + void operator()(const buf_page_t* elem) const noexcept { ut_a(elem->in_free_list); } - static void validate() + static void validate() noexcept { ut_list_validate(buf_pool.free, CheckInFreeList()); } }; struct CheckUnzipLRUAndLRUList { - void operator()(const buf_block_t* elem) const + void operator()(const buf_block_t* elem) const noexcept { ut_a(elem->page.in_LRU_list); ut_a(elem->in_unzip_LRU_list); } - static void validate() + static void validate() noexcept { ut_list_validate(buf_pool.unzip_LRU, CheckUnzipLRUAndLRUList()); diff --git a/storage/innobase/include/buf0dblwr.h b/storage/innobase/include/buf0dblwr.h index f912775de59..d7fb1c609ee 100644 --- a/storage/innobase/include/buf0dblwr.h +++ b/storage/innobase/include/buf0dblwr.h @@ -92,30 +92,30 @@ public: private: /** Initialise the persistent storage of the doublewrite buffer. @param header doublewrite page header in the TRX_SYS page */ - inline void init(const byte *header); + inline void init(const byte *header) noexcept; /** Flush possible buffered writes to persistent storage. */ - bool flush_buffered_writes(const ulint size); + bool flush_buffered_writes(const ulint size) noexcept; public: /** Initialise the doublewrite buffer data structures. */ - void init(); + void init() noexcept; /** Create or restore the doublewrite buffer in the TRX_SYS page. @return whether the operation succeeded */ - bool create(); + bool create() noexcept; /** Free the doublewrite buffer. */ - void close(); + void close() noexcept; /** Acquire the mutex */ - void lock() { mysql_mutex_lock(&mutex); } + void lock() noexcept { mysql_mutex_lock(&mutex); } /** @return the number of completed batches */ - ulint batches() const + ulint batches() const noexcept { mysql_mutex_assert_owner(&mutex); return writes_completed; } /** @return the number of final pages written */ - ulint written() const + ulint written() const noexcept { mysql_mutex_assert_owner(&mutex); return pages_written; } /** Release the mutex */ - void unlock() { mysql_mutex_unlock(&mutex); } + void unlock() noexcept { mysql_mutex_unlock(&mutex); } /** Initialize the doublewrite buffer memory structure on recovery. If we are upgrading from a version before MySQL 4.1, then this @@ -126,30 +126,30 @@ public: @param file File handle @param path Path name of file @return DB_SUCCESS or error code */ - dberr_t init_or_load_pages(pfs_os_file_t file, const char *path); + dberr_t init_or_load_pages(pfs_os_file_t file, const char *path) noexcept; /** Process and remove the double write buffer pages for all tablespaces. */ - void recover(); + void recover() noexcept; /** Update the doublewrite buffer on data page write completion. */ - void write_completed(); + void write_completed() noexcept; /** Flush possible buffered writes to persistent storage. It is very important to call this function after a batch of writes has been posted, and also when we may have to wait for a page latch! Otherwise a deadlock of threads can occur. */ - void flush_buffered_writes(); + void flush_buffered_writes() noexcept; /** Update the doublewrite buffer on write batch completion @param request the completed batch write request */ - void flush_buffered_writes_completed(const IORequest &request); + void flush_buffered_writes_completed(const IORequest &request) noexcept; /** Schedule a page write. If the doublewrite memory buffer is full, flush_buffered_writes() will be invoked to make space. @param request asynchronous write request @param size payload size in bytes */ - void add_to_batch(const IORequest &request, size_t size); + void add_to_batch(const IORequest &request, size_t size) noexcept; /** Determine whether the doublewrite buffer has been created */ - bool is_created() const + bool is_created() const noexcept { return UNIV_LIKELY(block1 != page_id_t(0, 0)); } /** @return whether the doublewrite buffer is in use */ @@ -166,7 +166,7 @@ public: } /** @return whether a page identifier is part of the doublewrite buffer */ - bool is_inside(const page_id_t id) const + bool is_inside(const page_id_t id) const noexcept { if (!is_created()) return false; @@ -178,7 +178,7 @@ public: } /** Wait for flush_buffered_writes() to be fully completed */ - void wait_flush_buffered_writes() + void wait_flush_buffered_writes() noexcept { mysql_mutex_lock(&mutex); while (batch_running) diff --git a/storage/innobase/include/buf0flu.h b/storage/innobase/include/buf0flu.h index cc32a38a4ef..5d01d38ba21 100644 --- a/storage/innobase/include/buf0flu.h +++ b/storage/innobase/include/buf0flu.h @@ -44,27 +44,22 @@ deleting the data file of that tablespace. The pages still remain a part of LRU and are evicted from the list as they age towards the tail of the LRU. @param id tablespace identifier */ -void buf_flush_remove_pages(uint32_t id); +void buf_flush_remove_pages(uint32_t id) noexcept; -/*******************************************************************//** -Relocates a buffer control block on the flush_list. -Note that it is assumed that the contents of bpage has already been -copied to dpage. */ +/** Relocate a buffer control block in buf_pool.flush_list. +@param bpage control block being moved +@param dpage destination block; the page contents has already been copied */ ATTRIBUTE_COLD -void -buf_flush_relocate_on_flush_list( -/*=============================*/ - buf_page_t* bpage, /*!< in/out: control block being moved */ - buf_page_t* dpage); /*!< in/out: destination block */ - +void buf_flush_relocate_on_flush_list(buf_page_t *bpage, buf_page_t *dpage) + noexcept; /** Complete write of a file page from buf_pool. @param request write request @param error whether the write may have failed */ -void buf_page_write_complete(const IORequest &request, bool error); +void buf_page_write_complete(const IORequest &request, bool error) noexcept; /** Assign the full crc32 checksum for non-compressed page. @param[in,out] page page to be updated */ -void buf_flush_assign_full_crc32_checksum(byte* page); +void buf_flush_assign_full_crc32_checksum(byte* page) noexcept; /** Initialize a page for writing to the tablespace. @param[in] block buffer block; NULL if bypassing the buffer pool @@ -76,40 +71,41 @@ buf_flush_init_for_writing( const buf_block_t* block, byte* page, void* page_zip_, - bool use_full_checksum); + bool use_full_checksum) noexcept; /** Try to flush dirty pages that belong to a given tablespace. @param space tablespace @param n_flushed number of pages written @return whether the flush for some pages might not have been initiated */ bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed= nullptr) + noexcept MY_ATTRIBUTE((warn_unused_result)); /** Wait until a LRU flush batch ends. */ -void buf_flush_wait_LRU_batch_end(); +void buf_flush_wait_LRU_batch_end() noexcept; /** Wait until all persistent pages are flushed up to a limit. @param sync_lsn buf_pool.get_oldest_modification(LSN_MAX) to wait for */ -ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn); +ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) noexcept; /** Initiate more eager page flushing if the log checkpoint age is too old. @param lsn buf_pool.get_oldest_modification(LSN_MAX) target @param furious true=furious flushing, false=limit to innodb_io_capacity */ -ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious); +ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious) noexcept; /** Initialize page_cleaner. */ -ATTRIBUTE_COLD void buf_flush_page_cleaner_init(); +ATTRIBUTE_COLD void buf_flush_page_cleaner_init() noexcept; /** Flush the buffer pool on shutdown. */ -ATTRIBUTE_COLD void buf_flush_buffer_pool(); +ATTRIBUTE_COLD void buf_flush_buffer_pool() noexcept; #ifdef UNIV_DEBUG /** Validate the flush list. */ -void buf_flush_validate(); +void buf_flush_validate() noexcept; #endif /* UNIV_DEBUG */ /** Synchronously flush dirty blocks during recv_sys_t::apply(). NOTE: The calling thread is not allowed to hold any buffer page latches! */ -void buf_flush_sync_batch(lsn_t lsn); +void buf_flush_sync_batch(lsn_t lsn) noexcept; /** Synchronously flush dirty blocks. NOTE: The calling thread is not allowed to hold any buffer page latches! */ -void buf_flush_sync(); +void buf_flush_sync() noexcept; diff --git a/storage/innobase/include/buf0rea.h b/storage/innobase/include/buf0rea.h index 78537606f2d..b11feed36ce 100644 --- a/storage/innobase/include/buf0rea.h +++ b/storage/innobase/include/buf0rea.h @@ -51,7 +51,7 @@ released by the i/o-handler thread. @param[in] page_id page id @param[in] zip_size ROW_FORMAT=COMPRESSED page size, or 0 */ void buf_read_page_background(fil_space_t *space, const page_id_t page_id, - ulint zip_size) + ulint zip_size) noexcept MY_ATTRIBUTE((nonnull)); /** Applies a random read-ahead in buf_pool if there are at least a threshold @@ -63,7 +63,7 @@ end up waiting for these latches! @param[in] page_id page id of a page which the current thread wants to access @return number of page read requests issued */ -ulint buf_read_ahead_random(const page_id_t page_id); +ulint buf_read_ahead_random(const page_id_t page_id) noexcept; /** Applies linear read-ahead if in the buf_pool the page is a border page of a linear read-ahead area and all the pages in the area have been accessed. @@ -86,7 +86,7 @@ function must be written such that it cannot end up waiting for these latches! @param[in] page_id page id; see NOTE 3 above @return number of page read requests issued */ -ulint buf_read_ahead_linear(const page_id_t page_id); +ulint buf_read_ahead_linear(const page_id_t page_id) noexcept; /** Schedule a page for recovery. @param space tablespace @@ -94,4 +94,4 @@ ulint buf_read_ahead_linear(const page_id_t page_id); @param recs log records @param init_lsn page initialization, or 0 if the page needs to be read */ void buf_read_recover(fil_space_t *space, const page_id_t page_id, - page_recv_t &recs, lsn_t init_lsn); + page_recv_t &recs, lsn_t init_lsn) noexcept; diff --git a/storage/innobase/include/buf0types.h b/storage/innobase/include/buf0types.h index 6c13f5ee308..0f00d416ae3 100644 --- a/storage/innobase/include/buf0types.h +++ b/storage/innobase/include/buf0types.h @@ -54,12 +54,12 @@ enum srv_checksum_algorithm_t { SRV_CHECKSUM_ALGORITHM_STRICT_FULL_CRC32 }; -inline bool is_checksum_strict(srv_checksum_algorithm_t algo) +inline bool is_checksum_strict(srv_checksum_algorithm_t algo) noexcept { return algo == SRV_CHECKSUM_ALGORITHM_STRICT_CRC32; } -inline bool is_checksum_strict(ulint algo) +inline bool is_checksum_strict(ulint algo) noexcept { return algo == SRV_CHECKSUM_ALGORITHM_STRICT_CRC32; } @@ -96,31 +96,31 @@ public: m_id(uint64_t{space} << 32 | page_no) {} constexpr page_id_t(uint64_t id) : m_id(id) {} - constexpr bool operator==(const page_id_t& rhs) const + constexpr bool operator==(const page_id_t& rhs) const noexcept { return m_id == rhs.m_id; } - constexpr bool operator!=(const page_id_t& rhs) const + constexpr bool operator!=(const page_id_t& rhs) const noexcept { return m_id != rhs.m_id; } - constexpr bool operator<(const page_id_t& rhs) const + constexpr bool operator<(const page_id_t& rhs) const noexcept { return m_id < rhs.m_id; } - constexpr bool operator>(const page_id_t& rhs) const + constexpr bool operator>(const page_id_t& rhs) const noexcept { return m_id > rhs.m_id; } - constexpr bool operator<=(const page_id_t& rhs) const + constexpr bool operator<=(const page_id_t& rhs) const noexcept { return m_id <= rhs.m_id; } - constexpr bool operator>=(const page_id_t& rhs) const + constexpr bool operator>=(const page_id_t& rhs) const noexcept { return m_id >= rhs.m_id; } - page_id_t &operator--() { ut_ad(page_no()); m_id--; return *this; } - page_id_t &operator++() + page_id_t &operator--() noexcept { ut_ad(page_no()); m_id--; return *this; } + page_id_t &operator++() noexcept { ut_ad(page_no() < 0xFFFFFFFFU); m_id++; return *this; } - page_id_t operator-(uint32_t i) const + page_id_t operator-(uint32_t i) const noexcept { ut_ad(page_no() >= i); return page_id_t(m_id - i); } - page_id_t operator+(uint32_t i) const + page_id_t operator+(uint32_t i) const noexcept { ut_ad(page_no() < ~i); return page_id_t(m_id + i); @@ -128,28 +128,30 @@ public: /** Retrieve the tablespace id. @return tablespace id */ - constexpr uint32_t space() const { return static_cast(m_id >> 32); } + constexpr uint32_t space() const noexcept + { return static_cast(m_id >> 32); } /** Retrieve the page number. @return page number */ - constexpr uint32_t page_no() const { return static_cast(m_id); } + constexpr uint32_t page_no() const noexcept + { return static_cast(m_id); } /** Retrieve the fold value. @return fold value */ - constexpr ulint fold() const + constexpr ulint fold() const noexcept { return (ulint{space()} << 20) + space() + page_no(); } /** Reset the page number only. @param[in] page_no page number */ - void set_page_no(uint32_t page_no) + void set_page_no(uint32_t page_no) noexcept { m_id= (m_id & ~uint64_t{0} << 32) | page_no; } - constexpr ulonglong raw() const { return m_id; } + constexpr ulonglong raw() const noexcept { return m_id; } /** Flag the page identifier as corrupted. */ - void set_corrupted() { m_id= ~0ULL; } + void set_corrupted() noexcept { m_id= ~0ULL; } /** @return whether the page identifier belongs to a corrupted page */ constexpr bool is_corrupted() const { return m_id == ~0ULL; } @@ -182,53 +184,55 @@ enum rw_lock_type_t class page_hash_latch : private rw_lock { /** Wait for a shared lock */ - void read_lock_wait(); + void read_lock_wait() noexcept; /** Wait for an exclusive lock */ - void write_lock_wait(); + void write_lock_wait() noexcept; public: /** Acquire a shared lock */ - inline void lock_shared(); + inline void lock_shared() noexcept; /** Acquire an exclusive lock */ - inline void lock(); + inline void lock() noexcept; /** @return whether an exclusive lock is being held by any thread */ - bool is_write_locked() const { return rw_lock::is_write_locked(); } + bool is_write_locked() const noexcept { return rw_lock::is_write_locked(); } /** @return whether any lock is being held by any thread */ - bool is_locked() const { return rw_lock::is_locked(); } + bool is_locked() const noexcept { return rw_lock::is_locked(); } /** @return whether any lock is being held or waited for by any thread */ - bool is_locked_or_waiting() const { return rw_lock::is_locked_or_waiting(); } + bool is_locked_or_waiting() const noexcept + { return rw_lock::is_locked_or_waiting(); } /** Release a shared lock */ - void unlock_shared() { read_unlock(); } + void unlock_shared() noexcept { read_unlock(); } /** Release an exclusive lock */ - void unlock() { write_unlock(); } + void unlock() noexcept { write_unlock(); } }; #elif defined _WIN32 || SIZEOF_SIZE_T >= 8 class page_hash_latch { srw_spin_lock_low lk; public: - void lock_shared() { lk.rd_lock(); } - void unlock_shared() { lk.rd_unlock(); } - void lock() { lk.wr_lock(); } - void unlock() { lk.wr_unlock(); } - bool is_write_locked() const { return lk.is_write_locked(); } - bool is_locked() const { return lk.is_locked(); } - bool is_locked_or_waiting() const { return lk.is_locked_or_waiting(); } + void lock_shared() noexcept { lk.rd_lock(); } + void unlock_shared() noexcept { lk.rd_unlock(); } + void lock() noexcept { lk.wr_lock(); } + void unlock() noexcept { lk.wr_unlock(); } + bool is_write_locked() const noexcept { return lk.is_write_locked(); } + bool is_locked() const noexcept { return lk.is_locked(); } + bool is_locked_or_waiting() const noexcept + { return lk.is_locked_or_waiting(); } }; #else class page_hash_latch { srw_spin_mutex lk; public: - void lock_shared() { lock(); } - void unlock_shared() { unlock(); } - void lock() { lk.wr_lock(); } - void unlock() { lk.wr_unlock(); } - bool is_locked() const { return lk.is_locked(); } - bool is_write_locked() const { return is_locked(); } - bool is_locked_or_waiting() const { return is_locked(); } + void lock_shared() noexcept { lock(); } + void unlock_shared() noexcept { unlock(); } + void lock() noexcept { lk.wr_lock(); } + void unlock() noexcept { lk.wr_unlock(); } + bool is_locked() const noexcept { return lk.is_locked(); } + bool is_write_locked() const noexcept { return is_locked(); } + bool is_locked_or_waiting() const noexcept { return is_locked(); } }; #endif diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h index 0eebeb22b6f..a7c78fc96de 100644 --- a/storage/innobase/include/dict0dict.h +++ b/storage/innobase/include/dict0dict.h @@ -55,22 +55,6 @@ inline size_t dict_get_db_name_len(const char *name) } -/*********************************************************************//** -Open a table from its database and table name, this is currently used by -foreign constraint parser to get the referenced table. -@return complete table name with database and table name, allocated from -heap memory passed in */ -char* -dict_get_referenced_table( -/*======================*/ - const char* name, /*!< in: foreign key table name */ - const char* database_name, /*!< in: table db name */ - ulint database_name_len,/*!< in: db name length */ - const char* table_name, /*!< in: table name */ - ulint table_name_len, /*!< in: table name length */ - dict_table_t** table, /*!< out: table object or NULL */ - mem_heap_t* heap, /*!< in: heap memory */ - CHARSET_INFO* from_cs); /*!< in: table name charset */ /*********************************************************************//** Frees a foreign key struct. */ void diff --git a/storage/innobase/include/dict0types.h b/storage/innobase/include/dict0types.h index b5239c90c8d..5c6f772b4ad 100644 --- a/storage/innobase/include/dict0types.h +++ b/storage/innobase/include/dict0types.h @@ -111,7 +111,7 @@ struct table_name_t table_name_t(char* name) : m_name(name) {} /** @return the end of the schema name */ - const char* dbend() const + const char* dbend() const noexcept { const char* sep = strchr(m_name, '/'); ut_ad(sep); @@ -119,11 +119,19 @@ struct table_name_t } /** @return the length of the schema name, in bytes */ - size_t dblen() const { return size_t(dbend() - m_name); } + size_t dblen() const noexcept + { + const char *end= dbend(); + return UNIV_LIKELY(end != nullptr) ? size_t(end - m_name) : 0; + } /** Determine the filename-safe encoded table name. @return the filename-safe encoded table name */ - const char* basename() const { return dbend() + 1; } + const char* basename() const noexcept + { + const char *end= dbend(); + return UNIV_LIKELY(end != nullptr) ? end + 1 : nullptr; + } /** The start of the table basename suffix for partitioned tables */ static const char part_suffix[4]; diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index a25f535a072..cd1aa8ca336 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -341,11 +341,11 @@ struct fil_space_t final uint32_t n_reserved_extents= 0; private: #ifdef UNIV_DEBUG - fil_space_t *next_in_space_list(); - fil_space_t *prev_in_space_list(); + fil_space_t *next_in_space_list() noexcept; + fil_space_t *prev_in_space_list() noexcept; - fil_space_t *next_in_unflushed_spaces(); - fil_space_t *prev_in_unflushed_spaces(); + fil_space_t *next_in_unflushed_spaces() noexcept; + fil_space_t *prev_in_unflushed_spaces() noexcept; #endif /** the committed size of the tablespace in pages */ @@ -413,21 +413,21 @@ public: { return UNIV_UNLIKELY(being_imported); } /** @return whether doublewrite buffering is needed */ - inline bool use_doublewrite() const; + inline bool use_doublewrite() const noexcept; /** @return whether a page has been freed */ - inline bool is_freed(uint32_t page); + inline bool is_freed(uint32_t page) noexcept; /** Set create_lsn. */ - inline void set_create_lsn(lsn_t lsn); + inline void set_create_lsn(lsn_t lsn) noexcept; /** @return the latest tablespace rebuild LSN, or 0 */ - lsn_t get_create_lsn() const { return create_lsn; } + lsn_t get_create_lsn() const noexcept { return create_lsn; } /** Apply freed_ranges to the file. @param writable whether the file is writable @return number of pages written or hole-punched */ - uint32_t flush_freed(bool writable); + uint32_t flush_freed(bool writable) noexcept; /** Append a file to the chain of files of a space. @param[in] name file name of a file that is not open @@ -440,7 +440,7 @@ public: @return file object */ fil_node_t* add(const char* name, pfs_os_file_t handle, uint32_t size, bool is_raw, bool atomic_write, - uint32_t max_pages = UINT32_MAX); + uint32_t max_pages = UINT32_MAX) noexcept; #ifdef UNIV_DEBUG /** Assert that the mini-transaction is compatible with updating an allocation bitmap page. @@ -453,6 +453,7 @@ public: @param[in] n_to_reserve number of extents to reserve @return whether the reservation succeeded */ bool reserve_free_extents(uint32_t n_free_now, uint32_t n_to_reserve) + noexcept { if (n_reserved_extents + n_to_reserve > n_free_now) { return false; @@ -464,7 +465,7 @@ public: /** Release the reserved free extents. @param[in] n_reserved number of reserved extents */ - void release_free_extents(uint32_t n_reserved) + void release_free_extents(uint32_t n_reserved) noexcept { if (!n_reserved) return; ut_a(n_reserved_extents >= n_reserved); @@ -477,20 +478,20 @@ public: @param[in] replace whether to ignore the existence of path @return error code @retval DB_SUCCESS on success */ - dberr_t rename(const char *path, bool log, bool replace= false) + dberr_t rename(const char *path, bool log, bool replace= false) noexcept MY_ATTRIBUTE((nonnull)); /** Note that the tablespace has been imported. Initially, purpose=IMPORT so that no redo log is written while the space ID is being updated in each page. */ - inline void set_imported(); + inline void set_imported() noexcept; /** Report the tablespace as corrupted @return whether this was the first call */ ATTRIBUTE_COLD bool set_corrupted() const noexcept; /** @return whether the storage device is rotational (HDD, not SSD) */ - inline bool is_rotational() const; + inline bool is_rotational() const noexcept; /** Open each file. Never invoked on .ibd files. @param create_new_db whether to skip the call to fil_node_t::read_page0() @@ -531,7 +532,7 @@ public: /** Acquire a tablespace reference for I/O. @param avoid when these flags are set, nothing will be acquired @return whether the file is usable */ - bool acquire(uint32_t avoid= STOPPING | CLOSING) + bool acquire(uint32_t avoid= STOPPING | CLOSING) noexcept { const auto flags= acquire_low(avoid) & (avoid); return UNIV_LIKELY(!flags) || (flags == CLOSING && acquire_and_prepare()); @@ -540,14 +541,15 @@ public: /** Acquire a tablespace reference for writing. @param avoid when these flags are set, nothing will be acquired @return whether the file is writable */ - bool acquire_for_write() { return acquire(STOPPING_WRITES | CLOSING); } + bool acquire_for_write() noexcept + { return acquire(STOPPING_WRITES | CLOSING); } /** Acquire another tablespace reference for I/O. */ - inline void reacquire(); + inline void reacquire() noexcept; /** Release a tablespace reference. @return whether this was the last reference */ - bool release() + bool release() noexcept { uint32_t n= n_pending.fetch_sub(1, std::memory_order_release); ut_ad(n & PENDING); @@ -555,43 +557,45 @@ public: } /** Clear the NEEDS_FSYNC flag */ - void clear_flush() + void clear_flush() noexcept { n_pending.fetch_and(~NEEDS_FSYNC, std::memory_order_release); } private: /** Clear the CLOSING flag */ - void clear_closing() + void clear_closing() noexcept { n_pending.fetch_and(~CLOSING, std::memory_order_relaxed); } /** @return pending operations (and flags) */ - uint32_t pending()const { return n_pending.load(std::memory_order_acquire); } + uint32_t pending() const noexcept + { return n_pending.load(std::memory_order_acquire); } public: /** @return whether close() of the file handle has been requested */ - bool is_closing() const { return pending() & CLOSING; } + bool is_closing() const noexcept { return pending() & CLOSING; } /** @return whether the tablespace is about to be dropped */ - bool is_stopping() const { return pending() & STOPPING; } + bool is_stopping() const noexcept { return pending() & STOPPING; } /** @return whether the tablespace is going to be dropped */ - bool is_stopping_writes() const { return pending() & STOPPING_WRITES; } + bool is_stopping_writes() const noexcept + { return pending() & STOPPING_WRITES; } /** @return number of pending operations */ - bool is_ready_to_close() const + bool is_ready_to_close() const noexcept { return (pending() & (PENDING | CLOSING)) == CLOSING; } /** @return whether fsync() or similar is needed */ - bool needs_flush() const { return pending() & NEEDS_FSYNC; } + bool needs_flush() const noexcept { return pending() & NEEDS_FSYNC; } /** @return whether fsync() or similar is needed, and the tablespace is not being dropped */ - bool needs_flush_not_stopping() const + bool needs_flush_not_stopping() const noexcept { return (pending() & (NEEDS_FSYNC | STOPPING_WRITES)) == NEEDS_FSYNC; } - uint32_t referenced() const { return pending() & PENDING; } + uint32_t referenced() const noexcept { return pending() & PENDING; } private: MY_ATTRIBUTE((warn_unused_result)) /** Prepare to close the file handle. @return number of pending operations, possibly with NEEDS_FSYNC flag */ - uint32_t set_closing() + uint32_t set_closing() noexcept { return n_pending.fetch_or(CLOSING, std::memory_order_acquire); } @@ -603,17 +607,18 @@ public: @param ignore_space Ignore the tablespace which is acquired by caller @param print_info whether to diagnose why a file cannot be closed @return whether a file was closed */ - static bool try_to_close(fil_space_t *ignore_space, bool print_info); + static bool try_to_close(fil_space_t *ignore_space, bool print_info) + noexcept; /** Close all tablespace files at shutdown */ - static void close_all(); + static void close_all() noexcept; /** Update last_freed_lsn */ void update_last_freed_lsn(lsn_t lsn) { last_freed_lsn= lsn; } /** Note that the file will need fsync(). @return whether this needs to be added to fil_system.unflushed_spaces */ - bool set_needs_flush() + bool set_needs_flush() noexcept { uint32_t n= 1; while (!n_pending.compare_exchange_strong(n, n | NEEDS_FSYNC, @@ -630,7 +635,7 @@ public: /** Clear all freed ranges for undo tablespace when InnoDB encounters TRIM redo log record */ - void clear_freed_ranges() { freed_ranges.clear(); } + void clear_freed_ranges() noexcept { freed_ranges.clear(); } #endif /* !UNIV_INNOCHECKSUM */ /** FSP_SPACE_FLAGS and FSP_FLAGS_MEM_ flags; check fsp0types.h to more info about flags. */ @@ -639,12 +644,12 @@ public: /** Determine if full_crc32 is used for a data file @param[in] flags tablespace flags (FSP_SPACE_FLAGS) @return whether the full_crc32 algorithm is active */ - static bool full_crc32(uint32_t flags) + static bool full_crc32(uint32_t flags) noexcept { return flags & FSP_FLAGS_FCRC32_MASK_MARKER; } /** @return whether innodb_checksum_algorithm=full_crc32 is active */ - bool full_crc32() const { return full_crc32(flags); } + bool full_crc32() const noexcept { return full_crc32(flags); } /** Determine if full_crc32 is used along with PAGE_COMPRESSED */ - static bool is_full_crc32_compressed(uint32_t flags) + static bool is_full_crc32_compressed(uint32_t flags) noexcept { if (!full_crc32(flags)) return false; @@ -656,7 +661,7 @@ public: @param flags tablespace flags (FSP_SPACE_FLAGS) @return the logical page size @retval 0 if the flags are invalid */ - static unsigned logical_size(uint32_t flags) + static unsigned logical_size(uint32_t flags) noexcept { switch (full_crc32(flags) ? FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags) @@ -674,7 +679,7 @@ public: @param flags tablespace flags (FSP_SPACE_FLAGS) @return the ROW_FORMAT=COMPRESSED page size @retval 0 if ROW_FORMAT=COMPRESSED is not used */ - static unsigned zip_size(uint32_t flags) + static unsigned zip_size(uint32_t flags) noexcept { if (full_crc32(flags)) return 0; @@ -684,7 +689,7 @@ public: /** Determine the physical page size. @param flags tablespace flags (FSP_SPACE_FLAGS) @return the physical page size */ - static unsigned physical_size(uint32_t flags) + static unsigned physical_size(uint32_t flags) noexcept { if (full_crc32(flags)) return logical_size(flags); @@ -697,25 +702,25 @@ public: /** @return the ROW_FORMAT=COMPRESSED page size @retval 0 if ROW_FORMAT=COMPRESSED is not used */ - unsigned zip_size() const { return zip_size(flags); } + unsigned zip_size() const noexcept { return zip_size(flags); } /** @return the physical page size */ - unsigned physical_size() const { return physical_size(flags); } + unsigned physical_size() const noexcept { return physical_size(flags); } /** Check whether PAGE_COMPRESSED is enabled. @param[in] flags tablespace flags */ - static bool is_compressed(uint32_t flags) + static bool is_compressed(uint32_t flags) noexcept { return is_full_crc32_compressed(flags) || FSP_FLAGS_HAS_PAGE_COMPRESSION(flags); } /** @return whether the compression enabled for the tablespace. */ - bool is_compressed() const { return is_compressed(flags); } + bool is_compressed() const noexcept { return is_compressed(flags); } /** Get the compression algorithm for full crc32 format. @param flags contents of FSP_SPACE_FLAGS @return PAGE_COMPRESSED algorithm of full_crc32 tablespace @retval 0 if not PAGE_COMPRESSED or not full_crc32 */ - static unsigned get_compression_algo(uint32_t flags) + static unsigned get_compression_algo(uint32_t flags) noexcept { return full_crc32(flags) ? FSP_FLAGS_FCRC32_GET_COMPRESSED_ALGO(flags) @@ -723,12 +728,12 @@ public: } /** @return the page_compressed algorithm @retval 0 if not page_compressed */ - unsigned get_compression_algo() const { return get_compression_algo(flags); } + unsigned get_compression_algo() const noexcept { return get_compression_algo(flags); } /** Determine if the page_compressed page contains an extra byte for exact compressed stream length @param flags contents of FSP_SPACE_FLAGS @return whether the extra byte is needed */ - static bool full_crc32_page_compressed_len(uint32_t flags) + static bool full_crc32_page_compressed_len(uint32_t flags) noexcept { DBUG_ASSERT(full_crc32(flags)); switch (get_compression_algo(flags)) { @@ -744,7 +749,7 @@ public: @param flags contents of FSP_SPACE_FLAGS @param expected expected flags @return true if it is equivalent */ - static bool is_flags_full_crc32_equal(uint32_t flags, uint32_t expected) + static bool is_flags_full_crc32_equal(uint32_t flags, uint32_t expected) noexcept { ut_ad(full_crc32(flags)); uint32_t fcrc32_psize= FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags); @@ -765,7 +770,7 @@ public: @param flags contents of FSP_SPACE_FLAGS @param expected expected flags @return true if it is equivalent */ - static bool is_flags_non_full_crc32_equal(uint32_t flags, uint32_t expected) + static bool is_flags_non_full_crc32_equal(uint32_t flags, uint32_t expected) noexcept { ut_ad(!full_crc32(flags)); if (!full_crc32(expected)) @@ -780,7 +785,7 @@ public: } /** Whether both fsp flags are equivalent */ - static bool is_flags_equal(uint32_t flags, uint32_t expected) + static bool is_flags_equal(uint32_t flags, uint32_t expected) noexcept { if (!((flags ^ expected) & ~(1U << FSP_FLAGS_POS_RESERVED))) return true; @@ -792,7 +797,7 @@ public: /** Validate the tablespace flags for full crc32 format. @param flags contents of FSP_SPACE_FLAGS @return whether the flags are correct in full crc32 format */ - static bool is_fcrc32_valid_flags(uint32_t flags) + static bool is_fcrc32_valid_flags(uint32_t flags) noexcept { ut_ad(flags & FSP_FLAGS_FCRC32_MASK_MARKER); const ulint page_ssize= physical_size(flags); @@ -805,7 +810,7 @@ public: @param flags contents of FSP_SPACE_FLAGS @param is_ibd whether this is an .ibd file (not system tablespace) @return whether the flags are correct */ - static bool is_valid_flags(uint32_t flags, bool is_ibd) + static bool is_valid_flags(uint32_t flags, bool is_ibd) noexcept { DBUG_EXECUTE_IF("fsp_flags_is_valid_failure", return false;); if (full_crc32(flags)) @@ -878,17 +883,17 @@ public: @param id tablespace identifier @return tablespace @retval nullptr if the tablespace is missing or inaccessible */ - static fil_space_t *get(uint32_t id); + static fil_space_t *get(uint32_t id) noexcept; /** Acquire a tablespace reference for writing. @param id tablespace identifier @return tablespace @retval nullptr if the tablespace is missing or inaccessible */ - static fil_space_t *get_for_write(uint32_t id); + static fil_space_t *get_for_write(uint32_t id) noexcept; /** Add/remove the free page in the freed ranges list. @param[in] offset page number to be added @param[in] free true if page to be freed */ - void free_page(uint32_t offset, bool add=true) + void free_page(uint32_t offset, bool add=true) noexcept { std::lock_guard freed_lock(freed_range_mutex); if (add) @@ -901,14 +906,14 @@ public: } /** Add the range of freed pages */ - void add_free_ranges(range_set ranges) + void add_free_ranges(range_set ranges) noexcept { std::lock_guard freed_lock(freed_range_mutex); freed_ranges= std::move(ranges); } /** Add the set of freed page ranges */ - void add_free_range(const range_t range) + void add_free_range(const range_t range) noexcept { freed_ranges.add_range(range); } @@ -919,20 +924,20 @@ public: inline void clear_freed_ranges(uint32_t threshold); /** Set the tablespace size in pages */ - void set_sizes(uint32_t s) + void set_sizes(uint32_t s) noexcept { ut_ad(id ? !size : (size >= s)); size= s; committed_size= s; } /** Update committed_size in mtr_t::commit() */ - void set_committed_size() { committed_size= size; } + void set_committed_size() noexcept { committed_size= size; } /** @return the last persisted page number */ - uint32_t last_page_number() const { return committed_size - 1; } + uint32_t last_page_number() const noexcept { return committed_size - 1; } /** @return the size in pages (0 if unreadable) */ - inline uint32_t get_size(); + inline uint32_t get_size() noexcept; /** Read or write data. @param type I/O context @@ -942,11 +947,11 @@ public: @param bpage buffer block (for type.is_async() completion callback) @return status and file descriptor */ fil_io_t io(const IORequest &type, os_offset_t offset, size_t len, - void *buf, buf_page_t *bpage= nullptr); + void *buf, buf_page_t *bpage= nullptr) noexcept; /** Flush pending writes from the file system cache to the file. */ - template inline void flush(); + template inline void flush() noexcept; /** Flush pending writes from the file system cache to the file. */ - void flush_low(); + void flush_low() noexcept; /** Read the first page of a data file. @param dpage copy of a first page, from the doublewrite buffer, or nullptr @@ -962,19 +967,19 @@ public: @return the next tablespace @retval nullptr upon reaching the end of the iteration */ static space_list_t::iterator next(space_list_t::iterator space, - bool recheck, bool encrypt); + bool recheck, bool encrypt) noexcept; #ifdef UNIV_DEBUG - bool is_latched() const { return latch.have_any(); } + bool is_latched() const noexcept { return latch.have_any(); } #endif - bool is_owner() const + bool is_owner() const noexcept { const bool owner{latch_owner == pthread_self()}; ut_ad(owner == latch.have_wr()); return owner; } /** Acquire the allocation latch in exclusive mode */ - void x_lock() + void x_lock() noexcept { latch.wr_lock(SRW_LOCK_CALL); ut_ad(!latch_owner); @@ -988,14 +993,14 @@ public: latch.wr_unlock(); } /** Acquire the allocation latch in shared mode */ - void s_lock() { latch.rd_lock(SRW_LOCK_CALL); } + void s_lock() noexcept { latch.rd_lock(SRW_LOCK_CALL); } /** Release the allocation latch from shared mode */ - void s_unlock() { latch.rd_unlock(); } + void s_unlock() noexcept { latch.rd_unlock(); } typedef span name_type; /** @return the tablespace name (databasename/tablename) */ - name_type name() const; + name_type name() const noexcept; /** How to validate tablespace files that are being opened */ enum validate { @@ -1010,7 +1015,7 @@ public: }; /** Update the data structures on write completion */ - void complete_write(); + void complete_write() noexcept; /** Free the unused segment for the tablespace @param shutdown called during slow shutdown @@ -1018,9 +1023,9 @@ public: dberr_t garbage_collect(bool shutdown); private: /** @return whether the file is usable for io() */ - ATTRIBUTE_COLD bool prepare_acquired(); + ATTRIBUTE_COLD bool prepare_acquired() noexcept; /** @return whether the file is usable for io() */ - ATTRIBUTE_COLD bool acquire_and_prepare(); + ATTRIBUTE_COLD bool acquire_and_prepare() noexcept; #endif /*!UNIV_INNOCHECKSUM */ }; @@ -1065,7 +1070,7 @@ struct fil_node_t final ulint block_size; /** @return whether this file is open */ - bool is_open() const { return handle != OS_FILE_CLOSED; } + bool is_open() const noexcept { return handle != OS_FILE_CLOSED; } /** Read the first page of a data file. @param dpage copy of a first page, from the doublewrite buffer, or nullptr @@ -1076,32 +1081,32 @@ struct fil_node_t final void find_metadata(IF_WIN(,bool create= false)) noexcept; /** Close the file handle. */ - void close(); + void close() noexcept; /** Same as close() but returns file handle instead of closing it. */ - pfs_os_file_t detach() MY_ATTRIBUTE((warn_unused_result)); + pfs_os_file_t detach() noexcept MY_ATTRIBUTE((warn_unused_result)); /** Prepare to free a file from fil_system. @param detach_handle whether to detach instead of closing a handle @return detached handle or OS_FILE_CLOSED */ - inline pfs_os_file_t close_to_free(bool detach_handle= false); + inline pfs_os_file_t close_to_free(bool detach_handle= false) noexcept; private: /** Does stuff common for close() and detach() */ - void prepare_to_close_or_detach(); + void prepare_to_close_or_detach() noexcept; }; -inline bool fil_space_t::use_doublewrite() const +inline bool fil_space_t::use_doublewrite() const noexcept { return !UT_LIST_GET_FIRST(chain)->atomic_write && buf_dblwr.in_use(); } -inline void fil_space_t::set_imported() +inline void fil_space_t::set_imported() noexcept { ut_ad(being_imported); being_imported= false; UT_LIST_GET_FIRST(chain)->find_metadata(); } -inline bool fil_space_t::is_rotational() const +inline bool fil_space_t::is_rotational() const noexcept { for (const fil_node_t *node= UT_LIST_GET_FIRST(chain); node; node= UT_LIST_GET_NEXT(chain, node)) @@ -1303,7 +1308,7 @@ constexpr uint16_t FIL_PAGE_COMPRESS_FCRC32_MARKER= 15; /* @} */ /** @return whether the page type is B-tree or R-tree index */ -inline bool fil_page_type_is_index(uint16_t page_type) +inline bool fil_page_type_is_index(uint16_t page_type) noexcept { switch (page_type) { case FIL_PAGE_TYPE_INSTANT: @@ -1322,7 +1327,7 @@ index */ /** Get the file page type. @param[in] page file page @return page type */ -inline uint16_t fil_page_get_type(const byte *page) +inline uint16_t fil_page_get_type(const byte *page) noexcept { return mach_read_from_2(my_assume_aligned<2>(page + FIL_PAGE_TYPE)); } @@ -1340,7 +1345,7 @@ or the caller should be in single-threaded crash recovery mode Normally, fil_space_t::get() should be used instead. @param[in] id tablespace ID @return tablespace, or NULL if not found */ -fil_space_t *fil_space_get(uint32_t id) +fil_space_t *fil_space_get(uint32_t id) noexcept MY_ATTRIBUTE((warn_unused_result)); /** The tablespace memory cache */ @@ -1354,7 +1359,7 @@ struct fil_system_t */ fil_system_t() {} - bool is_initialised() const { return spaces.array; } + bool is_initialised() const noexcept { return spaces.array; } /** Create the file system interface at database start. @@ -1364,7 +1369,7 @@ struct fil_system_t void create(ulint hash_size); /** Close the file system interface at shutdown */ - void close(); + void close() noexcept; private: /** Points to the last opened space in space_list. Protected with @@ -1376,7 +1381,7 @@ private: std::vector ssd; public: /** @return whether a file system device is on non-rotational storage */ - bool is_ssd(dev_t dev) const + bool is_ssd(dev_t dev) const noexcept { /* Linux seems to allow up to 15 partitions per block device. If the detected ssd carries "partition number 0" (it is the whole device), @@ -1393,7 +1398,7 @@ public: @param detach_handle whether to detach the handle, instead of closing @return detached handle @retval OS_FILE_CLOSED if no handle was detached */ - pfs_os_file_t detach(fil_space_t *space, bool detach_handle= false); + pfs_os_file_t detach(fil_space_t *space, bool detach_handle= false) noexcept; /** the mutex protecting most data fields, and some fields of fil_space_t */ mysql_mutex_t mutex; @@ -1460,13 +1465,13 @@ public: fil_system.space_list, so that fil_space_t::try_to_close() should close it as a last resort. @param space space to add */ - void add_opened_last_to_space_list(fil_space_t *space); + void add_opened_last_to_space_list(fil_space_t *space) noexcept; /** Move the file to the end of opened spaces list in fil_system.space_list, so that fil_space_t::try_to_close() should close it as a last resort. @param space space to move */ - inline void move_opened_last_to_space_list(fil_space_t *space) + inline void move_opened_last_to_space_list(fil_space_t *space) noexcept { /* In the case when several files of the same space are added in a row, there is no need to remove and add a space to the same position @@ -1482,7 +1487,7 @@ public: fil_space_t::try_to_close() iterates opened files first in FIFO order, i.e. first opened, first closed. @param space space to move */ - void move_closed_last_to_space_list(fil_space_t *space) + void move_closed_last_to_space_list(fil_space_t *space) noexcept { if (UNIV_UNLIKELY(freeze_space_list)) return; @@ -1509,21 +1514,21 @@ public: @retval fil_system.temp_space if there is no work to do @retval nullptr upon reaching the end of the iteration */ inline fil_space_t* default_encrypt_next(fil_space_t *space, bool recheck, - bool encrypt); + bool encrypt) noexcept; /** Extend all open data files to the recovered size */ - ATTRIBUTE_COLD void extend_to_recv_size(); + ATTRIBUTE_COLD void extend_to_recv_size() noexcept; /** Determine if a tablespace associated with a file name exists. @param path tablespace file name to look for @return a matching tablespace */ - inline fil_space_t *find(const char *path) const; + inline fil_space_t *find(const char *path) const noexcept; }; /** The tablespace memory cache. */ extern fil_system_t fil_system; -inline void fil_space_t::reacquire() +inline void fil_space_t::reacquire() noexcept { ut_d(uint32_t n=) n_pending.fetch_add(1, std::memory_order_relaxed); #ifdef SAFE_MUTEX @@ -1534,7 +1539,7 @@ inline void fil_space_t::reacquire() } /** Flush pending writes from the file system cache to the file. */ -template inline void fil_space_t::flush() +template inline void fil_space_t::flush() noexcept { mysql_mutex_assert_not_owner(&fil_system.mutex); ut_ad(!have_reference || (pending() & PENDING)); @@ -1552,7 +1557,7 @@ template inline void fil_space_t::flush() } /** @return the size in pages (0 if unreadable) */ -inline uint32_t fil_space_t::get_size() +inline uint32_t fil_space_t::get_size() noexcept { if (!size) { @@ -1570,7 +1575,7 @@ Assigns a new space id for a new single-table tablespace. This works simply by incrementing the global counter. If 4 billion id's is not enough, we may need to recycle id's. @return true if assigned, false if not */ -bool fil_assign_new_space_id(uint32_t *space_id); +bool fil_assign_new_space_id(uint32_t *space_id) noexcept; /** Frees a space object from the tablespace memory cache. Closes the files in the chain but does not delete them. @@ -1578,31 +1583,31 @@ There must not be any pending i/o's or flushes on the files. @param id tablespace identifier @param x_latched whether the caller holds exclusive fil_space_t::latch @return true if success */ -bool fil_space_free(uint32_t id, bool x_latched); +bool fil_space_free(uint32_t id, bool x_latched) noexcept; /** Set the recovered size of a tablespace in pages. @param id tablespace ID @param size recovered size in pages @param flags tablespace flags */ void fil_space_set_recv_size_and_flags(uint32_t id, uint32_t size, - uint32_t flags); + uint32_t flags) noexcept; /*******************************************************************//** Sets the max tablespace id counter if the given number is bigger than the previous value. */ -void fil_set_max_space_id_if_bigger(uint32_t max_id); +void fil_set_max_space_id_if_bigger(uint32_t max_id) noexcept; MY_ATTRIBUTE((warn_unused_result)) /** Delete a tablespace and associated .ibd file. @param id tablespace identifier @return detached file handle (to be closed by the caller) @return OS_FILE_CLOSED if no file existed */ -pfs_os_file_t fil_delete_tablespace(uint32_t id); +pfs_os_file_t fil_delete_tablespace(uint32_t id) noexcept; /** Close a single-table tablespace on failed IMPORT TABLESPACE. The tablespace must be cached in the memory cache. Free all pages used by the tablespace. */ -void fil_close_tablespace(uint32_t id); +void fil_close_tablespace(uint32_t id) noexcept; /*******************************************************************//** Allocates and builds a file name from a path, a table or tablespace name @@ -1614,10 +1619,10 @@ and a suffix. The string must be freed by caller with ut_free(). @return own: file name */ char* fil_make_filepath_low(const char *path, const fil_space_t::name_type &name, - ib_extention extension, bool trim_name); + ib_extention extension, bool trim_name) noexcept; char *fil_make_filepath(const char* path, const table_name_t name, - ib_extention suffix, bool strip_name); + ib_extention suffix, bool strip_name) noexcept; /** Wrapper function over fil_make_filepath_low to build file name. @param path nullptr or the directory path or the full path and filename @@ -1627,7 +1632,7 @@ char *fil_make_filepath(const char* path, const table_name_t name, @return own: file name */ static inline char* fil_make_filepath(const char* path, const fil_space_t::name_type &name, - ib_extention extension, bool trim_name) + ib_extention extension, bool trim_name) noexcept { /* If we are going to strip a name off the path, there better be a path and a new name to put back on. */ @@ -1708,7 +1713,7 @@ enum fil_load_status { @return status of the operation */ enum fil_load_status fil_ibd_load(uint32_t space_id, const char *filename, fil_space_t *&space) - MY_ATTRIBUTE((warn_unused_result)); + noexcept MY_ATTRIBUTE((warn_unused_result)); /** Determine if a matching tablespace exists in the InnoDB tablespace memory cache. Note that if we have not done a crash recovery at the database @@ -1718,28 +1723,29 @@ startup, there may be many tablespaces which are not yet in the memory cache. @return the tablespace @retval NULL if no matching tablespace exists in the memory cache */ fil_space_t *fil_space_for_table_exists_in_mem(uint32_t id, - uint32_t table_flags); + uint32_t table_flags) noexcept; /** Try to extend a tablespace if it is smaller than the specified size. @param[in,out] space tablespace @param[in] size desired size in pages @return whether the tablespace is at least as big as requested */ -bool fil_space_extend(fil_space_t *space, uint32_t size); +bool fil_space_extend(fil_space_t *space, uint32_t size) noexcept; /** Flush to disk the writes in file spaces of the given type possibly cached by the OS. */ -void fil_flush_file_spaces(); +void fil_flush_file_spaces() noexcept; /******************************************************************//** Checks the consistency of the tablespace cache. @return true if ok */ -bool fil_validate(); -/*********************************************************************//** -Sets the file page type. */ -void -fil_page_set_type( -/*==============*/ - byte* page, /*!< in/out: file page */ - ulint type); /*!< in: type */ +bool fil_validate() noexcept; + +/** Set the file page type. +@param page file page +@param type FIL_PAGE_TYPE value */ +inline void fil_page_set_type(byte *page, uint16_t type) noexcept +{ + mach_write_to_2(page + FIL_PAGE_TYPE, type); +} /********************************************************************//** Delete the tablespace file and any related files like .cfg. @@ -1747,7 +1753,8 @@ This should not be called for temporary tables. */ void fil_delete_file( /*============*/ - const char* path); /*!< in: filepath of the ibd tablespace */ + const char* path) /*!< in: filepath of the ibd tablespace */ + noexcept; /** Look up a table space by a given id. @param id tablespace identifier @@ -1758,18 +1765,16 @@ fil_space_t *fil_space_get_by_id(uint32_t id) noexcept; /** Note that a non-predefined persistent tablespace has been modified by redo log. @param[in,out] space tablespace */ -void -fil_names_dirty( - fil_space_t* space); +void fil_names_dirty(fil_space_t *space) noexcept; -bool fil_comp_algo_loaded(ulint comp_algo); +bool fil_comp_algo_loaded(ulint comp_algo) noexcept; /** On a log checkpoint, reset fil_names_dirty_and_write() flags and write out FILE_MODIFY if needed, and write FILE_CHECKPOINT. @param lsn checkpoint LSN @return current LSN */ -ATTRIBUTE_COLD lsn_t fil_names_clear(lsn_t lsn); +ATTRIBUTE_COLD lsn_t fil_names_clear(lsn_t lsn) noexcept; #ifdef UNIV_ENABLE_UNIT_TEST_MAKE_FILEPATH void test_make_filepath(); @@ -1779,12 +1784,14 @@ void test_make_filepath(); @param[in] space tablespace @param[in] offset page number @return block size */ -ulint fil_space_get_block_size(const fil_space_t* space, unsigned offset); +ulint fil_space_get_block_size(const fil_space_t* space, unsigned offset) + noexcept; /** Check whether encryption key found @param crypt_data Encryption data @param f_name File name @return encryption key found */ -bool fil_crypt_check(fil_space_crypt_t *crypt_data, const char *f_name); +bool fil_crypt_check(fil_space_crypt_t *crypt_data, const char *f_name) + noexcept; #endif /* UNIV_INNOCHECKSUM */ diff --git a/storage/innobase/include/ha_prototypes.h b/storage/innobase/include/ha_prototypes.h index b09dcfc9bab..61d4afd8025 100644 --- a/storage/innobase/include/ha_prototypes.h +++ b/storage/innobase/include/ha_prototypes.h @@ -40,6 +40,8 @@ class Field; struct dict_table_t; struct dict_foreign_t; struct table_name_t; +struct mem_block_info_t; +typedef struct mem_block_info_t mem_heap_t; // JAN: TODO missing features: #undef MYSQL_FT_INIT_EXT @@ -128,9 +130,7 @@ void innobase_mysql_print_thd( /*=====================*/ FILE* f, /*!< in: output stream */ - THD* thd, /*!< in: pointer to a MySQL THD object */ - uint max_query_len); /*!< in: max query length to print, or 0 to - use the default max length */ + THD* thd); /*!< in: pointer to a MySQL THD object */ /** Converts a MySQL type to an InnoDB type. Note that this function returns the 'mtype' of InnoDB. InnoDB differentiates between MySQL's old <= 4.1 @@ -348,15 +348,6 @@ innobase_next_autoinc( MY_ATTRIBUTE((pure, warn_unused_result)); /********************************************************************** -Converts an identifier from my_charset_filename to UTF-8 charset. */ -uint -innobase_convert_to_system_charset( -/*===============================*/ - char* to, /* out: converted identifier */ - const char* from, /* in: identifier to convert */ - ulint len, /* in: length of 'to', in bytes */ - uint* errors); /* out: error return */ -/********************************************************************** Check if the length of the identifier exceeds the maximum allowed. The input to this function is an identifier in charset my_charset_filename. return true when length of identifier is too long. */ @@ -376,14 +367,13 @@ innobase_convert_to_system_charset( ulint len, /* in: length of 'to', in bytes */ uint* errors); /* out: error return */ -/********************************************************************** -Converts an identifier from my_charset_filename to UTF-8 charset. */ -uint -innobase_convert_to_filename_charset( -/*=================================*/ - char* to, /* out: converted identifier */ - const char* from, /* in: identifier to convert */ - ulint len); /* in: length of 'to', in bytes */ +/** Convert a schema or table name to InnoDB (and file system) format. +@param cs source character set +@param name name encoded in cs +@param buf output buffer (MAX_TABLE_NAME_LEN + 1 bytes) +@return the converted string (within buf) */ +LEX_CSTRING innodb_convert_name(CHARSET_INFO *cs, LEX_CSTRING name, char *buf) + noexcept; /** Report that a table cannot be decrypted. @param thd connection context @@ -440,6 +430,16 @@ void destroy_background_thd(MYSQL_THD thd); void innobase_reset_background_thd(MYSQL_THD); +/** Open a table based on a database and table name. +@param db schema name +@param name table name within the schema +@param table table +@param heap memory heap for allocating a converted name +@return InnoDB format table name with database and table name, +allocated from heap */ +char *dict_table_lookup(LEX_CSTRING db, LEX_CSTRING name, + dict_table_t **table, mem_heap_t *heap) noexcept; + #ifdef WITH_WSREP /** Append table-level exclusive key. @param thd MySQL thread handle diff --git a/storage/innobase/include/hash0hash.h b/storage/innobase/include/hash0hash.h index 4d45c0bf772..4fc21a90f1f 100644 --- a/storage/innobase/include/hash0hash.h +++ b/storage/innobase/include/hash0hash.h @@ -107,10 +107,28 @@ public: @param element the being-removed element @param next the next-element pointer in T */ template - void remove(T &element, T *T::*next) noexcept + void remove(const T &element, T *T::*next) noexcept { remove(search(next, [&element](const T *p){return p==&element;}), next); } + + /** Insert an element after another. + @tparam T type of the element + @param after the element after which to insert + @param insert the being-inserted element + @param next the next-element pointer in T */ + template void insert_after(T &after, T &insert, T *T::*next) + { +#ifdef UNIV_DEBUG + for (const T *c= static_cast(node); c; c= c->*next) + if (c == &after) + goto found; + ut_error; + found: +#endif + insert.*next= after.*next; + after.*next= &insert; + } }; /** Hash table with singly-linked overflow lists */ diff --git a/storage/innobase/include/lock0lock.h b/storage/innobase/include/lock0lock.h index 9da6f1680cd..9c192f2a586 100644 --- a/storage/innobase/include/lock0lock.h +++ b/storage/innobase/include/lock0lock.h @@ -52,6 +52,20 @@ namespace Deadlock enum report { REPORT_OFF, REPORT_BASIC, REPORT_FULL }; } +/** Conflicting lock info */ +struct conflicting_lock_info { + /** Conflicting lock */ + const lock_t *conflicting; + /** If some lock was bypassed, points to the lock after which bypassing + lock must be inserted into linked list of locks for the certain cell of + record locks hash table. */ + lock_t *insert_after; + /** First bypassed lock */ + ut_d(const lock_t *bypassed;) +}; + +extern const conflicting_lock_info null_c_lock_info; + /*********************************************************************//** Gets the heap_no of the smallest user record on a page. @return heap_no of smallest user record, or PAGE_HEAP_NO_SUPREMUM */ @@ -862,7 +876,7 @@ public: @retval DB_DEADLOCK if trx->lock.was_chosen_as_deadlock_victim was set @retval DB_LOCK_WAIT if the lock was canceled */ template - static dberr_t cancel(trx_t *trx, lock_t *lock); + dberr_t cancel(trx_t *trx, lock_t *lock) noexcept; /** Note that a record lock wait started */ inline void wait_start(); @@ -917,7 +931,7 @@ public: void prdt_page_free_from_discard(const page_id_t id, bool all= false); /** Cancel possible lock waiting for a transaction */ - static void cancel_lock_wait_for_trx(trx_t *trx); + inline void cancel_lock_wait_for_trx(trx_t *trx) noexcept; #ifdef WITH_WSREP /** Cancel lock waiting for a wsrep BF abort. */ static void cancel_lock_wait_for_wsrep_bf_abort(trx_t *trx); @@ -1144,25 +1158,6 @@ struct TMTrxGuard #endif }; -/*********************************************************************//** -Creates a new record lock and inserts it to the lock queue. Does NOT check -for deadlocks or lock compatibility! -@return created lock */ -UNIV_INLINE -lock_t* -lock_rec_create( -/*============*/ - lock_t* c_lock, /*!< conflicting lock */ - unsigned type_mode,/*!< in: lock mode and wait flag */ - const buf_block_t* block, /*!< in: buffer block containing - the record */ - ulint heap_no,/*!< in: heap number of the record */ - dict_index_t* index, /*!< in: index of record */ - trx_t* trx, /*!< in,out: transaction */ - bool caller_owns_trx_mutex); - /*!< in: true if caller owns - trx mutex */ - /** Remove a record lock request, waiting or granted, on a discarded page @param in_lock lock object @param cell hash table cell containing in_lock */ @@ -1170,7 +1165,7 @@ void lock_rec_discard(lock_t *in_lock, hash_cell_t &cell) noexcept; /** Create a new record lock and inserts it to the lock queue, without checking for deadlocks or conflicts. -@param[in] c_lock conflicting lock, or NULL +@param c_lock_info conflicting lock info @param[in] type_mode lock mode and wait flag @param[in] page_id index page number @param[in] page R-tree index page, or NULL @@ -1180,8 +1175,8 @@ without checking for deadlocks or conflicts. @param[in] holds_trx_mutex whether the caller holds trx->mutex @return created lock */ lock_t* -lock_rec_create_low( - lock_t* c_lock, +lock_rec_create( + const conflicting_lock_info &c_lock_info, unsigned type_mode, const page_id_t page_id, const page_t* page, @@ -1192,7 +1187,7 @@ lock_rec_create_low( /** Enqueue a waiting request for a lock which cannot be granted immediately. Check for deadlocks. -@param[in] c_lock conflicting lock +@param c_lock_info conflicting lock info @param[in] type_mode the requested lock mode (LOCK_S or LOCK_X) possibly ORed with LOCK_GAP or LOCK_REC_NOT_GAP, ORed with @@ -1210,7 +1205,7 @@ Check for deadlocks. @retval DB_DEADLOCK if this transaction was chosen as the victim */ dberr_t lock_rec_enqueue_waiting( - lock_t* c_lock, + const conflicting_lock_info &c_lock_info, unsigned type_mode, const page_id_t id, const page_t* page, diff --git a/storage/innobase/include/lock0lock.inl b/storage/innobase/include/lock0lock.inl index 1b9255ffb3e..37db4062e8c 100644 --- a/storage/innobase/include/lock0lock.inl +++ b/storage/innobase/include/lock0lock.inl @@ -51,28 +51,3 @@ lock_get_min_heap_no( FALSE))); } } - -/*********************************************************************//** -Creates a new record lock and inserts it to the lock queue. Does NOT check -for deadlocks or lock compatibility! -@return created lock */ -UNIV_INLINE -lock_t* -lock_rec_create( -/*============*/ - lock_t* c_lock, /*!< conflicting lock */ - unsigned type_mode,/*!< in: lock mode and wait flag */ - const buf_block_t* block, /*!< in: buffer block containing - the record */ - ulint heap_no,/*!< in: heap number of the record */ - dict_index_t* index, /*!< in: index of record */ - trx_t* trx, /*!< in,out: transaction */ - bool caller_owns_trx_mutex) - /*!< in: TRUE if caller owns - trx mutex */ -{ - return lock_rec_create_low( - c_lock, - type_mode, block->page.id(), block->page.frame, heap_no, - index, trx, caller_owns_trx_mutex); -} diff --git a/storage/innobase/include/lock0priv.h b/storage/innobase/include/lock0priv.h index e8a4cdd5240..14f0a6e0903 100644 --- a/storage/innobase/include/lock0priv.h +++ b/storage/innobase/include/lock0priv.h @@ -497,14 +497,11 @@ inline byte lock_rec_reset_nth_bit(lock_t* lock, ulint i) return(bit); } -/*********************************************************************//** -Gets the first or next record lock on a page. +/** Gets the first or next record lock on a page. +@param lock a record lock @return next lock, NULL if none exists */ UNIV_INLINE -lock_t* -lock_rec_get_next_on_page( -/*======================*/ - lock_t* lock); /*!< in: a record lock */ +lock_t *lock_rec_get_next_on_page(const lock_t *lock); /*********************************************************************//** Gets the next explicit lock request on a record. diff --git a/storage/innobase/include/lock0priv.inl b/storage/innobase/include/lock0priv.inl index 3c8ec01367b..27f12bc552d 100644 --- a/storage/innobase/include/lock0priv.inl +++ b/storage/innobase/include/lock0priv.inl @@ -101,14 +101,11 @@ lock_rec_set_nth_bit( lock->trx->lock.set_nth_bit_calls++; } -/*********************************************************************//** -Gets the first or next record lock on a page. +/** Gets the first or next record lock on a page. +@param lock a record lock @return next lock, NULL if none exists */ UNIV_INLINE -lock_t* -lock_rec_get_next_on_page( -/*======================*/ - lock_t* lock) /*!< in: a record lock */ +lock_t *lock_rec_get_next_on_page(const lock_t *lock) { return const_cast(lock_rec_get_next_on_page_const(lock)); } @@ -167,14 +164,11 @@ lock_rec_get_nth_bit( return(1 & *b >> (i % 8)); } -/*********************************************************************//** -Gets the first or next record lock on a page. +/** Gets the first or next record lock on a page. +@param lock a record lock @return next lock, NULL if none exists */ UNIV_INLINE -const lock_t* -lock_rec_get_next_on_page_const( -/*============================*/ - const lock_t* lock) /*!< in: a record lock */ +const lock_t *lock_rec_get_next_on_page_const(const lock_t *lock) { ut_ad(!lock->is_table()); diff --git a/storage/innobase/include/lock0types.h b/storage/innobase/include/lock0types.h index 0d00b4b360d..da235fb06a0 100644 --- a/storage/innobase/include/lock0types.h +++ b/storage/innobase/include/lock0types.h @@ -232,11 +232,43 @@ struct ib_lock_t return(static_cast(type_mode & LOCK_MODE_MASK)); } - bool is_rec_granted_exclusive_not_gap() const + static bool is_rec_exclusive_not_gap(unsigned type_mode) { + ut_ad(!(type_mode & LOCK_TABLE)); return (type_mode & (LOCK_MODE_MASK | LOCK_GAP)) == LOCK_X; } + bool is_rec_exclusive_not_gap() const + { + return is_rec_exclusive_not_gap(type_mode); + } + + bool is_waiting_not_gap() const + { + return (type_mode & (LOCK_WAIT | LOCK_GAP)) == LOCK_WAIT; + } + + /** Checks if a lock can be bypassed. + @param has_s_lock_or_stronger if caller's transaction already holds + not gap and not insert intention S-lock + or stronger for the same heap_no as the + current lock + @return true if the lock can be bypassed, false otherwise */ + bool can_be_bypassed(bool has_s_lock_or_stronger) const noexcept + { + ut_ad(!is_table()); + /* We don't neet do check supremum bit in the lock's bitmap here, + because the function is always called after checking for + bypass_mode, which already contains check for supremum. */ + ut_ad(!is_insert_intention() || is_gap()); + /* We don't need to check + trx->lock.wait_trx == blocking_trx && mode() == LOCK_X + condition here because there can be the following case: + S1 X2(waits for S1) S3(waits for X2), + bypassing X1 must not conflict with S3. */ + return has_s_lock_or_stronger && is_waiting_not_gap(); + } + /** Print the lock object into the given output stream. @param[in,out] out the output stream @return the given output stream. */ diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h index 6840b27f5d7..8b9278bf93f 100644 --- a/storage/innobase/include/log0log.h +++ b/storage/innobase/include/log0log.h @@ -282,7 +282,6 @@ public: uint write_size; /** format of the redo log: e.g., FORMAT_10_8 */ uint32_t format; -#ifdef HAVE_INNODB_MMAP /** whether the memory-mapped interface is enabled for the log */ my_bool log_mmap; /** the default value of log_mmap */ @@ -294,7 +293,6 @@ public: # else /* an unnecessary read-ahead of a large ib_logfile0 is a risk */ # endif false; -#endif #if defined __linux__ || defined _WIN32 /** whether file system caching is enabled for the log */ my_bool log_buffered; @@ -349,11 +347,7 @@ public: void set_buf_free(size_t f) noexcept { ut_ad(f < buf_free_LOCK); buf_free.store(f, std::memory_order_relaxed); } -#ifdef HAVE_INNODB_MMAP bool is_mmap() const noexcept { return !flush_buf; } -#else - static constexpr bool is_mmap() { return false; } -#endif /** @return whether a handle to the log is open; is_mmap() && !is_opened() holds for PMEM */ @@ -414,14 +408,9 @@ public: @return whether the memory allocation succeeded */ bool attach(log_file_t file, os_offset_t size); -#ifdef HAVE_INNODB_MMAP /** Disable memory-mapped access (update log_mmap) */ void clear_mmap(); void close_file(bool really_close= true); -#else - static void clear_mmap() {} - void close_file(); -#endif #if defined __linux__ || defined _WIN32 /** Try to enable or disable file system caching (update log_buffered) */ void set_buffered(bool buffered); @@ -466,9 +455,8 @@ public: #ifdef HAVE_PMEM /** Persist the log. - @param lsn desired new value of flushed_to_disk_lsn - @param holding_latch whether the caller is holding exclusive latch */ - void persist(lsn_t lsn, bool holding_latch) noexcept; + @param lsn desired new value of flushed_to_disk_lsn */ + void persist(lsn_t lsn) noexcept; #endif bool check_for_checkpoint() const diff --git a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h index 6121951ad90..6317b0e8710 100644 --- a/storage/innobase/include/log0recv.h +++ b/storage/innobase/include/log0recv.h @@ -420,12 +420,7 @@ public: @tparam storing whether to store the records @param if_exists storing=YES: whether to check if the tablespace exists */ template - static parse_mtr_result parse_mmap(bool if_exists) noexcept -#ifdef HAVE_INNODB_MMAP - ; -#else - { return parse_mtr(if_exists); } -#endif + static parse_mtr_result parse_mmap(bool if_exists) noexcept; /** Erase log records for a page. */ void erase(map::iterator p); diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index d086cfebffc..4ca431711e8 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -681,7 +681,7 @@ private: /** Write a FILE_MODIFY record when a non-predefined persistent tablespace was modified for the first time since fil_names_clear(). */ - ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void name_write(); + ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void name_write() noexcept; /** Encrypt the log */ ATTRIBUTE_NOINLINE void encrypt(); diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index a1a3b8b7e08..c375d5a5e1d 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -214,27 +214,28 @@ public: buf_tmp_buffer_t *slot= nullptr) : bpage(bpage), slot(slot), type(type) {} - bool is_read() const { return (type & READ_SYNC) != 0; } - bool is_write() const { return (type & WRITE_SYNC) != 0; } - bool is_async() const { return (type & (READ_SYNC ^ READ_ASYNC)) != 0; } - bool is_doublewritten() const { return (type & 4) != 0; } + bool is_read() const noexcept { return (type & READ_SYNC) != 0; } + bool is_write() const noexcept { return (type & WRITE_SYNC) != 0; } + bool is_async() const noexcept + { return (type & (READ_SYNC ^ READ_ASYNC)) != 0; } + bool is_doublewritten() const noexcept { return (type & 4) != 0; } /** Create a write request for the doublewrite buffer. */ - IORequest doublewritten() const + IORequest doublewritten() const noexcept { ut_ad(type == WRITE_ASYNC || type == PUNCH); return IORequest{bpage, slot, node, Type(type | 4)}; } - void write_complete(int io_error) const; - void read_complete(int io_error) const; - void fake_read_complete(os_offset_t offset) const; + void write_complete(int io_error) const noexcept; + void read_complete(int io_error) const noexcept; + void fake_read_complete(os_offset_t offset) const noexcept; /** If requested, free storage space associated with a section of the file. @param off byte offset from the start (SEEK_SET) @param len size of the hole in bytes @return DB_SUCCESS or error code */ - dberr_t maybe_punch_hole(os_offset_t off, ulint len) + dberr_t maybe_punch_hole(os_offset_t off, ulint len) noexcept { return off && len && node && (type & (PUNCH ^ WRITE_ASYNC)) ? punch_hole(off, len) @@ -246,7 +247,7 @@ private: @param off byte offset from the start (SEEK_SET) @param len size of the hole in bytes @return DB_SUCCESS or error code */ - dberr_t punch_hole(os_offset_t off, ulint len) const; + dberr_t punch_hole(os_offset_t off, ulint len) const noexcept; public: /** Page to be written on write operation */ @@ -329,8 +330,7 @@ struct os_file_stat_t { the temporary file is created in the in the mysql server configuration parameter (--tmpdir). @return temporary file handle, or NULL on error */ -FILE* -os_file_create_tmpfile(); +FILE *os_file_create_tmpfile() noexcept; /** This function attempts to create a directory named pathname. The new directory @@ -342,10 +342,8 @@ fail_if_exists arguments is true. @param[in] fail_if_exists if true, pre-existing directory is treated as an error. @return true if call succeeds, false on error */ -bool -os_file_create_directory( - const char* pathname, - bool fail_if_exists); +bool os_file_create_directory(const char *pathname, bool fail_if_exists) + noexcept; /** NOTE! Use the corresponding macro os_file_create_simple(), not directly this function! @@ -364,7 +362,7 @@ os_file_create_simple_func( os_file_create_t create_mode, ulint access_type, bool read_only, - bool* success); + bool* success) noexcept; /** NOTE! Use the corresponding macro os_file_create_simple_no_error_handling(), not directly this function! @@ -384,7 +382,7 @@ os_file_create_simple_no_error_handling_func( os_file_create_t create_mode, ulint access_type, bool read_only, - bool* success) + bool* success) noexcept MY_ATTRIBUTE((warn_unused_result)); #ifndef _WIN32 /* On Microsoft Windows, mandatory locking is used */ @@ -392,7 +390,7 @@ os_file_create_simple_no_error_handling_func( @param fd file descriptor @param name file name @return 0 on success */ -int os_file_lock(int fd, const char *name); +int os_file_lock(int fd, const char *name) noexcept; #endif /** NOTE! Use the corresponding macro os_file_create(), not directly @@ -412,7 +410,7 @@ os_file_create_func( os_file_create_t create_mode, ulint type, bool read_only, - bool* success) + bool* success) noexcept MY_ATTRIBUTE((warn_unused_result)); /** Deletes a file. The file has to be closed before calling this. @@ -853,9 +851,7 @@ to original un-instrumented file I/O APIs */ @param[in] file handle to a file @return file size if OK, else set m_total_size to ~0 and m_alloc_size to errno */ -os_file_size_t -os_file_get_size( - const char* filename) +os_file_size_t os_file_get_size(const char *filename) noexcept MY_ATTRIBUTE((warn_unused_result)); /** Determine the logical size of a file. @@ -870,9 +866,7 @@ os_offset_t os_file_get_size(os_file_t file) noexcept /** Truncates a file at its current position. @param[in/out] file file to be truncated @return true if success */ -bool -os_file_set_eof( - FILE* file); /*!< in: file to be truncated */ +bool os_file_set_eof(FILE *file) noexcept; /** Truncate a file to a specified size in bytes. @param[in] pathname file path @@ -885,16 +879,14 @@ os_file_truncate( const char* pathname, os_file_t file, os_offset_t size, - bool allow_shrink = false); + bool allow_shrink = false) noexcept; /** NOTE! Use the corresponding macro os_file_flush(), not directly this function! Flushes the write buffers of a given file to the disk. @param[in] file handle to a file @return true if success */ -bool -os_file_flush_func( - os_file_t file); +bool os_file_flush_func(os_file_t file) noexcept; /** Retrieves the last error number if an error occurs in a file io function. The number should be retrieved before any other OS calls (because they may @@ -906,7 +898,7 @@ the OS error number + OS_FILE_ERROR_MAX is returned. to the log @return error number, or OS error number + OS_FILE_ERROR_MAX */ ulint os_file_get_last_error(bool report_all_errors, - bool on_error_silent= false); + bool on_error_silent= false) noexcept; /** NOTE! Use the corresponding macro os_file_read(), not directly this function! @@ -925,7 +917,7 @@ os_file_read_func( void* buf, os_offset_t offset, ulint n, - ulint* o) + ulint* o) noexcept MY_ATTRIBUTE((warn_unused_result)); /** Rewind file to its start, read at most size - 1 bytes from it to str, and @@ -938,7 +930,7 @@ void os_file_read_string( FILE* file, char* str, - ulint size); + ulint size) noexcept; /** NOTE! Use the corresponding macro os_file_write(), not directly this function! @@ -968,7 +960,7 @@ bool os_file_status( const char* path, bool* exists, - os_file_type_t* type); + os_file_type_t* type) noexcept; /** This function reduces a null-terminated full remote path name into the path that is sent by MySQL for DATA DIRECTORY clause. It replaces @@ -982,34 +974,30 @@ This function manipulates that path in place. If the path format is not as expected, just return. The result is used to inform a SHOW CREATE TABLE command. @param[in,out] data_dir_path Full path/data_dir_path */ -void -os_file_make_data_dir_path( - char* data_dir_path); +void os_file_make_data_dir_path(char *data_dir_path) noexcept; /** Create all missing subdirectories along the given path. @return DB_SUCCESS if OK, otherwise error code. */ -dberr_t -os_file_create_subdirs_if_needed( - const char* path); +dberr_t os_file_create_subdirs_if_needed(const char* path) noexcept; #ifdef UNIV_ENABLE_UNIT_TEST_GET_PARENT_DIR /* Test the function os_file_get_parent_dir. */ void -unit_test_os_file_get_parent_dir(); +unit_test_os_file_get_parent_dir() noexcept; #endif /* UNIV_ENABLE_UNIT_TEST_GET_PARENT_DIR */ /** Initializes the asynchronous io system. */ -int os_aio_init(); +int os_aio_init() noexcept; /** Frees the asynchronous io system. */ -void os_aio_free(); +void os_aio_free() noexcept; /** Submit a fake read request during crash recovery. @param type fake read request @param offset additional context */ -void os_fake_read(const IORequest &type, os_offset_t offset); +void os_fake_read(const IORequest &type, os_offset_t offset) noexcept; /** Request a read or write. @param type I/O request @@ -1018,36 +1006,34 @@ void os_fake_read(const IORequest &type, os_offset_t offset); @param n number of bytes @retval DB_SUCCESS if request was queued successfully @retval DB_IO_ERROR on I/O error */ -dberr_t os_aio(const IORequest &type, void *buf, os_offset_t offset, size_t n); +dberr_t os_aio(const IORequest &type, void *buf, os_offset_t offset, size_t n) + noexcept; /** @return number of pending reads */ -size_t os_aio_pending_reads(); +size_t os_aio_pending_reads() noexcept; /** @return approximate number of pending reads */ -size_t os_aio_pending_reads_approx(); +size_t os_aio_pending_reads_approx() noexcept; /** @return number of pending writes */ -size_t os_aio_pending_writes(); +size_t os_aio_pending_writes() noexcept; /** Wait until there are no pending asynchronous writes. @param declare whether the wait will be declared in tpool */ -void os_aio_wait_until_no_pending_writes(bool declare); +void os_aio_wait_until_no_pending_writes(bool declare) noexcept; /** Wait until all pending asynchronous reads have completed. @param declare whether the wait will be declared in tpool */ -void os_aio_wait_until_no_pending_reads(bool declare); +void os_aio_wait_until_no_pending_reads(bool declare) noexcept; /** Prints info of the aio arrays. @param[in/out] file file where to print */ -void -os_aio_print(FILE* file); +void os_aio_print(FILE *file) noexcept; /** Refreshes the statistics used to print per-second averages. */ -void -os_aio_refresh_stats(); +void os_aio_refresh_stats() noexcept; /** Checks that all slots in the system have been freed, that is, there are no pending io operations. */ -bool -os_aio_all_slots_free(); +bool os_aio_all_slots_free() noexcept; /** This function returns information about the specified file @@ -1062,7 +1048,7 @@ os_file_get_status( const char* path, os_file_stat_t* stat_info, bool check_rw_perm, - bool read_only); + bool read_only) noexcept; #ifdef _WIN32 @@ -1073,7 +1059,7 @@ Make file sparse, on Windows. @param[in] is_sparse if true, make file sparse, otherwise "unsparse" the file @return true on success, false on error */ -bool os_file_set_sparse_win32(os_file_t file, bool is_sparse = true); +bool os_file_set_sparse_win32(os_file_t file, bool is_sparse = true) noexcept; /** Changes file size on Windows @@ -1090,14 +1076,12 @@ If file is normal, file system allocates storage. @param[in] file file handle @param[in] size size to preserve in bytes @return true if success */ -bool -os_file_set_size( - const char* pathname, - os_file_t file, - os_offset_t size); +bool os_file_set_size(const char *pathname, os_file_t file, os_offset_t size) + noexcept; inline bool os_file_set_size(const char* name, os_file_t file, os_offset_t size, bool) + noexcept { return os_file_set_size(name, file, size); } @@ -1121,14 +1105,14 @@ dberr_t os_file_punch_hole( os_file_t fh, os_offset_t off, - os_offset_t len) + os_offset_t len) noexcept MY_ATTRIBUTE((warn_unused_result)); /* Determine if a path is an absolute path or not. @param[in] OS directory or file path to evaluate @retval true if an absolute path @retval false if a relative path */ -inline bool is_absolute_path(const char *path) +inline bool is_absolute_path(const char *path) noexcept { switch (path[0]) { #ifdef _WIN32 diff --git a/storage/innobase/include/row0merge.h b/storage/innobase/include/row0merge.h index fc39a9d24d9..47961ab3146 100644 --- a/storage/innobase/include/row0merge.h +++ b/storage/innobase/include/row0merge.h @@ -447,12 +447,21 @@ class row_merge_bulk_t /** Block for encryption */ row_merge_block_t *m_crypt_block= nullptr; public: + /** If this is false, then there will be only one + bulk_insert_buffered() call for the primary key followed by + load_one_row() and row_ins_clust_index_entry() for subsequent rows. + For secondary indexes or for true, bulk_insert_buffered() will be + invoked for each row. */ + const bool m_sort_primary_key; /** Constructor. Create all merge files, merge buffer for all the table indexes expect fts indexes. Create a merge block which is used to write IO operation - @param table table which undergoes bulk insert operation */ - row_merge_bulk_t(dict_table_t *table); + @param table table which undergoes bulk insert operation + @param sort_primary_key Allow primary key sort for bulk + operation. In case of load, InnoDB skips the + primary key sorting */ + row_merge_bulk_t(dict_table_t *table, bool sort_primary_key); /** Destructor. Remove all merge files, merge buffer for all table indexes. */ @@ -498,4 +507,9 @@ public: /** Init temporary files for each index */ void init_tmp_file(); + + /** Load one row into the primary index + @param trx bulk transaction + @return error code */ + dberr_t load_one_row(trx_t *trx); }; diff --git a/storage/innobase/include/row0mysql.h b/storage/innobase/include/row0mysql.h index 8cbeed7d297..63858f25f02 100644 --- a/storage/innobase/include/row0mysql.h +++ b/storage/innobase/include/row0mysql.h @@ -370,6 +370,15 @@ row_import_tablespace_for_mysql( row_prebuilt_t* prebuilt) /*!< in: prebuilt struct in MySQL */ MY_ATTRIBUTE((nonnull, warn_unused_result)); +enum rename_fk { + /** ignore FOREIGN KEY constraints */ + RENAME_IGNORE_FK= 0, + /** Rename a table as part of a native table-rebuilding DDL operation */ + RENAME_REBUILD, + /** Rename as part of ALTER TABLE...ALGORITHM=COPY */ + RENAME_ALTER_COPY +}; + /*********************************************************************//** Renames a table for MySQL. @return error code or DB_SUCCESS */ @@ -379,7 +388,7 @@ row_rename_table_for_mysql( const char* old_name, /*!< in: old table name */ const char* new_name, /*!< in: new table name */ trx_t* trx, /*!< in/out: transaction */ - bool use_fk) /*!< in: whether to parse and enforce + rename_fk fk) /*!< in: how to handle FOREIGN KEY constraints */ MY_ATTRIBUTE((nonnull, warn_unused_result)); diff --git a/storage/innobase/include/small_vector.h b/storage/innobase/include/small_vector.h index d28a36184b8..2acdc49f668 100644 --- a/storage/innobase/include/small_vector.h +++ b/storage/innobase/include/small_vector.h @@ -31,14 +31,14 @@ protected: small_vector_base()= delete; small_vector_base(void *small, size_t small_size) : BeginX(small), Capacity(Size_T(small_size)) {} - ATTRIBUTE_COLD void grow_by_1(void *small, size_t element_size); + ATTRIBUTE_COLD void grow_by_1(void *small, size_t element_size) noexcept; public: - size_t size() const { return Size; } - size_t capacity() const { return Capacity; } - bool empty() const { return !Size; } - void clear() { Size= 0; } + size_t size() const noexcept { return Size; } + size_t capacity() const noexcept { return Capacity; } + bool empty() const noexcept { return !Size; } + void clear() noexcept { Size= 0; } protected: - void set_size(size_t N) { Size= Size_T(N); } + void set_size(size_t N) noexcept { Size= Size_T(N); } }; template @@ -49,7 +49,7 @@ class small_vector : public small_vector_base using small_vector_base::set_size; - void grow_if_needed() + void grow_if_needed() noexcept { if (unlikely(size() >= capacity())) grow_by_1(small, sizeof *small); @@ -60,38 +60,67 @@ public: { TRASH_ALLOC(small, sizeof small); } - ~small_vector() + ~small_vector() noexcept { if (small != begin()) my_free(begin()); MEM_MAKE_ADDRESSABLE(small, sizeof small); } + void fake_defined() const noexcept + { + ut_ad(empty()); + MEM_MAKE_DEFINED(small, sizeof small); + } + void make_undefined() const noexcept { MEM_UNDEFINED(small, sizeof small); } + + bool is_small() const noexcept { return small == BeginX; } + + void deep_clear() noexcept + { + if (!is_small()) + { + my_free(BeginX); + BeginX= small; + Capacity= N; + } + ut_ad(capacity() == N); + set_size(0); + } + using iterator= T *; using const_iterator= const T *; using reverse_iterator= std::reverse_iterator; using reference= T &; using const_reference= const T&; - iterator begin() { return static_cast(BeginX); } - const_iterator begin() const { return static_cast(BeginX); } - iterator end() { return begin() + size(); } - const_iterator end() const { return begin() + size(); } + iterator begin() noexcept { return static_cast(BeginX); } + const_iterator begin() const noexcept + { return static_cast(BeginX); } + iterator end() noexcept { return begin() + size(); } + const_iterator end() const noexcept { return begin() + size(); } - reverse_iterator rbegin() { return reverse_iterator(end()); } - reverse_iterator rend() { return reverse_iterator(begin()); } + reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } + reverse_iterator rend() noexcept { return reverse_iterator(begin()); } - reference operator[](size_t i) { assert(i < size()); return begin()[i]; } - const_reference operator[](size_t i) const + reference operator[](size_t i) noexcept + { assert(i < size()); return begin()[i]; } + const_reference operator[](size_t i) const noexcept { return const_cast(*this)[i]; } - void erase(const_iterator S, const_iterator E) + void erase(const_iterator S, const_iterator E) noexcept { set_size(std::move(const_cast(E), end(), const_cast(S)) - begin()); } - void emplace_back(T &&arg) + void emplace_back(T &&arg) noexcept + { + grow_if_needed(); + ::new (end()) T(arg); + set_size(size() + 1); + } + void emplace_back(T &arg) noexcept { grow_if_needed(); ::new (end()) T(arg); diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index b7f40dd2be8..a694024406f 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -394,6 +394,7 @@ extern ulong srv_buf_dump_status_frequency; # ifdef UNIV_PFS_THREAD extern mysql_pfs_key_t page_cleaner_thread_key; +extern mysql_pfs_key_t page_encrypt_thread_key; extern mysql_pfs_key_t trx_rollback_clean_thread_key; extern mysql_pfs_key_t thread_pool_thread_key; diff --git a/storage/innobase/include/sux_lock.h b/storage/innobase/include/sux_lock.h index 4d9a50b528e..a5b09693107 100644 --- a/storage/innobase/include/sux_lock.h +++ b/storage/innobase/include/sux_lock.h @@ -121,15 +121,13 @@ private: @param id the new owner of the U or X lock */ void set_new_owner(pthread_t id) { - IF_DBUG(DBUG_ASSERT(writer.exchange(id, std::memory_order_relaxed)), - writer.store(id, std::memory_order_relaxed)); + writer.store(id, std::memory_order_relaxed); } /** Assign the ownership of a write lock to a thread @param id the owner of the U or X lock */ void set_first_owner(pthread_t id) { - IF_DBUG(DBUG_ASSERT(!writer.exchange(id, std::memory_order_relaxed)), - writer.store(id, std::memory_order_relaxed)); + writer.store(id, std::memory_order_relaxed); } #ifdef UNIV_DEBUG /** Register the current thread as a holder of a shared lock */ diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 75e7e3c6885..7a55c2003c9 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -32,10 +32,10 @@ Created 3/26/1996 Heikki Tuuri #include "que0types.h" #include "mem0mem.h" #include "trx0xa.h" -#include "ut0vec.h" #include "fts0fts.h" #include "read0types.h" #include "ilist.h" +#include "small_vector.h" #include "row0merge.h" #include @@ -211,9 +211,6 @@ trx_print_low( /*!< in: output stream */ const trx_t* trx, /*!< in: transaction */ - ulint max_query_len, - /*!< in: max query length to print, - or 0 to use the default max length */ ulint n_rec_locks, /*!< in: trx->lock.n_rec_locks */ ulint n_trx_locks, @@ -228,9 +225,7 @@ void trx_print_latched( /*==============*/ FILE* f, /*!< in: output stream */ - const trx_t* trx, /*!< in: transaction */ - ulint max_query_len); /*!< in: max query length to print, - or 0 to use the default max length */ + const trx_t* trx); /*!< in: transaction */ /**********************************************************************//** Prints info about a transaction. @@ -239,9 +234,7 @@ void trx_print( /*======*/ FILE* f, /*!< in: output stream */ - const trx_t* trx, /*!< in: transaction */ - ulint max_query_len); /*!< in: max query length to print, - or 0 to use the default max length */ + const trx_t* trx); /*!< in: transaction */ /**********************************************************************//** Determines if a transaction is in the given state. @@ -458,12 +451,13 @@ public: } /** Notify the start of a bulk insert operation - @param table table to do bulk operation */ - void start_bulk_insert(dict_table_t *table) + @param table table to do bulk operation + @param also_primary start bulk insert operation for primary index */ + void start_bulk_insert(dict_table_t *table, bool also_primary) { first|= BULK; if (!table->is_temporary()) - bulk_store= new row_merge_bulk_t(table); + bulk_store= new row_merge_bulk_t(table, also_primary); } /** Notify the end of a bulk insert operation */ @@ -518,6 +512,12 @@ public: return bulk_store && is_bulk_insert(); } + /** @return whether InnoDB has to skip sort for clustered index */ + bool skip_sort_pk() const + { + return bulk_store && !bulk_store->m_sort_primary_key; + } + /** Free bulk insert operation */ void clear_bulk_buffer() { @@ -671,14 +671,14 @@ public: { ut_ad(!mutex_is_owner()); mutex.wr_lock(); - ut_ad(!mutex_owner.exchange(pthread_self(), - std::memory_order_relaxed)); + assert(!mutex_owner.exchange(pthread_self(), + std::memory_order_relaxed)); } /** Release the mutex */ void mutex_unlock() { - ut_ad(mutex_owner.exchange(0, std::memory_order_relaxed) - == pthread_self()); + assert(mutex_owner.exchange(0, std::memory_order_relaxed) == + pthread_self()); mutex.wr_unlock(); } #ifndef SUX_LOCK_GENERIC @@ -911,12 +911,10 @@ public: ulint n_autoinc_rows; /*!< no. of AUTO-INC rows required for an SQL statement. This is useful for multi-row INSERTs */ - ib_vector_t* autoinc_locks; /* AUTOINC locks held by this - transaction. Note that these are - also in the lock list trx_locks. This - vector needs to be freed explicitly - when the trx instance is destroyed. - Protected by lock_sys.latch. */ + typedef small_vector autoinc_lock_vector; + /** AUTO_INCREMENT locks held by this transaction; a subset of trx_locks, + protected by lock_sys.latch. */ + autoinc_lock_vector autoinc_locks; /*------------------------------*/ bool read_only; /*!< true if transaction is flagged as a READ-ONLY transaction. @@ -1113,7 +1111,7 @@ public: ut_ad(!lock.wait_lock); ut_ad(UT_LIST_GET_LEN(lock.trx_locks) == 0); ut_ad(lock.table_locks.empty()); - ut_ad(!autoinc_locks || ib_vector_is_empty(autoinc_locks)); + ut_ad(autoinc_locks.empty()); ut_ad(UT_LIST_GET_LEN(lock.evicted_tables) == 0); ut_ad(!dict_operation); ut_ad(!apply_online_log); @@ -1160,17 +1158,22 @@ public: return false; } - /** @return logical modification time of a table only - if the table has bulk buffer exist in the transaction */ - trx_mod_table_time_t *check_bulk_buffer(dict_table_t *table) + /** + @return logical modification time of a table + @retval nullptr if the table doesn't have bulk buffer or + can skip sorting for primary key */ + trx_mod_table_time_t *use_bulk_buffer(dict_index_t *index) noexcept { if (UNIV_LIKELY(!bulk_insert)) return nullptr; - ut_ad(table->skip_alter_undo || !check_unique_secondary); - ut_ad(table->skip_alter_undo || !check_foreigns); - auto it= mod_tables.find(table); + ut_ad(index->table->skip_alter_undo || !check_unique_secondary); + ut_ad(index->table->skip_alter_undo || !check_foreigns); + auto it= mod_tables.find(index->table); if (it == mod_tables.end() || !it->second.bulk_buffer_exist()) return nullptr; + /* Avoid using bulk buffer for load statement */ + if (index->is_clust() && it->second.skip_sort_pk()) + return nullptr; return &it->second; } diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index 91433e86fbd..490f71653f7 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -168,9 +168,6 @@ using the call command. */ #define UNIV_INLINE static inline #define UNIV_WORD_SIZE SIZEOF_SIZE_T -#if SIZEOF_SIZE_T == 8 -# define HAVE_INNODB_MMAP -#endif /** The following alignment is used in memory allocations in memory heap management to ensure correct alignment for doubles etc. */ diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 1f5e9941fbb..1fc8b52e940 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -56,6 +56,8 @@ Created 5/7/1996 Heikki Tuuri #include #endif /* WITH_WSREP */ +const conflicting_lock_info null_c_lock_info{nullptr, nullptr, ut_d(nullptr)}; + /** The value of innodb_deadlock_detect */ my_bool innodb_deadlock_detect; /** The value of innodb_deadlock_report */ @@ -984,13 +986,14 @@ lock_rec_get_prev( ut_ad(!in_lock->is_table()); const page_id_t id{in_lock->un_member.rec_lock.page_id}; hash_cell_t *cell= lock_sys.hash_get(in_lock->type_mode).cell_get(id.fold()); + lock_t *prev_lock= nullptr; for (lock_t *lock= lock_sys_t::get_first(*cell, id); lock != in_lock; lock= lock_rec_get_next_on_page(lock)) if (lock_rec_get_nth_bit(lock, heap_no)) - return lock; + prev_lock= lock; - return nullptr; + return prev_lock; } /*============= FUNCTIONS FOR ANALYZING RECORD LOCK QUEUE ================*/ @@ -1159,12 +1162,23 @@ func_exit: lock= lock_rec_get_next(heap_no, lock); do { + /* TODO: Conflicting locks can be only before the waiting lock, + consider the following optimization: + if (lock == wait_lock) + break; */ /* This is similar case as above except here we have record-locks instead of table locks. See details from comment above. */ if (lock->trx->mysql_thd && wsrep_will_BF_abort(lock, trx)) { + /* There can't be bypassed locks because: + 1. The transaction can't be blocked by lock to bypass because + lock_rec_other_has_conflicting() does not treat such lock as + conflicting. + 2. The lock is placed before bypassed lock in + lock_rec_create_low(). + TODO: add debug check here */ victims.emplace(lock->trx); } } while ((lock= lock_rec_get_next(heap_no, lock))); @@ -1200,8 +1214,22 @@ func_exit: } #endif /* WITH_WSREP */ -/*********************************************************************//** -Checks if some other transaction has a conflicting explicit lock request +static inline bool lock_rec_can_be_bypassing(const trx_t *trx, + const lock_t *lock) +{ + ut_ad(!lock->is_insert_intention() || lock->is_gap()); + static_assert(int{LOCK_S} == 2, ""); + static_assert(int{LOCK_X} == 3, ""); + /* The below is an optimization of the following: + return lock->trx == trx && !(lock->type_mode & (LOCK_WAIT | LOCK_GAP)) && + lock_mode_stronger_or_eq(lock->mode(), LOCK_S); + The bitwise & with LOCK_MODE_MASK - 1 will map both LOCK_X and LOCK_S to + LOCK_S, which we are comparing to. */ + return lock->trx == trx && + (lock->type_mode & (LOCK_WAIT | LOCK_GAP | (LOCK_MODE_MASK - 1))) == LOCK_S; +} + +/** Checks if some other transaction has a conflicting explicit lock request in the queue, so that we have to wait. @param[in] mode LOCK_S or LOCK_X, possibly ORed to LOCK_GAP or LOC_REC_NOT_GAP, LOCK_INSERT_INTENTION @@ -1209,23 +1237,48 @@ LOCK_INSERT_INTENTION @param[in] id page identifier @param[in] heap_no heap number of the record @param[in] trx our transaction -@return conflicting lock and the flag which indicated if conflicting locks -which wait for the current transaction were ignored */ -static lock_t *lock_rec_other_has_conflicting(unsigned mode, - const hash_cell_t &cell, - const page_id_t id, - ulint heap_no, const trx_t *trx) +@return conflicting lock, lock after which new lock should be inserted +in lock queue in the case when the conflicting lock must be bypassed and +bypassed lock */ +static conflicting_lock_info +lock_rec_other_has_conflicting(unsigned mode, const hash_cell_t &cell, + const page_id_t id, ulint heap_no, + const trx_t *trx) noexcept { - bool is_supremum = (heap_no == PAGE_HEAP_NO_SUPREMUM); + const bool is_supremum= (heap_no == PAGE_HEAP_NO_SUPREMUM); + ut_ad(!(mode & LOCK_INSERT_INTENTION) || (mode & LOCK_GAP) || is_supremum); + const bool bypass_mode= + !is_supremum && lock_t::is_rec_exclusive_not_gap(mode); + bool has_s_lock_or_stronger= false; + const lock_t *insert_after= nullptr; + ut_d(const lock_t *bypassed= nullptr;) + const lock_t *prev_lock= nullptr; - for (lock_t* lock = lock_sys_t::get_first(cell, id, heap_no); - lock; lock = lock_rec_get_next(heap_no, lock)) { - if (lock_rec_has_to_wait(trx, mode, lock, is_supremum)) { - return(lock); - } - } + for (lock_t *lock= lock_sys_t::get_first(cell, id, heap_no); lock; + lock= lock_rec_get_next(heap_no, lock)) + { + if (bypass_mode && lock_rec_can_be_bypassing(trx, lock)) + { + has_s_lock_or_stronger= true; + } + else if (lock_rec_has_to_wait(trx, mode, lock, is_supremum)) + { + if (!bypass_mode || !lock->can_be_bypassed(has_s_lock_or_stronger)) + return {lock, nullptr, ut_d(nullptr)}; + /* Store the first lock to bypass to invoke + lock_rec_find_similar_on_page() only for the locks which precede all + bypassed locks. */ + ut_d(if (!bypassed) bypassed= lock;) + /* There can be several locks to bypass, insert bypassing lock just + before the first bypassed lock. */ + if (!insert_after) + insert_after= prev_lock; + continue; + } + prev_lock= lock; + } - return(NULL); + return {nullptr, const_cast(insert_after), ut_d(bypassed)}; } /*********************************************************************//** @@ -1294,6 +1347,69 @@ lock_number_of_tables_locked( /*============== RECORD LOCK CREATION AND QUEUE MANAGEMENT =============*/ +#ifdef UNIV_DEBUG +/** Validates the correctness of locks bypassing in lock queue on a single +record, i.e. there must not be the following sequence: + (trx1 S) (trx2 X) (trx3 X) (trx1 X) +If bypassing works correctly, where must be the following sequence instead of +the above: + (trx1 S) (trx1 X) (trx2 X) (trx3 X) +Note the above locks are record or next-key locks. +If wrong sequence is found, the function will crash with failed assertion. +@param checked_lock the lock up to which the queue to check +@param heap_no heap_no of the queue to check */ +static void lock_rec_queue_validate_bypass(const lock_t *checked_lock, + ulint heap_no) +{ + /* "do_lock_reverse_page_reorganize" causes lock queue reversing during page + reorganizing, which causes validation failure. Skip the validation for such + case. */ + DBUG_EXECUTE_IF("do_lock_reverse_page_reorganize", return;); + if (!checked_lock || checked_lock->is_waiting()) + return; + page_id_t page_id= checked_lock->un_member.rec_lock.page_id; + hash_cell_t *cell= lock_sys.rec_hash.cell_get(page_id.fold()); + auto mode= checked_lock->type_mode; + const trx_t *trx= checked_lock->trx; + const bool is_supremum= (heap_no == PAGE_HEAP_NO_SUPREMUM); + ut_ad(!(mode & LOCK_INSERT_INTENTION) || (mode & LOCK_GAP) || is_supremum); + if (is_supremum || !lock_t::is_rec_exclusive_not_gap(mode)) + return; + const lock_t *has_s_lock_or_stronger= nullptr; + const lock_t *bypassed= nullptr; + + for (lock_t *lock= lock_sys_t::get_first(*cell, page_id, heap_no); lock; + lock= lock_rec_get_next(heap_no, lock)) + { + if (lock_rec_can_be_bypassing(trx, lock)) + { + ut_ad(!bypassed || lock != checked_lock); + has_s_lock_or_stronger= lock; + continue; + } + if (lock_rec_has_to_wait(trx, mode, lock, is_supremum)) + { + if (!lock->can_be_bypassed(has_s_lock_or_stronger)) + return; + bypassed= lock; + } + ut_ad(lock != checked_lock || !bypassed); + if (lock == checked_lock) + return; + } +} + +/** Validates the correctness of locks bypassing in lock queue for each set bit +in the lock bitmap. If wrong sequence is found, the function will crash with +failed assertion. +@param lock the lock which bitmap to be checked */ +static void lock_rec_queue_validate_bypass(const lock_t *lock) { + for (ulint i= 0; i < lock_rec_get_n_bits(lock); ++i) + if (lock_rec_get_nth_bit(lock, i)) + lock_rec_queue_validate_bypass(lock, i); +} +#endif + /** Reset the wait status of a lock. @param[in,out] lock lock that was possibly being waited for */ static void lock_reset_lock_and_trx_wait(lock_t *lock) @@ -1308,6 +1424,10 @@ static void lock_reset_lock_and_trx_wait(lock_t *lock) trx->lock.wait_lock= nullptr; trx->lock.wait_trx= nullptr; lock->type_mode&= ~LOCK_WAIT; +#ifdef UNIV_DEBUG + if (!lock->is_table()) + lock_rec_queue_validate_bypass(lock); +#endif } #ifdef UNIV_DEBUG @@ -1325,7 +1445,7 @@ static void check_trx_state(const trx_t *trx) /** Create a new record lock and inserts it to the lock queue, without checking for deadlocks or conflicts. -@param[in] c_lock conflicting lock +@param[in] c_lock_info conflicting lock info @param[in] type_mode lock mode and wait flag @param[in] page_id index page number @param[in] page R-tree index page, or NULL @@ -1335,8 +1455,8 @@ without checking for deadlocks or conflicts. @param[in] holds_trx_mutex whether the caller holds trx->mutex @return created lock */ lock_t* -lock_rec_create_low( - lock_t* c_lock, +lock_rec_create( + const conflicting_lock_info &c_lock_info, unsigned type_mode, const page_id_t page_id, const page_t* page, @@ -1354,6 +1474,8 @@ lock_rec_create_low( ut_ad(!(type_mode & LOCK_TABLE)); ut_ad(trx->state != TRX_STATE_NOT_STARTED); ut_ad(!trx->is_autocommit_non_locking()); + ut_ad(c_lock_info.insert_after ? !(type_mode & LOCK_WAIT) : + !c_lock_info.bypassed); /* If rec is the supremum record, then we reset the gap and LOCK_REC_NOT_GAP bits, as all locks on the supremum are @@ -1424,23 +1546,30 @@ lock_rec_create_low( } else { /* Predicate lock always on INFIMUM (0) */ lock->un_member.rec_lock.n_bits = 8; - } + } lock_rec_bitmap_reset(lock); lock_rec_set_nth_bit(lock, heap_no); index->table->n_rec_locks++; ut_ad(index->table->get_ref_count() || !index->table->can_be_evicted); const auto lock_hash = &lock_sys.hash_get(type_mode); - lock_hash->cell_get(page_id.fold())->append(*lock, &lock_t::hash); + hash_cell_t& cell = *lock_hash->cell_get(page_id.fold()); + if (UNIV_LIKELY(!c_lock_info.insert_after)) + cell.append(*lock, &lock_t::hash); + else + cell.insert_after(*c_lock_info.insert_after, *lock, + &lock_t::hash); if (type_mode & LOCK_WAIT) { if (trx->lock.wait_trx) { - ut_ad(!c_lock || trx->lock.wait_trx == c_lock->trx); + ut_ad(!c_lock_info.conflicting + || trx->lock.wait_trx + == c_lock_info.conflicting->trx); ut_ad(trx->lock.wait_lock); ut_ad((*trx->lock.wait_lock).trx == trx); } else { - ut_ad(c_lock); - trx->lock.wait_trx = c_lock->trx; + ut_ad(c_lock_info.conflicting); + trx->lock.wait_trx = c_lock_info.conflicting->trx; ut_ad(!trx->lock.wait_lock); } trx->lock.wait_lock = lock; @@ -1451,12 +1580,13 @@ lock_rec_create_low( } MONITOR_INC(MONITOR_RECLOCK_CREATED); MONITOR_INC(MONITOR_NUM_RECLOCK); - + ut_d(lock_rec_queue_validate_bypass(lock, heap_no)); return lock; } /** Enqueue a waiting request for a lock which cannot be granted immediately. Check for deadlocks. +@param c_lock_info conflicting lock info @param[in] type_mode the requested lock mode (LOCK_S or LOCK_X) possibly ORed with LOCK_GAP or LOCK_REC_NOT_GAP, ORed with @@ -1474,7 +1604,7 @@ Check for deadlocks. @retval DB_DEADLOCK if this transaction was chosen as the victim */ dberr_t lock_rec_enqueue_waiting( - lock_t* c_lock, + const conflicting_lock_info &c_lock_info, unsigned type_mode, const page_id_t id, const page_t* page, @@ -1506,8 +1636,8 @@ lock_rec_enqueue_waiting( /* Enqueue the lock request that will wait to be granted, note that we already own the trx mutex. */ - lock_t* lock = lock_rec_create_low( - c_lock, + lock_t* lock = lock_rec_create( + c_lock_info, type_mode | LOCK_WAIT, id, page, heap_no, index, trx, true); if (prdt && type_mode & LOCK_PREDICATE) { @@ -1525,18 +1655,20 @@ lock_rec_enqueue_waiting( return DB_LOCK_WAIT; } -/*********************************************************************//** -Looks for a suitable type record lock struct by the same trx on the same page. -This can be used to save space when a new record lock should be set on a page: -no new struct is needed, if a suitable old is found. +/** Looks for a suitable type record lock struct by the same trx on the same +page. This can be used to save space when a new record lock should be set on a +page: no new struct is needed, if a suitable old is found. +@param type_mode lock type_mode field +@param heap_no heap number of the record +@param lock lock_sys.get_first() +@param last_lock the lock up to which to find +@param trx the transaction which lock we are looking for @return lock or NULL */ -static inline -lock_t* -lock_rec_find_similar_on_page( - ulint type_mode, /*!< in: lock type_mode field */ - ulint heap_no, /*!< in: heap number of the record */ - lock_t* lock, /*!< in: lock_sys.get_first() */ - const trx_t* trx) /*!< in: transaction */ +static inline lock_t *lock_rec_find_similar_on_page(ulint type_mode, + ulint heap_no, + const lock_t *lock, + const lock_t *last_lock, + const trx_t *trx) { lock_sys.rec_hash.assert_locked(lock->un_member.rec_lock.page_id); DBUG_EXECUTE_IF("innodb_skip_lock_bitmap", { @@ -1546,14 +1678,14 @@ lock_rec_find_similar_on_page( }); for (/* No op */; - lock != NULL; + lock != last_lock; lock = lock_rec_get_next_on_page(lock)) { if (lock->trx == trx && lock->type_mode == type_mode && lock_rec_get_n_bits(lock) > heap_no) { - return(lock); + return const_cast(lock); } } @@ -1576,7 +1708,8 @@ which does NOT check for deadlocks or lock compatibility! @param[in,out] trx transaction @param[in] caller_owns_trx_mutex TRUE if caller owns the transaction mutex */ TRANSACTIONAL_TARGET -static void lock_rec_add_to_queue(unsigned type_mode, const hash_cell_t &cell, +static void lock_rec_add_to_queue(const conflicting_lock_info &c_lock_info, + unsigned type_mode, const hash_cell_t &cell, const page_id_t id, const page_t *page, ulint heap_no, dict_index_t *index, trx_t *trx, bool caller_owns_trx_mutex) @@ -1623,8 +1756,8 @@ static void lock_rec_add_to_queue(unsigned type_mode, const hash_cell_t &cell, all locks on the supremum are automatically of the gap type, and we try to avoid unnecessary memory consumption of a new record lock struct for a gap type lock */ - - if (heap_no == PAGE_HEAP_NO_SUPREMUM) { + const bool is_supremum = heap_no == PAGE_HEAP_NO_SUPREMUM; + if (is_supremum) { ut_ad(!(type_mode & LOCK_REC_NOT_GAP)); /* There should never be LOCK_REC_NOT_GAP on a supremum @@ -1634,23 +1767,47 @@ static void lock_rec_add_to_queue(unsigned type_mode, const hash_cell_t &cell, } if (type_mode & LOCK_WAIT) { - goto create; } else if (lock_t *first_lock = lock_sys_t::get_first(cell, id)) { + ut_ad(!(type_mode & LOCK_INSERT_INTENTION) + || (type_mode & LOCK_GAP) || is_supremum); + const bool bypass_mode = !is_supremum + && lock_t::is_rec_exclusive_not_gap(type_mode); + bool has_s_lock_or_stronger = false; for (lock_t* lock = first_lock;;) { - if (lock->is_waiting() - && lock_rec_get_nth_bit(lock, heap_no)) { - goto create; + if (!lock_rec_get_nth_bit(lock, heap_no)) + goto cont; + ut_ad(!lock->is_insert_intention() || lock->is_gap() + || is_supremum); + if (bypass_mode && lock_rec_can_be_bypassing(trx, lock)) + { + has_s_lock_or_stronger= true; } + /* There can be several locks suited for bypassing, + skip them all, the below condition is optimization of + lock->is_waiting() + && (!bypass_mode || !lock->can_be_bypassed( + has_s_lock_or_stronger)) + so we don't have to check lock's 'waiting' flag twice.*/ + else if (lock->is_waiting() + && (!bypass_mode || !has_s_lock_or_stronger + || !lock->is_gap())) + goto create; +cont: if (!(lock = lock_rec_get_next_on_page(lock))) { break; } } + const lock_t *bypassed = c_lock_info.insert_after + ? lock_rec_get_next(heap_no, c_lock_info.insert_after) + : nullptr; + ut_ad(bypassed == c_lock_info.bypassed); /* Look for a similar record lock on the same page: if one is found and there are no waiting lock requests, we can just set the bit */ if (lock_t* lock = lock_rec_find_similar_on_page( - type_mode, heap_no, first_lock, trx)) { + type_mode, heap_no, first_lock, + bypassed, trx)) { trx_t* lock_trx = lock->trx; if (caller_owns_trx_mutex) { trx->mutex_unlock(); @@ -1663,6 +1820,7 @@ static void lock_rec_add_to_queue(unsigned type_mode, const hash_cell_t &cell, if (caller_owns_trx_mutex) { trx->mutex_lock(); } + ut_d(lock_rec_queue_validate_bypass(lock)); return; } } @@ -1672,9 +1830,9 @@ create: because we should be moving an existing waiting lock request. */ ut_ad(!(type_mode & LOCK_WAIT) || trx->lock.wait_trx); - lock_rec_create_low(nullptr, - type_mode, id, page, heap_no, index, trx, - caller_owns_trx_mutex); + lock_rec_create(c_lock_info, + type_mode, id, page, heap_no, index, trx, + caller_owns_trx_mutex); } /** A helper function for lock_rec_lock_slow(), which grants a Next Key Lock @@ -1713,12 +1871,13 @@ static void lock_reuse_for_next_key_lock(const lock_t *held_lock, that GAP Locks do not conflict with anything. Therefore a GAP Lock could be granted to us right now if we've requested: */ mode|= LOCK_GAP; - ut_ad(nullptr == - lock_rec_other_has_conflicting(mode, cell, id, heap_no, trx)); + ut_ad(nullptr == lock_rec_other_has_conflicting(mode, cell, id, heap_no, trx) + .conflicting); /* It might be the case we already have one, so we first check that. */ if (lock_rec_has_expl(mode, cell, id, heap_no, trx) == nullptr) - lock_rec_add_to_queue(mode, cell, id, page, heap_no, index, trx, true); + lock_rec_add_to_queue(null_c_lock_info, mode, cell, id, page, heap_no, + index, trx, true); } @@ -1806,21 +1965,26 @@ lock_rec_lock( /* Do nothing if the trx already has a strong enough lock on rec */ if (!held_lock) { - if (lock_t *c_lock= lock_rec_other_has_conflicting(mode, g.cell(), id, - heap_no, trx)) + conflicting_lock_info c_lock_info= + lock_rec_other_has_conflicting(mode, g.cell(), id, heap_no, trx); + if (c_lock_info.conflicting) /* If another transaction has a non-gap conflicting request in the queue, as this transaction does not have a lock strong enough already granted on the record, we have to wait. */ - err= lock_rec_enqueue_waiting(c_lock, mode, id, block->page.frame, - heap_no, index, thr, nullptr); - else if (!impl) + err= lock_rec_enqueue_waiting(c_lock_info, mode, id, + block->page.frame, heap_no, index, thr, + nullptr); + /* If some lock was bypassed, we need to create explicit lock to avoid + conflicting lock search on every try to convert implicit to explicit + lock. */ + else if (!impl || c_lock_info.insert_after) { /* Set the requested lock on the record. */ - lock_rec_add_to_queue(mode, g.cell(), id, block->page.frame, heap_no, - index, trx, true); + lock_rec_add_to_queue(c_lock_info, mode, g.cell(), id, + block->page.frame, heap_no, index, trx, true); err= DB_SUCCESS_LOCKED_REC; } } @@ -1853,46 +2017,74 @@ lock_rec_lock( /* Simplified and faster path for the most common cases */ if (!impl) - lock_rec_create_low(nullptr, mode, id, block->page.frame, heap_no, index, - trx, false); + lock_rec_create(null_c_lock_info, mode, id, block->page.frame, heap_no, + index, trx, false); return DB_SUCCESS_LOCKED_REC; } -/*********************************************************************//** -Checks if a waiting record lock request still has to wait in a queue. -@return lock that is causing the wait */ -static -const lock_t* +/** Checks if a waiting record lock request still has to wait in a queue. +@param cell record locks hash table cell for waiting lock +@param wait_lock waiting lock +@return lock that is causing the wait, lock after which new lock should be +inserted in lock queue in the case when the lock that is causing the wait must +be bypassed and bypassed lock itself */ +static conflicting_lock_info lock_rec_has_to_wait_in_queue(const hash_cell_t &cell, const lock_t *wait_lock) { - const lock_t* lock; - ulint heap_no; - ulint bit_mask; - ulint bit_offset; + const lock_t *lock; + ulint heap_no; + ulint bit_mask; + ulint bit_offset; - ut_ad(wait_lock->is_waiting()); - ut_ad(!wait_lock->is_table()); + ut_ad(wait_lock->is_waiting()); + ut_ad(!wait_lock->is_table()); - heap_no = lock_rec_find_set_bit(wait_lock); + heap_no= lock_rec_find_set_bit(wait_lock); + const bool is_supremum= (heap_no == PAGE_HEAP_NO_SUPREMUM); + ut_ad(!(wait_lock->is_insert_intention()) || + (wait_lock->is_gap()) || is_supremum); + const bool bypass_mode= + !is_supremum && wait_lock->is_rec_exclusive_not_gap(); + bool has_s_lock_or_stronger= false; + const lock_t *insert_after= nullptr; + ut_d(const lock_t *bypassed= nullptr); - bit_offset = heap_no / 8; - bit_mask = static_cast(1) << (heap_no % 8); + bit_offset= heap_no / 8; + bit_mask= static_cast(1) << (heap_no % 8); - for (lock = lock_sys_t::get_first( - cell, wait_lock->un_member.rec_lock.page_id); - lock != wait_lock; - lock = lock_rec_get_next_on_page_const(lock)) { - const byte* p = (const byte*) &lock[1]; - - if (heap_no < lock_rec_get_n_bits(lock) - && (p[bit_offset] & bit_mask) - && lock_has_to_wait(wait_lock, lock)) { - return(lock); - } - } - - return(NULL); + const trx_t *trx= wait_lock->trx; + const lock_t *prev_lock= nullptr; + /* We can't use lock_sys_t::get_first(cell, id, heap_no) here as in + lock_rec_other_has_conflicting() because we iterate locks only till + wait_lock */ + for (lock= + lock_sys_t::get_first(cell, wait_lock->un_member.rec_lock.page_id); + lock != wait_lock; lock= lock_rec_get_next_on_page_const(lock)) + { + const byte *p= (const byte *) &lock[1]; + if (heap_no >= lock_rec_get_n_bits(lock) || !(p[bit_offset] & bit_mask)) + continue; + if (bypass_mode && lock_rec_can_be_bypassing(trx, lock)) + { + has_s_lock_or_stronger= true; + } + else if (lock_has_to_wait(wait_lock, lock)) + { + if (!bypass_mode || !lock->can_be_bypassed(has_s_lock_or_stronger)) + return {lock, nullptr, ut_d(nullptr)}; + /* Store only the first lock to bypass. */ + ut_d(if (!bypassed) + bypassed= lock;) + /* There can be several locks to bypass, insert bypassing lock just + before the first bypassed lock. */ + if (!insert_after) + insert_after= prev_lock; + continue; + } + prev_lock= lock; + } + return {nullptr, const_cast(insert_after), ut_d(bypassed)}; } /** Note that a record lock wait started */ @@ -2232,7 +2424,7 @@ end_loop: if (wait_lock) { abort_wait: - lock_sys_t::cancel(trx, wait_lock); + lock_sys.cancel(trx, wait_lock); lock_sys.deadlock_check(); } @@ -2302,7 +2494,7 @@ static void lock_grant(lock_t *lock) dict_table_t *table= lock->un_member.tab_lock.table; ut_ad(!table->autoinc_trx); table->autoinc_trx= trx; - ib_vector_push(trx->autoinc_locks, &lock); + trx->autoinc_locks.emplace_back(lock); } DBUG_PRINT("ib_lock", ("wait for trx " TRX_ID_FMT " ends", trx->id)); @@ -2375,13 +2567,15 @@ static void lock_rec_dequeue_from_page(lock_t *in_lock, bool owns_wait_mutex) grant locks if there are no conflicting locks ahead. Stop at the first X lock that is waiting or has been granted. */ - for (lock_t* lock = lock_sys_t::get_first(cell, page_id); - lock != NULL; - lock = lock_rec_get_next_on_page(lock)) { - - if (!lock->is_waiting()) { + for (lock_t* lock = lock_sys_t::get_first(cell, page_id), *next; + lock != NULL; lock= next) { + /* Store pointer to the next element, because if some lock is + bypassed, the pointer to the next lock in the current lock + object will be changed, as the current lock will change + its position in lock queue. */ + next= lock_rec_get_next_on_page(lock); + if (!lock->is_waiting()) continue; - } if (!owns_wait_mutex) { mysql_mutex_lock(&lock_sys.wait_mutex); @@ -2390,10 +2584,10 @@ static void lock_rec_dequeue_from_page(lock_t *in_lock, bool owns_wait_mutex) ut_ad(lock->trx->lock.wait_trx); ut_ad(lock->trx->lock.wait_lock); - - if (const lock_t* c = lock_rec_has_to_wait_in_queue( - cell, lock)) { - trx_t* c_trx = c->trx; + conflicting_lock_info c_lock_info= + lock_rec_has_to_wait_in_queue(cell, lock); + if (c_lock_info.conflicting) { + trx_t* c_trx = c_lock_info.conflicting->trx; lock->trx->lock.wait_trx = c_trx; if (c_trx->lock.wait_trx && innodb_deadlock_detect @@ -2401,6 +2595,12 @@ static void lock_rec_dequeue_from_page(lock_t *in_lock, bool owns_wait_mutex) Deadlock::to_be_checked = true; } } else { + if (UNIV_UNLIKELY(c_lock_info.insert_after != nullptr)) + { + cell.remove(*lock, &lock_t::hash); + cell.insert_after(*c_lock_info.insert_after, + *lock, &lock_t::hash); + } /* Grant the lock */ ut_ad(lock->trx != in_lock->trx); lock_grant(lock); @@ -2551,9 +2751,9 @@ lock_rec_inherit_to_gap(hash_cell_t &heir_cell, const page_id_t heir, ((!from_split || !lock->is_record_not_gap()) && lock->mode() != (lock_trx->duplicates ? LOCK_S : LOCK_X)))) { - lock_rec_add_to_queue(LOCK_GAP | lock->mode(), heir_cell, heir, - heir_page, heir_heap_no, lock->index, lock_trx, - false); + lock_rec_add_to_queue(null_c_lock_info, LOCK_GAP | lock->mode(), + heir_cell, heir, heir_page, heir_heap_no, + lock->index, lock_trx, false); } } } @@ -2583,7 +2783,7 @@ lock_rec_inherit_to_gap_if_gap_lock( !lock->is_insert_intention() && (heap_no == PAGE_HEAP_NO_SUPREMUM || !lock->is_record_not_gap()) && !lock_table_has(lock->trx, lock->index->table, LOCK_X)) - lock_rec_add_to_queue(LOCK_GAP | lock->mode(), + lock_rec_add_to_queue(null_c_lock_info, LOCK_GAP | lock->mode(), g.cell(), id, block->page.frame, heir_heap_no, lock->index, lock->trx, false); } @@ -2629,15 +2829,19 @@ lock_rec_move( /* Note that we FIRST reset the bit, and then set the lock: the function works also if donator_id == receiver_id */ - lock_rec_add_to_queue(type_mode, receiver_cell, - receiver_id, receiver.page.frame, - receiver_heap_no, + lock_rec_add_to_queue(null_c_lock_info, type_mode, + receiver_cell, receiver_id, + receiver.page.frame, receiver_heap_no, lock->index, lock_trx, true); lock_trx->mutex_unlock(); } ut_ad(!lock_sys_t::get_first(donator_cell, donator_id, donator_heap_no)); + ut_d(lock_rec_queue_validate_bypass(lock_sys_t::get_first( + receiver_cell, + receiver_id, receiver_heap_no), + receiver_heap_no)); } /** Move all the granted locks to the front of the given lock list. @@ -2796,8 +3000,9 @@ lock_move_reorganize_page( /* NOTE that the old lock bitmap could be too small for the new heap number! */ - lock_rec_add_to_queue(lock->type_mode, cell, id, block->page.frame, - new_heap_no, lock->index, lock_trx, true); + lock_rec_add_to_queue(null_c_lock_info, lock->type_mode, cell, id, + block->page.frame, new_heap_no, lock->index, + lock_trx, true); } lock_trx->mutex_unlock(); @@ -2939,9 +3144,9 @@ lock_move_rec_list_end( lock->type_mode&= ~LOCK_WAIT; } - lock_rec_add_to_queue(type_mode, g.cell2(), new_id, - new_page, - rec2_heap_no, lock->index, lock_trx, true); + lock_rec_add_to_queue(null_c_lock_info, type_mode, g.cell2(), new_id, + new_page, rec2_heap_no, lock->index, lock_trx, + true); } lock_trx->mutex_unlock(); @@ -3062,7 +3267,7 @@ lock_move_rec_list_start( lock->type_mode&= ~LOCK_WAIT; } - lock_rec_add_to_queue(type_mode, g.cell2(), new_id, + lock_rec_add_to_queue(null_c_lock_info, type_mode, g.cell2(), new_id, new_block->page.frame, rec2_heap_no, lock->index, lock_trx, true); } @@ -3156,7 +3361,7 @@ lock_rtr_move_rec_list( lock->type_mode&= ~LOCK_WAIT; } - lock_rec_add_to_queue(type_mode, g.cell2(), new_id, + lock_rec_add_to_queue(null_c_lock_info, type_mode, g.cell2(), new_id, new_block->page.frame, rec2_heap_no, lock->index, lock_trx, true); @@ -3646,7 +3851,7 @@ lock_t *lock_table_create(dict_table_t *table, unsigned type_mode, trx_t *trx, ut_ad(!table->autoinc_trx); table->autoinc_trx = trx; - ib_vector_push(trx->autoinc_locks, &lock); + trx->autoinc_locks.emplace_back(lock); goto allocated; } @@ -3695,79 +3900,45 @@ allocated: return(lock); } -/*************************************************************//** -Pops autoinc lock requests from the transaction's autoinc_locks. We -handle the case where there are gaps in the array and they need to -be popped off the stack. */ -UNIV_INLINE -void -lock_table_pop_autoinc_locks( -/*=========================*/ - trx_t* trx) /*!< in/out: transaction that owns the AUTOINC locks */ +/** Release a granted AUTO_INCREMENT lock. +@param lock AUTO_INCREMENT lock +@param trx transaction that owns the lock */ +static void lock_table_remove_autoinc_lock(lock_t *lock, trx_t *trx) noexcept { - ut_ad(!ib_vector_is_empty(trx->autoinc_locks)); + ut_ad(lock->type_mode == (LOCK_AUTO_INC | LOCK_TABLE)); + lock_sys.assert_locked(*lock->un_member.tab_lock.table); + ut_ad(trx->mutex_is_owner()); - /* Skip any gaps, gaps are NULL lock entries in the - trx->autoinc_locks vector. */ + auto begin= trx->autoinc_locks.begin(), end= trx->autoinc_locks.end(), i=end; + ut_ad(begin != end); + if (*--i == lock) + { + /* Normally, the last acquired lock is released first, in order to + avoid unnecessary traversal of trx->autoinc_locks, which + only stores granted locks. */ - do { - ib_vector_pop(trx->autoinc_locks); + /* We remove the last lock, as well as any nullptr entries + immediately preceding it, which might have been created by the + "else" branch below, or by lock_cancel_waiting_and_release(). */ + while (begin != i && !i[-1]) i--; + trx->autoinc_locks.erase(i, end); + } + else + { + ut_a(*i); + /* Clear the lock when it is not the last one. */ + while (begin != i) + { + if (*--i == lock) + { + *i= nullptr; + return; + } + } - if (ib_vector_is_empty(trx->autoinc_locks)) { - return; - } - - } while (*(lock_t**) ib_vector_get_last(trx->autoinc_locks) == NULL); -} - -/*************************************************************//** -Removes an autoinc lock request from the transaction's autoinc_locks. */ -UNIV_INLINE -void -lock_table_remove_autoinc_lock( -/*===========================*/ - lock_t* lock, /*!< in: table lock */ - trx_t* trx) /*!< in/out: transaction that owns the lock */ -{ - ut_ad(lock->type_mode == (LOCK_AUTO_INC | LOCK_TABLE)); - lock_sys.assert_locked(*lock->un_member.tab_lock.table); - ut_ad(trx->mutex_is_owner()); - - auto s = ib_vector_size(trx->autoinc_locks); - ut_ad(s); - - /* With stored functions and procedures the user may drop - a table within the same "statement". This special case has - to be handled by deleting only those AUTOINC locks that were - held by the table being dropped. */ - - lock_t* autoinc_lock = *static_cast( - ib_vector_get(trx->autoinc_locks, --s)); - - /* This is the default fast case. */ - - if (autoinc_lock == lock) { - lock_table_pop_autoinc_locks(trx); - } else { - /* The last element should never be NULL */ - ut_a(autoinc_lock != NULL); - - /* Handle freeing the locks from within the stack. */ - - while (s) { - autoinc_lock = *static_cast( - ib_vector_get(trx->autoinc_locks, --s)); - - if (autoinc_lock == lock) { - void* null_var = NULL; - ib_vector_set(trx->autoinc_locks, s, &null_var); - return; - } - } - - /* Must find the autoinc lock. */ - ut_error; - } + /* The lock must exist. */ + ut_error; + } } /*************************************************************//** @@ -3799,14 +3970,7 @@ lock_table_remove_low( ut_ad((table->autoinc_trx == trx) == !lock->is_waiting()); if (table->autoinc_trx == trx) { - table->autoinc_trx = NULL; - /* The locks must be freed in the reverse order from - the one in which they were acquired. This is to avoid - traversing the AUTOINC lock vector unnecessarily. - - We only store locks that were granted in the - trx->autoinc_locks vector (see lock_table_create() - and lock_grant()). */ + table->autoinc_trx = nullptr; lock_table_remove_autoinc_lock(lock, trx); } @@ -4253,19 +4417,30 @@ static void lock_rec_rebuild_waiting_queue( { lock_sys.assert_locked(cell); - for (lock_t *lock= first_lock; lock != NULL; - lock= lock_rec_get_next(heap_no, lock)) + for (lock_t *lock= first_lock, *next; lock != NULL; lock= next) { + /* Store pointer to the next element, because if some lock is + bypassed, the pointer to the next lock in the current lock + object will be changed, as the current lock will change + its position in lock queue. */ + next= lock_rec_get_next(heap_no, lock); if (!lock->is_waiting()) continue; mysql_mutex_lock(&lock_sys.wait_mutex); ut_ad(lock->trx->lock.wait_trx); ut_ad(lock->trx->lock.wait_lock); - if (const lock_t *c= lock_rec_has_to_wait_in_queue(cell, lock)) - lock->trx->lock.wait_trx= c->trx; + conflicting_lock_info c_lock_info= + lock_rec_has_to_wait_in_queue(cell, lock); + if (c_lock_info.conflicting) + lock->trx->lock.wait_trx= c_lock_info.conflicting->trx; else { + if (c_lock_info.insert_after) + { + cell.remove(*lock, &lock_t::hash); + cell.insert_after(*c_lock_info.insert_after, *lock, &lock_t::hash); + } /* Grant the lock */ ut_ad(trx != lock->trx); lock_grant(lock); @@ -4696,8 +4871,10 @@ reiterate: { ut_ad(!lock->index->table->is_temporary()); bool supremum_bit= lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM); + /* if XA is being prepared, it must not own waiting locks */ + ut_ad(!lock->is_waiting()); bool rec_granted_exclusive_not_gap= - lock->is_rec_granted_exclusive_not_gap(); + lock->is_rec_exclusive_not_gap(); if (UNIV_UNLIKELY(lock->type_mode & (LOCK_PREDICATE | LOCK_PRDT_PAGE))) continue; /* SPATIAL INDEX locking is broken. */ const auto fold = lock->un_member.rec_lock.page_id.fold(); @@ -4870,7 +5047,9 @@ reiterate: if (!lock->is_table()) { ut_ad(!lock->index->table->is_temporary()); - if (!lock->is_rec_granted_exclusive_not_gap()) + /* if XA is being prepared, it must not own waiting locks */ + ut_ad(!lock->is_waiting()); + if (!lock->is_rec_exclusive_not_gap()) lock_rec_dequeue_from_page(lock, false); else if (UNIV_UNLIKELY(lock->type_mode & (LOCK_PREDICATE | LOCK_PRDT_PAGE))) @@ -5212,7 +5391,7 @@ void lock_trx_print_wait_and_mvcc_state(FILE *file, const trx_t *trx, { fprintf(file, "---"); - trx_print_latched(file, trx, 600); + trx_print_latched(file, trx); trx->read_view.print_limits(file); if (const lock_t* wait_lock = trx->lock.wait_lock) { @@ -5432,7 +5611,8 @@ lock_rec_queue_validate( ut_ad(trx_state_eq(lock->trx, TRX_STATE_COMMITTED_IN_MEMORY) || !lock->is_waiting() - || lock_rec_has_to_wait_in_queue(cell, lock)); + || lock_rec_has_to_wait_in_queue(cell, lock). + conflicting); lock->trx->mutex_unlock(); } @@ -5524,7 +5704,8 @@ func_exit: if (lock->is_waiting()) { ut_a(lock->is_gap() - || lock_rec_has_to_wait_in_queue(cell, lock)); + || lock_rec_has_to_wait_in_queue(cell, lock). + conflicting); } else if (!lock->is_gap()) { const lock_mode mode = lock->mode() == LOCK_S ? LOCK_X : LOCK_S; @@ -5830,13 +6011,16 @@ lock_rec_insert_check_and_lock( on the successor, which produced an unnecessary deadlock. */ const unsigned type_mode= LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION; - if (lock_t *c_lock= lock_rec_other_has_conflicting(type_mode, - g.cell(), id, - heap_no, trx)) + conflicting_lock_info c_lock_info= lock_rec_other_has_conflicting( + type_mode, g.cell(), id, heap_no, trx); + /* Insert intention locks must not bypass any other lock. */ + ut_ad(!c_lock_info.insert_after && !c_lock_info.bypassed); + if (c_lock_info.conflicting) { trx->mutex_lock(); - err= lock_rec_enqueue_waiting(c_lock, type_mode, id, block->page.frame, - heap_no, index, thr, nullptr); + err= lock_rec_enqueue_waiting(c_lock_info, type_mode, id, + block->page.frame, heap_no, index, thr, + nullptr); trx->mutex_unlock(); } } @@ -5905,8 +6089,9 @@ static trx_t *lock_rec_convert_impl_to_expl_for_trx(trx_t *trx, if (!trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) && !lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, heap_no, trx)) - lock_rec_add_to_queue(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, - page_align(rec), heap_no, index, trx, true); + lock_rec_add_to_queue(null_c_lock_info, LOCK_X | LOCK_REC_NOT_GAP, + g.cell(), id, page_align(rec), heap_no, index, + trx, true); } trx->release_reference(); @@ -6443,49 +6628,36 @@ lock_clust_rec_read_check_and_lock_alt( return(err); } -/*******************************************************************//** -Check if a transaction holds any autoinc locks. -@return TRUE if the transaction holds any AUTOINC locks. */ -static -ibool -lock_trx_holds_autoinc_locks( -/*=========================*/ - const trx_t* trx) /*!< in: transaction */ -{ - ut_a(trx->autoinc_locks != NULL); - - return(!ib_vector_is_empty(trx->autoinc_locks)); -} - /** Release all AUTO_INCREMENT locks of the transaction. */ static void lock_release_autoinc_locks(trx_t *trx) { { + auto begin= trx->autoinc_locks.begin(), end= trx->autoinc_locks.end(); + ut_ad(begin != end); LockMutexGuard g{SRW_LOCK_CALL}; mysql_mutex_lock(&lock_sys.wait_mutex); trx->mutex_lock(); - auto autoinc_locks= trx->autoinc_locks; - ut_a(autoinc_locks); /* We release the locks in the reverse order. This is to avoid searching the vector for the element to delete at the lower level. See (lock_table_remove_low()) for details. */ - while (ulint size= ib_vector_size(autoinc_locks)) + do { - lock_t *lock= *static_cast - (ib_vector_get(autoinc_locks, size - 1)); + lock_t *lock= *--end; ut_ad(lock->type_mode == (LOCK_AUTO_INC | LOCK_TABLE)); lock_table_dequeue(lock, true); lock_trx_table_locks_remove(lock); } + while (begin != end); } mysql_mutex_unlock(&lock_sys.wait_mutex); trx->mutex_unlock(); + trx->autoinc_locks.clear(); } /** Cancel a waiting lock request and release possibly waiting transactions */ template -void lock_cancel_waiting_and_release(lock_t *lock) +static void lock_cancel_waiting_and_release(lock_t *lock) noexcept { lock_sys.assert_locked(*lock); mysql_mutex_assert_owner(&lock_sys.wait_mutex); @@ -6502,8 +6674,18 @@ void lock_cancel_waiting_and_release(lock_t *lock) { if (lock->type_mode == (LOCK_AUTO_INC | LOCK_TABLE)) { - ut_ad(trx->autoinc_locks); - ib_vector_remove(trx->autoinc_locks, lock); + /* This is similar to lock_table_remove_autoinc_lock() */ + auto begin= trx->autoinc_locks.begin(), end= trx->autoinc_locks.end(); + ut_ad(begin != end); + if (*--end == lock) + trx->autoinc_locks.erase(end, end + 1); + else + while (begin != end) + if (*--end == lock) + { + *end= nullptr; + break; + } } lock_table_dequeue(lock, true); /* Remove the lock from table lock vector too. */ @@ -6519,18 +6701,18 @@ void lock_cancel_waiting_and_release(lock_t *lock) trx->mutex_unlock(); } -void lock_sys_t::cancel_lock_wait_for_trx(trx_t *trx) +inline void lock_sys_t::cancel_lock_wait_for_trx(trx_t *trx) noexcept { - lock_sys.wr_lock(SRW_LOCK_CALL); - mysql_mutex_lock(&lock_sys.wait_mutex); + wr_lock(SRW_LOCK_CALL); + mysql_mutex_lock(&wait_mutex); if (lock_t *lock= trx->lock.wait_lock) { /* check if victim is still waiting */ if (lock->is_waiting()) lock_cancel_waiting_and_release(lock); } - lock_sys.wr_unlock(); - mysql_mutex_unlock(&lock_sys.wait_mutex); + wr_unlock(); + mysql_mutex_unlock(&wait_mutex); } #ifdef WITH_WSREP @@ -6554,10 +6736,10 @@ void lock_sys_t::cancel_lock_wait_for_wsrep_bf_abort(trx_t *trx) @retval DB_DEADLOCK if trx->lock.was_chosen_as_deadlock_victim was set @retval DB_LOCK_WAIT if the lock was canceled */ template -dberr_t lock_sys_t::cancel(trx_t *trx, lock_t *lock) +dberr_t lock_sys_t::cancel(trx_t *trx, lock_t *lock) noexcept { DEBUG_SYNC_C("lock_sys_t_cancel_enter"); - mysql_mutex_assert_owner(&lock_sys.wait_mutex); + mysql_mutex_assert_owner(&wait_mutex); ut_ad(trx->state == TRX_STATE_ACTIVE); /* trx->lock.wait_lock may be changed by other threads as long as we are not holding lock_sys.latch. @@ -6565,27 +6747,27 @@ dberr_t lock_sys_t::cancel(trx_t *trx, lock_t *lock) So, trx->lock.wait_lock==lock does not necessarily hold, but both pointers should be valid, because other threads cannot assign trx->lock.wait_lock=nullptr (or invalidate *lock) while we are - holding lock_sys.wait_mutex. Also, the type of trx->lock.wait_lock + holding wait_mutex. Also, the type of trx->lock.wait_lock (record or table lock) cannot be changed by other threads. So, it is - safe to call lock->is_table() while not holding lock_sys.latch. If - we have to release and reacquire lock_sys.wait_mutex, we must reread + safe to call lock->is_table() while not holding latch. If + we have to release and reacquire wait_mutex, we must reread trx->lock.wait_lock. We must also reread trx->lock.wait_lock after - lock_sys.latch acquiring, as it can be changed to not-null in lock moving - functions even if we hold lock_sys.wait_mutex. */ + latch acquiring, as it can be changed to not-null in lock moving + functions even if we hold wait_mutex. */ dberr_t err= DB_SUCCESS; /* This would be too large for a memory transaction, except in the DB_DEADLOCK case, which was already tested in lock_trx_handle_wait(). */ if (lock->is_table()) { - if (!lock_sys.rd_lock_try()) + if (!rd_lock_try()) { - mysql_mutex_unlock(&lock_sys.wait_mutex); - lock_sys.rd_lock(SRW_LOCK_CALL); - mysql_mutex_lock(&lock_sys.wait_mutex); + mysql_mutex_unlock(&wait_mutex); + rd_lock(SRW_LOCK_CALL); + mysql_mutex_lock(&wait_mutex); lock= trx->lock.wait_lock; - /* Even if waiting lock was cancelled while lock_sys.wait_mutex was - unlocked, we need to return deadlock error if transaction was chosen - as deadlock victim to rollback it */ + /* Even if the waiting lock was cancelled while we did not hold + wait_mutex, we need to return deadlock error if the transaction + was chosen as deadlock victim to be rolled back. */ if (check_victim && trx->lock.was_chosen_as_deadlock_victim) err= DB_DEADLOCK; else if (lock) @@ -6596,10 +6778,10 @@ dberr_t lock_sys_t::cancel(trx_t *trx, lock_t *lock) /* This function is invoked from the thread which executes the transaction. Table locks are requested before record locks. Some other transaction can't change trx->lock.wait_lock from table to record for the - current transaction at this point, because the current transaction has not - requested record locks yet. There is no need to move any table locks by - other threads. And trx->lock.wait_lock can't be set to null while we are - holding lock_sys.wait_mutex. That's why there is no need to reload + current transaction at this point, because the current transaction has + not requested record locks yet. There is no need to move any table locks + by other threads. And trx->lock.wait_lock can't be set to null while we + are holding wait_mutex. That's why there is no need to reload trx->lock.wait_lock here. */ ut_ad(lock == trx->lock.wait_lock); resolve_table_lock: @@ -6607,11 +6789,11 @@ resolve_table_lock: if (!table->lock_mutex_trylock()) { /* The correct latching order is: - lock_sys.latch, table->lock_latch, lock_sys.wait_mutex. - Thus, we must release lock_sys.wait_mutex for a blocking wait. */ - mysql_mutex_unlock(&lock_sys.wait_mutex); + latch, table->lock_latch, wait_mutex. + Thus, we must release wait_mutex for a blocking wait. */ + mysql_mutex_unlock(&wait_mutex); table->lock_mutex_lock(); - mysql_mutex_lock(&lock_sys.wait_mutex); + mysql_mutex_lock(&wait_mutex); /* Cache trx->lock.wait_lock under the corresponding latches. */ lock= trx->lock.wait_lock; if (!lock) @@ -6638,20 +6820,20 @@ resolve_table_lock: retreat: table->lock_mutex_unlock(); } - lock_sys.rd_unlock(); + rd_unlock(); } else { /* To prevent the record lock from being moved between pages - during a page split or merge, we must hold exclusive lock_sys.latch. */ - if (!lock_sys.wr_lock_try()) + during a page split or merge, we must hold exclusive latch. */ + if (!wr_lock_try()) { - mysql_mutex_unlock(&lock_sys.wait_mutex); - lock_sys.wr_lock(SRW_LOCK_CALL); - mysql_mutex_lock(&lock_sys.wait_mutex); + mysql_mutex_unlock(&wait_mutex); + wr_lock(SRW_LOCK_CALL); + mysql_mutex_lock(&wait_mutex); /* Cache trx->lock.wait_lock under the corresponding latches. */ lock= trx->lock.wait_lock; - /* Even if waiting lock was cancelled while lock_sys.wait_mutex was + /* Even if waiting lock was cancelled while wait_mutex was unlocked, we need to return deadlock error if transaction was chosen as deadlock victim to rollback it */ if (check_victim && trx->lock.was_chosen_as_deadlock_victim) @@ -6675,13 +6857,13 @@ resolve_record_lock: rpl.rpl_parallel_optimistic_xa_lsu_off */ err= DB_LOCK_WAIT; } - lock_sys.wr_unlock(); + wr_unlock(); } return err; } -template dberr_t lock_sys_t::cancel(trx_t *, lock_t *); +template dberr_t lock_sys_t::cancel(trx_t *, lock_t *) noexcept; /*********************************************************************//** Unlocks AUTO_INC type locks that were possibly reserved by a trx. This @@ -6703,7 +6885,7 @@ lock_unlock_table_autoinc( ut_ad(trx_state == TRX_STATE_ACTIVE || trx_state == TRX_STATE_PREPARED || trx_state == TRX_STATE_NOT_STARTED); - if (lock_trx_holds_autoinc_locks(trx)) + if (!trx->autoinc_locks.empty()) lock_release_autoinc_locks(trx); } @@ -6733,7 +6915,7 @@ dberr_t lock_trx_handle_wait(trx_t *trx) err= DB_DEADLOCK; /* Cache trx->lock.wait_lock to avoid unnecessary atomic variable load */ else if (lock_t *wait_lock= trx->lock.wait_lock) - err= lock_sys_t::cancel(trx, wait_lock); + err= lock_sys.cancel(trx, wait_lock); lock_sys.deadlock_check(); mysql_mutex_unlock(&lock_sys.wait_mutex); return err; @@ -6944,11 +7126,11 @@ namespace Deadlock ulint n_trx_locks= UT_LIST_GET_LEN(trx.lock.trx_locks); ulint heap_size= mem_heap_get_size(trx.lock.lock_heap); - trx_print_low(lock_latest_err_file, &trx, 3000, + trx_print_low(lock_latest_err_file, &trx, n_rec_locks, n_trx_locks, heap_size); if (srv_print_all_deadlocks) - trx_print_low(stderr, &trx, 3000, n_rec_locks, n_trx_locks, heap_size); + trx_print_low(stderr, &trx, n_rec_locks, n_trx_locks, heap_size); } /** Print lock data to the deadlock file and possibly to stderr. @@ -7197,7 +7379,7 @@ static lock_t *Deadlock::check_and_resolve(trx_t *trx, lock_t *wait_lock) return wait_lock; if (wait_lock) - lock_sys_t::cancel(trx, wait_lock); + lock_sys.cancel(trx, wait_lock); lock_sys.deadlock_check(); return reinterpret_cast(-1); diff --git a/storage/innobase/lock/lock0prdt.cc b/storage/innobase/lock/lock0prdt.cc index 3ea05ddb741..12b2a990f8c 100644 --- a/storage/innobase/lock/lock0prdt.cc +++ b/storage/innobase/lock/lock0prdt.cc @@ -470,8 +470,9 @@ create: because we should be moving an existing waiting lock request. */ ut_ad(!(type_mode & LOCK_WAIT) || trx->lock.wait_trx); - lock_t* lock = lock_rec_create(nullptr, - type_mode, block, PRDT_HEAPNO, index, + lock_t* lock = lock_rec_create(null_c_lock_info, + type_mode, block->page.id(), + block->page.frame, PRDT_HEAPNO, index, trx, caller_owns_trx_mutex); if (lock->type_mode & LOCK_PREDICATE) { @@ -533,8 +534,9 @@ lock_prdt_insert_check_and_lock( trx->mutex_lock(); /* Allocate MBR on the lock heap */ lock_init_prdt_from_mbr(prdt, mbr, 0, trx->lock.lock_heap); - err= lock_rec_enqueue_waiting(c_lock, mode, id, block->page.frame, - PRDT_HEAPNO, index, thr, prdt); + err= lock_rec_enqueue_waiting({c_lock, nullptr, ut_d(nullptr)}, mode, id, + block->page.frame, PRDT_HEAPNO, index, + thr, prdt); trx->mutex_unlock(); } } @@ -734,10 +736,10 @@ lock_prdt_lock( lock_t* lock = lock_sys_t::get_first(g.cell(), id); if (lock == NULL) { - lock = lock_rec_create( - NULL, - prdt_mode, block, PRDT_HEAPNO, - index, trx, FALSE); + lock = lock_rec_create(null_c_lock_info, + prdt_mode, block->page.id(), + block->page.frame, PRDT_HEAPNO, index, + trx, FALSE); status = LOCK_REC_SUCCESS_CREATED; } else { @@ -759,7 +761,8 @@ lock_prdt_lock( prdt_mode, g.cell(), id, prdt, trx)) { err = lock_rec_enqueue_waiting( - wait_for, prdt_mode, id, + {wait_for, nullptr, ut_d(nullptr)}, + prdt_mode, id, block->page.frame, PRDT_HEAPNO, index, thr, prdt); } else { @@ -826,10 +829,9 @@ lock_place_prdt_page_lock( } if (lock == NULL) { - lock = lock_rec_create_low( - NULL, - mode, page_id, NULL, PRDT_HEAPNO, - index, trx, FALSE); + lock = lock_rec_create(null_c_lock_info, + mode, page_id, NULL, PRDT_HEAPNO, + index, trx, FALSE); #ifdef PRDT_DIAG printf("GIS_DIAGNOSTIC: page lock %d\n", (int) page_no); diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 59a75d99de4..e609342345e 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -186,7 +186,6 @@ void log_file_t::write(os_offset_t offset, span buf) noexcept abort(); } -#ifdef HAVE_INNODB_MMAP # ifdef HAVE_PMEM # include "cache.h" # endif @@ -202,6 +201,10 @@ static void *log_mmap(os_file_t file, # endif os_offset_t size) { +#if SIZEOF_SIZE_T < 8 + if (size != os_offset_t(size_t(size))) + return MAP_FAILED; +#endif if (my_system_page_size > 4096) return MAP_FAILED; # ifndef HAVE_PMEM @@ -299,20 +302,17 @@ remap: # endif return ptr; } -#endif #if defined __linux__ || defined _WIN32 /** Display a message about opening the log */ ATTRIBUTE_COLD static void log_file_message() { sql_print_information("InnoDB: %s (block size=%u bytes)", -# ifdef HAVE_INNODB_MMAP log_sys.log_mmap ? (log_sys.log_buffered ? "Memory-mapped log" : "Memory-mapped unbuffered log") : -# endif log_sys.log_buffered ? "Buffered log writes" : "File system buffers for log disabled", @@ -331,7 +331,6 @@ bool log_t::attach(log_file_t file, os_offset_t size) ut_ad(!buf); ut_ad(!flush_buf); ut_ad(!writer); -#ifdef HAVE_INNODB_MMAP if (size) { # ifdef HAVE_PMEM @@ -362,7 +361,6 @@ bool log_t::attach(log_file_t file, os_offset_t size) } } log_mmap= false; -#endif buf= static_cast(ut_malloc_dontdump(buf_size, PSI_INSTRUMENT_ME)); if (!buf) { @@ -399,9 +397,7 @@ bool log_t::attach(log_file_t file, os_offset_t size) writer_update(); memset_aligned<512>(checkpoint_buf, 0, write_size); -#ifdef HAVE_INNODB_MMAP func_exit: -#endif log_file_message(); return true; } @@ -476,25 +472,19 @@ ATTRIBUTE_COLD static void log_close_failed(dberr_t err) ib::fatal() << "closing ib_logfile0 failed: " << err; } -#ifdef HAVE_INNODB_MMAP void log_t::close_file(bool really_close) -#else -void log_t::close_file() -#endif { -#ifdef HAVE_INNODB_MMAP if (is_mmap()) { ut_ad(!checkpoint_buf); ut_ad(!flush_buf); if (buf) { - my_munmap(buf, file_size); + my_munmap(buf, size_t(file_size)); buf= nullptr; } } else -#endif { ut_ad(!buf == !flush_buf); ut_ad(!buf == !checkpoint_buf); @@ -511,9 +501,7 @@ void log_t::close_file() writer= nullptr; -#ifdef HAVE_INNODB_MMAP if (really_close) -#endif if (is_opened()) if (const dberr_t err= log.close()) log_close_failed(err); @@ -645,14 +633,10 @@ log_t::resize_start_status log_t::resize_start(os_offset_t size) noexcept void *ptr= nullptr, *ptr2= nullptr; success= os_file_set_size(path.c_str(), resize_log.m_file, size); if (!success); -#ifdef HAVE_INNODB_MMAP +#ifdef HAVE_PMEM else if (is_mmap()) { - ptr= ::log_mmap(resize_log.m_file, -#ifdef HAVE_PMEM - is_pmem, -#endif - size); + ptr= ::log_mmap(resize_log.m_file, is_pmem, size); if (ptr == MAP_FAILED) goto alloc_fail; @@ -660,6 +644,7 @@ log_t::resize_start_status log_t::resize_start(os_offset_t size) noexcept #endif else { + ut_ad(!is_mmap()); ptr= ut_malloc_dontdump(buf_size, PSI_INSTRUMENT_ME); if (ptr) { @@ -702,9 +687,9 @@ log_t::resize_start_status log_t::resize_start(os_offset_t size) noexcept writer_update(); } - resize_lsn.store(start_lsn, std::memory_order_relaxed); status= success ? RESIZE_STARTED : RESIZE_FAILED; } + resize_lsn.store(start_lsn, std::memory_order_relaxed); } log_resize_release(); @@ -729,26 +714,33 @@ void log_t::resize_abort() noexcept if (resize_in_progress() > 1) { - if (!is_mmap()) +#ifdef HAVE_PMEM + const bool is_mmap{this->is_mmap()}; +#else + constexpr bool is_mmap{false}; +#endif + if (!is_mmap) { ut_free_dodump(resize_buf, buf_size); ut_free_dodump(resize_flush_buf, buf_size); resize_flush_buf= nullptr; } -#ifdef HAVE_INNODB_MMAP else { ut_ad(!resize_log.is_opened()); ut_ad(!resize_flush_buf); +#ifdef HAVE_PMEM if (resize_buf) my_munmap(resize_buf, resize_target); +#endif /* HAVE_PMEM */ } -#endif if (resize_log.is_opened()) resize_log.close(); resize_buf= nullptr; resize_target= 0; resize_lsn.store(0, std::memory_order_relaxed); + std::string path{get_log_file_path("ib_logfile101")}; + IF_WIN(DeleteFile(path.c_str()), unlink(path.c_str())); } writer_update(); @@ -909,13 +901,13 @@ static size_t log_pad(lsn_t lsn, size_t pad, byte *begin, byte *extra) #endif #ifdef HAVE_PMEM -void log_t::persist(lsn_t lsn, bool holding_latch) noexcept +void log_t::persist(lsn_t lsn) noexcept { ut_ad(!is_opened()); ut_ad(!write_lock.is_owner()); ut_ad(!flush_lock.is_owner()); #ifdef LOG_LATCH_DEBUG - ut_ad(holding_latch == latch_have_wr()); + ut_ad(latch_have_any()); #endif lsn_t old= flushed_to_disk_lsn.load(std::memory_order_relaxed); @@ -923,9 +915,6 @@ void log_t::persist(lsn_t lsn, bool holding_latch) noexcept if (old >= lsn) return; - const bool latching{!holding_latch && resize_in_progress()}; - if (UNIV_UNLIKELY(latching)) - latch.rd_lock(SRW_LOCK_CALL); const size_t start(calc_lsn_offset(old)); const size_t end(calc_lsn_offset(lsn)); @@ -949,9 +938,14 @@ void log_t::persist(lsn_t lsn, bool holding_latch) noexcept log_flush_notify(lsn); DBUG_EXECUTE_IF("crash_after_log_write_upto", DBUG_SUICIDE();); } +} - if (UNIV_UNLIKELY(latching)) - latch.rd_unlock(); +ATTRIBUTE_NOINLINE +static void log_write_persist(lsn_t lsn) noexcept +{ + log_sys.latch.rd_lock(SRW_LOCK_CALL); + log_sys.persist(lsn); + log_sys.latch.rd_unlock(); } #endif @@ -1159,7 +1153,7 @@ void log_write_up_to(lsn_t lsn, bool durable, if (log_sys.is_mmap()) { if (durable) - log_sys.persist(lsn, false); + log_write_persist(lsn); else ut_ad(!callback); return; @@ -1241,7 +1235,6 @@ ATTRIBUTE_COLD void log_write_and_flush_prepare() group_commit_lock::ACQUIRED); } -#ifdef HAVE_INNODB_MMAP void log_t::clear_mmap() { if (!is_mmap() || @@ -1275,7 +1268,6 @@ void log_t::clear_mmap() } log_resize_release(); } -#endif /** Durably write the log up to log_sys.get_lsn(). */ ATTRIBUTE_COLD void log_write_and_flush() @@ -1283,7 +1275,7 @@ ATTRIBUTE_COLD void log_write_and_flush() ut_ad(!srv_read_only_mode); #ifdef HAVE_PMEM if (log_sys.is_mmap()) - log_sys.persist(log_sys.get_lsn(), true); + log_sys.persist(log_sys.get_lsn()); else #endif { diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index e748eb35e9c..181a605d374 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2194,7 +2194,6 @@ struct recv_buf } }; -#ifdef HAVE_INNODB_MMAP /** Ring buffer wrapper for log_sys.buf[]; recv_sys.len == log_sys.file_size */ struct recv_ring : public recv_buf { @@ -2326,7 +2325,6 @@ struct recv_ring : public recv_buf return log_decrypt_buf(iv, tmp + s, b, static_cast(len)); } }; -#endif template void recv_sys_t::rewind(source &l, source &begin) noexcept @@ -2418,7 +2416,7 @@ restart: ut_ad(log_sys.is_latest()); alignas(8) byte iv[MY_AES_BLOCK_SIZE]; - byte *decrypt_buf= storing == YES + byte *decrypt_buf= storing != BACKUP ? static_cast(alloca(srv_page_size)) : nullptr; const lsn_t start_lsn{lsn}; @@ -2563,7 +2561,7 @@ restart: sql_print_warning("InnoDB: Ignoring malformed log record at LSN " LSN_PF, lsn); /* the next record must not be same_page */ - if (storing == YES) last_offset= 1; + if (storing != BACKUP) last_offset= 1; continue; } if (srv_operation == SRV_OPERATION_BACKUP) @@ -2573,7 +2571,7 @@ restart: lsn, b, l - recs + rlen, space_id, page_no)); goto same_page; } - if (storing == YES) last_offset= 0; + if (storing != BACKUP) last_offset= 0; idlen= mlog_decode_varint_length(*l); if (UNIV_UNLIKELY(idlen > 5 || idlen >= rlen)) { @@ -2604,48 +2602,62 @@ restart: goto page_id_corrupted; l+= idlen; rlen-= idlen; - if (storing == YES) + if (storing != BACKUP) { mach_write_to_4(iv + 8, space_id); mach_write_to_4(iv + 12, page_no); } - got_page_op= !(b & 0x80); - if (!got_page_op); - else if (storing == BACKUP && srv_operation == SRV_OPERATION_BACKUP) - { - if (page_no == 0 && (b & 0xf0) == INIT_PAGE && first_page_init) - first_page_init(space_id); - continue; - } - else if (storing == YES && file_checkpoint && - space_id != TRX_SYS_SPACE && !srv_is_undo_tablespace(space_id)) - { - recv_spaces_t::iterator i= recv_spaces.lower_bound(space_id); - if (i != recv_spaces.end() && i->first == space_id); - else if (lsn < file_checkpoint) - /* We have not seen all records between the checkpoint and - FILE_CHECKPOINT. There should be a FILE_DELETE for this - tablespace later. */ - recv_spaces.emplace_hint(i, space_id, file_name_t("", false)); - else - { - const page_id_t id(space_id, page_no); - if (!srv_force_recovery) - { - ib::error() << "Missing FILE_DELETE or FILE_MODIFY for " << id - << " at " << lsn - << "; set innodb_force_recovery=1 to ignore the record."; - goto corrupted; - } - ib::warn() << "Ignoring record for " << id << " at " << lsn; - continue; - } - } DBUG_PRINT("ib_log", ("scan " LSN_PF ": rec %x len %zu page %u:%u", lsn, b, l - recs + rlen, space_id, page_no)); + got_page_op= !(b & 0x80); if (got_page_op) { + if (storing == BACKUP) + { + if (page_no == 0 && (b & 0xf0) == INIT_PAGE && first_page_init) + first_page_init(space_id); + else if (rlen == 1 && undo_space_trunc) + { + mach_write_to_4(iv + 8, space_id); + mach_write_to_4(iv + 12, page_no); + byte eb[1/*type,length*/ + 5/*space_id*/ + 5/*page_no*/ + 1/*rlen*/]; + if (*l.copy_if_needed(iv, eb, recs, 1) == TRIM_PAGES) + undo_space_trunc(space_id); + } + continue; + } + if (storing == YES && UNIV_LIKELY(space_id != TRX_SYS_SPACE) && + !srv_is_undo_tablespace(space_id)) + { + ut_ad(file_checkpoint != 0); + recv_spaces_t::iterator i= recv_spaces.lower_bound(space_id); + if (i != recv_spaces.end() && i->first == space_id); + else if (lsn < file_checkpoint) + /* We have not seen all records between the checkpoint and + FILE_CHECKPOINT. There should be a FILE_DELETE for this + tablespace later. */ + recv_spaces.emplace_hint(i, space_id, file_name_t("", false)); + else + { + if (!srv_force_recovery) + { + sql_print_error("InnoDB: Missing FILE_DELETE or FILE_MODIFY for " + "[page id: space=" UINT32PF + ", page number=" UINT32PF "]" + " at " LSN_PF + "; set innodb_force_recovery=1 to" + " ignore the record.", + space_id, page_no, lsn); + goto corrupted; + } + sql_print_warning("InnoDB: Ignoring record for " + "[page id: space=" UINT32PF + ", page number=" UINT32PF "] at " LSN_PF, + space_id, page_no, lsn); + continue; + } + } same_page: if (!rlen); else if (UNIV_UNLIKELY(l - recs + rlen > srv_page_size)) @@ -2654,18 +2666,16 @@ restart: ut_d(if ((b & 0x70) == INIT_PAGE || (b & 0x70) == OPTION) freed.erase(id)); ut_ad(freed.find(id) == freed.end()); - const byte *cl= storing == NO ? nullptr : l.ptr; + const byte *cl= nullptr; /* avoid bogus -Wmaybe-uninitialized */ switch (b & 0x70) { case FREE_PAGE: ut_ad(freed.emplace(id).second); /* the next record must not be same_page */ - if (storing == YES) last_offset= 1; + last_offset= 1; goto free_or_init_page; case INIT_PAGE: - if (storing == YES) last_offset= FIL_PAGE_TYPE; + last_offset= FIL_PAGE_TYPE; free_or_init_page: - if (storing == BACKUP) - continue; if (UNIV_UNLIKELY(rlen != 0)) goto record_corrupted; store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE); @@ -2696,58 +2706,72 @@ restart: erase(r); continue; } - copy_if_needed: cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen); break; case EXTENDED: - if (storing != YES) + if (storing == NO) + /* We really only care about WRITE records to page 0, to + invoke fil_space_set_recv_size_and_flags(). As of now, the + EXTENDED records refer to index or undo log pages (which + page 0 never can be), or we have the TRIM_PAGES subtype for + shrinking a tablespace, to a larger number of pages than 0. + Either way, we can ignore this record during the preparation + for multi-batch recovery. */ continue; if (UNIV_UNLIKELY(!rlen)) goto record_corrupted; cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen); if (rlen == 1 && *cl == TRIM_PAGES) { - if (storing == BACKUP) + if (srv_is_undo_tablespace(space_id)) { - if (space_id && undo_space_trunc) - undo_space_trunc(space_id); - } - else if (srv_is_undo_tablespace(space_id)) - { - if (page_no != SRV_UNDO_TABLESPACE_SIZE_IN_PAGES) + if (page_no != SRV_UNDO_TABLESPACE_SIZE_IN_PAGES) goto record_corrupted; /* The entire undo tablespace will be reinitialized by innodb_undo_log_truncate=ON. Discard old log for all - pages. */ - trim({space_id, 0}, start_lsn); - truncated_undo_spaces[space_id - srv_undo_space_id_start]= + pages. */ + trim({space_id, 0}, start_lsn); + truncated_undo_spaces[space_id - srv_undo_space_id_start]= { start_lsn, page_no}; - } - else if (space_id != 0) goto record_corrupted; - else - { - /* Shrink the system tablespace */ + } + else if (space_id != 0) goto record_corrupted; + else + { + /* Shrink the system tablespace */ trim({space_id, page_no}, start_lsn); truncated_sys_space= {start_lsn, page_no}; - } + } static_assert(UT_ARR_SIZE(truncated_undo_spaces) == TRX_SYS_MAX_UNDO_SPACES, "compatibility"); /* the next record must not be same_page */ - if (storing == YES) last_offset= 1; + last_offset= 1; continue; } - if (storing == YES) last_offset= FIL_PAGE_TYPE; + /* This record applies to an undo log or index page, and it + may be followed by subsequent WRITE or similar records for the + same page in the same mini-transaction. */ + last_offset= FIL_PAGE_TYPE; break; case OPTION: - if (storing == YES && rlen == 5 && *l == OPT_PAGE_CHECKSUM) - goto copy_if_needed; + /* OPTION records can be safely ignored in recovery */ + if (storing == YES && + rlen == 5/* OPT_PAGE_CHECKSUM and CRC-32C; see page_checksum() */) + { + cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen); + if (*cl == OPT_PAGE_CHECKSUM) + break; + } /* fall through */ case RESERVED: continue; case WRITE: case MEMMOVE: case MEMSET: - if (storing != YES) + if (storing == NO && UNIV_LIKELY(page_no != 0)) + /* fil_space_set_recv_size_and_flags() is mandatory for storing==NO. + It is only applicable to page_no == 0. Other than that, we can just + ignore the payload and only compute the mini-transaction checksum; + there will be a subsequent call with storing==YES. */ continue; if (UNIV_UNLIKELY(rlen == 0 || last_offset == 1)) goto record_corrupted; @@ -2789,7 +2813,7 @@ restart: last_offset) : file_name_t::initial_flags; if (it == recv_spaces.end()) - ut_ad(space_id == TRX_SYS_SPACE || + ut_ad(storing == NO || space_id == TRX_SYS_SPACE || srv_is_undo_tablespace(space_id)); else if (!it->second.space) { @@ -3041,7 +3065,6 @@ template recv_sys_t::parse_mtr_result recv_sys_t::parse_mtr(bool) noexcept; -#ifdef HAVE_INNODB_MMAP template recv_sys_t::parse_mtr_result recv_sys_t::parse_mmap(bool if_exists) noexcept { @@ -3062,7 +3085,6 @@ recv_sys_t::parse_mtr_result recv_sys_t::parse_mmap(bool if_exists) noexcept template recv_sys_t::parse_mtr_result recv_sys_t::parse_mmap(bool) noexcept; -#endif /** Apply the hashed log records to the page, if the page lsn is less than the lsn of a log record. @@ -3380,7 +3402,7 @@ func_exit: return success; } -void IORequest::fake_read_complete(os_offset_t offset) const +void IORequest::fake_read_complete(os_offset_t offset) const noexcept { ut_ad(node); ut_ad(is_read()); @@ -3420,7 +3442,7 @@ void IORequest::fake_read_complete(os_offset_t offset) const } /** @return whether a page has been freed */ -inline bool fil_space_t::is_freed(uint32_t page) +inline bool fil_space_t::is_freed(uint32_t page) noexcept { std::lock_guard freed_lock(freed_range_mutex); return freed_ranges.contains(page); @@ -3754,7 +3776,7 @@ recv_sys_t::recover(const page_id_t page_id, mtr_t *mtr, dberr_t *err) return block; } -inline fil_space_t *fil_system_t::find(const char *path) const +inline fil_space_t *fil_system_t::find(const char *path) const noexcept { mysql_mutex_assert_owner(&mutex); for (fil_space_t &space : fil_system.space_list) @@ -3764,7 +3786,7 @@ inline fil_space_t *fil_system_t::find(const char *path) const } /** Thread-safe function which sorts flush_list by oldest_modification */ -static void log_sort_flush_list() +static void log_sort_flush_list() noexcept { /* Ensure that oldest_modification() cannot change during std::sort() */ { diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index c48e0288a7d..81a900fb119 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -547,7 +547,7 @@ void mtr_t::rollback_to_savepoint(ulint begin, ulint end) } /** Set create_lsn. */ -inline void fil_space_t::set_create_lsn(lsn_t lsn) +inline void fil_space_t::set_create_lsn(lsn_t lsn) noexcept { /* Concurrent log_checkpoint_low() must be impossible. */ ut_ad(latch.have_wr()); @@ -1214,7 +1214,7 @@ inline void log_t::resize_write(lsn_t lsn, const byte *end, size_t len, end-= len; size_t s; -#ifdef HAVE_INNODB_MMAP +#ifdef HAVE_PMEM if (!resize_flush_buf) { ut_ad(is_mmap()); @@ -1796,14 +1796,14 @@ void mtr_t::free(const fil_space_t &space, uint32_t offset) m_log.close(log_write(id, nullptr)); } -void small_vector_base::grow_by_1(void *small, size_t element_size) +void small_vector_base::grow_by_1(void *small, size_t element_size) noexcept { const size_t cap= Capacity*= 2, s= cap * element_size; void *new_begin; if (BeginX == small) { new_begin= my_malloc(PSI_NOT_INSTRUMENTED, s, MYF(0)); - memcpy(new_begin, BeginX, size() * element_size); + memcpy(new_begin, BeginX, s / 2); TRASH_FREE(small, size() * element_size); } else diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 3db50861569..c38197cebd7 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -205,7 +205,7 @@ os_file_handle_error_cond_exit( const char* name, const char* operation, bool should_abort, - bool on_error_silent); + bool on_error_silent) noexcept; /** Does error handling when a file operation fails. @param operation name of operation that failed */ @@ -341,7 +341,7 @@ private: @param fd file descriptor @param name file name @return 0 on success */ -int os_file_lock(int fd, const char *name) +int os_file_lock(int fd, const char *name) noexcept { struct flock lk; @@ -370,13 +370,7 @@ int os_file_lock(int fd, const char *name) } #endif /* !_WIN32 */ - -/** Create a temporary file. This function is like tmpfile(3), but -the temporary file is created in the in the mysql server configuration -parameter (--tmpdir). -@return temporary file handle, or NULL on error */ -FILE* -os_file_create_tmpfile() +FILE *os_file_create_tmpfile() noexcept { FILE* file = NULL; File fd = mysql_tmpfile("ib"); @@ -409,7 +403,7 @@ void os_file_read_string( FILE* file, char* str, - ulint size) + ulint size) noexcept { if (size != 0) { rewind(file); @@ -420,21 +414,7 @@ os_file_read_string( } } -/** This function reduces a null-terminated full remote path name into -the path that is sent by MySQL for DATA DIRECTORY clause. It replaces -the 'databasename/tablename.ibd' found at the end of the path with just -'tablename'. - -Since the result is always smaller than the path sent in, no new memory -is allocated. The caller should allocate memory for the path sent in. -This function manipulates that path in place. - -If the path format is not as expected, just return. The result is used -to inform a SHOW CREATE TABLE command. -@param[in,out] data_dir_path Full path/data_dir_path */ -void -os_file_make_data_dir_path( - char* data_dir_path) +void os_file_make_data_dir_path(char *data_dir_path) noexcept { /* Replace the period before the extension with a null byte. */ char* ptr = strrchr(data_dir_path, '.'); @@ -483,11 +463,7 @@ to the last directory separator that the caller has fixed. @param[in] path path name @param[in] path last directory separator in the path @return true if this path is a drive root, false if not */ -UNIV_INLINE -bool -os_file_is_root( - const char* path, - const char* last_slash) +static bool os_file_is_root(const char *path, const char *last_slash) noexcept { return( #ifdef _WIN32 @@ -582,7 +558,7 @@ os_file_get_parent_dir( void test_os_file_get_parent_dir( const char* child_dir, - const char* expected_dir) + const char* expected_dir) noexcept { char* child = mem_strdup(child_dir); char* expected = expected_dir == NULL ? NULL @@ -605,7 +581,7 @@ test_os_file_get_parent_dir( /* Test the function os_file_get_parent_dir. */ void -unit_test_os_file_get_parent_dir() +unit_test_os_file_get_parent_dir() noexcept { test_os_file_get_parent_dir("/usr/lib/a", "/usr/lib"); test_os_file_get_parent_dir("/usr/", NULL); @@ -634,12 +610,7 @@ unit_test_os_file_get_parent_dir() #endif /* UNIV_ENABLE_UNIT_TEST_GET_PARENT_DIR */ -/** Creates all missing subdirectories along the given path. -@param[in] path Path name -@return DB_SUCCESS if OK, otherwise error code. */ -dberr_t -os_file_create_subdirs_if_needed( - const char* path) +dberr_t os_file_create_subdirs_if_needed(const char *path) noexcept { if (srv_read_only_mode) { @@ -783,6 +754,7 @@ the OS error number + 100 is returned. to the log @return error number, or OS error number + 100 */ ulint os_file_get_last_error(bool report_all_errors, bool on_error_silent) + noexcept { int err = errno; @@ -850,7 +822,7 @@ Returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error. @param[in] file open file handle @return 0 if success, -1 otherwise */ -static int os_file_sync_posix(os_file_t file) +static int os_file_sync_posix(os_file_t file) noexcept { #if !defined(HAVE_FDATASYNC) || HAVE_DECL_FDATASYNC == 0 auto func= fsync; @@ -904,7 +876,7 @@ bool os_file_status_posix( const char* path, bool* exists, - os_file_type_t* type) + os_file_type_t* type) noexcept { struct stat statinfo; @@ -940,14 +912,7 @@ os_file_status_posix( return(true); } -/** NOTE! Use the corresponding macro os_file_flush(), not directly this -function! -Flushes the write buffers of a given file to the disk. -@param[in] file handle to a file -@return true if success */ -bool -os_file_flush_func( - os_file_t file) +bool os_file_flush_func(os_file_t file) noexcept { if (UNIV_UNLIKELY(my_disable_sync)) return true; @@ -995,7 +960,7 @@ os_file_create_simple_func( os_file_create_t create_mode, ulint access_type, bool read_only, - bool* success) + bool* success) noexcept { pfs_os_file_t file; @@ -1057,20 +1022,8 @@ os_file_create_simple_func( return(file); } -/** This function attempts to create a directory named pathname. The new -directory gets default permissions. On Unix the permissions are -(0770 & ~umask). If the directory exists already, nothing is done and -the call succeeds, unless the fail_if_exists arguments is true. -If another error occurs, such as a permission error, this does not crash, -but reports the error and returns false. -@param[in] pathname directory name as null-terminated string -@param[in] fail_if_exists if true, pre-existing directory is treated as - an error. -@return true if call succeeds, false on error */ -bool -os_file_create_directory( - const char* pathname, - bool fail_if_exists) +bool os_file_create_directory(const char *pathname, bool fail_if_exists) + noexcept { int rcode; @@ -1153,7 +1106,7 @@ os_file_create_func( os_file_create_t create_mode, ulint type, bool read_only, - bool* success) + bool* success) noexcept { *success = false; @@ -1326,7 +1279,7 @@ os_file_create_simple_no_error_handling_func( os_file_create_t create_mode, ulint access_type, bool read_only, - bool* success) + bool* success) noexcept { os_file_t file; int create_flag = O_RDONLY | O_CLOEXEC; @@ -1475,13 +1428,7 @@ os_offset_t os_file_get_size(os_file_t file) noexcept return lseek(file, 0, SEEK_END); } -/** Gets a file size. -@param[in] filename Full path to the filename to check -@return file size if OK, else set m_total_size to ~0 and m_alloc_size to - errno */ -os_file_size_t -os_file_get_size( - const char* filename) +os_file_size_t os_file_get_size(const char *filename) noexcept { struct stat s; os_file_size_t file_size; @@ -1602,11 +1549,7 @@ os_file_truncate_posix( return(res == 0); } -/** Truncates a file at its current position. -@return true if success */ -bool -os_file_set_eof( - FILE* file) /*!< in: file to be truncated */ +bool os_file_set_eof(FILE *file) noexcept { return(!ftruncate(fileno(file), ftell(file))); } @@ -1619,8 +1562,8 @@ bool os_file_set_size(const char *name, os_file_t file, os_offset_t size, if (is_sparse) { bool success = !ftruncate(file, size); if (!success) { - sql_print_error("InnoDB: ftruncate of file %s" - " to %llu bytes failed with error %d", + sql_print_error("InnoDB: ftruncate of file %s to %" + PRIu64 " bytes failed with error %d", name, size, errno); } return success; @@ -1658,7 +1601,7 @@ bool os_file_set_size(const char *name, os_file_t file, os_offset_t size, case 0: return true; default: - sql_print_error("InnoDB: preallocating %llu" + sql_print_error("InnoDB: preallocating %" PRIu64 " bytes for file %s failed with error %d", size, name, err); /* fall through */ @@ -1808,7 +1751,7 @@ function! Flushes the write buffers of a given file to the disk. @param[in] file handle to a file @return true if success */ -bool os_file_flush_func(os_file_t file) +bool os_file_flush_func(os_file_t file) noexcept { if (UNIV_UNLIKELY(my_disable_sync)) return true; @@ -1858,7 +1801,7 @@ printed of all errors to the log @return error number, or OS error number + OS_FILE_ERROR_MAX */ ulint os_file_get_last_error(bool report_all_errors, bool on_error_silent) - + noexcept { ulint err = (ulint) GetLastError(); @@ -1956,7 +1899,7 @@ os_file_create_simple_func( os_file_create_t create_mode, ulint access_type, bool read_only, - bool* success) + bool* success) noexcept { os_file_t file; @@ -2015,20 +1958,8 @@ os_file_create_simple_func( return(file); } -/** This function attempts to create a directory named pathname. The new -directory gets default permissions. On Unix the permissions are -(0770 & ~umask). If the directory exists already, nothing is done and -the call succeeds, unless the fail_if_exists arguments is true. -If another error occurs, such as a permission error, this does not crash, -but reports the error and returns false. -@param[in] pathname directory name as null-terminated string -@param[in] fail_if_exists if true, pre-existing directory is treated - as an error. -@return true if call succeeds, false on error */ -bool -os_file_create_directory( - const char* pathname, - bool fail_if_exists) +bool os_file_create_directory(const char *pathname, bool fail_if_exists) + noexcept { BOOL rcode; @@ -2076,7 +2007,7 @@ os_file_create_func( os_file_create_t create_mode, ulint type, bool read_only, - bool* success) + bool* success) noexcept { os_file_t file; @@ -2194,7 +2125,7 @@ os_file_create_simple_no_error_handling_func( os_file_create_t create_mode, ulint access_type, bool read_only, - bool* success) + bool* success) noexcept { os_file_t file; @@ -2411,13 +2342,7 @@ os_offset_t os_file_get_size(os_file_t file) noexcept return ((os_offset_t) -1); } -/** Gets a file size. -@param[in] filename Full path to the filename to check -@return file size if OK, else set m_total_size to ~0 and m_alloc_size to - errno */ -os_file_size_t -os_file_get_size( - const char* filename) +os_file_size_t os_file_get_size(const char *filename) noexcept { struct __stat64 s; os_file_size_t file_size; @@ -2535,7 +2460,7 @@ Sets a sparse flag on Windows file. @return true on success, false on error */ #include -bool os_file_set_sparse_win32(os_file_t file, bool is_sparse) +bool os_file_set_sparse_win32(os_file_t file, bool is_sparse) noexcept { if (!is_sparse && !IsWindows8OrGreater()) { /* Cannot unset sparse flag on older Windows. @@ -2550,11 +2475,8 @@ bool os_file_set_sparse_win32(os_file_t file, bool is_sparse) FSCTL_SET_SPARSE, &sparse_buffer, sizeof(sparse_buffer), 0, 0,&temp); } -bool -os_file_set_size( - const char* pathname, - os_file_t file, - os_offset_t size) +bool os_file_set_size(const char *pathname, os_file_t file, os_offset_t size) + noexcept { LARGE_INTEGER length; @@ -2575,12 +2497,7 @@ os_file_set_size( return(success); } -/** Truncates a file at its current position. -@param[in] file Handle to be truncated -@return true if success */ -bool -os_file_set_eof( - FILE* file) +bool os_file_set_eof(FILE *file) noexcept { HANDLE h = (HANDLE) _get_osfhandle(fileno(file)); @@ -2797,7 +2714,7 @@ os_file_read_func( void* buf, os_offset_t offset, ulint n, - ulint* o) + ulint* o) noexcept { ut_ad(!type.node || type.node->handle == file); ut_ad(n); @@ -2835,7 +2752,7 @@ os_file_handle_error_cond_exit( const char* name, const char* operation, bool should_abort, - bool on_error_silent) + bool on_error_silent) noexcept { ulint err; @@ -2920,7 +2837,7 @@ os_file_handle_error_cond_exit( /** Check if the file system supports sparse files. @param fh file handle @return true if the file system supports sparse files */ -static bool os_is_sparse_file_supported(os_file_t fh) +static bool os_is_sparse_file_supported(os_file_t fh) noexcept { #ifdef _WIN32 FILE_ATTRIBUTE_TAG_INFO info; @@ -2949,7 +2866,7 @@ os_file_truncate( const char* pathname, os_file_t file, os_offset_t size, - bool allow_shrink) + bool allow_shrink) noexcept { if (!allow_shrink) { /* Do nothing if the size preserved is larger than or @@ -2977,7 +2894,7 @@ bool os_file_status( const char* path, bool* exists, - os_file_type_t* type) + os_file_type_t* type) noexcept { #ifdef _WIN32 return(os_file_status_win32(path, exists, type)); @@ -2995,7 +2912,7 @@ dberr_t os_file_punch_hole( os_file_t fh, os_offset_t off, - os_offset_t len) + os_offset_t len) noexcept { #ifdef _WIN32 return os_file_punch_hole_win32(fh, off, len); @@ -3008,7 +2925,7 @@ os_file_punch_hole( @param off byte offset from the start (SEEK_SET) @param len size of the hole in bytes @return DB_SUCCESS or error code */ -dberr_t IORequest::punch_hole(os_offset_t off, ulint len) const +dberr_t IORequest::punch_hole(os_offset_t off, ulint len) const noexcept { ulint trim_len = bpage ? bpage->physical_size() - len : 0; @@ -3080,7 +2997,7 @@ os_file_get_status( const char* path, os_file_stat_t* stat_info, bool check_rw_perm, - bool read_only) + bool read_only) noexcept { dberr_t ret; @@ -3273,7 +3190,7 @@ static bool is_linux_native_aio_supported() } #endif -int os_aio_init() +int os_aio_init() noexcept { int max_write_events= int(srv_n_write_io_threads * OS_AIO_N_PENDING_IOS_PER_THREAD); @@ -3338,7 +3255,7 @@ more concurrent threads via thread_group setting. executing write callbacks @return 0 for success, !=0 for error. */ -int os_aio_resize(ulint n_reader_threads, ulint n_writer_threads) +int os_aio_resize(ulint n_reader_threads, ulint n_writer_threads) noexcept { /* Lock the slots, and wait until all current IOs finish.*/ std::unique_lock lk_read(read_slots->mutex()), @@ -3373,7 +3290,7 @@ int os_aio_resize(ulint n_reader_threads, ulint n_writer_threads) return ret; } -void os_aio_free() +void os_aio_free() noexcept { delete read_slots; delete write_slots; @@ -3383,7 +3300,7 @@ void os_aio_free() } /** Wait until there are no pending asynchronous writes. */ -static void os_aio_wait_until_no_pending_writes_low(bool declare) +static void os_aio_wait_until_no_pending_writes_low(bool declare) noexcept { const bool notify_wait= declare && write_slots->pending_io_count(); @@ -3398,27 +3315,27 @@ static void os_aio_wait_until_no_pending_writes_low(bool declare) /** Wait until there are no pending asynchronous writes. @param declare whether the wait will be declared in tpool */ -void os_aio_wait_until_no_pending_writes(bool declare) +void os_aio_wait_until_no_pending_writes(bool declare) noexcept { os_aio_wait_until_no_pending_writes_low(declare); buf_dblwr.wait_flush_buffered_writes(); } /** @return number of pending reads */ -size_t os_aio_pending_reads() +size_t os_aio_pending_reads() noexcept { std::lock_guard lock(read_slots->mutex()); return read_slots->pending_io_count(); } /** @return approximate number of pending reads */ -size_t os_aio_pending_reads_approx() +size_t os_aio_pending_reads_approx() noexcept { return read_slots->pending_io_count(); } /** @return number of pending writes */ -size_t os_aio_pending_writes() +size_t os_aio_pending_writes() noexcept { std::lock_guard lock(write_slots->mutex()); return write_slots->pending_io_count(); @@ -3426,7 +3343,7 @@ size_t os_aio_pending_writes() /** Wait until all pending asynchronous reads have completed. @param declare whether the wait will be declared in tpool */ -void os_aio_wait_until_no_pending_reads(bool declare) +void os_aio_wait_until_no_pending_reads(bool declare) noexcept { const bool notify_wait= declare && read_slots->pending_io_count(); @@ -3442,7 +3359,7 @@ void os_aio_wait_until_no_pending_reads(bool declare) /** Submit a fake read request during crash recovery. @param type fake read request @param offset additional context */ -void os_fake_read(const IORequest &type, os_offset_t offset) +void os_fake_read(const IORequest &type, os_offset_t offset) noexcept { tpool::aiocb *cb= read_slots->acquire(); @@ -3469,6 +3386,7 @@ void os_fake_read(const IORequest &type, os_offset_t offset) @retval DB_SUCCESS if request was queued successfully @retval DB_IO_ERROR on I/O error */ dberr_t os_aio(const IORequest &type, void *buf, os_offset_t offset, size_t n) + noexcept { ut_ad(n > 0); ut_ad(!(n & 511)); /* payload of page_compressed tables */ @@ -3546,10 +3464,7 @@ func_exit: goto func_exit; } -/** Prints info of the aio arrays. -@param[in,out] file file where to print */ -void -os_aio_print(FILE* file) +void os_aio_print(FILE *file) noexcept { time_t current_time; double time_elapsed; @@ -3598,9 +3513,7 @@ os_aio_print(FILE* file) os_last_printout = current_time; } -/** Refreshes the statistics used to print per-second averages. */ -void -os_aio_refresh_stats() +void os_aio_refresh_stats() noexcept { os_n_fsyncs_old = os_n_fsyncs; diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 6180a332e7d..548b1769df6 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -1243,6 +1243,16 @@ row_import::match_index_columns( err = DB_ERROR; } + + if (cfg_field->descending != field->descending) { + ib_errf(thd, IB_LOG_LEVEL_ERROR, + ER_TABLE_SCHEMA_MISMATCH, + "Index %s field %s is %s which does " + "not match with .cfg file", + index->name(), field->name(), + field->descending ? "DESC" : "ASC"); + err = DB_ERROR; + } } return(err); @@ -2558,7 +2568,11 @@ row_import_cfg_read_index_fields( field->prefix_len = mach_read_from_4(ptr) & ((1U << 12) - 1); ptr += sizeof(ib_uint32_t); - field->fixed_len = mach_read_from_4(ptr) & ((1U << 10) - 1); + uint32_t fixed_len = mach_read_from_4(ptr); + + field->descending = bool(fixed_len >> 31); + + field->fixed_len = fixed_len & ((1U << 10) - 1); ptr += sizeof(ib_uint32_t); /* Include the NUL byte in the length. */ diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index cdfd6133333..c698b719d59 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -483,7 +483,9 @@ row_ins_cascade_calc_update_vec( const upd_field_t* parent_ufield = &parent_update->fields[j]; - if (parent_ufield->field_no == parent_field_no) { + if (parent_ufield->field_no == parent_field_no + && !(parent_ufield->new_val.type.prtype + & DATA_VIRTUAL)) { ulint min_size; const dict_col_t* col; @@ -722,7 +724,7 @@ row_ins_foreign_trx_print( ut_print_timestamp(dict_foreign_err_file); fputs(" Transaction:\n", dict_foreign_err_file); - trx_print_low(dict_foreign_err_file, trx, 600, + trx_print_low(dict_foreign_err_file, trx, n_rec_locks, n_trx_locks, heap_size); mysql_mutex_assert_owner(&dict_foreign_err_mutex); @@ -2809,7 +2811,7 @@ avoid_bulk: trx_start_if_not_started(trx, true); trx->bulk_insert = true; auto m = trx->mod_tables.emplace(index->table, 0); - m.first->second.start_bulk_insert(index->table); + m.first->second.start_bulk_insert(index->table, true); err = m.first->second.bulk_insert_buffered( *entry, *index, trx); goto err_exit; @@ -3406,7 +3408,12 @@ row_ins_index_entry( return(DB_LOCK_WAIT);}); if (index->is_btree()) { - if (auto t= trx->check_bulk_buffer(index->table)) { + /* If the InnoDB skips the sorting of primary + index for bulk insert operation then InnoDB + should have called load_one_row() for the + first insert statement and shouldn't use + buffer for consecutive insert statement */ + if (auto t= trx->use_bulk_buffer(index)) { /* MDEV-25036 FIXME: row_ins_check_foreign_constraint() check should be done before buffering the insert diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 0e6d68cf7ce..cc720645d7a 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -5053,7 +5053,9 @@ dberr_t row_merge_bulk_t::alloc_block() return DB_SUCCESS; } -row_merge_bulk_t::row_merge_bulk_t(dict_table_t *table) +row_merge_bulk_t::row_merge_bulk_t(dict_table_t *table, + bool sort_primary_key) + : m_sort_primary_key(sort_primary_key) { ulint n_index= 0; for (dict_index_t *index= UT_LIST_GET_FIRST(table->indexes); @@ -5179,6 +5181,33 @@ dberr_t row_merge_bulk_t::write_to_tmp_file(ulint index_no) return DB_SUCCESS; } +ATTRIBUTE_COLD +dberr_t row_merge_bulk_t::load_one_row(trx_t *trx) +{ + /* Load the single row into the clustered index. BtrBulk has + nothing to do for bulk insert here and used only as a interface + to insert single row. */ + dict_index_t *index= m_merge_buf[0].index; + BtrBulk btr_bulk(index, trx); + ut_ad(m_merge_buf[0].n_tuples == 1); + dberr_t err= row_merge_insert_index_tuples(index, index->table, + OS_FILE_CLOSED, nullptr, + &m_merge_buf[0], &btr_bulk, + 0, 0, 0, nullptr, + index->table->space_id, + nullptr, + m_blob_file.fd == OS_FILE_CLOSED + ? nullptr : &m_blob_file); + if (err != DB_SUCCESS) + trx->error_info= index; + else if (index->table->persistent_autoinc) + btr_write_autoinc(index, 1); + err= btr_bulk.finish(err); + if (err == DB_SUCCESS && index->is_clust()) + index->table->stat_n_rows= 1; + return err; +} + dberr_t row_merge_bulk_t::bulk_insert_buffered(const dtuple_t &row, const dict_index_t &ind, trx_t *trx) @@ -5254,6 +5283,8 @@ add_to_buf: } func_exit: + if (!m_sort_primary_key && ind.is_clust()) + err= load_one_row(trx); if (large_tuple_heap) mem_heap_free(large_tuple_heap); return err; @@ -5325,9 +5356,16 @@ func_exit: dberr_t row_merge_bulk_t::write_to_table(dict_table_t *table, trx_t *trx) { - ulint i= 0; - for (dict_index_t *index= UT_LIST_GET_FIRST(table->indexes); - index; index= UT_LIST_GET_NEXT(indexes, index)) + dict_index_t *index= UT_LIST_GET_FIRST(table->indexes); + ut_ad(index->is_clust()); + ulint i= !m_sort_primary_key; + if (i) + /* For clustered index, InnoDB does call load_one_row() while + buffering the first insert and uses row_ins_clust_index_entry() + for subsequent rows. So skip the clustered index while applying + the buffered insert operation */ + index= UT_LIST_GET_NEXT(indexes, index); + for (; index; index= UT_LIST_GET_NEXT(indexes, index)) { if (!index->is_btree()) continue; diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 2b5f0b3fc2f..4fd35b1d8b0 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -210,6 +210,14 @@ row_mysql_read_blob_ref( *len = mach_read_from_n_little_endian(ref, col_len - 8); + if (!*len) { + /* Field_blob::store() if (!length) would encode both + the length and the pointer in the same area. An empty + string must be a valid (nonnull) pointer in the + collation functions that cmp_data() may invoke. */ + return ref; + } + memcpy(&data, ref + col_len - 8, sizeof data); return(data); @@ -2525,7 +2533,7 @@ row_rename_table_for_mysql( const char* old_name, /*!< in: old table name */ const char* new_name, /*!< in: new table name */ trx_t* trx, /*!< in/out: transaction */ - bool use_fk) /*!< in: whether to parse and enforce + rename_fk fk) /*!< in: how to handle FOREIGN KEY constraints */ { dict_table_t* table = NULL; @@ -2550,6 +2558,8 @@ row_rename_table_for_mysql( old_is_tmp = dict_table_t::is_temporary_name(old_name); new_is_tmp = dict_table_t::is_temporary_name(new_name); + ut_ad(fk != RENAME_IGNORE_FK || !new_is_tmp); + table = dict_table_open_on_name(old_name, true, DICT_ERR_IGNORE_FK_NOKEY); @@ -2608,10 +2618,9 @@ row_rename_table_for_mysql( << TROUBLESHOOTING_MSG; goto funct_exit; - - } else if (use_fk && !old_is_tmp && new_is_tmp) { - /* MySQL is doing an ALTER TABLE command and it renames the - original table to a temporary table name. We want to preserve + } else if (fk == RENAME_ALTER_COPY && !old_is_tmp && new_is_tmp) { + /* Non-native ALTER TABLE is renaming the + original table to a temporary name. We want to preserve the original foreign key constraint definitions despite the name change. An exception is those constraints for which the ALTER TABLE contained DROP FOREIGN KEY .*/ @@ -2655,7 +2664,7 @@ row_rename_table_for_mysql( goto rollback_and_exit; } - if (!new_is_tmp) { + if (/* fk == RENAME_IGNORE_FK || */ !new_is_tmp) { /* Rename all constraints. */ char new_table_name[MAX_TABLE_NAME_LEN + 1]; char old_table_utf8[MAX_TABLE_NAME_LEN + 1]; @@ -2829,7 +2838,7 @@ row_rename_table_for_mysql( err = dict_load_foreigns( new_name, nullptr, trx->id, !old_is_tmp || trx->check_foreigns, - use_fk + fk == RENAME_ALTER_COPY ? DICT_ERR_IGNORE_NONE : DICT_ERR_IGNORE_FK_NOKEY, fk_tables); diff --git a/storage/innobase/row/row0quiesce.cc b/storage/innobase/row/row0quiesce.cc index c3729831071..aa9a73d804b 100644 --- a/storage/innobase/row/row0quiesce.cc +++ b/storage/innobase/row/row0quiesce.cc @@ -46,45 +46,38 @@ row_quiesce_write_index_fields( FILE* file, /*!< in: file to write to */ THD* thd) /*!< in/out: session */ { - byte row[sizeof(ib_uint32_t) * 2]; + byte row[sizeof(ib_uint32_t) * 3]; for (ulint i = 0; i < index->n_fields; ++i) { byte* ptr = row; const dict_field_t* field = &index->fields[i]; mach_write_to_4(ptr, field->prefix_len); - ptr += sizeof(ib_uint32_t); + ptr += 4; - mach_write_to_4(ptr, field->fixed_len); - - DBUG_EXECUTE_IF("ib_export_io_write_failure_9", - close(fileno(file));); - - if (fwrite(row, 1, sizeof(row), file) != sizeof(row)) { - - ib_senderrf( - thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR, - (ulong) errno, strerror(errno), - "while writing index fields."); - - return(DB_IO_ERROR); - } + /* Since maximum fixed length can be + DICT_ANTELOPE_MAX_INDEX_COL_LEN, InnoDB + can use the 0th bit to store the + field descending information */ + mach_write_to_4(ptr, field->fixed_len + | uint32_t(field->descending) << 31); + ptr += 4; const char* field_name = field->name ? field->name : ""; /* Include the NUL byte in the length. */ - ib_uint32_t len = static_cast(strlen(field_name) + 1); - mach_write_to_4(row, len); + uint32_t len = uint32_t(strlen(field_name) + 1); + mach_write_to_4(ptr, len); DBUG_EXECUTE_IF("ib_export_io_write_failure_10", close(fileno(file));); - if (fwrite(row, 1, sizeof(len), file) != sizeof(len) + if (fwrite(row, 1, sizeof(row), file) != sizeof(row) || fwrite(field_name, 1, len, file) != len) { ib_senderrf( thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR, (ulong) errno, strerror(errno), - "while writing index column."); + "while writing index fields."); return(DB_IO_ERROR); } diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 69cf6b965ae..764cac9d954 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -1966,15 +1966,11 @@ skip_monitors: if (srv_print_verbose_log) { sql_print_information("InnoDB: " "log sequence number " LSN_PF -#ifdef HAVE_INNODB_MMAP "%s" -#endif "; transaction id " TRX_ID_FMT, recv_sys.lsn, -#ifdef HAVE_INNODB_MMAP log_sys.is_mmap() ? " (memory-mapped)" : "", -#endif trx_sys.get_max_trx_id()); } diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc index 302947af9a5..53acf06fae6 100644 --- a/storage/innobase/trx/trx0rec.cc +++ b/storage/innobase/trx/trx0rec.cc @@ -1865,7 +1865,9 @@ trx_undo_report_row_operation( } else if (index->table->is_temporary()) { } else if (trx_has_lock_x(*trx, *index->table) && index->table->bulk_trx_id == trx->id) { - m.first->second.start_bulk_insert(index->table); + m.first->second.start_bulk_insert( + index->table, + thd_sql_command(trx->mysql_thd) != SQLCOM_LOAD); if (dberr_t err = m.first->second.bulk_insert_buffered( *clust_entry, *index, trx)) { diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index e70ad656b2f..0c369be6b16 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -69,7 +69,7 @@ const byte timestamp_max_bytes[7] = { }; #endif /* SIZEOF_VOIDP */ -static const ulint MAX_DETAILED_ERROR_LEN = 256; +static const ulint MAX_DETAILED_ERROR_LEN = 512; /*************************************************************//** Set detailed error message for the transaction. */ @@ -176,6 +176,8 @@ struct TrxFactory { allocated object. trx_t objects are allocated by ut_zalloc_nokey() in Pool::Pool() which would not call the constructors of the trx_t members. */ + new(&trx->autoinc_locks) trx_t::autoinc_lock_vector(); + new(&trx->mod_tables) trx_mod_tables_t(); new(&trx->lock.table_locks) lock_list(); @@ -238,6 +240,8 @@ struct TrxFactory { trx->mutex_destroy(); + trx->autoinc_locks.~small_vector(); + trx->mod_tables.~trx_mod_tables_t(); ut_ad(!trx->read_view.is_open()); @@ -340,21 +344,12 @@ trx_t *trx_create() trx->assert_freed(); - mem_heap_t* heap; - ib_alloc_t* alloc; - /* We just got trx from pool, it should be non locking */ ut_ad(!trx->will_lock); ut_ad(!trx->rw_trx_hash_pins); DBUG_LOG("trx", "Create: " << trx); - heap = mem_heap_create(sizeof(ib_vector_t) + sizeof(void*) * 8); - - alloc = ib_heap_allocator_create(heap); - - trx->autoinc_locks = ib_vector_create(alloc, sizeof(void**), 4); - ut_ad(trx->mod_tables.empty()); ut_ad(trx->lock.n_rec_locks == 0); ut_ad(trx->lock.set_nth_bit_calls == 0); @@ -370,6 +365,7 @@ trx_t *trx_create() /** Free the memory to trx_pools */ void trx_t::free() { + autoinc_locks.fake_defined(); #ifdef HAVE_MEM_CHECK if (xid.is_null()) MEM_MAKE_DEFINED(&xid, sizeof xid); @@ -378,6 +374,7 @@ void trx_t::free() sizeof xid.data - (xid.gtrid_length + xid.bqual_length)); #endif MEM_CHECK_DEFINED(this, sizeof *this); + autoinc_locks.make_undefined(); ut_ad(!n_mysql_tables_in_use); ut_ad(!mysql_log_file_name); @@ -396,14 +393,7 @@ void trx_t::free() trx_sys.rw_trx_hash.put_pins(this); mysql_thd= nullptr; - // FIXME: We need to avoid this heap free/alloc for each commit. - if (autoinc_locks) - { - ut_ad(ib_vector_is_empty(autoinc_locks)); - /* We allocated a dedicated heap for the vector. */ - ib_vector_free(autoinc_locks); - autoinc_locks= NULL; - } + autoinc_locks.deep_clear(); MEM_NOACCESS(&skip_lock_inheritance_and_n_ref, sizeof skip_lock_inheritance_and_n_ref); @@ -501,7 +491,7 @@ inline void trx_t::release_locks() lock_release(this); ut_ad(!lock.n_rec_locks); ut_ad(UT_LIST_GET_LEN(lock.trx_locks) == 0); - ut_ad(ib_vector_is_empty(autoinc_locks)); + ut_ad(autoinc_locks.empty()); mem_heap_empty(lock.lock_heap); } @@ -933,7 +923,7 @@ trx_start_low( trx->wsrep = wsrep_on(trx->mysql_thd); #endif /* WITH_WSREP */ - ut_a(ib_vector_is_empty(trx->autoinc_locks)); + ut_a(trx->autoinc_locks.empty()); ut_a(trx->lock.table_locks.empty()); /* No other thread can access this trx object through rw_trx_hash, @@ -1770,9 +1760,6 @@ trx_print_low( /*!< in: output stream */ const trx_t* trx, /*!< in: transaction */ - ulint max_query_len, - /*!< in: max query length to print, - or 0 to use the default max length */ ulint n_rec_locks, /*!< in: trx->lock.n_rec_locks */ ulint n_trx_locks, @@ -1862,7 +1849,7 @@ state_ok: } if (thd) { - innobase_mysql_print_thd(f, thd, uint(max_query_len)); + innobase_mysql_print_thd(f, thd); } } @@ -1874,13 +1861,11 @@ void trx_print_latched( /*==============*/ FILE* f, /*!< in: output stream */ - const trx_t* trx, /*!< in: transaction */ - ulint max_query_len) /*!< in: max query length to print, - or 0 to use the default max length */ + const trx_t* trx) /*!< in: transaction */ { lock_sys.assert_locked(); - trx_print_low(f, trx, max_query_len, + trx_print_low(f, trx, trx->lock.n_rec_locks, UT_LIST_GET_LEN(trx->lock.trx_locks), mem_heap_get_size(trx->lock.lock_heap)); @@ -1894,9 +1879,7 @@ void trx_print( /*======*/ FILE* f, /*!< in: output stream */ - const trx_t* trx, /*!< in: transaction */ - ulint max_query_len) /*!< in: max query length to print, - or 0 to use the default max length */ + const trx_t* trx) /*!< in: transaction */ { ulint n_rec_locks, n_trx_locks, heap_size; { @@ -1906,7 +1889,7 @@ trx_print( heap_size= mem_heap_get_size(trx->lock.lock_heap); } - trx_print_low(f, trx, max_query_len, n_rec_locks, n_trx_locks, heap_size); + trx_print_low(f, trx, n_rec_locks, n_trx_locks, heap_size); } /** Prepare a transaction. diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c index 3d7fa3a1de9..60dc57c84df 100644 --- a/storage/myisam/mi_check.c +++ b/storage/myisam/mi_check.c @@ -3425,9 +3425,9 @@ static int sort_get_next_record(MI_SORT_PARAM *sort_param) { if (!searching) mi_check_print_info(param, - "Found block with impossible length %u at %s; Skipped", - block_info.block_len+ (uint) (block_info.filepos-pos), - llstr(pos,llbuff)); + "Found block with impossible length %lu at %s; Skipped", + block_info.block_len + (unsigned long) (block_info.filepos-pos), + llstr(pos, llbuff)); if (found_record) goto try_next; searching=1; diff --git a/storage/perfschema/pfs_engine_table.cc b/storage/perfschema/pfs_engine_table.cc index ab309463b53..ee137e0fffe 100644 --- a/storage/perfschema/pfs_engine_table.cc +++ b/storage/perfschema/pfs_engine_table.cc @@ -740,28 +740,34 @@ static bool allow_drop_table_privilege() { PFS_readonly_acl pfs_readonly_acl; ACL_internal_access_result -PFS_readonly_acl::check(privilege_t want_access, privilege_t *save_priv) const +PFS_readonly_acl::check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const { const privilege_t always_forbidden= INSERT_ACL | UPDATE_ACL | DELETE_ACL | /* CREATE_ACL | */ REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL | LOCK_TABLES_ACL; - if (unlikely((want_access & always_forbidden) != NO_ACL)) - return ACL_INTERNAL_ACCESS_DENIED; - - return ACL_INTERNAL_ACCESS_CHECK_GRANT; + if (any_combination_will_do) + return want_access & ~always_forbidden + ? ACL_INTERNAL_ACCESS_CHECK_GRANT: ACL_INTERNAL_ACCESS_DENIED; + else + return want_access & always_forbidden + ? ACL_INTERNAL_ACCESS_DENIED : ACL_INTERNAL_ACCESS_CHECK_GRANT; } PFS_readonly_world_acl pfs_readonly_world_acl; ACL_internal_access_result -PFS_readonly_world_acl::check(privilege_t want_access, privilege_t *save_priv) const +PFS_readonly_world_acl::check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const { - ACL_internal_access_result res= PFS_readonly_acl::check(want_access, save_priv); + ACL_internal_access_result res= + PFS_readonly_acl::check(want_access, save_priv, any_combination_will_do); if (res == ACL_INTERNAL_ACCESS_CHECK_GRANT) { - if (want_access == SELECT_ACL) + if (any_combination_will_do ? + ((want_access & SELECT_ACL) != NO_ACL) : (want_access == SELECT_ACL)) res= ACL_INTERNAL_ACCESS_GRANTED; } return res; @@ -770,9 +776,11 @@ PFS_readonly_world_acl::check(privilege_t want_access, privilege_t *save_priv) c PFS_readonly_processlist_acl pfs_readonly_processlist_acl; ACL_internal_access_result PFS_readonly_processlist_acl::check( - privilege_t want_access, privilege_t *save_priv) const { + privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const +{ ACL_internal_access_result res = - PFS_readonly_acl::check(want_access, save_priv); + PFS_readonly_acl::check(want_access, save_priv, any_combination_will_do); if ((res == ACL_INTERNAL_ACCESS_CHECK_GRANT) && (want_access == SELECT_ACL)) { THD *thd = current_thd; @@ -798,34 +806,41 @@ ACL_internal_access_result PFS_readonly_processlist_acl::check( PFS_truncatable_acl pfs_truncatable_acl; ACL_internal_access_result -PFS_truncatable_acl::check(privilege_t want_access, privilege_t *save_priv) const +PFS_truncatable_acl::check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const { const privilege_t always_forbidden= INSERT_ACL | UPDATE_ACL | DELETE_ACL | /* CREATE_ACL | */ REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL | LOCK_TABLES_ACL; - if (unlikely((want_access & always_forbidden) != NO_ACL)) - return ACL_INTERNAL_ACCESS_DENIED; - - return ACL_INTERNAL_ACCESS_CHECK_GRANT; + if (any_combination_will_do) + return want_access & ~always_forbidden + ? ACL_INTERNAL_ACCESS_CHECK_GRANT: ACL_INTERNAL_ACCESS_DENIED; + else + return want_access & always_forbidden + ? ACL_INTERNAL_ACCESS_DENIED : ACL_INTERNAL_ACCESS_CHECK_GRANT; } PFS_truncatable_world_acl pfs_truncatable_world_acl; ACL_internal_access_result -PFS_truncatable_world_acl::check(privilege_t want_access, privilege_t *save_priv) const +PFS_truncatable_world_acl::check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const { - ACL_internal_access_result res= PFS_truncatable_acl::check(want_access, save_priv); + ACL_internal_access_result res= + PFS_truncatable_acl::check(want_access, save_priv, any_combination_will_do); if (res == ACL_INTERNAL_ACCESS_CHECK_GRANT) { - if (want_access == DROP_ACL) + if (any_combination_will_do ? + ((want_access & SELECT_ACL) != NO_ACL) : (want_access == SELECT_ACL)) + res= ACL_INTERNAL_ACCESS_GRANTED; + else if (any_combination_will_do ? + ((want_access & DROP_ACL) != NO_ACL) : (want_access == DROP_ACL)) { if (allow_drop_table_privilege()) res= ACL_INTERNAL_ACCESS_GRANTED; } - else if (want_access == SELECT_ACL) - res= ACL_INTERNAL_ACCESS_GRANTED; } return res; } @@ -834,44 +849,48 @@ PFS_truncatable_world_acl::check(privilege_t want_access, privilege_t *save_priv PFS_updatable_acl pfs_updatable_acl; ACL_internal_access_result -PFS_updatable_acl::check(privilege_t want_access, privilege_t *save_priv) const +PFS_updatable_acl::check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const { const privilege_t always_forbidden= INSERT_ACL | DELETE_ACL | /* CREATE_ACL | */ REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL; - if (unlikely((want_access & always_forbidden) != NO_ACL)) - return ACL_INTERNAL_ACCESS_DENIED; - - return ACL_INTERNAL_ACCESS_CHECK_GRANT; + if (any_combination_will_do) + return want_access & ~always_forbidden + ? ACL_INTERNAL_ACCESS_CHECK_GRANT: ACL_INTERNAL_ACCESS_DENIED; + else + return want_access & always_forbidden + ? ACL_INTERNAL_ACCESS_DENIED : ACL_INTERNAL_ACCESS_CHECK_GRANT; } PFS_editable_acl pfs_editable_acl; ACL_internal_access_result -PFS_editable_acl::check(privilege_t want_access, privilege_t *save_priv) const +PFS_editable_acl::check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const { const privilege_t always_forbidden= /* CREATE_ACL | */ REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | TRIGGER_ACL; - if (unlikely((want_access & always_forbidden) != NO_ACL)) - return ACL_INTERNAL_ACCESS_DENIED; - - return ACL_INTERNAL_ACCESS_CHECK_GRANT; + if (any_combination_will_do) + return want_access & ~always_forbidden + ? ACL_INTERNAL_ACCESS_CHECK_GRANT: ACL_INTERNAL_ACCESS_DENIED; + else + return want_access & always_forbidden + ? ACL_INTERNAL_ACCESS_DENIED : ACL_INTERNAL_ACCESS_CHECK_GRANT; } PFS_unknown_acl pfs_unknown_acl; ACL_internal_access_result -PFS_unknown_acl::check(privilege_t want_access, privilege_t *save_priv) const +PFS_unknown_acl::check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const { const privilege_t always_forbidden= CREATE_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_VIEW_ACL | TRIGGER_ACL; - if (unlikely((want_access & always_forbidden) != NO_ACL)) - return ACL_INTERNAL_ACCESS_DENIED; - /* There is no point in hiding (by enforcing ACCESS_DENIED for SELECT_ACL on performance_schema.*) tables that do not exist anyway. @@ -882,7 +901,12 @@ PFS_unknown_acl::check(privilege_t want_access, privilege_t *save_priv) const The same goes for other DML (INSERT_ACL | UPDATE_ACL | DELETE_ACL), for ease of use: error messages will be less surprising. */ - return ACL_INTERNAL_ACCESS_CHECK_GRANT; + if (any_combination_will_do) + return want_access & ~always_forbidden + ? ACL_INTERNAL_ACCESS_CHECK_GRANT: ACL_INTERNAL_ACCESS_DENIED; + else + return want_access & always_forbidden + ? ACL_INTERNAL_ACCESS_DENIED : ACL_INTERNAL_ACCESS_CHECK_GRANT; } /** diff --git a/storage/perfschema/pfs_engine_table.h b/storage/perfschema/pfs_engine_table.h index 44815301d5d..55764cc31d3 100644 --- a/storage/perfschema/pfs_engine_table.h +++ b/storage/perfschema/pfs_engine_table.h @@ -348,8 +348,8 @@ public: ~PFS_readonly_acl() = default; - ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const override; + ACL_internal_access_result check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const override; }; /** Singleton instance of PFS_readonly_acl. */ @@ -367,7 +367,7 @@ public: ~PFS_truncatable_acl() = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const override; + privilege_t *save_priv, bool any_combination_will_do) const override; }; /** Singleton instance of PFS_truncatable_acl. */ @@ -385,7 +385,7 @@ public: ~PFS_updatable_acl() = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const override; + privilege_t *save_priv, bool any_combination_will_do) const override; }; /** Singleton instance of PFS_updatable_acl. */ @@ -403,7 +403,7 @@ public: ~PFS_editable_acl() = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const override; + privilege_t *save_priv, bool any_combination_will_do) const override; }; /** Singleton instance of PFS_editable_acl. */ @@ -420,7 +420,7 @@ public: ~PFS_unknown_acl() = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const override; + privilege_t *save_priv, bool any_combination_will_do) const override; }; /** Singleton instance of PFS_unknown_acl. */ @@ -438,7 +438,8 @@ public: ~PFS_readonly_world_acl() {} - ACL_internal_access_result check(privilege_t want_access, privilege_t *save_priv) const override; + ACL_internal_access_result check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const override; }; @@ -457,7 +458,8 @@ public: ~PFS_truncatable_world_acl() {} - ACL_internal_access_result check(privilege_t want_access, privilege_t *save_priv) const override; + ACL_internal_access_result check(privilege_t want_access, + privilege_t *save_priv, bool any_combination_will_do) const override; }; @@ -477,7 +479,7 @@ class PFS_readonly_processlist_acl : public PFS_readonly_acl { {} ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const override; + privilege_t *save_priv, bool any_combination_will_do) const override; }; /** Singleton instance of PFS_readonly_processlist_acl */ diff --git a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result index ec7d5c5f2b4..41c5bc78096 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_not_null.result @@ -1543,12 +1543,12 @@ d53_10 double(53,10) NO NULL pk double NO PRI NULL INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES (12345.12345,12345.12345,0.9,123456789.123,56789.987,11111111.111,8.0,0.0123456789,1234566789123456789,99999999999999999.99999999,1); SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 11111111.111 d10_10 0.0123456789 d1_0 8 d53 1234566789123456800 d53_10 100000000000000000.0000000000 +f 12345.1 f0 12345.1 f20_3 56789.988 f23_0 123457000 @@ -1571,7 +1571,6 @@ Warnings: Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 0 d 11111111.111 d 1e81 @@ -1588,6 +1587,7 @@ d53_10 0.0000000000 d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f 0 +f 12345.1 f 1e38 f0 0 f0 12345.1 @@ -1603,7 +1603,6 @@ r1_1 0.9 r1_1 0.9 INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES (-999999999999999999999999,-99999999999.999999999999,-0.9,-999.99999999999999999999,-99999999999999999.999,-999999999999999999999999999999999999999999999999999999999999-0.999,-9,-.9999999999,-999999999999999999999999999999.99999999999999999999999,-9999999999999999999999999999999999999999999.9999999999,4); SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -1626,6 +1625,7 @@ d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f0 -100000000000 f0 0 @@ -1654,12 +1654,12 @@ CONCAT('', MAX(d1_0)), CONCAT('', MAX(d10_10)), CONCAT('', MAX(d53)), CONCAT('', MAX(d53_10)) FROM t1; -CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(d)) 1e81 CONCAT('', MAX(d10_10)) 0.9999999999 CONCAT('', MAX(d1_0)) 9 CONCAT('', MAX(d53)) 100000000000000000000000000000000000000000000000000000 CONCAT('', MAX(d53_10)) 10000000000000000000000000000000000000000000.0000000000 +CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(f0)) 1e38 CONCAT('', MAX(f20_3)) 99999998430674940.000 CONCAT('', MAX(f23_0)) 1e38 @@ -1688,7 +1688,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -1716,6 +1715,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f 3.40282e38 f0 -100000000000 @@ -1763,7 +1763,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -1796,6 +1795,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f 3.40282e38 f 3.40282e38 diff --git a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result index 95101490235..032fddbfd16 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_null.result @@ -1330,12 +1330,12 @@ d53_10 double(53,10) YES NULL pk double NO PRI NULL INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES (12345.12345,12345.12345,0.9,123456789.123,56789.987,11111111.111,8.0,0.0123456789,1234566789123456789,99999999999999999.99999999,1); SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 11111111.111 d10_10 0.0123456789 d1_0 8 d53 1234566789123456800 d53_10 100000000000000000.0000000000 +f 12345.1 f0 12345.1 f20_3 56789.988 f23_0 123457000 @@ -1358,7 +1358,6 @@ Warnings: Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 0 d 11111111.111 d 1e81 @@ -1375,6 +1374,7 @@ d53_10 0.0000000000 d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f 0 +f 12345.1 f 1e38 f0 0 f0 12345.1 @@ -1390,7 +1390,6 @@ r1_1 0.9 r1_1 0.9 INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES (-999999999999999999999999,-99999999999.999999999999,-0.9,-999.99999999999999999999,-99999999999999999.999,-999999999999999999999999999999999999999999999999999999999999-0.999,-9,-.9999999999,-999999999999999999999999999999.99999999999999999999999,-9999999999999999999999999999999999999999999.9999999999,4); SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -1413,6 +1412,7 @@ d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f0 -100000000000 f0 0 @@ -1441,12 +1441,12 @@ CONCAT('', MAX(d1_0)), CONCAT('', MAX(d10_10)), CONCAT('', MAX(d53)), CONCAT('', MAX(d53_10)) FROM t1; -CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(d)) 1e81 CONCAT('', MAX(d10_10)) 0.9999999999 CONCAT('', MAX(d1_0)) 9 CONCAT('', MAX(d53)) 100000000000000000000000000000000000000000000000000000 CONCAT('', MAX(d53_10)) 10000000000000000000000000000000000000000000.0000000000 +CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(f0)) 1e38 CONCAT('', MAX(f20_3)) 99999998430674940.000 CONCAT('', MAX(f23_0)) 1e38 @@ -1475,7 +1475,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -1503,6 +1502,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f 3.40282e38 f0 -100000000000 @@ -1550,7 +1550,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -1583,6 +1582,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f 3.40282e38 f 3.40282e38 diff --git a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_unsigned.result b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_unsigned.result index 0a8f49ebf36..d49ed255184 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/col_opt_unsigned.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/col_opt_unsigned.result @@ -206,12 +206,12 @@ d53_10 double(53,10) unsigned YES NULL pk double unsigned NO PRI NULL INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES (12345.12345,12345.12345,0.9,123456789.123,56789.987,11111111.111,8.0,0.0123456789,1234566789123456789,99999999999999999.99999999,1); SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 11111111.111 d10_10 0.0123456789 d1_0 8 d53 1234566789123456800 d53_10 100000000000000000.0000000000 +f 12345.1 f0 12345.1 f20_3 56789.988 f23_0 123457000 @@ -234,7 +234,6 @@ Warnings: Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 0 d 11111111.111 d 1e81 @@ -251,6 +250,7 @@ d53_10 0.0000000000 d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f 0 +f 12345.1 f 1e38 f0 0 f0 12345.1 @@ -277,7 +277,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 0 d 0 d 11111111.111 @@ -300,6 +299,7 @@ d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f 0 f 0 +f 12345.1 f 1e38 f0 0 f0 0 @@ -328,12 +328,12 @@ CONCAT('', MAX(d1_0)), CONCAT('', MAX(d10_10)), CONCAT('', MAX(d53)), CONCAT('', MAX(d53_10)) FROM t1; -CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(d)) 1e81 CONCAT('', MAX(d10_10)) 0.9999999999 CONCAT('', MAX(d1_0)) 9 CONCAT('', MAX(d53)) 100000000000000000000000000000000000000000000000000000 CONCAT('', MAX(d53_10)) 10000000000000000000000000000000000000000000.0000000000 +CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(f0)) 1e38 CONCAT('', MAX(f20_3)) 99999998430674940.000 CONCAT('', MAX(f23_0)) 1e38 @@ -362,7 +362,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 0 d 0 d 11111111.111 @@ -390,6 +389,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f 0 f 0 +f 12345.1 f 1e38 f 3.40282e38 f0 0 @@ -437,7 +437,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 0 d 0 d 11111111.111 @@ -470,6 +469,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f 0 f 0 +f 12345.1 f 1e38 f 3.40282e38 f 3.40282e38 diff --git a/storage/rocksdb/mysql-test/rocksdb/r/misc.result b/storage/rocksdb/mysql-test/rocksdb/r/misc.result index f8734da6e6b..14afc71665a 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/misc.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/misc.result @@ -28,10 +28,6 @@ DROP EVENT ev1; SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE ORDER BY TABLE_NAME; TABLE_NAME COLUMN_NAME REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME -Warning 1286 Unknown storage engine 'InnoDB' -Warning 1286 Unknown storage engine 'InnoDB' -Warning 1286 Unknown storage engine 'InnoDB' -Warnings: column_stats column_name NULL NULL column_stats db_name NULL NULL column_stats table_name NULL NULL @@ -93,3 +89,7 @@ time_zone_transition Time_zone_id NULL NULL time_zone_transition Transition_time NULL NULL time_zone_transition_type Time_zone_id NULL NULL time_zone_transition_type Transition_type_id NULL NULL +Warnings: +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1286 Unknown storage engine 'InnoDB' diff --git a/storage/rocksdb/mysql-test/rocksdb/r/type_float.result b/storage/rocksdb/mysql-test/rocksdb/r/type_float.result index 0cf5c5e0496..4a99710a30c 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/type_float.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/type_float.result @@ -27,12 +27,12 @@ d53_10 double(53,10) YES NULL pk double NO PRI NULL INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES (12345.12345,12345.12345,0.9,123456789.123,56789.987,11111111.111,8.0,0.0123456789,1234566789123456789,99999999999999999.99999999,1); SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 11111111.111 d10_10 0.0123456789 d1_0 8 d53 1234566789123456800 d53_10 100000000000000000.0000000000 +f 12345.1 f0 12345.1 f20_3 56789.988 f23_0 123457000 @@ -55,7 +55,6 @@ Warnings: Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d 0 d 11111111.111 d 1e81 @@ -72,6 +71,7 @@ d53_10 0.0000000000 d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f 0 +f 12345.1 f 1e38 f0 0 f0 12345.1 @@ -87,7 +87,6 @@ r1_1 0.9 r1_1 0.9 INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES (-999999999999999999999999,-99999999999.999999999999,-0.9,-999.99999999999999999999,-99999999999999999.999,-999999999999999999999999999999999999999999999999999999999999-0.999,-9,-.9999999999,-999999999999999999999999999999.99999999999999999999999,-9999999999999999999999999999999999999999999.9999999999,4); SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -110,6 +109,7 @@ d53_10 100000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f0 -100000000000 f0 0 @@ -138,12 +138,12 @@ CONCAT('', MAX(d1_0)), CONCAT('', MAX(d10_10)), CONCAT('', MAX(d53)), CONCAT('', MAX(d53_10)) FROM t1; -CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(d)) 1e81 CONCAT('', MAX(d10_10)) 0.9999999999 CONCAT('', MAX(d1_0)) 9 CONCAT('', MAX(d53)) 100000000000000000000000000000000000000000000000000000 CONCAT('', MAX(d53_10)) 10000000000000000000000000000000000000000000.0000000000 +CONCAT('', MAX(f)) 1e38 CONCAT('', MAX(f0)) 1e38 CONCAT('', MAX(f20_3)) 99999998430674940.000 CONCAT('', MAX(f23_0)) 1e38 @@ -172,7 +172,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -200,6 +199,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f 3.40282e38 f0 -100000000000 @@ -247,7 +247,6 @@ Warning 1264 Out of range value for column 'd10_10' at row 1 Warning 1264 Out of range value for column 'd53' at row 1 Warning 1264 Out of range value for column 'd53_10' at row 1 SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1; -f 12345.1 d -1e60 d 0 d 11111111.111 @@ -280,6 +279,7 @@ d53_10 10000000000000000000000000000000000000000000.0000000000 d53_10 10000000000000000000000000000000000000000000.0000000000 f -1e24 f 0 +f 12345.1 f 1e38 f 3.40282e38 f 3.40282e38 diff --git a/storage/rocksdb/mysql-test/rocksdb/suite.pm b/storage/rocksdb/mysql-test/rocksdb/suite.pm index b4feb20a451..40e424a75f9 100644 --- a/storage/rocksdb/mysql-test/rocksdb/suite.pm +++ b/storage/rocksdb/mysql-test/rocksdb/suite.pm @@ -18,6 +18,7 @@ my $sst_dump= "$::bindir/storage/rocksdb$::multiconfig/sst_dump", "$::path_client_bindir/sst_dump"); return "RocksDB is not compiled, no sst_dump" unless $sst_dump; +return "doesn't work in embedded" if $::opt_embedded_server; $ENV{MARIAROCKS_SST_DUMP}="$sst_dump"; ## Temporarily disable testing under valgrind, due to MDEV-12439 diff --git a/storage/rocksdb/mysql-test/rocksdb/t/type_float.inc b/storage/rocksdb/mysql-test/rocksdb/t/type_float.inc index 27adda9ba35..601d61feb1f 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/type_float.inc +++ b/storage/rocksdb/mysql-test/rocksdb/t/type_float.inc @@ -91,6 +91,7 @@ INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES ( --sorted_result --query_vertical SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1 +--enable_prepare_warnings INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES ( 999999999999999999999999999999999999999, 999999999999999999999999999999999999999.9999999999999999, @@ -104,6 +105,7 @@ INSERT INTO t1 (f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10,pk) VALUES ( 19999999999999999999999999999999999999999999.9999999999, 6 ); +--disable_prepare_warnings --sorted_result --query_vertical SELECT f,f0,r1_1,f23_0,f20_3,d,d1_0,d10_10,d53,d53_10 FROM t1 diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index f3ba3e1d4fe..d97e114990c 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -931,9 +931,6 @@ int ha_spider::reset() THD *thd = ha_thd(); SPIDER_TRX *tmp_trx, *trx_bak; SPIDER_CONDITION *tmp_cond; -/* - char first_byte, first_byte_bak; -*/ backup_error_status(); DBUG_ENTER("ha_spider::reset"); DBUG_PRINT("info",("spider this=%p", this)); @@ -10142,7 +10139,7 @@ int ha_spider::append_lock_tables_list() if (!(wide_handler->trx = spider_get_trx(ha_thd(), TRUE, &error_num))) DBUG_RETURN(error_num); - if ((error_num= spider_check_trx_and_get_conn(wide_handler->trx->thd, this))) + if ((error_num = spider_check_trx_and_get_conn(wide_handler->trx->thd, this))) { DBUG_RETURN(error_num); } diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_27438.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_27438.result new file mode 100644 index 00000000000..7a30b0d27db --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_27438.result @@ -0,0 +1,6 @@ +install soname 'ha_spider'; +CREATE TABLE t1 (a INT) ENGINE=Innodb; +SET SESSION debug_dbug="+d,crash_commit_after_log"; +INSERT INTO t1 VALUES (1); +Got one of the listed errors +drop table t1; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_27438_spider_table.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_27438_spider_table.result new file mode 100644 index 00000000000..b319fe76645 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_27438_spider_table.result @@ -0,0 +1,27 @@ +install soname 'ha_spider'; +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t1 (a INT); +create table t2 (a int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +Warnings: +Warning 138 Spider table params in COMMENT or CONNECTION strings have been deprecated and will be removed in a future release. Please use table options instead. +INSERT INTO t2 VALUES (1); +SET SESSION debug_dbug="+d,crash_commit_after_log"; +INSERT INTO t2 VALUES (2); +Got one of the listed errors +call mtr.add_suppression(".*\\[ERROR\\] mariadbd: Table './test/t1' is marked as crashed and should be repaired"); +call mtr.add_suppression(".*\\[Warning\\] Checking table: './test/t1'"); +set spider_same_server_link= 1; +select * from t2; +a +1 +2 +Warnings: +Error 1034 1 client is using or hasn't closed the table properly +Error 1034 Table is fixed +drop server srv; +drop table t1, t2; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_34849.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_34849.result new file mode 100644 index 00000000000..9433dd7f679 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_34849.result @@ -0,0 +1,24 @@ +# +# MDEV-34849 SIGSEGV in server_mysql_real_connect, spider_db_connect, __strcmp_evex and __strnlen_evex, ASAN heap-use-after-free in spider_db_connect on INSERT +# +INSTALL SONAME 'ha_spider'; +CREATE TABLE t1 (c INT) ENGINE=Spider; +CREATE TABLE t2 (c INT) ENGINE=Spider; +SELECT * FROM t2; +ERROR HY000: Unable to connect to foreign data source: localhost +set @old_table_open_cache=@@global.table_open_cache; +SET GLOBAL table_open_cache=0; +Warnings: +Warning 1292 Truncated incorrect table_open_cache value: '0' +set autocommit=0; +/* 1 */ INSERT INTO t1 VALUES (0); +ERROR HY000: Unable to connect to foreign data source: localhost +/* 2 */ INSERT INTO t2 VALUES (0); +ERROR HY000: Unable to connect to foreign data source: localhost +set global spider_connect_error_interval=0; +/* 3 */ INSERT INTO t1 VALUES (0); +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t1, t2; +set global table_open_cache=@old_table_open_cache; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_35326.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_35326.result new file mode 100644 index 00000000000..24a85650e81 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_35326.result @@ -0,0 +1,12 @@ +for master_1 +for child2 +for child3 +CREATE TABLE t (c INT) ENGINE=Spider; +CREATE PROCEDURE p() CONTAINS SQL READS SQL DATA SELECT * FROM t INTO OUTFILE 'foo.txt'; +CALL p(); +ERROR HY000: Unable to connect to foreign data source: localhost +drop procedure p; +drop table t; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27438.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_27438.test new file mode 100644 index 00000000000..e60331d07bb --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27438.test @@ -0,0 +1,22 @@ +--source include/have_debug.inc +# Valgrind does not work well with test that crashes the server +--source include/not_valgrind.inc +install soname 'ha_spider'; +CREATE TABLE t1 (a INT) ENGINE=Innodb; + +# crash the server. +--let $expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` +--let $expect_file_name= $MYSQLTEST_VARDIR/tmp/$expect_file_name.expect +--exec echo wait > $expect_file_name +SET SESSION debug_dbug="+d,crash_commit_after_log"; +--error 2006,2013,2026 +INSERT INTO t1 VALUES (1); + +# restart the server +--exec echo restart >> $expect_file_name +--enable_reconnect +--source include/wait_until_connected_again.inc + +drop table t1; +--disable_query_log +--source ../../include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27438_spider_table.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_27438_spider_table.test new file mode 100644 index 00000000000..18b37e373f4 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27438_spider_table.test @@ -0,0 +1,38 @@ +--source include/have_debug.inc +# Valgrind does not work well with test that crashes the server +--source include/not_valgrind.inc + +# Same as spider/bugfix.mdev_27438, but actually using a spider table. +install soname 'ha_spider'; +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE t1 (a INT); +create table t2 (a int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +INSERT INTO t2 VALUES (1); + +# crash the server. +--let $expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` +--let $expect_file_name= $MYSQLTEST_VARDIR/tmp/$expect_file_name.expect +--exec echo wait > $expect_file_name +SET SESSION debug_dbug="+d,crash_commit_after_log"; +--error 2006,2013,2026 +INSERT INTO t2 VALUES (2); + +# restart the server +--exec echo restart >> $expect_file_name +--enable_reconnect +--source include/wait_until_connected_again.inc + +call mtr.add_suppression(".*\\[ERROR\\] mariadbd: Table './test/t1' is marked as crashed and should be repaired"); +call mtr.add_suppression(".*\\[Warning\\] Checking table: './test/t1'"); +set spider_same_server_link= 1; +--disable_ps_protocol +select * from t2; +--enable_ps_protocol +drop server srv; +drop table t1, t2; +--disable_query_log +--source ../../include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_34849.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_34849.test new file mode 100644 index 00000000000..4890abf4c7d --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_34849.test @@ -0,0 +1,52 @@ +--echo # +--echo # MDEV-34849 SIGSEGV in server_mysql_real_connect, spider_db_connect, __strcmp_evex and __strnlen_evex, ASAN heap-use-after-free in spider_db_connect on INSERT +--echo # + +INSTALL SONAME 'ha_spider'; + +CREATE TABLE t1 (c INT) ENGINE=Spider; +CREATE TABLE t2 (c INT) ENGINE=Spider; + +# So that t2 is inserted into spider_init_error_tables and in INSERT +# INTO t2 we go into failure mode in spider_get_share() +--error 1429 +SELECT * FROM t2; + +# Resets the table cache so that the next two queries will call +# ha_spider::open() on t1 and t2 respectively +set @old_table_open_cache=@@global.table_open_cache; +SET GLOBAL table_open_cache=0; + +# This causes trx_ha->wait_for_reusing to remain false during the +# (non-)rollback at the end of the first INSERT INTO t1 statement, so +# that the second INSERT INTO t1 enters the branch in +# spider_check_trx_and_get_conn() that does not update spider fields +# including NULLing its associated connections. +set autocommit=0; + +# Misses the table cache when opening the table. Spider then opens the +# table so that the next INSERT INTO t1 causes a table cache hit and +# skips the call to open table with spider +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +/* 1 */ INSERT INTO t1 VALUES (0); + +# Spider opens the table and creates a t2 share, assigns it to +# conn->queued_connect_share, and frees the t2 share on failure +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +/* 2 */ INSERT INTO t2 VALUES (0); + +# So that the final INSERT INTO t1 will decide not to return the same +# error in spider_db_connect(), and move onto using the freed share +set global spider_connect_error_interval=0; + +# Skips call to ha_spider::open(), so it does not create a t1 share +# nor reassign it to conn->queued_connect_share, causing it to remain +# the freed t2 share, and using the share results in segv +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +/* 3 */ INSERT INTO t1 VALUES (0); + +drop table t1, t2; + +set global table_open_cache=@old_table_open_cache; +--disable_query_log +--source ../../include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_35326.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_35326.test new file mode 100644 index 00000000000..06e16fecd96 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_35326.test @@ -0,0 +1,23 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +let $MYSQLD_DATADIR= `select @@datadir`; + +CREATE TABLE t (c INT) ENGINE=Spider; +--disable_ps_protocol +CREATE PROCEDURE p() CONTAINS SQL READS SQL DATA SELECT * FROM t INTO OUTFILE 'foo.txt'; +--enable_ps_protocol +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +CALL p(); +remove_file $MYSQLD_DATADIR/test/foo.txt; +drop procedure p; +drop table t; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc index 96df128b5fb..ed5697b2151 100644 --- a/storage/spider/spd_conn.cc +++ b/storage/spider/spd_conn.cc @@ -874,17 +874,12 @@ int spider_check_and_get_casual_read_conn( if (conn->casual_read_current_id > 63) conn->casual_read_current_id = 2; } - char first_byte_bak = *spider->conn_keys[link_idx]; - *spider->conn_keys[link_idx] = - '0' + spider->result_list.casual_read[link_idx]; if (!(spider->conns[link_idx]= spider_get_conn( spider->share, link_idx, spider->conn_keys[link_idx], spider->wide_handler->trx, spider, FALSE, TRUE, &error_num))) { - *spider->conn_keys[link_idx] = first_byte_bak; DBUG_RETURN(error_num); } - *spider->conn_keys[link_idx] = first_byte_bak; spider->conns[link_idx]->casual_read_base_conn = conn; spider_check_and_set_autocommit(thd, spider->conns[link_idx], NULL); DBUG_RETURN(0); diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc index 3448fb8f26d..cdd5c66e2f9 100644 --- a/storage/spider/spd_copy_tables.cc +++ b/storage/spider/spd_copy_tables.cc @@ -703,8 +703,8 @@ int spider_udf_bg_copy_exec_sql( long long spider_copy_tables_body( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { int error_num, roop_count, all_link_cnt = 0, use_table_charset; SPIDER_COPY_TABLES *copy_tables = NULL; diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 9a21386319f..e3b33735796 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -7413,10 +7413,10 @@ int spider_mbase_share::discover_table_structure( SPIDER_CONN *conn; int need_mon_deref; int *need_mon= &need_mon_deref; - if (!(conn= spider_get_conn(spider_share, 0, - spider_share->conn_keys[roop_count], trx, NULL, - FALSE, FALSE, &error_num))) - { + if (!(conn = spider_get_conn( + spider_share, 0, spider_share->conn_keys[roop_count], trx, NULL, FALSE, + FALSE, &error_num)) + ) { DBUG_RETURN(error_num); } spider_lock_before_query(conn, need_mon); diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc index 029bb2b637e..cef84a737da 100644 --- a/storage/spider/spd_direct_sql.cc +++ b/storage/spider/spd_direct_sql.cc @@ -1309,8 +1309,8 @@ void spider_udf_free_direct_sql_alloc( long long spider_direct_sql_body( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error, + unsigned char *is_null, + unsigned char *error, my_bool bg ) { int error_num, roop_count; diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h index b2e355b4d0c..f6f007cb1d4 100644 --- a/storage/spider/spd_include.h +++ b/storage/spider/spd_include.h @@ -941,6 +941,10 @@ typedef struct st_spider_transaction uint trx_ha_reuse_count; XID_STATE internal_xid_state; SPIDER_CONN *join_trx_top; + /* + Assigned from the global variable `spider_thread_id', which + starts from 1 and increments + */ ulonglong spider_thread_id; ulonglong trx_conn_adjustment; uint locked_connections; @@ -1582,7 +1586,14 @@ typedef struct st_spider_trx_ha */ uint *conn_link_idx; uchar *conn_can_fo; - /* TODO: document */ + /* + TODO: better documentation of this field. + + By assigning true to wait_for_reusing, in + spider_check_trx_and_get_conn the fields of the spider handler + will be updated using the trx, as well as some other small + behavioural differences there. + */ bool wait_for_reusing; } SPIDER_TRX_HA; diff --git a/storage/spider/spd_ping_table.cc b/storage/spider/spd_ping_table.cc index 1a243f448b1..1f495e0ca0a 100644 --- a/storage/spider/spd_ping_table.cc +++ b/storage/spider/spd_ping_table.cc @@ -1059,8 +1059,8 @@ int spider_ping_table_cache_compare( long long spider_ping_table_body( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { int error_num = 0, link_idx, flags, full_mon_count, current_mon_count, success_count, fault_count, tmp_error_num = 0; diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index daa21c97f65..3459ead857f 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -5398,7 +5398,6 @@ bool spider_init_share( const bool new_share ) { - char first_byte; char *tmp_name; SPIDER_RESULT_LIST *result_list = &spider->result_list; int search_link_idx; @@ -5418,14 +5417,6 @@ bool spider_init_share( spider_unlock_udf_table_mon_mutexes(share); } - const int semi_table_lock_conn = - spider_param_semi_table_lock_connection(thd, share->semi_table_lock_conn); - if (semi_table_lock_conn) - first_byte = '0' + - spider_param_semi_table_lock(thd, share->semi_table_lock); - else - first_byte = '0'; - if (!(spider->wide_handler->trx = spider_get_trx(thd, TRUE, error_num))) { spider_share_init_error_free(share, new_share, true); @@ -5465,7 +5456,6 @@ bool spider_init_share( for (int link_idx = 0; link_idx < (int) share->link_count; link_idx++) { spider->conn_keys[link_idx] = tmp_name; - *tmp_name = first_byte; tmp_name += share->conn_keys_lengths[link_idx] + 1; result_list->upd_tmp_tbl_prms[link_idx].init(); result_list->upd_tmp_tbl_prms[link_idx].field_count = 1; diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc index 2ad4774fa63..7a6d957fcfb 100644 --- a/storage/spider/spd_trx.cc +++ b/storage/spider/spd_trx.cc @@ -40,6 +40,10 @@ extern struct charset_info_st *spd_charset_utf8mb3_bin; extern handlerton *spider_hton_ptr; extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE]; pthread_mutex_t spider_thread_id_mutex; +/* + Starts from 1 and increment by 1 whenever a new SPIDER_TRX is + created. +*/ ulonglong spider_thread_id; #ifdef HAVE_PSI_INTERFACE @@ -2521,7 +2525,17 @@ int spider_internal_xa_commit_by_xid( SPIDER_Open_tables_backup open_tables_backup; bool table_xa_opened = FALSE; bool table_xa_member_opened = FALSE; + bool created_tmp_thd = FALSE; DBUG_ENTER("spider_internal_xa_commit_by_xid"); + if (!thd) + { + if (!(thd = spider_create_tmp_thd())) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + created_tmp_thd= TRUE; + } /* select status @@ -2719,6 +2733,8 @@ xa_delete: goto error; spider_sys_close_table(thd, &open_tables_backup); table_xa_opened = FALSE; + if (created_tmp_thd) + spider_free_tmp_thd(thd); DBUG_RETURN(0); error: @@ -2727,6 +2743,8 @@ error: if (table_xa_member_opened) spider_sys_close_table(thd, &open_tables_backup); error_open_table: + if (created_tmp_thd) + spider_free_tmp_thd(thd); DBUG_RETURN(error_num); } @@ -2751,7 +2769,17 @@ int spider_internal_xa_rollback_by_xid( SPIDER_Open_tables_backup open_tables_backup; bool table_xa_opened = FALSE; bool table_xa_member_opened = FALSE; + bool created_tmp_thd= FALSE; DBUG_ENTER("spider_internal_xa_rollback_by_xid"); + if (!thd) + { + if (!(thd = spider_create_tmp_thd())) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + created_tmp_thd= TRUE; + } /* select status @@ -2947,6 +2975,8 @@ xa_delete: goto error; spider_sys_close_table(thd, &open_tables_backup); table_xa_opened = FALSE; + if (created_tmp_thd) + spider_free_tmp_thd(thd); DBUG_RETURN(0); error: @@ -2955,6 +2985,8 @@ error: if (table_xa_member_opened) spider_sys_close_table(thd, &open_tables_backup); error_open_table: + if (created_tmp_thd) + spider_free_tmp_thd(thd); DBUG_RETURN(error_num); } @@ -3160,6 +3192,12 @@ int spider_rollback( conn->db_conn->reset_lock_table_hash(); } + /* + We do (almost) nothing if the following two conditions are both met: + + * This is just the end of a statement, not an explicit rollback. + * The autocommit is OFF or we are in an explicit transaction. + */ if (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { if (trx->trx_start) @@ -3273,15 +3311,12 @@ int spider_xa_commit_by_xid( DBUG_ENTER("spider_xa_commit_by_xid"); if (!(trx = spider_get_trx(thd, TRUE, &error_num))) - goto error_get_trx; + DBUG_RETURN(error_num); - if ((error_num = spider_internal_xa_commit_by_xid(thd, trx, xid))) - goto error; + error_num = spider_internal_xa_commit_by_xid(thd, trx, xid); - DBUG_RETURN(0); - -error: -error_get_trx: + if (!thd) + spider_free_trx(trx, FALSE); DBUG_RETURN(error_num); } @@ -3294,15 +3329,12 @@ int spider_xa_rollback_by_xid( DBUG_ENTER("spider_xa_rollback_by_xid"); if (!(trx = spider_get_trx(thd, TRUE, &error_num))) - goto error_get_trx; + DBUG_RETURN(error_num); - if ((error_num = spider_internal_xa_rollback_by_xid(thd, trx, xid))) - goto error; + error_num = spider_internal_xa_rollback_by_xid(thd, trx, xid); - DBUG_RETURN(0); - -error: -error_get_trx: + if (!thd) + spider_free_trx(trx, FALSE); DBUG_RETURN(error_num); } @@ -3371,15 +3403,161 @@ int spider_end_trx( DBUG_RETURN(error_num); } -int spider_check_trx_and_get_conn(THD *thd, ha_spider *spider) +/* + Report a table error. + + The error_msg requires two format params, db name and table name. +*/ +static int spider_report_table_error(ha_spider *spider, + int error_num, const char *error_msg) { - int error_num, roop_count, search_link_idx; + TABLE *table = spider->get_table(); + TABLE_SHARE *table_share = table->s; + char *db = (char *) my_alloca( + table_share->db.length + 1 + table_share->table_name.length + 1); + if (!db) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + return HA_ERR_OUT_OF_MEM; + } + char *table_name = db + table_share->db.length + 1; + memcpy(db, table_share->db.str, table_share->db.length); + db[table_share->db.length] = '\0'; + memcpy(table_name, table_share->table_name.str, + table_share->table_name.length); + table_name[table_share->table_name.length] = '\0'; + my_printf_error(error_num, error_msg, MYF(0), db, table_name); + my_afree(db); + return error_num; +} + +/* Only called from spider_check_trx_and_get_conn. */ +static int spider_trx_update(THD *thd, ha_spider *spider, SPIDER_TRX *trx) +{ + int search_link_idx, roop_count; + SPIDER_SHARE *share = spider->share; + DBUG_ENTER("spider_trx_update"); + DBUG_PRINT("info", ("spider next trx")); + spider->trx_conn_adjustment = trx->trx_conn_adjustment; + if ( + spider->spider_thread_id != trx->spider_thread_id || + spider->search_link_query_id != thd->query_id + ) { + search_link_idx = spider_conn_first_link_idx(thd, + share->link_statuses, share->access_balances, spider->conn_link_idx, + share->link_count, SPIDER_LINK_STATUS_OK); + if (search_link_idx == -1) + DBUG_RETURN(spider_report_table_error(spider, + ER_SPIDER_ALL_LINKS_FAILED_NUM, + ER_SPIDER_ALL_LINKS_FAILED_STR)); + else if (search_link_idx == -2) + { + my_error(HA_ERR_OUT_OF_MEM, MYF(0)); + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + spider->search_link_idx = search_link_idx; + spider->search_link_query_id = thd->query_id; + } + spider->spider_thread_id = trx->spider_thread_id; + + for (roop_count = 0; roop_count < (int) share->link_count; roop_count++) + { + spider->conns[roop_count] = NULL; + } + DBUG_RETURN(0); +} + +/* + Only called from spider_check_trx_and_get_conn + + TODO: this function comes from a refactoring, and the from_if param + is true iff the call is from the "if" branch, for lack of a better + name. This needs to be further understood and explained or removed + accordingly. +*/ +static int spider_trx_get_conn(ha_spider *spider, SPIDER_TRX *trx, + bool from_if) +{ + int roop_count, error_num; + bool search_link_idx_is_checked = FALSE; + SPIDER_CONN *conn; + SPIDER_SHARE *share = spider->share; + DBUG_ENTER("spider_trx_get_conn"); + for ( + roop_count = spider_conn_link_idx_next(share->link_statuses, + spider->conn_link_idx, -1, share->link_count, + SPIDER_LINK_STATUS_RECOVERY); + roop_count < (int) share->link_count; + roop_count = spider_conn_link_idx_next(share->link_statuses, + spider->conn_link_idx, roop_count, share->link_count, + SPIDER_LINK_STATUS_RECOVERY) + ) { + if (roop_count == spider->search_link_idx) + search_link_idx_is_checked = TRUE; + if ((conn= spider->conns[roop_count])) + { + /* TODO: do we need the check for !from_if here? */ + if (!from_if) + conn->error_mode&= spider->error_mode; + if (conn->queued_connect) + conn->queued_connect_share= share; + } + else if (!(conn = + spider_get_conn(share, roop_count, + spider->conn_keys[roop_count], trx, + spider, FALSE, TRUE, + &error_num))) + { + if ( + share->monitoring_kind[roop_count] && + spider->need_mons[roop_count] + ) { + error_num = spider_ping_table_mon_from_table( + trx, + trx->thd, + share, + roop_count, + (uint32) share->monitoring_sid[roop_count], + share->table_name, + share->table_name_length, + spider->conn_link_idx[roop_count], + NULL, + 0, + share->monitoring_kind[roop_count], + share->monitoring_limit[roop_count], + share->monitoring_flag[roop_count], + TRUE + ); + } + DBUG_PRINT("info",("spider get conn error")); + /* + Flag for another update (trx->spider_thread_id is at least + 1, causing the next check spider->spider_thread_id != + trx->spider_thread_id to return true). + + TODO: do we need the check for from_if here? + */ + if (from_if) + spider->spider_thread_id = 0; + DBUG_RETURN(error_num); + } + else + conn->error_mode &= spider->error_mode; + } + if (!search_link_idx_is_checked) + DBUG_RETURN(spider_report_table_error(spider, + ER_SPIDER_LINK_MON_JUST_NG_NUM, + ER_SPIDER_LINK_MON_JUST_NG_STR)); + DBUG_RETURN(0); +} + +int spider_check_trx_and_get_conn( + THD *thd, + ha_spider *spider +) { + int error_num; SPIDER_TRX *trx; SPIDER_SHARE *share = spider->share; - SPIDER_CONN *conn; - char first_byte, first_byte_bak; - int semi_table_lock_conn = spider_param_semi_table_lock_connection(thd, - share->semi_table_lock_conn); DBUG_ENTER("spider_check_trx_and_get_conn"); if (!(trx = spider_get_trx(thd, TRUE, &error_num))) { @@ -3394,225 +3572,21 @@ int spider_check_trx_and_get_conn(THD *thd, ha_spider *spider) if (!trx_ha || trx_ha->wait_for_reusing) spider_trx_set_link_idx_for_all(spider); - if (semi_table_lock_conn) - first_byte = '0' + - spider_param_semi_table_lock(thd, share->semi_table_lock); - else - first_byte = '0'; - DBUG_PRINT("info",("spider semi_table_lock_conn = %d", - semi_table_lock_conn)); - DBUG_PRINT("info",("spider semi_table_lock = %d", - spider_param_semi_table_lock(thd, share->semi_table_lock))); - DBUG_PRINT("info",("spider first_byte = %d", first_byte)); if ( !trx_ha || trx_ha->wait_for_reusing || trx->spider_thread_id != spider->spider_thread_id || trx->trx_conn_adjustment != spider->trx_conn_adjustment || - first_byte != *spider->conn_keys[0] || share->link_statuses[spider->conn_link_idx[spider->search_link_idx]] == SPIDER_LINK_STATUS_NG ) { - DBUG_PRINT("info",(first_byte != *spider->conn_keys[0] ? - "spider change conn type" : trx != spider->wide_handler->trx ? - "spider change thd" : "spider next trx")); - spider->wide_handler->trx = trx; - spider->trx_conn_adjustment = trx->trx_conn_adjustment; - if ( - spider->spider_thread_id != trx->spider_thread_id || - spider->search_link_query_id != thd->query_id - ) { - search_link_idx = spider_conn_first_link_idx(thd, - share->link_statuses, share->access_balances, spider->conn_link_idx, - share->link_count, SPIDER_LINK_STATUS_OK); - if (search_link_idx == -1) - { - TABLE *table = spider->get_table(); - TABLE_SHARE *table_share = table->s; - char *db = (char *) my_alloca( - table_share->db.length + 1 + table_share->table_name.length + 1); - if (!db) - { - my_error(HA_ERR_OUT_OF_MEM, MYF(0)); - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - char *table_name = db + table_share->db.length + 1; - memcpy(db, table_share->db.str, table_share->db.length); - db[table_share->db.length] = '\0'; - memcpy(table_name, table_share->table_name.str, - table_share->table_name.length); - table_name[table_share->table_name.length] = '\0'; - my_printf_error(ER_SPIDER_ALL_LINKS_FAILED_NUM, - ER_SPIDER_ALL_LINKS_FAILED_STR, MYF(0), db, table_name); - my_afree(db); - DBUG_RETURN(ER_SPIDER_ALL_LINKS_FAILED_NUM); - } else if (search_link_idx == -2) - { - my_error(HA_ERR_OUT_OF_MEM, MYF(0)); - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - spider->search_link_idx = search_link_idx; - spider->search_link_query_id = thd->query_id; - } - spider->spider_thread_id = trx->spider_thread_id; - - first_byte_bak = *spider->conn_keys[0]; - *spider->conn_keys[0] = first_byte; - for (roop_count = 0; roop_count < (int) share->link_count; roop_count++) - { - spider->conns[roop_count]= NULL; - } - bool search_link_idx_is_checked = FALSE; - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - spider->conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < (int) share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - spider->conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) - ) { - if (roop_count == spider->search_link_idx) - search_link_idx_is_checked = TRUE; - if (!spider->conns[roop_count]) - { - *spider->conn_keys[roop_count] = first_byte; - if ( - !(conn = - spider_get_conn(share, roop_count, - spider->conn_keys[roop_count], trx, - spider, FALSE, TRUE, - &error_num)) - ) { - if ( - share->monitoring_kind[roop_count] && - spider->need_mons[roop_count] - ) { - error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, - share, - roop_count, - (uint32) share->monitoring_sid[roop_count], - share->table_name, - share->table_name_length, - spider->conn_link_idx[roop_count], - NULL, - 0, - share->monitoring_kind[roop_count], - share->monitoring_limit[roop_count], - share->monitoring_flag[roop_count], - TRUE - ); - } - DBUG_PRINT("info",("spider get conn error")); - *spider->conn_keys[0] = first_byte_bak; - spider->spider_thread_id = 0; - DBUG_RETURN(error_num); - } - conn->error_mode &= spider->error_mode; - } - } - if (!search_link_idx_is_checked) - { - TABLE *table = spider->get_table(); - TABLE_SHARE *table_share = table->s; - char *db = (char *) my_alloca( - table_share->db.length + 1 + table_share->table_name.length + 1); - if (!db) - { - my_error(HA_ERR_OUT_OF_MEM, MYF(0)); - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - char *table_name = db + table_share->db.length + 1; - memcpy(db, table_share->db.str, table_share->db.length); - db[table_share->db.length] = '\0'; - memcpy(table_name, table_share->table_name.str, - table_share->table_name.length); - table_name[table_share->table_name.length] = '\0'; - my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM, - ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name); - my_afree(db); - DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM); - } - } else { - DBUG_PRINT("info",("spider link_status = %ld", - share->link_statuses[spider->conn_link_idx[spider->search_link_idx]])); - bool search_link_idx_is_checked = FALSE; - for ( - roop_count = spider_conn_link_idx_next(share->link_statuses, - spider->conn_link_idx, -1, share->link_count, - SPIDER_LINK_STATUS_RECOVERY); - roop_count < (int) share->link_count; - roop_count = spider_conn_link_idx_next(share->link_statuses, - spider->conn_link_idx, roop_count, share->link_count, - SPIDER_LINK_STATUS_RECOVERY) - ) { - if (roop_count == spider->search_link_idx) - search_link_idx_is_checked = TRUE; - - conn= spider->conns[roop_count]; - - if (!conn) - { - DBUG_PRINT("info",("spider get conn %d", roop_count)); - if ( - !(conn = - spider_get_conn(share, roop_count, - spider->conn_keys[roop_count], trx, - spider, FALSE, TRUE, - &error_num)) - ) { - if ( - share->monitoring_kind[roop_count] && - spider->need_mons[roop_count] - ) { - error_num = spider_ping_table_mon_from_table( - trx, - trx->thd, - share, - roop_count, - (uint32) share->monitoring_sid[roop_count], - share->table_name, - share->table_name_length, - spider->conn_link_idx[roop_count], - NULL, - 0, - share->monitoring_kind[roop_count], - share->monitoring_limit[roop_count], - share->monitoring_flag[roop_count], - TRUE - ); - } - DBUG_PRINT("info",("spider get conn error")); - DBUG_RETURN(error_num); - } - } - conn->error_mode &= spider->error_mode; - } - if (!search_link_idx_is_checked) - { - TABLE *table = spider->get_table(); - TABLE_SHARE *table_share = table->s; - char *db = (char *) my_alloca( - table_share->db.length + 1 + table_share->table_name.length + 1); - if (!db) - { - my_error(HA_ERR_OUT_OF_MEM, MYF(0)); - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - char *table_name = db + table_share->db.length + 1; - memcpy(db, table_share->db.str, table_share->db.length); - db[table_share->db.length] = '\0'; - memcpy(table_name, table_share->table_name.str, - table_share->table_name.length); - table_name[table_share->table_name.length] = '\0'; - my_printf_error(ER_SPIDER_LINK_MON_JUST_NG_NUM, - ER_SPIDER_LINK_MON_JUST_NG_STR, MYF(0), db, table_name); - my_afree(db); - DBUG_RETURN(ER_SPIDER_LINK_MON_JUST_NG_NUM); - } + if ((error_num= spider_trx_update(thd, spider, trx))) + DBUG_RETURN(error_num); + if ((error_num= spider_trx_get_conn(spider, trx, true))) + DBUG_RETURN(error_num); } + else if ((error_num= spider_trx_get_conn(spider, trx, false))) + DBUG_RETURN(error_num); spider->set_first_link_idx(); DBUG_RETURN(spider_create_trx_ha(trx, spider, trx_ha)); } diff --git a/storage/spider/spd_udf.cc b/storage/spider/spd_udf.cc index 511f0d0083a..28908ffd5d0 100644 --- a/storage/spider/spd_udf.cc +++ b/storage/spider/spd_udf.cc @@ -22,8 +22,8 @@ extern "C" { long long spider_direct_sql( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { return spider_direct_sql_body(initid, args, is_null, error, FALSE); } @@ -45,8 +45,8 @@ void spider_direct_sql_deinit( long long spider_bg_direct_sql( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { return spider_direct_sql_bg_end(initid); } @@ -67,8 +67,8 @@ void spider_bg_direct_sql_deinit( void spider_bg_direct_sql_clear( UDF_INIT *initid, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { spider_direct_sql_bg_start(initid); } @@ -76,8 +76,8 @@ void spider_bg_direct_sql_clear( void spider_bg_direct_sql_add( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { spider_direct_sql_body(initid, args, is_null, error, TRUE); } @@ -85,8 +85,8 @@ void spider_bg_direct_sql_add( long long spider_ping_table( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { return spider_ping_table_body(initid, args, is_null, error); } @@ -108,8 +108,8 @@ void spider_ping_table_deinit( long long spider_flush_table_mon_cache( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { return spider_flush_table_mon_cache_body(); } @@ -130,8 +130,8 @@ void spider_flush_table_mon_cache_deinit( long long spider_copy_tables( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ) { return spider_copy_tables_body(initid, args, is_null, error); } diff --git a/storage/spider/spd_udf.h b/storage/spider/spd_udf.h index bb9f1ce252b..ccd3ae83b7d 100644 --- a/storage/spider/spd_udf.h +++ b/storage/spider/spd_udf.h @@ -16,8 +16,8 @@ long long spider_direct_sql_body( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error, + unsigned char *is_null, + unsigned char *error, my_bool bg ); @@ -43,8 +43,8 @@ long long spider_direct_sql_bg_end( long long spider_ping_table_body( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ); my_bool spider_ping_table_init_body( @@ -62,8 +62,8 @@ long long spider_flush_table_mon_cache_body(); long long spider_copy_tables_body( UDF_INIT *initid, UDF_ARGS *args, - char *is_null, - char *error + unsigned char *is_null, + unsigned char *error ); my_bool spider_copy_tables_init_body( diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 77c2211e21f..97613e9371e 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -83,6 +83,7 @@ size_t my_casedn_mb(CHARSET_INFO * cs, const char *src, size_t srclen, char *dst, size_t dstlen) { + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(dstlen >= srclen * cs->cset->casedn_multiply(cs)); DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_lower, 0); @@ -93,6 +94,7 @@ size_t my_caseup_mb(CHARSET_INFO * cs, const char *src, size_t srclen, char *dst, size_t dstlen) { + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(dstlen >= srclen * cs->cset->caseup_multiply(cs)); DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_upper, 1); diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 246bc9444b9..d86746a186f 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -270,6 +270,7 @@ size_t my_caseup_8bit(CHARSET_INFO * cs, const char *src, size_t srclen, { const char *end= src + srclen; register const uchar *map= cs->to_upper; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(srclen <= dstlen); for ( ; src != end ; src++) *dst++= (char) map[(uchar) *src]; @@ -282,6 +283,7 @@ size_t my_casedn_8bit(CHARSET_INFO * cs, const char *src, size_t srclen, { const char *end= src + srclen; register const uchar *map=cs->to_lower; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(srclen <= dstlen); for ( ; src != end ; src++) *dst++= (char) map[(uchar) *src]; diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c index 530728a7e03..90568eaff00 100644 --- a/strings/ctype-uca.c +++ b/strings/ctype-uca.c @@ -33743,9 +33743,10 @@ check_rules(MY_CHARSET_LOADER *loader, const MY_COLL_RULES *rules, const MY_UCA_WEIGHT_LEVEL *dst, const MY_UCA_WEIGHT_LEVEL *src) { - const MY_COLL_RULE *r, *rlast; - for (r= rules->rule, rlast= rules->rule + rules->nrules; r < rlast; r++) + size_t i; + for (i= 0; i < rules->nrules; i++) { + const MY_COLL_RULE *r= &rules->rule[i]; if (r->curr[0] > dst->maxchar) { my_snprintf(loader->error, sizeof(loader->error), @@ -34368,7 +34369,6 @@ init_weight_level(MY_CHARSET_LOADER *loader, CHARSET_INFO *cs, MY_COLL_RULES *rules, MY_UCA_WEIGHT_LEVEL *dst, const MY_UCA_WEIGHT_LEVEL *src) { - MY_COLL_RULE *r, *rlast; int ncontractions= 0; size_t i, npages= (src->maxchar + 1) / 256; @@ -34393,8 +34393,9 @@ init_weight_level(MY_CHARSET_LOADER *loader, CHARSET_INFO *cs, Mark pages that will be otherwriten as NULL. We'll allocate their own memory. */ - for (r= rules->rule, rlast= rules->rule + rules->nrules; r < rlast; r++) + for (i= 0; i < rules->nrules; i++) { + const MY_COLL_RULE *r= &rules->rule[i]; if (!r->curr[1]) /* If not a contraction */ { uint pagec= (r->curr[0] >> 8); @@ -34440,9 +34441,9 @@ init_weight_level(MY_CHARSET_LOADER *loader, CHARSET_INFO *cs, Now iterate through the rules, overwrite weights for the characters that appear in the rules, and put all contractions into contraction list. */ - for (r= rules->rule; r < rlast; r++) + for (i= 0; i < rules->nrules; i++) { - if (apply_one_rule(loader, rules, r, dst)) + if (apply_one_rule(loader, rules, &rules->rule[i], dst)) return TRUE; } @@ -39442,6 +39443,8 @@ LEX_CSTRING my_ci_get_collation_name_uca(CHARSET_INFO *cs, /* Add support for MySQL 8.0 utf8mb4_0900_.. collations + + The collation id's where collected from fprintf() in add_alias_for_collation() */ #define mysql_0900_collation_start 255 @@ -39449,74 +39452,78 @@ LEX_CSTRING my_ci_get_collation_name_uca(CHARSET_INFO *cs, struct mysql_0900_to_mariadb_1400_mapping { const char *mysql_col_name, *mariadb_col_name, *case_sensitivity; + uint collation_id; }; struct mysql_0900_to_mariadb_1400_mapping mysql_0900_mapping[]= { /* 255 Ascent insensitive, Case insensitive 'ai_ci' */ - {"", "", "ai_ci"}, - {"de_pb", "german2", "ai_ci"}, - {"is", "icelandic", "ai_ci"}, - {"lv", "latvian", "ai_ci"}, - {"ro", "romanian", "ai_ci"}, - {"sl", "slovenian", "ai_ci"}, - {"pl", "polish", "ai_ci"}, - {"et", "estonian", "ai_ci"}, - {"es", "spanish", "ai_ci"}, - {"sv", "swedish", "ai_ci"}, - {"tr", "turkish", "ai_ci"}, - {"cs", "czech", "ai_ci"}, - {"da", "danish", "ai_ci"}, - {"lt", "lithuanian", "ai_ci"}, - {"sk", "slovak", "ai_ci"}, - {"es_trad", "spanish2", "ai_ci"}, - {"la", "roman", "ai_ci"}, - {"fa", NullS, "ai_ci"}, // Disabled in MySQL - {"eo", "esperanto", "ai_ci"}, - {"hu", "hungarian", "ai_ci"}, - {"hr", "croatian", "ai_ci"}, - {"si", NullS, "ai_ci"}, // Disabled in MySQL - {"vi", "vietnamese", "ai_ci"}, + {"", "", "ai_ci", 2308}, + {"de_pb", "german2", "ai_ci", 2468}, + {"is", "icelandic", "ai_ci", 2316}, + {"lv", "latvian", "ai_ci", 2324}, + {"ro", "romanian", "ai_ci", 2332}, + {"sl", "slovenian", "ai_ci", 2340}, + {"pl", "polish", "ai_ci", 2348}, + {"et", "estonian", "ai_ci", 2356}, + {"es", "spanish", "ai_ci", 2364}, + {"sv", "swedish", "ai_ci", 2372}, + {"tr", "turkish", "ai_ci", 2380}, + {"cs", "czech", "ai_ci", 2388}, + {"da", "danish", "ai_ci", 2396}, + {"lt", "lithuanian", "ai_ci", 2404}, + {"sk", "slovak", "ai_ci", 2412}, + {"es_trad", "spanish2", "ai_ci", 2420}, + {"la", "roman", "ai_ci", 2428}, + {"fa", NullS, "ai_ci", 0}, // Disabled in MySQL + {"eo", "esperanto", "ai_ci", 2444}, + {"hu", "hungarian", "ai_ci", 2452}, + {"hr", "croatian", "ai_ci", 2500}, + {"si", NullS, "ai_ci", 0}, // Disabled in MySQL + {"vi", "vietnamese", "ai_ci", 2492}, /* 278 Ascent sensitive, Case sensitive 'as_cs' */ - {"","", "as_cs"}, - {"de_pb", "german2", "as_cs"}, - {"is", "icelandic", "as_cs"}, - {"lv", "latvian", "as_cs"}, - {"ro", "romanian", "as_cs"}, - {"sl", "slovenian", "as_cs"}, - {"pl", "polish", "as_cs"}, - {"et", "estonian", "as_cs"}, - {"es", "spanish", "as_cs"}, - {"sv", "swedish", "as_cs"}, - {"tr", "turkish", "as_cs"}, - {"cs", "czech", "as_cs"}, - {"da", "danish", "as_cs"}, - {"lt", "lithuanian", "as_cs"}, - {"sk", "slovak", "as_cs"}, - {"es_trad", "spanish2", "as_cs"}, - {"la", "roman", "as_cs"}, - {"fa", NullS, "as_cs"}, // Disabled in MySQL - {"eo", "esperanto", "as_cs"}, - {"hu", "hungarian", "as_cs"}, - {"hr", "croatian", "as_cs"}, - {"si", NullS, "as_cs"}, // Disabled in MySQL - {"vi", "vietnamese", "as_cs"}, + {"","", "as_cs", 2311}, + {"de_pb", "german2", "as_cs", 2471}, + {"is", "icelandic", "as_cs", 2319}, + {"lv", "latvian", "as_cs", 2327}, + {"ro", "romanian", "as_cs", 2335}, + {"sl", "slovenian", "as_cs", 2343}, + {"pl", "polish", "as_cs", 2351}, + {"et", "estonian", "as_cs", 2359}, + {"es", "spanish", "as_cs", 2367}, + {"sv", "swedish", "as_cs", 2375}, + {"tr", "turkish", "as_cs", 2383}, + {"cs", "czech", "as_cs", 2391}, + {"da", "danish", "as_cs", 2399}, + {"lt", "lithuanian", "as_cs", 2407}, + {"sk", "slovak", "as_cs", 2415}, + {"es_trad", "spanish2", "as_cs", 2423}, + {"la", "roman", "as_cs", 2431}, + {"fa", NullS, "as_cs", 0}, // Disabled in MySQL + {"eo", "esperanto", "as_cs", 2447}, + {"hu", "hungarian", "as_cs", 2455}, + {"hr", "croatian", "as_cs", 2503}, + {"si", NullS, "as_cs", 0}, // Disabled in MySQL + {"vi", "vietnamese", "as_cs", 2495}, - {"", NullS, "as_cs"}, // Missing - {"", NullS, "as_cs"}, // Missing - {"_ja_0900_as_cs", NullS, "as_cs"}, // Not supported - {"_ja_0900_as_cs_ks", NullS, "as_cs"}, // Not supported + {"", NullS, "as_cs", 0}, // Missing + {"", NullS, "as_cs", 0}, // Missing + {"_ja_0900_as_cs", NullS, "as_cs", 0}, // Not supported + {"_ja_0900_as_cs_ks", NullS, "as_cs", 0}, // Not supported /* 305 Ascent-sensitive, Case insensitive 'as_ci' */ - {"","", "as_ci"}, - {"ru", NullS, "ai_ci"}, // Not supported - {"ru", NullS, "as_cs"}, // Not supported - {"zh", NullS, "as_cs"}, // Not supported - {NullS, NullS, ""} + {"","", "as_ci", 2310}, + {"ru", NullS, "ai_ci", 0}, // Not supported + {"ru", NullS, "as_cs", 0}, // Not supported + {"zh", NullS, "as_cs", 0}, // Not supported + {NullS, NullS, "", 0} }; +static LEX_CSTRING mysql_utf8_bin= { STRING_WITH_LEN("utf8mb4_0900_bin") }; +static LEX_CSTRING mariadb_utf8_bin= { STRING_WITH_LEN("utf8mb4_bin") }; + /* Map mysql character sets to MariaDB using the same definition but with with the MySQL collation name and id. @@ -39526,8 +39533,6 @@ my_bool mysql_utf8mb4_0900_collation_definitions_add() { uint id= mysql_0900_collation_start; struct mysql_0900_to_mariadb_1400_mapping *map; - LEX_CSTRING mysql_utf8_bin= { STRING_WITH_LEN("utf8mb4_0900_bin") }; - LEX_CSTRING mariadb_utf8_bin= { STRING_WITH_LEN("utf8mb4_bin") }; for (map= mysql_0900_mapping; map->mysql_col_name ; map++, id++) { @@ -39555,12 +39560,13 @@ my_bool mysql_utf8mb4_0900_collation_definitions_add() alias_name.str= alias; alias_name.length= ali_length; - if (add_alias_for_collation(&org_name, &alias_name, id)) + if (add_alias_for_collation(&org_name, map->collation_id, &alias_name, + id)) return 1; } } - if (add_alias_for_collation(&mariadb_utf8_bin, &mysql_utf8_bin, 309)) + if (add_alias_for_collation(&mariadb_utf8_bin, 46, &mysql_utf8_bin, 309)) return 1; return 0; } diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 12aea194df4..65c610f5c45 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1342,6 +1342,7 @@ my_caseup_utf16(CHARSET_INFO *cs, const char *src, size_t srclen, const char *srcend= src + srclen; char *dstend= dst + dstlen; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -1400,6 +1401,7 @@ my_casedn_utf16(CHARSET_INFO *cs, const char *src, size_t srclen, const char *srcend= src + srclen; char *dstend= dst + dstlen; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -2177,6 +2179,7 @@ my_caseup_utf32(CHARSET_INFO *cs, const char *src, size_t srclen, const char *srcend= src + srclen; char *dstend= dst + dstlen; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -2234,6 +2237,7 @@ my_casedn_utf32(CHARSET_INFO *cs, const char *src, size_t srclen, const char *srcend= src + srclen; char *dstend= dst + dstlen; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(srclen <= dstlen); while ((res= my_utf32_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) @@ -3016,6 +3020,7 @@ static size_t my_caseup_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen, const char *srcend= src + srclen; char *dstend= dst + dstlen; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(srclen <= dstlen); while ((src < srcend) && @@ -3068,6 +3073,7 @@ static size_t my_casedn_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen, char *dstend= dst + dstlen; MY_CASEFOLD_INFO *uni_plane= cs->casefold; DBUG_ASSERT(srclen <= dstlen); + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ while ((src < srcend) && (res= my_ucs2_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 7793a25b408..7d72495e5ef 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -67219,6 +67219,7 @@ size_t my_casedn_ujis(CHARSET_INFO * cs, const char *src, size_t srclen, char *dst, size_t dstlen) { + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(dstlen >= srclen * cs->cset->casedn_multiply(cs)); DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); return my_casefold_ujis(cs, src, srclen, dst, dstlen, cs->to_lower, 0); @@ -67232,6 +67233,7 @@ size_t my_caseup_ujis(CHARSET_INFO * cs, const char *src, size_t srclen, char *dst, size_t dstlen) { + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(dstlen >= srclen * cs->cset->caseup_multiply(cs)); DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); return my_casefold_ujis(cs, src, srclen, dst, dstlen, cs->to_upper, 1); diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 4b95136c471..0e1a756d296 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -510,6 +510,7 @@ static size_t my_caseup_utf8mb3(CHARSET_INFO *cs, const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); while ((src < srcend) && @@ -598,6 +599,7 @@ static size_t my_casedn_utf8mb3(CHARSET_INFO *cs, const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); while ((src < srcend) && @@ -2867,6 +2869,7 @@ my_caseup_utf8mb4(CHARSET_INFO *cs, const char *src, size_t srclen, const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); while ((src < srcend) && @@ -2938,6 +2941,7 @@ my_casedn_utf8mb4(CHARSET_INFO *cs, const char *srcend= src + srclen; char *dstend= dst + dstlen, *dst0= dst; MY_CASEFOLD_INFO *uni_plane= cs->casefold; + DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */ DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); while ((src < srcend) && diff --git a/strings/ctype.c b/strings/ctype.c index a0b51c20b10..81b757310f8 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -846,6 +846,8 @@ my_string_repertoire_8bit(CHARSET_INFO *cs, const char *str, size_t length) const char *strend; if ((cs->state & MY_CS_NONASCII) && length > 0) return MY_REPERTOIRE_UNICODE30; + if (!str) // Avoid UBSAN nullptr-with-offset + return MY_REPERTOIRE_ASCII; for (strend= str + length; str < strend; str++) { if (((uchar) *str) > 0x7F) diff --git a/strings/strcoll.inl b/strings/strcoll.inl index 2481b1e4230..567d827d5f4 100644 --- a/strings/strcoll.inl +++ b/strings/strcoll.inl @@ -264,6 +264,8 @@ MY_FUNCTION_NAME(strnncoll)(CHARSET_INFO *cs __attribute__((unused)), 0 >0 "a" is a prefix of "b", so "a" is smaller. >0 0 "b" is a prefix of "a", check b_is_prefix. >0 >0 Two weights were scanned, check weight difference. + + Note: weights can be zero and positive (never negative). */ if (!a_wlen) return b_wlen ? -1 : 0; diff --git a/win/packaging/heidisql.cmake b/win/packaging/heidisql.cmake index f745eeb060b..157e5517594 100644 --- a/win/packaging/heidisql.cmake +++ b/win/packaging/heidisql.cmake @@ -1,6 +1,6 @@ -SET(HEIDISQL_BASE_NAME "HeidiSQL_12.8_32_Portable") +SET(HEIDISQL_BASE_NAME "HeidiSQL_12.10_32_Portable") SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip") -SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}") +SET(HEIDISQL_URL "https://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}") SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME}) IF(NOT EXISTS ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP})