Commit ce07d09f authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.0 into 10.1

parents de76cbdc 62246664
...@@ -166,8 +166,8 @@ static struct my_option my_long_options[]= ...@@ -166,8 +166,8 @@ static struct my_option my_long_options[]=
"server with which it was built/distributed.", "server with which it was built/distributed.",
&opt_version_check, &opt_version_check, 0, &opt_version_check, &opt_version_check, 0,
GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
{"write-binlog", OPT_WRITE_BINLOG, "All commands including those, " {"write-binlog", OPT_WRITE_BINLOG, "All commands including those "
"issued by mysqlcheck, are written to the binary log.", "issued by mysqlcheck are written to the binary log.",
&opt_write_binlog, &opt_write_binlog, 0, GET_BOOL, NO_ARG, &opt_write_binlog, &opt_write_binlog, 0, GET_BOOL, NO_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
......
...@@ -63,6 +63,12 @@ typedef struct st_mysql_lex_string LEX_STRING; ...@@ -63,6 +63,12 @@ typedef struct st_mysql_lex_string LEX_STRING;
/* NO and OK is the same used just to show semantics */ /* NO and OK is the same used just to show semantics */
#define ER_DYNCOL_NO ER_DYNCOL_OK #define ER_DYNCOL_NO ER_DYNCOL_OK
#ifdef HAVE_CHARSET_utf8mb4
#define DYNCOL_UTF (&my_charset_utf8mb4_general_ci)
#else
#define DYNCOL_UTF (&my_charset_utf8_general_ci)
#endif
enum enum_dyncol_func_result enum enum_dyncol_func_result
{ {
ER_DYNCOL_OK= 0, ER_DYNCOL_OK= 0,
......
...@@ -691,8 +691,7 @@ it was built/distributed. Defaults to on; use \fB\-\-skip\-version\-check\fR to ...@@ -691,8 +691,7 @@ it was built/distributed. Defaults to on; use \fB\-\-skip\-version\-check\fR to
.sp .sp
Cause binary logging to be enabled while Cause binary logging to be enabled while
\fBmysql_upgrade\fR \fBmysql_upgrade\fR
runs\&. This is the default behavior; to disable binary logging during the upgrade, use the inverse of this option (that is, start the program with runs\&.
\fB\-\-skip\-write\-binlog\fR)\&.
.RE .RE
.SH "COPYRIGHT" .SH "COPYRIGHT"
.br .br
......
...@@ -10264,6 +10264,21 @@ DROP FUNCTION iswellformed; ...@@ -10264,6 +10264,21 @@ DROP FUNCTION iswellformed;
DROP TABLE allbytes; DROP TABLE allbytes;
# End of ctype_backslash.inc # End of ctype_backslash.inc
# #
# MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1)
#
SET NAMES utf8;
SELECT CHAR(0xDF USING latin1);
CHAR(0xDF USING latin1)
ß
CREATE OR REPLACE VIEW v1 AS SELECT CHAR(0xDF USING latin1) AS c;
SHOW CREATE VIEW v1;
View Create View character_set_client collation_connection
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select char(0xdf using latin1) AS `c` utf8 utf8_general_ci
SELECT * FROM v1;
c
ß
DROP VIEW v1;
#
# End of 10.0 tests # End of 10.0 tests
# #
# #
......
...@@ -3421,6 +3421,32 @@ a b ...@@ -3421,6 +3421,32 @@ a b
a 😁 b a ? b a 😁 b a ? b
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-8949: COLUMN_CREATE unicode name breakage
#
SET NAMES utf8mb4;
SELECT COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1))
{"😎":1}
SELECT COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1))
`😎`
SELECT COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E
as int);
COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E
as int)
1
CREATE TABLE t1 AS SELECT
COLUMN_LIST(COLUMN_CREATE('a',1)),
COLUMN_JSON(COLUMN_CREATE('b',1));
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`COLUMN_LIST(COLUMN_CREATE('a',1))` longtext CHARACTER SET utf8mb4,
`COLUMN_JSON(COLUMN_CREATE('b',1))` longtext CHARACTER SET utf8mb4
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
SET NAMES default;
#
# End of 10.0 tests # End of 10.0 tests
# #
# #
......
...@@ -4547,6 +4547,27 @@ set global max_allowed_packet=default; ...@@ -4547,6 +4547,27 @@ set global max_allowed_packet=default;
# End of 5.6 tests # End of 5.6 tests
# #
# #
# Start of 10.0 tests
#
#
# MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1)
#
EXPLAIN EXTENDED SELECT CHAR(0xDF USING latin1);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings:
Note 1003 select char(0xdf using latin1) AS `CHAR(0xDF USING latin1)`
EXPLAIN EXTENDED SELECT CHAR(0xDF USING `binary`);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings:
Note 1003 select char(0xdf) AS `CHAR(0xDF USING ``binary``)`
EXPLAIN EXTENDED SELECT CHAR(0xDF);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings:
Note 1003 select char(0xdf) AS `CHAR(0xDF)`
#
# Start of 10.1 tests # Start of 10.1 tests
# #
# #
......
...@@ -1869,6 +1869,18 @@ SELECT _utf8 0x7E, _utf8 X'7E', _utf8 B'01111110'; ...@@ -1869,6 +1869,18 @@ SELECT _utf8 0x7E, _utf8 X'7E', _utf8 B'01111110';
let $ctype_unescape_combinations=selected; let $ctype_unescape_combinations=selected;
--source include/ctype_unescape.inc --source include/ctype_unescape.inc
--echo #
--echo # MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1)
--echo #
SET NAMES utf8;
SELECT CHAR(0xDF USING latin1);
CREATE OR REPLACE VIEW v1 AS SELECT CHAR(0xDF USING latin1) AS c;
SHOW CREATE VIEW v1;
SELECT * FROM v1;
DROP VIEW v1;
--echo # --echo #
--echo # End of 10.0 tests --echo # End of 10.0 tests
--echo # --echo #
......
...@@ -1913,6 +1913,24 @@ INSERT INTO t1 SELECT 'a 😁 b', 'a 😁 b'; ...@@ -1913,6 +1913,24 @@ INSERT INTO t1 SELECT 'a 😁 b', 'a 😁 b';
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-8949: COLUMN_CREATE unicode name breakage
--echo #
SET NAMES utf8mb4;
SELECT COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
SELECT COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1));
SELECT COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E
as int);
CREATE TABLE t1 AS SELECT
COLUMN_LIST(COLUMN_CREATE('a',1)),
COLUMN_JSON(COLUMN_CREATE('b',1));
SHOW CREATE TABLE t1;
DROP TABLE t1;
SET NAMES default;
--echo # --echo #
--echo # End of 10.0 tests --echo # End of 10.0 tests
--echo # --echo #
......
...@@ -1756,6 +1756,18 @@ set global max_allowed_packet=default; ...@@ -1756,6 +1756,18 @@ set global max_allowed_packet=default;
--echo # End of 5.6 tests --echo # End of 5.6 tests
--echo # --echo #
--echo #
--echo # Start of 10.0 tests
--echo #
--echo #
--echo # MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1)
--echo #
EXPLAIN EXTENDED SELECT CHAR(0xDF USING latin1);
EXPLAIN EXTENDED SELECT CHAR(0xDF USING `binary`);
EXPLAIN EXTENDED SELECT CHAR(0xDF);
--echo # --echo #
--echo # Start of 10.1 tests --echo # Start of 10.1 tests
--echo # --echo #
...@@ -1800,7 +1812,6 @@ SELECT f1,HEX(f2) FROM t1 WHERE f1='YQ==' AND (f2= from_base64( ...@@ -1800,7 +1812,6 @@ SELECT f1,HEX(f2) FROM t1 WHERE f1='YQ==' AND (f2= from_base64(
SELECT f1,HEX(f2) FROM t1 WHERE f1='YQ==' AND (f2= from_base64("Yq==") OR f2= from_base64("YQ==")); SELECT f1,HEX(f2) FROM t1 WHERE f1='YQ==' AND (f2= from_base64("Yq==") OR f2= from_base64("YQ=="));
DROP TABLE t1; DROP TABLE t1;
--echo # --echo #
--echo # End of 10.1 tests --echo # End of 10.1 tests
--echo # --echo #
...@@ -4183,8 +4183,7 @@ mariadb_dyncol_json_internal(DYNAMIC_COLUMN *str, DYNAMIC_STRING *json, ...@@ -4183,8 +4183,7 @@ mariadb_dyncol_json_internal(DYNAMIC_COLUMN *str, DYNAMIC_STRING *json,
} }
else else
{ {
if ((rc= mariadb_dyncol_val_str(json, &val, if ((rc= mariadb_dyncol_val_str(json, &val, DYNCOL_UTF, '"')) < 0)
&my_charset_utf8_general_ci, '"')) < 0)
goto err; goto err;
} }
} }
......
...@@ -6890,7 +6890,7 @@ longlong Item_func_dyncol_exists::val_int() ...@@ -6890,7 +6890,7 @@ longlong Item_func_dyncol_exists::val_int()
null_value= 1; null_value= 1;
return 1; return 1;
} }
if (my_charset_same(nm->charset(), &my_charset_utf8_general_ci)) if (my_charset_same(nm->charset(), DYNCOL_UTF))
{ {
buf.str= (char *) nm->ptr(); buf.str= (char *) nm->ptr();
buf.length= nm->length(); buf.length= nm->length();
...@@ -6900,11 +6900,11 @@ longlong Item_func_dyncol_exists::val_int() ...@@ -6900,11 +6900,11 @@ longlong Item_func_dyncol_exists::val_int()
uint strlen; uint strlen;
uint dummy_errors; uint dummy_errors;
buf.str= (char *)sql_alloc((strlen= nm->length() * buf.str= (char *)sql_alloc((strlen= nm->length() *
my_charset_utf8_general_ci.mbmaxlen + 1)); DYNCOL_UTF->mbmaxlen + 1));
if (buf.str) if (buf.str)
{ {
buf.length= buf.length=
copy_and_convert(buf.str, strlen, &my_charset_utf8_general_ci, copy_and_convert(buf.str, strlen, DYNCOL_UTF,
nm->ptr(), nm->length(), nm->charset(), nm->ptr(), nm->length(), nm->charset(),
&dummy_errors); &dummy_errors);
} }
......
...@@ -2849,6 +2849,20 @@ String *Item_func_make_set::val_str(String *str) ...@@ -2849,6 +2849,20 @@ String *Item_func_make_set::val_str(String *str)
} }
void Item_func_char::print(String *str, enum_query_type query_type)
{
str->append(Item_func_char::func_name());
str->append('(');
print_args(str, 0, query_type);
if (collation.collation != &my_charset_bin)
{
str->append(C_STRING_WITH_LEN(" using "));
str->append(collation.collation->csname);
}
str->append(')');
}
String *Item_func_char::val_str(String *str) String *Item_func_char::val_str(String *str)
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
...@@ -4414,7 +4428,7 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg) ...@@ -4414,7 +4428,7 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg)
if (res) if (res)
{ {
// guaranty UTF-8 string for names // guaranty UTF-8 string for names
if (my_charset_same(res->charset(), &my_charset_utf8_general_ci)) if (my_charset_same(res->charset(), DYNCOL_UTF))
{ {
keys_str[i].length= res->length(); keys_str[i].length= res->length();
keys_str[i].str= sql_strmake(res->ptr(), res->length()); keys_str[i].str= sql_strmake(res->ptr(), res->length());
...@@ -4425,11 +4439,11 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg) ...@@ -4425,11 +4439,11 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg)
uint dummy_errors; uint dummy_errors;
char *str= char *str=
(char *)sql_alloc((strlen= res->length() * (char *)sql_alloc((strlen= res->length() *
my_charset_utf8_general_ci.mbmaxlen + 1)); DYNCOL_UTF->mbmaxlen + 1));
if (str) if (str)
{ {
keys_str[i].length= keys_str[i].length=
copy_and_convert(str, strlen, &my_charset_utf8_general_ci, copy_and_convert(str, strlen, DYNCOL_UTF,
res->ptr(), res->length(), res->charset(), res->ptr(), res->length(), res->charset(),
&dummy_errors); &dummy_errors);
keys_str[i].str= str; keys_str[i].str= str;
...@@ -4648,9 +4662,10 @@ String *Item_func_dyncol_json::val_str(String *str) ...@@ -4648,9 +4662,10 @@ String *Item_func_dyncol_json::val_str(String *str)
char *ptr; char *ptr;
size_t length, alloc_length; size_t length, alloc_length;
dynstr_reassociate(&json, &ptr, &length, &alloc_length); dynstr_reassociate(&json, &ptr, &length, &alloc_length);
str->reset(ptr, length, alloc_length, &my_charset_utf8_general_ci); str->reset(ptr, length, alloc_length, DYNCOL_UTF);
null_value= FALSE; null_value= FALSE;
} }
str->set_charset(DYNCOL_UTF);
return str; return str;
null: null:
...@@ -4748,7 +4763,7 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp) ...@@ -4748,7 +4763,7 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp)
return 1; return 1;
} }
if (my_charset_same(nm->charset(), &my_charset_utf8_general_ci)) if (my_charset_same(nm->charset(), DYNCOL_UTF))
{ {
buf.str= (char *) nm->ptr(); buf.str= (char *) nm->ptr();
buf.length= nm->length(); buf.length= nm->length();
...@@ -4758,11 +4773,11 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp) ...@@ -4758,11 +4773,11 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp)
uint strlen; uint strlen;
uint dummy_errors; uint dummy_errors;
buf.str= (char *)sql_alloc((strlen= nm->length() * buf.str= (char *)sql_alloc((strlen= nm->length() *
my_charset_utf8_general_ci.mbmaxlen + 1)); DYNCOL_UTF->mbmaxlen + 1));
if (buf.str) if (buf.str)
{ {
buf.length= buf.length=
copy_and_convert(buf.str, strlen, &my_charset_utf8_general_ci, copy_and_convert(buf.str, strlen, DYNCOL_UTF,
nm->ptr(), nm->length(), nm->charset(), nm->ptr(), nm->length(), nm->charset(),
&dummy_errors); &dummy_errors);
} }
...@@ -5201,7 +5216,6 @@ String *Item_func_dyncol_list::val_str(String *str) ...@@ -5201,7 +5216,6 @@ String *Item_func_dyncol_list::val_str(String *str)
goto null; goto null;
str->length(0); str->length(0);
str->set_charset(&my_charset_utf8_general_ci);
for (i= 0; i < count; i++) for (i= 0; i < count; i++)
{ {
append_identifier(current_thd, str, names[i].str, names[i].length); append_identifier(current_thd, str, names[i].str, names[i].length);
...@@ -5211,6 +5225,7 @@ String *Item_func_dyncol_list::val_str(String *str) ...@@ -5211,6 +5225,7 @@ String *Item_func_dyncol_list::val_str(String *str)
null_value= FALSE; null_value= FALSE;
if (names) if (names)
my_free(names); my_free(names);
str->set_charset(DYNCOL_UTF);
return str; return str;
null: null:
......
...@@ -784,6 +784,7 @@ class Item_func_char :public Item_str_func ...@@ -784,6 +784,7 @@ class Item_func_char :public Item_str_func
max_length= arg_count * 4; max_length= arg_count * 4;
} }
const char *func_name() const { return "char"; } const char *func_name() const { return "char"; }
void print(String *str, enum_query_type query_type);
}; };
...@@ -1283,14 +1284,14 @@ class Item_func_dyncol_add: public Item_func_dyncol_create ...@@ -1283,14 +1284,14 @@ class Item_func_dyncol_add: public Item_func_dyncol_create
class Item_func_dyncol_json: public Item_str_func class Item_func_dyncol_json: public Item_str_func
{ {
public: public:
Item_func_dyncol_json(THD *thd, Item *str): Item_str_func(thd, str) {} Item_func_dyncol_json(THD *thd, Item *str): Item_str_func(thd, str)
{collation.set(DYNCOL_UTF);}
const char *func_name() const{ return "column_json"; } const char *func_name() const{ return "column_json"; }
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec() void fix_length_and_dec()
{ {
max_length= MAX_BLOB_WIDTH; max_length= MAX_BLOB_WIDTH;
maybe_null= 1; maybe_null= 1;
collation.set(&my_charset_bin);
decimals= 0; decimals= 0;
} }
}; };
...@@ -1323,7 +1324,8 @@ class Item_dyncol_get: public Item_str_func ...@@ -1323,7 +1324,8 @@ class Item_dyncol_get: public Item_str_func
class Item_func_dyncol_list: public Item_str_func class Item_func_dyncol_list: public Item_str_func
{ {
public: public:
Item_func_dyncol_list(THD *thd, Item *str): Item_str_func(thd, str) {}; Item_func_dyncol_list(THD *thd, Item *str): Item_str_func(thd, str)
{collation.set(DYNCOL_UTF);}
void fix_length_and_dec() { maybe_null= 1; max_length= MAX_BLOB_WIDTH; }; void fix_length_and_dec() { maybe_null= 1; max_length= MAX_BLOB_WIDTH; };
const char *func_name() const{ return "column_list"; } const char *func_name() const{ return "column_list"; }
String *val_str(String *); String *val_str(String *);
......
...@@ -383,9 +383,6 @@ struct que_thr_t{ ...@@ -383,9 +383,6 @@ struct que_thr_t{
UT_LIST_NODE_T(que_thr_t) UT_LIST_NODE_T(que_thr_t)
thrs; /*!< list of thread nodes of the fork thrs; /*!< list of thread nodes of the fork
node */ node */
UT_LIST_NODE_T(que_thr_t)
trx_thrs; /*!< lists of threads in wait list of
the trx */
UT_LIST_NODE_T(que_thr_t) UT_LIST_NODE_T(que_thr_t)
queue; /*!< list of runnable thread nodes in queue; /*!< list of runnable thread nodes in
the server task queue */ the server task queue */
......
...@@ -6342,7 +6342,6 @@ my_bool translog_write_record(LSN *lsn, ...@@ -6342,7 +6342,6 @@ my_bool translog_write_record(LSN *lsn,
short_trid, &parts, trn, hook_arg); short_trid, &parts, trn, hook_arg);
break; break;
case LOGRECTYPE_NOT_ALLOWED: case LOGRECTYPE_NOT_ALLOWED:
DBUG_ASSERT(0);
default: default:
DBUG_ASSERT(0); DBUG_ASSERT(0);
rc= 1; rc= 1;
......
...@@ -384,9 +384,6 @@ struct que_thr_t{ ...@@ -384,9 +384,6 @@ struct que_thr_t{
UT_LIST_NODE_T(que_thr_t) UT_LIST_NODE_T(que_thr_t)
thrs; /*!< list of thread nodes of the fork thrs; /*!< list of thread nodes of the fork
node */ node */
UT_LIST_NODE_T(que_thr_t)
trx_thrs; /*!< lists of threads in wait list of
the trx */
UT_LIST_NODE_T(que_thr_t) UT_LIST_NODE_T(que_thr_t)
queue; /*!< list of runnable thread nodes in queue; /*!< list of runnable thread nodes in
the server task queue */ the server task queue */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment