commit 0a232dab548e6e29545a00ddc2876ef4f4568874 Author: yuxianjiang Date: Mon Aug 9 12:19:28 2021 +0800 [bugfix] show create table error on json field Problem ==== After setting sql_mode to 0, SQL statement 'create table tjson7(f1 int, f2 json not null default '');' can be executed successfully. But retrieving create table SQL by show create table, the SQL will fail whatever sql_mode is stetted. And mysqldump will fail when import data. By checking the statement, we found that definition of " `f2` json NOT NULL DEFAULT 'null'" will cause stop creating table successfully. Solution ==== When json field is not null and has default value of 'null' by retrieving json default value. Convert the result 'null' to ''. diff --git a/mysql-test/r/bugfix_show_create_table_json.result b/mysql-test/r/bugfix_show_create_table_json.result new file mode 100644 index 0000000..f799723 --- /dev/null +++ b/mysql-test/r/bugfix_show_create_table_json.result @@ -0,0 +1,15 @@ +#Test for show +SET sql_mode = 0; +Warnings: +Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. +create database tdb1; +use tdb1; +create table tjson1(f1 int, f2 json not null default ''); +Warnings: +Warning 1101 BLOB, TEXT, GEOMETRY or JSON column 'f2' can't have a default value + +#clean up and reset enviroment + +drop table tjson1; +drop database tdb1; +SET sql_mode = default; diff --git a/mysql-test/t/bugfix_show_create_table_json.test b/mysql-test/t/bugfix_show_create_table_json.test new file mode 100644 index 0000000..c045dac --- /dev/null +++ b/mysql-test/t/bugfix_show_create_table_json.test @@ -0,0 +1,20 @@ +# +# Test of show create table on json field. When json field is created +# with not null default '', show create table should also return the +# same format. +# + +--echo #Test for show +SET sql_mode = 0; + +create database tdb1; +use tdb1; +create table tjson1(f1 int, f2 json not null default ''); + + +--echo +--echo #clean up and reset enviroment +--echo +drop table tjson1; +drop database tdb1; +SET sql_mode = default; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 2ee3deb..c1cc7db 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1432,20 +1432,30 @@ static bool print_default_clause(THD *thd, Field *field, String *def_value, } else field->val_str(&type); - if (type.length()) + if (field_type == MYSQL_TYPE_JSON && type.length() + && strcmp("null", type.ptr()) == 0) { - String def_val; - uint dummy_errors; - /* convert to system_charset_info == utf8 */ - def_val.copy(type.ptr(), type.length(), field->charset(), - system_charset_info, &dummy_errors); - if (quoted) - append_unescaped(def_value, def_val.ptr(), def_val.length()); - else - def_value->append(def_val.ptr(), def_val.length()); + /* for column defination of json not null default '' under sql_mode = 0 */ + DBUG_ASSERT(has_default && !field->is_null() && field_type == MYSQL_TYPE_JSON); + append_unescaped(def_value, "", 0); + } + else + { + if (type.length()) + { + String def_val; + uint dummy_errors; + /* convert to system_charset_info == utf8 */ + def_val.copy(type.ptr(), type.length(), field->charset(), + system_charset_info, &dummy_errors); + if (quoted) + append_unescaped(def_value, def_val.ptr(), def_val.length()); + else + def_value->append(def_val.ptr(), def_val.length()); + } + else if (quoted) + def_value->append(STRING_WITH_LEN("''")); } - else if (quoted) - def_value->append(STRING_WITH_LEN("''")); } else if (field->maybe_null() && quoted) def_value->append(STRING_WITH_LEN("NULL")); // Null as default