diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh index a0fddfb2413..8948cf2158c 100755 --- a/BUILD/SETUP.sh +++ b/BUILD/SETUP.sh @@ -157,8 +157,8 @@ fi # Set flags for various build configurations. # Used in -valgrind builds # Override -DFORCE_INIT_OF_VARS from debug_cflags. It enables the macro -# LINT_INIT(), which is only useful for silencing spurious warnings -# of static analysis tools. We want LINT_INIT() to be a no-op in Valgrind. +# UNINIT_VAR(), which is only useful for silencing spurious warnings +# of static analysis tools. We want UNINIT_VAR() to be a no-op in Valgrind. valgrind_flags="-DHAVE_valgrind -USAFEMALLOC" valgrind_flags="$valgrind_flags -UFORCE_INIT_OF_VARS -Wno-uninitialized" valgrind_flags="$valgrind_flags -DMYSQL_SERVER_SUFFIX=-valgrind-max" diff --git a/client/mysql.cc b/client/mysql.cc index b299ab96b1d..92324c6a073 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -3040,9 +3040,7 @@ static int com_server_help(String *buffer __attribute__((unused)), init_pager(); char last_char= 0; - int num_name= 0, num_cat= 0; - LINT_INIT(num_name); - LINT_INIT(num_cat); + int UNINIT_VAR(num_name), UNINIT_VAR(num_cat); if (num_fields == 2) { @@ -3179,7 +3177,7 @@ com_go(String *buffer,char *line __attribute__((unused))) } /* Remove garbage for nicer messages */ - LINT_INIT(buff[0]); + LINT_INIT_STRUCT(buff[0]); remove_cntrl(*buffer); if (buffer->is_empty()) @@ -4698,8 +4696,7 @@ com_status(String *buffer __attribute__((unused)), const char *status_str; char buff[40]; ulonglong id; - MYSQL_RES *result; - LINT_INIT(result); + MYSQL_RES *UNINIT_VAR(result); if (mysql_real_query_for_lazy( C_STRING_WITH_LEN("select DATABASE(), USER() limit 1"))) @@ -5258,8 +5255,7 @@ static void init_username() my_free(full_username); my_free(part_username); - MYSQL_RES *result; - LINT_INIT(result); + MYSQL_RES *UNINIT_VAR(result); if (!mysql_query(&mysql,"select USER()") && (result=mysql_use_result(&mysql))) { diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 5118b024078..5a54c67684b 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -2617,12 +2617,11 @@ void var_query_set(VAR *var, const char *query, const char** query_end) { char *end = (char*)((query_end && *query_end) ? *query_end : query + strlen(query)); - MYSQL_RES *res; + MYSQL_RES *UNINIT_VAR(res); MYSQL_ROW row; MYSQL* mysql = cur_con->mysql; DYNAMIC_STRING ds_query; DBUG_ENTER("var_query_set"); - LINT_INIT(res); if (!mysql) { @@ -2801,7 +2800,7 @@ void var_set_query_get_value(struct st_command *command, VAR *var) { long row_no; int col_no= -1; - MYSQL_RES* res; + MYSQL_RES* UNINIT_VAR(res); MYSQL* mysql= cur_con->mysql; static DYNAMIC_STRING ds_query; @@ -2814,7 +2813,6 @@ void var_set_query_get_value(struct st_command *command, VAR *var) }; DBUG_ENTER("var_set_query_get_value"); - LINT_INIT(res); if (!mysql) { diff --git a/client/readline.cc b/client/readline.cc index b6643b86356..23b1f8d7ac7 100644 --- a/client/readline.cc +++ b/client/readline.cc @@ -57,8 +57,7 @@ LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file) char *batch_readline(LINE_BUFFER *line_buff, bool binary_mode) { char *pos; - ulong out_length; - LINT_INIT(out_length); + ulong UNINIT_VAR(out_length); if (!(pos=intern_read_line(line_buff, &out_length))) return 0; diff --git a/include/lf.h b/include/lf.h index 88024bc4d67..19bdafce647 100644 --- a/include/lf.h +++ b/include/lf.h @@ -117,7 +117,12 @@ uint lf_alloc_pool_count(LF_ALLOCATOR *allocator); #define lf_alloc_free(PINS, PTR) lf_pinbox_free((PINS), (PTR)) #define lf_alloc_get_pins(A) lf_pinbox_get_pins(&(A)->pinbox) #define lf_alloc_put_pins(PINS) lf_pinbox_put_pins(PINS) -#define lf_alloc_direct_free(ALLOC, ADDR) my_free((ADDR)) +#define lf_alloc_direct_free(ALLOC, ADDR) \ + do { \ + if ((ALLOC)->destructor) \ + (ALLOC)->destructor((uchar*) ADDR); \ + my_free(ADDR); \ + } while(0) void *lf_alloc_new(LF_PINS *pins); diff --git a/include/m_ctype.h b/include/m_ctype.h index f08efb461b7..8300619d5c7 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -382,6 +382,16 @@ typedef struct } MY_STRCOPY_STATUS; +/* + A structure to return the statistics of a Unicode string conversion. +*/ +typedef struct +{ + MY_STRCOPY_STATUS m_native_copy_status; + const char *m_cannot_convert_error_pos; +} MY_STRCONV_STATUS; + + /* See strings/CHARSET_INFO.txt about information on this structure */ struct my_charset_handler_st { @@ -444,22 +454,64 @@ struct my_charset_handler_st size_t (*scan)(CHARSET_INFO *, const char *b, const char *e, int sq); - /* Copying routines */ + /* String copying routines and helpers for them */ /* - copy_abort() - copy a string, abort if a bad byte sequence was found. + charlen() - calculate length of the left-most character in bytes. + @param cs Character set + @param str The beginning of the string + @param end The end of the string + + @return MY_CS_ILSEQ if a bad byte sequence was found. + @return MY_CS_TOOSMALLN(x) if the string ended unexpectedly. + @return a positive number in the range 1..mbmaxlen, + if a valid character was found. + */ + int (*charlen)(CHARSET_INFO *cs, const uchar *str, const uchar *end); + /* + well_formed_char_length() - returns character length of a string. + + @param cs Character set + @param str The beginning of the string + @param end The end of the string + @param nchars Not more than "nchars" left-most characters are checked. + @param status[OUT] Additional statistics is returned here. + "status" can be uninitialized before the call, + and it is fully initialized after the call. + + status->m_source_end_pos is set to the position where reading stopped. + + If a bad byte sequence is found, the function returns immediately and + status->m_well_formed_error_pos is set to the position where a bad byte + sequence was found. + + status->m_well_formed_error_pos is set to NULL if no bad bytes were found. + If status->m_well_formed_error_pos is NULL after the call, that means: + - either the function reached the end of the string, + - or all "nchars" characters were read. + The caller can check status->m_source_end_pos to detect which of these two + happened. + */ + size_t (*well_formed_char_length)(CHARSET_INFO *cs, + const char *str, const char *end, + size_t nchars, + MY_STRCOPY_STATUS *status); + + /* + copy_fix() - copy a string, replace bad bytes to '?'. Not more than "nchars" characters are copied. status->m_source_end_pos is set to a position in the range - between "src" and "src + src_length". + between "src" and "src + src_length", where reading stopped. status->m_well_formed_error_pos is set to NULL if the string in the range "src" and "status->m_source_end_pos" was well formed, - or is set to "src + src_length" otherwise. + or is set to a position between "src" and "src + src_length" where + the leftmost bad byte sequence was found. */ - size_t (*copy_abort)(CHARSET_INFO *, - char *dst, size_t dst_length, - const char *src, size_t src_length, - size_t nchars, MY_STRCOPY_STATUS *status); + size_t (*copy_fix)(CHARSET_INFO *, + char *dst, size_t dst_length, + const char *src, size_t src_length, + size_t nchars, MY_STRCOPY_STATUS *status); }; extern MY_CHARSET_HANDLER my_charset_8bit_handler; @@ -596,10 +648,10 @@ size_t my_copy_8bit(CHARSET_INFO *, char *dst, size_t dst_length, const char *src, size_t src_length, size_t nchars, MY_STRCOPY_STATUS *); -size_t my_copy_abort_mb(CHARSET_INFO *cs, - char *dst, size_t dst_length, - const char *src, size_t src_length, - size_t nchars, MY_STRCOPY_STATUS *); +size_t my_copy_fix_mb(CHARSET_INFO *cs, + char *dst, size_t dst_length, + const char *src, size_t src_length, + size_t nchars, MY_STRCOPY_STATUS *); /* Functions for 8bit */ extern size_t my_caseup_str_8bit(CHARSET_INFO *, char *); @@ -691,6 +743,11 @@ size_t my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e); size_t my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, size_t pos); size_t my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e, size_t pos, int *error); +size_t my_well_formed_char_length_8bit(CHARSET_INFO *cs, + const char *b, const char *e, + size_t nchars, + MY_STRCOPY_STATUS *status); +int my_charlen_8bit(CHARSET_INFO *, const uchar *str, const uchar *end); uint my_mbcharlen_8bit(CHARSET_INFO *, uint c); @@ -805,10 +862,42 @@ const MY_CONTRACTIONS *my_charset_get_contractions(CHARSET_INFO *cs, extern size_t my_vsnprintf_ex(CHARSET_INFO *cs, char *to, size_t n, const char* fmt, va_list ap); +/* + Convert a string between two character sets. + Bad byte sequences as well as characters that cannot be + encoded in the destination character set are replaced to '?'. +*/ uint32 my_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, const char *from, uint32 from_length, CHARSET_INFO *from_cs, uint *errors); +/* + Convert a string between two character sets. + Bad byte sequences as well as characters that cannot be + encoded in the destination character set are replaced to '?'. + Not more than "nchars" characters are copied. + Conversion statistics is returnd in "status" and is set as follows: + - status->m_native_copy_status.m_source_end_pos - to the position + between (src) and (src+src_length), where the function stopped reading + the source string. + - status->m_native_copy_status.m_well_formed_error_pos - to the position + between (src) and (src+src_length), where the first badly formed byte + sequence was found, or to NULL if the string was well formed in the + given range. + - status->m_cannot_convert_error_pos - to the position + between (src) and (src+src_length), where the first character that + cannot be represented in the destination character set was found, + or to NULL if all characters in the given range were successfully + converted. + + "src" is allowed to be a NULL pointer. In this case "src_length" must + be equal to 0. All "status" members are initialized to NULL, and 0 is + returned. +*/ +size_t my_convert_fix(CHARSET_INFO *dstcs, char *dst, size_t dst_length, + CHARSET_INFO *srccs, const char *src, size_t src_length, + size_t nchars, MY_STRCONV_STATUS *status); + #define _MY_U 01 /* Upper case */ #define _MY_L 02 /* Lower case */ #define _MY_NMR 04 /* Numeral (digit) */ diff --git a/include/my_global.h b/include/my_global.h index 4a1cc8c5b75..e026f8a66a9 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -457,19 +457,6 @@ extern "C" int madvise(void *addr, size_t len, int behav); #define STDERR_FILENO 2 #endif -/* - Deprecated workaround for false-positive uninitialized variables - warnings. Those should be silenced using tool-specific heuristics. - - Enabled by default for g++ due to the bug referenced below. -*/ -#if defined(_lint) || defined(FORCE_INIT_OF_VARS) || \ - (defined(__GNUC__) && defined(__cplusplus)) -#define LINT_INIT(var) var= 0 -#else -#define LINT_INIT(var) -#endif - #ifndef SO_EXT #ifdef _WIN32 #define SO_EXT ".dll" diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index a878b2fae44..caf0309710e 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -859,12 +859,11 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild) MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql) { - MYSQL_DATA *fields; + MYSQL_DATA *UNINIT_VAR(fields); uint field_count; uchar *pos; DBUG_ENTER("mysql_list_processes"); - LINT_INIT(fields); if (simple_command(mysql,COM_PROCESS_INFO,0,0,0)) DBUG_RETURN(0); free_old_query(mysql); diff --git a/mysql-test/r/ctype_big5.result b/mysql-test/r/ctype_big5.result index 175bbf0f09f..d18c2a00c6f 100644 --- a/mysql-test/r/ctype_big5.result +++ b/mysql-test/r/ctype_big5.result @@ -597,7 +597,7 @@ Warning 1366 Incorrect string value: '\x80\' for column 'a' at row 61 Warning 1366 Incorrect string value: '\x80]' for column 'a' at row 62 Warning 1366 Incorrect string value: '\x80^' for column 'a' at row 63 Warning 1366 Incorrect string value: '\x80_' for column 'a' at row 64 -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; COUNT(*) 13973 SELECT code, hex(upper(a)), hex(lower(a)),a, upper(a), lower(a) FROM t1 WHERE hex(a)<>hex(upper(a)) OR hex(a)<>hex(lower(a)); diff --git a/mysql-test/r/ctype_cp932_binlog_stm.result b/mysql-test/r/ctype_cp932_binlog_stm.result index 0e6ae25a395..fd920223091 100644 --- a/mysql-test/r/ctype_cp932_binlog_stm.result +++ b/mysql-test/r/ctype_cp932_binlog_stm.result @@ -165,7 +165,7 @@ Warning 1366 Incorrect string value: '\x80_' for column 'a' at row 64 SELECT COUNT(*) FROM t1; COUNT(*) 14623 -SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=1; +SELECT COUNT(*) FROM t1 WHERE a<>'?' AND OCTET_LENGTH(a)=1; COUNT(*) 63 SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; diff --git a/mysql-test/r/ctype_eucjpms.result b/mysql-test/r/ctype_eucjpms.result index a1232c115e9..49d86c18a3d 100644 --- a/mysql-test/r/ctype_eucjpms.result +++ b/mysql-test/r/ctype_eucjpms.result @@ -10101,6 +10101,9 @@ COUNT(*) 56959 SELECT COUNT(*) FROM t1 WHERE a<>''; COUNT(*) +56959 +SELECT COUNT(*) FROM t1 WHERE a<>'' AND a<>'?'; +COUNT(*) 17735 SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; COUNT(*) @@ -33632,7 +33635,7 @@ CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET eucjpms); INSERT INTO t1 VALUES (0x8EA0); SELECT HEX(a), CHAR_LENGTH(a) FROM t1; HEX(a) CHAR_LENGTH(a) - 0 +3F3F 2 DROP TABLE t1; SELECT _eucjpms 0x8EA0; ERROR HY000: Invalid eucjpms character string: '8EA0' diff --git a/mysql-test/r/ctype_euckr.result b/mysql-test/r/ctype_euckr.result index dcb68cfe60b..0ee63bb76b2 100644 --- a/mysql-test/r/ctype_euckr.result +++ b/mysql-test/r/ctype_euckr.result @@ -407,12 +407,12 @@ Warnings: Warning 1366 Incorrect string value: '\xA1\xFF' for column 's1' at row 1 select hex(s1), hex(convert(s1 using utf8)) from t1 order by binary s1; hex(s1) hex(convert(s1 using utf8)) - - - - - - +3F3F 3F3F +3F3F 3F3F +3F40 3F40 +3F5B 3F5B +3F60 3F60 +3F7B 3F7B A141 ECA2A5 A15A ECA381 A161 ECA382 @@ -445,7 +445,7 @@ FROM t1 t11, t1 t12 WHERE t11.a >= 0x81 AND t11.a <= 0xFE AND t12.a >= 0x41 AND t12.a <= 0xFE ORDER BY t11.a, t12.a; -SELECT s as bad_code FROM t2 WHERE a='' ORDER BY s; +SELECT s as bad_code FROM t2 WHERE a='?' ORDER BY s; bad_code 815B 815C @@ -1959,7 +1959,7 @@ FE7D FE7E FE7F FE80 -DELETE FROM t2 WHERE a=''; +DELETE FROM t2 WHERE a='?'; ALTER TABLE t2 ADD u VARCHAR(1) CHARACTER SET utf8, ADD a2 VARCHAR(1) CHARACTER SET euckr; UPDATE t2 SET u=a, a2=u; SELECT s as unassigned_code FROM t2 WHERE u='?'; @@ -24492,7 +24492,7 @@ Warning 1366 Incorrect string value: '\x80\' for column 'a' at row 61 Warning 1366 Incorrect string value: '\x80]' for column 'a' at row 62 Warning 1366 Incorrect string value: '\x80^' for column 'a' at row 63 Warning 1366 Incorrect string value: '\x80_' for column 'a' at row 64 -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; COUNT(*) 22428 SELECT code, hex(upper(a)), hex(lower(a)),a, upper(a), lower(a) FROM t1 WHERE hex(a)<>hex(upper(a)) OR hex(a)<>hex(lower(a)); diff --git a/mysql-test/r/ctype_gb2312.result b/mysql-test/r/ctype_gb2312.result index 5db6e2d3035..ceecb7786b0 100644 --- a/mysql-test/r/ctype_gb2312.result +++ b/mysql-test/r/ctype_gb2312.result @@ -553,7 +553,7 @@ Warning 1366 Incorrect string value: '\x80\' for column 'a' at row 61 Warning 1366 Incorrect string value: '\x80]' for column 'a' at row 62 Warning 1366 Incorrect string value: '\x80^' for column 'a' at row 63 Warning 1366 Incorrect string value: '\x80_' for column 'a' at row 64 -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; COUNT(*) 8178 SELECT code, hex(upper(a)), hex(lower(a)),a, upper(a), lower(a) FROM t1 WHERE hex(a)<>hex(upper(a)) OR hex(a)<>hex(lower(a)); diff --git a/mysql-test/r/ctype_gbk.result b/mysql-test/r/ctype_gbk.result index c5d997b0213..55561cfa289 100644 --- a/mysql-test/r/ctype_gbk.result +++ b/mysql-test/r/ctype_gbk.result @@ -573,7 +573,7 @@ Warning 1366 Incorrect string value: '\x80\' for column 'a' at row 61 Warning 1366 Incorrect string value: '\x80]' for column 'a' at row 62 Warning 1366 Incorrect string value: '\x80^' for column 'a' at row 63 Warning 1366 Incorrect string value: '\x80_' for column 'a' at row 64 -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; COUNT(*) 23940 SELECT code, hex(upper(a)), hex(lower(a)),a, upper(a), lower(a) FROM t1 WHERE hex(a)<>hex(upper(a)) OR hex(a)<>hex(lower(a)); @@ -4946,3 +4946,814 @@ DROP TABLE t1; # # End of 10.0 tests # +# +# Start of 10.1 tests +# +# +# MDEV-6566 Different INSERT behaviour on bad bytes with and without character set conversion +# +CREATE TABLE t1 ( +id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +b VARBINARY(16), +type SET('ascii','bad','head','tail','mb2','unassigned') +); +INSERT INTO t1 (b, type) VALUES (0x40, 'ascii,tail'); +INSERT INTO t1 (b, type) VALUES (0x80, 'tail'); +INSERT INTO t1 (b, type) VALUES (0x81, 'head,tail'); +INSERT INTO t1 (b, type) VALUES (0xFF, 'bad'); +INSERT INTO t1 (b, type) VALUES (0xA140, 'mb2,unassigned'); +INSERT INTO t1 (b, type) VALUES (0xA1A3, 'mb2'); +INSERT INTO t1 (b, type) VALUES (0xFE40, 'mb2'); +CREATE TABLE t2 AS SELECT +CONCAT(t1.b,t2.b) AS b, +t1.type AS type1, +t2.type AS type2, +CONCAT('[',t1.type,'][',t2.type,']') AS comment +FROM t1, t1 t2; +CREATE TABLE t3 +( +b VARBINARY(16), +c VARCHAR(16) CHARACTER SET gbk, +comment VARCHAR(128) +); +# +# A combination of two valid characters, should give no warnings +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE +(FIND_IN_SET('ascii',type1) OR FIND_IN_SET('mb2',type1)) AND +(FIND_IN_SET('ascii',type2) OR FIND_IN_SET('mb2',type2)) +ORDER BY b; +SELECT COUNT(*) FROM t3; +COUNT(*) +16 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +4040 [ascii,tail][ascii,tail] +40A140 [ascii,tail][mb2,unassigned] +40A1A3 [ascii,tail][mb2] +40FE40 [ascii,tail][mb2] +A14040 [mb2,unassigned][ascii,tail] +A140A140 [mb2,unassigned][mb2,unassigned] +A140A1A3 [mb2,unassigned][mb2] +A140FE40 [mb2,unassigned][mb2] +A1A340 [mb2][ascii,tail] +A1A3A140 [mb2][mb2,unassigned] +A1A3A1A3 [mb2][mb2] +A1A3FE40 [mb2][mb2] +FE4040 [mb2][ascii,tail] +FE40A140 [mb2][mb2,unassigned] +FE40A1A3 [mb2][mb2] +FE40FE40 [mb2][mb2] +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that start with a tail or a bad byte, +# or end with a bad byte, all should be fixed. +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE type1='tail' OR type1='bad' OR type2='bad' +ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 1 +Warning 1366 Incorrect string value: '\x80@' for column 'c' at row 2 +Warning 1366 Incorrect string value: '\x80\x80' for column 'c' at row 3 +Warning 1366 Incorrect string value: '\x80\x81' for column 'c' at row 4 +Warning 1366 Incorrect string value: '\x80\xA1@' for column 'c' at row 5 +Warning 1366 Incorrect string value: '\x80\xA1\xA3' for column 'c' at row 6 +Warning 1366 Incorrect string value: '\x80\xFE@' for column 'c' at row 7 +Warning 1366 Incorrect string value: '\x80\xFF' for column 'c' at row 8 +Warning 1366 Incorrect string value: '\x81\xFF' for column 'c' at row 9 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 10 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 11 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 12 +Warning 1366 Incorrect string value: '\xFF@' for column 'c' at row 13 +Warning 1366 Incorrect string value: '\xFF\x80' for column 'c' at row 14 +Warning 1366 Incorrect string value: '\xFF\x81' for column 'c' at row 15 +Warning 1366 Incorrect string value: '\xFF\xA1@' for column 'c' at row 16 +Warning 1366 Incorrect string value: '\xFF\xA1\xA3' for column 'c' at row 17 +Warning 1366 Incorrect string value: '\xFF\xFE@' for column 'c' at row 18 +Warning 1366 Incorrect string value: '\xFF\xFF' for column 'c' at row 19 +SELECT COUNT(*) FROM t3; +COUNT(*) +19 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +403F 40FF [ascii,tail][bad] +3F40 8040 [tail][ascii,tail] +3F3F 8080 [tail][tail] +3F3F 8081 [tail][head,tail] +3FA140 80A140 [tail][mb2,unassigned] +3FA1A3 80A1A3 [tail][mb2] +3FFE40 80FE40 [tail][mb2] +3F3F 80FF [tail][bad] +3F3F 81FF [head,tail][bad] +A1403F A140FF [mb2,unassigned][bad] +A1A33F A1A3FF [mb2][bad] +FE403F FE40FF [mb2][bad] +3F40 FF40 [bad][ascii,tail] +3F3F FF80 [bad][tail] +3F3F FF81 [bad][head,tail] +3FA140 FFA140 [bad][mb2,unassigned] +3FA1A3 FFA1A3 [bad][mb2] +3FFE40 FFFE40 [bad][mb2] +3F3F FFFF [bad][bad] +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that start with an ASCII or an MB2 character, +# followed by a non-ASCII tail, all should be fixed. +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('mb2',type1) OR FIND_IN_SET('ascii',type1)) +AND (FIND_IN_SET('tail',type2) AND NOT FIND_IN_SET('ascii',type2)) +ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 1 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 2 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 3 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 4 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 5 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 6 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 7 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 8 +SELECT COUNT(*) FROM t3; +COUNT(*) +8 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +403F 4080 [ascii,tail][tail] +403F 4081 [ascii,tail][head,tail] +A1403F A14080 [mb2,unassigned][tail] +A1403F A14081 [mb2,unassigned][head,tail] +A1A33F A1A380 [mb2][tail] +A1A33F A1A381 [mb2][head,tail] +FE403F FE4080 [mb2][tail] +FE403F FE4081 [mb2][head,tail] +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Other sequences +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\xA3' for column 'c' at row 5 +SELECT COUNT(*) FROM t3; +COUNT(*) +6 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +8140 [head,tail][ascii,tail] +8180 [head,tail][tail] +8181 [head,tail][head,tail] +81A140 [head,tail][mb2,unassigned] +81FE40 [head,tail][mb2] +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +81A13F 81A1A3 [head,tail][mb2] +DELETE FROM t3; +DROP TABLE t3; +DROP TABLE t2; +CREATE TABLE t2 AS SELECT +CONCAT(t1.b,t2.b,t3.b) AS b, +t1.type AS type1, +t2.type AS type2, +t3.type AS type3, +CONCAT('[',t1.type,'][',t2.type,'][',t3.type,']') AS comment +FROM t1, t1 t2,t1 t3; +SELECT COUNT(*) FROM t2; +COUNT(*) +343 +CREATE TABLE t3 +( +b VARBINARY(16), +c VARCHAR(16) CHARACTER SET gbk, +comment VARCHAR(128) +); +# +# A combination of three valid characters, should give no warnings +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE +(FIND_IN_SET('ascii',type1) OR FIND_IN_SET('mb2',type1)) AND +(FIND_IN_SET('ascii',type2) OR FIND_IN_SET('mb2',type2)) AND +(FIND_IN_SET('ascii',type3) OR FIND_IN_SET('mb2',type3)) +ORDER BY b; +SELECT COUNT(*) FROM t3; +COUNT(*) +64 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +404040 [ascii,tail][ascii,tail][ascii,tail] +4040A140 [ascii,tail][ascii,tail][mb2,unassigned] +4040A1A3 [ascii,tail][ascii,tail][mb2] +4040FE40 [ascii,tail][ascii,tail][mb2] +40A14040 [ascii,tail][mb2,unassigned][ascii,tail] +40A140A140 [ascii,tail][mb2,unassigned][mb2,unassigned] +40A140A1A3 [ascii,tail][mb2,unassigned][mb2] +40A140FE40 [ascii,tail][mb2,unassigned][mb2] +40A1A340 [ascii,tail][mb2][ascii,tail] +40A1A3A140 [ascii,tail][mb2][mb2,unassigned] +40A1A3A1A3 [ascii,tail][mb2][mb2] +40A1A3FE40 [ascii,tail][mb2][mb2] +40FE4040 [ascii,tail][mb2][ascii,tail] +40FE40A140 [ascii,tail][mb2][mb2,unassigned] +40FE40A1A3 [ascii,tail][mb2][mb2] +40FE40FE40 [ascii,tail][mb2][mb2] +A1404040 [mb2,unassigned][ascii,tail][ascii,tail] +A14040A140 [mb2,unassigned][ascii,tail][mb2,unassigned] +A14040A1A3 [mb2,unassigned][ascii,tail][mb2] +A14040FE40 [mb2,unassigned][ascii,tail][mb2] +A140A14040 [mb2,unassigned][mb2,unassigned][ascii,tail] +A140A140A140 [mb2,unassigned][mb2,unassigned][mb2,unassigned] +A140A140A1A3 [mb2,unassigned][mb2,unassigned][mb2] +A140A140FE40 [mb2,unassigned][mb2,unassigned][mb2] +A140A1A340 [mb2,unassigned][mb2][ascii,tail] +A140A1A3A140 [mb2,unassigned][mb2][mb2,unassigned] +A140A1A3A1A3 [mb2,unassigned][mb2][mb2] +A140A1A3FE40 [mb2,unassigned][mb2][mb2] +A140FE4040 [mb2,unassigned][mb2][ascii,tail] +A140FE40A140 [mb2,unassigned][mb2][mb2,unassigned] +A140FE40A1A3 [mb2,unassigned][mb2][mb2] +A140FE40FE40 [mb2,unassigned][mb2][mb2] +A1A34040 [mb2][ascii,tail][ascii,tail] +A1A340A140 [mb2][ascii,tail][mb2,unassigned] +A1A340A1A3 [mb2][ascii,tail][mb2] +A1A340FE40 [mb2][ascii,tail][mb2] +A1A3A14040 [mb2][mb2,unassigned][ascii,tail] +A1A3A140A140 [mb2][mb2,unassigned][mb2,unassigned] +A1A3A140A1A3 [mb2][mb2,unassigned][mb2] +A1A3A140FE40 [mb2][mb2,unassigned][mb2] +A1A3A1A340 [mb2][mb2][ascii,tail] +A1A3A1A3A140 [mb2][mb2][mb2,unassigned] +A1A3A1A3A1A3 [mb2][mb2][mb2] +A1A3A1A3FE40 [mb2][mb2][mb2] +A1A3FE4040 [mb2][mb2][ascii,tail] +A1A3FE40A140 [mb2][mb2][mb2,unassigned] +A1A3FE40A1A3 [mb2][mb2][mb2] +A1A3FE40FE40 [mb2][mb2][mb2] +FE404040 [mb2][ascii,tail][ascii,tail] +FE4040A140 [mb2][ascii,tail][mb2,unassigned] +FE4040A1A3 [mb2][ascii,tail][mb2] +FE4040FE40 [mb2][ascii,tail][mb2] +FE40A14040 [mb2][mb2,unassigned][ascii,tail] +FE40A140A140 [mb2][mb2,unassigned][mb2,unassigned] +FE40A140A1A3 [mb2][mb2,unassigned][mb2] +FE40A140FE40 [mb2][mb2,unassigned][mb2] +FE40A1A340 [mb2][mb2][ascii,tail] +FE40A1A3A140 [mb2][mb2][mb2,unassigned] +FE40A1A3A1A3 [mb2][mb2][mb2] +FE40A1A3FE40 [mb2][mb2][mb2] +FE40FE4040 [mb2][mb2][ascii,tail] +FE40FE40A140 [mb2][mb2][mb2,unassigned] +FE40FE40A1A3 [mb2][mb2][mb2] +FE40FE40FE40 [mb2][mb2][mb2] +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that start with a tail or a bad byte, +# or have a bad byte, all should be fixed. +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE type1='tail' OR type1='bad' OR type2='bad' OR type3='bad' +ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 1 +Warning 1366 Incorrect string value: '\x80\xFF' for column 'c' at row 2 +Warning 1366 Incorrect string value: '\x81\xFF' for column 'c' at row 3 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 4 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 5 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 6 +Warning 1366 Incorrect string value: '\xFF@' for column 'c' at row 7 +Warning 1366 Incorrect string value: '\xFF\x80' for column 'c' at row 8 +Warning 1366 Incorrect string value: '\xFF\x81' for column 'c' at row 9 +Warning 1366 Incorrect string value: '\xFF\xA1@' for column 'c' at row 10 +Warning 1366 Incorrect string value: '\xFF\xA1\xA3' for column 'c' at row 11 +Warning 1366 Incorrect string value: '\xFF\xFE@' for column 'c' at row 12 +Warning 1366 Incorrect string value: '\xFF\xFF' for column 'c' at row 13 +Warning 1366 Incorrect string value: '\x80@@' for column 'c' at row 14 +Warning 1366 Incorrect string value: '\x80@\x80' for column 'c' at row 15 +Warning 1366 Incorrect string value: '\x80@\x81' for column 'c' at row 16 +Warning 1366 Incorrect string value: '\x80@\xA1@' for column 'c' at row 17 +Warning 1366 Incorrect string value: '\x80@\xA1\xA3' for column 'c' at row 18 +Warning 1366 Incorrect string value: '\x80@\xFE@' for column 'c' at row 19 +Warning 1366 Incorrect string value: '\x80@\xFF' for column 'c' at row 20 +Warning 1366 Incorrect string value: '\x80\x80@' for column 'c' at row 21 +Warning 1366 Incorrect string value: '\x80\x80\x80' for column 'c' at row 22 +Warning 1366 Incorrect string value: '\x80\x80\x81' for column 'c' at row 23 +Warning 1366 Incorrect string value: '\x80\x80\xA1@' for column 'c' at row 24 +Warning 1366 Incorrect string value: '\x80\x80\xA1\xA3' for column 'c' at row 25 +Warning 1366 Incorrect string value: '\x80\x80\xFE@' for column 'c' at row 26 +Warning 1366 Incorrect string value: '\x80\x80\xFF' for column 'c' at row 27 +Warning 1366 Incorrect string value: '\x80\x81@' for column 'c' at row 28 +Warning 1366 Incorrect string value: '\x80\x81\x80' for column 'c' at row 29 +Warning 1366 Incorrect string value: '\x80\x81\x81' for column 'c' at row 30 +Warning 1366 Incorrect string value: '\x80\x81\xA1@' for column 'c' at row 31 +Warning 1366 Incorrect string value: '\x80\x81\xA1\xA3' for column 'c' at row 32 +Warning 1366 Incorrect string value: '\x80\x81\xFE@' for column 'c' at row 33 +Warning 1366 Incorrect string value: '\x80\x81\xFF' for column 'c' at row 34 +Warning 1366 Incorrect string value: '\x80\xA1@@' for column 'c' at row 35 +Warning 1366 Incorrect string value: '\x80\xA1@\x80' for column 'c' at row 36 +Warning 1366 Incorrect string value: '\x80\xA1@\x81' for column 'c' at row 37 +Warning 1366 Incorrect string value: '\x80\xA1@\xA1@' for column 'c' at row 38 +Warning 1366 Incorrect string value: '\x80\xA1@\xA1\xA3' for column 'c' at row 39 +Warning 1366 Incorrect string value: '\x80\xA1@\xFE@' for column 'c' at row 40 +Warning 1366 Incorrect string value: '\x80\xA1@\xFF' for column 'c' at row 41 +Warning 1366 Incorrect string value: '\x80\xA1\xA3@' for column 'c' at row 42 +Warning 1366 Incorrect string value: '\x80\xA1\xA3\x80' for column 'c' at row 43 +Warning 1366 Incorrect string value: '\x80\xA1\xA3\x81' for column 'c' at row 44 +Warning 1366 Incorrect string value: '\x80\xA1\xA3\xA1@' for column 'c' at row 45 +Warning 1366 Incorrect string value: '\x80\xA1\xA3\xA1\xA3' for column 'c' at row 46 +Warning 1366 Incorrect string value: '\x80\xA1\xA3\xFE@' for column 'c' at row 47 +Warning 1366 Incorrect string value: '\x80\xA1\xA3\xFF' for column 'c' at row 48 +Warning 1366 Incorrect string value: '\x80\xFE@@' for column 'c' at row 49 +Warning 1366 Incorrect string value: '\x80\xFE@\x80' for column 'c' at row 50 +Warning 1366 Incorrect string value: '\x80\xFE@\x81' for column 'c' at row 51 +Warning 1366 Incorrect string value: '\x80\xFE@\xA1@' for column 'c' at row 52 +Warning 1366 Incorrect string value: '\x80\xFE@\xA1\xA3' for column 'c' at row 53 +Warning 1366 Incorrect string value: '\x80\xFE@\xFE@' for column 'c' at row 54 +Warning 1366 Incorrect string value: '\x80\xFE@\xFF' for column 'c' at row 55 +Warning 1366 Incorrect string value: '\x80\xFF@' for column 'c' at row 56 +Warning 1366 Incorrect string value: '\x80\xFF\x80' for column 'c' at row 57 +Warning 1366 Incorrect string value: '\x80\xFF\x81' for column 'c' at row 58 +Warning 1366 Incorrect string value: '\x80\xFF\xA1@' for column 'c' at row 59 +Warning 1366 Incorrect string value: '\x80\xFF\xA1\xA3' for column 'c' at row 60 +Warning 1366 Incorrect string value: '\x80\xFF\xFE@' for column 'c' at row 61 +Warning 1366 Incorrect string value: '\x80\xFF\xFF' for column 'c' at row 62 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 63 +Warning 1366 Incorrect string value: '\xFF' for column 'c' at row 64 +SELECT COUNT(*) FROM t3; +COUNT(*) +163 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +40403F 4040FF [ascii,tail][ascii,tail][bad] +403F3F 4080FF [ascii,tail][tail][bad] +403F3F 4081FF [ascii,tail][head,tail][bad] +40A1403F 40A140FF [ascii,tail][mb2,unassigned][bad] +40A1A33F 40A1A3FF [ascii,tail][mb2][bad] +40FE403F 40FE40FF [ascii,tail][mb2][bad] +403F40 40FF40 [ascii,tail][bad][ascii,tail] +403F3F 40FF80 [ascii,tail][bad][tail] +403F3F 40FF81 [ascii,tail][bad][head,tail] +403FA140 40FFA140 [ascii,tail][bad][mb2,unassigned] +403FA1A3 40FFA1A3 [ascii,tail][bad][mb2] +403FFE40 40FFFE40 [ascii,tail][bad][mb2] +403F3F 40FFFF [ascii,tail][bad][bad] +3F4040 804040 [tail][ascii,tail][ascii,tail] +3F403F 804080 [tail][ascii,tail][tail] +3F403F 804081 [tail][ascii,tail][head,tail] +3F40A140 8040A140 [tail][ascii,tail][mb2,unassigned] +3F40A1A3 8040A1A3 [tail][ascii,tail][mb2] +3F40FE40 8040FE40 [tail][ascii,tail][mb2] +3F403F 8040FF [tail][ascii,tail][bad] +3F3F40 808040 [tail][tail][ascii,tail] +3F3F3F 808080 [tail][tail][tail] +3F3F3F 808081 [tail][tail][head,tail] +3F3FA140 8080A140 [tail][tail][mb2,unassigned] +3F3FA1A3 8080A1A3 [tail][tail][mb2] +3F3FFE40 8080FE40 [tail][tail][mb2] +3F3F3F 8080FF [tail][tail][bad] +3F8140 808140 [tail][head,tail][ascii,tail] +3F8180 808180 [tail][head,tail][tail] +3F8181 808181 [tail][head,tail][head,tail] +3F81A140 8081A140 [tail][head,tail][mb2,unassigned] +3F81A13F 8081A1A3 [tail][head,tail][mb2] +3F81FE40 8081FE40 [tail][head,tail][mb2] +3F3F3F 8081FF [tail][head,tail][bad] +3FA14040 80A14040 [tail][mb2,unassigned][ascii,tail] +3FA1403F 80A14080 [tail][mb2,unassigned][tail] +3FA1403F 80A14081 [tail][mb2,unassigned][head,tail] +3FA140A140 80A140A140 [tail][mb2,unassigned][mb2,unassigned] +3FA140A1A3 80A140A1A3 [tail][mb2,unassigned][mb2] +3FA140FE40 80A140FE40 [tail][mb2,unassigned][mb2] +3FA1403F 80A140FF [tail][mb2,unassigned][bad] +3FA1A340 80A1A340 [tail][mb2][ascii,tail] +3FA1A33F 80A1A380 [tail][mb2][tail] +3FA1A33F 80A1A381 [tail][mb2][head,tail] +3FA1A3A140 80A1A3A140 [tail][mb2][mb2,unassigned] +3FA1A3A1A3 80A1A3A1A3 [tail][mb2][mb2] +3FA1A3FE40 80A1A3FE40 [tail][mb2][mb2] +3FA1A33F 80A1A3FF [tail][mb2][bad] +3FFE4040 80FE4040 [tail][mb2][ascii,tail] +3FFE403F 80FE4080 [tail][mb2][tail] +3FFE403F 80FE4081 [tail][mb2][head,tail] +3FFE40A140 80FE40A140 [tail][mb2][mb2,unassigned] +3FFE40A1A3 80FE40A1A3 [tail][mb2][mb2] +3FFE40FE40 80FE40FE40 [tail][mb2][mb2] +3FFE403F 80FE40FF [tail][mb2][bad] +3F3F40 80FF40 [tail][bad][ascii,tail] +3F3F3F 80FF80 [tail][bad][tail] +3F3F3F 80FF81 [tail][bad][head,tail] +3F3FA140 80FFA140 [tail][bad][mb2,unassigned] +3F3FA1A3 80FFA1A3 [tail][bad][mb2] +3F3FFE40 80FFFE40 [tail][bad][mb2] +3F3F3F 80FFFF [tail][bad][bad] +81403F 8140FF [head,tail][ascii,tail][bad] +81803F 8180FF [head,tail][tail][bad] +81813F 8181FF [head,tail][head,tail][bad] +81A1403F 81A140FF [head,tail][mb2,unassigned][bad] +81A13F3F 81A1A3FF [head,tail][mb2][bad] +81FE403F 81FE40FF [head,tail][mb2][bad] +3F3F40 81FF40 [head,tail][bad][ascii,tail] +3F3F3F 81FF80 [head,tail][bad][tail] +3F3F3F 81FF81 [head,tail][bad][head,tail] +3F3FA140 81FFA140 [head,tail][bad][mb2,unassigned] +3F3FA1A3 81FFA1A3 [head,tail][bad][mb2] +3F3FFE40 81FFFE40 [head,tail][bad][mb2] +3F3F3F 81FFFF [head,tail][bad][bad] +A140403F A14040FF [mb2,unassigned][ascii,tail][bad] +A1403F3F A14080FF [mb2,unassigned][tail][bad] +A1403F3F A14081FF [mb2,unassigned][head,tail][bad] +A140A1403F A140A140FF [mb2,unassigned][mb2,unassigned][bad] +A140A1A33F A140A1A3FF [mb2,unassigned][mb2][bad] +A140FE403F A140FE40FF [mb2,unassigned][mb2][bad] +A1403F40 A140FF40 [mb2,unassigned][bad][ascii,tail] +A1403F3F A140FF80 [mb2,unassigned][bad][tail] +A1403F3F A140FF81 [mb2,unassigned][bad][head,tail] +A1403FA140 A140FFA140 [mb2,unassigned][bad][mb2,unassigned] +A1403FA1A3 A140FFA1A3 [mb2,unassigned][bad][mb2] +A1403FFE40 A140FFFE40 [mb2,unassigned][bad][mb2] +A1403F3F A140FFFF [mb2,unassigned][bad][bad] +A1A3403F A1A340FF [mb2][ascii,tail][bad] +A1A33F3F A1A380FF [mb2][tail][bad] +A1A33F3F A1A381FF [mb2][head,tail][bad] +A1A3A1403F A1A3A140FF [mb2][mb2,unassigned][bad] +A1A3A1A33F A1A3A1A3FF [mb2][mb2][bad] +A1A3FE403F A1A3FE40FF [mb2][mb2][bad] +A1A33F40 A1A3FF40 [mb2][bad][ascii,tail] +A1A33F3F A1A3FF80 [mb2][bad][tail] +A1A33F3F A1A3FF81 [mb2][bad][head,tail] +A1A33FA140 A1A3FFA140 [mb2][bad][mb2,unassigned] +A1A33FA1A3 A1A3FFA1A3 [mb2][bad][mb2] +A1A33FFE40 A1A3FFFE40 [mb2][bad][mb2] +A1A33F3F A1A3FFFF [mb2][bad][bad] +FE40403F FE4040FF [mb2][ascii,tail][bad] +FE403F3F FE4080FF [mb2][tail][bad] +FE403F3F FE4081FF [mb2][head,tail][bad] +FE40A1403F FE40A140FF [mb2][mb2,unassigned][bad] +FE40A1A33F FE40A1A3FF [mb2][mb2][bad] +FE40FE403F FE40FE40FF [mb2][mb2][bad] +FE403F40 FE40FF40 [mb2][bad][ascii,tail] +FE403F3F FE40FF80 [mb2][bad][tail] +FE403F3F FE40FF81 [mb2][bad][head,tail] +FE403FA140 FE40FFA140 [mb2][bad][mb2,unassigned] +FE403FA1A3 FE40FFA1A3 [mb2][bad][mb2] +FE403FFE40 FE40FFFE40 [mb2][bad][mb2] +FE403F3F FE40FFFF [mb2][bad][bad] +3F4040 FF4040 [bad][ascii,tail][ascii,tail] +3F403F FF4080 [bad][ascii,tail][tail] +3F403F FF4081 [bad][ascii,tail][head,tail] +3F40A140 FF40A140 [bad][ascii,tail][mb2,unassigned] +3F40A1A3 FF40A1A3 [bad][ascii,tail][mb2] +3F40FE40 FF40FE40 [bad][ascii,tail][mb2] +3F403F FF40FF [bad][ascii,tail][bad] +3F3F40 FF8040 [bad][tail][ascii,tail] +3F3F3F FF8080 [bad][tail][tail] +3F3F3F FF8081 [bad][tail][head,tail] +3F3FA140 FF80A140 [bad][tail][mb2,unassigned] +3F3FA1A3 FF80A1A3 [bad][tail][mb2] +3F3FFE40 FF80FE40 [bad][tail][mb2] +3F3F3F FF80FF [bad][tail][bad] +3F8140 FF8140 [bad][head,tail][ascii,tail] +3F8180 FF8180 [bad][head,tail][tail] +3F8181 FF8181 [bad][head,tail][head,tail] +3F81A140 FF81A140 [bad][head,tail][mb2,unassigned] +3F81A13F FF81A1A3 [bad][head,tail][mb2] +3F81FE40 FF81FE40 [bad][head,tail][mb2] +3F3F3F FF81FF [bad][head,tail][bad] +3FA14040 FFA14040 [bad][mb2,unassigned][ascii,tail] +3FA1403F FFA14080 [bad][mb2,unassigned][tail] +3FA1403F FFA14081 [bad][mb2,unassigned][head,tail] +3FA140A140 FFA140A140 [bad][mb2,unassigned][mb2,unassigned] +3FA140A1A3 FFA140A1A3 [bad][mb2,unassigned][mb2] +3FA140FE40 FFA140FE40 [bad][mb2,unassigned][mb2] +3FA1403F FFA140FF [bad][mb2,unassigned][bad] +3FA1A340 FFA1A340 [bad][mb2][ascii,tail] +3FA1A33F FFA1A380 [bad][mb2][tail] +3FA1A33F FFA1A381 [bad][mb2][head,tail] +3FA1A3A140 FFA1A3A140 [bad][mb2][mb2,unassigned] +3FA1A3A1A3 FFA1A3A1A3 [bad][mb2][mb2] +3FA1A3FE40 FFA1A3FE40 [bad][mb2][mb2] +3FA1A33F FFA1A3FF [bad][mb2][bad] +3FFE4040 FFFE4040 [bad][mb2][ascii,tail] +3FFE403F FFFE4080 [bad][mb2][tail] +3FFE403F FFFE4081 [bad][mb2][head,tail] +3FFE40A140 FFFE40A140 [bad][mb2][mb2,unassigned] +3FFE40A1A3 FFFE40A1A3 [bad][mb2][mb2] +3FFE40FE40 FFFE40FE40 [bad][mb2][mb2] +3FFE403F FFFE40FF [bad][mb2][bad] +3F3F40 FFFF40 [bad][bad][ascii,tail] +3F3F3F FFFF80 [bad][bad][tail] +3F3F3F FFFF81 [bad][bad][head,tail] +3F3FA140 FFFFA140 [bad][bad][mb2,unassigned] +3F3FA1A3 FFFFA1A3 [bad][bad][mb2] +3F3FFE40 FFFFFE40 [bad][bad][mb2] +3F3F3F FFFFFF [bad][bad][bad] +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that start with an ASCII or an MB2 character, +# followed by a pure non-ASCII tail, all should be fixed. +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('mb2',type1) OR FIND_IN_SET('ascii',type1)) +AND type2='tail' +ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\x80@' for column 'c' at row 1 +Warning 1366 Incorrect string value: '\x80\x80' for column 'c' at row 2 +Warning 1366 Incorrect string value: '\x80\x81' for column 'c' at row 3 +Warning 1366 Incorrect string value: '\x80\xA1@' for column 'c' at row 4 +Warning 1366 Incorrect string value: '\x80\xA1\xA3' for column 'c' at row 5 +Warning 1366 Incorrect string value: '\x80\xFE@' for column 'c' at row 6 +Warning 1366 Incorrect string value: '\x80@' for column 'c' at row 7 +Warning 1366 Incorrect string value: '\x80\x80' for column 'c' at row 8 +Warning 1366 Incorrect string value: '\x80\x81' for column 'c' at row 9 +Warning 1366 Incorrect string value: '\x80\xA1@' for column 'c' at row 10 +Warning 1366 Incorrect string value: '\x80\xA1\xA3' for column 'c' at row 11 +Warning 1366 Incorrect string value: '\x80\xFE@' for column 'c' at row 12 +Warning 1366 Incorrect string value: '\x80@' for column 'c' at row 13 +Warning 1366 Incorrect string value: '\x80\x80' for column 'c' at row 14 +Warning 1366 Incorrect string value: '\x80\x81' for column 'c' at row 15 +Warning 1366 Incorrect string value: '\x80\xA1@' for column 'c' at row 16 +Warning 1366 Incorrect string value: '\x80\xA1\xA3' for column 'c' at row 17 +Warning 1366 Incorrect string value: '\x80\xFE@' for column 'c' at row 18 +Warning 1366 Incorrect string value: '\x80@' for column 'c' at row 19 +Warning 1366 Incorrect string value: '\x80\x80' for column 'c' at row 20 +Warning 1366 Incorrect string value: '\x80\x81' for column 'c' at row 21 +Warning 1366 Incorrect string value: '\x80\xA1@' for column 'c' at row 22 +Warning 1366 Incorrect string value: '\x80\xA1\xA3' for column 'c' at row 23 +Warning 1366 Incorrect string value: '\x80\xFE@' for column 'c' at row 24 +SELECT COUNT(*) FROM t3; +COUNT(*) +24 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +403F40 408040 [ascii,tail][tail][ascii,tail] +403F3F 408080 [ascii,tail][tail][tail] +403F3F 408081 [ascii,tail][tail][head,tail] +403FA140 4080A140 [ascii,tail][tail][mb2,unassigned] +403FA1A3 4080A1A3 [ascii,tail][tail][mb2] +403FFE40 4080FE40 [ascii,tail][tail][mb2] +A1403F40 A1408040 [mb2,unassigned][tail][ascii,tail] +A1403F3F A1408080 [mb2,unassigned][tail][tail] +A1403F3F A1408081 [mb2,unassigned][tail][head,tail] +A1403FA140 A14080A140 [mb2,unassigned][tail][mb2,unassigned] +A1403FA1A3 A14080A1A3 [mb2,unassigned][tail][mb2] +A1403FFE40 A14080FE40 [mb2,unassigned][tail][mb2] +A1A33F40 A1A38040 [mb2][tail][ascii,tail] +A1A33F3F A1A38080 [mb2][tail][tail] +A1A33F3F A1A38081 [mb2][tail][head,tail] +A1A33FA140 A1A380A140 [mb2][tail][mb2,unassigned] +A1A33FA1A3 A1A380A1A3 [mb2][tail][mb2] +A1A33FFE40 A1A380FE40 [mb2][tail][mb2] +FE403F40 FE408040 [mb2][tail][ascii,tail] +FE403F3F FE408080 [mb2][tail][tail] +FE403F3F FE408081 [mb2][tail][head,tail] +FE403FA140 FE4080A140 [mb2][tail][mb2,unassigned] +FE403FA1A3 FE4080A1A3 [mb2][tail][mb2] +FE403FFE40 FE4080FE40 [mb2][tail][mb2] +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that consist of two ASCII or MB2 characters, +# followed by a pure non-ASCII tail, all should be fixed. +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('mb2',type1) OR FIND_IN_SET('ascii',type1)) AND +(FIND_IN_SET('mb2',type2) OR FIND_IN_SET('ascii',type2)) AND +type3='tail' +ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 1 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 2 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 3 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 4 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 5 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 6 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 7 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 8 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 9 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 10 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 11 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 12 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 13 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 14 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 15 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 16 +SELECT COUNT(*) FROM t3; +COUNT(*) +16 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +40403F 404080 [ascii,tail][ascii,tail][tail] +40A1403F 40A14080 [ascii,tail][mb2,unassigned][tail] +40A1A33F 40A1A380 [ascii,tail][mb2][tail] +40FE403F 40FE4080 [ascii,tail][mb2][tail] +A140403F A1404080 [mb2,unassigned][ascii,tail][tail] +A140A1403F A140A14080 [mb2,unassigned][mb2,unassigned][tail] +A140A1A33F A140A1A380 [mb2,unassigned][mb2][tail] +A140FE403F A140FE4080 [mb2,unassigned][mb2][tail] +A1A3403F A1A34080 [mb2][ascii,tail][tail] +A1A3A1403F A1A3A14080 [mb2][mb2,unassigned][tail] +A1A3A1A33F A1A3A1A380 [mb2][mb2][tail] +A1A3FE403F A1A3FE4080 [mb2][mb2][tail] +FE40403F FE404080 [mb2][ascii,tail][tail] +FE40A1403F FE40A14080 [mb2][mb2,unassigned][tail] +FE40A1A33F FE40A1A380 [mb2][mb2][tail] +FE40FE403F FE40FE4080 [mb2][mb2][tail] +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that consist of two MB2 characters, +# followed by a non-ASCII head or tail, all should be fixed. +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE FIND_IN_SET('mb2',type1) AND FIND_IN_SET('mb2',type2) +AND NOT FIND_IN_SET('ascii',type3) +AND NOT FIND_IN_SET('mb2',type3) +ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 1 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 2 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 3 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 4 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 5 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 6 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 7 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 8 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 9 +SELECT COUNT(*) FROM t3; +COUNT(*) +9 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +A140A1403F A140A14081 [mb2,unassigned][mb2,unassigned][head,tail] +A140A1A33F A140A1A381 [mb2,unassigned][mb2][head,tail] +A140FE403F A140FE4081 [mb2,unassigned][mb2][head,tail] +A1A3A1403F A1A3A14081 [mb2][mb2,unassigned][head,tail] +A1A3A1A33F A1A3A1A381 [mb2][mb2][head,tail] +A1A3FE403F A1A3FE4081 [mb2][mb2][head,tail] +FE40A1403F FE40A14081 [mb2][mb2,unassigned][head,tail] +FE40A1A33F FE40A1A381 [mb2][mb2][head,tail] +FE40FE403F FE40FE4081 [mb2][mb2][head,tail] +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that consist of head + tail + MB2 should go without warnings +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE FIND_IN_SET('head',type1) +AND FIND_IN_SET('tail',type2) +AND FIND_IN_SET('mb2',type3) +ORDER BY b; +SELECT COUNT(*) FROM t3; +COUNT(*) +9 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +8140A140 [head,tail][ascii,tail][mb2,unassigned] +8140A1A3 [head,tail][ascii,tail][mb2] +8140FE40 [head,tail][ascii,tail][mb2] +8180A140 [head,tail][tail][mb2,unassigned] +8180A1A3 [head,tail][tail][mb2] +8180FE40 [head,tail][tail][mb2] +8181A140 [head,tail][head,tail][mb2,unassigned] +8181A1A3 [head,tail][head,tail][mb2] +8181FE40 [head,tail][head,tail][mb2] +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +# +# Sequences that consist of (ascii or mb2) + head + tail should go without warnings +# +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('ascii',type1) OR FIND_IN_SET('mb2',type1)) +AND FIND_IN_SET('head',type2) +AND FIND_IN_SET('tail',type3) +ORDER BY b; +SELECT COUNT(*) FROM t3; +COUNT(*) +12 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +408140 [ascii,tail][head,tail][ascii,tail] +408180 [ascii,tail][head,tail][tail] +408181 [ascii,tail][head,tail][head,tail] +A1408140 [mb2,unassigned][head,tail][ascii,tail] +A1408180 [mb2,unassigned][head,tail][tail] +A1408181 [mb2,unassigned][head,tail][head,tail] +A1A38140 [mb2][head,tail][ascii,tail] +A1A38180 [mb2][head,tail][tail] +A1A38181 [mb2][head,tail][head,tail] +FE408140 [mb2][head,tail][ascii,tail] +FE408180 [mb2][head,tail][tail] +FE408181 [mb2][head,tail][head,tail] +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 ORDER BY b; +Warnings: +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 1 +Warning 1366 Incorrect string value: '\xA3' for column 'c' at row 3 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 5 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 6 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 7 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 9 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 10 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 12 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 13 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 15 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 16 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 18 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 19 +Warning 1366 Incorrect string value: '\xA3' for column 'c' at row 27 +Warning 1366 Incorrect string value: '\x80' for column 'c' at row 30 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 31 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 35 +Warning 1366 Incorrect string value: '\xA3' for column 'c' at row 37 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 39 +Warning 1366 Incorrect string value: '\xA3' for column 'c' at row 41 +Warning 1366 Incorrect string value: '\x81' for column 'c' at row 43 +Warning 1366 Incorrect string value: '\xA3' for column 'c' at row 45 +SELECT COUNT(*) FROM t3; +COUNT(*) +46 +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +HEX(c) comment +4081A140 [ascii,tail][head,tail][mb2,unassigned] +4081FE40 [ascii,tail][head,tail][mb2] +814040 [head,tail][ascii,tail][ascii,tail] +818040 [head,tail][tail][ascii,tail] +818140 [head,tail][head,tail][ascii,tail] +81A14040 [head,tail][mb2,unassigned][ascii,tail] +81A140A140 [head,tail][mb2,unassigned][mb2,unassigned] +81A140A1A3 [head,tail][mb2,unassigned][mb2] +81A140FE40 [head,tail][mb2,unassigned][mb2] +81A1A340 [head,tail][mb2][ascii,tail] +81A1A380 [head,tail][mb2][tail] +81A1A381 [head,tail][mb2][head,tail] +81A1A3A140 [head,tail][mb2][mb2,unassigned] +81A1A3FE40 [head,tail][mb2][mb2] +81FE4040 [head,tail][mb2][ascii,tail] +81FE40A140 [head,tail][mb2][mb2,unassigned] +81FE40A1A3 [head,tail][mb2][mb2] +81FE40FE40 [head,tail][mb2][mb2] +A14081A140 [mb2,unassigned][head,tail][mb2,unassigned] +A14081FE40 [mb2,unassigned][head,tail][mb2] +A1A381A140 [mb2][head,tail][mb2,unassigned] +A1A381FE40 [mb2][head,tail][mb2] +FE4081A140 [mb2][head,tail][mb2,unassigned] +FE4081FE40 [mb2][head,tail][mb2] +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +HEX(c) HEX(b) comment +40403F 404081 [ascii,tail][ascii,tail][head,tail] +4081A13F 4081A1A3 [ascii,tail][head,tail][mb2] +40A1403F 40A14081 [ascii,tail][mb2,unassigned][head,tail] +40A1A33F 40A1A381 [ascii,tail][mb2][head,tail] +40FE403F 40FE4081 [ascii,tail][mb2][head,tail] +81403F 814080 [head,tail][ascii,tail][tail] +81403F 814081 [head,tail][ascii,tail][head,tail] +81803F 818080 [head,tail][tail][tail] +81803F 818081 [head,tail][tail][head,tail] +81813F 818180 [head,tail][head,tail][tail] +81813F 818181 [head,tail][head,tail][head,tail] +81A1403F 81A14080 [head,tail][mb2,unassigned][tail] +81A1403F 81A14081 [head,tail][mb2,unassigned][head,tail] +81A1A3A13F 81A1A3A1A3 [head,tail][mb2][mb2] +81FE403F 81FE4080 [head,tail][mb2][tail] +81FE403F 81FE4081 [head,tail][mb2][head,tail] +A140403F A1404081 [mb2,unassigned][ascii,tail][head,tail] +A14081A13F A14081A1A3 [mb2,unassigned][head,tail][mb2] +A1A3403F A1A34081 [mb2][ascii,tail][head,tail] +A1A381A13F A1A381A1A3 [mb2][head,tail][mb2] +FE40403F FE404081 [mb2][ascii,tail][head,tail] +FE4081A13F FE4081A1A3 [mb2][head,tail][mb2] +DROP TABLE t3; +DROP TABLE t2; +DROP TABLE t1; +# +# END OF MDEV-6566 Different INSERT behaviour on bad bytes with and without character set conversion +# +# +# End of 10.1 tests +# diff --git a/mysql-test/r/ctype_sjis.result b/mysql-test/r/ctype_sjis.result index 48456c16705..b4ef6f8c7e5 100644 --- a/mysql-test/r/ctype_sjis.result +++ b/mysql-test/r/ctype_sjis.result @@ -477,7 +477,7 @@ Warning 1366 Incorrect string value: '\x80_' for column 'a' at row 64 SELECT COUNT(*) FROM t1; COUNT(*) 14623 -SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=1; +SELECT COUNT(*) FROM t1 WHERE a<>'?' AND OCTET_LENGTH(a)=1; COUNT(*) 63 SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; diff --git a/mysql-test/r/ctype_ujis.result b/mysql-test/r/ctype_ujis.result index 413ab4efe31..4074d98c00d 100644 --- a/mysql-test/r/ctype_ujis.result +++ b/mysql-test/r/ctype_ujis.result @@ -2626,7 +2626,7 @@ Warning 1366 Incorrect string value: '\x80_' for column 'a' at row 64 SELECT COUNT(*) FROM t1; COUNT(*) 44671 -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; COUNT(*) 17735 SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; @@ -25938,7 +25938,7 @@ CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET ujis); INSERT INTO t1 VALUES (0x8EA0); SELECT HEX(a), CHAR_LENGTH(a) FROM t1; HEX(a) CHAR_LENGTH(a) - 0 +3F3F 2 DROP TABLE t1; SELECT _ujis 0x8EA0; ERROR HY000: Invalid ujis character string: '8EA0' diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 4b23b010c79..90f679bc0db 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -225,7 +225,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 varchar(10) character set utf8); insert into t1 values (0x41FF); @@ -233,7 +233,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 text character set utf8); insert into t1 values (0x41FF); @@ -241,7 +241,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (a text character set utf8, primary key(a(371))); ERROR 42000: Specified key was too long; max key length is 1000 bytes @@ -9332,3 +9332,15 @@ DROP TABLE allbytes; # # End of 10.0 tests # +# +# Start of 10.1 tests +# +# +# MDEV-6572 "USE dbname" with a bad sequence erroneously connects to a wrong database +# +SET NAMES utf8; +SELECT * FROM `test😁😁test`; +ERROR HY000: Invalid utf8 character string: 'test\xF0\x9F\x98\x81\xF0\x9F\x98\x81test' +# +# End of 10.1 tests +# diff --git a/mysql-test/r/ctype_utf8mb4.result b/mysql-test/r/ctype_utf8mb4.result index 0dc94e90454..ee91c93cd5b 100644 --- a/mysql-test/r/ctype_utf8mb4.result +++ b/mysql-test/r/ctype_utf8mb4.result @@ -225,7 +225,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 varchar(10) character set utf8mb4); insert into t1 values (0x41FF); @@ -233,7 +233,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 text character set utf8mb4); insert into t1 values (0x41FF); @@ -241,7 +241,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (a text character set utf8mb4, primary key(a(371))); ERROR 42000: Specified key was too long; max key length is 1000 bytes @@ -2327,7 +2327,7 @@ select hex(utf8mb4) from t1; hex(utf8mb4) F0908080 F0BFBFBF - +3F delete from t1; Testing [F2..F3][80..BF][80..BF][80..BF] insert into t1 values (0xF2808080); @@ -2347,7 +2347,7 @@ select hex(utf8mb4) from t1; hex(utf8mb4) F4808080 F48F8080 - +3F drop table t1; # # Check strnxfrm() with odd length @@ -2472,45 +2472,45 @@ F3A087AFEA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 -EA9DA8 +3F3F3F3FEA9DA8 SELECT HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) FROM t1,t2; HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) F09D8480EA9DA8 F09D8480EFB9AB -F09D8480 +F09D84803F3F3F3F F09D849EEA9DA8 F09D849EEFB9AB -F09D849E +F09D849E3F3F3F3F F09D859EEA9DA8 F09D859EEFB9AB -F09D859E +F09D859E3F3F3F3F F09D878FEA9DA8 F09D878FEFB9AB -F09D878F +F09D878F3F3F3F3F F09D9C9FEA9DA8 F09D9C9FEFB9AB -F09D9C9F +F09D9C9F3F3F3F3F F09D9E9FEA9DA8 F09D9E9FEFB9AB -F09D9E9F +F09D9E9F3F3F3F3F F48FBFBFEA9DA8 F48FBFBFEFB9AB -F48FBFBF +F48FBFBF3F3F3F3F F3A087AFEA9DA8 F3A087AFEFB9AB -F3A087AF +F3A087AF3F3F3F3F F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEFB9AB -EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB +EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB3F3F3F3F F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 -EA9DA8 -EFB9AB - +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F +3F3F3F3FEA9DA8 +3F3F3F3FEFB9AB +3F3F3F3F3F3F3F3F SELECT count(*) FROM t1, t2 WHERE t1.utf8mb4_encoding > t2.utf8mb3_encoding; count(*) @@ -2547,7 +2547,7 @@ u_decimal hex(utf8mb4_encoding) utf8mb4_encoding 119070 3F3F3F3F3F3F3F3F3F3F ?????????? 65131 EFB9AB3F3F3F3F3FEFB9ABEFB9AB3FEFB9AB ﹫?????﹫﹫?﹫ 119070 3F3F3F3F3F3F3F3F3F3F ?????????? -1114111 +1114111 3F3F3F3F ???? ALTER TABLE t2 CONVERT TO CHARACTER SET utf8mb4; SHOW CREATE TABLE t2; Table Create Table @@ -2559,7 +2559,7 @@ SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) 42856 EA9DA8 65131 EFB9AB -1114111 +1114111 3F3F3F3F ALTER TABLE t2 CONVERT TO CHARACTER SET utf8mb3; SHOW CREATE TABLE t2; Table Create Table @@ -2571,7 +2571,7 @@ SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) 42856 EA9DA8 65131 EFB9AB -1114111 +1114111 3F3F3F3F ALTER TABLE t1 MODIFY utf8mb4_encoding VARCHAR(10) CHARACTER SET utf8mb3; SHOW CREATE TABLE t1; Table Create Table @@ -2592,7 +2592,7 @@ u_decimal hex(utf8mb4_encoding) 119070 3F3F3F3F3F3F3F3F3F3F 65131 EFB9AB3F3F3F3F3FEFB9ABEFB9AB3FEFB9AB 119070 3F3F3F3F3F3F3F3F3F3F -1114111 +1114111 3F3F3F3F ALTER TABLE t1 MODIFY utf8mb4_encoding VARCHAR(10) CHARACTER SET utf8mb4; SHOW CREATE TABLE t1; Table Create Table @@ -2613,7 +2613,7 @@ u_decimal hex(utf8mb4_encoding) 119070 3F3F3F3F3F3F3F3F3F3F 65131 EFB9AB3F3F3F3F3FEFB9ABEFB9AB3FEFB9AB 119070 3F3F3F3F3F3F3F3F3F3F -1114111 +1114111 3F3F3F3F ALTER TABLE t2 MODIFY utf8mb3_encoding VARCHAR(10) CHARACTER SET utf8mb4; SHOW CREATE TABLE t2; Table Create Table @@ -2625,7 +2625,7 @@ SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) 42856 EA9DA8 65131 EFB9AB -1114111 +1114111 3F3F3F3F DROP TABLE IF EXISTS t3; CREATE TABLE t3 ( u_decimal int NOT NULL, @@ -3306,5 +3306,65 @@ DFFFFFDFFFFF9CFFFF9DFFFF9EFFFF # End of 5.6 tests # # +# Start of 10.0 tests +# +# +# MDEV-6566 Different INSERT behaviour on bad bytes with and without character set conversion +# +# +# This test sets session character set to 3-byte utf8, +# but then sends a 4-byte sequence (which is wrong for 3-byte utf8). +# It should be replaced to four question marks: '????' in both columns +# (i.e. four unknown bytes are replaced to four question marks), +# then the rest of the string should be stored, so we get 'a ???? b'. +# +SET NAMES utf8; +CREATE TABLE t1 ( +a VARCHAR(32) CHARACTER SET utf8mb4, +b VARCHAR(32) CHARACTER SET utf8 +); +INSERT INTO t1 SELECT 'a 😁 b', 'a 😁 b'; +Warnings: +Warning 1366 Incorrect string value: '\xF0\x9F\x98\x81 b' for column 'a' at row 1 +Warning 1366 Incorrect string value: '\xF0\x9F\x98\x81 b' for column 'b' at row 1 +SELECT * FROM t1; +a b +a ???? b a ???? b +DROP TABLE t1; +# +# This test sets session character set to 4-byte utf8, +# then normally sends a 4-byte sequence. +# It should be stored AS IS into the utf8mb4 column (a), +# and should be replaced to a single question mark in the utf8 column (b) +# (i.e. one character that cannot be converted is replaced to one question mark). +# +SET NAMES utf8mb4; +CREATE TABLE t1 ( +a VARCHAR(32) CHARACTER SET utf8mb4, +b VARCHAR(32) CHARACTER SET utf8 +); +INSERT INTO t1 SELECT 'a 😁 b', 'a 😁 b'; +Warnings: +Warning 1366 Incorrect string value: '\xF0\x9F\x98\x81 b' for column 'b' at row 1 +SELECT * FROM t1; +a b +a 😁 b a ? b +DROP TABLE t1; +# +# End of 10.0 tests +# +# # End of tests # +# +# Start of 10.1 tests +# +# +# MDEV-6572 "USE dbname" with a bad sequence erroneously connects to a wrong database +# +SET NAMES utf8mb4; +SELECT * FROM `test😁😁test`; +ERROR HY000: Invalid utf8mb4 character string: 'test\xF0\x9F\x98\x81\xF0\x9F\x98\x81test' +# +# End of 10.1 tests +# diff --git a/mysql-test/r/ctype_utf8mb4_heap.result b/mysql-test/r/ctype_utf8mb4_heap.result index 57d29a24fd0..7f5125ae2ba 100644 --- a/mysql-test/r/ctype_utf8mb4_heap.result +++ b/mysql-test/r/ctype_utf8mb4_heap.result @@ -225,7 +225,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 varchar(10) character set utf8mb4) engine heap; insert into t1 values (0x41FF); @@ -233,7 +233,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; CREATE TABLE t1 ( a varchar(10) ) CHARACTER SET utf8mb4 ENGINE heap; INSERT INTO t1 VALUES ( 'test' ); @@ -2157,7 +2157,7 @@ Warnings: Warning 1366 Incorrect string value: '\xF0\x8F\x80\x80' for column 'utf8mb4' at row 1 select hex(utf8mb4) from t1; hex(utf8mb4) - +3F F0908080 F0BFBFBF delete from t1; @@ -2177,7 +2177,7 @@ Warnings: Warning 1366 Incorrect string value: '\xF4\x90\x80\x80' for column 'utf8mb4' at row 1 select hex(utf8mb4) from t1; hex(utf8mb4) - +3F F4808080 F48F8080 drop table t1; @@ -2274,7 +2274,7 @@ Warning 1366 Incorrect string value: '\xF4\x8F\xBF\xBD' for column 'utf8mb3_enco UPDATE t2 SET utf8mb3_encoding= _utf8mb4 x'ea9da8' where u_decimal= 42856; SELECT HEX(CONCAT(utf8mb4_encoding, _utf8 x'ea9da8')) FROM t1; HEX(CONCAT(utf8mb4_encoding, _utf8 x'ea9da8')) -EA9DA8 +3F3F3F3FEA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 F09D8480EA9DA8 F09D849EEA9DA8 @@ -2288,40 +2288,40 @@ F3A087AFEA9DA8 F48FBFBFEA9DA8 SELECT HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) FROM t1,t2; HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) - -EA9DA8 -EFB9AB -EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB +3F3F3F3F3F3F3F3F +3F3F3F3FEA9DA8 +3F3F3F3FEFB9AB +EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB3F3F3F3F EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEFB9AB -F09D8480 +F09D84803F3F3F3F F09D8480EA9DA8 F09D8480EFB9AB -F09D849E +F09D849E3F3F3F3F F09D849EEA9DA8 F09D849EEFB9AB -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB -F09D859E +F09D859E3F3F3F3F F09D859EEA9DA8 F09D859EEFB9AB -F09D878F +F09D878F3F3F3F3F F09D878FEA9DA8 F09D878FEFB9AB -F09D9C9F +F09D9C9F3F3F3F3F F09D9C9FEA9DA8 F09D9C9FEFB9AB -F09D9E9F +F09D9E9F3F3F3F3F F09D9E9FEA9DA8 F09D9E9FEFB9AB -F3A087AF +F3A087AF3F3F3F3F F3A087AFEA9DA8 F3A087AFEFB9AB -F48FBFBF +F48FBFBF3F3F3F3F F48FBFBFEA9DA8 F48FBFBFEFB9AB SELECT count(*) FROM t1, t2 @@ -2337,8 +2337,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding),utf8mb4_encoding FROM t1; u_decimal hex(utf8mb4_encoding) utf8mb4_encoding -1114111 1114111 3F ? +1114111 3F3F3F3F ???? 119040 3F ? 119070 3F ? 119070 3F3F3F3F3F3F3F3F3F3F ?????????? @@ -2358,7 +2358,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB ALTER TABLE t2 CONVERT TO CHARACTER SET utf8mb3; @@ -2370,7 +2370,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB ALTER TABLE t1 MODIFY utf8mb4_encoding VARCHAR(10) CHARACTER SET utf8mb3; @@ -2382,8 +2382,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding) FROM t1; u_decimal hex(utf8mb4_encoding) -1114111 1114111 3F +1114111 3F3F3F3F 119040 3F 119070 3F 119070 3F3F3F3F3F3F3F3F3F3F @@ -2403,8 +2403,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding) FROM t1; u_decimal hex(utf8mb4_encoding) -1114111 1114111 3F +1114111 3F3F3F3F 119040 3F 119070 3F 119070 3F3F3F3F3F3F3F3F3F3F @@ -2424,7 +2424,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB DROP TABLE IF EXISTS t3; diff --git a/mysql-test/r/ctype_utf8mb4_innodb.result b/mysql-test/r/ctype_utf8mb4_innodb.result index ba03a3f66e6..053e6de8fe1 100644 --- a/mysql-test/r/ctype_utf8mb4_innodb.result +++ b/mysql-test/r/ctype_utf8mb4_innodb.result @@ -225,7 +225,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 varchar(10) character set utf8mb4) engine InnoDB; insert into t1 values (0x41FF); @@ -233,7 +233,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 text character set utf8mb4) engine InnoDB; insert into t1 values (0x41FF); @@ -241,7 +241,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (a text character set utf8mb4, primary key(a(371))) engine InnoDB; ERROR 42000: Specified key was too long; max key length is 767 bytes @@ -2285,7 +2285,7 @@ Warnings: Warning 1366 Incorrect string value: '\xF0\x8F\x80\x80' for column 'utf8mb4' at row 1 select hex(utf8mb4) from t1; hex(utf8mb4) - +3F F0908080 F0BFBFBF delete from t1; @@ -2305,7 +2305,7 @@ Warnings: Warning 1366 Incorrect string value: '\xF4\x90\x80\x80' for column 'utf8mb4' at row 1 select hex(utf8mb4) from t1; hex(utf8mb4) - +3F F4808080 F48F8080 drop table t1; @@ -2421,7 +2421,7 @@ Warning 1366 Incorrect string value: '\xF4\x8F\xBF\xBD' for column 'utf8mb3_enco UPDATE t2 SET utf8mb3_encoding= _utf8mb4 x'ea9da8' where u_decimal= 42856; SELECT HEX(CONCAT(utf8mb4_encoding, _utf8 x'ea9da8')) FROM t1; HEX(CONCAT(utf8mb4_encoding, _utf8 x'ea9da8')) -EA9DA8 +3F3F3F3FEA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 F09D8480EA9DA8 F09D849EEA9DA8 @@ -2435,40 +2435,40 @@ F3A087AFEA9DA8 F48FBFBFEA9DA8 SELECT HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) FROM t1,t2; HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) - -EA9DA8 -EFB9AB -EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB +3F3F3F3F3F3F3F3F +3F3F3F3FEA9DA8 +3F3F3F3FEFB9AB +EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB3F3F3F3F EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEFB9AB -F09D8480 +F09D84803F3F3F3F F09D8480EA9DA8 F09D8480EFB9AB -F09D849E +F09D849E3F3F3F3F F09D849EEA9DA8 F09D849EEFB9AB -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB -F09D859E +F09D859E3F3F3F3F F09D859EEA9DA8 F09D859EEFB9AB -F09D878F +F09D878F3F3F3F3F F09D878FEA9DA8 F09D878FEFB9AB -F09D9C9F +F09D9C9F3F3F3F3F F09D9C9FEA9DA8 F09D9C9FEFB9AB -F09D9E9F +F09D9E9F3F3F3F3F F09D9E9FEA9DA8 F09D9E9FEFB9AB -F3A087AF +F3A087AF3F3F3F3F F3A087AFEA9DA8 F3A087AFEFB9AB -F48FBFBF +F48FBFBF3F3F3F3F F48FBFBFEA9DA8 F48FBFBFEFB9AB SELECT count(*) FROM t1, t2 @@ -2484,8 +2484,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding),utf8mb4_encoding FROM t1; u_decimal hex(utf8mb4_encoding) utf8mb4_encoding -1114111 1114111 3F ? +1114111 3F3F3F3F ???? 119040 3F ? 119070 3F ? 119070 3F3F3F3F3F3F3F3F3F3F ?????????? @@ -2505,7 +2505,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB ALTER TABLE t2 CONVERT TO CHARACTER SET utf8mb3; @@ -2517,7 +2517,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB ALTER TABLE t1 MODIFY utf8mb4_encoding VARCHAR(10) CHARACTER SET utf8mb3; @@ -2529,8 +2529,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding) FROM t1; u_decimal hex(utf8mb4_encoding) -1114111 1114111 3F +1114111 3F3F3F3F 119040 3F 119070 3F 119070 3F3F3F3F3F3F3F3F3F3F @@ -2550,8 +2550,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding) FROM t1; u_decimal hex(utf8mb4_encoding) -1114111 1114111 3F +1114111 3F3F3F3F 119040 3F 119070 3F 119070 3F3F3F3F3F3F3F3F3F3F @@ -2571,7 +2571,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB DROP TABLE IF EXISTS t3; diff --git a/mysql-test/r/ctype_utf8mb4_myisam.result b/mysql-test/r/ctype_utf8mb4_myisam.result index c4ff8e0a882..5bfdfe8ca71 100644 --- a/mysql-test/r/ctype_utf8mb4_myisam.result +++ b/mysql-test/r/ctype_utf8mb4_myisam.result @@ -225,7 +225,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 varchar(10) character set utf8mb4) engine MyISAM; insert into t1 values (0x41FF); @@ -233,7 +233,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (s1 text character set utf8mb4) engine MyISAM; insert into t1 values (0x41FF); @@ -241,7 +241,7 @@ Warnings: Warning 1366 Incorrect string value: '\xFF' for column 's1' at row 1 select hex(s1) from t1; hex(s1) -41 +413F drop table t1; create table t1 (a text character set utf8mb4, primary key(a(371))) engine MyISAM; ERROR 42000: Specified key was too long; max key length is 1000 bytes @@ -2285,7 +2285,7 @@ Warnings: Warning 1366 Incorrect string value: '\xF0\x8F\x80\x80' for column 'utf8mb4' at row 1 select hex(utf8mb4) from t1; hex(utf8mb4) - +3F F0908080 F0BFBFBF delete from t1; @@ -2305,7 +2305,7 @@ Warnings: Warning 1366 Incorrect string value: '\xF4\x90\x80\x80' for column 'utf8mb4' at row 1 select hex(utf8mb4) from t1; hex(utf8mb4) - +3F F4808080 F48F8080 drop table t1; @@ -2421,7 +2421,7 @@ Warning 1366 Incorrect string value: '\xF4\x8F\xBF\xBD' for column 'utf8mb3_enco UPDATE t2 SET utf8mb3_encoding= _utf8mb4 x'ea9da8' where u_decimal= 42856; SELECT HEX(CONCAT(utf8mb4_encoding, _utf8 x'ea9da8')) FROM t1; HEX(CONCAT(utf8mb4_encoding, _utf8 x'ea9da8')) -EA9DA8 +3F3F3F3FEA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 F09D8480EA9DA8 F09D849EEA9DA8 @@ -2435,40 +2435,40 @@ F3A087AFEA9DA8 F48FBFBFEA9DA8 SELECT HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) FROM t1,t2; HEX(CONCAT(utf8mb4_encoding, utf8mb3_encoding)) - -EA9DA8 -EFB9AB -EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB +3F3F3F3F3F3F3F3F +3F3F3F3FEA9DA8 +3F3F3F3FEFB9AB +EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9AB3F3F3F3F EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEA9DA8 EFB9ABF09D849EF09D859EF09D859EF09D8480F09D859FEFB9ABEFB9ABF09D85A0EFB9ABEFB9AB -F09D8480 +F09D84803F3F3F3F F09D8480EA9DA8 F09D8480EFB9AB -F09D849E +F09D849E3F3F3F3F F09D849EEA9DA8 F09D849EEFB9AB -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 -F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480 +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F +F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D84803F3F3F3F F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EA9DA8 F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB F09D849EF09D859EF09D859EF09D8480F09D859FF09D859FF09D859FF09D85A0F09D85A0F09D8480EFB9AB -F09D859E +F09D859E3F3F3F3F F09D859EEA9DA8 F09D859EEFB9AB -F09D878F +F09D878F3F3F3F3F F09D878FEA9DA8 F09D878FEFB9AB -F09D9C9F +F09D9C9F3F3F3F3F F09D9C9FEA9DA8 F09D9C9FEFB9AB -F09D9E9F +F09D9E9F3F3F3F3F F09D9E9FEA9DA8 F09D9E9FEFB9AB -F3A087AF +F3A087AF3F3F3F3F F3A087AFEA9DA8 F3A087AFEFB9AB -F48FBFBF +F48FBFBF3F3F3F3F F48FBFBFEA9DA8 F48FBFBFEFB9AB SELECT count(*) FROM t1, t2 @@ -2484,8 +2484,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding),utf8mb4_encoding FROM t1; u_decimal hex(utf8mb4_encoding) utf8mb4_encoding -1114111 1114111 3F ? +1114111 3F3F3F3F ???? 119040 3F ? 119070 3F ? 119070 3F3F3F3F3F3F3F3F3F3F ?????????? @@ -2505,7 +2505,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB ALTER TABLE t2 CONVERT TO CHARACTER SET utf8mb3; @@ -2517,7 +2517,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB ALTER TABLE t1 MODIFY utf8mb4_encoding VARCHAR(10) CHARACTER SET utf8mb3; @@ -2529,8 +2529,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding) FROM t1; u_decimal hex(utf8mb4_encoding) -1114111 1114111 3F +1114111 3F3F3F3F 119040 3F 119070 3F 119070 3F3F3F3F3F3F3F3F3F3F @@ -2550,8 +2550,8 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb4_encoding) FROM t1; u_decimal hex(utf8mb4_encoding) -1114111 1114111 3F +1114111 3F3F3F3F 119040 3F 119070 3F 119070 3F3F3F3F3F3F3F3F3F3F @@ -2571,7 +2571,7 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8 SELECT u_decimal,hex(utf8mb3_encoding) FROM t2; u_decimal hex(utf8mb3_encoding) -1114111 +1114111 3F3F3F3F 42856 EA9DA8 65131 EFB9AB DROP TABLE IF EXISTS t3; diff --git a/mysql-test/r/gis-precise.result b/mysql-test/r/gis-precise.result deleted file mode 100644 index c0b8b85d216..00000000000 --- a/mysql-test/r/gis-precise.result +++ /dev/null @@ -1,772 +0,0 @@ -DROP TABLE IF EXISTS t1; -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))')); -1 ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))')) -1 1 -select 0, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))')); -0 ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))')) -0 0 -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)')); -1 ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)')) -1 1 -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -1 ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) -1 1 -select 0, ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -0 ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) -0 0 -select 1, ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))')); -1 ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))')) -1 1 -create table t1 (g point); -insert into t1 values -(GeomFromText('POINT(2 2)')), (GeomFromText('POINT(2 4)')), (GeomFromText('POINT(2 6)')), (GeomFromText('POINT(2 8)')), -(GeomFromText('POINT(4 2)')), (GeomFromText('POINT(4 4)')), (GeomFromText('POINT(4 6)')), (GeomFromText('POINT(4 8)')), -(GeomFromText('POINT(6 2)')), (GeomFromText('POINT(6 4)')), (GeomFromText('POINT(6 6)')), (GeomFromText('POINT(6 8)')), -(GeomFromText('POINT(8 2)')), (GeomFromText('POINT(8 4)')), (GeomFromText('POINT(8 6)')), (GeomFromText('POINT(8 8)')); -select astext(g) from t1 where ST_Within(g, GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))')); -astext(g) -POINT(4 4) -POINT(6 2) -POINT(6 4) -POINT(6 6) -select 'Contains'; -Contains -Contains -select astext(g) from t1 where ST_Contains(GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g); -astext(g) -POINT(4 4) -POINT(6 2) -POINT(6 4) -POINT(6 6) -select 'Intersects'; -Intersects -Intersects -select astext(g) from t1 where ST_Intersects(GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g); -astext(g) -POINT(4 4) -POINT(6 2) -POINT(6 4) -POINT(6 6) -select 'Contains'; -Contains -Contains -select astext(g) from t1 where ST_Contains(GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1))'), g); -astext(g) -POINT(4 4) -POINT(6 2) -POINT(6 4) -POINT(6 6) -select 'Contains2'; -Contains2 -Contains2 -select astext(g) from t1 where ST_Contains(GeomFromText('POLYGON((5 1, 7 1, 7 7, 5 7, 3 3, 5 3, 5 1), (5.01 3.01, 6 5, 9 5, 8 3, 5.01 3.01))'), g); -astext(g) -POINT(4 4) -POINT(6 2) -POINT(6 6) -POINT(8 4) -DROP TABLE t1; -select 0, ST_Within(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -0 ST_Within(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) -0 0 -select 1, ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -1 ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) -1 1 -select 1, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)')); -1 ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)')) -1 1 -select 0, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)')); -0 ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)')) -0 1 -select 1, ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')); -1 ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) -1 1 -select astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))); -astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) -POLYGON((0 0,1 2,2 0,0 0)) -select astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))); -astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) -POINT(1 1) -select ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')); -ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) -1 -select ST_contains(GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), GeomFromText('POINT(5 10)')); -ST_contains(GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), GeomFromText('POINT(5 10)')) -0 -select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))')); -ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))')) -1 -select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')); -ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) -0 -select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')); -ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) -1 -select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))')); -ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))')) -0 -select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) -0.7071067811865475 -select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)')); -ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)')) -0 -select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) -0 -select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)')); -ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)')) -0.4472135954999579 -select ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) -0.8944271909999159 -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))) -POLYGON((26.47058823529412 23.823529411764707,21.951219512195124 27.439024390243905,23.855421686746986 29.819277108433734,29.289940828402365 26.36094674556213,26.47058823529412 23.823529411764707)) -select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)'))); -astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)'))) -MULTIPOINT(26.47058823529412 23.823529411764707,29.289940828402365 26.36094674556213,21.951219512195124 27.439024390243905,23.855421686746986 29.819277108433734) -select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)'))); -astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)'))) -POINT(29.289940828402365 26.36094674556213) -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)'))) -POINT(20 20) -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)'))) -LINESTRING(0 0,46.666666666666664 46.666666666666664) -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) -MULTILINESTRING((0 0,46.666666666666664 46.666666666666664),(8 10,45.33333333333333 47.33333333333333)) -select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); -astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) -GEOMETRYCOLLECTION(LINESTRING(-10 -10,0 0),LINESTRING(-11 -9,8 10),POLYGON((0 0,40 50,50 45,0 0)),LINESTRING(46.666666666666664 46.666666666666664,200 200,199 201,45.33333333333333 47.33333333333333)) -select astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))); -astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) -POLYGON((0 0,0 1,0.5 0.5,0 0)) -select astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))); -astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) -MULTIPOLYGON(((0 0,0.5 0.5,1 0,0 0)),((0.5 0.5,0 1,0 2,1 1,0.5 0.5))) -select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); -astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) -GEOMETRYCOLLECTION(LINESTRING(-10 -10,0 0),LINESTRING(-11 -9,8 10),POLYGON((0 0,40 50,50 45,0 0)),LINESTRING(46.666666666666664 46.666666666666664,200 200,199 201,45.33333333333333 47.33333333333333)) -select astext(ST_buffer(geometryfromtext('point(1 1)'), 1)); -astext(ST_buffer(geometryfromtext('point(1 1)'), 1)) -POLYGON((1 0,0.950932325672582 0.001204543794827595,0.9019828596704393 0.004815273327803182,0.8532695255446382 0.010823490035218986,0.8049096779838717 0.01921471959676957,0.7570198200967361 0.029968746805456026,0.7097153227455377 0.043059664267791065,0.6631101466077799 0.058455934816979194,0.6173165676349102 0.07612046748871326,0.5724449065697179 0.09601070687655666,0.5286032631740024 0.11807873565164506,0.48589725580677834 0.14227138999972788,0.4444297669803978 0.16853038769745476,0.40430069550756664 0.19679246851935517,0.3656067158363545 0.226989546637263,0.32844104515298167 0.2590488746450409,0.29289321881345254 0.29289321881345254,0.2590488746450409 0.32844104515298167,0.226989546637263 0.3656067158363545,0.19679246851935517 0.40430069550756664,0.16853038769745476 0.4444297669803978,0.14227138999972788 0.48589725580677834,0.11807873565164506 0.5286032631740024,0.09601070687655666 0.5724449065697179,0.07612046748871326 0.6173165676349102,0.058455934816979194 0.6631101466077799,0.043059664267791065 0.7097153227455377,0.029968746805456026 0.7570198200967361,0.01921471959676957 0.8049096779838717,0.010823490035218986 0.8532695255446382,0.004815273327803182 0.9019828596704393,0.001204543794827595 0.950932325672582,0 1,0.004815273327803182 1.0980171403295607,0.010823490035218986 1.146730474455362,0.01921471959676957 1.1950903220161284,0.029968746805456026 1.2429801799032638,0.043059664267791065 1.2902846772544623,0.058455934816979194 1.3368898533922202,0.07612046748871326 1.3826834323650898,0.09601070687655666 1.427555093430282,0.11807873565164506 1.4713967368259975,0.14227138999972788 1.5141027441932216,0.16853038769745476 1.5555702330196022,0.19679246851935517 1.5956993044924332,0.226989546637263 1.6343932841636455,0.2590488746450409 1.6715589548470184,0.29289321881345254 1.7071067811865475,0.32844104515298167 1.7409511253549592,0.3656067158363545 1.7730104533627369,0.40430069550756664 1.8032075314806448,0.4444297669803978 1.8314696123025453,0.48589725580677834 1.8577286100002721,0.5286032631740024 1.881921264348355,0.5724449065697179 1.9039892931234434,0.6173165676349102 1.9238795325112867,0.6631101466077799 1.9415440651830207,0.7097153227455377 1.956940335732209,0.7570198200967361 1.970031253194544,0.8049096779838717 1.9807852804032304,0.8532695255446382 1.9891765099647811,0.9019828596704393 1.9951847266721967,0.950932325672582 1.9987954562051724,1 2,1.049067674327418 1.9987954562051724,1.0980171403295607 1.9951847266721967,1.146730474455362 1.9891765099647811,1.1950903220161284 1.9807852804032304,1.2429801799032638 1.970031253194544,1.2902846772544623 1.956940335732209,1.3368898533922202 1.9415440651830207,1.3826834323650898 1.9238795325112867,1.427555093430282 1.9039892931234434,1.4713967368259975 1.881921264348355,1.5141027441932216 1.8577286100002721,1.5555702330196022 1.8314696123025453,1.5956993044924332 1.8032075314806448,1.6343932841636455 1.7730104533627369,1.6715589548470184 1.7409511253549592,1.7071067811865475 1.7071067811865475,1.7409511253549592 1.6715589548470184,1.7730104533627369 1.6343932841636455,1.8032075314806448 1.5956993044924332,1.8314696123025453 1.5555702330196022,1.8577286100002721 1.5141027441932216,1.881921264348355 1.4713967368259975,1.9039892931234434 1.427555093430282,1.9238795325112867 1.3826834323650898,1.9415440651830207 1.3368898533922202,1.956940335732209 1.2902846772544623,1.970031253194544 1.2429801799032638,1.9807852804032304 1.1950903220161284,1.9891765099647811 1.146730474455362,1.9951847266721967 1.0980171403295607,1.9987954562051724 1.049067674327418,2 1,1.9951847266721967 0.9019828596704393,1.9891765099647811 0.8532695255446382,1.9807852804032304 0.8049096779838717,1.970031253194544 0.7570198200967361,1.956940335732209 0.7097153227455377,1.9415440651830207 0.6631101466077799,1.9238795325112867 0.6173165676349102,1.9039892931234434 0.5724449065697179,1.881921264348355 0.5286032631740024,1.8577286100002721 0.48589725580677834,1.8314696123025453 0.4444297669803978,1.8032075314806448 0.40430069550756664,1.7730104533627369 0.3656067158363545,1.7409511253549592 0.32844104515298167,1.7071067811865475 0.29289321881345254,1.6715589548470184 0.2590488746450409,1.6343932841636455 0.226989546637263,1.5956993044924332 0.19679246851935517,1.5555702330196022 0.16853038769745476,1.5141027441932216 0.14227138999972788,1.4713967368259975 0.11807873565164506,1.427555093430282 0.09601070687655666,1.3826834323650898 0.07612046748871326,1.3368898533922202 0.058455934816979194,1.2902846772544623 0.043059664267791065,1.2429801799032638 0.029968746805456026,1.1950903220161284 0.01921471959676957,1.146730474455362 0.010823490035218986,1.0980171403295607 0.004815273327803182,1.049067674327418 0.001204543794827595,1 0)) -create table t1(geom geometrycollection); -insert into t1 values (geomfromtext('POLYGON((0 0, 10 10, 0 8, 0 0))')); -insert into t1 values (geomfromtext('POLYGON((1 1, 10 10, 0 8, 1 1))')); -select astext(geom), area(geom),round(area(ST_buffer(geom,2)), 7) from t1; -astext(geom) area(geom) round(area(ST_buffer(geom,2)), 7) -POLYGON((0 0,10 10,0 8,0 0)) 40 117.2416764 -POLYGON((1 1,10 10,0 8,1 1)) 36 108.5553959 -select ST_NUMPOINTS(ST_EXTERIORRING(ST_buffer(geom,2))) from t1; -ST_NUMPOINTS(ST_EXTERIORRING(ST_buffer(geom,2))) -133 -134 -set @geom=geomfromtext('LINESTRING(2 1, 4 2, 2 3, 2 5)'); -set @buff=ST_buffer(@geom,1); -select ST_NUMPOINTS(ST_EXTERIORRING(@buff)); -ST_NUMPOINTS(ST_EXTERIORRING(@buff)) -202 -DROP TABLE t1; -select st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)')); -st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)')) -0 -select st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)')); -st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)')) -1 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)')) -1 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)')) -0 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)')) -0 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))')) -1 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))')) -1 -SELECT ST_Equals(PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),PolyFromText('POLYGON((67 13, 67 18, 59 19, 59 13, 59 13, 67 13) )')) as result; -result -0 -SELECT ST_Equals(PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),PolyFromText('POLYGON((67 13, 67 18, 59 18, 59 13, 59 13, 67 13) )')) as result; -result -1 -SELECT ST_Equals(PointFromText('POINT (12 13)'),PointFromText('POINT (12 13)')) as result; -result -1 -# -# BUG#11755628/47429: INTERSECTION FUNCTION CRASHED MYSQLD -# BUG#11759650/51979: UNION/INTERSECTION OF POLYGONS CRASHES MYSQL -# -SELECT ASTEXT(ST_UNION(GEOMFROMTEXT('POLYGON((525000 183300,525400 -183300,525400 18370, 525000 183700,525000 183300))'), -geomfromtext('POLYGON((525298.67 183511.53,525296.57 -183510.39,525296.42 183510.31,525289.11 183506.62,525283.17 -183503.47,525280.98 183502.26,525278.63 183500.97,525278.39 -183500.84,525276.79 183500,525260.7 183491.55,525263.95 -183484.75,525265.58 183481.95,525278.97 183488.73,525276.5 -183493.45,525275.5 183495.7,525280.35 183498.2,525282.3 -183499.1,525282.2 183499.3,525283.55 183500,525301.75 -183509.35,525304.45 183504.25,525307.85 183504.95,525304.5 -183510.83,525302.81 183513.8,525298.67 183511.53),(525275.06 -183489.89,525272.06 183488.37,525268.94 183494.51,525271.94 -183496.03,525275.06 183489.89),(525263.26 183491.55,525266.15 -183493.04,525269.88 183485.82,525266.99 183484.33,525263.26 -183491.55))'))) st_u; -st_u -MULTIPOLYGON(((525400 18370,525000.9677614468 183300,525400 183300,525400 18370)),((525000 183300,525000 183700,525000.9677614468 183300,525000 183300)),((525265.58 183481.95,525263.95 183484.75,525260.7 183491.55,525276.79 183500,525278.39 183500.84,525278.63 183500.97,525280.98 183502.26,525283.17 183503.47,525289.11 183506.62,525296.42 183510.31,525296.57 183510.39,525298.67 183511.53,525302.81 183513.8,525304.5 183510.83,525307.85 183504.95,525304.45 183504.25,525301.75 183509.35,525283.55 183500,525282.2 183499.3,525282.3 183499.1,525280.35 183498.2,525275.5 183495.7,525276.5 183493.45,525278.97 183488.73,525265.58 183481.95),(525266.99 183484.33,525263.26 183491.55,525266.15 183493.04,525269.88 183485.82,525266.99 183484.33),(525272.06 183488.37,525268.94 183494.51,525271.94 183496.03,525275.06 183489.89,525272.06 183488.37))) -SET @a=0x0000000001030000000200000005000000000000000000000000000000000000000000000000002440000000000000000000000000000024400000000000002440000000000000000000000000000024400000000000000000000000000000000000000000000000000000F03F000000000000F03F0000000000000040000000000000F03F00000000000000400000000000000040000000000000F03F0000000000000040000000000000F03F000000000000F03F; -SELECT ASTEXT(TOUCHES(@a, GEOMFROMTEXT('point(0 0)'))) t; -t -NULL -SELECT astext(ST_UNION ( -PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'), -ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))'))))); -astext(ST_UNION ( -PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'), -ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))'))))) -GEOMETRYCOLLECTION(POLYGON((0 0,1 9,8 2,0 0),(2 2,2 7,3 2,2 2)),LINESTRING(0.5555555555555556 5,0 5,0 0,5 0,5 1.25),LINESTRING(2 5,2.4 5)) -SELECT astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0)); -astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0)) -LINESTRING(0 0,1 1) -SELECT Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5); -Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5) -78.68426 -SELECT ST_INTERSECTION(NULL, NULL); -ST_INTERSECTION(NULL, NULL) -NULL -SELECT ASTEXT(ST_INTERSECTION( -MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)), - ((0 5,3 5,3 0,0 0,0 1,2 1,2 2,0 2,0 5), (1 3,2 3,2 4,1 4,1 3)), - ((2 2,5 2,4 4,2 8,2 2)))'), -MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 4,2 5,3 5)), - ((2 2,9 2,0 2,2 6,2 2)), - ((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), - ((9 9,6 8,7 0,9 9)))'))); -ASTEXT(ST_INTERSECTION( -MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)), - ((0 5,3 5,3 0,0 0,0 1,2 1,2 2,0 2,0 5), (1 3,2 3,2 4,1 4,1 3)), - ((2 2,5 2,4 4,2 8,2 2)))'), -MULTIPOLY -POLYGON((0 2,1 4,1 3,2 3,2 4,1 4,1.5 5,2 5,2 8,8 8,8 2,0 2),(4 4,4 6,6 6,6 4,4 4)) -SELECT ROUND(ST_LENGTH(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), - (8 2,1 3,9 0,4 4))'), -MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6))'))), 7); -ROUND(ST_LENGTH(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), - (8 2,1 3,9 0,4 4))'), -MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6) -90.2783626 -SELECT ST_NUMGEOMETRIES((ST_UNION(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 0,4 2,0 2,1 5,0 3,7 0,8 5,5 8), - (6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), - (7 8,3 1,0 9,6 0,4 8), - (9 3,0 4,5 9,6 4), - (8 2,1 3,9 0,4 4))'), -MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 0,9 3,2 5,3 6,3 2), - (2 5,6 7,9 7,5 2,1 6,3 6))')), -MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((7 7,3 7,3 1,7 8,7 7)), - ((3 5,2 4,2 5,3 5)), - ((7 7,8 7,3 7,7 7,7 7)), - ((0 5,3 5,3 4,1 4,1 3,3 3,3 0,0 0,0 5), (1 1,2 1,2 2,1 2,1 1)))')))); -ST_NUMGEOMETRIES((ST_UNION(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 0,4 2,0 2,1 5,0 3,7 0,8 5,5 8), - (6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), - -192 -SELECT Round(ST_AREA(ST_BUFFER( ST_UNION( -POLYGONFROMTEXT('POLYGON((7 7, 7 7, 7 4, 7 7, 7 7))'), -POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6); -Round(ST_AREA(ST_BUFFER( ST_UNION( -POLYGONFROMTEXT('POLYGON((7 7, 7 7, 7 4, 7 7, 7 7))'), -POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6) -21.901344 -SELECT AsText(ST_UNION(MultiPolygonFromText(' - MULTIPOLYGON(((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)), - ((0 0, 8 3, 7 4, 0 0)), - ((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)))'), -MultiPolygonFromText(' MULTIPOLYGON(((0 0, 1 9, 4 6, 0 0)), - ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1)), - ((7 7, 4 7, 6 3, 7 2, 7 7)), - ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1))) '))); -AsText(ST_UNION(MultiPolygonFromText(' - MULTIPOLYGON(((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)), - ((0 0, 8 3, 7 4, 0 0)), - ((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)))'), -MultiPolygonFr -POLYGON((0 0,0 5,0.5555555555555556 5,1 9,2 8,8 8,8 2,5.333333333333334 2,3 1.125,3 0,0 0),(1 1,1 1.5,1.3333333333333333 2,2 2,2 1.1428571428571428,1.75 1,1 1),(3 1.7142857142857142,3 2,3.5 2,3 1.7142857142857142),(4 4,4 6,4.5 6,5.5 4,4 4)) -SELECT AsText(ST_SYMDIFFERENCE( -MultiLineStringFromText('MULTILINESTRING((7 7, 1 7, 8 5, 7 8, 7 7), - (6 3, 3 4, 1 1, 9 9, 9 0, 8 4, 9 9))'), -Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)')))); -AsText(ST_SYMDIFFERENCE( -MultiLineStringFromText('MULTILINESTRING((7 7, 1 7, 8 5, 7 8, 7 7), - (6 3, 3 4, 1 1, 9 9, 9 0, 8 4, 9 9))'), -Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)')))) -GEOMETRYCOLLECTION(POLYGON((0 0,0 9,7 9,7 0,0 0)),LINESTRING(9 9,8 4,9 0,9 9),LINESTRING(7 5.285714285714286,8 5,7.25 7.25),LINESTRING(7 7,7.25 7.25),LINESTRING(7.25 7.25,7 8),LINESTRING(7.25 7.25,9 9)) -SELECT AsText(ST_UNION( -MultiPolygonFromText('MULTIPOLYGON(((9 9, 7 9, 1 1, 9 9)), - ((2 2, 1 2, 3 3, 2 2, 2 2)), - ((0 0, 7 5, 9 6, 0 0)), - ((7 7, 5 7, 1 5, 7 1, 7 7)))'), -MultiPolygonFromText('MULTIPOLYGON(((2 2, 2 2, 1 5, 2 7, 2 2)), - ((0 5, 3 5, 3 0, 0 0, 0 5), (1 1, 2 1, 2 4, 1 4, 1 1)))'))); -AsText(ST_UNION( -MultiPolygonFromText('MULTIPOLYGON(((9 9, 7 9, 1 1, 9 9)), - ((2 2, 1 2, 3 3, 2 2, 2 2)), - ((0 0, 7 5, 9 6, 0 0)), - -POLYGON((0 0,0 5,1 5,2 7,2 5.5,5 7,5.5 7,7 9,9 9,7 7,7 5,9 6,7 4.666666666666667,7 1,4.25 2.833333333333333,3 2,3 0,0 0),(1 1,1 4,1.3333333333333333 4,1.8571428571428572 2.4285714285714284,1 2,1.75 2,1 1,2 2,2 1.4285714285714284,1.4 1,1 1),(1.5 1,2 1.3333333333333333,2 1,1.5 1),(3 2.142857142857143,3 3,3.4 3.4,4.1034482758620685 2.9310344827586206,3 2.142857142857143)) -SELECT AsText( ST_INTERSECTION( -LinestringFromText('LINESTRING( 3 5, 2 5, 2 4, 3 4, 3 5 ) ') , -LinestringFromText('LINESTRING( 3 5, 2 4, 2 5, 3 5 ) ') -)); -AsText( ST_INTERSECTION( -LinestringFromText('LINESTRING( 3 5, 2 5, 2 4, 3 4, 3 5 ) ') , -LinestringFromText('LINESTRING( 3 5, 2 4, 2 5, 3 5 ) ') -)) -LINESTRING(2 4,2 5,3 5) -SELECT AsText( ST_UNION( -PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') , -PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) ); -AsText( ST_UNION( -PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') , -PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) ) -POLYGON((2 0,2 5,3 3,3 2,7 5,2 0)) -SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))); -AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))) -GEOMETRYCOLLECTION EMPTY -SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))'))); -AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))'))) -GEOMETRYCOLLECTION(POINT(8 1),LINESTRING(2 4,2 5,3 5,3 4,2 4)) -SELECT ST_DISTANCE(POINTFROMTEXT('POINT(7 1)'),MULTILINESTRINGFROMTEXT('MULTILINESTRING( - (4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))')); -ST_DISTANCE(POINTFROMTEXT('POINT(7 1)'),MULTILINESTRINGFROMTEXT('MULTILINESTRING( - (4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))')) -1 -SELECT AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))'))); -AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))'))) -GEOMETRYCOLLECTION(POLYGON((2 0,2 2,3 2,3 6,12 9,3 0,3 1,2 0)),LINESTRING(5 2,7 2)) -SELECT ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 2 5, 7 6, 1 8),(0 0 ,1 6 ,0 1, 8 9, 2 4, 6 1, 3 5, 4 8), (9 3, 5 4, 1 8, 4 2, 5 8, 3 0))' ) , -MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 3 1, 2 7, 4 2, 6 2, 1 5))') -), 16))); -ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 2 5, 7 6, 1 8),(0 0 ,1 6 ,0 1, 8 9, 2 4, 6 1, 3 5, 4 8), (9 3, 5 4, 1 8, 4 2, 5 8, 3 0))' ) , -MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 3 1, 2 7, 4 2, 6 2 -278 -SELECT ST_NUMGEOMETRIES(ST_DIFFERENCE ( -ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 4 , 5 0 , 2 9 , 6 2 , 0 2 ) , ( 4 3 , 5 6 , 9 4 , 0 7 , 7 2 , 2 0 , 8 2 ) , ( 5 0 , 1 5 , 3 7 , 7 7 ) , ( 2 3 , 9 5 , 2 0 , 8 1 ) , ( 0 9 , 9 3 , 2 8 , 8 1 , 9 4 ) ) ' ), -ST_UNION ( -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 7 2 , 6 2 , 2 6 , 2 2 ) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , -ENVELOPE( -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) -) -) -), -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 9 , 1 3 , 7 3 , 8 5 ) , ( 5 0 , 8 1 , 2 0 , 7 4 , 1 0 ) , ( 9 2 , 5 2 , 6 5 , 8 8 , 0 2 ) , ( 0 8 , 3 9 , 4 0 , 1 0 ) , ( 0 0 , 7 6 , 8 3 , 0 0 ) ) ' ) -)); -ST_NUMGEOMETRIES(ST_DIFFERENCE ( -ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 4 , 5 0 , 2 9 , 6 2 , 0 2 ) , ( 4 3 , 5 6 , 9 4 , 0 7 , 7 2 , 2 0 , 8 2 ) , ( 5 0 , 1 5 , 3 7 , 7 7 ) , ( 2 3 , 9 5 , 2 0 , 8 1 ) , ( 0 9 , 9 3 , 2 8 , 8 1 , 9 4 ) -125 -SELECT ASTEXT(ST_DIFFERENCE ( -POLYGONFROMTEXT( ' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ' ) , -ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ' ) , -ST_SYMDIFFERENCE ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 3 8 , 0 8 , 6 6 , 6 1 , 0 5 , 6 7 , 3 7 ) , ( 5 8 , 7 7 , 9 0 , 8 7 ) , ( 1 5 , 1 8 , 2 3 , 3 9 ) , ( 1 3 , 9 7 , 5 5 , 0 8 , 6 9 ) , ( 3 6 , 6 9 , 8 7 , 0 2 , 4 6 , 9 5 ) ) ' ) , -ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 9 4 , 2 0 , 2 2 , 7 2 , 6 2 ) , ( 5 2 , 8 2 , 4 8 , 3 4 ) , ( 1 0 , 1 4 , 2 7 , 7 0 , 1 5 ) , ( 2 8 , 4 4 , 5 0 , 7 0 , 4 0 ) ) ' ) , -GEOMETRYFROMTEXT( ' MULTILINESTRING( ( 3 7 , 7 3 , 5 8 , 4 8 ) , ( 3 2 , 5 0 , 9 3 , 4 4 ) , ( 6 0 , 4 2 , 7 8 , 1 3 ) ) ' ) -) -) -) -)); -ASTEXT(ST_DIFFERENCE ( -POLYGONFROMTEXT( ' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ' ) , -ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ' ) , -ST_SYMDIFFERENCE ( -MULTILINESTRINGFROMTEX -POLYGON((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)) -SELECT ST_NUMGEOMETRIES(ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 0 8 , 1 9 , 5 7 , 2 8 , 5 8 , 6 7 ) , ( 4 5 , 8 4 , 0 3 , 5 1 ) , ( 6 8 , 2 7 , 1 6 , 9 9 , 7 2 ) , ( 9 5 , 2 8 , 1 2 , 9 6 , 2 0 ) ) ' ) , -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 7 7 , 2 7, 6 8, 7 1 , 7 7 ) ) ) ' ) -)); -ST_NUMGEOMETRIES(ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 0 8 , 1 9 , 5 7 , 2 8 , 5 8 , 6 7 ) , ( 4 5 , 8 4 , 0 3 , 5 1 ) , ( 6 8 , 2 7 , 1 6 , 9 9 , 7 2 ) , ( 9 5 , 2 8 , 1 2 , 9 6 , 2 0 ) ) ' ) , -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( -50 -SELECT ST_BUFFER ( -LINESTRINGFROMTEXT( ' LINESTRING( 5 4 , 3 8 , 2 6 , 5 5 , 7 9 ) ' ) , -ST_DISTANCE ( -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) , -ST_DIFFERENCE ( -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) -) -) -) ; -ST_BUFFER ( -LINESTRINGFROMTEXT( ' LINESTRING( 5 4 , 3 8 , 2 6 , 5 5 , 7 9 ) ' ) , -ST_DISTANCE ( -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) , -ST_DIFFERENCE ( -MULTIPOL -NULL -SELECT ST_DISTANCE ( ST_DIFFERENCE ( MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) ), MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) ) ; -ST_DISTANCE ( ST_DIFFERENCE ( MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , -NULL -SELECT ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5)))'), geomETRYFROMTEXT(' MULTILINESTRING( ( 5 1 , 3 7 , 6 1 , 7 0 ) , ( 1 6 , 8 5 , 7 5 , 5 6 ) )') )); -ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5)) -MULTIPOINT(7 5,7 5.142857142857142,5.899999999999998 5.300000000000001,5.799999999999997 5.600000000000001,3 7) -SELECT ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) ')); -ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) ')) -0 -SELECT ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') ); -ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') ) -0 -SELECT ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) ')); -ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) ')) -1 -select ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY'))); -ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY'))) -GEOMETRYCOLLECTION EMPTY -SELECT ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') ); -ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') ) -0 -SELECT ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') ); -ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') ) -0 -SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') ); -ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') ) -0 -SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') ); -ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') ) -1 -SELECT ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ')); -ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ')) -0 -SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') ); -ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19, -1 -SELECT ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER( POLYGONFROMTEXT( 'POLYGON( ( 0.0 -3.0, - -2.910427500435995 0.727606875108998, - -0.910427500435995 8.727606875108998, - 7.664100588675687 1.503849116986468, - 1.664100588675687 -2.496150883013531, - 0.0 -3.0 -))' ), 3 ))); -ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER( POLYGONFROMTEXT( 'POLYGON( ( 0.0 -3.0, - -2.910427500435995 0.727606875108998, - -0.910427500435995 8.727606875108998, - 7.664100588675687 1.503849116986468, - 1.664100588675687 -2.496150883013531, - 0.0 -3.0 -))' ), -136 -select astext(buffer(st_linestringfromwkb(linestring(point(-1,1), point(-1,-2))),-1)); -astext(buffer(st_linestringfromwkb(linestring(point(-1,1), point(-1,-2))),-1)) -GEOMETRYCOLLECTION EMPTY -DROP TABLE IF EXISTS p1; -CREATE PROCEDURE p1(dist DOUBLE, geom TEXT) -BEGIN -DECLARE g GEOMETRY; -SET g=GeomFromText(geom); -SELECT geom AS `-----`; -SELECT dist, GeometryType(@buf:=ST_Buffer(g, dist)) AS `buffer`, ROUND(ST_AREA(@buf),2) AS buf_area; -END| -# -# Testing ST_BUFFER with positive distance -# ------ -POINT(0 0)) -dist buffer buf_area -1 POLYGON 3.14 ------ -LineString(0 1, 1 1)) -dist buffer buf_area -1 POLYGON 5.14 ------ -LineString(9 9,8 1,1 5,0 0) -dist buffer buf_area -1 POLYGON 44.63 ------ -Polygon((2 2,2 8,8 8,8 2,2 2)) -dist buffer buf_area -1 POLYGON 63.14 ------ -Polygon((0 0,0 8,8 8,8 0,0 0),(2 2,6 2,6 6,2 6,2 2)) -dist buffer buf_area -1 POLYGON 95.14 ------ -Polygon((0 0, 0 8, 8 8, 8 10, -10 10, -10 0, 0 0)) -dist buffer buf_area -1 POLYGON 174.93 ------ -MultiPoint(9 9,8 1,1 5) -dist buffer buf_area -1 MULTIPOLYGON 9.42 ------ -MultiLineString((0 0,2 2)) -dist buffer buf_area -1 POLYGON 8.80 ------ -MultiLineString((0 0,2 2,0 4)) -dist buffer buf_area -1 POLYGON 14.24 ------ -MultiLineString((0 0,2 2),(0 2,2 0)) -dist buffer buf_area -1 POLYGON 13.59 ------ -MultiLineString((2 2,2 8,-2 8),(-6 -6, 6 6),(10 10, 14 14)) -dist buffer buf_area -1 MULTIPOLYGON 70.06 ------ -MultiPolygon(((2 2,2 8,8 8,8 2,2 2)), ((9 9,8 1,1 5,9 9))) -dist buffer buf_area -1 POLYGON 73.18 ------ -MultiPolygon(((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)),((9 9,8 1,1 5,9 9))) -dist buffer buf_area -1 POLYGON 73.18 ------ -GeometryCollection(Point(0 0)) -dist buffer buf_area -1 POLYGON 3.14 ------ -GeometryCollection(LineString(0 0, 2 2))) -dist buffer buf_area -1 POLYGON 8.80 ------ -GeometryCollection(Polygon((2 2,2 8,8 8,8 2,2 2)))) -dist buffer buf_area -1 POLYGON 63.14 ------ -GeometryCollection(MultiPoint(9 9,8 1,1 5)) -dist buffer buf_area -1 MULTIPOLYGON 9.42 ------ -GeometryCollection(MultiLineString((0 0,0 1),(3 0,3 1))) -dist buffer buf_area -1 MULTIPOLYGON 10.28 ------ -GeometryCollection(MultiPolygon(((0 0, 3 0, 3 3, 0 3, 0 0)),((6 6,6 9,9 9,9 6,6 6)))) -dist buffer buf_area -1 MULTIPOLYGON 48.28 ------ -GeometryCollection(Point(9 9),LineString(1 5,0 0),Polygon((2 2,2 8,8 8,8 2,2 2))) -dist buffer buf_area -1 POLYGON 75.92 -# -# Testing ST_BUFFER with zero distance -# ------ -POINT(0 0)) -dist buffer buf_area -0 POINT 0.00 ------ -LineString(0 1, 1 1)) -dist buffer buf_area -0 LINESTRING 0.00 ------ -LineString(9 9,8 1,1 5,0 0) -dist buffer buf_area -0 LINESTRING 0.00 ------ -Polygon((2 2,2 8,8 8,8 2,2 2)) -dist buffer buf_area -0 POLYGON 36.00 ------ -Polygon((0 0,0 8,8 8,8 0,0 0),(2 2,6 2,6 6,2 6,2 2)) -dist buffer buf_area -0 POLYGON 48.00 ------ -Polygon((0 0, 0 8, 8 8, 8 10, -10 10, -10 0, 0 0)) -dist buffer buf_area -0 POLYGON 116.00 ------ -MultiPoint(9 9,8 1,1 5) -dist buffer buf_area -0 MULTIPOINT NULL ------ -MultiLineString((0 0,2 2)) -dist buffer buf_area -0 MULTILINESTRING NULL ------ -MultiLineString((0 0,2 2,0 4)) -dist buffer buf_area -0 MULTILINESTRING NULL ------ -MultiLineString((0 0,2 2),(0 2,2 0)) -dist buffer buf_area -0 MULTILINESTRING NULL ------ -MultiLineString((2 2,2 8,-2 8),(-6 -6, 6 6),(10 10, 14 14)) -dist buffer buf_area -0 MULTILINESTRING NULL ------ -MultiPolygon(((2 2,2 8,8 8,8 2,2 2)), ((9 9,8 1,1 5,9 9))) -dist buffer buf_area -0 MULTIPOLYGON 66.00 ------ -MultiPolygon(((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)),((9 9,8 1,1 5,9 9))) -dist buffer buf_area -0 MULTIPOLYGON 62.00 ------ -GeometryCollection(Point(0 0)) -dist buffer buf_area -0 GEOMETRYCOLLECTION 0.00 ------ -GeometryCollection(LineString(0 0, 2 2))) -dist buffer buf_area -0 GEOMETRYCOLLECTION 0.00 ------ -GeometryCollection(Polygon((2 2,2 8,8 8,8 2,2 2)))) -dist buffer buf_area -0 GEOMETRYCOLLECTION 36.00 ------ -GeometryCollection(MultiPoint(9 9,8 1,1 5)) -dist buffer buf_area -0 GEOMETRYCOLLECTION NULL ------ -GeometryCollection(MultiLineString((0 0,0 1),(3 0,3 1))) -dist buffer buf_area -0 GEOMETRYCOLLECTION NULL ------ -GeometryCollection(MultiPolygon(((0 0, 3 0, 3 3, 0 3, 0 0)),((6 6,6 9,9 9,9 6,6 6)))) -dist buffer buf_area -0 GEOMETRYCOLLECTION 18.00 ------ -GeometryCollection(Point(9 9),LineString(1 5,0 0),Polygon((2 2,2 8,8 8,8 2,2 2))) -dist buffer buf_area -0 GEOMETRYCOLLECTION 36.00 -# -# Testing ST_BUFFER with negative distance -# ------ -POINT(0 0)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -LineString(0 1, 1 1)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -LineString(9 9,8 1,1 5,0 0) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -Polygon((2 2,2 8,8 8,8 2,2 2)) -dist buffer buf_area --1 POLYGON 16.00 ------ -MultiPoint(9 9,8 1,1 5) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -MultiLineString((0 0,2 2)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -MultiLineString((0 0,2 2,0 4)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -MultiLineString((0 0,2 2),(0 2,2 0)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -MultiLineString((2 2,2 8,-2 8),(-6 -6, 6 6),(10 10, 14 14)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -GeometryCollection(Point(0 0)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -GeometryCollection(LineString(0 0, 2 2))) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -GeometryCollection(Polygon((2 2,2 8,8 8,8 2,2 2)))) -dist buffer buf_area --1 POLYGON 16.00 ------ -GeometryCollection(MultiPoint(9 9,8 1,1 5)) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -GeometryCollection(MultiLineString((0 0,0 1),(3 0,3 1))) -dist buffer buf_area --1 GEOMETRYCOLLECTION 0.00 ------ -GeometryCollection(Point(9 9),LineString(1 5,0 0),Polygon((2 2,2 8,8 8,8 2,2 2))) -dist buffer buf_area --1 POLYGON 16.00 -SELECT ST_CONTAINS( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')); -ST_CONTAINS( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')) -0 -SELECT AsText(ST_UNION( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))); -AsText(ST_UNION( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))) -GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)),POLYGON((6 6,6 11,11 11,11 6,6 6)),POINT(5 10)) -DROP PROCEDURE p1; -# -# Bug #13833019 ASSERTION `T1->RESULT_RANGE' FAILED IN GCALC_OPERATION_REDUCER::END_COUPLE -# -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) -POLYGON -# -# Bug #13832749 HANDLE_FATAL_SIGNAL IN GCALC_FUNCTION::COUNT_INTERNAL -# -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) -POLYGON -# -# Bug#13358363 - ASSERTION: N > 0 && N < SINUSES_CALCULATED*2+1 | GET_N_SINCOS/ADD_EDGE_BUFFER -# -DO ST_BUFFER(ST_GEOMCOLLFROMTEXT('linestring(1 1,2 2)'),''); -SELECT ST_WITHIN( -LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), -ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))); -ST_WITHIN( -LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), -ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) ') -0 -SELECT ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))); -ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) -2 -SELECT ST_NUMINTERIORRINGS( -ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))); -ST_NUMINTERIORRINGS( -ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) -0 -SELECT ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))); -ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) -POLYGON((9 9,5 2,4 5,9 9)) diff --git a/mysql-test/r/gis.result b/mysql-test/r/gis.result index 4f65aa2e500..32799f15de2 100644 --- a/mysql-test/r/gis.result +++ b/mysql-test/r/gis.result @@ -404,7 +404,7 @@ Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t, Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; first second w c o e d t i r -120 120 1 1 0 1 0 1 1 0 +120 120 1 1 0 1 0 0 1 0 120 121 0 0 1 0 0 0 1 0 120 122 NULL NULL NULL NULL NULL NULL NULL NULL 120 123 NULL NULL NULL NULL NULL NULL NULL NULL @@ -1378,7 +1378,7 @@ SELECT IsRing(LineFromWKB(AsBinary(Boundary(boundary)),SRID(boundary))) FROM named_places WHERE name = 'Goose Island'; IsRing(LineFromWKB(AsBinary(Boundary(boundary)),SRID(boundary))) -0 +1 # Conformance Item T21 SELECT GLength(centerline) FROM road_segments @@ -1765,3 +1765,36 @@ SRID 0 0 drop table t1; +# +# MDEV-7510 GIS: IsRing returns false for a primitive triangle. +# +select ST_IsRing(ST_LineFromText('LINESTRING(0 0,0 10,10 10,0 0)')); +ST_IsRing(ST_LineFromText('LINESTRING(0 0,0 10,10 10,0 0)')) +1 +select ST_IsRing(ST_LineFromText('LINESTRING(0 0,0 10,10 10,-10 -10, 0 -10, 0 0)')); +ST_IsRing(ST_LineFromText('LINESTRING(0 0,0 10,10 10,-10 -10, 0 -10, 0 0)')) +0 +# +# MDEV-7514 GIS: PointOnSurface returns NULL instead of the point. +# +SELECT ST_GEOMETRYTYPE(ST_PointOnSurface(ST_PolyFromText('POLYGON((-70.916 42.1002,-70.9468 42.0946,-70.9754 42.0875,-70.9749 42.0879,-70.9759 42.0897,-70.916 42.1002))'))); +ST_GEOMETRYTYPE(ST_PointOnSurface(ST_PolyFromText('POLYGON((-70.916 42.1002,-70.9468 42.0946,-70.9754 42.0875,-70.9749 42.0879,-70.9759 42.0897,-70.916 42.1002))'))) +NULL +# +# MDEV-7529 GIS: ST_Relate returns unexpected results for POINT relations +# +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'T*F**FFF*') AS equals; +equals +1 +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'T*****FF*') AS contains; +contains +1 +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'T*F**F***') AS within; +within +1 +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(1 1)'),'FF*FF****') as disjoint; +disjoint +1 +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'FF*FF****') as disjoint; +disjoint +0 diff --git a/mysql-test/r/mysql.result b/mysql-test/r/mysql.result index cb705d285fe..82d69557f0d 100644 --- a/mysql-test/r/mysql.result +++ b/mysql-test/r/mysql.result @@ -519,5 +519,17 @@ a | a | | aaaaaaaaaaaaaaaaa | +-------------------+ +# +# Start of 10.1 tests +# +# +# MDEV-6572 "USE dbname" with a bad sequence erroneously connects to a wrong database +# +# +# End of 10.1 tests +# +ERROR 1300 (HY000): Invalid utf8 character string: 'test\xF0\x9F\x98\x81 ' +ERROR 1300 (HY000): Invalid binary character string: 'test\xF0\x9F\x98\x81 ' +ERROR 1300 (HY000) at line 2: Invalid utf8 character string: 'test\xF0\x9F\x98\x81' End of tests diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index fe528e1b2e9..78a224b1439 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -618,10 +618,10 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref a a 11 const 2 Using index condition explain select * from t1 where a=binary 'aaa'; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range a a 11 NULL 2 Using index condition +1 SIMPLE t1 ref a a 11 const 2 Using index condition explain select * from t1 where a='aaa' collate latin1_bin; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range a a 11 NULL 2 Using index condition +1 SIMPLE t1 ref a a 11 const 2 Using index condition explain select * from t1 where a='aaa' collate latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL a NULL NULL NULL 9 Using where diff --git a/mysql-test/r/range_mrr_icp.result b/mysql-test/r/range_mrr_icp.result index 62bea71173c..1b6e4cb9fe8 100644 --- a/mysql-test/r/range_mrr_icp.result +++ b/mysql-test/r/range_mrr_icp.result @@ -620,10 +620,10 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref a a 11 const 2 Using index condition explain select * from t1 where a=binary 'aaa'; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range a a 11 NULL 2 Using index condition; Rowid-ordered scan +1 SIMPLE t1 ref a a 11 const 2 Using index condition explain select * from t1 where a='aaa' collate latin1_bin; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range a a 11 NULL 2 Using index condition; Rowid-ordered scan +1 SIMPLE t1 ref a a 11 const 2 Using index condition explain select * from t1 where a='aaa' collate latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL a NULL NULL NULL 9 Using where diff --git a/mysql-test/r/set_statement.result b/mysql-test/r/set_statement.result index f3029750950..08072fccba5 100644 --- a/mysql-test/r/set_statement.result +++ b/mysql-test/r/set_statement.result @@ -1122,14 +1122,8 @@ set statement autocommit=default for select 1; ERROR 42000: The system variable autocommit cannot be set in SET STATEMENT. set statement tx_isolation=default for select 1; ERROR 42000: The system variable tx_isolation cannot be set in SET STATEMENT. -set statement rand_seed1=default for select 1; -ERROR 42000: The system variable rand_seed1 cannot be set in SET STATEMENT. -set statement rand_seed2=default for select 1; -ERROR 42000: The system variable rand_seed2 cannot be set in SET STATEMENT. set statement skip_replication=default for select 1; ERROR 42000: The system variable skip_replication cannot be set in SET STATEMENT. -set statement last_insert_id=1 for select 1; -ERROR 42000: The system variable last_insert_id cannot be set in SET STATEMENT. set statement sql_log_off=default for select 1; ERROR 42000: The system variable sql_log_off cannot be set in SET STATEMENT. set statement character_set_client=default for select 1; @@ -1216,3 +1210,13 @@ ERROR HY000: Unknown system variable 'non_existing' show errors; Level Code Message Error 1193 Unknown system variable 'non_existing' +# +# MDEV-6954: SET STATEMENT rand_seedX = ...FOR ... makes +# the next rand() to return 0 +# +set @rnd=1; +# test that rand() is not always 0 after restoring rand_seed, rand_seed2... +# @rnd should be 0 +select @rnd; +@rnd +0 diff --git a/mysql-test/r/set_statement_notembedded_binlog.result b/mysql-test/r/set_statement_notembedded_binlog.result index 9d201b79e51..f23d4e97748 100644 --- a/mysql-test/r/set_statement_notembedded_binlog.result +++ b/mysql-test/r/set_statement_notembedded_binlog.result @@ -17,3 +17,92 @@ x x x x x COMMIT x x x x x BEGIN GTID 20-1-1 x x x x x use `test`; set statement gtid_domain_id = 20 for insert into t1 values (3),(4) drop table t1; +reset master; +SET @a=11; +create table t1 (a int not null auto_increment, c int, d int, primary key (a)); +create table t2 (b int); +insert into t2 values (1),(2); +CREATE function f1() returns int +BEGIN +SET STATEMENT last_insert_id=@a for insert into t1 values (NULL, @a, +last_insert_id()); +SET @a:=@a*100+13; +return @a; +end| +call mtr.add_suppression("Unsafe statement written to the binary log using"); +select f1() from t2; +f1() +1113 +111313 +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly. +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave. +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly. +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave. +show binlog events limit 16, 100; +Log_name Pos Event_type Server_id End_log_pos Info +x x x x x LAST_INSERT_ID=0 +x x x x x INSERT_ID=1 +x x x x x @`a`=11 +x x x x x @`a`=11 +x x x x x use `test`; SELECT `test`.`f1`() +x x x x x LAST_INSERT_ID=0 +x x x x x INSERT_ID=2 +x x x x x @`a`=1113 +x x x x x @`a`=1113 +x x x x x use `test`; SELECT `test`.`f1`() +x x x x x COMMIT +select * from t1; +a c d +1 11 11 +2 1113 1113 +drop function f1; +drop table t1,t2; +reset master; +SET @a=11; +create table t1 (a int not null auto_increment, c int, d int, primary key (a)); +create table t2 (b int); +insert into t2 values (1),(2); +CREATE function f1() returns int +BEGIN +SET @save= @@last_insert_id; +SET session last_insert_id=@a; +insert into t1 values (NULL, @a, last_insert_id()); +SET session last_insert_id=@save; +SET @a:=@a*100+13; +return @a; +end| +select f1() from t2; +f1() +1113 +111313 +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly. +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave. +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly. +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave. +show binlog events limit 13, 100; +Log_name Pos Event_type Server_id End_log_pos Info +x x x x x LAST_INSERT_ID=0 +x x x x x INSERT_ID=1 +x x x x x @`a`=11 +x x x x x @`save`=0 +x x x x x use `test`; SELECT `test`.`f1`() +x x x x x LAST_INSERT_ID=0 +x x x x x INSERT_ID=2 +x x x x x @`a`=1113 +x x x x x @`save`=0 +x x x x x use `test`; SELECT `test`.`f1`() +x x x x x COMMIT +select * from t1; +a c d +1 11 11 +2 1113 1113 +drop function f1; +drop table t1,t2; +reset master; +set statement last_insert_id = 112 for create table t1 as select last_insert_id(); +show binlog events limit 4,1; +Log_name Pos Event_type Server_id End_log_pos Info +x x x x x LAST_INSERT_ID=112 +drop table t1; diff --git a/mysql-test/r/type_varchar.result b/mysql-test/r/type_varchar.result index 965d113124b..936f48e6122 100644 --- a/mysql-test/r/type_varchar.result +++ b/mysql-test/r/type_varchar.result @@ -549,5 +549,65 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 index PRIMARY PRIMARY 22 NULL 2 Using where; Using index DROP TABLE IF EXISTS t1,t2; # +# MDEV-6989 BINARY and COLLATE xxx_bin comparisions are not used for optimization in some cases +# +CREATE TABLE t1 (c1 VARCHAR(20) CHARACTER SET latin1, PRIMARY KEY(c1)); +INSERT INTO t1 VALUES ('a'),('b'),('c'),('d'); +SELECT * FROM t1 WHERE c1=BINARY 'a'; +c1 +a +EXPLAIN SELECT * FROM t1 WHERE c1=BINARY 'a'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 const PRIMARY PRIMARY 22 const 1 Using index +SELECT * FROM t1 WHERE c1=_latin1'a' COLLATE latin1_bin; +c1 +a +EXPLAIN SELECT * FROM t1 WHERE c1=_latin1'a' COLLATE latin1_bin; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 const PRIMARY PRIMARY 22 const 1 Using index +DROP TABLE t1; +CREATE TABLE t1 (c1 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_bin); +INSERT INTO t1 VALUES ('a'); +CREATE TABLE t2 (c1 VARCHAR(10) CHARACTER SET latin1, PRIMARY KEY(c1)); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +c1 c1 +a a +EXPLAIN SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 system NULL NULL NULL NULL 1 +1 SIMPLE t2 const PRIMARY PRIMARY 12 const 1 Using index +ALTER TABLE t1 MODIFY c1 VARBINARY(10); +SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +c1 c1 +a a +EXPLAIN SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 system NULL NULL NULL NULL 1 +1 SIMPLE t2 const PRIMARY PRIMARY 12 const 1 Using index +DROP TABLE t1, t2; +CREATE TABLE t1 (c1 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_bin); +INSERT INTO t1 VALUES ('a'),('c'); +CREATE TABLE t2 (c1 VARCHAR(10) CHARACTER SET latin1, PRIMARY KEY(c1)); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +c1 +a +c +# t2 should be eliminated +EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +ALTER TABLE t1 MODIFY c1 VARBINARY(10); +SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +c1 +a +c +# t2 should be eliminated +EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +DROP TABLE t1,t2; +# # End of 10.0 tests # diff --git a/mysql-test/suite/archive/archive_gis.result b/mysql-test/suite/archive/archive_gis.result index 97f48407db2..9f3c5b062a3 100644 --- a/mysql-test/suite/archive/archive_gis.result +++ b/mysql-test/suite/archive/archive_gis.result @@ -392,7 +392,7 @@ Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t, Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; first second w c o e d t i r -120 120 1 1 0 1 0 1 1 0 +120 120 1 1 0 1 0 0 1 0 120 121 0 0 1 0 0 0 1 0 121 120 0 0 1 0 0 0 1 0 121 121 1 1 0 1 0 1 1 0 diff --git a/mysql-test/suite/funcs_2/include/check_charset.inc b/mysql-test/suite/funcs_2/include/check_charset.inc index df4a58d0eeb..0242d4390ac 100644 --- a/mysql-test/suite/funcs_2/include/check_charset.inc +++ b/mysql-test/suite/funcs_2/include/check_charset.inc @@ -22,13 +22,15 @@ SHOW TABLE STATUS LIKE 't1'; --disable_warnings --disable_query_log +ALTER TABLE test.t1 ADD code VARCHAR(16) NOT NULL; let $1= 221; while ($1) { - eval INSERT INTO test.t1 VALUES(CHAR(254-$1)); + eval INSERT INTO test.t1 VALUES(CHAR(254-$1), HEX(254-$1)); dec $1; } DELETE FROM test.t1 WHERE CHAR_LENGTH(a) <> 1; +DELETE FROM test.t1 WHERE a='?' AND code<>'3F'; --enable_query_log --enable_warnings diff --git a/mysql-test/suite/innodb/r/innodb-update-insert.result b/mysql-test/suite/innodb/r/innodb-update-insert.result index cd0fed101ab..034a63bca6c 100644 --- a/mysql-test/suite/innodb/r/innodb-update-insert.result +++ b/mysql-test/suite/innodb/r/innodb-update-insert.result @@ -30,7 +30,7 @@ Warnings: Warning 1366 Incorrect string value: '\xA3' for column 'f1' at row 1 select f1 from t1; f1 - +? update t1 set f1=0x6a; update t1 set f3=repeat(0xb1,8103); update t1 set f1=0x4a; @@ -39,5 +39,5 @@ Warnings: Warning 1366 Incorrect string value: '\x82' for column 'f1' at row 1 select f1 from t1; f1 - +? drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb_bug59641.result b/mysql-test/suite/innodb/r/innodb_bug59641.result index 5062c69558b..476385fba6c 100644 --- a/mysql-test/suite/innodb/r/innodb_bug59641.result +++ b/mysql-test/suite/innodb/r/innodb_bug59641.result @@ -43,8 +43,8 @@ COMMIT; XA RECOVER; formatID gtrid_length bqual_length data 1 3 0 789 -1 3 0 456 1 3 0 123 +1 3 0 456 XA ROLLBACK '123'; XA ROLLBACK '456'; XA COMMIT '789'; diff --git a/mysql-test/suite/innodb/r/innodb_gis.result b/mysql-test/suite/innodb/r/innodb_gis.result index 21c1234d7d3..de5ff61357e 100644 --- a/mysql-test/suite/innodb/r/innodb_gis.result +++ b/mysql-test/suite/innodb/r/innodb_gis.result @@ -392,7 +392,7 @@ Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t, Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; first second w c o e d t i r -120 120 1 1 0 1 0 1 1 0 +120 120 1 1 0 1 0 0 1 0 120 121 0 0 1 0 0 0 1 0 121 120 0 0 1 0 0 0 1 0 121 121 1 1 0 1 0 1 1 0 diff --git a/mysql-test/suite/perfschema/r/server_init.result b/mysql-test/suite/perfschema/r/server_init.result index 20dc1309795..1bdb9884606 100644 --- a/mysql-test/suite/perfschema/r/server_init.result +++ b/mysql-test/suite/perfschema/r/server_init.result @@ -120,10 +120,6 @@ where name like "wait/synch/mutex/sql/LOCK_audit_mask"; count(name) 1 select count(name) from mutex_instances -where name like "wait/synch/mutex/sql/LOCK_xid_cache"; -count(name) -1 -select count(name) from mutex_instances where name like "wait/synch/mutex/sql/LOCK_plugin"; count(name) 1 diff --git a/mysql-test/suite/perfschema/r/setup_instruments_defaults.result b/mysql-test/suite/perfschema/r/setup_instruments_defaults.result index e502376b578..b0570d70602 100644 --- a/mysql-test/suite/perfschema/r/setup_instruments_defaults.result +++ b/mysql-test/suite/perfschema/r/setup_instruments_defaults.result @@ -5,14 +5,14 @@ SELECT * FROM performance_schema.setup_instruments WHERE name IN ( 'wait/synch/mutex/sql/LOCK_user_conn', 'wait/synch/mutex/sql/LOCK_uuid_generator', -'wait/synch/mutex/sql/LOCK_xid_cache', +'wait/synch/mutex/sql/LOCK_plugin', 'stage/sql/creating table') AND enabled = 'yes' AND timed = 'no' ORDER BY name; NAME ENABLED TIMED stage/sql/creating table YES NO +wait/synch/mutex/sql/LOCK_plugin YES NO wait/synch/mutex/sql/LOCK_user_conn YES NO -wait/synch/mutex/sql/LOCK_xid_cache YES NO SELECT * FROM performance_schema.setup_instruments WHERE name = 'wait/synch/mutex/sql/LOCK_thread_count' AND enabled = 'no' AND timed = 'no'; diff --git a/mysql-test/suite/perfschema/t/server_init.test b/mysql-test/suite/perfschema/t/server_init.test index d5a7e18827d..c6d25f18426 100644 --- a/mysql-test/suite/perfschema/t/server_init.test +++ b/mysql-test/suite/perfschema/t/server_init.test @@ -117,9 +117,6 @@ select count(name) from mutex_instances select count(name) from mutex_instances where name like "wait/synch/mutex/sql/LOCK_audit_mask"; -select count(name) from mutex_instances - where name like "wait/synch/mutex/sql/LOCK_xid_cache"; - select count(name) from mutex_instances where name like "wait/synch/mutex/sql/LOCK_plugin"; diff --git a/mysql-test/suite/perfschema/t/setup_instruments_defaults-master.opt b/mysql-test/suite/perfschema/t/setup_instruments_defaults-master.opt index 408eb5c79d2..ed6702ed5ef 100644 --- a/mysql-test/suite/perfschema/t/setup_instruments_defaults-master.opt +++ b/mysql-test/suite/perfschema/t/setup_instruments_defaults-master.opt @@ -12,7 +12,7 @@ --loose-performance-schema-instrument='wait/synch/mutex/sql/LOCK_thread_count=OFF' --loose-performance-schema-instrument=' wait/synch/mutex/sql/LOCK_user_conn = COUNTED' --loose-performance-schema-instrument='wait%/synch/mutex/sql/LOCK_uu%_genera%/= COUNTED' ---loose-performance-schema-instrument='%%wait/synch/mutex/sql/LOCK_xid_cache=COUNTED' +--loose-performance-schema-instrument='%%wait/synch/mutex/sql/LOCK_plugin=COUNTED' --loose-performance-schema-instrument='%=FOO' --loose-performance-schema-instrument='%=%' --loose-performance-schema-instrument='%' diff --git a/mysql-test/suite/perfschema/t/setup_instruments_defaults.test b/mysql-test/suite/perfschema/t/setup_instruments_defaults.test index e1f61404d12..5e0a3a5067a 100644 --- a/mysql-test/suite/perfschema/t/setup_instruments_defaults.test +++ b/mysql-test/suite/perfschema/t/setup_instruments_defaults.test @@ -15,7 +15,7 @@ SELECT * FROM performance_schema.setup_instruments WHERE name IN ( 'wait/synch/mutex/sql/LOCK_user_conn', 'wait/synch/mutex/sql/LOCK_uuid_generator', - 'wait/synch/mutex/sql/LOCK_xid_cache', + 'wait/synch/mutex/sql/LOCK_plugin', 'stage/sql/creating table') AND enabled = 'yes' AND timed = 'no' ORDER BY name; diff --git a/mysql-test/suite/sys_vars/inc/sysvars_server.inc b/mysql-test/suite/sys_vars/inc/sysvars_server.inc index fb6121d7cc3..cb06b40f8c9 100644 --- a/mysql-test/suite/sys_vars/inc/sysvars_server.inc +++ b/mysql-test/suite/sys_vars/inc/sysvars_server.inc @@ -25,6 +25,8 @@ select * from information_schema.system_variables 'lower_case_file_system', 'lower_case_table_names', 'open_files_limit', + 'rand_seed1', + 'rand_seed2', 'system_time_zone', 'version_comment', 'version_compile_machine', 'version_compile_os', @@ -46,6 +48,8 @@ select VARIABLE_NAME, VARIABLE_SCOPE, VARIABLE_TYPE, VARIABLE_COMMENT, 'lower_case_file_system', 'lower_case_table_names', 'open_files_limit', + 'rand_seed1', + 'rand_seed2', 'system_time_zone', 'version_comment', 'version_compile_machine', 'version_compile_os', diff --git a/mysql-test/suite/sys_vars/r/rand_seed1_basic.result b/mysql-test/suite/sys_vars/r/rand_seed1_basic.result index 155d7169168..c4244dabcbe 100644 --- a/mysql-test/suite/sys_vars/r/rand_seed1_basic.result +++ b/mysql-test/suite/sys_vars/r/rand_seed1_basic.result @@ -1,27 +1,30 @@ select @@global.rand_seed1; ERROR HY000: Variable 'rand_seed1' is a SESSION variable +set session rand_seed1=default; +ERROR 42000: Variable 'rand_seed1' doesn't have a default value +set session rand_seed1=10969771; select @@session.rand_seed1; @@session.rand_seed1 -0 +10969771 show global variables like 'rand_seed1'; Variable_name Value show session variables like 'rand_seed1'; Variable_name Value -rand_seed1 0 +rand_seed1 10969771 select * from information_schema.global_variables where variable_name='rand_seed1'; VARIABLE_NAME VARIABLE_VALUE select * from information_schema.session_variables where variable_name='rand_seed1'; VARIABLE_NAME VARIABLE_VALUE -RAND_SEED1 0 +RAND_SEED1 10969771 set session rand_seed1=1; select @@session.rand_seed1; @@session.rand_seed1 -0 +1 select * from information_schema.global_variables where variable_name='rand_seed1'; VARIABLE_NAME VARIABLE_VALUE select * from information_schema.session_variables where variable_name='rand_seed1'; VARIABLE_NAME VARIABLE_VALUE -RAND_SEED1 0 +RAND_SEED1 1 set global rand_seed1=1; ERROR HY000: Variable 'rand_seed1' is a SESSION variable and can't be used with SET GLOBAL set session rand_seed1=1.1; diff --git a/mysql-test/suite/sys_vars/r/rand_seed2_basic.result b/mysql-test/suite/sys_vars/r/rand_seed2_basic.result index 4974d8a53a3..23e154d0a0e 100644 --- a/mysql-test/suite/sys_vars/r/rand_seed2_basic.result +++ b/mysql-test/suite/sys_vars/r/rand_seed2_basic.result @@ -1,27 +1,30 @@ select @@global.rand_seed2; ERROR HY000: Variable 'rand_seed2' is a SESSION variable +set session rand_seed2=default; +ERROR 42000: Variable 'rand_seed2' doesn't have a default value +set session rand_seed2=10969771; select @@session.rand_seed2; @@session.rand_seed2 -0 +10969771 show global variables like 'rand_seed2'; Variable_name Value show session variables like 'rand_seed2'; Variable_name Value -rand_seed2 0 +rand_seed2 10969771 select * from information_schema.global_variables where variable_name='rand_seed2'; VARIABLE_NAME VARIABLE_VALUE select * from information_schema.session_variables where variable_name='rand_seed2'; VARIABLE_NAME VARIABLE_VALUE -RAND_SEED2 0 +RAND_SEED2 10969771 set session rand_seed2=1; select @@session.rand_seed2; @@session.rand_seed2 -0 +1 select * from information_schema.global_variables where variable_name='rand_seed2'; VARIABLE_NAME VARIABLE_VALUE select * from information_schema.session_variables where variable_name='rand_seed2'; VARIABLE_NAME VARIABLE_VALUE -RAND_SEED2 0 +RAND_SEED2 1 set global rand_seed2=1; ERROR HY000: Variable 'rand_seed2' is a SESSION variable and can't be used with SET GLOBAL set session rand_seed2=1.1; 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 1c1ba65ec64..742d291435a 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 @@ -1,6 +1,6 @@ ---- suite/sys_vars/r/sysvars_server_embedded.result -+++ suite/sys_vars/r/sysvars_server_embedded,32bit.reject -@@ -55,7 +55,7 @@ +--- sysvars_server_embedded.result 2015-03-16 20:11:54.000000000 +0200 ++++ sysvars_server_embedded,32bit.reject 2015-03-16 21:48:46.000000000 +0200 +@@ -57,7 +57,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -9,7 +9,7 @@ VARIABLE_COMMENT Auto-increment columns are incremented by this NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -69,7 +69,7 @@ +@@ -71,7 +71,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -18,7 +18,7 @@ VARIABLE_COMMENT Offset added to Auto-increment columns. Used when auto-increment-increment != 1 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -83,7 +83,7 @@ +@@ -85,7 +85,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL @@ -27,7 +27,7 @@ VARIABLE_COMMENT The number of outstanding connection requests MySQL can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -142,7 +142,7 @@ +@@ -144,7 +144,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the transactional cache for updates to transactional engines for the binary log. If you often use transactions containing many statements, you can increase this to get more performance NUMERIC_MIN_VALUE 4096 @@ -36,7 +36,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -167,10 +167,10 @@ +@@ -169,10 +169,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -49,7 +49,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -181,10 +181,10 @@ +@@ -183,10 +183,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100000 VARIABLE_SCOPE GLOBAL @@ -62,7 +62,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -240,7 +240,7 @@ +@@ -242,7 +242,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance NUMERIC_MIN_VALUE 4096 @@ -71,7 +71,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -254,7 +254,7 @@ +@@ -256,7 +256,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Size of tree cache used in bulk insert optimisation. Note that this is a limit per thread! NUMERIC_MIN_VALUE 0 @@ -80,7 +80,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -447,7 +447,7 @@ +@@ -449,7 +449,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -89,7 +89,7 @@ VARIABLE_COMMENT The number of seconds the mysqld server is waiting for a connect packet before responding with 'Bad handshake' NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 31536000 -@@ -503,7 +503,7 @@ +@@ -505,7 +505,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION @@ -98,7 +98,7 @@ VARIABLE_COMMENT Long search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 33 -@@ -517,7 +517,7 @@ +@@ -519,7 +519,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4 VARIABLE_SCOPE SESSION @@ -107,7 +107,7 @@ VARIABLE_COMMENT Short search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 32 -@@ -531,7 +531,7 @@ +@@ -533,7 +533,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50000000 VARIABLE_SCOPE SESSION @@ -116,7 +116,7 @@ VARIABLE_COMMENT Long timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -545,7 +545,7 @@ +@@ -547,7 +547,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10000 VARIABLE_SCOPE SESSION @@ -125,7 +125,7 @@ VARIABLE_COMMENT Short timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -601,7 +601,7 @@ +@@ -603,7 +603,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -134,7 +134,7 @@ VARIABLE_COMMENT The default week format used by WEEK() functions NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 7 -@@ -615,7 +615,7 @@ +@@ -617,7 +617,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -143,7 +143,7 @@ VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -629,7 +629,7 @@ +@@ -631,7 +631,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 300 VARIABLE_SCOPE GLOBAL @@ -152,7 +152,7 @@ VARIABLE_COMMENT How long a INSERT DELAYED thread should wait for INSERT statements before terminating NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -643,7 +643,7 @@ +@@ -645,7 +645,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1000 VARIABLE_SCOPE GLOBAL @@ -161,7 +161,7 @@ VARIABLE_COMMENT What size queue (in rows) should be allocated for handling INSERT DELAYED. If the queue becomes full, any client that does INSERT DELAYED will wait until there is room in the queue again NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -671,7 +671,7 @@ +@@ -673,7 +673,7 @@ GLOBAL_VALUE_ORIGIN SQL DEFAULT_VALUE 4 VARIABLE_SCOPE SESSION @@ -170,7 +170,28 @@ VARIABLE_COMMENT Precision of the result of '/' operator will be increased on that value NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 30 -@@ -713,7 +713,7 @@ +@@ -709,6 +709,20 @@ + ENUM_VALUE_LIST OFF,ON + READ_ONLY NO + COMMAND_LINE_ARGUMENT OPTIONAL ++VARIABLE_NAME ENFORCE_STORAGE_ENGINE ++SESSION_VALUE ++GLOBAL_VALUE NULL ++GLOBAL_VALUE_ORIGIN COMPILE-TIME ++DEFAULT_VALUE NULL ++VARIABLE_SCOPE SESSION ONLY ++VARIABLE_TYPE VARCHAR ++VARIABLE_COMMENT Force the use of a storage engine for new tables ++NUMERIC_MIN_VALUE NULL ++NUMERIC_MAX_VALUE NULL ++NUMERIC_BLOCK_SIZE NULL ++ENUM_VALUE_LIST NULL ++READ_ONLY NO ++COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME ERROR_COUNT + SESSION_VALUE 0 + GLOBAL_VALUE NULL +@@ -743,7 +757,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -179,7 +200,7 @@ VARIABLE_COMMENT If non-zero, binary logs will be purged after expire_logs_days days; possible purges happen at startup and at binary log rotation NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 99 -@@ -741,7 +741,7 @@ +@@ -771,7 +785,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -188,7 +209,7 @@ VARIABLE_COMMENT The number of connections on extra-port NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -783,7 +783,7 @@ +@@ -813,7 +827,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -197,7 +218,7 @@ VARIABLE_COMMENT A dedicated thread is created to flush all tables at the given interval NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -825,7 +825,7 @@ +@@ -855,7 +869,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 84 VARIABLE_SCOPE GLOBAL @@ -206,7 +227,7 @@ VARIABLE_COMMENT The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -839,7 +839,7 @@ +@@ -869,7 +883,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL @@ -215,7 +236,7 @@ VARIABLE_COMMENT The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 84 -@@ -853,7 +853,7 @@ +@@ -883,7 +897,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE GLOBAL @@ -224,7 +245,7 @@ VARIABLE_COMMENT Number of best matches to use for query expansion NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -912,7 +912,7 @@ +@@ -942,7 +956,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() NUMERIC_MIN_VALUE 4 @@ -233,7 +254,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1063,7 +1063,7 @@ +@@ -1093,7 +1107,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -242,7 +263,7 @@ VARIABLE_COMMENT Number of bytes used for a histogram. If set to 0, no histograms are created by ANALYZE. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -1091,7 +1091,7 @@ +@@ -1121,7 +1135,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -251,7 +272,7 @@ VARIABLE_COMMENT How many host names should be cached to avoid resolving. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65536 -@@ -1203,7 +1203,7 @@ +@@ -1233,7 +1247,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 28800 VARIABLE_SCOPE SESSION @@ -260,7 +281,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on an interactive connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1234,7 +1234,7 @@ +@@ -1264,7 +1278,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer that is used for joins NUMERIC_MIN_VALUE 128 @@ -269,7 +290,7 @@ NUMERIC_BLOCK_SIZE 128 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1259,7 +1259,7 @@ +@@ -1289,7 +1303,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE SESSION @@ -278,7 +299,7 @@ VARIABLE_COMMENT Controls what join operations can be executed with join buffers. Odd numbers are used for plain join buffers while even numbers are used for linked buffers NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 8 -@@ -1497,7 +1497,7 @@ +@@ -1527,7 +1541,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 31536000 VARIABLE_SCOPE SESSION @@ -287,7 +308,7 @@ VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1595,7 +1595,7 @@ +@@ -1625,7 +1639,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -296,7 +317,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 -@@ -1623,7 +1623,7 @@ +@@ -1653,7 +1667,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -305,7 +326,7 @@ VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1665,7 +1665,7 @@ +@@ -1695,7 +1709,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE SESSION @@ -314,7 +335,7 @@ VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -1675,14 +1675,14 @@ +@@ -1705,14 +1719,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_BINLOG_CACHE_SIZE SESSION_VALUE NULL @@ -332,7 +353,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1693,7 +1693,7 @@ +@@ -1723,7 +1737,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL @@ -341,7 +362,7 @@ VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -1703,14 +1703,14 @@ +@@ -1733,14 +1747,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_BINLOG_STMT_CACHE_SIZE SESSION_VALUE NULL @@ -359,7 +380,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1721,7 +1721,7 @@ +@@ -1751,7 +1765,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 151 VARIABLE_SCOPE GLOBAL @@ -368,7 +389,7 @@ VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -1735,7 +1735,7 @@ +@@ -1765,7 +1779,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -377,7 +398,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 -@@ -1749,7 +1749,7 @@ +@@ -1779,7 +1793,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE SESSION @@ -386,7 +407,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 -@@ -1763,7 +1763,7 @@ +@@ -1793,7 +1807,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 64 VARIABLE_SCOPE SESSION @@ -395,7 +416,7 @@ VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -1780,7 +1780,7 @@ +@@ -1810,7 +1824,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -404,7 +425,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1791,7 +1791,7 @@ +@@ -1821,7 +1835,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE SESSION @@ -413,7 +434,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 -@@ -1819,7 +1819,7 @@ +@@ -1849,7 +1863,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE SESSION @@ -422,7 +443,7 @@ VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -1833,7 +1833,7 @@ +@@ -1863,7 +1877,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -431,7 +452,7 @@ VARIABLE_COMMENT The maximum BLOB length to send to server from mysql_send_long_data API. Deprecated option; use max_allowed_packet instead. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -1847,7 +1847,7 @@ +@@ -1877,7 +1891,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16382 VARIABLE_SCOPE GLOBAL @@ -440,7 +461,7 @@ VARIABLE_COMMENT Maximum number of prepared statements in the server NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -1861,7 +1861,7 @@ +@@ -1891,7 +1905,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE SESSION @@ -449,7 +470,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 -@@ -1875,7 +1875,7 @@ +@@ -1905,7 +1919,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE SESSION @@ -458,7 +479,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 4 NUMERIC_MAX_VALUE 8388608 -@@ -1889,7 +1889,7 @@ +@@ -1919,7 +1933,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -467,7 +488,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -1917,7 +1917,7 @@ +@@ -1947,7 +1961,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32 VARIABLE_SCOPE SESSION @@ -476,7 +497,7 @@ VARIABLE_COMMENT Unused, will be removed. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1945,7 +1945,7 @@ +@@ -1975,7 +1989,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE GLOBAL @@ -485,7 +506,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1959,7 +1959,7 @@ +@@ -1989,7 +2003,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -494,7 +515,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -1973,7 +1973,7 @@ +@@ -2003,7 +2017,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL @@ -503,7 +524,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -1987,7 +1987,7 @@ +@@ -2017,7 +2031,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -512,7 +533,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2001,7 +2001,7 @@ +@@ -2031,7 +2045,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -521,7 +542,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2015,10 +2015,10 @@ +@@ -2045,10 +2059,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE SESSION @@ -534,7 +555,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2029,7 +2029,7 @@ +@@ -2059,7 +2073,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -543,7 +564,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2043,7 +2043,7 @@ +@@ -2073,7 +2087,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 6 VARIABLE_SCOPE GLOBAL @@ -552,7 +573,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2053,9 +2053,9 @@ +@@ -2083,9 +2097,9 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MAX_SORT_FILE_SIZE SESSION_VALUE NULL @@ -564,7 +585,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't use the fast sort index method to created index if the temporary file would get bigger than this -@@ -2067,14 +2067,14 @@ +@@ -2097,14 +2111,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MMAP_SIZE SESSION_VALUE NULL @@ -582,7 +603,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2099,10 +2099,10 @@ +@@ -2129,10 +2143,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -595,7 +616,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2116,7 +2116,7 @@ +@@ -2146,7 +2160,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 4096 @@ -604,7 +625,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2169,7 +2169,7 @@ +@@ -2199,7 +2213,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -613,7 +634,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2183,7 +2183,7 @@ +@@ -2213,7 +2227,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE SESSION @@ -622,7 +643,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 -@@ -2197,7 +2197,7 @@ +@@ -2227,7 +2241,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE SESSION @@ -631,7 +652,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 -@@ -2211,7 +2211,7 @@ +@@ -2241,7 +2255,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 60 VARIABLE_SCOPE SESSION @@ -640,7 +661,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 -@@ -2281,7 +2281,7 @@ +@@ -2311,7 +2325,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -649,7 +670,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 number of retrieved rows NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1 -@@ -2295,7 +2295,7 @@ +@@ -2325,7 +2339,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 62 VARIABLE_SCOPE SESSION @@ -658,7 +679,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; if set to 63, the optimizer will switch to the original find_best search. NOTE: The value 63 and its associated behaviour is deprecated NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 63 -@@ -2309,7 +2309,7 @@ +@@ -2339,7 +2353,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE SESSION @@ -667,7 +688,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2337,7 +2337,7 @@ +@@ -2367,7 +2381,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -676,7 +697,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 -@@ -2365,7 +2365,7 @@ +@@ -2395,7 +2409,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -685,7 +706,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 -@@ -2379,7 +2379,7 @@ +@@ -2409,7 +2423,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -694,7 +715,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 200 -@@ -2393,7 +2393,7 @@ +@@ -2423,7 +2437,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -703,7 +724,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 -@@ -2407,7 +2407,7 @@ +@@ -2437,7 +2451,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -712,7 +733,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 -@@ -2421,7 +2421,7 @@ +@@ -2451,7 +2465,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -721,7 +742,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 -@@ -2435,7 +2435,7 @@ +@@ -2465,7 +2479,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -730,7 +751,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 -@@ -2449,7 +2449,7 @@ +@@ -2479,7 +2493,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -739,7 +760,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 -@@ -2463,7 +2463,7 @@ +@@ -2493,7 +2507,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -748,7 +769,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 -@@ -2477,7 +2477,7 @@ +@@ -2507,7 +2521,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -757,7 +778,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2491,7 +2491,7 @@ +@@ -2521,7 +2535,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 80 VARIABLE_SCOPE GLOBAL @@ -766,7 +787,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2505,7 +2505,7 @@ +@@ -2535,7 +2549,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -775,7 +796,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 -@@ -2519,7 +2519,7 @@ +@@ -2549,7 +2563,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -784,7 +805,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2533,7 +2533,7 @@ +@@ -2563,7 +2577,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE GLOBAL @@ -793,7 +814,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2547,7 +2547,7 @@ +@@ -2577,7 +2591,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -802,7 +823,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2561,7 +2561,7 @@ +@@ -2591,7 +2605,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 200 VARIABLE_SCOPE GLOBAL @@ -811,7 +832,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2575,7 +2575,7 @@ +@@ -2605,7 +2619,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -820,7 +841,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 -@@ -2589,7 +2589,7 @@ +@@ -2619,7 +2633,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 40 VARIABLE_SCOPE GLOBAL @@ -829,7 +850,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2603,7 +2603,7 @@ +@@ -2633,7 +2647,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -838,7 +859,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 -@@ -2617,7 +2617,7 @@ +@@ -2647,7 +2661,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -847,7 +868,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2631,7 +2631,7 @@ +@@ -2661,7 +2675,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -856,7 +877,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 -@@ -2645,7 +2645,7 @@ +@@ -2675,7 +2689,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL @@ -865,7 +886,7 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2659,7 +2659,7 @@ +@@ -2689,7 +2703,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 178 VARIABLE_SCOPE GLOBAL @@ -874,7 +895,7 @@ VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2673,7 +2673,7 @@ +@@ -2703,7 +2717,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -883,7 +904,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 -@@ -2687,7 +2687,7 @@ +@@ -2717,7 +2731,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -892,7 +913,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2701,7 +2701,7 @@ +@@ -2731,7 +2745,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -901,7 +922,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2715,7 +2715,7 @@ +@@ -2745,7 +2759,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -910,7 +931,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2729,7 +2729,7 @@ +@@ -2759,7 +2773,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -919,7 +940,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 -@@ -2743,7 +2743,7 @@ +@@ -2773,7 +2787,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -928,7 +949,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2757,7 +2757,7 @@ +@@ -2787,7 +2801,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -937,7 +958,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2771,7 +2771,7 @@ +@@ -2801,7 +2815,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -946,7 +967,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2841,7 +2841,7 @@ +@@ -2871,7 +2885,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE SESSION @@ -955,7 +976,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -2869,7 +2869,7 @@ +@@ -2899,7 +2913,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION @@ -964,7 +985,7 @@ VARIABLE_COMMENT Limit of query profiling memory NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -2883,7 +2883,7 @@ +@@ -2913,7 +2927,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 5 VARIABLE_SCOPE SESSION @@ -973,7 +994,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 -@@ -2939,10 +2939,10 @@ +@@ -2969,10 +2983,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION ONLY @@ -986,7 +1007,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2953,7 +2953,7 @@ +@@ -2983,7 +2997,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -995,7 +1016,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -2967,7 +2967,7 @@ +@@ -2997,7 +3011,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -1004,7 +1025,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2981,7 +2981,7 @@ +@@ -3011,7 +3025,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE GLOBAL @@ -1013,7 +1034,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2998,7 +2998,7 @@ +@@ -3028,7 +3042,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1022,7 +1043,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3051,7 +3051,7 @@ +@@ -3081,7 +3095,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 24576 VARIABLE_SCOPE SESSION @@ -1031,25 +1052,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3068,7 +3068,7 @@ - VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes - NUMERIC_MIN_VALUE 0 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -3082,7 +3082,7 @@ - VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes - NUMERIC_MIN_VALUE 0 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -3093,7 +3093,7 @@ +@@ -3095,7 +3109,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1058,7 +1061,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3107,7 +3107,7 @@ +@@ -3109,7 +3123,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 131072 VARIABLE_SCOPE SESSION @@ -1067,7 +1070,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 -@@ -3135,7 +3135,7 @@ +@@ -3137,7 +3151,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -1076,7 +1079,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 -@@ -3149,10 +3149,10 @@ +@@ -3151,10 +3165,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8388608 VARIABLE_SCOPE SESSION @@ -1089,7 +1092,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3191,7 +3191,7 @@ +@@ -3193,7 +3207,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -1098,7 +1101,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3289,7 +3289,7 @@ +@@ -3291,7 +3305,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL @@ -1107,7 +1110,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3303,7 +3303,7 @@ +@@ -3305,7 +3319,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -1116,7 +1119,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 -@@ -3362,7 +3362,7 @@ +@@ -3364,7 +3378,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1125,16 +1128,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3639,7 +3639,7 @@ +@@ -3641,7 +3655,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. - NUMERIC_MIN_VALUE 256 + NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -3709,7 +3709,7 @@ +@@ -3711,7 +3725,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 400 VARIABLE_SCOPE GLOBAL @@ -1143,7 +1146,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 524288 -@@ -3723,7 +3723,7 @@ +@@ -3725,7 +3739,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 400 VARIABLE_SCOPE GLOBAL @@ -1152,7 +1155,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 524288 -@@ -3737,7 +3737,7 @@ +@@ -3739,7 +3753,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1161,7 +1164,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -3751,7 +3751,7 @@ +@@ -3753,7 +3767,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -1170,7 +1173,7 @@ VARIABLE_COMMENT Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.This variable has no effect, and is deprecated. It will be removed in a future release. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -3866,7 +3866,7 @@ +@@ -3868,7 +3882,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table NUMERIC_MIN_VALUE 1024 @@ -1179,7 +1182,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3877,7 +3877,7 @@ +@@ -3879,7 +3893,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8192 VARIABLE_SCOPE SESSION @@ -1188,7 +1191,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3891,7 +3891,7 @@ +@@ -3893,7 +3907,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1197,7 +1200,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3989,7 +3989,7 @@ +@@ -3991,7 +4005,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 28800 VARIABLE_SCOPE SESSION @@ -1206,7 +1209,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 -@@ -4091,7 +4091,7 @@ +@@ -4095,7 +4109,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -1215,7 +1218,25 @@ VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 then mysqld 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 -@@ -4169,7 +4169,7 @@ +@@ -4108,7 +4122,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4118,7 +4132,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4203,7 +4217,7 @@ 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 59aba01ac7b..7c4bcf6cb82 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -15,6 +15,8 @@ variable_name not in ( 'lower_case_file_system', 'lower_case_table_names', 'open_files_limit', +'rand_seed1', +'rand_seed2', 'system_time_zone', 'version_comment', 'version_compile_machine', 'version_compile_os', @@ -3087,34 +3089,6 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED -VARIABLE_NAME RAND_SEED1 -SESSION_VALUE 0 -GLOBAL_VALUE NULL -GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE 0 -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 -NUMERIC_MAX_VALUE 18446744073709551615 -NUMERIC_BLOCK_SIZE 1 -ENUM_VALUE_LIST NULL -READ_ONLY NO -COMMAND_LINE_ARGUMENT NULL -VARIABLE_NAME RAND_SEED2 -SESSION_VALUE 0 -GLOBAL_VALUE NULL -GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE 0 -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 -NUMERIC_MAX_VALUE 18446744073709551615 -NUMERIC_BLOCK_SIZE 1 -ENUM_VALUE_LIST NULL -READ_ONLY NO -COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME RANGE_ALLOC_BLOCK_SIZE SESSION_VALUE 4096 GLOBAL_VALUE 4096 @@ -4051,6 +4025,8 @@ where variable_name in ( 'lower_case_file_system', 'lower_case_table_names', 'open_files_limit', +'rand_seed1', +'rand_seed2', 'system_time_zone', 'version_comment', 'version_compile_machine', 'version_compile_os', @@ -4127,6 +4103,26 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME RAND_SEED1 +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 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT NULL +VARIABLE_NAME RAND_SEED2 +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 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SYSTEM_TIME_ZONE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR 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 8d507498fb0..97b5c8a9e5d 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,6 +1,6 @@ ---- sysvars_server_notembedded.result 2015-01-09 12:55:23.000000000 +0100 -+++ sysvars_server_notembedded,32bit.result 2015-01-09 17:34:13.000000000 +0100 -@@ -55,7 +55,7 @@ +--- sysvars_server_notembedded.result 2015-03-16 20:11:54.000000000 +0200 ++++ sysvars_server_notembedded,32bit.reject 2015-03-16 21:37:18.000000000 +0200 +@@ -57,7 +57,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -9,7 +9,7 @@ VARIABLE_COMMENT Auto-increment columns are incremented by this NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -69,7 +69,7 @@ +@@ -71,7 +71,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -18,7 +18,7 @@ VARIABLE_COMMENT Offset added to Auto-increment columns. Used when auto-increment-increment != 1 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -83,7 +83,7 @@ +@@ -85,7 +85,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL @@ -27,7 +27,7 @@ VARIABLE_COMMENT The number of outstanding connection requests MySQL can have. This comes into play when the main MySQL thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -142,7 +142,7 @@ +@@ -144,7 +144,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the transactional cache for updates to transactional engines for the binary log. If you often use transactions containing many statements, you can increase this to get more performance NUMERIC_MIN_VALUE 4096 @@ -36,7 +36,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -167,10 +167,10 @@ +@@ -169,10 +169,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -49,7 +49,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -181,10 +181,10 @@ +@@ -183,10 +183,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100000 VARIABLE_SCOPE GLOBAL @@ -62,7 +62,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -240,7 +240,7 @@ +@@ -242,7 +242,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance NUMERIC_MIN_VALUE 4096 @@ -71,7 +71,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -254,7 +254,7 @@ +@@ -256,7 +256,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Size of tree cache used in bulk insert optimisation. Note that this is a limit per thread! NUMERIC_MIN_VALUE 0 @@ -80,7 +80,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -447,7 +447,7 @@ +@@ -449,7 +449,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -89,7 +89,7 @@ VARIABLE_COMMENT The number of seconds the mysqld server is waiting for a connect packet before responding with 'Bad handshake' NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 31536000 -@@ -503,7 +503,7 @@ +@@ -505,7 +505,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION @@ -98,7 +98,7 @@ VARIABLE_COMMENT Long search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 33 -@@ -517,7 +517,7 @@ +@@ -519,7 +519,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4 VARIABLE_SCOPE SESSION @@ -107,7 +107,7 @@ VARIABLE_COMMENT Short search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 32 -@@ -531,7 +531,7 @@ +@@ -533,7 +533,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50000000 VARIABLE_SCOPE SESSION @@ -116,7 +116,7 @@ VARIABLE_COMMENT Long timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -545,7 +545,7 @@ +@@ -547,7 +547,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10000 VARIABLE_SCOPE SESSION @@ -125,7 +125,7 @@ VARIABLE_COMMENT Short timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -615,7 +615,7 @@ +@@ -617,7 +617,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -134,7 +134,7 @@ VARIABLE_COMMENT The default week format used by WEEK() functions NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 7 -@@ -629,7 +629,7 @@ +@@ -631,7 +631,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -143,7 +143,7 @@ VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -643,7 +643,7 @@ +@@ -645,7 +645,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 300 VARIABLE_SCOPE GLOBAL @@ -152,7 +152,7 @@ VARIABLE_COMMENT How long a INSERT DELAYED thread should wait for INSERT statements before terminating NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -657,7 +657,7 @@ +@@ -659,7 +659,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1000 VARIABLE_SCOPE GLOBAL @@ -161,7 +161,7 @@ VARIABLE_COMMENT What size queue (in rows) should be allocated for handling INSERT DELAYED. If the queue becomes full, any client that does INSERT DELAYED will wait until there is room in the queue again NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -685,7 +685,7 @@ +@@ -687,7 +687,7 @@ GLOBAL_VALUE_ORIGIN SQL DEFAULT_VALUE 4 VARIABLE_SCOPE SESSION @@ -170,7 +170,7 @@ VARIABLE_COMMENT Precision of the result of '/' operator will be increased on that value NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 30 -@@ -769,7 +769,7 @@ +@@ -785,7 +785,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -179,7 +179,7 @@ VARIABLE_COMMENT If non-zero, binary logs will be purged after expire_logs_days days; possible purges happen at startup and at binary log rotation NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 99 -@@ -797,7 +797,7 @@ +@@ -813,7 +813,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -188,7 +188,7 @@ VARIABLE_COMMENT The number of connections on extra-port NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -839,7 +839,7 @@ +@@ -855,7 +855,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -197,7 +197,7 @@ VARIABLE_COMMENT A dedicated thread is created to flush all tables at the given interval NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -881,7 +881,7 @@ +@@ -897,7 +897,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 84 VARIABLE_SCOPE GLOBAL @@ -206,7 +206,7 @@ VARIABLE_COMMENT The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -895,7 +895,7 @@ +@@ -911,7 +911,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL @@ -215,7 +215,7 @@ VARIABLE_COMMENT The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 84 -@@ -909,7 +909,7 @@ +@@ -925,7 +925,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE GLOBAL @@ -224,7 +224,7 @@ VARIABLE_COMMENT Number of best matches to use for query expansion NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -968,7 +968,7 @@ +@@ -984,7 +984,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() NUMERIC_MIN_VALUE 4 @@ -233,7 +233,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1203,7 +1203,7 @@ +@@ -1219,7 +1219,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -242,7 +242,7 @@ VARIABLE_COMMENT Number of bytes used for a histogram. If set to 0, no histograms are created by ANALYZE. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -1231,7 +1231,7 @@ +@@ -1247,7 +1247,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -251,7 +251,7 @@ VARIABLE_COMMENT How many host names should be cached to avoid resolving. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65536 -@@ -1343,7 +1343,7 @@ +@@ -1359,7 +1359,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 28800 VARIABLE_SCOPE SESSION @@ -260,7 +260,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on an interactive connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1374,7 +1374,7 @@ +@@ -1390,7 +1390,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer that is used for joins NUMERIC_MIN_VALUE 128 @@ -269,7 +269,7 @@ NUMERIC_BLOCK_SIZE 128 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1399,7 +1399,7 @@ +@@ -1415,7 +1415,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE SESSION @@ -278,7 +278,7 @@ VARIABLE_COMMENT Controls what join operations can be executed with join buffers. Odd numbers are used for plain join buffers while even numbers are used for linked buffers NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 8 -@@ -1651,7 +1651,7 @@ +@@ -1667,7 +1667,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 31536000 VARIABLE_SCOPE SESSION @@ -287,7 +287,7 @@ VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1763,7 +1763,7 @@ +@@ -1779,7 +1779,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -296,7 +296,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 -@@ -1791,7 +1791,7 @@ +@@ -1807,7 +1807,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -305,7 +305,7 @@ VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1847,7 +1847,7 @@ +@@ -1863,7 +1863,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE SESSION @@ -314,7 +314,7 @@ VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -1857,14 +1857,14 @@ +@@ -1873,14 +1873,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_BINLOG_CACHE_SIZE SESSION_VALUE NULL @@ -332,7 +332,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1875,7 +1875,7 @@ +@@ -1891,7 +1891,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL @@ -341,7 +341,7 @@ VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -1885,14 +1885,14 @@ +@@ -1901,14 +1901,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_BINLOG_STMT_CACHE_SIZE SESSION_VALUE NULL @@ -359,7 +359,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1903,7 +1903,7 @@ +@@ -1919,7 +1919,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 151 VARIABLE_SCOPE GLOBAL @@ -368,7 +368,7 @@ VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -1917,7 +1917,7 @@ +@@ -1933,7 +1933,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -377,7 +377,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 -@@ -1931,7 +1931,7 @@ +@@ -1947,7 +1947,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE SESSION @@ -386,7 +386,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 -@@ -1945,7 +1945,7 @@ +@@ -1961,7 +1961,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 64 VARIABLE_SCOPE SESSION @@ -395,7 +395,7 @@ VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -1962,7 +1962,7 @@ +@@ -1978,7 +1978,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -404,7 +404,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1973,7 +1973,7 @@ +@@ -1989,7 +1989,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 20 VARIABLE_SCOPE SESSION @@ -413,7 +413,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 -@@ -2001,7 +2001,7 @@ +@@ -2017,7 +2017,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE SESSION @@ -422,7 +422,7 @@ VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -2015,7 +2015,7 @@ +@@ -2031,7 +2031,7 @@ GLOBAL_VALUE_ORIGIN AUTO DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -431,7 +431,7 @@ VARIABLE_COMMENT The maximum BLOB length to send to server from mysql_send_long_data API. Deprecated option; use max_allowed_packet instead. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -2029,7 +2029,7 @@ +@@ -2045,7 +2045,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16382 VARIABLE_SCOPE GLOBAL @@ -440,7 +440,7 @@ VARIABLE_COMMENT Maximum number of prepared statements in the server NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2057,7 +2057,7 @@ +@@ -2073,7 +2073,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE SESSION @@ -449,7 +449,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 -@@ -2071,7 +2071,7 @@ +@@ -2087,7 +2087,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE SESSION @@ -458,7 +458,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 4 NUMERIC_MAX_VALUE 8388608 -@@ -2085,7 +2085,7 @@ +@@ -2101,7 +2101,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -467,7 +467,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -2113,7 +2113,7 @@ +@@ -2129,7 +2129,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32 VARIABLE_SCOPE SESSION @@ -476,7 +476,7 @@ VARIABLE_COMMENT Unused, will be removed. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2141,7 +2141,7 @@ +@@ -2157,7 +2157,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4294967295 VARIABLE_SCOPE GLOBAL @@ -485,7 +485,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2155,7 +2155,7 @@ +@@ -2171,7 +2171,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -494,7 +494,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2169,7 +2169,7 @@ +@@ -2185,7 +2185,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL @@ -503,7 +503,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2183,7 +2183,7 @@ +@@ -2199,7 +2199,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -512,7 +512,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2197,7 +2197,7 @@ +@@ -2213,7 +2213,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -521,7 +521,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2211,10 +2211,10 @@ +@@ -2227,10 +2227,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE SESSION @@ -534,7 +534,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2225,7 +2225,7 @@ +@@ -2241,7 +2241,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -543,7 +543,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2239,7 +2239,7 @@ +@@ -2255,7 +2255,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 6 VARIABLE_SCOPE GLOBAL @@ -552,7 +552,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2249,9 +2249,9 @@ +@@ -2265,9 +2265,9 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MAX_SORT_FILE_SIZE SESSION_VALUE NULL @@ -564,7 +564,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't use the fast sort index method to created index if the temporary file would get bigger than this -@@ -2263,14 +2263,14 @@ +@@ -2279,14 +2279,14 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_MMAP_SIZE SESSION_VALUE NULL @@ -582,7 +582,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2295,10 +2295,10 @@ +@@ -2311,10 +2311,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -595,7 +595,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2312,7 +2312,7 @@ +@@ -2328,7 +2328,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 4096 @@ -604,7 +604,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2365,7 +2365,7 @@ +@@ -2381,7 +2381,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -613,7 +613,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2379,7 +2379,7 @@ +@@ -2395,7 +2395,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE SESSION @@ -622,7 +622,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 -@@ -2393,7 +2393,7 @@ +@@ -2409,7 +2409,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE SESSION @@ -631,7 +631,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 -@@ -2407,7 +2407,7 @@ +@@ -2423,7 +2423,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 60 VARIABLE_SCOPE SESSION @@ -640,7 +640,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 -@@ -2477,7 +2477,7 @@ +@@ -2493,7 +2493,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -649,7 +649,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 number of retrieved rows NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1 -@@ -2491,7 +2491,7 @@ +@@ -2507,7 +2507,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 62 VARIABLE_SCOPE SESSION @@ -658,7 +658,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; if set to 63, the optimizer will switch to the original find_best search. NOTE: The value 63 and its associated behaviour is deprecated NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 63 -@@ -2505,7 +2505,7 @@ +@@ -2521,7 +2521,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE SESSION @@ -667,7 +667,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2533,7 +2533,7 @@ +@@ -2549,7 +2549,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION @@ -676,7 +676,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 -@@ -2561,7 +2561,7 @@ +@@ -2577,7 +2577,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -685,7 +685,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 -@@ -2575,7 +2575,7 @@ +@@ -2591,7 +2591,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -694,7 +694,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 200 -@@ -2589,7 +2589,7 @@ +@@ -2605,7 +2605,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -703,7 +703,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 -@@ -2603,7 +2603,7 @@ +@@ -2619,7 +2619,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -712,7 +712,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 -@@ -2617,7 +2617,7 @@ +@@ -2633,7 +2633,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -721,7 +721,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 -@@ -2631,7 +2631,7 @@ +@@ -2647,7 +2647,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -730,7 +730,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 -@@ -2645,7 +2645,7 @@ +@@ -2661,7 +2661,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -739,7 +739,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 -@@ -2659,7 +2659,7 @@ +@@ -2675,7 +2675,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -748,7 +748,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 -@@ -2673,7 +2673,7 @@ +@@ -2689,7 +2689,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -757,7 +757,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2687,7 +2687,7 @@ +@@ -2703,7 +2703,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 80 VARIABLE_SCOPE GLOBAL @@ -766,7 +766,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2701,7 +2701,7 @@ +@@ -2717,7 +2717,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -775,7 +775,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 -@@ -2715,7 +2715,7 @@ +@@ -2731,7 +2731,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -784,7 +784,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2729,7 +2729,7 @@ +@@ -2745,7 +2745,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE GLOBAL @@ -793,7 +793,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2743,7 +2743,7 @@ +@@ -2759,7 +2759,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -802,7 +802,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2757,7 +2757,7 @@ +@@ -2773,7 +2773,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 200 VARIABLE_SCOPE GLOBAL @@ -811,7 +811,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2771,7 +2771,7 @@ +@@ -2787,7 +2787,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -820,7 +820,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 -@@ -2785,7 +2785,7 @@ +@@ -2801,7 +2801,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 40 VARIABLE_SCOPE GLOBAL @@ -829,7 +829,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2799,7 +2799,7 @@ +@@ -2815,7 +2815,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -838,7 +838,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 -@@ -2813,7 +2813,7 @@ +@@ -2829,7 +2829,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -847,7 +847,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2827,7 +2827,7 @@ +@@ -2843,7 +2843,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -856,7 +856,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 -@@ -2841,7 +2841,7 @@ +@@ -2857,7 +2857,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 150 VARIABLE_SCOPE GLOBAL @@ -865,7 +865,7 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2855,7 +2855,7 @@ +@@ -2871,7 +2871,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 178 VARIABLE_SCOPE GLOBAL @@ -874,7 +874,7 @@ VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2869,7 +2869,7 @@ +@@ -2885,7 +2885,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -883,7 +883,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 -@@ -2883,7 +2883,7 @@ +@@ -2899,7 +2899,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -892,7 +892,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2897,7 +2897,7 @@ +@@ -2913,7 +2913,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -901,7 +901,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2911,7 +2911,7 @@ +@@ -2927,7 +2927,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -910,7 +910,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2925,7 +2925,7 @@ +@@ -2941,7 +2941,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -919,7 +919,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 -@@ -2939,7 +2939,7 @@ +@@ -2955,7 +2955,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -928,7 +928,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2953,7 +2953,7 @@ +@@ -2969,7 +2969,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -937,7 +937,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2967,7 +2967,7 @@ +@@ -2983,7 +2983,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE -1 VARIABLE_SCOPE GLOBAL @@ -946,7 +946,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3037,7 +3037,7 @@ +@@ -3053,7 +3053,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 32768 VARIABLE_SCOPE SESSION @@ -955,7 +955,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3065,7 +3065,7 @@ +@@ -3081,7 +3081,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 15 VARIABLE_SCOPE SESSION @@ -964,7 +964,7 @@ VARIABLE_COMMENT Limit of query profiling memory NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -3079,7 +3079,7 @@ +@@ -3095,7 +3095,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 5 VARIABLE_SCOPE SESSION @@ -973,7 +973,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 -@@ -3135,10 +3135,10 @@ +@@ -3151,10 +3151,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION ONLY @@ -986,7 +986,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3149,7 +3149,7 @@ +@@ -3165,7 +3165,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE SESSION @@ -995,7 +995,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3163,7 +3163,7 @@ +@@ -3179,7 +3179,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -1004,7 +1004,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3177,7 +3177,7 @@ +@@ -3193,7 +3193,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE GLOBAL @@ -1013,7 +1013,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3194,7 +3194,7 @@ +@@ -3210,7 +3210,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1022,7 +1022,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3247,7 +3247,7 @@ +@@ -3263,7 +3263,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 24576 VARIABLE_SCOPE SESSION @@ -1031,25 +1031,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3264,7 +3264,7 @@ - VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes - NUMERIC_MIN_VALUE 0 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -3278,7 +3278,7 @@ - VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes - NUMERIC_MIN_VALUE 0 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -3289,7 +3289,7 @@ +@@ -3277,7 +3277,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1058,7 +1040,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3303,7 +3303,7 @@ +@@ -3291,7 +3291,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 131072 VARIABLE_SCOPE SESSION @@ -1067,7 +1049,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 -@@ -3331,7 +3331,7 @@ +@@ -3319,7 +3319,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 262144 VARIABLE_SCOPE SESSION @@ -1076,7 +1058,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 -@@ -3611,10 +3611,10 @@ +@@ -3585,10 +3585,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8388608 VARIABLE_SCOPE SESSION @@ -1089,7 +1071,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3653,7 +3653,7 @@ +@@ -3627,7 +3627,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 0 VARIABLE_SCOPE SESSION @@ -1098,7 +1080,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3765,7 +3765,7 @@ +@@ -3753,7 +3753,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1107,7 +1089,7 @@ 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 -@@ -3807,7 +3807,7 @@ +@@ -3795,7 +3795,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL @@ -1116,7 +1098,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3835,7 +3835,7 @@ +@@ -3823,7 +3823,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 131072 VARIABLE_SCOPE GLOBAL @@ -1125,7 +1107,7 @@ 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 -@@ -3863,7 +3863,7 @@ +@@ -3851,7 +3851,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1134,7 +1116,7 @@ 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 -@@ -3919,7 +3919,7 @@ +@@ -3907,7 +3907,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -1143,7 +1125,7 @@ VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout, before giving up and stopping NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3947,7 +3947,7 @@ +@@ -3935,7 +3935,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -1152,7 +1134,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 -@@ -4006,7 +4006,7 @@ +@@ -3994,7 +3994,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1161,16 +1143,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4297,7 +4297,7 @@ +@@ -4285,7 +4285,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 256 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. - NUMERIC_MIN_VALUE 256 + NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -4395,7 +4395,7 @@ +@@ -4383,7 +4383,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 400 VARIABLE_SCOPE GLOBAL @@ -1179,7 +1161,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 524288 -@@ -4409,7 +4409,7 @@ +@@ -4397,7 +4397,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 400 VARIABLE_SCOPE GLOBAL @@ -1188,7 +1170,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 524288 -@@ -4423,7 +4423,7 @@ +@@ -4411,7 +4411,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1197,7 +1179,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -4437,7 +4437,7 @@ +@@ -4425,7 +4425,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10 VARIABLE_SCOPE GLOBAL @@ -1206,7 +1188,7 @@ VARIABLE_COMMENT Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.This variable has no effect, and is deprecated. It will be removed in a future release. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -4622,7 +4622,7 @@ +@@ -4610,7 +4610,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MySQL will automatically convert it to an on-disk MyISAM or Aria table NUMERIC_MIN_VALUE 1024 @@ -1215,7 +1197,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4633,7 +4633,7 @@ +@@ -4621,7 +4621,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8192 VARIABLE_SCOPE SESSION @@ -1224,7 +1206,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -4647,7 +4647,7 @@ +@@ -4635,7 +4635,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 4096 VARIABLE_SCOPE SESSION @@ -1233,7 +1215,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -4745,7 +4745,7 @@ +@@ -4733,7 +4733,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 28800 VARIABLE_SCOPE SESSION @@ -1242,7 +1224,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 -@@ -4847,7 +4847,7 @@ +@@ -4837,7 +4837,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -1251,7 +1233,25 @@ VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 then mysqld 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 -@@ -4897,7 +4897,7 @@ +@@ -4850,7 +4850,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4860,7 +4860,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4945,7 +4945,7 @@ 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 bf8f8687133..7908300bf8f 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -15,6 +15,8 @@ variable_name not in ( 'lower_case_file_system', 'lower_case_table_names', 'open_files_limit', +'rand_seed1', +'rand_seed2', 'system_time_zone', 'version_comment', 'version_compile_machine', 'version_compile_os', @@ -3269,34 +3271,6 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED -VARIABLE_NAME RAND_SEED1 -SESSION_VALUE 0 -GLOBAL_VALUE NULL -GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE 0 -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 -NUMERIC_MAX_VALUE 18446744073709551615 -NUMERIC_BLOCK_SIZE 1 -ENUM_VALUE_LIST NULL -READ_ONLY NO -COMMAND_LINE_ARGUMENT NULL -VARIABLE_NAME RAND_SEED2 -SESSION_VALUE 0 -GLOBAL_VALUE NULL -GLOBAL_VALUE_ORIGIN COMPILE-TIME -DEFAULT_VALUE 0 -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 -NUMERIC_MAX_VALUE 18446744073709551615 -NUMERIC_BLOCK_SIZE 1 -ENUM_VALUE_LIST NULL -READ_ONLY NO -COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME RANGE_ALLOC_BLOCK_SIZE SESSION_VALUE 4096 GLOBAL_VALUE 4096 @@ -4793,6 +4767,8 @@ where variable_name in ( 'lower_case_file_system', 'lower_case_table_names', 'open_files_limit', +'rand_seed1', +'rand_seed2', 'system_time_zone', 'version_comment', 'version_compile_machine', 'version_compile_os', @@ -4869,6 +4845,26 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME RAND_SEED1 +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 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT NULL +VARIABLE_NAME RAND_SEED2 +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 +NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SYSTEM_TIME_ZONE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE VARCHAR diff --git a/mysql-test/suite/sys_vars/t/rand_seed1_basic.test b/mysql-test/suite/sys_vars/t/rand_seed1_basic.test index 3745d2fcb1e..a64f8a64aa9 100644 --- a/mysql-test/suite/sys_vars/t/rand_seed1_basic.test +++ b/mysql-test/suite/sys_vars/t/rand_seed1_basic.test @@ -6,6 +6,9 @@ # --error ER_INCORRECT_GLOBAL_LOCAL_VAR select @@global.rand_seed1; +--error ER_NO_DEFAULT +set session rand_seed1=default; +set session rand_seed1=10969771; select @@session.rand_seed1; show global variables like 'rand_seed1'; show session variables like 'rand_seed1'; diff --git a/mysql-test/suite/sys_vars/t/rand_seed2_basic.test b/mysql-test/suite/sys_vars/t/rand_seed2_basic.test index 7a5abcd340b..091fd8f0e3d 100644 --- a/mysql-test/suite/sys_vars/t/rand_seed2_basic.test +++ b/mysql-test/suite/sys_vars/t/rand_seed2_basic.test @@ -7,6 +7,9 @@ # --error ER_INCORRECT_GLOBAL_LOCAL_VAR select @@global.rand_seed2; +--error ER_NO_DEFAULT +set session rand_seed2=default; +set session rand_seed2=10969771; select @@session.rand_seed2; show global variables like 'rand_seed2'; show session variables like 'rand_seed2'; diff --git a/mysql-test/t/ctype_big5.test b/mysql-test/t/ctype_big5.test index 5c0bdff4633..46bb29514ff 100644 --- a/mysql-test/t/ctype_big5.test +++ b/mysql-test/t/ctype_big5.test @@ -121,7 +121,7 @@ DROP TEMPORARY TABLE head, tail; SHOW CREATE TABLE t1; SELECT COUNT(*) FROM t1; UPDATE t1 SET a=unhex(code) ORDER BY code; -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; # # Display all characters that have upper or lower case mapping. # diff --git a/mysql-test/t/ctype_cp932_binlog_stm.test b/mysql-test/t/ctype_cp932_binlog_stm.test index 304c9f5d05c..1b92006c949 100644 --- a/mysql-test/t/ctype_cp932_binlog_stm.test +++ b/mysql-test/t/ctype_cp932_binlog_stm.test @@ -99,7 +99,7 @@ DROP TEMPORARY TABLE head, tail; SHOW CREATE TABLE t1; UPDATE t1 SET a=unhex(code) ORDER BY code; SELECT COUNT(*) FROM t1; -SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=1; +SELECT COUNT(*) FROM t1 WHERE a<>'?' AND OCTET_LENGTH(a)=1; SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; # # Display all characters that have upper or lower case mapping. diff --git a/mysql-test/t/ctype_eucjpms.test b/mysql-test/t/ctype_eucjpms.test index 49ca81850ed..2dd806ed027 100644 --- a/mysql-test/t/ctype_eucjpms.test +++ b/mysql-test/t/ctype_eucjpms.test @@ -446,6 +446,7 @@ SHOW CREATE TABLE t1; UPDATE t1 SET a=unhex(code) ORDER BY code; SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'' AND a<>'?'; SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; SELECT * FROM t1 WHERE CHAR_LENGTH(a)=2; SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=3; diff --git a/mysql-test/t/ctype_euckr.test b/mysql-test/t/ctype_euckr.test index 155b8ebed00..33b3e96cba8 100644 --- a/mysql-test/t/ctype_euckr.test +++ b/mysql-test/t/ctype_euckr.test @@ -95,8 +95,8 @@ WHERE t11.a >= 0x81 AND t11.a <= 0xFE AND t12.a >= 0x41 AND t12.a <= 0xFE ORDER BY t11.a, t12.a; --enable_warnings -SELECT s as bad_code FROM t2 WHERE a='' ORDER BY s; -DELETE FROM t2 WHERE a=''; +SELECT s as bad_code FROM t2 WHERE a='?' ORDER BY s; +DELETE FROM t2 WHERE a='?'; ALTER TABLE t2 ADD u VARCHAR(1) CHARACTER SET utf8, ADD a2 VARCHAR(1) CHARACTER SET euckr; --disable_warnings UPDATE t2 SET u=a, a2=u; @@ -145,7 +145,7 @@ ORDER BY head, tail; DROP TEMPORARY TABLE head, tail; SHOW CREATE TABLE t1; UPDATE t1 SET a=unhex(code) ORDER BY code; -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; # # Display all characters that have upper or lower case mapping. # diff --git a/mysql-test/t/ctype_gb2312.test b/mysql-test/t/ctype_gb2312.test index e3dd448f54c..3ca6941705c 100644 --- a/mysql-test/t/ctype_gb2312.test +++ b/mysql-test/t/ctype_gb2312.test @@ -69,7 +69,7 @@ ORDER BY head, tail; DROP TEMPORARY TABLE head, tail; SHOW CREATE TABLE t1; UPDATE t1 SET a=unhex(code) ORDER BY code; -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; # # Display all characters that have upper or lower case mapping. # diff --git a/mysql-test/t/ctype_gbk.test b/mysql-test/t/ctype_gbk.test index d44009b6109..d98be88326e 100644 --- a/mysql-test/t/ctype_gbk.test +++ b/mysql-test/t/ctype_gbk.test @@ -104,7 +104,7 @@ ORDER BY head, tail; DROP TEMPORARY TABLE head, tail; SHOW CREATE TABLE t1; UPDATE t1 SET a=unhex(code) ORDER BY code; -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; # # Display all characters that have upper or lower case mapping. # @@ -203,3 +203,228 @@ SET NAMES gbk; --echo # --echo # End of 10.0 tests --echo # + + +--echo # +--echo # Start of 10.1 tests +--echo # + +--echo # +--echo # MDEV-6566 Different INSERT behaviour on bad bytes with and without character set conversion +--echo # + +CREATE TABLE t1 ( + id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + b VARBINARY(16), + type SET('ascii','bad','head','tail','mb2','unassigned') +); +INSERT INTO t1 (b, type) VALUES (0x40, 'ascii,tail'); +INSERT INTO t1 (b, type) VALUES (0x80, 'tail'); +INSERT INTO t1 (b, type) VALUES (0x81, 'head,tail'); +INSERT INTO t1 (b, type) VALUES (0xFF, 'bad'); +INSERT INTO t1 (b, type) VALUES (0xA140, 'mb2,unassigned'); +INSERT INTO t1 (b, type) VALUES (0xA1A3, 'mb2'); +INSERT INTO t1 (b, type) VALUES (0xFE40, 'mb2'); +CREATE TABLE t2 AS SELECT + CONCAT(t1.b,t2.b) AS b, + t1.type AS type1, + t2.type AS type2, + CONCAT('[',t1.type,'][',t2.type,']') AS comment +FROM t1, t1 t2; + +CREATE TABLE t3 +( + b VARBINARY(16), + c VARCHAR(16) CHARACTER SET gbk, + comment VARCHAR(128) +); +--echo # +--echo # A combination of two valid characters, should give no warnings +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE + (FIND_IN_SET('ascii',type1) OR FIND_IN_SET('mb2',type1)) AND + (FIND_IN_SET('ascii',type2) OR FIND_IN_SET('mb2',type2)) +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + +--echo # +--echo # Sequences that start with a tail or a bad byte, +--echo # or end with a bad byte, all should be fixed. +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE type1='tail' OR type1='bad' OR type2='bad' +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + +--echo # +--echo # Sequences that start with an ASCII or an MB2 character, +--echo # followed by a non-ASCII tail, all should be fixed. +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('mb2',type1) OR FIND_IN_SET('ascii',type1)) + AND (FIND_IN_SET('tail',type2) AND NOT FIND_IN_SET('ascii',type2)) +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + +--echo # +--echo # Other sequences +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t3; +DROP TABLE t3; +DROP TABLE t2; + +CREATE TABLE t2 AS SELECT + CONCAT(t1.b,t2.b,t3.b) AS b, + t1.type AS type1, + t2.type AS type2, + t3.type AS type3, + CONCAT('[',t1.type,'][',t2.type,'][',t3.type,']') AS comment +FROM t1, t1 t2,t1 t3; +SELECT COUNT(*) FROM t2; + +CREATE TABLE t3 +( + b VARBINARY(16), + c VARCHAR(16) CHARACTER SET gbk, + comment VARCHAR(128) +); + +--echo # +--echo # A combination of three valid characters, should give no warnings +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE + (FIND_IN_SET('ascii',type1) OR FIND_IN_SET('mb2',type1)) AND + (FIND_IN_SET('ascii',type2) OR FIND_IN_SET('mb2',type2)) AND + (FIND_IN_SET('ascii',type3) OR FIND_IN_SET('mb2',type3)) +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + +--echo # +--echo # Sequences that start with a tail or a bad byte, +--echo # or have a bad byte, all should be fixed. +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE type1='tail' OR type1='bad' OR type2='bad' OR type3='bad' +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + +--echo # +--echo # Sequences that start with an ASCII or an MB2 character, +--echo # followed by a pure non-ASCII tail, all should be fixed. +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('mb2',type1) OR FIND_IN_SET('ascii',type1)) + AND type2='tail' +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + +--echo # +--echo # Sequences that consist of two ASCII or MB2 characters, +--echo # followed by a pure non-ASCII tail, all should be fixed. +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('mb2',type1) OR FIND_IN_SET('ascii',type1)) AND + (FIND_IN_SET('mb2',type2) OR FIND_IN_SET('ascii',type2)) AND + type3='tail' +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + + +--echo # +--echo # Sequences that consist of two MB2 characters, +--echo # followed by a non-ASCII head or tail, all should be fixed. +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE FIND_IN_SET('mb2',type1) AND FIND_IN_SET('mb2',type2) + AND NOT FIND_IN_SET('ascii',type3) + AND NOT FIND_IN_SET('mb2',type3) +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + + +--echo # +--echo # Sequences that consist of head + tail + MB2 should go without warnings +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE FIND_IN_SET('head',type1) + AND FIND_IN_SET('tail',type2) + AND FIND_IN_SET('mb2',type3) +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + +--echo # +--echo # Sequences that consist of (ascii or mb2) + head + tail should go without warnings +--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 +WHERE (FIND_IN_SET('ascii',type1) OR FIND_IN_SET('mb2',type1)) + AND FIND_IN_SET('head',type2) + AND FIND_IN_SET('tail',type3) +ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; +DELETE FROM t2 WHERE b IN (SELECT b FROM t3); +DELETE FROM t3; + + +#--echo # +#--echo # Other sequences +#--echo # +INSERT INTO t3 (b,c,comment) SELECT b,b,comment FROM t2 ORDER BY b; +SELECT COUNT(*) FROM t3; +SELECT HEX(c),comment FROM t3 WHERE b=c ORDER BY b; +SELECT HEX(c),HEX(b),comment FROM t3 WHERE b<>c ORDER BY b; + +DROP TABLE t3; +DROP TABLE t2; +DROP TABLE t1; + +--echo # +--echo # END OF MDEV-6566 Different INSERT behaviour on bad bytes with and without character set conversion +--echo # + +--echo # +--echo # End of 10.1 tests +--echo # diff --git a/mysql-test/t/ctype_sjis.test b/mysql-test/t/ctype_sjis.test index ae110b20cb2..2777cf6a035 100644 --- a/mysql-test/t/ctype_sjis.test +++ b/mysql-test/t/ctype_sjis.test @@ -145,7 +145,7 @@ DROP TEMPORARY TABLE head, tail; SHOW CREATE TABLE t1; UPDATE t1 SET a=unhex(code) ORDER BY code; SELECT COUNT(*) FROM t1; -SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=1; +SELECT COUNT(*) FROM t1 WHERE a<>'?' AND OCTET_LENGTH(a)=1; SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; # # Display all characters that have upper or lower case mapping. diff --git a/mysql-test/t/ctype_ujis.test b/mysql-test/t/ctype_ujis.test index 48dc0e63058..94fc7ffe4c0 100644 --- a/mysql-test/t/ctype_ujis.test +++ b/mysql-test/t/ctype_ujis.test @@ -1276,7 +1276,7 @@ SHOW CREATE TABLE t1; UPDATE t1 SET a=unhex(code) ORDER BY code; SELECT COUNT(*) FROM t1; -SELECT COUNT(*) FROM t1 WHERE a<>''; +SELECT COUNT(*) FROM t1 WHERE a<>'?'; SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=2; SELECT COUNT(*) FROM t1 WHERE a<>'' AND OCTET_LENGTH(a)=3; # diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index af5f4b8ccf8..7897462aa02 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -1756,3 +1756,19 @@ let $ctype_unescape_combinations=selected; --echo # --echo # End of 10.0 tests --echo # + + +--echo # +--echo # Start of 10.1 tests +--echo # + +--echo # +--echo # MDEV-6572 "USE dbname" with a bad sequence erroneously connects to a wrong database +--echo # +SET NAMES utf8; +--error ER_INVALID_CHARACTER_STRING +SELECT * FROM `test😁😁test`; + +--echo # +--echo # End of 10.1 tests +--echo # diff --git a/mysql-test/t/ctype_utf8mb4.test b/mysql-test/t/ctype_utf8mb4.test index 7a3c67bb417..55909d6a6c8 100644 --- a/mysql-test/t/ctype_utf8mb4.test +++ b/mysql-test/t/ctype_utf8mb4.test @@ -1832,7 +1832,66 @@ set @@collation_connection=utf8mb4_bin; --echo # End of 5.6 tests --echo # +--echo # +--echo # Start of 10.0 tests +--echo # + +--echo # +--echo # MDEV-6566 Different INSERT behaviour on bad bytes with and without character set conversion +--echo # + +--echo # +--echo # This test sets session character set to 3-byte utf8, +--echo # but then sends a 4-byte sequence (which is wrong for 3-byte utf8). +--echo # It should be replaced to four question marks: '????' in both columns +--echo # (i.e. four unknown bytes are replaced to four question marks), +--echo # then the rest of the string should be stored, so we get 'a ???? b'. +--echo # +SET NAMES utf8; +CREATE TABLE t1 ( + a VARCHAR(32) CHARACTER SET utf8mb4, + b VARCHAR(32) CHARACTER SET utf8 +); +INSERT INTO t1 SELECT 'a 😁 b', 'a 😁 b'; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # This test sets session character set to 4-byte utf8, +--echo # then normally sends a 4-byte sequence. +--echo # It should be stored AS IS into the utf8mb4 column (a), +--echo # and should be replaced to a single question mark in the utf8 column (b) +--echo # (i.e. one character that cannot be converted is replaced to one question mark). +--echo # + +SET NAMES utf8mb4; +CREATE TABLE t1 ( + a VARCHAR(32) CHARACTER SET utf8mb4, + b VARCHAR(32) CHARACTER SET utf8 +); +INSERT INTO t1 SELECT 'a 😁 b', 'a 😁 b'; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # End of 10.0 tests +--echo # --echo # --echo # End of tests --echo # + +--echo # +--echo # Start of 10.1 tests +--echo # + +--echo # +--echo # MDEV-6572 "USE dbname" with a bad sequence erroneously connects to a wrong database +--echo # +SET NAMES utf8mb4; +--error ER_INVALID_CHARACTER_STRING +SELECT * FROM `test😁😁test`; + +--echo # +--echo # End of 10.1 tests +--echo # diff --git a/mysql-test/t/gis.test b/mysql-test/t/gis.test index a4e95b7549e..125bd310844 100644 --- a/mysql-test/t/gis.test +++ b/mysql-test/t/gis.test @@ -1486,3 +1486,23 @@ ALTER TABLE t1 ADD fid INT NOT NULL; select SRID from information_schema.geometry_columns where F_TABLE_NAME='t1'; drop table t1; +--echo # +--echo # MDEV-7510 GIS: IsRing returns false for a primitive triangle. +--echo # +select ST_IsRing(ST_LineFromText('LINESTRING(0 0,0 10,10 10,0 0)')); +select ST_IsRing(ST_LineFromText('LINESTRING(0 0,0 10,10 10,-10 -10, 0 -10, 0 0)')); + +--echo # +--echo # MDEV-7514 GIS: PointOnSurface returns NULL instead of the point. +--echo # +SELECT ST_GEOMETRYTYPE(ST_PointOnSurface(ST_PolyFromText('POLYGON((-70.916 42.1002,-70.9468 42.0946,-70.9754 42.0875,-70.9749 42.0879,-70.9759 42.0897,-70.916 42.1002))'))); + +--echo # +--echo # MDEV-7529 GIS: ST_Relate returns unexpected results for POINT relations +--echo # +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'T*F**FFF*') AS equals; +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'T*****FF*') AS contains; +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'T*F**F***') AS within; +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(1 1)'),'FF*FF****') as disjoint; +select ST_Relate(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)'),'FF*FF****') as disjoint; + diff --git a/mysql-test/t/mysql.test b/mysql-test/t/mysql.test index 2b4b1e69ab6..c328ab19ffd 100644 --- a/mysql-test/t/mysql.test +++ b/mysql-test/t/mysql.test @@ -608,5 +608,29 @@ EOF # --exec $MYSQL -t -N -e "SELECT 'a' union select 'aaaaaaaaaaaaaaaaa'" +--echo # +--echo # Start of 10.1 tests +--echo # + +--echo # +--echo # MDEV-6572 "USE dbname" with a bad sequence erroneously connects to a wrong database +--echo # + +--echo # +--echo # End of 10.1 tests +--echo # + +--error 1 +--exec $MYSQL --default-character-set=utf8 -e "select 1" "test😁 " 2>&1 +--error 1 +--exec $MYSQL --default-character-set=binary -e "select 1" "test😁 " 2>&1 +--write_file $MYSQLTEST_VARDIR/tmp/mdev-6572.sql +SET NAMES utf8; +USE test😁 ; +EOF +--error 1 +--exec $MYSQL --default-character-set=utf8 < $MYSQLTEST_VARDIR/tmp/mdev-6572.sql 2>&1 +--remove_file $MYSQLTEST_VARDIR/tmp/mdev-6572.sql + --echo --echo End of tests diff --git a/mysql-test/t/set_statement.test b/mysql-test/t/set_statement.test index 29ed9d0a8b4..13c6d08818b 100644 --- a/mysql-test/t/set_statement.test +++ b/mysql-test/t/set_statement.test @@ -1050,14 +1050,8 @@ set statement autocommit=default for select 1; --error ER_SET_STATEMENT_NOT_SUPPORTED set statement tx_isolation=default for select 1; --error ER_SET_STATEMENT_NOT_SUPPORTED -set statement rand_seed1=default for select 1; ---error ER_SET_STATEMENT_NOT_SUPPORTED -set statement rand_seed2=default for select 1; ---error ER_SET_STATEMENT_NOT_SUPPORTED set statement skip_replication=default for select 1; --error ER_SET_STATEMENT_NOT_SUPPORTED -set statement last_insert_id=1 for select 1; ---error ER_SET_STATEMENT_NOT_SUPPORTED set statement sql_log_off=default for select 1; --error ER_SET_STATEMENT_NOT_SUPPORTED set statement character_set_client=default for select 1; @@ -1117,3 +1111,23 @@ set @@old_passwords=@save_old_passwords; --error ER_UNKNOWN_SYSTEM_VARIABLE set statement non_existing=1 for select 1; show errors; + +--echo # +--echo # MDEV-6954: SET STATEMENT rand_seedX = ...FOR ... makes +--echo # the next rand() to return 0 +--echo # +set @rnd=1; +let $1=10; +--disable_query_log +--echo # test that rand() is not always 0 after restoring rand_seed, rand_seed2... +while ($1) +{ + --disable_result_log + set statement rand_seed1=1, rand_seed2=1 for select 1; + --enable_result_log + set @rnd= rand()=0 and @rnd; + dec $1; +} +--enable_query_log +--echo # @rnd should be 0 +select @rnd; diff --git a/mysql-test/t/set_statement_notembedded_binlog.test b/mysql-test/t/set_statement_notembedded_binlog.test index c9c23342936..62c351ed6f7 100644 --- a/mysql-test/t/set_statement_notembedded_binlog.test +++ b/mysql-test/t/set_statement_notembedded_binlog.test @@ -20,3 +20,68 @@ set statement gtid_domain_id = 20 for insert into t1 values (3),(4); show binlog events limit 5,5; drop table t1; + +reset master; +SET @a=11; + +create table t1 (a int not null auto_increment, c int, d int, primary key (a)); +create table t2 (b int); +insert into t2 values (1),(2); + +DELIMITER |; +CREATE function f1() returns int +BEGIN + SET STATEMENT last_insert_id=@a for insert into t1 values (NULL, @a, + last_insert_id()); + SET @a:=@a*100+13; + return @a; +end| +DELIMITER ;| + + +call mtr.add_suppression("Unsafe statement written to the binary log using"); +select f1() from t2; + +--replace_column 1 x 2 x 3 x 4 x 5 x +show binlog events limit 16, 100; + +select * from t1; + +drop function f1; +drop table t1,t2; + + +reset master; +SET @a=11; + +create table t1 (a int not null auto_increment, c int, d int, primary key (a)); +create table t2 (b int); +insert into t2 values (1),(2); + +DELIMITER |; +CREATE function f1() returns int +BEGIN + SET @save= @@last_insert_id; + SET session last_insert_id=@a; + insert into t1 values (NULL, @a, last_insert_id()); + SET session last_insert_id=@save; + SET @a:=@a*100+13; + return @a; +end| +DELIMITER ;| + +select f1() from t2; + +--replace_column 1 x 2 x 3 x 4 x 5 x +show binlog events limit 13, 100; + +select * from t1; + +drop function f1; +drop table t1,t2; + +reset master; +set statement last_insert_id = 112 for create table t1 as select last_insert_id(); +--replace_column 1 x 2 x 3 x 4 x 5 x +show binlog events limit 4,1; +drop table t1; diff --git a/mysql-test/t/type_varchar.test b/mysql-test/t/type_varchar.test index 528d26d6f86..cc09069508f 100644 --- a/mysql-test/t/type_varchar.test +++ b/mysql-test/t/type_varchar.test @@ -240,6 +240,42 @@ SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1=t2.c1; EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1=t2.c1; DROP TABLE IF EXISTS t1,t2; + +--echo # +--echo # MDEV-6989 BINARY and COLLATE xxx_bin comparisions are not used for optimization in some cases +--echo # +CREATE TABLE t1 (c1 VARCHAR(20) CHARACTER SET latin1, PRIMARY KEY(c1)); +INSERT INTO t1 VALUES ('a'),('b'),('c'),('d'); +SELECT * FROM t1 WHERE c1=BINARY 'a'; +EXPLAIN SELECT * FROM t1 WHERE c1=BINARY 'a'; +SELECT * FROM t1 WHERE c1=_latin1'a' COLLATE latin1_bin; +EXPLAIN SELECT * FROM t1 WHERE c1=_latin1'a' COLLATE latin1_bin; +DROP TABLE t1; + +CREATE TABLE t1 (c1 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_bin); +INSERT INTO t1 VALUES ('a'); +CREATE TABLE t2 (c1 VARCHAR(10) CHARACTER SET latin1, PRIMARY KEY(c1)); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +EXPLAIN SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +ALTER TABLE t1 MODIFY c1 VARBINARY(10); +SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +EXPLAIN SELECT * FROM t1, t2 WHERE t1.c1=t2.c1; +DROP TABLE t1, t2; + +CREATE TABLE t1 (c1 VARCHAR(10) CHARACTER SET latin1 COLLATE latin1_bin); +INSERT INTO t1 VALUES ('a'),('c'); +CREATE TABLE t2 (c1 VARCHAR(10) CHARACTER SET latin1, PRIMARY KEY(c1)); +INSERT INTO t2 VALUES ('a'),('b'); +SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +--echo # t2 should be eliminated +EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +ALTER TABLE t1 MODIFY c1 VARBINARY(10); +SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +--echo # t2 should be eliminated +EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 USING (c1); +DROP TABLE t1,t2; + --echo # --echo # End of 10.0 tests --echo # diff --git a/mysys/stacktrace.c b/mysys/stacktrace.c index 613911e4495..4cc767f924d 100644 --- a/mysys/stacktrace.c +++ b/mysys/stacktrace.c @@ -315,12 +315,11 @@ inline uint32* find_prev_pc(uint32* pc, uchar** fp) void my_print_stacktrace(uchar* stack_bottom, ulong thread_stack) { - uchar** fp; + uchar** UNINIT_VAR(fp); uint frame_count = 0, sigreturn_frame_count; #if defined(__alpha__) && defined(__GNUC__) uint32* pc; #endif - LINT_INIT(fp); #ifdef __i386__ diff --git a/plugin/example_key_management_plugin/example_key_management_plugin.cc b/plugin/example_key_management_plugin/example_key_management_plugin.cc index f590fbb55b8..580e9ea7091 100644 --- a/plugin/example_key_management_plugin/example_key_management_plugin.cc +++ b/plugin/example_key_management_plugin/example_key_management_plugin.cc @@ -6,6 +6,7 @@ #include #include #include +#include "sql_class.h" /* rotate key randomly between 45 and 90 seconds */ #define KEY_ROTATION_MIN 45 @@ -80,7 +81,14 @@ static int example_key_management_plugin_init(void *p) my_rnd_init(&seed, time(0), 0); get_latest_key_version(); - my_aes_init_dynamic_encrypt(MY_AES_ALGORITHM_CTR); + if (current_aes_dynamic_method == MY_AES_ALGORITHM_NONE) + { + sql_print_error("No encryption method choosen with --encryption-algorithm. " + "example_key_management_plugin disabled"); + return 1; + } + + my_aes_init_dynamic_encrypt(current_aes_dynamic_method); pthread_mutex_init(&mutex, NULL); diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc index 55f81057d03..c88c162be03 100644 --- a/plugin/semisync/semisync_master.cc +++ b/plugin/semisync/semisync_master.cc @@ -1050,8 +1050,6 @@ int ReplSemiSyncMaster::readSlaveReply(NET *net, uint32 server_id, ulong trc_level = trace_level_; LINT_INIT_STRUCT(start_ts); - LINT_INIT_STRUCT(start_ts); - function_enter(kWho); assert((unsigned char)event_buf[1] == kPacketMagicNum); diff --git a/scripts/mysql_system_tables_fix.sql b/scripts/mysql_system_tables_fix.sql index 231c5951a2d..df72cdd9f49 100644 --- a/scripts/mysql_system_tables_fix.sql +++ b/scripts/mysql_system_tables_fix.sql @@ -1,5 +1,5 @@ -- Copyright (C) 2003, 2013 Oracle and/or its affiliates. --- Copyright (C) 2010, 2014 SkySQL Ab. +-- Copyright (C) 2010, 2015 MariaDB Corporation. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -14,8 +14,10 @@ -- along with this program; if not, write to the Free Software -- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# This part converts any old privilege tables to privilege tables suitable -# for current version of MySQL +# WARNING: Do not use this script to upgrade system tables older that v5.1. + +# This part converts old privilege tables to privilege tables suitable +# for current version of MySQL/MariaDB server. # You can safely ignore all 'Duplicate column' and 'Unknown column' errors # because these just mean that your tables are already up to date. @@ -27,213 +29,9 @@ set sql_mode=''; set storage_engine=MyISAM; -ALTER TABLE user add File_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL; - -# Detect whether or not we had the Grant_priv column -SET @hadGrantPriv:=0; -SELECT @hadGrantPriv:=1 FROM user WHERE Grant_priv LIKE '%'; - -ALTER TABLE user add Grant_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add References_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add Index_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add Alter_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL; -ALTER TABLE host add Grant_priv enum('N','Y') NOT NULL,add References_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add Index_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add Alter_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL; -ALTER TABLE db add Grant_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add References_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add Index_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL,add Alter_priv enum('N','Y') COLLATE utf8_general_ci NOT NULL; - -# Fix privileges for old tables -UPDATE user SET Grant_priv=File_priv,References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0; -UPDATE db SET References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0; -UPDATE host SET References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0; - -# -# The second alter changes ssl_type to new 4.0.2 format -# Adding columns needed by GRANT .. REQUIRE (openssl) - -ALTER TABLE user -ADD ssl_type enum('','ANY','X509', 'SPECIFIED') COLLATE utf8_general_ci NOT NULL, -ADD ssl_cipher BLOB NOT NULL, -ADD x509_issuer BLOB NOT NULL, -ADD x509_subject BLOB NOT NULL; -ALTER TABLE user MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') NOT NULL; - -# -# tables_priv -# -ALTER TABLE tables_priv - ADD KEY Grantor (Grantor); - -ALTER TABLE tables_priv - MODIFY Host char(60) NOT NULL default '', - MODIFY Db char(64) NOT NULL default '', - MODIFY User char(80) NOT NULL default '', - MODIFY Table_name char(64) NOT NULL default '', - MODIFY Grantor char(141) NOT NULL default '', - ENGINE=MyISAM, - CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; - -ALTER TABLE tables_priv - MODIFY Column_priv set('Select','Insert','Update','References') - COLLATE utf8_general_ci DEFAULT '' NOT NULL, - MODIFY Table_priv set('Select','Insert','Update','Delete','Create', - 'Drop','Grant','References','Index','Alter', - 'Create View','Show view','Trigger') - COLLATE utf8_general_ci DEFAULT '' NOT NULL, - COMMENT='Table privileges'; - -# -# columns_priv -# -# -# Name change of Type -> Column_priv from MySQL 3.22.12 -# -ALTER TABLE columns_priv - CHANGE Type Column_priv set('Select','Insert','Update','References') - COLLATE utf8_general_ci DEFAULT '' NOT NULL; - -ALTER TABLE columns_priv - MODIFY Host char(60) NOT NULL default '', - MODIFY Db char(64) NOT NULL default '', - MODIFY User char(80) NOT NULL default '', - MODIFY Table_name char(64) NOT NULL default '', - MODIFY Column_name char(64) NOT NULL default '', - ENGINE=MyISAM, - CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin, - COMMENT='Column privileges'; - -ALTER TABLE columns_priv - MODIFY Column_priv set('Select','Insert','Update','References') - COLLATE utf8_general_ci DEFAULT '' NOT NULL; - -# -# Add the new 'type' column to the func table. -# - -ALTER TABLE func add type enum ('function','aggregate') COLLATE utf8_general_ci NOT NULL; - -# -# Change the user,db and host tables to current format -# - -# Detect whether we had Show_db_priv -SET @hadShowDbPriv:=0; -SELECT @hadShowDbPriv:=1 FROM user WHERE Show_db_priv LIKE '%'; - -ALTER TABLE user -ADD Show_db_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Alter_priv, -ADD Super_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Show_db_priv, -ADD Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Super_priv, -ADD Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_tmp_table_priv, -ADD Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv, -ADD Repl_slave_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Execute_priv, -ADD Repl_client_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Repl_slave_priv; - -# Convert privileges so that users have similar privileges as before - -UPDATE user SET Show_db_priv= Select_priv, Super_priv=Process_priv, Execute_priv=Process_priv, Create_tmp_table_priv='Y', Lock_tables_priv='Y', Repl_slave_priv=file_priv, Repl_client_priv=File_priv where user<>"" AND @hadShowDbPriv = 0; - - -# Add fields that can be used to limit number of questions and connections -# for some users. - -ALTER TABLE user -ADD max_questions int(11) NOT NULL DEFAULT 0 AFTER x509_subject, -ADD max_updates int(11) unsigned NOT NULL DEFAULT 0 AFTER max_questions, -ADD max_connections int(11) unsigned NOT NULL DEFAULT 0 AFTER max_updates; - - -# -# Add Create_tmp_table_priv and Lock_tables_priv to db and host -# - -ALTER TABLE db -ADD Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, -ADD Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL; -ALTER TABLE host -ADD Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL, -ADD Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL; - -alter table user change max_questions max_questions int(11) unsigned DEFAULT 0 NOT NULL; - - -alter table db comment='Database privileges'; -alter table host comment='Host privileges; Merged with database privileges'; -alter table user comment='Users and global privileges'; -alter table func comment='User defined functions'; - -# Convert all tables to UTF-8 with binary collation -# and reset all char columns to correct width -ALTER TABLE user - MODIFY Host char(60) NOT NULL default '', - MODIFY User char(80) NOT NULL default '', - ENGINE=MyISAM, CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; -ALTER TABLE user - MODIFY Password char(41) character set latin1 collate latin1_bin NOT NULL default '', - MODIFY Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Reload_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Shutdown_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Process_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY File_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Show_db_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Super_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Repl_slave_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Repl_client_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') COLLATE utf8_general_ci DEFAULT '' NOT NULL; - -ALTER TABLE db - MODIFY Host char(60) NOT NULL default '', - MODIFY Db char(64) NOT NULL default '', - MODIFY User char(80) NOT NULL default '', - ENGINE=MyISAM, CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; -ALTER TABLE db - MODIFY Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL; - -ALTER TABLE host - MODIFY Host char(60) NOT NULL default '', - MODIFY Db char(64) NOT NULL default '', - ENGINE=MyISAM, CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; -ALTER TABLE host - MODIFY Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL, - MODIFY Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL; - -ALTER TABLE func - ENGINE=MyISAM, CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; -ALTER TABLE func - MODIFY type enum ('function','aggregate') COLLATE utf8_general_ci NOT NULL; - # # Modify log tables. # - SET @old_log_state = @@global.general_log; SET GLOBAL general_log = 'OFF'; ALTER TABLE general_log @@ -267,130 +65,25 @@ ALTER TABLE slow_log MODIFY thread_id BIGINT(21) UNSIGNED NOT NULL; SET GLOBAL slow_query_log = @old_log_state; +# +# Modify plugin table. +# ALTER TABLE plugin MODIFY name varchar(64) COLLATE utf8_general_ci NOT NULL DEFAULT '', MODIFY dl varchar(128) COLLATE utf8_general_ci NOT NULL DEFAULT '', CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; # -# Detect whether we had Create_view_priv -# -SET @hadCreateViewPriv:=0; -SELECT @hadCreateViewPriv:=1 FROM user WHERE Create_view_priv LIKE '%'; - -# -# Create VIEWs privileges (v5.0) -# -ALTER TABLE db ADD Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv; -ALTER TABLE db MODIFY Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv; - -ALTER TABLE host ADD Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv; -ALTER TABLE host MODIFY Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv; - -ALTER TABLE user ADD Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Repl_client_priv; -ALTER TABLE user MODIFY Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Repl_client_priv; - -# -# Show VIEWs privileges (v5.0) -# -ALTER TABLE db ADD Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; -ALTER TABLE db MODIFY Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; - -ALTER TABLE host ADD Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; -ALTER TABLE host MODIFY Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; - -ALTER TABLE user ADD Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; -ALTER TABLE user MODIFY Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; - -# -# Assign create/show view privileges to people who have create provileges -# -UPDATE user SET Create_view_priv=Create_priv, Show_view_priv=Create_priv where user<>"" AND @hadCreateViewPriv = 0; - -# -# -# -SET @hadCreateRoutinePriv:=0; -SELECT @hadCreateRoutinePriv:=1 FROM user WHERE Create_routine_priv LIKE '%'; - -# -# Create PROCEDUREs privileges (v5.0) -# -ALTER TABLE db ADD Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; -ALTER TABLE db MODIFY Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; - -ALTER TABLE host ADD Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; -ALTER TABLE host MODIFY Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; - -ALTER TABLE user ADD Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; -ALTER TABLE user MODIFY Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; - -# -# Alter PROCEDUREs privileges (v5.0) -# -ALTER TABLE db ADD Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; -ALTER TABLE db MODIFY Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; - -ALTER TABLE host ADD Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; -ALTER TABLE host MODIFY Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; - -ALTER TABLE user ADD Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; -ALTER TABLE user MODIFY Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; - -ALTER TABLE db ADD Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; -ALTER TABLE db MODIFY Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; - -ALTER TABLE host ADD Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; -ALTER TABLE host MODIFY Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; - -# -# Assign create/alter routine privileges to people who have create privileges -# -UPDATE user SET Create_routine_priv=Create_priv, Alter_routine_priv=Alter_priv where user<>"" AND @hadCreateRoutinePriv = 0; -UPDATE db SET Create_routine_priv=Create_priv, Alter_routine_priv=Alter_priv, Execute_priv=Select_priv where user<>"" AND @hadCreateRoutinePriv = 0; -UPDATE host SET Create_routine_priv=Create_priv, Alter_routine_priv=Alter_priv, Execute_priv=Select_priv where @hadCreateRoutinePriv = 0; - -# -# Add max_user_connections resource limit -# this is signed in MariaDB so that if one sets it's to -1 then the user -# can't connect anymore. +# Add max_user_connections resource limit. +# This is signed in MariaDB so that if one sets it to -1 then the user +# cannot connect anymore. # ALTER TABLE user ADD max_user_connections int(11) DEFAULT '0' NOT NULL AFTER max_connections; ALTER TABLE user MODIFY max_user_connections int(11) DEFAULT '0' NOT NULL AFTER max_connections; -# -# user.Create_user_priv -# - -SET @hadCreateUserPriv:=0; -SELECT @hadCreateUserPriv:=1 FROM user WHERE Create_user_priv LIKE '%'; - -ALTER TABLE user ADD Create_user_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; -ALTER TABLE user MODIFY Create_user_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; -UPDATE user LEFT JOIN db USING (Host,User) SET Create_user_priv='Y' - WHERE @hadCreateUserPriv = 0 AND - (user.Grant_priv = 'Y' OR db.Grant_priv = 'Y'); - # # procs_priv # - -ALTER TABLE procs_priv - ENGINE=MyISAM, - CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; - -ALTER TABLE procs_priv - MODIFY Proc_priv set('Execute','Alter Routine','Grant') - COLLATE utf8_general_ci DEFAULT '' NOT NULL; - -ALTER IGNORE TABLE procs_priv - MODIFY Routine_name char(64) - COLLATE utf8_general_ci DEFAULT '' NOT NULL; - -ALTER TABLE procs_priv - ADD Routine_type enum('FUNCTION','PROCEDURE') - COLLATE utf8_general_ci NOT NULL AFTER Routine_name; - ALTER TABLE procs_priv MODIFY Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER Proc_priv; @@ -399,17 +92,7 @@ ALTER TABLE procs_priv # # Correct the name fields to not binary, and expand sql_data_access -ALTER TABLE proc MODIFY name char(64) DEFAULT '' NOT NULL, - MODIFY specific_name char(64) DEFAULT '' NOT NULL, - MODIFY sql_data_access - enum('CONTAINS_SQL', - 'NO_SQL', - 'READS_SQL_DATA', - 'MODIFIES_SQL_DATA' - ) DEFAULT 'CONTAINS_SQL' NOT NULL, - MODIFY body longblob NOT NULL, - MODIFY returns longblob NOT NULL, - MODIFY sql_mode +ALTER TABLE proc MODIFY sql_mode set('REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', @@ -445,21 +128,9 @@ ALTER TABLE proc MODIFY name char(64) DEFAULT '' NOT NULL, ) DEFAULT '' NOT NULL, DEFAULT CHARACTER SET utf8; -# Correct the character set and collation -ALTER TABLE proc CONVERT TO CHARACTER SET utf8; # Reset some fields after the conversion -ALTER TABLE proc MODIFY db - char(64) collate utf8_bin DEFAULT '' NOT NULL, - MODIFY definer - char(141) collate utf8_bin DEFAULT '' NOT NULL, - MODIFY comment - char(64) collate utf8_bin DEFAULT '' NOT NULL; - -ALTER TABLE proc ADD character_set_client - char(32) collate utf8_bin DEFAULT NULL - AFTER comment; -ALTER TABLE proc MODIFY character_set_client - char(32) collate utf8_bin DEFAULT NULL; +ALTER TABLE proc MODIFY definer + char(141) collate utf8_bin DEFAULT '' NOT NULL; SELECT CASE WHEN COUNT(*) > 0 THEN CONCAT ("WARNING: NULL values of the 'character_set_client' column ('mysql.proc' table) have been updated with a default value (", @@character_set_client, "). Please verify if necessary.") @@ -511,27 +182,9 @@ ALTER TABLE proc MODIFY body_utf8 longblob DEFAULT NULL; ALTER TABLE proc MODIFY comment text collate utf8_bin NOT NULL; -# -# EVENT privilege -# -SET @hadEventPriv := 0; -SELECT @hadEventPriv :=1 FROM user WHERE Event_priv LIKE '%'; - -ALTER TABLE user add Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NOT NULL AFTER Create_user_priv; -ALTER TABLE user MODIFY Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NOT NULL AFTER Create_user_priv; - -UPDATE user SET Event_priv=Super_priv WHERE @hadEventPriv = 0; - -ALTER TABLE db add Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NOT NULL; -ALTER TABLE db MODIFY Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NOT NULL; - # # EVENT table # -ALTER TABLE event DROP PRIMARY KEY; -ALTER TABLE event ADD PRIMARY KEY(db, name); -# Add sql_mode column just in case. -ALTER TABLE event ADD sql_mode set ('IGNORE_BAD_TABLE_OPTIONS') AFTER on_completion; # Update list of sql_mode values. ALTER TABLE event MODIFY sql_mode set('REAL_AS_FLOAT', @@ -567,56 +220,6 @@ ALTER TABLE event MODIFY sql_mode 'NO_ENGINE_SUBSTITUTION', 'PAD_CHAR_TO_FULL_LENGTH' ) DEFAULT '' NOT NULL AFTER on_completion; -ALTER TABLE event MODIFY name char(64) CHARACTER SET utf8 NOT NULL default ''; - -ALTER TABLE event MODIFY COLUMN originator INT UNSIGNED NOT NULL; -ALTER TABLE event ADD COLUMN originator INT UNSIGNED NOT NULL AFTER comment; - -ALTER TABLE event MODIFY COLUMN status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED'; - -ALTER TABLE event ADD COLUMN time_zone char(64) CHARACTER SET latin1 - NOT NULL DEFAULT 'SYSTEM' AFTER originator; - -ALTER TABLE event ADD character_set_client - char(32) collate utf8_bin DEFAULT NULL - AFTER time_zone; -ALTER TABLE event MODIFY character_set_client - char(32) collate utf8_bin DEFAULT NULL; - -ALTER TABLE event ADD collation_connection - char(32) collate utf8_bin DEFAULT NULL - AFTER character_set_client; -ALTER TABLE event MODIFY collation_connection - char(32) collate utf8_bin DEFAULT NULL; - -ALTER TABLE event ADD db_collation - char(32) collate utf8_bin DEFAULT NULL - AFTER collation_connection; -ALTER TABLE event MODIFY db_collation - char(32) collate utf8_bin DEFAULT NULL; - -ALTER TABLE event ADD body_utf8 longblob DEFAULT NULL - AFTER db_collation; -ALTER TABLE event MODIFY body_utf8 longblob DEFAULT NULL; - - -# -# TRIGGER privilege -# - -SET @hadTriggerPriv := 0; -SELECT @hadTriggerPriv :=1 FROM user WHERE Trigger_priv LIKE '%'; - -ALTER TABLE user ADD Trigger_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Event_priv; -ALTER TABLE user MODIFY Trigger_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL AFTER Event_priv; - -ALTER TABLE host ADD Trigger_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL; -ALTER TABLE host MODIFY Trigger_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL; - -ALTER TABLE db ADD Trigger_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL; -ALTER TABLE db MODIFY Trigger_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL; - -UPDATE user SET Trigger_priv=Super_priv WHERE @hadTriggerPriv = 0; # # user.Create_tablespace_priv @@ -705,7 +308,7 @@ alter table servers modify Username char(80) not null alter table procs_priv modify Grantor char(141) COLLATE utf8_bin not null default ''; alter table tables_priv modify Grantor char(141) COLLATE utf8_bin not null default ''; -# Activate the new, possible modified privilege tables +# Activate the new, possibly modified privilege tables. # This should not be needed, but gives us some extra testing that the above # changes was correct diff --git a/sql-common/client.c b/sql-common/client.c index 8d03ffef534..006b17374d0 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -3211,7 +3211,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, uint port, const char *unix_socket,ulong client_flag) { char buff[NAME_LEN+USERNAME_LENGTH+100]; - int scramble_data_len, pkt_scramble_len= 0; + int scramble_data_len, UNINIT_VAR(pkt_scramble_len); char *end,*host_info= 0, *server_version_end, *pkt_end; char *scramble_data; const char *scramble_plugin; @@ -3224,7 +3224,6 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, struct sockaddr_un UNIXaddr; #endif DBUG_ENTER("mysql_real_connect"); - LINT_INIT(pkt_scramble_len); DBUG_PRINT("enter",("host: %s db: %s user: %s (client)", host ? host : "(Null)", diff --git a/sql/create_options.cc b/sql/create_options.cc index 5800003ed49..86fb805315a 100644 --- a/sql/create_options.cc +++ b/sql/create_options.cc @@ -762,9 +762,8 @@ engine_option_value *merge_engine_table_options(engine_option_value *first, engine_option_value *second, MEM_ROOT *root) { - engine_option_value *end, *opt; + engine_option_value *UNINIT_VAR(end), *opt; DBUG_ENTER("merge_engine_table_options"); - LINT_INIT(end); /* Create copy of first list */ for (opt= first, first= 0; opt; opt= opt->next) diff --git a/sql/debug_sync.cc b/sql/debug_sync.cc index 5802d726aa2..2ace83ca751 100644 --- a/sql/debug_sync.cc +++ b/sql/debug_sync.cc @@ -1348,8 +1348,7 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action) if (action->execute) { - const char *old_proc_info; - LINT_INIT(old_proc_info); + const char *UNINIT_VAR(old_proc_info); action->execute--; diff --git a/sql/derror.cc b/sql/derror.cc index f19f73238fb..7ac068300f9 100644 --- a/sql/derror.cc +++ b/sql/derror.cc @@ -152,13 +152,11 @@ bool read_texts(const char *file_name, const char *language, File file; char name[FN_REFLEN]; char lang_path[FN_REFLEN]; - uchar *buff; + uchar *UNINIT_VAR(buff); uchar head[32],*pos; DBUG_ENTER("read_texts"); *point= 0; - - LINT_INIT(buff); funktpos=0; convert_dirname(lang_path, language, NullS); (void) my_load_path(lang_path, lang_path, lc_messages_dir); diff --git a/sql/event_db_repository.cc b/sql/event_db_repository.cc index db4ae3ada46..53b3e96c323 100644 --- a/sql/event_db_repository.cc +++ b/sql/event_db_repository.cc @@ -414,9 +414,7 @@ Event_db_repository::index_read_for_db_for_i_s(THD *thd, TABLE *schema_table, CHARSET_INFO *scs= system_charset_info; KEY *key_info; uint key_len; - uchar *key_buf= NULL; - LINT_INIT(key_buf); - + uchar *key_buf; DBUG_ENTER("Event_db_repository::index_read_for_db_for_i_s"); DBUG_PRINT("info", ("Using prefix scanning on PK")); diff --git a/sql/field.cc b/sql/field.cc index 57721d39d32..0f29c5cbfea 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1246,11 +1246,23 @@ double Field::pos_in_interval_val_str(Field *min, Field *max, uint data_offset) } +/* + This handles all numeric and BIT data types. +*/ +bool Field::can_optimize_keypart_ref(const Item_func *cond, + const Item *item) const +{ + DBUG_ASSERT(cmp_type() != STRING_RESULT); + DBUG_ASSERT(cmp_type() != TIME_RESULT); + return item->cmp_type() != TIME_RESULT; +} + + /* This handles all numeric and BIT data types. */ bool Field::can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item) + const Item *const_item) const { DBUG_ASSERT(cmp_type() != STRING_RESULT); DBUG_ASSERT(cmp_type() != TIME_RESULT); @@ -5270,8 +5282,15 @@ my_decimal *Field_temporal::val_decimal(my_decimal *d) } +bool Field_temporal::can_optimize_keypart_ref(const Item_func *cond, + const Item *value) const +{ + return true; // Field is of TIME_RESULT, which supersedes everything else. +} + + bool Field_temporal::can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item) + const Item *const_item) const { return true; // Field is of TIME_RESULT, which supersedes everything else. } @@ -6468,15 +6487,50 @@ uint32 Field_longstr::max_data_length() const } -bool Field_longstr::can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item) +bool +Field_longstr::cmp_to_string_with_same_collation(const Item_func *cond, + const Item *item) const { - // Can't use indexes when comparing a string to a number or a date - if (const_item->cmp_type() != STRING_RESULT) - return false; + return item->cmp_type() == STRING_RESULT && + charset() == cond->compare_collation(); +} - // Don't use an index when comparing strings of different collations. - return charset() == ((Item_bool_func2*) cond)->compare_collation(); + +bool +Field_longstr::cmp_to_string_with_stricter_collation(const Item_func *cond, + const Item *item) const +{ + return item->cmp_type() == STRING_RESULT && + (charset() == cond->compare_collation() || + cond->compare_collation()->state & MY_CS_BINSORT); +} + + +bool Field_longstr::can_optimize_keypart_ref(const Item_func *cond, + const Item *item) const +{ + DBUG_ASSERT(cmp_type() == STRING_RESULT); + return cmp_to_string_with_stricter_collation(cond, item); +} + + +bool Field_longstr::can_optimize_hash_join(const Item_func *cond, + const Item *item) const +{ + DBUG_ASSERT(cmp_type() == STRING_RESULT); + return cmp_to_string_with_same_collation(cond, item); +} + + +bool Field_longstr::can_optimize_group_min_max(const Item_bool_func2 *cond, + const Item *const_item) const +{ + /* + Can't use indexes when comparing a string to a number or a date + Don't use an index when comparing strings of different collations. + */ + DBUG_ASSERT(cmp_type() == STRING_RESULT); + return cmp_to_string_with_same_collation(cond, const_item); } @@ -8489,6 +8543,31 @@ uint Field_num::is_equal(Create_field *new_field) } +bool Field_enum::can_optimize_keypart_ref(const Item_func *cond, + const Item *item) const +{ + DBUG_ASSERT(cmp_type() == INT_RESULT); + DBUG_ASSERT(result_type() == STRING_RESULT); + + switch (item->cmp_type()) + { + case TIME_RESULT: + return false; + case INT_RESULT: + case DECIMAL_RESULT: + case REAL_RESULT: + return true; + case STRING_RESULT: + return charset() == ((Item_func*)cond)->compare_collation(); + case IMPOSSIBLE_RESULT: + case ROW_RESULT: + DBUG_ASSERT(0); + break; + } + return false; +} + + /* Bit field. diff --git a/sql/field.h b/sql/field.h index ef0fa2765a4..65a71fcbfa4 100644 --- a/sql/field.h +++ b/sql/field.h @@ -39,6 +39,7 @@ class Relay_log_info; class Field; class Column_statistics; class Column_statistics_collected; +class Item_func; class Item_bool_func2; enum enum_check_fields @@ -964,9 +965,21 @@ public: return (double) 0.5; } + virtual bool can_optimize_keypart_ref(const Item_func *cond, + const Item *item) const; + virtual bool can_optimize_hash_join(const Item_func *cond, + const Item *item) const + { + return can_optimize_keypart_ref(cond, item); + } virtual bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item); - + const Item *const_item) const; + bool can_optimize_outer_join_table_elimination(const Item_func *cond, + const Item *item) const + { + // Exactly the same rules with REF access + return can_optimize_keypart_ref(cond, item); + } friend int cre_myisam(char * name, register TABLE *form, uint options, ulonglong auto_increment_value); friend class Copy_field; @@ -1147,6 +1160,10 @@ protected: return report_if_important_data(copier->source_end_pos(), end, count_spaces); } + bool cmp_to_string_with_same_collation(const Item_func *cond, + const Item *item) const; + bool cmp_to_string_with_stricter_collation(const Item_func *cond, + const Item *item) const; public: Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, utype unireg_check_arg, @@ -1158,8 +1175,10 @@ public: int store_decimal(const my_decimal *d); uint32 max_data_length() const; bool match_collation_to_optimize_range() const { return true; } + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; + bool can_optimize_hash_join(const Item_func *cond, const Item *item) const; bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item); + const Item *const_item) const; }; /* base class for float and double and decimal (old one) */ @@ -1587,8 +1606,13 @@ public: uint size_of() const { return sizeof(*this); } uint32 max_display_length() { return 4; } void move_field_offset(my_ptrdiff_t ptr_diff) {} + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const + { + DBUG_ASSERT(0); + return false; + } bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item) + const Item *const_item) const { DBUG_ASSERT(0); return false; @@ -1625,8 +1649,9 @@ public: { return pos_in_interval_val_real(min, max); } + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item); + const Item *const_item) const; }; @@ -2664,8 +2689,9 @@ public: virtual const uchar *unpack(uchar *to, const uchar *from, const uchar *from_end, uint param_data); + bool can_optimize_keypart_ref(const Item_func *cond, const Item *item) const; bool can_optimize_group_min_max(const Item_bool_func2 *cond, - const Item *const_item) + const Item *const_item) const { /* Can't use GROUP_MIN_MAX optimization for ENUM and SET, diff --git a/sql/gcalc_tools.cc b/sql/gcalc_tools.cc index 864437401b7..2d770fd45d6 100644 --- a/sql/gcalc_tools.cc +++ b/sql/gcalc_tools.cc @@ -300,10 +300,10 @@ int Gcalc_function::check_function(Gcalc_scan_iterator &scan_it) gcalc_shape_info si= events->get_shape(); if (events->event == scev_thread || events->event == scev_end || - events->event == scev_single_point || (get_shape_kind(si) == Gcalc_function::shape_polygon)) set_b_state(si); - else if (get_shape_kind(si) == Gcalc_function::shape_line) + else if (events->event == scev_single_point || + get_shape_kind(si) == Gcalc_function::shape_line) set_i_state(si); } diff --git a/sql/handler.cc b/sql/handler.cc index d64c14689bd..2df1476f0e4 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1932,12 +1932,28 @@ int ha_recover(HASH *commit_list) so mysql_xa_recover does not filter XID's to ensure uniqueness. It can be easily fixed later, if necessary. */ + +static my_bool xa_recover_callback(XID_STATE *xs, Protocol *protocol) +{ + if (xs->xa_state == XA_PREPARED) + { + protocol->prepare_for_resend(); + protocol->store_longlong((longlong) xs->xid.formatID, FALSE); + protocol->store_longlong((longlong) xs->xid.gtrid_length, FALSE); + protocol->store_longlong((longlong) xs->xid.bqual_length, FALSE); + protocol->store(xs->xid.data, xs->xid.gtrid_length + xs->xid.bqual_length, + &my_charset_bin); + if (protocol->write()) + return TRUE; + } + return FALSE; +} + + bool mysql_xa_recover(THD *thd) { List field_list; Protocol *protocol= thd->protocol; - int i=0; - XID_STATE *xs; DBUG_ENTER("mysql_xa_recover"); field_list.push_back(new Item_int("formatID", 0, MY_INT32_NUM_DECIMAL_DIGITS)); @@ -1949,26 +1965,9 @@ bool mysql_xa_recover(THD *thd) Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) DBUG_RETURN(1); - mysql_mutex_lock(&LOCK_xid_cache); - while ((xs= (XID_STATE*) my_hash_element(&xid_cache, i++))) - { - if (xs->xa_state==XA_PREPARED) - { - protocol->prepare_for_resend(); - protocol->store_longlong((longlong)xs->xid.formatID, FALSE); - protocol->store_longlong((longlong)xs->xid.gtrid_length, FALSE); - protocol->store_longlong((longlong)xs->xid.bqual_length, FALSE); - protocol->store(xs->xid.data, xs->xid.gtrid_length+xs->xid.bqual_length, - &my_charset_bin); - if (protocol->write()) - { - mysql_mutex_unlock(&LOCK_xid_cache); - DBUG_RETURN(1); - } - } - } - - mysql_mutex_unlock(&LOCK_xid_cache); + if (xid_cache_iterate(thd, (my_hash_walk_action) xa_recover_callback, + protocol)) + DBUG_RETURN(1); my_eof(thd); DBUG_RETURN(0); } @@ -5418,8 +5417,7 @@ int handler::index_read_idx_map(uchar * buf, uint index, const uchar * key, key_part_map keypart_map, enum ha_rkey_function find_flag) { - int error, error1; - LINT_INIT(error1); + int error, UNINIT_VAR(error1); error= ha_index_init(index, 0); if (!error) diff --git a/sql/handler.h b/sql/handler.h index 5ef92088df5..5ab67c045ec 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -612,11 +612,11 @@ struct xid_t { return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+ gtrid_length+bqual_length; } - uchar *key() + uchar *key() const { return (uchar *)>rid_length; } - uint key_length() + uint key_length() const { return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length; } diff --git a/sql/item.h b/sql/item.h index 24ae105421b..db5a94fdb01 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1136,7 +1136,7 @@ public: virtual Item *get_tmp_table_item(THD *thd) { return copy_or_same(thd); } static CHARSET_INFO *default_charset(); - virtual CHARSET_INFO *compare_collation() { return NULL; } + virtual CHARSET_INFO *compare_collation() const { return NULL; } /* For backward compatibility, to make numeric diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 5b7152b57b3..75916456ebd 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -470,8 +470,7 @@ static bool convert_const_to_int(THD *thd, Item_field *field_item, my_bitmap_map *old_maps[2]; ulonglong UNINIT_VAR(orig_field_val); /* original field value if valid */ - LINT_INIT(old_maps[0]); - LINT_INIT(old_maps[1]); + LINT_INIT_STRUCT(old_maps); /* table->read_set may not be set if we come here from a CREATE TABLE */ if (table && table->read_set) @@ -6279,9 +6278,9 @@ void Item_equal::print(String *str, enum_query_type query_type) } -CHARSET_INFO *Item_equal::compare_collation() +CHARSET_INFO *Item_equal::compare_collation() const { - Item_equal_fields_iterator it(*this); + Item_equal_fields_iterator it(*((Item_equal*) this)); Item *item= it++; return item->collation.collation; } diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 7aaef893415..9c5067569c3 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -399,7 +399,8 @@ public: } bool is_null() { return MY_TEST(args[0]->is_null() || args[1]->is_null()); } - CHARSET_INFO *compare_collation() { return cmp.cmp_collation.collation; } + CHARSET_INFO *compare_collation() const + { return cmp.cmp_collation.collation; } void top_level_item() { abort_on_null= TRUE; } Arg_comparator *get_comparator() { return &cmp; } void cleanup() @@ -700,7 +701,7 @@ public: bool fix_fields(THD *, Item **); void fix_length_and_dec(); virtual void print(String *str, enum_query_type query_type); - CHARSET_INFO *compare_collation() { return cmp_collation.collation; } + CHARSET_INFO *compare_collation() const { return cmp_collation.collation; } bool eval_not_null_tables(uchar *opt_arg); void fix_after_pullout(st_select_lex *new_parent, Item **ref); bool count_sargable_conds(uchar *arg); @@ -1319,7 +1320,7 @@ public: const char *func_name() const { return "case"; } virtual void print(String *str, enum_query_type query_type); Item *find_item(String *str); - CHARSET_INFO *compare_collation() { return cmp_collation.collation; } + CHARSET_INFO *compare_collation() const { return cmp_collation.collation; } void cleanup(); void agg_str_lengths(Item *arg); void agg_num_lengths(Item *arg); @@ -1388,7 +1389,7 @@ public: enum Functype functype() const { return IN_FUNC; } const char *func_name() const { return " IN "; } bool nulls_in_row(); - CHARSET_INFO *compare_collation() { return cmp_collation.collation; } + CHARSET_INFO *compare_collation() const { return cmp_collation.collation; } bool eval_not_null_tables(uchar *opt_arg); void fix_after_pullout(st_select_lex *new_parent, Item **ref); }; @@ -1428,7 +1429,8 @@ class Item_func_null_predicate :public Item_bool_func public: Item_func_null_predicate(Item *a) :Item_bool_func(a) { sargable= true; } optimize_type select_optimize() const { return OPTIMIZE_NULL; } - CHARSET_INFO *compare_collation() { return args[0]->collation.collation; } + CHARSET_INFO *compare_collation() const + { return args[0]->collation.collation; } void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=0; } }; @@ -1574,8 +1576,7 @@ public: in case of a "PAD SPACE" collation, but only if "expr2" has '%' at the end. */ - return ((Item_func_like *)this)->compare_collation() == &my_charset_bin ? - COND_TRUE : COND_OK; + return compare_collation() == &my_charset_bin ? COND_TRUE : COND_OK; } const char *func_name() const { return "like"; } bool fix_fields(THD *thd, Item **ref); @@ -1689,7 +1690,7 @@ public: print_op(str, query_type); } - CHARSET_INFO *compare_collation() { return cmp_collation.collation; } + CHARSET_INFO *compare_collation() const { return cmp_collation.collation; } }; @@ -1952,7 +1953,7 @@ public: bool walk(Item_processor processor, bool walk_subquery, uchar *arg); Item *transform(Item_transformer transformer, uchar *arg); virtual void print(String *str, enum_query_type query_type); - CHARSET_INFO *compare_collation(); + CHARSET_INFO *compare_collation() const; void set_context_field(Item_field *ctx_field) { context_field= ctx_field; } void set_link_equal_fields(bool flag) { link_equal_fields= flag; } diff --git a/sql/item_create.cc b/sql/item_create.cc index a53a369de12..a37f61fc6aa 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -5992,6 +5992,18 @@ static Native_func_registry func_array[] = { { C_STRING_WITH_LEN("ST_LINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, { { C_STRING_WITH_LEN("ST_LINESTRINGFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, { { C_STRING_WITH_LEN("ST_LINESTRINGFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, + { { C_STRING_WITH_LEN("ST_MLINEFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, + { { C_STRING_WITH_LEN("ST_MLINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, + { { C_STRING_WITH_LEN("ST_MPOINTFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, + { { C_STRING_WITH_LEN("ST_MPOINTFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, + { { C_STRING_WITH_LEN("ST_MPOLYFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, + { { C_STRING_WITH_LEN("ST_MPOLYFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, + { { C_STRING_WITH_LEN("ST_MULTILINESTRINGFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, + { { C_STRING_WITH_LEN("ST_MULTILINESTRINGFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, + { { C_STRING_WITH_LEN("ST_MULTIPOINTFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, + { { C_STRING_WITH_LEN("ST_MULTIPOINTFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, + { { C_STRING_WITH_LEN("ST_MULTIPOLYGONFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)}, + { { C_STRING_WITH_LEN("ST_MULTIPOLYGONFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)}, { { C_STRING_WITH_LEN("ST_NUMGEOMETRIES") }, GEOM_BUILDER(Create_func_numgeometries)}, { { C_STRING_WITH_LEN("ST_NUMINTERIORRINGS") }, GEOM_BUILDER(Create_func_numinteriorring)}, { { C_STRING_WITH_LEN("ST_NUMPOINTS") }, GEOM_BUILDER(Create_func_numpoints)}, diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 7e8edbc8e7d..9fc8e9d09e0 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -1081,9 +1081,9 @@ static Gcalc_function::op_type op_matrix(int n) switch (n) { case 0: - return Gcalc_function::op_border; - case 1: return Gcalc_function::op_internals; + case 1: + return Gcalc_function::op_border; case 2: return (Gcalc_function::op_type) ((int) Gcalc_function::op_not | (int) Gcalc_function::op_union); @@ -1103,6 +1103,8 @@ static int setup_relate_func(Geometry *g1, Geometry *g2, int last_shape_pos; last_shape_pos= func->get_next_expression_pos(); + if (func->reserve_op_buffer(1)) + return 1; func->add_operation(Gcalc_function::op_intersection, 0); for (int nc=0; nc<9; nc++) { @@ -1120,11 +1122,11 @@ static int setup_relate_func(Geometry *g1, Geometry *g2, cur_op|= Gcalc_function::v_find_t; break; case 'F': - cur_op|= Gcalc_function::v_find_f; + cur_op|= (Gcalc_function::op_not | Gcalc_function::v_find_t); break; }; ++n_operands; - if (func->reserve_op_buffer(1)) + if (func->reserve_op_buffer(3)) return 1; func->add_operation(cur_op, 2); @@ -1867,7 +1869,6 @@ longlong Item_func_issimple::val_int() Gcalc_operation_transporter trn(&func, &collector); Geometry *g; int result= 1; - const Gcalc_scan_iterator::event_point *ev; MBR mbr; const char *c_end; @@ -1892,6 +1893,8 @@ longlong Item_func_issimple::val_int() while (scan_it.more_points()) { + const Gcalc_scan_iterator::event_point *ev, *next_ev; + if (scan_it.step()) goto mem_error; @@ -1899,11 +1902,18 @@ longlong Item_func_issimple::val_int() if (ev->simple_event()) continue; - if ((ev->event == scev_thread || ev->event == scev_single_point) && - !ev->get_next()) + next_ev= ev->get_next(); + if ((ev->event & (scev_thread | scev_single_point)) && !next_ev) continue; - if (ev->event == scev_two_threads && !ev->get_next()->get_next()) + if ((ev->event == scev_two_threads) && !next_ev->get_next()) + continue; + + /* If the first and last points of a curve coincide - that is */ + /* an exception to the rule and the line is considered as simple. */ + if ((next_ev && !next_ev->get_next()) && + (ev->event & (scev_thread | scev_end)) && + (next_ev->event & (scev_thread | scev_end))) continue; result= 0; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 50e29aa4b7c..54fc8d555c8 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1948,8 +1948,7 @@ String *Item_func_ltrim::val_str(String *str) char buff[MAX_FIELD_WIDTH], *ptr, *end; String tmp(buff,sizeof(buff),system_charset_info); String *res, *remove_str; - uint remove_length; - LINT_INIT(remove_length); + uint UNINIT_VAR(remove_length); res= args[0]->val_str(str); if ((null_value=args[0]->null_value)) @@ -1994,8 +1993,7 @@ String *Item_func_rtrim::val_str(String *str) char buff[MAX_FIELD_WIDTH], *ptr, *end; String tmp(buff, sizeof(buff), system_charset_info); String *res, *remove_str; - uint remove_length; - LINT_INIT(remove_length); + uint UNINIT_VAR(remove_length); res= args[0]->val_str(str); if ((null_value=args[0]->null_value)) @@ -2075,8 +2073,7 @@ String *Item_func_trim::val_str(String *str) const char *r_ptr; String tmp(buff, sizeof(buff), system_charset_info); String *res, *remove_str; - uint remove_length; - LINT_INIT(remove_length); + uint UNINIT_VAR(remove_length); res= args[0]->val_str(str); if ((null_value=args[0]->null_value)) diff --git a/sql/key.cc b/sql/key.cc index e3787ea7869..aaecbda57ad 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -656,9 +656,8 @@ int key_tuple_cmp(KEY_PART_INFO *part, uchar *key1, uchar *key2, uint tuple_length) { uchar *key1_end= key1 + tuple_length; - int len; + int UNINIT_VAR(len); int res; - LINT_INIT(len); for (;key1 < key1_end; key1 += len, key2 += len, part++) { len= part->store_length; @@ -709,12 +708,9 @@ ulong key_hashnr(KEY *key_info, uint used_key_parts, const uchar *key) for (; key_part < end_key_part; key_part++) { uchar *pos= (uchar*)key; - CHARSET_INFO *cs; - uint length, pack_length; + CHARSET_INFO *UNINIT_VAR(cs); + uint UNINIT_VAR(length), UNINIT_VAR(pack_length); bool is_string= TRUE; - LINT_INIT(cs); - LINT_INIT(length); - LINT_INIT(pack_length); key+= key_part->length; if (key_part->null_bit) @@ -816,13 +812,9 @@ bool key_buf_cmp(KEY *key_info, uint used_key_parts, { uchar *pos1= (uchar*)key1; uchar *pos2= (uchar*)key2; - CHARSET_INFO *cs; - uint length1, length2, pack_length; + CHARSET_INFO *UNINIT_VAR(cs); + uint UNINIT_VAR(length1), UNINIT_VAR(length2), UNINIT_VAR(pack_length); bool is_string= TRUE; - LINT_INIT(cs); - LINT_INIT(length1); - LINT_INIT(length2); - LINT_INIT(pack_length); key1+= key_part->length; key2+= key_part->length; diff --git a/sql/log.cc b/sql/log.cc index 94536e49145..43eb8be3a59 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -1502,8 +1502,7 @@ bool LOGGER::activate_log_handler(THD* thd, uint log_type) void LOGGER::deactivate_log_handler(THD *thd, uint log_type) { my_bool *tmp_opt= 0; - MYSQL_LOG *file_log; - LINT_INIT(file_log); + MYSQL_LOG *UNINIT_VAR(file_log); switch (log_type) { case QUERY_LOG_SLOW: @@ -4878,8 +4877,7 @@ int MYSQL_BIN_LOG::new_file_impl(bool need_lock) char new_name[FN_REFLEN], *new_name_ptr, *old_name, *file_to_open; uint close_flag; bool delay_close= false; - File old_file; - LINT_INIT(old_file); + File UNINIT_VAR(old_file); DBUG_ENTER("MYSQL_BIN_LOG::new_file_impl"); if (!is_open()) @@ -5873,9 +5871,8 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info, my_bool *with_annotate) bool is_trans_cache= FALSE; bool using_trans= event_info->use_trans_cache(); bool direct= event_info->use_direct_logging(); - ulong prev_binlog_id; + ulong UNINIT_VAR(prev_binlog_id); DBUG_ENTER("MYSQL_BIN_LOG::write(Log_event *)"); - LINT_INIT(prev_binlog_id); if (thd->variables.option_bits & OPTION_GTID_BEGIN) { @@ -7316,10 +7313,9 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader) group_commit_entry *current, *last_in_queue; group_commit_entry *queue= NULL; bool check_purge= false; - ulong binlog_id; + ulong UNINIT_VAR(binlog_id); uint64 commit_id; DBUG_ENTER("MYSQL_BIN_LOG::trx_group_commit_leader"); - LINT_INIT(binlog_id); { DBUG_EXECUTE_IF("inject_binlog_commit_before_get_LOCK_log", @@ -8297,8 +8293,7 @@ int TC_LOG_MMAP::log_and_order(THD *thd, my_xid xid, bool all, { int cookie; struct commit_entry entry; - bool is_group_commit_leader; - LINT_INIT(is_group_commit_leader); + bool UNINIT_VAR(is_group_commit_leader); if (need_prepare_ordered) { @@ -9794,8 +9789,7 @@ binlog_checksum_update(MYSQL_THD thd, struct st_mysql_sys_var *var, { ulong value= *((ulong *)save); bool check_purge= false; - ulong prev_binlog_id; - LINT_INIT(prev_binlog_id); + ulong UNINIT_VAR(prev_binlog_id); mysql_mutex_lock(mysql_bin_log.get_log_lock()); if(mysql_bin_log.is_open()) diff --git a/sql/log_event.cc b/sql/log_event.cc index 7b8bd30f04d..ad9d8f317e6 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -7063,8 +7063,7 @@ bool Intvar_log_event::write(IO_CACHE* file) void Intvar_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info) { char llbuff[22]; - const char *msg; - LINT_INIT(msg); + const char *UNINIT_VAR(msg); Write_on_release_cache cache(&print_event_info->head_cache, file, Write_on_release_cache::FLUSH_F); @@ -11709,14 +11708,12 @@ record_compare_exit: int Rows_log_event::find_key() { uint i, best_key_nr, last_part; - KEY *key, *best_key; - ulong best_rec_per_key, tmp; + KEY *key, *UNINIT_VAR(best_key); + ulong UNINIT_VAR(best_rec_per_key), tmp; DBUG_ENTER("Rows_log_event::find_key"); DBUG_ASSERT(m_table); best_key_nr= MAX_KEY; - LINT_INIT(best_key); - LINT_INIT(best_rec_per_key); /* Keys are sorted so that any primary key is first, followed by unique keys, diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc index 20b1c5d5cc1..61f344d8689 100644 --- a/sql/multi_range_read.cc +++ b/sql/multi_range_read.cc @@ -817,12 +817,11 @@ int DsMrr_impl::dsmrr_init(handler *h_arg, RANGE_SEQ_IF *seq_funcs, THD *thd= current_thd; int res; Key_parameters keypar; - uint key_buff_elem_size; + uint UNINIT_VAR(key_buff_elem_size); /* set/used when do_sort_keys==TRUE */ handler *h_idx; Mrr_ordered_rndpos_reader *disk_strategy= NULL; bool do_sort_keys= FALSE; DBUG_ENTER("DsMrr_impl::dsmrr_init"); - LINT_INIT(key_buff_elem_size); /* set/used when do_sort_keys==TRUE */ /* index_merge may invoke a scan on an object for which dsmrr_info[_const] has not been called, so set the owner handler here as well. diff --git a/sql/mysqld.cc b/sql/mysqld.cc index aa85a023228..ccd291cf226 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1540,8 +1540,7 @@ static void close_connections(void) while (select_thread_in_use) { struct timespec abstime; - int error; - LINT_INIT(error); + int UNINIT_VAR(error); DBUG_PRINT("info",("Waiting for select thread")); #ifndef DONT_USE_THR_ALARM @@ -4890,11 +4889,7 @@ static int init_server_components() my_charset_error_reporter= charset_error_reporter; #endif - if (xid_cache_init()) - { - sql_print_error("Out of memory"); - unireg_abort(1); - } + xid_cache_init(); /* initialize delegates for extension observers, errors have already @@ -7533,8 +7528,7 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff, enum enum_var_type scope) { Master_info *mi= NULL; - bool tmp; - LINT_INIT(tmp); + bool UNINIT_VAR(tmp); var->type= SHOW_MY_BOOL; var->value= buff; @@ -7561,8 +7555,7 @@ static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff, enum enum_var_type scope) { Master_info *mi= NULL; - longlong tmp; - LINT_INIT(tmp); + longlong UNINIT_VAR(tmp); var->type= SHOW_LONGLONG; var->value= buff; @@ -7588,8 +7581,7 @@ static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff, enum enum_var_type scope) { Master_info *mi= NULL; - float tmp; - LINT_INIT(tmp); + float UNINIT_VAR(tmp); var->type= SHOW_CHAR; var->value= buff; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 8f691f4e5dc..4bef42e82bf 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -3235,8 +3235,8 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, { /* Try creating index_merge/ROR-union scan. */ SEL_IMERGE *imerge; - TABLE_READ_PLAN *best_conj_trp= NULL, *new_conj_trp; - LINT_INIT(new_conj_trp); /* no empty index_merge lists possible */ + TABLE_READ_PLAN *best_conj_trp= NULL, + *UNINIT_VAR(new_conj_trp); /* no empty index_merge lists possible */ DBUG_PRINT("info",("No range reads possible," " trying to construct index_merge")); List_iterator_fast it(tree->merges); diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index e26937441d1..9804254b35f 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -3288,8 +3288,7 @@ void fix_semijoin_strategies_for_picked_join_order(JOIN *join) { POSITION *pos= join->best_positions + tablenr; JOIN_TAB *s= pos->table; - uint first; - LINT_INIT(first); // Set by every branch except SJ_OPT_NONE which doesn't use it + uint UNINIT_VAR(first); // Set by every branch except SJ_OPT_NONE which doesn't use it if ((handled_tabs & s->table->map) || pos->sj_strategy == SJ_OPT_NONE) { diff --git a/sql/opt_table_elimination.cc b/sql/opt_table_elimination.cc index 6434c36aaf2..f6e3b619f51 100644 --- a/sql/opt_table_elimination.cc +++ b/sql/opt_table_elimination.cc @@ -1486,28 +1486,8 @@ void check_equality(Dep_analysis_context *ctx, Dep_module_expr **eq_mod, left->real_item()->type() == Item::FIELD_ITEM) { Field *field= ((Item_field*)left->real_item())->field; - if (right->cmp_type() == TIME_RESULT && field->cmp_type() != TIME_RESULT) + if (!field->can_optimize_outer_join_table_elimination(cond, right)) return; - if (field->result_type() == STRING_RESULT) - { - if (right->result_type() != STRING_RESULT) - { - if (field->cmp_type() != right->result_type()) - return; - } - else - { - /* - We can't assume there's a functional dependency if the effective - collation of the operation differ from the field collation. - */ - if ((field->cmp_type() == STRING_RESULT || - field->real_type() == MYSQL_TYPE_ENUM || - field->real_type() == MYSQL_TYPE_SET) && - field->charset() != cond->compare_collation()) - return; - } - } Dep_value_field *field_val; if ((field_val= ctx->get_field_value(field))) add_module_expr(ctx, eq_mod, and_level, field_val, right, NULL); diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 34381b3cfb1..0d26563d45e 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -2047,8 +2047,7 @@ bool partition_info::set_up_charset_field_preps() i= 0; while ((field= *(ptr++))) { - uchar *field_buf; - LINT_INIT(field_buf); + uchar *UNINIT_VAR(field_buf); if (!field_is_partition_charset(field)) continue; diff --git a/sql/slave.cc b/sql/slave.cc index 2a852745470..af3288c5c8d 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3570,8 +3570,7 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, if (slave_trans_retries) { - int temp_err; - LINT_INIT(temp_err); + int UNINIT_VAR(temp_err); if (exec_res && (temp_err= has_temporary_error(thd))) { const char *errmsg; diff --git a/sql/sp_head.cc b/sql/sp_head.cc index e56462768b7..8efeeab01ec 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1695,7 +1695,7 @@ bool sp_head::execute_function(THD *thd, Item **argp, uint argcount, Field *return_value_fld) { - ulonglong binlog_save_options; + ulonglong UNINIT_VAR(binlog_save_options); bool need_binlog_call= FALSE; uint arg_no; sp_rcontext *octx = thd->spcont; @@ -1709,8 +1709,6 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, DBUG_ENTER("sp_head::execute_function"); DBUG_PRINT("info", ("function %s", m_name.str)); - LINT_INIT(binlog_save_options); - /* Check that the function is called with all specified arguments. diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index aaa12763cec..471dd0eac91 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -11701,7 +11701,6 @@ static ulong parse_client_handshake_packet(MPVIO_EXT *mpvio, char *passwd= strend(user)+1; uint user_len= passwd - user - 1, db_len; char *db= passwd; - char db_buff[SAFE_NAME_LEN + 1]; // buffer to store db in utf8 char user_buff[USERNAME_LENGTH + 1]; // buffer to store user in utf8 uint dummy_errors; @@ -11738,12 +11737,9 @@ static ulong parse_client_handshake_packet(MPVIO_EXT *mpvio, char *client_plugin= next_field= passwd + passwd_len + (db ? db_len + 1 : 0); /* Since 4.1 all database names are stored in utf8 */ - if (db) - { - db_len= copy_and_convert(db_buff, sizeof(db_buff) - 1, system_charset_info, - db, db_len, thd->charset(), &dummy_errors); - db= db_buff; - } + if (thd->copy_with_error(system_charset_info, &mpvio->db, + thd->charset(), db, db_len)) + return packet_error; user_len= copy_and_convert(user_buff, sizeof(user_buff) - 1, system_charset_info, user, user_len, @@ -11773,8 +11769,6 @@ static ulong parse_client_handshake_packet(MPVIO_EXT *mpvio, Security_context *sctx= thd->security_ctx; - if (thd->make_lex_string(&mpvio->db, db, db_len) == 0) - return packet_error; /* The error is set by make_lex_string(). */ my_free(sctx->user); if (!(sctx->user= my_strndup(user, user_len, MYF(MY_WME)))) return packet_error; /* The error is set by my_strdup(). */ diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 9ab72442dcd..b4c3e5ecafd 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -6071,17 +6071,14 @@ find_field_in_natural_join(THD *thd, TABLE_LIST *table_ref, const char *name, List_iterator_fast field_it(*(table_ref->join_columns)); Natural_join_column *nj_col, *curr_nj_col; - Field *found_field; - Query_arena *arena, backup; + Field *UNINIT_VAR(found_field); + Query_arena *UNINIT_VAR(arena), backup; DBUG_ENTER("find_field_in_natural_join"); DBUG_PRINT("enter", ("field name: '%s', ref 0x%lx", name, (ulong) ref)); DBUG_ASSERT(table_ref->is_natural_join && table_ref->join_columns); DBUG_ASSERT(*actual_table == NULL); - LINT_INIT(arena); - LINT_INIT(found_field); - for (nj_col= NULL, curr_nj_col= field_it++; curr_nj_col; curr_nj_col= field_it++) { @@ -6101,7 +6098,6 @@ find_field_in_natural_join(THD *thd, TABLE_LIST *table_ref, const char *name, if (nj_col->view_field) { Item *item; - LINT_INIT(arena); if (register_tree_change) arena= thd->activate_stmt_arena_if_needed(&backup); /* diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cc77718b46f..3071ba65155 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -914,7 +914,8 @@ THD::THD(bool is_wsrep_applier) wait_for_commit_ptr(0), main_da(0, false, false), m_stmt_da(&main_da), - tdc_hash_pins(0) + tdc_hash_pins(0), + xid_hash_pins(0) #ifdef WITH_WSREP , wsrep_applier(is_wsrep_applier), @@ -1593,7 +1594,7 @@ void THD::cleanup(void) transaction.xid_state.xa_state= XA_NOTR; trans_rollback(this); - xid_cache_delete(&transaction.xid_state); + xid_cache_delete(this, &transaction.xid_state); DBUG_ASSERT(open_tables == NULL); /* @@ -1704,6 +1705,8 @@ THD::~THD() main_da.free_memory(); if (tdc_hash_pins) lf_hash_put_pins(tdc_hash_pins); + if (xid_hash_pins) + lf_hash_put_pins(xid_hash_pins); /* Ensure everything is freed */ if (status_var.local_memory_used != 0) { @@ -2228,18 +2231,88 @@ bool THD::convert_string(LEX_STRING *to, CHARSET_INFO *to_cs, const char *from, uint from_length, CHARSET_INFO *from_cs) { - DBUG_ENTER("convert_string"); + DBUG_ENTER("THD::convert_string"); size_t new_length= to_cs->mbmaxlen * from_length; uint dummy_errors; - if (!(to->str= (char*) alloc(new_length+1))) - { - to->length= 0; // Safety fix - DBUG_RETURN(1); // EOM - } + if (alloc_lex_string(to, new_length + 1)) + DBUG_RETURN(true); // EOM to->length= copy_and_convert((char*) to->str, new_length, to_cs, from, from_length, from_cs, &dummy_errors); - to->str[to->length]=0; // Safety - DBUG_RETURN(0); + to->str[to->length]= 0; // Safety + DBUG_RETURN(false); +} + + +/* + Convert a string between two character sets. + dstcs and srccs cannot be &my_charset_bin. +*/ +bool THD::convert_fix(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, const char *src, uint src_length, + String_copier *status) +{ + DBUG_ENTER("THD::convert_fix"); + size_t dst_length= dstcs->mbmaxlen * src_length; + if (alloc_lex_string(dst, dst_length + 1)) + DBUG_RETURN(true); // EOM + dst->length= status->convert_fix(dstcs, (char*) dst->str, dst_length, + srccs, src, src_length, src_length); + dst->str[dst->length]= 0; // Safety + DBUG_RETURN(false); +} + + +/* + Copy or convert a string. +*/ +bool THD::copy_fix(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, const char *src, uint src_length, + String_copier *status) +{ + DBUG_ENTER("THD::copy_fix"); + size_t dst_length= dstcs->mbmaxlen * src_length; + if (alloc_lex_string(dst, dst_length + 1)) + DBUG_RETURN(true); // EOM + dst->length= status->well_formed_copy(dstcs, dst->str, dst_length, + srccs, src, src_length, src_length); + dst->str[dst->length]= '\0'; + DBUG_RETURN(false); +} + + +class String_copier_with_error: public String_copier +{ +public: + bool check_errors(CHARSET_INFO *srccs, const char *src, uint src_length) + { + if (most_important_error_pos()) + { + ErrConvString err(src, src_length, &my_charset_bin); + my_error(ER_INVALID_CHARACTER_STRING, MYF(0), srccs->csname, err.ptr()); + return true; + } + return false; + } +}; + + +bool THD::convert_with_error(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, + const char *src, uint src_length) +{ + String_copier_with_error status; + return convert_fix(dstcs, dst, srccs, src, src_length, &status) || + status.check_errors(srccs, src, src_length); +} + + +bool THD::copy_with_error(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, + const char *src, uint src_length) +{ + String_copier_with_error status; + return copy_fix(dstcs, dst, srccs, src, src_length, &status) || + status.check_errors(srccs, src, src_length); } @@ -5106,120 +5179,233 @@ void mark_transaction_to_rollback(THD *thd, bool all) /*************************************************************************** Handling of XA id cacheing ***************************************************************************/ - -mysql_mutex_t LOCK_xid_cache; -HASH xid_cache; - -extern "C" uchar *xid_get_hash_key(const uchar *, size_t *, my_bool); -extern "C" void xid_free_hash(void *); - -uchar *xid_get_hash_key(const uchar *ptr, size_t *length, - my_bool not_used __attribute__((unused))) +class XID_cache_element { - *length=((XID_STATE*)ptr)->xid.key_length(); - return ((XID_STATE*)ptr)->xid.key(); -} + /* + bits 1..30 are reference counter + bit 31 is UNINITIALIZED flag + bit 32 is unused -void xid_free_hash(void *ptr) -{ - if (!((XID_STATE*)ptr)->in_thd) - my_free(ptr); -} + Newly allocated and deleted elements have UNINITIALIZED flag set. -#ifdef HAVE_PSI_INTERFACE -static PSI_mutex_key key_LOCK_xid_cache; + On lock() m_state is atomically incremented. It also creates load-ACQUIRE + memory barrier to make sure m_state is actually updated before furhter + memory accesses. Attempting to lock UNINITIALIED element returns failure + and further accesses to element memory are forbidden. -static PSI_mutex_info all_xid_mutexes[]= -{ - { &key_LOCK_xid_cache, "LOCK_xid_cache", PSI_FLAG_GLOBAL} + On unlock() m_state is decremented. It also creates store-RELEASE memory + barrier to make sure m_state is actually updated after preceding memory + accesses. + + UNINITIALIZED flag is cleared upon successful insert. + + UNINITIALIZED flag is set before delete in a spin loop, after last reference + is released. + + Currently m_state is only used to prevent elements from being deleted while + XA RECOVER iterates xid cache. + */ + int32 m_state; + static const int32 UNINITIALIZED= 1 << 30; +public: + XID_STATE *m_xid_state; + bool lock() + { + if (my_atomic_add32_explicit(&m_state, 1, + MY_MEMORY_ORDER_ACQUIRE) & UNINITIALIZED) + { + unlock(); + return false; + } + return true; + } + void unlock() + { + my_atomic_add32_explicit(&m_state, -1, MY_MEMORY_ORDER_RELEASE); + } + void mark_uninitialized() + { + int32 old= 0; + while (!my_atomic_cas32_weak_explicit(&m_state, &old, UNINITIALIZED, + MY_MEMORY_ORDER_RELAXED, + MY_MEMORY_ORDER_RELAXED)) + { + old= 0; + (void) LF_BACKOFF; + } + } + void mark_initialized() + { + DBUG_ASSERT(m_state & UNINITIALIZED); + my_atomic_add32_explicit(&m_state, -UNINITIALIZED, MY_MEMORY_ORDER_RELAXED); + } + static void lf_hash_initializer(LF_HASH *hash __attribute__((unused)), + XID_cache_element *element, + XID_STATE *xid_state) + { + element->m_xid_state= xid_state; + xid_state->xid_cache_element= element; + } + static void lf_alloc_constructor(uchar *ptr) + { + XID_cache_element *element= (XID_cache_element*) (ptr + LF_HASH_OVERHEAD); + element->m_state= UNINITIALIZED; + } + static void lf_alloc_destructor(uchar *ptr) + { + XID_cache_element *element= (XID_cache_element*) (ptr + LF_HASH_OVERHEAD); + if (element->m_state != UNINITIALIZED) + { + DBUG_ASSERT(!element->m_xid_state->in_thd); + my_free(element->m_xid_state); + } + } + static uchar *key(const XID_cache_element *element, size_t *length, + my_bool not_used __attribute__((unused))) + { + *length= element->m_xid_state->xid.key_length(); + return element->m_xid_state->xid.key(); + } }; -static void init_xid_psi_keys(void) + +static LF_HASH xid_cache; +static bool xid_cache_inited; + + +bool THD::fix_xid_hash_pins() { - const char* category= "sql"; - int count; - - if (PSI_server == NULL) - return; - - count= array_elements(all_xid_mutexes); - PSI_server->register_mutex(category, all_xid_mutexes, count); + if (!xid_hash_pins) + xid_hash_pins= lf_hash_get_pins(&xid_cache); + return !xid_hash_pins; } -#endif /* HAVE_PSI_INTERFACE */ -bool xid_cache_init() + +void xid_cache_init() { -#ifdef HAVE_PSI_INTERFACE - init_xid_psi_keys(); -#endif - - mysql_mutex_init(key_LOCK_xid_cache, &LOCK_xid_cache, MY_MUTEX_INIT_FAST); - return my_hash_init(&xid_cache, &my_charset_bin, 100, 0, 0, - xid_get_hash_key, xid_free_hash, 0) != 0; + xid_cache_inited= true; + lf_hash_init(&xid_cache, sizeof(XID_cache_element), LF_HASH_UNIQUE, 0, 0, + (my_hash_get_key) XID_cache_element::key, &my_charset_bin); + xid_cache.alloc.constructor= XID_cache_element::lf_alloc_constructor; + xid_cache.alloc.destructor= XID_cache_element::lf_alloc_destructor; + xid_cache.initializer= + (lf_hash_initializer) XID_cache_element::lf_hash_initializer; } + void xid_cache_free() { - if (my_hash_inited(&xid_cache)) + if (xid_cache_inited) { - my_hash_free(&xid_cache); - mysql_mutex_destroy(&LOCK_xid_cache); + lf_hash_destroy(&xid_cache); + xid_cache_inited= false; } } -XID_STATE *xid_cache_search(XID *xid) + +XID_STATE *xid_cache_search(THD *thd, XID *xid) { - mysql_mutex_lock(&LOCK_xid_cache); - XID_STATE *res=(XID_STATE *)my_hash_search(&xid_cache, xid->key(), - xid->key_length()); - mysql_mutex_unlock(&LOCK_xid_cache); - return res; + DBUG_ASSERT(thd->xid_hash_pins); + XID_cache_element *element= + (XID_cache_element*) lf_hash_search(&xid_cache, thd->xid_hash_pins, + xid->key(), xid->key_length()); + if (element) + { + lf_hash_search_unpin(thd->xid_hash_pins); + return element->m_xid_state; + } + return 0; } bool xid_cache_insert(XID *xid, enum xa_states xa_state) { XID_STATE *xs; - my_bool res; - mysql_mutex_lock(&LOCK_xid_cache); - if (my_hash_search(&xid_cache, xid->key(), xid->key_length())) - res=0; - else if (!(xs=(XID_STATE *)my_malloc(sizeof(*xs), MYF(MY_WME)))) - res=1; - else + LF_PINS *pins; + int res= 1; + + if (!(pins= lf_hash_get_pins(&xid_cache))) + return true; + + if ((xs= (XID_STATE*) my_malloc(sizeof(*xs), MYF(MY_WME)))) { xs->xa_state=xa_state; xs->xid.set(xid); xs->in_thd=0; xs->rm_error=0; - res=my_hash_insert(&xid_cache, (uchar*)xs); + + if ((res= lf_hash_insert(&xid_cache, pins, xs))) + my_free(xs); + else + xs->xid_cache_element->mark_initialized(); + if (res == 1) + res= 0; } - mysql_mutex_unlock(&LOCK_xid_cache); + lf_hash_put_pins(pins); return res; } -bool xid_cache_insert(XID_STATE *xid_state) +bool xid_cache_insert(THD *thd, XID_STATE *xid_state) { - mysql_mutex_lock(&LOCK_xid_cache); - if (my_hash_search(&xid_cache, xid_state->xid.key(), - xid_state->xid.key_length())) - { - mysql_mutex_unlock(&LOCK_xid_cache); - my_error(ER_XAER_DUPID, MYF(0)); + if (thd->fix_xid_hash_pins()) return true; + + int res= lf_hash_insert(&xid_cache, thd->xid_hash_pins, xid_state); + switch (res) + { + case 0: + xid_state->xid_cache_element->mark_initialized(); + break; + case 1: + my_error(ER_XAER_DUPID, MYF(0)); + default: + xid_state->xid_cache_element= 0; } - bool res= my_hash_insert(&xid_cache, (uchar*)xid_state); - mysql_mutex_unlock(&LOCK_xid_cache); return res; } -void xid_cache_delete(XID_STATE *xid_state) +void xid_cache_delete(THD *thd, XID_STATE *xid_state) { - mysql_mutex_lock(&LOCK_xid_cache); - my_hash_delete(&xid_cache, (uchar *)xid_state); - mysql_mutex_unlock(&LOCK_xid_cache); + if (xid_state->xid_cache_element) + { + DBUG_ASSERT(thd->xid_hash_pins); + xid_state->xid_cache_element->mark_uninitialized(); + lf_hash_delete(&xid_cache, thd->xid_hash_pins, + xid_state->xid.key(), xid_state->xid.key_length()); + xid_state->xid_cache_element= 0; + if (!xid_state->in_thd) + my_free(xid_state); + } +} + + +struct xid_cache_iterate_arg +{ + my_hash_walk_action action; + void *argument; +}; + +static my_bool xid_cache_iterate_callback(XID_cache_element *element, + xid_cache_iterate_arg *arg) +{ + my_bool res= FALSE; + if (element->lock()) + { + res= arg->action(element->m_xid_state, arg->argument); + element->unlock(); + } + return res; +} + +int xid_cache_iterate(THD *thd, my_hash_walk_action action, void *arg) +{ + xid_cache_iterate_arg argument= { action, arg }; + return thd->fix_xid_hash_pins() ? -1 : + lf_hash_iterate(&xid_cache, thd->xid_hash_pins, + (my_hash_walk_action) xid_cache_iterate_callback, + &argument); } diff --git a/sql/sql_class.h b/sql/sql_class.h index a39ba782662..47426693d3b 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1119,6 +1119,7 @@ struct st_savepoint { enum xa_states {XA_NOTR=0, XA_ACTIVE, XA_IDLE, XA_PREPARED, XA_ROLLBACK_ONLY}; extern const char *xa_state_names[]; +class XID_cache_element; typedef struct st_xid_state { /* For now, this is only used to catch duplicated external xids */ @@ -1127,16 +1128,16 @@ typedef struct st_xid_state { bool in_thd; /* Error reported by the Resource Manager (RM) to the Transaction Manager. */ uint rm_error; + XID_cache_element *xid_cache_element; } XID_STATE; -extern mysql_mutex_t LOCK_xid_cache; -extern HASH xid_cache; -bool xid_cache_init(void); +void xid_cache_init(void); void xid_cache_free(void); -XID_STATE *xid_cache_search(XID *xid); +XID_STATE *xid_cache_search(THD *thd, XID *xid); bool xid_cache_insert(XID *xid, enum xa_states xa_state); -bool xid_cache_insert(XID_STATE *xid_state); -void xid_cache_delete(XID_STATE *xid_state); +bool xid_cache_insert(THD *thd, XID_STATE *xid_state); +void xid_cache_delete(THD *thd, XID_STATE *xid_state); +int xid_cache_iterate(THD *thd, my_hash_walk_action action, void *argument); /** @class Security_context @@ -3105,9 +3106,49 @@ public: return make_lex_string(lex_str, str, length); } + // Allocate LEX_STRING for character set conversion + bool alloc_lex_string(LEX_STRING *dst, uint length) + { + if ((dst->str= (char*) alloc(length))) + return false; + dst->length= 0; // Safety + return true; // EOM + } bool convert_string(LEX_STRING *to, CHARSET_INFO *to_cs, const char *from, uint from_length, CHARSET_INFO *from_cs); + /* + Convert a strings between character sets. + Uses my_convert_fix(), which uses an mb_wc .. mc_mb loop internally. + dstcs and srccs cannot be &my_charset_bin. + */ + bool convert_fix(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, const char *src, uint src_length, + String_copier *status); + + /* + Same as above, but additionally sends ER_INVALID_CHARACTER_STRING + in case of bad byte sequences or Unicode conversion problems. + */ + bool convert_with_error(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, + const char *src, uint src_length); + + /* + If either "dstcs" or "srccs" is &my_charset_bin, + then performs native copying using cs->cset->copy_fix(). + Otherwise, performs Unicode conversion using convert_fix(). + */ + bool copy_fix(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, const char *src, uint src_length, + String_copier *status); + + /* + Same as above, but additionally sends ER_INVALID_CHARACTER_STRING + in case of bad byte sequences or Unicode conversion problems. + */ + bool copy_with_error(CHARSET_INFO *dstcs, LEX_STRING *dst, + CHARSET_INFO *srccs, const char *src, uint src_length); bool convert_string(String *s, CHARSET_INFO *from_cs, CHARSET_INFO *to_cs); @@ -3800,6 +3841,8 @@ public: } LF_PINS *tdc_hash_pins; + LF_PINS *xid_hash_pins; + bool fix_xid_hash_pins(); inline ulong wsrep_binlog_format() const { diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index b21f2a51a5b..24d75d97ee4 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -331,8 +331,7 @@ static int check_update_fields(THD *thd, TABLE_LIST *insert_table_list, table_map *map) { TABLE *table= insert_table_list->table; - my_bool autoinc_mark; - LINT_INIT(autoinc_mark); + my_bool UNINIT_VAR(autoinc_mark); table->next_number_field_updated= FALSE; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index f603534013f..4e061112128 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1028,7 +1028,7 @@ int MYSQLlex(YYSTYPE *yylval, THD *thd) static int lex_one_token(YYSTYPE *yylval, THD *thd) { - reg1 uchar c; + reg1 uchar UNINIT_VAR(c); bool comment_closed; int tokval, result_state; uint length; @@ -1039,7 +1039,6 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) const uchar *const state_map= cs->state_map; const uchar *const ident_map= cs->ident_map; - LINT_INIT(c); lip->yylval=yylval; // The global state lip->start_token(); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 0837a70fb0c..3109b2ffe86 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1320,8 +1320,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd, { LEX_STRING tmp; status_var_increment(thd->status_var.com_stat[SQLCOM_CHANGE_DB]); - thd->convert_string(&tmp, system_charset_info, - packet, packet_length, thd->charset()); + if (thd->copy_with_error(system_charset_info, &tmp, + thd->charset(), packet, packet_length)) + break; if (!mysql_change_db(thd, &tmp, FALSE)) { general_log_write(thd, command, thd->db, thd->db_length); @@ -2743,6 +2744,18 @@ mysql_execute_command(THD *thd) lex->restore_set_statement_var(); goto error; } + /* + The value of last_insert_id is remembered in THD to be written to binlog + when it's used *the first time* in the statement. But SET STATEMENT + must read the old value of last_insert_id to be able to restore it at + the end. This should not count at "reading of last_insert_id" and + should not remember last_insert_id for binlog. That is, it should clear + stmt_depends_on_first_successful_insert_id_in_prev_stmt flag. + */ + if (!thd->in_sub_stmt) + { + thd->stmt_depends_on_first_successful_insert_id_in_prev_stmt= 0; + } } if (thd->lex->mi.connection_name.str == NULL) @@ -7298,11 +7311,10 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, LEX_STRING *option) { register TABLE_LIST *ptr; - TABLE_LIST *previous_table_ref; /* The table preceding the current one. */ + TABLE_LIST *UNINIT_VAR(previous_table_ref); /* The table preceding the current one. */ char *alias_str; LEX *lex= thd->lex; DBUG_ENTER("add_table_to_list"); - LINT_INIT(previous_table_ref); if (!table) DBUG_RETURN(0); // End of memory diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 610687ce8f1..15290b218ac 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3397,7 +3397,7 @@ make_join_statistics(JOIN *join, List &tables_list, DYNAMIC_ARRAY *keyuse_array) { int error= 0; - TABLE *table; + TABLE *UNINIT_VAR(table); /* inited in all loops */ uint i,table_count,const_count,key; table_map found_const_table_map, all_table_map, found_ref, refs; key_map const_ref, eq_part; @@ -3412,7 +3412,6 @@ make_join_statistics(JOIN *join, List &tables_list, TABLE_LIST *tables; DBUG_ENTER("make_join_statistics"); - LINT_INIT(table); /* inited in all loops */ table_count=join->table_count; /* @@ -4124,6 +4123,7 @@ error: /// Used when finding key fields typedef struct key_field_t { Field *field; + Item_func *cond; Item *val; ///< May be empty if diff constant uint level; uint optimize; @@ -4466,46 +4466,6 @@ add_key_field(JOIN *join, } if (!eq_func) // eq_func is NEVER true when num_values > 1 return; - - if ((*value)->cmp_type() == TIME_RESULT && - field->cmp_type() != TIME_RESULT) - return; - - /* - Note, for ITEM/ENUM columns: - - field->cmp_type() returns INT_RESULT - - field->result_type() returns STRING_RESULT - - field->type() returns MYSQL_TYPE_STRING - - Using field->real_type() to detect ENUM/SET, - as they need a special handling: - - Conditions between a ENUM/SET filter and a TIME expression - cannot be optimized. They were filtered out in the previous if block. - - It's Ok to use ref access for an ENUM/SET field compared to an - INT/REAL/DECIMAL expression. - - It's Ok to use ref for an ENUM/SET field compared to a STRING - expression if the collation of the field and the collation of - the condition match. - */ - if ((field->real_type() == MYSQL_TYPE_ENUM || - field->real_type() == MYSQL_TYPE_SET) && - (*value)->cmp_type () == STRING_RESULT && - field->charset() != cond->compare_collation()) - return; - - /* - We can't use indexes when comparing a string index to a - number or two strings if the effective collation - of the operation differ from the field collation. - */ - - if (field->cmp_type() == STRING_RESULT) - { - if ((*value)->cmp_type() != STRING_RESULT) - return; - if (field->charset() != cond->compare_collation()) - return; - } } } /* @@ -4517,6 +4477,7 @@ add_key_field(JOIN *join, (*key_fields)->field= field; (*key_fields)->eq_func= eq_func; (*key_fields)->val= *value; + (*key_fields)->cond= cond; (*key_fields)->level= and_level; (*key_fields)->optimize= optimize; /* @@ -4958,7 +4919,8 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array, KEY_FIELD *key_field) uint key_parts= form->actual_n_key_parts(keyinfo); for (uint part=0 ; part < key_parts ; part++) { - if (field->eq(form->key_info[key].key_part[part].field)) + if (field->eq(form->key_info[key].key_part[part].field) && + field->can_optimize_keypart_ref(key_field->cond, key_field->val)) { if (add_keyuse(keyuse_array, key_field, key, part)) return TRUE; @@ -4969,6 +4931,8 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array, KEY_FIELD *key_field) (key_field->optimize & KEY_OPTIMIZE_EQ) && key_field->val->used_tables()) { + if (!field->can_optimize_hash_join(key_field->cond, key_field->val)) + return false; /* If a key use is extracted from an equi-join predicate then it is added not only as a key use for every index whose component can @@ -12071,13 +12035,12 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond, return change_list ? 0 : first_order; // No need to sort ORDER *order,**prev_ptr, *tmp_order; - table_map first_table; + table_map UNINIT_VAR(first_table); /* protected by first_is_base_table */ table_map not_const_tables= ~join->const_table_map; table_map ref; bool first_is_base_table= FALSE; DBUG_ENTER("remove_const"); - LINT_INIT(first_table); /* protected by first_is_base_table */ if (join->join_tab[join->const_tables].table) { first_table= join->join_tab[join->const_tables].table->map; @@ -15503,8 +15466,7 @@ static Field *create_tmp_field_from_item(THD *thd, Item *item, TABLE *table, uint convert_blob_length) { bool maybe_null= item->maybe_null; - Field *new_field; - LINT_INIT(new_field); + Field *UNINIT_VAR(new_field); switch (item->result_type()) { case REAL_RESULT: @@ -17497,9 +17459,8 @@ do_select(JOIN *join,List *fields,TABLE *table,Procedure *procedure) { int rc= 0; enum_nested_loop_state error= NESTED_LOOP_OK; - JOIN_TAB *join_tab; + JOIN_TAB *UNINIT_VAR(join_tab); DBUG_ENTER("do_select"); - LINT_INIT(join_tab); join->procedure=procedure; join->tmp_table= table; /* Save for easy recursion */ diff --git a/sql/sql_select.h b/sql/sql_select.h index fb42b6ba08e..dcfb6778ccc 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -762,7 +762,7 @@ public: void set_empty() { sjm_scan_need_tables= 0; - LINT_INIT(sjm_scan_last_inner); + LINT_INIT_STRUCT(sjm_scan_last_inner); is_used= FALSE; } void set_from_prev(struct st_position *prev); diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 4ce1f3ec22a..021e4c37e86 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -1551,7 +1551,7 @@ public: uint key_parts= table->actual_n_key_parts(key_info); empty= TRUE; prefixes= 0; - LINT_INIT(calc_state); + LINT_INIT_STRUCT(calc_state); is_single_comp_pk= FALSE; uint pk= table->s->primary_key; diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 9fb462e9a9d..1b8ea936c0d 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -914,82 +914,17 @@ String_copier::well_formed_copy(CHARSET_INFO *to_cs, const char *from, uint from_length, uint nchars) { - uint res; - if ((to_cs == &my_charset_bin) || (from_cs == &my_charset_bin) || (to_cs == from_cs) || my_charset_same(from_cs, to_cs)) { m_cannot_convert_error_pos= NULL; - return to_cs->cset->copy_abort(to_cs, to, to_length, from, from_length, - nchars, this); + return to_cs->cset->copy_fix(to_cs, to, to_length, from, from_length, + nchars, &m_native_copy_status); } - else - { - int cnvres; - my_wc_t wc; - my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc; - my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb; - const uchar *from_end= (const uchar*) from + from_length; - uchar *to_end= (uchar*) to + to_length; - char *to_start= to; - m_well_formed_error_pos= NULL; - m_cannot_convert_error_pos= NULL; - - for ( ; nchars; nchars--) - { - const char *from_prev= from; - if ((cnvres= (*mb_wc)(from_cs, &wc, (uchar*) from, from_end)) > 0) - from+= cnvres; - else if (cnvres == MY_CS_ILSEQ) - { - if (!m_well_formed_error_pos) - m_well_formed_error_pos= from; - from++; - wc= '?'; - } - else if (cnvres > MY_CS_TOOSMALL) - { - /* - A correct multibyte sequence detected - But it doesn't have Unicode mapping. - */ - if (!m_cannot_convert_error_pos) - m_cannot_convert_error_pos= from; - from+= (-cnvres); - wc= '?'; - } - else - { - if ((uchar *) from >= from_end) - break; // End of line - // Incomplete byte sequence - if (!m_well_formed_error_pos) - m_well_formed_error_pos= from; - from++; - wc= '?'; - } -outp: - if ((cnvres= (*wc_mb)(to_cs, wc, (uchar*) to, to_end)) > 0) - to+= cnvres; - else if (cnvres == MY_CS_ILUNI && wc != '?') - { - if (!m_cannot_convert_error_pos) - m_cannot_convert_error_pos= from_prev; - wc= '?'; - goto outp; - } - else - { - from= from_prev; - break; - } - } - m_source_end_pos= from; - res= (uint) (to - to_start); - } - return res; + return my_convert_fix(to_cs, to, to_length, from_cs, from, from_length, + nchars, this); } diff --git a/sql/sql_string.h b/sql/sql_string.h index d89adb6bf51..4a23d65d6a8 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -43,14 +43,13 @@ inline uint32 copy_and_convert(char *to, uint32 to_length, } -class String_copier: private MY_STRCOPY_STATUS +class String_copier: private MY_STRCONV_STATUS { - const char *m_cannot_convert_error_pos; public: const char *source_end_pos() const - { return m_source_end_pos; } + { return m_native_copy_status.m_source_end_pos; } const char *well_formed_error_pos() const - { return m_well_formed_error_pos; } + { return m_native_copy_status.m_well_formed_error_pos; } const char *cannot_convert_error_pos() const { return m_cannot_convert_error_pos; } const char *most_important_error_pos() const @@ -58,6 +57,17 @@ public: return well_formed_error_pos() ? well_formed_error_pos() : cannot_convert_error_pos(); } + /* + Convert a string between character sets. + "dstcs" and "srccs" cannot be &my_charset_bin. + */ + uint convert_fix(CHARSET_INFO *dstcs, char *dst, uint dst_length, + CHARSET_INFO *srccs, const char *src, uint src_length, + uint nchars) + { + return my_convert_fix(dstcs, dst, dst_length, + srccs, src, src_length, nchars, this); + } /* Copy a string. Fix bad bytes/characters one Unicode conversion, break on bad bytes in case of non-Unicode copying. diff --git a/sql/sql_time.cc b/sql/sql_time.cc index ca689d55a2b..267b183562b 100644 --- a/sql/sql_time.cc +++ b/sql/sql_time.cc @@ -545,8 +545,7 @@ bool parse_date_time_format(timestamp_type format_type, { if (*ptr == '%' && ptr+1 != end) { - uint position; - LINT_INIT(position); + uint UNINIT_VAR(position); switch (*++ptr) { case 'y': // Year case 'Y': diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index fe44fd21675..cf933e0be3b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -13966,8 +13966,8 @@ IDENT_sys: } else { - if (thd->convert_string(&$$, system_charset_info, - $1.str, $1.length, thd->charset())) + if (thd->convert_with_error(system_charset_info, &$$, + thd->charset(), $1.str, $1.length)) MYSQL_YYABORT; } } diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 07875be91aa..734b6ed9171 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -3765,7 +3765,7 @@ static ulonglong read_last_insert_id(THD *thd) } static Sys_var_session_special Sys_last_insert_id( "last_insert_id", "The value to be returned from LAST_INSERT_ID()", - NO_SET_STMT sys_var::ONLY_SESSION, NO_CMD_LINE, + sys_var::ONLY_SESSION, NO_CMD_LINE, VALID_RANGE(0, ULONGLONG_MAX), BLOCK_SIZE(1), NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(0), ON_UPDATE(update_last_insert_id), ON_READ(read_last_insert_id)); @@ -3830,17 +3830,17 @@ static bool update_rand_seed1(THD *thd, set_var *var) thd->rand.seed1= (ulong) var->save_result.ulonglong_value; return false; } -static ulonglong read_rand_seed(THD *thd) +static ulonglong read_rand_seed1(THD *thd) { - return 0; + return thd->rand.seed1; } static Sys_var_session_special Sys_rand_seed1( "rand_seed1", "Sets the internal state of the RAND() " "generator for replication purposes", - NO_SET_STMT sys_var::ONLY_SESSION, NO_CMD_LINE, + sys_var::ONLY_SESSION, NO_CMD_LINE, VALID_RANGE(0, ULONG_MAX), BLOCK_SIZE(1), NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(0), - ON_UPDATE(update_rand_seed1), ON_READ(read_rand_seed)); + ON_UPDATE(update_rand_seed1), ON_READ(read_rand_seed1)); static bool update_rand_seed2(THD *thd, set_var *var) { @@ -3852,13 +3852,17 @@ static bool update_rand_seed2(THD *thd, set_var *var) thd->rand.seed2= (ulong) var->save_result.ulonglong_value; return false; } +static ulonglong read_rand_seed2(THD *thd) +{ + return thd->rand.seed2; +} static Sys_var_session_special Sys_rand_seed2( "rand_seed2", "Sets the internal state of the RAND() " "generator for replication purposes", - NO_SET_STMT sys_var::ONLY_SESSION, NO_CMD_LINE, + sys_var::ONLY_SESSION, NO_CMD_LINE, VALID_RANGE(0, ULONG_MAX), BLOCK_SIZE(1), NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(0), - ON_UPDATE(update_rand_seed2), ON_READ(read_rand_seed)); + ON_UPDATE(update_rand_seed2), ON_READ(read_rand_seed2)); static ulonglong read_error_count(THD *thd) { diff --git a/sql/table.cc b/sql/table.cc index f8e9a424bf9..5c85d5668ed 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -4826,9 +4826,8 @@ bool TABLE_LIST::is_leaf_for_name_resolution() TABLE_LIST *TABLE_LIST::first_leaf_for_name_resolution() { - TABLE_LIST *cur_table_ref; + TABLE_LIST *UNINIT_VAR(cur_table_ref); NESTED_JOIN *cur_nested_join; - LINT_INIT(cur_table_ref); if (is_leaf_for_name_resolution()) return this; @@ -5547,10 +5546,9 @@ Field_iterator_table_ref::get_or_create_column_ref(THD *thd, TABLE_LIST *parent_ { Natural_join_column *nj_col; bool is_created= TRUE; - uint field_count; + uint UNINIT_VAR(field_count); TABLE_LIST *add_table_ref= parent_table_ref ? parent_table_ref : table_ref; - LINT_INIT(field_count); if (field_it == &table_field_it) { diff --git a/sql/transaction.cc b/sql/transaction.cc index 22e3ad7f87c..d6ef160206b 100644 --- a/sql/transaction.cc +++ b/sql/transaction.cc @@ -738,7 +738,7 @@ bool trans_xa_start(THD *thd) thd->transaction.xid_state.xa_state= XA_ACTIVE; thd->transaction.xid_state.rm_error= 0; thd->transaction.xid_state.xid.set(thd->lex->xid); - if (xid_cache_insert(&thd->transaction.xid_state)) + if (xid_cache_insert(thd, &thd->transaction.xid_state)) { thd->transaction.xid_state.xa_state= XA_NOTR; thd->transaction.xid_state.xid.null(); @@ -801,7 +801,7 @@ bool trans_xa_prepare(THD *thd) my_error(ER_XAER_NOTA, MYF(0)); else if (ha_prepare(thd)) { - xid_cache_delete(&thd->transaction.xid_state); + xid_cache_delete(thd, &thd->transaction.xid_state); thd->transaction.xid_state.xa_state= XA_NOTR; my_error(ER_XA_RBROLLBACK, MYF(0)); } @@ -830,6 +830,11 @@ bool trans_xa_commit(THD *thd) if (!thd->transaction.xid_state.xid.eq(thd->lex->xid)) { + if (thd->fix_xid_hash_pins()) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + DBUG_RETURN(TRUE); + } /* xid_state.in_thd is always true beside of xa recovery procedure. Note, that there is no race condition here between xid_cache_search @@ -840,7 +845,7 @@ bool trans_xa_commit(THD *thd) xa_cache_insert(XID, xa_states), which is called before starting client connections, and thus is always single-threaded. */ - XID_STATE *xs= xid_cache_search(thd->lex->xid); + XID_STATE *xs= xid_cache_search(thd, thd->lex->xid); res= !xs || xs->in_thd; if (res) my_error(ER_XAER_NOTA, MYF(0)); @@ -848,7 +853,7 @@ bool trans_xa_commit(THD *thd) { res= xa_trans_rolled_back(xs); ha_commit_or_rollback_by_xid(thd->lex->xid, !res); - xid_cache_delete(xs); + xid_cache_delete(thd, xs); } DBUG_RETURN(res); } @@ -911,7 +916,7 @@ bool trans_xa_commit(THD *thd) thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); - xid_cache_delete(&thd->transaction.xid_state); + xid_cache_delete(thd, &thd->transaction.xid_state); thd->transaction.xid_state.xa_state= XA_NOTR; DBUG_RETURN(res); @@ -935,14 +940,20 @@ bool trans_xa_rollback(THD *thd) if (!thd->transaction.xid_state.xid.eq(thd->lex->xid)) { - XID_STATE *xs= xid_cache_search(thd->lex->xid); + if (thd->fix_xid_hash_pins()) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + DBUG_RETURN(TRUE); + } + + XID_STATE *xs= xid_cache_search(thd, thd->lex->xid); if (!xs || xs->in_thd) my_error(ER_XAER_NOTA, MYF(0)); else { xa_trans_rolled_back(xs); ha_commit_or_rollback_by_xid(thd->lex->xid, 0); - xid_cache_delete(xs); + xid_cache_delete(thd, xs); } DBUG_RETURN(thd->get_stmt_da()->is_error()); } @@ -961,7 +972,7 @@ bool trans_xa_rollback(THD *thd) thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); - xid_cache_delete(&thd->transaction.xid_state); + xid_cache_delete(thd, &thd->transaction.xid_state); thd->transaction.xid_state.xa_state= XA_NOTR; DBUG_RETURN(res); diff --git a/sql/tztime.cc b/sql/tztime.cc index 1cb1f5a0d5c..9fa065eefa0 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -327,7 +327,7 @@ static my_bool prepare_tz_info(TIME_ZONE_INFO *sp, MEM_ROOT *storage) { my_time_t cur_t= MY_TIME_T_MIN; - my_time_t cur_l, end_t, end_l; + my_time_t cur_l, end_t, UNINIT_VAR(end_l); my_time_t cur_max_seen_l= MY_TIME_T_MIN; long cur_offset, cur_corr, cur_off_and_corr; uint next_trans_idx, next_leap_idx; @@ -340,8 +340,6 @@ prepare_tz_info(TIME_ZONE_INFO *sp, MEM_ROOT *storage) my_time_t revts[TZ_MAX_REV_RANGES]; REVT_INFO revtis[TZ_MAX_REV_RANGES]; - LINT_INIT(end_l); - /* Let us setup fallback time type which will be used if we have not any transitions or if we have moment of time before first transition. diff --git a/storage/maria/ma_bitmap.c b/storage/maria/ma_bitmap.c index d9d4564fc99..7c144ac52a4 100644 --- a/storage/maria/ma_bitmap.c +++ b/storage/maria/ma_bitmap.c @@ -1721,11 +1721,10 @@ static my_bool find_blob(MARIA_HA *info, ulong length) uint full_page_size= FULL_PAGE_SIZE(info->s); ulong pages; uint rest_length, used; - uint first_block_pos; + uint UNINIT_VAR(first_block_pos); MARIA_BITMAP_BLOCK *first_block= 0; DBUG_ENTER("find_blob"); DBUG_PRINT("enter", ("length: %lu", length)); - LINT_INIT(first_block_pos); pages= length / full_page_size; rest_length= (uint) (length - pages * full_page_size); diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index e582f0e166e..8c012d21095 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -1862,8 +1862,6 @@ static int check_block_record(HA_CHECK *param, MARIA_HA *info, int extend, page_type, bitmap_pattern; uint bitmap_for_page; - LINT_INIT(empty_space); - if (_ma_killed_ptr(param)) { _ma_scan_end_block_record(info); diff --git a/storage/maria/ma_dynrec.c b/storage/maria/ma_dynrec.c index 9fed9dbe8da..eb6352b7a87 100644 --- a/storage/maria/ma_dynrec.c +++ b/storage/maria/ma_dynrec.c @@ -1593,9 +1593,8 @@ my_bool _ma_cmp_dynamic_record(register MARIA_HA *info, uchar *buffer; MARIA_BLOCK_INFO block_info; my_bool error= 1; - size_t buffer_length; + size_t UNINIT_VAR(buffer_length); DBUG_ENTER("_ma_cmp_dynamic_record"); - LINT_INIT(buffer_length); if (info->opt_flag & WRITE_CACHE_USED) { diff --git a/storage/maria/ma_ft_nlq_search.c b/storage/maria/ma_ft_nlq_search.c index 613f13e64a9..5eb916112d7 100644 --- a/storage/maria/ma_ft_nlq_search.c +++ b/storage/maria/ma_ft_nlq_search.c @@ -83,8 +83,6 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio) #error #endif DBUG_ENTER("walk_and_match"); - LINT_INIT(subkeys.i); - LINT_INIT_STRUCT(subkeys); word->weight=LWS_FOR_QUERY; diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index c83ad70914e..271a0ee8d53 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -280,7 +280,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN], data_name[FN_REFLEN]; uchar *disk_cache, *disk_pos, *end_pos; - MARIA_HA info,*m_info,*old_info; + MARIA_HA info, *UNINIT_VAR(m_info), *old_info; MARIA_SHARE share_buff,*share; double *rec_per_key_part; ulong *nulls_per_key_part; @@ -290,7 +290,6 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) File data_file= -1; DBUG_ENTER("maria_open"); - LINT_INIT(m_info); kfile= -1; errpos= 0; head_length=sizeof(share_buff.state.header); diff --git a/storage/maria/ma_pagecache.c b/storage/maria/ma_pagecache.c index eeb87d2b7a0..8315c3136c5 100644 --- a/storage/maria/ma_pagecache.c +++ b/storage/maria/ma_pagecache.c @@ -3370,8 +3370,7 @@ restart: /* Key cache is used */ PAGECACHE_BLOCK_LINK *block; uint status; - int page_st; - LINT_INIT(page_st); + int UNINIT_VAR(page_st); pagecache_pthread_mutex_lock(&pagecache->cache_lock); if (!pagecache->can_be_used) diff --git a/storage/maria/ma_range.c b/storage/maria/ma_range.c index 7747df6415a..7216480abd9 100644 --- a/storage/maria/ma_range.c +++ b/storage/maria/ma_range.c @@ -209,14 +209,13 @@ static double _ma_search_pos(MARIA_HA *info, MARIA_KEY *key, uint32 nextflag, my_off_t pos) { int flag; - uint keynr, max_keynr; + uint keynr, UNINIT_VAR(max_keynr); my_bool after_key; uchar *keypos; double offset; MARIA_KEYDEF *keyinfo= key->keyinfo; MARIA_PAGE page; DBUG_ENTER("_ma_search_pos"); - LINT_INIT(max_keynr); if (pos == HA_OFFSET_ERROR) DBUG_RETURN(0.0); diff --git a/storage/maria/ma_rt_index.c b/storage/maria/ma_rt_index.c index 0d187c81692..320418c15ed 100644 --- a/storage/maria/ma_rt_index.c +++ b/storage/maria/ma_rt_index.c @@ -523,19 +523,15 @@ static const uchar *maria_rtree_pick_key(const MARIA_KEY *key, const MARIA_PAGE *page) { double increase; - double best_incr; + double UNINIT_VAR(best_incr); double perimeter; - double best_perimeter; + double UNINIT_VAR(best_perimeter); uchar *best_key= NULL; const MARIA_HA *info= page->info; uchar *k= rt_PAGE_FIRST_KEY(info->s, page->buf, page->node); uchar *last= rt_PAGE_END(info, page); - LINT_INIT(best_perimeter); - LINT_INIT(best_key); - LINT_INIT(best_incr); - for (; k < last; k= rt_PAGE_NEXT_KEY(k, key->data_length, nod_flag)) { if ((increase= maria_rtree_perimeter_increase(keyinfo->seg, k, key, @@ -563,13 +559,11 @@ static const uchar *maria_rtree_pick_key(const MARIA_KEY *key, double increase; double best_incr= DBL_MAX; double area; - double best_area; + double UNINIT_VAR(best_area); const uchar *best_key= NULL; const uchar *k= rt_PAGE_FIRST_KEY(share, page->buff, page->node); const uchar *last= rt_PAGE_END(page); - LINT_INIT(best_area); - for (; k < last; k= rt_PAGE_NEXT_KEY(share, k, key->data_length, page->node)) { diff --git a/storage/maria/ma_search.c b/storage/maria/ma_search.c index d38bc7af26c..14ff084332e 100644 --- a/storage/maria/ma_search.c +++ b/storage/maria/ma_search.c @@ -269,7 +269,7 @@ int _ma_bin_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page, uint32 comp_flag, uchar **ret_pos, uchar *buff __attribute__((unused)), my_bool *last_key) { - int flag; + int UNINIT_VAR(flag); uint page_flag; uint start, mid, end, save_end, totlength, nod_flag; uint not_used[2]; @@ -278,8 +278,6 @@ int _ma_bin_search(const MARIA_KEY *key, const MARIA_PAGE *ma_page, uchar *page; DBUG_ENTER("_ma_bin_search"); - LINT_INIT(flag); - page_flag= ma_page->flag; if (page_flag & KEYPAGE_FLAG_HAS_TRANSID) { diff --git a/storage/maria/ma_sort.c b/storage/maria/ma_sort.c index 421dc8392e3..d511c1e6c97 100644 --- a/storage/maria/ma_sort.c +++ b/storage/maria/ma_sort.c @@ -110,7 +110,7 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, uint sort_length, maxbuffer; size_t memavl, old_memavl; DYNAMIC_ARRAY buffpek; - ha_rows records, keys; + ha_rows records, UNINIT_VAR(keys); uchar **sort_keys; IO_CACHE tempfile, tempfile_for_exceptions; DBUG_ENTER("_ma_create_index_by_sort"); @@ -140,7 +140,6 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, memavl=MY_MAX(sortbuff_size,MIN_SORT_MEMORY); records= info->sort_info->max_records; sort_length= info->key_length; - LINT_INIT(keys); while (memavl >= MIN_SORT_MEMORY) { @@ -363,13 +362,11 @@ pthread_handler_t _ma_thr_find_all_keys(void *arg) int error; size_t memavl, old_memavl; longlong sortbuff_size; - ha_keys keys, idx; + ha_keys UNINIT_VAR(keys), idx; uint sort_length; uint maxbuffer; uchar **sort_keys=0; - LINT_INIT(keys); - error=1; if (my_thread_init()) @@ -1029,7 +1026,6 @@ merge_buffers(MARIA_SORT_PARAM *info, ha_keys keys, IO_CACHE *from_file, count= 0; maxcount= keys/((uint) (Tb-Fb) +1); DBUG_ASSERT(maxcount > 0); - LINT_INIT(to_start_filepos); if (to_file) to_start_filepos=my_b_tell(to_file); strpos= (uchar*) sort_keys; diff --git a/storage/maria/ma_update.c b/storage/maria/ma_update.c index e0e804ca655..4385f2d306c 100644 --- a/storage/maria/ma_update.c +++ b/storage/maria/ma_update.c @@ -26,14 +26,12 @@ int maria_update(register MARIA_HA *info, const uchar *oldrec, uchar *newrec) int flag,key_changed,save_errno; reg3 my_off_t pos; uint i; - uchar old_key_buff[MARIA_MAX_KEY_BUFF],*new_key_buff; + uchar old_key_buff[MARIA_MAX_KEY_BUFF], *UNINIT_VAR(new_key_buff); my_bool auto_key_changed= 0; - ulonglong changed; + ulonglong UNINIT_VAR(changed); MARIA_SHARE *share= info->s; MARIA_KEYDEF *keyinfo; DBUG_ENTER("maria_update"); - LINT_INIT(new_key_buff); - LINT_INIT(changed); DBUG_EXECUTE_IF("maria_pretend_crashed_table_on_usage", maria_print_error(info->s, HA_ERR_CRASHED); diff --git a/storage/maria/ma_write.c b/storage/maria/ma_write.c index bab07a48fde..328f5674aef 100644 --- a/storage/maria/ma_write.c +++ b/storage/maria/ma_write.c @@ -977,7 +977,7 @@ int _ma_split_page(MARIA_HA *info, MARIA_KEY *key, MARIA_PAGE *split_page, uint keynr; uint length,a_length,key_ref_length,t_length,nod_flag,key_length; uint page_length, split_length, page_flag; - uchar *key_pos,*pos, *after_key; + uchar *key_pos, *pos, *UNINIT_VAR(after_key); MARIA_KEY_PARAM s_temp; MARIA_PINNED_PAGE tmp_page_link, *page_link= &tmp_page_link; MARIA_SHARE *share= info->s; @@ -987,7 +987,6 @@ int _ma_split_page(MARIA_HA *info, MARIA_KEY *key, MARIA_PAGE *split_page, int res; DBUG_ENTER("_ma_split_page"); - LINT_INIT(after_key); DBUG_DUMP("buff", split_page->buff, split_page->size); info->page_changed=1; /* Info->buff is used */ diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c index b79d6c891f1..be0b90b4bad 100644 --- a/storage/myisam/mi_check.c +++ b/storage/myisam/mi_check.c @@ -3292,7 +3292,6 @@ static int sort_get_next_record(MI_SORT_PARAM *sort_param) } } case DYNAMIC_RECORD: - LINT_INIT(to); pos=sort_param->pos; searching=(sort_param->fix_datafile && (param->testflag & T_EXTEND)); parallel_flag= (sort_param->read_cache.file < 0) ? READING_NEXT : 0; diff --git a/storage/myisam/mi_delete.c b/storage/myisam/mi_delete.c index 3fffa55341b..6a023f35b88 100644 --- a/storage/myisam/mi_delete.c +++ b/storage/myisam/mi_delete.c @@ -305,7 +305,6 @@ static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo, } } leaf_buff=0; - LINT_INIT(leaf_page); if (nod_flag) { leaf_page=_mi_kpos(nod_flag,keypos); diff --git a/storage/myisam/mi_open.c b/storage/myisam/mi_open.c index 060017f10ad..b8cbefe6ac2 100644 --- a/storage/myisam/mi_open.c +++ b/storage/myisam/mi_open.c @@ -721,7 +721,6 @@ uchar *mi_alloc_rec_buff(MI_INFO *info, ulong length, uchar **buf) { uint extra; uint32 UNINIT_VAR(old_length); - LINT_INIT(old_length); if (! *buf || length > (old_length=mi_get_rec_buff_len(info, *buf))) { diff --git a/storage/myisam/mi_packrec.c b/storage/myisam/mi_packrec.c index d1ad911d334..3687cfc2179 100644 --- a/storage/myisam/mi_packrec.c +++ b/storage/myisam/mi_packrec.c @@ -1364,7 +1364,6 @@ uint _mi_pack_get_block_info(MI_INFO *myisam, MI_BIT_BUFF *bit_buff, { uchar *header=info->header; uint head_length, UNINIT_VAR(ref_length); - LINT_INIT(ref_length); if (file >= 0) { diff --git a/storage/myisam/mi_search.c b/storage/myisam/mi_search.c index 3ce112f7906..60a34c641ad 100644 --- a/storage/myisam/mi_search.c +++ b/storage/myisam/mi_search.c @@ -187,11 +187,10 @@ int _mi_bin_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page, uchar *buff __attribute__((unused)), my_bool *last_key) { reg4 int start,mid,end,save_end; - int flag; + int UNINIT_VAR(flag); uint totlength,nod_flag,not_used[2]; DBUG_ENTER("_mi_bin_search"); - LINT_INIT(flag); totlength=keyinfo->keylength+(nod_flag=mi_test_if_nod(page)); start=0; mid=1; save_end=end=(int) ((mi_getint(page)-2-nod_flag)/totlength-1); diff --git a/storage/myisam/mi_write.c b/storage/myisam/mi_write.c index 2b922bbaa9e..ff96ee8751b 100644 --- a/storage/myisam/mi_write.c +++ b/storage/myisam/mi_write.c @@ -595,11 +595,10 @@ int _mi_split_page(register MI_INFO *info, register MI_KEYDEF *keyinfo, my_bool insert_last_key) { uint length,a_length,key_ref_length,t_length,nod_flag,key_length; - uchar *key_pos,*pos, *after_key; + uchar *key_pos,*pos, *UNINIT_VAR(after_key); my_off_t new_pos; MI_KEY_PARAM s_temp; DBUG_ENTER("mi_split_page"); - LINT_INIT(after_key); DBUG_DUMP("buff",(uchar*) buff,mi_getint(buff)); if (info->s->keyinfo+info->lastinx == keyinfo) @@ -710,13 +709,11 @@ static uchar *_mi_find_last_pos(MI_KEYDEF *keyinfo, uchar *page, uchar *key, uint *return_key_length, uchar **after_key) { - uint keys,length,last_length,key_ref_length; + uint keys, length, UNINIT_VAR(last_length), key_ref_length; uchar *end,*lastpos,*prevpos; uchar key_buff[HA_MAX_KEY_BUFF]; DBUG_ENTER("_mi_find_last_pos"); - LINT_INIT(last_length); - key_ref_length=2; length=mi_getint(page)-key_ref_length; page+=key_ref_length; diff --git a/storage/myisam/rt_index.c b/storage/myisam/rt_index.c index fc0c0345f5e..b3b7fd0e37f 100644 --- a/storage/myisam/rt_index.c +++ b/storage/myisam/rt_index.c @@ -469,14 +469,11 @@ static uchar *rtree_pick_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *key, double increase; double best_incr = DBL_MAX; double perimeter; - double best_perimeter; - uchar *best_key; + double UNINIT_VAR(best_perimeter); + uchar *UNINIT_VAR(best_key); uchar *k = rt_PAGE_FIRST_KEY(page_buf, nod_flag); uchar *last = rt_PAGE_END(page_buf); - LINT_INIT(best_perimeter); - LINT_INIT(best_key); - for (; k < last; k = rt_PAGE_NEXT_KEY(k, key_length, nod_flag)) { if ((increase = rtree_perimeter_increase(keyinfo->seg, k, key, key_length, diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c index 8e45ca1a3ea..f65d1e8fe58 100644 --- a/storage/myisam/sort.c +++ b/storage/myisam/sort.c @@ -107,7 +107,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, uint sort_length, maxbuffer; ulonglong memavl, old_memavl; DYNAMIC_ARRAY buffpek; - ha_rows records, keys; + ha_rows records, UNINIT_VAR(keys); uchar **sort_keys; IO_CACHE tempfile, tempfile_for_exceptions; DBUG_ENTER("_create_index_by_sort"); @@ -135,7 +135,6 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, memavl= MY_MAX(sortbuff_size, MIN_SORT_BUFFER); records= info->sort_info->max_records; sort_length= info->key_length; - LINT_INIT(keys); while (memavl >= MIN_SORT_BUFFER) { @@ -342,13 +341,11 @@ pthread_handler_t thr_find_all_keys(void *arg) MI_SORT_PARAM *sort_param= (MI_SORT_PARAM*) arg; int error; ulonglong memavl, old_memavl, sortbuff_size; - ha_keys keys, idx; + ha_keys UNINIT_VAR(keys), idx; uint sort_length; uint maxbuffer; uchar **sort_keys=0; - LINT_INIT(keys); - error=1; if (my_thread_init()) @@ -552,7 +549,6 @@ int thr_write_keys(MI_SORT_PARAM *sort_param) MI_SORT_PARAM *sinfo; uchar *mergebuf=0; DBUG_ENTER("thr_write_keys"); - LINT_INIT(length); for (i= 0, sinfo= sort_param ; i < sort_info->total_keys ; @@ -977,7 +973,6 @@ merge_buffers(MI_SORT_PARAM *info, ha_keys keys, IO_CACHE *from_file, count=error=0; maxcount= keys/((uint) (Tb-Fb) +1); DBUG_ASSERT(maxcount > 0); - LINT_INIT(to_start_filepos); if (to_file) to_start_filepos=my_b_tell(to_file); strpos=(uchar*) sort_keys; diff --git a/storage/myisammrg/myrg_open.c b/storage/myisammrg/myrg_open.c index c4a6857fe07..7f3937f572d 100644 --- a/storage/myisammrg/myrg_open.c +++ b/storage/myisammrg/myrg_open.c @@ -239,7 +239,6 @@ MYRG_INFO *myrg_parent_open(const char *parent_name, rc= 1; errpos= 0; bzero((char*) &file_cache, sizeof(file_cache)); - LINT_INIT(m_info); /* Open MERGE meta file. */ if ((fd= mysql_file_open(rg_key_file_MRG, diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 36768ae85c1..411c7ae675d 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -41,11 +41,13 @@ #include "spd_malloc.h" ulong *spd_db_att_thread_id; +#if MYSQL_VERSION_ID < 100103 #ifdef XID_CACHE_IS_SPLITTED uint *spd_db_att_xid_cache_split_num; #endif pthread_mutex_t *spd_db_att_LOCK_xid_cache; HASH *spd_db_att_xid_cache; +#endif struct charset_info_st *spd_charset_utf8_bin; const char **spd_defaults_extra_file; const char **spd_defaults_file; @@ -6263,7 +6265,7 @@ int spider_db_init( "?LOCK_xid_cache@@3PAUst_mysql_mutex@@A")); spd_db_att_xid_cache = *((HASH **) GetProcAddress(current_module, "?xid_cache@@3PAUst_hash@@A")); -#else +#elif MYSQL_VERSION_ID < 100103 spd_db_att_LOCK_xid_cache = (pthread_mutex_t *) #if MYSQL_VERSION_ID < 50500 GetProcAddress(current_module, @@ -6289,7 +6291,7 @@ int spider_db_init( spd_db_att_xid_cache_split_num = &opt_xid_cache_split_num; spd_db_att_LOCK_xid_cache = LOCK_xid_cache; spd_db_att_xid_cache = xid_cache; -#else +#elif MYSQL_VERSION_ID < 100103 spd_db_att_LOCK_xid_cache = &LOCK_xid_cache; spd_db_att_xid_cache = &xid_cache; #endif diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc index a66fa5a7f5d..1b02bb8c641 100644 --- a/storage/spider/spd_trx.cc +++ b/storage/spider/spd_trx.cc @@ -38,11 +38,13 @@ #include "spd_ping_table.h" #include "spd_malloc.h" +#if MYSQL_VERSION_ID < 100103 #ifdef XID_CACHE_IS_SPLITTED extern uint *spd_db_att_xid_cache_split_num; #endif extern pthread_mutex_t *spd_db_att_LOCK_xid_cache; extern HASH *spd_db_att_xid_cache; +#endif extern struct charset_info_st *spd_charset_utf8_bin; extern handlerton *spider_hton_ptr; @@ -1641,6 +1643,13 @@ int spider_xa_lock( int error_num; const char *old_proc_info; DBUG_ENTER("spider_xa_lock"); +#if MYSQL_VERSION_ID >= 100103 + old_proc_info = thd_proc_info(thd, "Locking xid by Spider"); + error_num= 0; + if (xid_cache_insert(thd, xid_state)) + error_num= thd->get_stmt_da()->sql_errno() == ER_XAER_DUPID ? + ER_SPIDER_XA_LOCKED_NUM : HA_ERR_OUT_OF_MEM; +#else #ifdef SPIDER_HAS_HASH_VALUE_TYPE my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache, (uchar*) xid_state->xid.key(), xid_state->xid.key_length()); @@ -1698,6 +1707,7 @@ error: pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]); #else pthread_mutex_unlock(spd_db_att_LOCK_xid_cache); +#endif #endif thd_proc_info(thd, old_proc_info); DBUG_RETURN(error_num); @@ -1709,6 +1719,10 @@ int spider_xa_unlock( THD *thd = current_thd; const char *old_proc_info; DBUG_ENTER("spider_xa_unlock"); +#if MYSQL_VERSION_ID >= 100103 + old_proc_info = thd_proc_info(thd, "Unlocking xid by Spider"); + xid_cache_delete(thd, xid_state); +#else #if defined(SPIDER_HAS_HASH_VALUE_TYPE) && defined(HASH_UPDATE_WITH_HASH_VALUE) my_hash_value_type hash_value = my_calc_hash(spd_db_att_xid_cache, (uchar*) xid_state->xid.key(), xid_state->xid.key_length()); @@ -1737,6 +1751,7 @@ int spider_xa_unlock( pthread_mutex_unlock(&spd_db_att_LOCK_xid_cache[idx]); #else pthread_mutex_unlock(spd_db_att_LOCK_xid_cache); +#endif #endif thd_proc_info(thd, old_proc_info); DBUG_RETURN(0); diff --git a/storage/tokudb/ha_tokudb.cc b/storage/tokudb/ha_tokudb.cc index c875af1488b..71ddf89a55f 100644 --- a/storage/tokudb/ha_tokudb.cc +++ b/storage/tokudb/ha_tokudb.cc @@ -4064,7 +4064,7 @@ bool ha_tokudb::key_changed(uint keynr, const uchar * old_row, const uchar * new int ha_tokudb::update_row(const uchar * old_row, uchar * new_row) { TOKUDB_HANDLER_DBUG_ENTER(""); DBT prim_key, old_prim_key, prim_row, old_prim_row; - int error; + int UNINIT_VAR(error); bool has_null; THD* thd = ha_thd(); DB_TXN* sub_trans = NULL; @@ -4072,7 +4072,6 @@ int ha_tokudb::update_row(const uchar * old_row, uchar * new_row) { tokudb_trx_data* trx = (tokudb_trx_data *) thd_get_ha_data(thd, tokudb_hton); uint curr_num_DBs; - LINT_INIT(error); memset((void *) &prim_key, 0, sizeof(prim_key)); memset((void *) &old_prim_key, 0, sizeof(old_prim_key)); memset((void *) &prim_row, 0, sizeof(prim_row)); diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index d631bd0a34e..eda81c0c4d3 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -50,7 +50,7 @@ #define MY_FUNCTION_NAME(x) my_ ## x ## _big5 #define IS_MB2_CHAR(x,y) (isbig5head(x) && isbig5tail(y)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -6843,6 +6843,9 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)), if (s+2>e) return MY_CS_TOOSMALL2; + if (!IS_MB2_CHAR(hi, s[1])) + return MY_CS_ILSEQ; + if (!(pwc[0]=func_big5_uni_onechar((hi<<8)+s[1]))) return -2; @@ -6894,7 +6897,9 @@ static MY_CHARSET_HANDLER my_charset_big5_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_big5, + my_well_formed_char_length_big5, + my_copy_fix_mb, }; struct charset_info_st my_charset_big5_chinese_ci= diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index 6b53b34159a..95f31038ee6 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -549,6 +549,8 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, + my_charlen_8bit, + my_well_formed_char_length_8bit, my_copy_8bit, }; diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c index 13129a6a874..2e26a98bf05 100644 --- a/strings/ctype-cp932.c +++ b/strings/ctype-cp932.c @@ -186,7 +186,7 @@ static const uchar sort_order_cp932[]= #define MY_FUNCTION_NAME(x) my_ ## x ## _cp932 #define IS_8BIT_CHAR(x) iscp932kata(x) #define IS_MB2_CHAR(x,y) (iscp932head(x) && iscp932tail(y)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -34765,7 +34765,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_cp932, + my_well_formed_char_length_cp932, + my_copy_fix_mb, }; diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index eab9539ad45..a2c95bf77c8 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -204,7 +204,7 @@ static const uchar sort_order_euc_kr[]= #define MY_FUNCTION_NAME(x) my_ ## x ## _euckr #define IS_MB2_CHAR(x,y) (iseuc_kr_head(x) && iseuc_kr_tail(y)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -9928,6 +9928,9 @@ my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)), if (s+2>e) return MY_CS_TOOSMALL2; + if (!IS_MB2_CHAR(hi, s[1])) + return MY_CS_ILSEQ; + if (!(pwc[0]=func_ksc5601_uni_onechar((hi<<8)+s[1]))) return -2; @@ -9979,7 +9982,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_euckr, + my_well_formed_char_length_euckr, + my_copy_fix_mb, }; diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c index 52873c2f87e..827feda927b 100644 --- a/strings/ctype-eucjpms.c +++ b/strings/ctype-eucjpms.c @@ -198,7 +198,7 @@ static const uchar sort_order_eucjpms[]= #define IS_MB2_KATA(x,y) (iseucjpms_ss2(x) && iskata(y)) #define IS_MB2_CHAR(x,y) (IS_MB2_KATA(x,y) || IS_MB2_JIS(x,y)) #define IS_MB3_CHAR(x,y,z) (iseucjpms_ss3(x) && IS_MB2_JIS(y,z)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -67511,7 +67511,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_eucjpms, + my_well_formed_char_length_eucjpms, + my_copy_fix_mb, }; diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index a4268b8fd68..129e8edb966 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -167,7 +167,7 @@ static const uchar sort_order_gb2312[]= #define MY_FUNCTION_NAME(x) my_ ## x ## _gb2312 #define IS_MB2_CHAR(x,y) (isgb2312head(x) && isgb2312tail(y)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -6330,7 +6330,10 @@ my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)), if (s+2>e) return MY_CS_TOOSMALL2; - + + if (!IS_MB2_CHAR(hi, s[1])) + return MY_CS_ILSEQ; + if (!(pwc[0]=func_gb2312_uni_onechar(((hi<<8)+s[1])&0x7F7F))) return -2; @@ -6382,7 +6385,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_gb2312, + my_well_formed_char_length_gb2312, + my_copy_fix_mb, }; diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 392fdb487b6..b3bd1efb6c4 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -45,7 +45,7 @@ #define MY_FUNCTION_NAME(x) my_ ## x ## _gbk #define IS_MB2_CHAR(x,y) (isgbkhead(x) && isgbktail(y)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -10724,6 +10724,9 @@ my_mb_wc_gbk(CHARSET_INFO *cs __attribute__((unused)), if (s+2>e) return MY_CS_TOOSMALL2; + if (!IS_MB2_CHAR(hi, s[1])) + return MY_CS_ILSEQ; + if (!(pwc[0]=func_gbk_uni_onechar( (hi<<8) + s[1]))) return -2; @@ -10776,7 +10779,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_gbk, + my_well_formed_char_length_gbk, + my_copy_fix_mb, }; diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index 099f03460ce..bc51911dceb 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -422,6 +422,8 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, + my_charlen_8bit, + my_well_formed_char_length_8bit, my_copy_8bit, }; diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index fc41563324a..5947c3d4f4a 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -424,25 +424,95 @@ size_t my_well_formed_len_mb(CHARSET_INFO *cs, const char *b, const char *e, /* - Copy a multi-byte string. Abort if a bad byte sequence was found. - Note more than "nchars" characters are copied. + Append a badly formed piece of string. + Bad bytes are fixed to '?'. + + @param to The destination string + @param to_end The end of the destination string + @param from The source string + @param from_end The end of the source string + @param nchars Write not more than "nchars" characters. + @param status Copying status, must be previously initialized, + e.g. using well_formed_char_length() on the original + full source string. */ -size_t -my_copy_abort_mb(CHARSET_INFO *cs, - char *dst, size_t dst_length, - const char *src, size_t src_length, - size_t nchars, MY_STRCOPY_STATUS *status) +static size_t +my_append_fix_badly_formed_tail(CHARSET_INFO *cs, + char *to, char *to_end, + const char *from, const char *from_end, + size_t nchars, + MY_STRCOPY_STATUS *status) { - int well_formed_error; - size_t res; + char *to0= to; + + for ( ; nchars; nchars--) + { + int chlen; + if ((chlen= cs->cset->charlen(cs, (const uchar*) from, + (const uchar *) from_end)) > 0) + { + /* Found a valid character */ /* chlen == 1..MBMAXLEN */ + DBUG_ASSERT(chlen <= (int) cs->mbmaxlen); + if (to + chlen > to_end) + goto end; /* Does not fit to "to" */ + memcpy(to, from, (size_t) chlen); + from+= chlen; + to+= chlen; + continue; + } + if (chlen == MY_CS_ILSEQ) /* chlen == 0 */ + { + DBUG_ASSERT(from < from_end); /* Shouldn't get MY_CS_ILSEQ if empty */ + goto bad; + } + /* Got an incomplete character */ /* chlen == MY_CS_TOOSMALLXXX */ + DBUG_ASSERT(chlen >= MY_CS_TOOSMALL6); + DBUG_ASSERT(chlen <= MY_CS_TOOSMALL); + if (from >= from_end) + break; /* End of the source string */ +bad: + /* Bad byte sequence, or incomplete character found */ + if (!status->m_well_formed_error_pos) + status->m_well_formed_error_pos= from; + + if ((chlen= cs->cset->wc_mb(cs, '?', (uchar*) to, (uchar *) to_end)) <= 0) + break; /* Question mark does not fit into the destination */ + to+= chlen; + from++; + } +end: + status->m_source_end_pos= from; + return to - to0; +} + + +size_t +my_copy_fix_mb(CHARSET_INFO *cs, + char *dst, size_t dst_length, + const char *src, size_t src_length, + size_t nchars, MY_STRCOPY_STATUS *status) +{ + size_t well_formed_nchars; + size_t well_formed_length; + size_t fixed_length; set_if_smaller(src_length, dst_length); - res= cs->cset->well_formed_len(cs, src, src + src_length, - nchars, &well_formed_error); - memmove(dst, src, res); - status->m_source_end_pos= src + res; - status->m_well_formed_error_pos= well_formed_error ? src + res : NULL; - return res; + well_formed_nchars= cs->cset->well_formed_char_length(cs, + src, src + src_length, + nchars, status); + DBUG_ASSERT(well_formed_nchars <= nchars); + memmove(dst, src, (well_formed_length= status->m_source_end_pos - src)); + if (!status->m_well_formed_error_pos) + return well_formed_length; + + fixed_length= my_append_fix_badly_formed_tail(cs, + dst + well_formed_length, + dst + dst_length, + src + well_formed_length, + src + src_length, + nchars - well_formed_nchars, + status); + return well_formed_length + fixed_length; } diff --git a/strings/ctype-mb.ic b/strings/ctype-mb.ic index 70cc89c9af0..55094535d5e 100644 --- a/strings/ctype-mb.ic +++ b/strings/ctype-mb.ic @@ -29,7 +29,70 @@ #endif -#ifdef WELL_FORMED_LEN +#ifdef DEFINE_ASIAN_ROUTINES +#define DEFINE_WELL_FORMED_LEN +#define DEFINE_WELL_FORMED_CHAR_LENGTH +#define DEFINE_CHARLEN +#endif + + +#ifdef DEFINE_CHARLEN +/** + Returns length of the left-most character of a string. + @param cs - charset with mbminlen==1 and mbmaxlen<=4 + @param b - the beginning of the string + @param e - the end of the string + + @return MY_CS_ILSEQ if a bad byte sequence was found + @return MY_CS_TOOSMALL(N) if the string ended unexpectedly + @return >0 if a valid character was found +*/ +static int +MY_FUNCTION_NAME(charlen)(CHARSET_INFO *cs __attribute__((unused)), + const uchar *b, const uchar *e) +{ + DBUG_ASSERT(cs->mbminlen == 1); + DBUG_ASSERT(cs->mbmaxlen <= 4); + + if (b >= e) + return MY_CS_TOOSMALL; + if ((uchar) b[0] < 128) + return 1; /* Single byte ASCII character */ + +#ifdef IS_8BIT_CHAR + if (IS_8BIT_CHAR(b[0])) + { + /* Single byte non-ASCII character, e.g. half width kana in sjis */ + return 1; + } +#endif + + if (b + 2 > e) + return MY_CS_TOOSMALLN(2); + if (IS_MB2_CHAR(b[0], b[1])) + return 2; /* Double byte character */ + +#ifdef IS_MB3_CHAR + if (b + 3 > e) + return MY_CS_TOOSMALLN(3); + if (IS_MB3_CHAR(b[0], b[1], b[2])) + return 3; /* Three-byte character */ +#endif + +#ifdef IS_MB4_CHAR + if (b + 4 > e) + return MY_CS_TOOSMALLN(4); + if (IS_MB4_CHAR(b[0], b[1], b[2], b[3])) + return 4; /* Four-byte character */ +#endif + + /* Wrong byte sequence */ + return MY_CS_ILSEQ; +} +#endif /* DEFINE_WELL_FORMED_LEN */ + + +#ifdef DEFINE_WELL_FORMED_LEN /** Returns well formed length of a character string with variable character length for character sets with: @@ -91,4 +154,105 @@ MY_FUNCTION_NAME(well_formed_len)(CHARSET_INFO *cs __attribute__((unused)), return b - b0; } -#endif /* WELL_FORMED_LEN */ +#endif /* DEFINE_WELL_FORMED_LEN */ + + + +#ifdef DEFINE_WELL_FORMED_CHAR_LENGTH +/** + Returns well formed length of a string + measured in characters (rather than in bytes). + Version for character sets that define IS_MB?_CHAR(), e.g. big5. +*/ +static size_t +MY_FUNCTION_NAME(well_formed_char_length)(CHARSET_INFO *cs __attribute__((unused)), + const char *b, const char *e, + size_t nchars, + MY_STRCOPY_STATUS *status) +{ + size_t nchars0= nchars; + for ( ; b < e && nchars ; nchars--) + { + if ((uchar) b[0] < 128) + { + b++; /* Single byte ASCII character */ + continue; + } + + if (b + 2 <= e && IS_MB2_CHAR(b[0], b[1])) + { + b+= 2; /* Double byte character */ + continue; + } + +#ifdef IS_MB3_CHAR + if (b + 3 <= e && IS_MB3_CHAR(b[0], b[1], b[2])) + { + b+= 3; /* Three-byte character */ + continue; + } +#endif + +#ifdef IS_MB4_CHAR + if (b + 4 <= e && IS_MB4_CHAR(b[0], b[1], b[2], b[3])) + { + b+= 4; /* Four-byte character */ + continue; + } +#endif + +#ifdef IS_8BIT_CHAR + if (IS_8BIT_CHAR(b[0])) + { + b++; /* Single byte non-ASCII character, e.g. half width kana in sjis */ + continue; + } +#endif + + /* Wrong byte sequence */ + status->m_source_end_pos= status->m_well_formed_error_pos= b; + return nchars0 - nchars; + } + status->m_source_end_pos= b; + status->m_well_formed_error_pos= NULL; + return nchars0 - nchars; +} +#endif /* DEFINE_WELL_FORMED_CHAR_LENGTH */ + + +#ifdef DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +#ifndef CHARLEN +#error CHARLEN is not defined +#endif +/** + Returns well formed length of a string + measured in characters (rather than in bytes). + Version for character sets that define CHARLEN(), e.g. utf8. + CHARLEN(cs,b,e) must use the same return code convension that mb_wc() does: + - a positive number in the range [1-mbmaxlen] if a valid + single-byte or multi-byte character was found + - MY_CS_ILSEQ (0) on a bad byte sequence + - MY_CS_TOOSMALLxx if the incoming sequence is incomplete +*/ +static size_t +MY_FUNCTION_NAME(well_formed_char_length)(CHARSET_INFO *cs __attribute__((unused)), + const char *b, const char *e, + size_t nchars, + MY_STRCOPY_STATUS *status) +{ + size_t nchars0= nchars; + int chlen; + for ( ; nchars ; nchars--, b+= chlen) + { + if ((chlen= CHARLEN(cs, (uchar*) b, (uchar*) e)) <= 0) + { + status->m_well_formed_error_pos= b < e ? b : NULL; + status->m_source_end_pos= b; + return nchars0 - nchars; + } + } + status->m_well_formed_error_pos= NULL; + status->m_source_end_pos= b; + return nchars0 - nchars; +} +#endif /* DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN */ diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index b010c528979..d7a1b3f33b4 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -248,6 +248,13 @@ int my_strcasecmp_8bit(CHARSET_INFO * cs,const char *s, const char *t) } +int my_charlen_8bit(CHARSET_INFO *cs __attribute__((unused)), + const uchar *str, const uchar *end) +{ + return str >= end ? MY_CS_TOOSMALL : 1; +} + + int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *str, const uchar *end __attribute__((unused))) @@ -1108,6 +1115,19 @@ size_t my_well_formed_len_8bit(CHARSET_INFO *cs __attribute__((unused)), } +size_t +my_well_formed_char_length_8bit(CHARSET_INFO *cs __attribute__((unused)), + const char *start, const char *end, + size_t nchars, MY_STRCOPY_STATUS *status) +{ + size_t nbytes= (size_t) (end - start); + size_t res= MY_MIN(nbytes, nchars); + status->m_well_formed_error_pos= NULL; + status->m_source_end_pos= start + res; + return res; +} + + /* Copy a 8-bit string. Not more than "nchars" character are copied. */ @@ -1906,6 +1926,8 @@ MY_CHARSET_HANDLER my_charset_8bit_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, + my_charlen_8bit, + my_well_formed_char_length_8bit, my_copy_8bit, }; diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 432e2e5e823..bbf0026cf2b 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -187,7 +187,7 @@ static const uchar sort_order_sjis[]= #define MY_FUNCTION_NAME(x) my_ ## x ## _sjis #define IS_8BIT_CHAR(x) issjiskata(x) #define IS_MB2_CHAR(x,y) (issjishead(x) && issjistail(y)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -34144,7 +34144,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_sjis, + my_well_formed_char_length_sjis, + my_copy_fix_mb, }; diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 343fb812e20..6537b380ab3 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -886,6 +886,8 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, + my_charlen_8bit, + my_well_formed_char_length_8bit, my_copy_8bit, }; diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 8f234e9e3a8..d1441a4d3a5 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -92,62 +92,107 @@ my_strcasecmp_mb2_or_mb4(CHARSET_INFO *cs __attribute__((unused)), } -/* - Copy an UCS2/UTF16/UTF32 string. - Not more that "nchars" characters are copied. +typedef enum +{ + MY_CHAR_COPY_OK= 0, /* The character was Okey */ + MY_CHAR_COPY_ERROR= 1, /* The character was not Ok, and could not fix */ + MY_CHAR_COPY_FIXED= 2 /* The character was not Ok, was fixed to '?' */ +} my_char_copy_status_t; - UCS2/UTF16/UTF32 may need to prepend zero some bytes, - e.g. when copying from a BINARY source: - INSERT INTO t1 (ucs2_column) VALUES (0x01); - 0x01 -> 0x0001 + +/* + Copies an incomplete character, lef-padding it with 0x00 bytes. + + @param cs Character set + @param dst The destination string + @param dst_length Space available in dst + @param src The source string + @param src_length Length of src + @param nchars Copy not more than nchars characters. + The "nchars" parameter of the caller. + Only 0 and non-0 are important here. + @param fix What to do if after zero-padding didn't get a valid + character: + - FALSE - exit with error. + - TRUE - try to put '?' instead. + + @return MY_CHAR_COPY_OK if after zero-padding got a valid character. + cs->mbmaxlen bytes were written to "dst". + @return MY_CHAR_COPY_FIXED if after zero-padding did not get a valid + character, but wrote '?' to the destination + string instead. + cs->mbminlen bytes were written to "dst". + @return MY_CHAR_COPY_ERROR If failed and nothing was written to "dst". + Possible reasons: + - dst_length was too short + - nchars was 0 + - the character after padding appeared not + to be valid, and could not fix it to '?'. +*/ +static my_char_copy_status_t +my_copy_incomplete_char(CHARSET_INFO *cs, + char *dst, size_t dst_length, + const char *src, size_t src_length, + size_t nchars, my_bool fix) +{ + size_t pad_length; + size_t src_offset= src_length % cs->mbminlen; + if (dst_length < cs->mbminlen || !nchars) + return MY_CHAR_COPY_ERROR; + + pad_length= cs->mbminlen - src_offset; + bzero(dst, pad_length); + memmove(dst + pad_length, src, src_offset); + /* + In some cases left zero-padding can create an incorrect character. + For example: + INSERT INTO t1 (utf32_column) VALUES (0x110000); + We'll pad the value to 0x00110000, which is a wrong UTF32 sequence! + The valid characters range is limited to 0x00000000..0x0010FFFF. + + Make sure we didn't pad to an incorrect character. + */ + if (cs->cset->charlen(cs, (uchar *) dst, (uchar *) dst + cs->mbminlen) == + (int) cs->mbminlen) + return MY_CHAR_COPY_OK; + + if (fix && + cs->cset->wc_mb(cs, '?', (uchar *) dst, (uchar *) dst + cs->mbminlen) == + (int) cs->mbminlen) + return MY_CHAR_COPY_FIXED; + + return MY_CHAR_COPY_ERROR; +} + + +/* + Copy an UCS2/UTF16/UTF32 string, fix bad characters. */ static size_t -my_copy_abort_mb2_or_mb4(CHARSET_INFO *cs, - char *dst, size_t dst_length, - const char *src, size_t src_length, - size_t nchars, MY_STRCOPY_STATUS *status) +my_copy_fix_mb2_or_mb4(CHARSET_INFO *cs, + char *dst, size_t dst_length, + const char *src, size_t src_length, + size_t nchars, MY_STRCOPY_STATUS *status) { - size_t src_offset; - - if ((src_offset= (src_length % cs->mbminlen))) + size_t length2, src_offset= src_length % cs->mbminlen; + my_char_copy_status_t padstatus; + + if (!src_offset) + return my_copy_fix_mb(cs, dst, dst_length, + src, src_length, nchars, status); + if ((padstatus= my_copy_incomplete_char(cs, dst, dst_length, + src, src_length, nchars, TRUE)) == + MY_CHAR_COPY_ERROR) { - int well_formed_error; - size_t pad_length; - if (dst_length < cs->mbminlen || !nchars) - { - status->m_source_end_pos= status->m_well_formed_error_pos= src; - return 0; - } - - pad_length= cs->mbminlen - src_offset; - bzero(dst, pad_length); - memmove(dst + pad_length, src, src_offset); - /* - In some cases left zero-padding can create an incorrect character. - For example: - INSERT INTO t1 (utf32_column) VALUES (0x110000); - We'll pad the value to 0x00110000, which is a wrong UTF32 sequence! - The valid characters range is limited to 0x00000000..0x0010FFFF. - - Make sure we didn't pad to an incorrect character. - */ - if (cs->cset->well_formed_len(cs, - dst, dst + cs->mbminlen, 1, - &well_formed_error) != cs->mbminlen) - { - status->m_source_end_pos= status->m_well_formed_error_pos= src; - return 0; - } - nchars--; - src+= src_offset; - src_length-= src_offset; - dst+= cs->mbminlen; - dst_length-= cs->mbminlen; - return - cs->mbminlen /* The left-padded character */ + - my_copy_abort_mb(cs, dst, dst_length, src, src_length, nchars, status); + status->m_source_end_pos= status->m_well_formed_error_pos= src; + return 0; } - return my_copy_abort_mb(cs, dst, dst_length, src, src_length, nchars, status); + length2= my_copy_fix_mb(cs, dst + cs->mbminlen, dst_length - cs->mbminlen, + src + src_offset, src_length - src_offset, + nchars - 1, status); + if (padstatus == MY_CHAR_COPY_FIXED) + status->m_well_formed_error_pos= src; + return cs->mbminlen /* The left-padded character */ + length2; } @@ -1475,6 +1520,24 @@ my_ismbchar_utf16(CHARSET_INFO *cs, const char *b, const char *e) } +static int +my_charlen_utf16(CHARSET_INFO *cs, const uchar *str, const uchar *end) +{ + my_wc_t wc; + return cs->cset->mb_wc(cs, &wc, str, end); +} + + +#define MY_FUNCTION_NAME(x) my_ ## x ## _utf16 +#define CHARLEN(cs,str,end) my_charlen_utf16(cs,str,end) +#define DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +#include "ctype-mb.ic" +#undef MY_FUNCTION_NAME +#undef CHARLEN +#undef DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +/* Defines my_well_formed_char_length_utf16 */ + + static uint my_mbcharlen_utf16(CHARSET_INFO *cs __attribute__((unused)), uint c __attribute__((unused))) @@ -1742,7 +1805,9 @@ MY_CHARSET_HANDLER my_charset_utf16_handler= my_strtoll10_mb2, my_strntoull10rnd_mb2_or_mb4, my_scan_mb2, - my_copy_abort_mb2_or_mb4, + my_charlen_utf16, + my_well_formed_char_length_utf16, + my_copy_fix_mb2_or_mb4, }; @@ -1912,7 +1977,9 @@ static MY_CHARSET_HANDLER my_charset_utf16le_handler= my_strtoll10_mb2, my_strntoull10rnd_mb2_or_mb4, my_scan_mb2, - my_copy_abort_mb2_or_mb4, + my_charlen_utf16, + my_well_formed_char_length_utf16, + my_copy_fix_mb2_or_mb4, }; @@ -1987,6 +2054,13 @@ struct charset_info_st my_charset_utf16le_bin= #ifdef HAVE_CHARSET_utf32 +/* + Check is b0 and b1 start a valid UTF32 four-byte sequence. + Don't accept characters greater than U+10FFFF. +*/ +#define IS_UTF32_MBHEAD4(b0,b1) (!(b0) && ((uchar) (b1) <= 0x10)) + + static int my_utf32_uni(CHARSET_INFO *cs __attribute__((unused)), my_wc_t *pwc, const uchar *s, const uchar *e) @@ -1994,7 +2068,7 @@ my_utf32_uni(CHARSET_INFO *cs __attribute__((unused)), if (s + 4 > e) return MY_CS_TOOSMALL4; *pwc= (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + (s[3]); - return 4; + return *pwc > 0x10FFFF ? MY_CS_ILSEQ : 4; } @@ -2004,7 +2078,10 @@ my_uni_utf32(CHARSET_INFO *cs __attribute__((unused)), { if (s + 4 > e) return MY_CS_TOOSMALL4; - + + if (wc > 0x10FFFF) + return MY_CS_ILUNI; + s[0]= (uchar) (wc >> 24); s[1]= (uchar) (wc >> 16) & 0xFF; s[2]= (uchar) (wc >> 8) & 0xFF; @@ -2263,10 +2340,29 @@ my_ismbchar_utf32(CHARSET_INFO *cs __attribute__((unused)), const char *b, const char *e) { - return b + 4 > e ? 0 : 4; + return b + 4 > e || !IS_UTF32_MBHEAD4(b[0], b[1]) ? 0 : 4; } +static int +my_charlen_utf32(CHARSET_INFO *cs __attribute__((unused)), + const uchar *b, const uchar *e) +{ + return b + 4 > e ? MY_CS_TOOSMALL4 : + IS_UTF32_MBHEAD4(b[0], b[1]) ? 4 : MY_CS_ILSEQ; +} + + +#define MY_FUNCTION_NAME(x) my_ ## x ## _utf32 +#define CHARLEN(cs,str,end) my_charlen_utf32(cs,str,end) +#define DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +#include "ctype-mb.ic" +#undef MY_FUNCTION_NAME +#undef CHARLEN +#undef DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +/* Defines my_well_formed_char_length_utf32 */ + + static uint my_mbcharlen_utf32(CHARSET_INFO *cs __attribute__((unused)) , uint c __attribute__((unused))) @@ -2579,8 +2675,7 @@ my_well_formed_len_utf32(CHARSET_INFO *cs __attribute__((unused)), } for (; b < e; b+= 4) { - /* Don't accept characters greater than U+10FFFF */ - if (b[0] || (uchar) b[1] > 0x10) + if (!IS_UTF32_MBHEAD4(b[0], b[1])) { *error= 1; return b - b0; @@ -2827,7 +2922,9 @@ MY_CHARSET_HANDLER my_charset_utf32_handler= my_strtoll10_utf32, my_strntoull10rnd_mb2_or_mb4, my_scan_utf32, - my_copy_abort_mb2_or_mb4, + my_charlen_utf32, + my_well_formed_char_length_utf32, + my_copy_fix_mb2_or_mb4, }; @@ -2961,6 +3058,14 @@ static const uchar to_upper_ucs2[] = { }; +static int +my_charlen_ucs2(CHARSET_INFO *cs __attribute__((unused)), + const uchar *s, const uchar *e) +{ + return s + 2 > e ? MY_CS_TOOSMALLN(2) : 2; +} + + static int my_ucs2_uni(CHARSET_INFO *cs __attribute__((unused)), my_wc_t * pwc, const uchar *s, const uchar *e) { @@ -3264,6 +3369,31 @@ size_t my_well_formed_len_ucs2(CHARSET_INFO *cs __attribute__((unused)), } +static size_t +my_well_formed_char_length_ucs2(CHARSET_INFO *cs __attribute__((unused)), + const char *b, const char *e, + size_t nchars, MY_STRCOPY_STATUS *status) +{ + size_t length= e - b; + if (nchars * 2 <= length) + { + status->m_well_formed_error_pos= NULL; + status->m_source_end_pos= b + (nchars * 2); + return nchars; + } + if (length % 2) + { + status->m_well_formed_error_pos= status->m_source_end_pos= e - 1; + } + else + { + status->m_well_formed_error_pos= NULL; + status->m_source_end_pos= e; + } + return length / 2; +} + + static int my_wildcmp_ucs2_ci(CHARSET_INFO *cs, const char *str,const char *str_end, @@ -3446,7 +3576,9 @@ MY_CHARSET_HANDLER my_charset_ucs2_handler= my_strtoll10_mb2, my_strntoull10rnd_mb2_or_mb4, my_scan_mb2, - my_copy_abort_mb2_or_mb4, + my_charlen_ucs2, + my_well_formed_char_length_ucs2, + my_copy_fix_mb2_or_mb4, }; diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 99f5be3fa38..cb000a2afa0 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -197,7 +197,7 @@ static const uchar sort_order_ujis[]= #define IS_MB2_KATA(x,y) (isujis_ss2(x) && iskata(y)) #define IS_MB2_CHAR(x, y) (IS_MB2_KATA(x,y) || IS_MB2_JIS(x,y)) #define IS_MB3_CHAR(x, y, z) (isujis_ss3(x) && IS_MB2_JIS(y,z)) -#define WELL_FORMED_LEN +#define DEFINE_ASIAN_ROUTINES #include "ctype-mb.ic" @@ -67255,7 +67255,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_ujis, + my_well_formed_char_length_ujis, + my_copy_fix_mb, }; diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 1116228f706..20719783edd 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -4629,14 +4629,13 @@ my_strnxfrm_unicode(CHARSET_INFO *cs, uchar *dst, size_t dstlen, uint nweights, const uchar *src, size_t srclen, uint flags) { - my_wc_t wc; + my_wc_t UNINIT_VAR(wc); int res; uchar *dst0= dst; uchar *de= dst + dstlen; const uchar *se= src + srclen; MY_UNICASE_INFO *uni_plane= (cs->state & MY_CS_BINSORT) ? NULL : cs->caseinfo; - LINT_INIT(wc); DBUG_ASSERT(!srclen || src); for (; dst < de && nweights; nweights--) @@ -4683,12 +4682,11 @@ my_strnxfrm_unicode_full_bin(CHARSET_INFO *cs, uchar *dst, size_t dstlen, uint nweights, const uchar *src, size_t srclen, uint flags) { - my_wc_t wc; + my_wc_t UNINIT_VAR(wc); uchar *dst0= dst; uchar *de= dst + dstlen; const uchar *se = src + srclen; - LINT_INIT(wc); DBUG_ASSERT(!srclen || src); DBUG_ASSERT(cs->state & MY_CS_BINSORT); @@ -5446,8 +5444,8 @@ int my_wildcmp_utf8(CHARSET_INFO *cs, static -int my_valid_mbcharlen_utf8(CHARSET_INFO *cs __attribute__((unused)), - const uchar *s, const uchar *e) +int my_charlen_utf8(CHARSET_INFO *cs __attribute__((unused)), + const uchar *s, const uchar *e) { uchar c; @@ -5515,7 +5513,7 @@ my_well_formed_len_utf8(CHARSET_INFO *cs, const char *b, const char *e, { int mb_len; - if ((mb_len= my_valid_mbcharlen_utf8(cs, (uchar*) b, (uchar*) e)) <= 0) + if ((mb_len= my_charlen_utf8(cs, (uchar*) b, (uchar*) e)) <= 0) { *error= b < e ? 1 : 0; break; @@ -5526,9 +5524,20 @@ my_well_formed_len_utf8(CHARSET_INFO *cs, const char *b, const char *e, return (size_t) (b - b_start); } + +#define MY_FUNCTION_NAME(x) my_ ## x ## _utf8 +#define CHARLEN(cs,str,end) my_charlen_utf8(cs,str,end) +#define DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +#include "ctype-mb.ic" +#undef MY_FUNCTION_NAME +#undef CHARLEN +#undef DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +/* my_well_formed_char_length_utf8 */ + + static uint my_ismbchar_utf8(CHARSET_INFO *cs,const char *b, const char *e) { - int res= my_valid_mbcharlen_utf8(cs, (const uchar*)b, (const uchar*)e); + int res= my_charlen_utf8(cs, (const uchar*) b, (const uchar*) e); return (res>1) ? res : 0; } @@ -5615,7 +5624,9 @@ MY_CHARSET_HANDLER my_charset_utf8_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_utf8, + my_well_formed_char_length_utf8, + my_copy_fix_mb, }; @@ -7125,6 +7136,24 @@ my_wc_mb_filename(CHARSET_INFO *cs __attribute__((unused)), } +static int +my_charlen_filename(CHARSET_INFO *cs, const uchar *str, const uchar *end) +{ + my_wc_t wc; + return cs->cset->mb_wc(cs, &wc, str, end); +} + + +#define MY_FUNCTION_NAME(x) my_ ## x ## _filename +#define CHARLEN(cs,str,end) my_charlen_filename(cs,str,end) +#define DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +#include "ctype-mb.ic" +#undef MY_FUNCTION_NAME +#undef CHARLEN +#undef DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +/* my_well_formed_char_length_filename */ + + static MY_COLLATION_HANDLER my_collation_filename_handler = { NULL, /* init */ @@ -7169,7 +7198,9 @@ static MY_CHARSET_HANDLER my_charset_filename_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_filename, + my_well_formed_char_length_filename, + my_copy_fix_mb, }; @@ -7731,12 +7762,10 @@ my_strnncoll_utf8mb4(CHARSET_INFO *cs, const uchar *t, size_t tlen, my_bool t_is_prefix) { - my_wc_t s_wc,t_wc; + my_wc_t UNINIT_VAR(s_wc), UNINIT_VAR(t_wc); const uchar *se= s + slen; const uchar *te= t + tlen; MY_UNICASE_INFO *uni_plane= cs->caseinfo; - LINT_INIT(s_wc); - LINT_INIT(t_wc); while ( s < se && t < te ) { @@ -7799,11 +7828,9 @@ my_strnncollsp_utf8mb4(CHARSET_INFO *cs, my_bool diff_if_only_endspace_difference) { int res; - my_wc_t s_wc, t_wc; + my_wc_t UNINIT_VAR(s_wc), UNINIT_VAR(t_wc); const uchar *se= s + slen, *te= t + tlen; MY_UNICASE_INFO *uni_plane= cs->caseinfo; - LINT_INIT(s_wc); - LINT_INIT(t_wc); #ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE diff_if_only_endspace_difference= FALSE; @@ -7954,8 +7981,8 @@ my_wildcmp_utf8mb4(CHARSET_INFO *cs, static int -my_valid_mbcharlen_utf8mb4(CHARSET_INFO *cs __attribute__((unused)), - const uchar *s, const uchar *e) +my_charlen_utf8mb4(CHARSET_INFO *cs __attribute__((unused)), + const uchar *s, const uchar *e) { uchar c; @@ -8015,7 +8042,7 @@ size_t my_well_formed_len_utf8mb4(CHARSET_INFO *cs, { int mb_len; - if ((mb_len= my_valid_mbcharlen_utf8mb4(cs, (uchar*) b, (uchar*) e)) <= 0) + if ((mb_len= my_charlen_utf8mb4(cs, (uchar*) b, (uchar*) e)) <= 0) { *error= b < e ? 1 : 0; break; @@ -8027,10 +8054,19 @@ size_t my_well_formed_len_utf8mb4(CHARSET_INFO *cs, } +#define MY_FUNCTION_NAME(x) my_ ## x ## _utf8mb4 +#define CHARLEN(cs,str,end) my_charlen_utf8mb4(cs,str,end) +#define DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +#include "ctype-mb.ic" +#undef MY_FUNCTION_NAME +#undef CHARLEN +#undef DEFINE_WELL_FORMED_CHAR_LENGTH_USING_CHARLEN +/* my_well_formed_char_length_utf8mb4 */ + static uint my_ismbchar_utf8mb4(CHARSET_INFO *cs, const char *b, const char *e) { - int res= my_valid_mbcharlen_utf8mb4(cs, (const uchar*)b, (const uchar*)e); + int res= my_charlen_utf8mb4(cs, (const uchar*) b, (const uchar*) e); return (res > 1) ? res : 0; } @@ -8113,7 +8149,9 @@ MY_CHARSET_HANDLER my_charset_utf8mb4_handler= my_strtoll10_8bit, my_strntoull10rnd_8bit, my_scan_8bit, - my_copy_abort_mb, + my_charlen_utf8mb4, + my_well_formed_char_length_utf8mb4, + my_copy_fix_mb, }; diff --git a/strings/ctype.c b/strings/ctype.c index 048fbe3d368..aa40e2b338c 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -1161,3 +1161,76 @@ my_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs, DBUG_ASSERT(FALSE); // Should never get to here return 0; // Make compiler happy } + + +size_t +my_convert_fix(CHARSET_INFO *to_cs, char *to, size_t to_length, + CHARSET_INFO *from_cs, const char *from, size_t from_length, + size_t nchars, MY_STRCONV_STATUS *status) +{ + int cnvres; + my_wc_t wc; + my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc; + my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb; + const uchar *from_end= (const uchar*) from + from_length; + uchar *to_end= (uchar*) to + to_length; + char *to_start= to; + + DBUG_ASSERT(to_cs != &my_charset_bin); + DBUG_ASSERT(from_cs != &my_charset_bin); + + status->m_native_copy_status.m_well_formed_error_pos= NULL; + status->m_cannot_convert_error_pos= NULL; + + for ( ; nchars; nchars--) + { + const char *from_prev= from; + if ((cnvres= (*mb_wc)(from_cs, &wc, (uchar*) from, from_end)) > 0) + from+= cnvres; + else if (cnvres == MY_CS_ILSEQ) + { + if (!status->m_native_copy_status.m_well_formed_error_pos) + status->m_native_copy_status.m_well_formed_error_pos= from; + from++; + wc= '?'; + } + else if (cnvres > MY_CS_TOOSMALL) + { + /* + A correct multibyte sequence detected + But it doesn't have Unicode mapping. + */ + if (!status->m_cannot_convert_error_pos) + status->m_cannot_convert_error_pos= from; + from+= (-cnvres); + wc= '?'; + } + else + { + if ((uchar *) from >= from_end) + break; // End of line + // Incomplete byte sequence + if (!status->m_native_copy_status.m_well_formed_error_pos) + status->m_native_copy_status.m_well_formed_error_pos= from; + from++; + wc= '?'; + } +outp: + if ((cnvres= (*wc_mb)(to_cs, wc, (uchar*) to, to_end)) > 0) + to+= cnvres; + else if (cnvres == MY_CS_ILUNI && wc != '?') + { + if (!status->m_cannot_convert_error_pos) + status->m_cannot_convert_error_pos= from_prev; + wc= '?'; + goto outp; + } + else + { + from= from_prev; + break; + } + } + status->m_native_copy_status.m_source_end_pos= from; + return to - to_start; +}