diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/event_data_objects.cc | 4 | ||||
-rw-r--r-- | sql/event_db_repository.cc | 14 | ||||
-rw-r--r-- | sql/mysqld.cc | 21 | ||||
-rw-r--r-- | sql/share/charsets/Index.xml | 6 | ||||
-rw-r--r-- | sql/share/errmsg-utf8.txt | 2 | ||||
-rw-r--r-- | sql/sp.cc | 27 | ||||
-rw-r--r-- | sql/sp.h | 2 | ||||
-rw-r--r-- | sql/sql_class.h | 35 | ||||
-rw-r--r-- | sql/sql_db.cc | 13 | ||||
-rw-r--r-- | sql/sql_lex.cc | 5 | ||||
-rw-r--r-- | sql/sql_show.cc | 4 | ||||
-rw-r--r-- | sql/sql_statistics.cc | 18 | ||||
-rw-r--r-- | sql/sql_trigger.cc | 14 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 16 | ||||
-rw-r--r-- | sql/sys_vars.cc | 16 | ||||
-rw-r--r-- | sql/table.cc | 16 |
16 files changed, 153 insertions, 60 deletions
diff --git a/sql/event_data_objects.cc b/sql/event_data_objects.cc index 91d1d871307..8d3058ed5bc 100644 --- a/sql/event_data_objects.cc +++ b/sql/event_data_objects.cc @@ -129,7 +129,7 @@ Event_creation_ctx::load_from_db(THD *thd, invalid_creation_ctx= TRUE; } - if (load_collation(event_mem_root, + if (load_collation(thd, event_mem_root, event_tbl->field[ET_FIELD_COLLATION_CONNECTION], thd->variables.collation_connection, &connection_cl)) @@ -142,7 +142,7 @@ Event_creation_ctx::load_from_db(THD *thd, invalid_creation_ctx= TRUE; } - if (load_collation(event_mem_root, + if (load_collation(thd, event_mem_root, event_tbl->field[ET_FIELD_DB_COLLATION], NULL, &db_cl)) diff --git a/sql/event_db_repository.cc b/sql/event_db_repository.cc index a11f7adb9dd..599b148c7df 100644 --- a/sql/event_db_repository.cc +++ b/sql/event_db_repository.cc @@ -43,12 +43,12 @@ const TABLE_FIELD_TYPE event_table_fields[ET_FIELD_COUNT] = { { STRING_WITH_LEN("db") }, { STRING_WITH_LEN("char(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("name") }, { STRING_WITH_LEN("char(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("body") }, @@ -58,7 +58,7 @@ const TABLE_FIELD_TYPE event_table_fields[ET_FIELD_COUNT] = { { STRING_WITH_LEN("definer") }, { STRING_WITH_LEN("char(") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("execute_at") }, @@ -131,7 +131,7 @@ const TABLE_FIELD_TYPE event_table_fields[ET_FIELD_COUNT] = { { STRING_WITH_LEN("comment") }, { STRING_WITH_LEN("char(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("originator") }, @@ -146,17 +146,17 @@ const TABLE_FIELD_TYPE event_table_fields[ET_FIELD_COUNT] = { { STRING_WITH_LEN("character_set_client") }, { STRING_WITH_LEN("char(32)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("collation_connection") }, { STRING_WITH_LEN("char(32)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("db_collation") }, { STRING_WITH_LEN("char(32)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("body_utf8") }, diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0bf21e02002..cc7568990b4 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -301,7 +301,6 @@ const char *my_localhost= "localhost", *delayed_user= "DELAYED"; bool opt_large_files= sizeof(my_off_t) > 4; static my_bool opt_autocommit; ///< for --autocommit command-line option - /* Used with --help for detailed option */ @@ -4032,6 +4031,7 @@ static int init_common_variables() test purposes, to be able to start "mysqld" even if the requested character set is not available (see bug#18743). */ + for (;;) { char *next_character_set_name= strchr(default_character_set_name, ','); @@ -4039,7 +4039,10 @@ static int init_common_variables() *next_character_set_name++= '\0'; if (!(default_charset_info= get_charset_by_csname(default_character_set_name, - MY_CS_PRIMARY, MYF(MY_WME)))) + MY_CS_PRIMARY, + global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3 | MY_WME) : MYF(MY_WME)))) { if (next_character_set_name) { @@ -4056,7 +4059,10 @@ static int init_common_variables() if (default_collation_name) { CHARSET_INFO *default_collation; - default_collation= get_charset_by_name(default_collation_name, MYF(0)); + default_collation= get_charset_by_name(default_collation_name, + global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0)); if (!default_collation) { #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE @@ -4097,7 +4103,10 @@ static int init_common_variables() if (!(character_set_filesystem= get_charset_by_csname(character_set_filesystem_name, - MY_CS_PRIMARY, MYF(MY_WME)))) + MY_CS_PRIMARY, + global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3 | MY_WME) : MYF(MY_WME)))) return 1; global_system_variables.character_set_filesystem= character_set_filesystem; @@ -7415,7 +7424,9 @@ static void usage(void) DBUG_ENTER("usage"); if (!(default_charset_info= get_charset_by_csname(default_character_set_name, MY_CS_PRIMARY, - MYF(MY_WME)))) + global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3 | MY_WME) : MYF(MY_WME)))) exit(1); if (!default_collation_name) default_collation_name= (char*) default_charset_info->name; diff --git a/sql/share/charsets/Index.xml b/sql/share/charsets/Index.xml index 058f48ace15..cec3bfcf7be 100644 --- a/sql/share/charsets/Index.xml +++ b/sql/share/charsets/Index.xml @@ -528,15 +528,15 @@ To make maintaining easier please: <collation name="armscii8_nopad_bin" id="1088" flag="binary" flag="nopad"/> </charset> -<charset name="utf8"> +<charset name="utf8mb3"> <family>Unicode</family> <description>UTF-8 Unicode</description> <alias>utf-8</alias> - <collation name="utf8_general_ci" id="33"> + <collation name="utf8mb3_general_ci" id="33"> <flag>primary</flag> <flag>compiled</flag> </collation> - <collation name="utf8_bin" id="83"> + <collation name="utf8mb3_bin" id="83"> <flag>binary</flag> <flag>compiled</flag> </collation> diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index add46a4cc75..1e81c1ce8b9 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -1,4 +1,4 @@ -languages czech=cze latin2, danish=dan latin1, dutch=nla latin1, english=eng latin1, estonian=est latin7, french=fre latin1, german=ger latin1, greek=greek greek, hungarian=hun latin2, italian=ita latin1, japanese=jpn ujis, korean=kor euckr, norwegian-ny=norwegian-ny latin1, norwegian=nor latin1, polish=pol latin2, portuguese=por latin1, romanian=rum latin2, russian=rus koi8r, serbian=serbian cp1250, slovak=slo latin2, spanish=spa latin1, swedish=swe latin1, ukrainian=ukr koi8u, bulgarian=bgn cp1251, hindi=hindi utf8; +languages czech=cze latin2, danish=dan latin1, dutch=nla latin1, english=eng latin1, estonian=est latin7, french=fre latin1, german=ger latin1, greek=greek greek, hungarian=hun latin2, italian=ita latin1, japanese=jpn ujis, korean=kor euckr, norwegian-ny=norwegian-ny latin1, norwegian=nor latin1, polish=pol latin2, portuguese=por latin1, romanian=rum latin2, russian=rus koi8r, serbian=serbian cp1250, slovak=slo latin2, spanish=spa latin1, swedish=swe latin1, ukrainian=ukr koi8u, bulgarian=bgn cp1251, hindi=hindi utf8mb3; default-language eng diff --git a/sql/sp.cc b/sql/sp.cc index 46494fb2393..541fe9488b7 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -122,12 +122,12 @@ TABLE_FIELD_TYPE proc_table_fields[MYSQL_PROC_FIELD_COUNT] = { { STRING_WITH_LEN("db") }, { STRING_WITH_LEN("char(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("name") }, { STRING_WITH_LEN("char(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("type") }, @@ -137,7 +137,7 @@ TABLE_FIELD_TYPE proc_table_fields[MYSQL_PROC_FIELD_COUNT] = { { STRING_WITH_LEN("specific_name") }, { STRING_WITH_LEN("char(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("language") }, @@ -178,7 +178,7 @@ TABLE_FIELD_TYPE proc_table_fields[MYSQL_PROC_FIELD_COUNT] = { { STRING_WITH_LEN("definer") }, { STRING_WITH_LEN("char(") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("created") }, @@ -208,22 +208,22 @@ TABLE_FIELD_TYPE proc_table_fields[MYSQL_PROC_FIELD_COUNT] = { { STRING_WITH_LEN("comment") }, { STRING_WITH_LEN("text") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("character_set_client") }, { STRING_WITH_LEN("char(32)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("collation_connection") }, { STRING_WITH_LEN("char(32)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("db_collation") }, { STRING_WITH_LEN("char(32)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("body_utf8") }, @@ -312,7 +312,7 @@ bool load_charset(MEM_ROOT *mem_root, /*************************************************************************/ -bool load_collation(MEM_ROOT *mem_root, +bool load_collation(THD *thd, MEM_ROOT *mem_root, Field *field, CHARSET_INFO *dflt_cl, CHARSET_INFO **cl) @@ -326,7 +326,10 @@ bool load_collation(MEM_ROOT *mem_root, } DBUG_ASSERT(cl_name.str[cl_name.length] == 0); - *cl= get_charset_by_name(cl_name.str, MYF(0)); + *cl= get_charset_by_name(cl_name.str, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0)); if (*cl == NULL) { @@ -368,7 +371,7 @@ Stored_routine_creation_ctx::load_from_db(THD *thd, invalid_creation_ctx= TRUE; } - if (load_collation(thd->mem_root, + if (load_collation(thd,thd->mem_root, proc_tbl->field[MYSQL_PROC_FIELD_COLLATION_CONNECTION], thd->variables.collation_connection, &connection_cl)) @@ -381,7 +384,7 @@ Stored_routine_creation_ctx::load_from_db(THD *thd, invalid_creation_ctx= TRUE; } - if (load_collation(thd->mem_root, + if (load_collation(thd,thd->mem_root, proc_tbl->field[MYSQL_PROC_FIELD_DB_COLLATION], NULL, &db_cl)) @@ -662,7 +662,7 @@ bool load_charset(MEM_ROOT *mem_root, CHARSET_INFO *dflt_cs, CHARSET_INFO **cs); -bool load_collation(MEM_ROOT *mem_root, +bool load_collation(THD *thd,MEM_ROOT *mem_root, Field *field, CHARSET_INFO *dflt_cl, CHARSET_INFO **cl); diff --git a/sql/sql_class.h b/sql/sql_class.h index 50b746fe514..15aa9ca8199 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -189,6 +189,7 @@ enum enum_binlog_row_image { #define OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE (1 << 0) #define OLD_MODE_NO_PROGRESS_INFO (1 << 1) #define OLD_MODE_ZERO_DATE_TIME_CAST (1 << 2) +#define OLD_MODE_UTF8_IS_UTF8MB3 (1 << 3) extern char internal_table_name[2]; extern char empty_c_string[1]; @@ -1007,6 +1008,36 @@ inline void update_global_memory_status(int64 size) my_atomic_add64_explicit(ptr, size, MY_MEMORY_ORDER_RELAXED); } +inline const char* get_alias_collation_or_charset_name(const char* name, + bool utf8_is_utf8mb3) +{ + char *copy_of_name= (char*)name; + char start[6], result[64]; + char *temp_cs_name; + + if (!strchr(name,'_')) + { + if (!strcasecmp("utf8",name)) + name = utf8_is_utf8mb3 ? "utf8mb3" : "utf8mb4"; + return name; + } + else + { + strncpy(start, name, 5); + temp_cs_name= (char *)(utf8_is_utf8mb3 ? "utf8mb3_":"utf8mb4_"); + if (!strncasecmp("utf8_", start,5)) + { + copy_of_name+= 5; + result[63]='\0'; + strcpy(result, temp_cs_name); + strcat(result, copy_of_name); + result[strlen(copy_of_name)+strlen(temp_cs_name)]='\0'; + strcpy((char*)name,result); + } + } + return name; +} + /** Get collation by name, send error to client on failure. @param name Collation name @@ -1016,12 +1047,13 @@ inline void update_global_memory_status(int64 size) @retval Pointter to CHARSET_INFO with the given name on success */ inline CHARSET_INFO * -mysqld_collation_get_by_name(const char *name, +mysqld_collation_get_by_name(const char *name, bool utf8_is_utf8mb3, CHARSET_INFO *name_cs= system_charset_info) { CHARSET_INFO *cs; MY_CHARSET_LOADER loader; my_charset_loader_init_mysys(&loader); + name =get_alias_collation_or_charset_name(name,utf8_is_utf8mb3); if (!(cs= my_collation_get_by_name(&loader, name, MYF(0)))) { ErrConvString err(name, name_cs); @@ -5247,7 +5279,6 @@ public: Item *sp_fix_func_item(Item **it_addr); Item *sp_prepare_func_item(Item **it_addr, uint cols= 1); bool sp_eval_expr(Field *result_field, Item **expr_item_ptr); - }; diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 9bf16220535..f471d8edc66 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -583,9 +583,14 @@ bool load_db_opt(THD *thd, const char *path, Schema_specification_st *create) default-collation commands. */ if (!(create->default_table_charset= - get_charset_by_csname(pos+1, MY_CS_PRIMARY, MYF(0))) && + get_charset_by_csname(pos+1, MY_CS_PRIMARY, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0))) && !(create->default_table_charset= - get_charset_by_name(pos+1, MYF(0)))) + get_charset_by_name(pos+1, thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0)))) { sql_print_error("Error while loading database options: '%s':",path); sql_print_error(ER_THD(thd, ER_UNKNOWN_CHARACTER_SET),pos+1); @@ -595,7 +600,9 @@ bool load_db_opt(THD *thd, const char *path, Schema_specification_st *create) else if (!strncmp(buf,"default-collation", (pos-buf))) { if (!(create->default_table_charset= get_charset_by_name(pos+1, - MYF(0)))) + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0)))) { sql_print_error("Error while loading database options: '%s':",path); sql_print_error(ER_THD(thd, ER_UNKNOWN_COLLATION),pos+1); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 6871699dc5b..ad322eda097 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -2789,7 +2789,10 @@ int Lex_input_stream::scan_ident_middle(THD *thd, Lex_ident_cli_st *str, body_utf8_append(m_cpp_text_start, m_cpp_tok_start + length); ErrConvString csname(str->str + 1, str->length - 1, &my_charset_bin); CHARSET_INFO *cs= get_charset_by_csname(csname.ptr(), - MY_CS_PRIMARY, MYF(0)); + MY_CS_PRIMARY, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0)); if (cs) { *introducer= cs; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 4c5e877cce8..be90f22a2c4 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -9708,7 +9708,9 @@ static bool show_create_trigger_impl(THD *thd, Trigger *trigger) /* Resolve trigger client character set. */ - if (resolve_charset(trigger->client_cs_name.str, NULL, &trg_client_cs)) + if (resolve_charset(trigger->client_cs_name.str, NULL, &trg_client_cs, + thd->variables.old_behavior & OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3):MYF(0))) return TRUE; /* Send header. */ diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 7b600bd45c4..f3be50f7134 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -111,12 +111,12 @@ TABLE_FIELD_TYPE table_stat_fields[TABLE_STAT_N_FIELDS] = { { STRING_WITH_LEN("db_name") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("table_name") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("cardinality") }, @@ -134,17 +134,17 @@ TABLE_FIELD_TYPE column_stat_fields[COLUMN_STAT_N_FIELDS] = { { STRING_WITH_LEN("db_name") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("table_name") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("column_name") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("min_value") }, @@ -179,7 +179,7 @@ TABLE_FIELD_TYPE column_stat_fields[COLUMN_STAT_N_FIELDS] = { { STRING_WITH_LEN("hist_type") }, { STRING_WITH_LEN("enum('SINGLE_PREC_HB','DOUBLE_PREC_HB')") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("histogram") }, @@ -197,17 +197,17 @@ TABLE_FIELD_TYPE index_stat_fields[INDEX_STAT_N_FIELDS] = { { STRING_WITH_LEN("db_name") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("table_name") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("index") }, { STRING_WITH_LEN("varchar(64)") }, - { STRING_WITH_LEN("utf8") } + { STRING_WITH_LEN("utf8mb3") } }, { { STRING_WITH_LEN("prefix_arity") }, diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index f93fe196728..079f6d29e87 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -97,7 +97,10 @@ Trigger_creation_ctx::create(THD *thd, if (resolve_charset(client_cs_name->str, thd->variables.character_set_client, - &client_cs)) + &client_cs, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3):MYF(0))) { sql_print_warning("Trigger for table '%s'.'%s': " "invalid character_set_client value (%s).", @@ -110,7 +113,10 @@ Trigger_creation_ctx::create(THD *thd, if (resolve_collation(connection_cl_name->str, thd->variables.collation_connection, - &connection_cl)) + &connection_cl, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3):MYF(0))) { sql_print_warning("Trigger for table '%s'.'%s': " "invalid collation_connection value (%s).", @@ -121,7 +127,9 @@ Trigger_creation_ctx::create(THD *thd, invalid_creation_ctx= TRUE; } - if (resolve_collation(db_cl_name->str, NULL, &db_cl)) + if (resolve_collation(db_cl_name->str, NULL, &db_cl,thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0))) { sql_print_warning("Trigger for table '%s'.'%s': " "invalid database_collation value (%s).", diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 5aeb14535e3..e6857f223d9 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -6684,7 +6684,11 @@ charset: charset_name: ident_or_text { - if (unlikely(!($$=get_charset_by_csname($1.str,MY_CS_PRIMARY,MYF(0))))) + if (unlikely(!($$=get_charset_by_csname($1.str, MY_CS_PRIMARY, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : + MYF(0))))) my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str)); } | BINARY { $$= &my_charset_bin; } @@ -6704,7 +6708,11 @@ old_or_new_charset_name: ident_or_text { if (unlikely(!($$=get_charset_by_csname($1.str, - MY_CS_PRIMARY,MYF(0))) && + MY_CS_PRIMARY, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : + MYF(0))) && !($$=get_old_charset_by_name($1.str)))) my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str)); } @@ -6719,7 +6727,9 @@ old_or_new_charset_name_or_default: collation_name: ident_or_text { - if (unlikely(!($$= mysqld_collation_get_by_name($1.str)))) + if (unlikely(!($$= mysqld_collation_get_by_name($1.str, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3)))) MYSQL_YYABORT; } ; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index a75066271d9..2917dc517d0 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -760,8 +760,11 @@ static bool check_charset(sys_var *self, THD *thd, set_var *var) { ErrConvString err(res); /* Get utf8 '\0' terminated string */ if (!(var->save_result.ptr= get_charset_by_csname(err.ptr(), - MY_CS_PRIMARY, - MYF(0))) && + MY_CS_PRIMARY, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : + MYF(0))) && !(var->save_result.ptr= get_old_charset_by_name(err.ptr()))) { my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), err.ptr()); @@ -885,7 +888,11 @@ static bool check_collation_not_null(sys_var *self, THD *thd, set_var *var) else { ErrConvString err(res); /* Get utf8 '\0'-terminated string */ - if (!(var->save_result.ptr= get_charset_by_name(err.ptr(), MYF(0)))) + if (!(var->save_result.ptr= get_charset_by_name(err.ptr(), + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : + MYF(0)))) { my_error(ER_UNKNOWN_COLLATION, MYF(0), err.ptr()); return true; @@ -3694,6 +3701,7 @@ static const char *old_mode_names[]= "NO_DUP_KEY_WARNINGS_WITH_IGNORE", "NO_PROGRESS_INFO", "ZERO_DATE_TIME_CAST", + "UTF8_IS_UTF8MB3", 0 }; @@ -3705,7 +3713,7 @@ static Sys_var_set Sys_old_behavior( "old_mode", "Used to emulate old behavior from earlier MariaDB or MySQL versions", SESSION_VAR(old_behavior), CMD_LINE(REQUIRED_ARG), - old_mode_names, DEFAULT(0)); + old_mode_names, DEFAULT(OLD_MODE_UTF8_IS_UTF8MB3)); #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) #define SSL_OPT(X) CMD_LINE(REQUIRED_ARG,X) diff --git a/sql/table.cc b/sql/table.cc index 4f65dbd65f4..d56482fb6d1 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -210,11 +210,17 @@ View_creation_ctx * View_creation_ctx::create(THD *thd, invalid_creation_ctx= resolve_charset(view->view_client_cs_name.str, system_charset_info, - &ctx->m_client_cs); + &ctx->m_client_cs, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3):MYF(0)); invalid_creation_ctx= resolve_collation(view->view_connection_cl_name.str, system_charset_info, - &ctx->m_connection_cl) || + &ctx->m_connection_cl, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3) : MYF(0)) || invalid_creation_ctx; if (invalid_creation_ctx) @@ -2523,7 +2529,11 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, { // 3.23 or 4.0 string if (!(attr.charset= get_charset_by_csname(share->table_charset->csname, - MY_CS_BINSORT, MYF(0)))) + MY_CS_BINSORT, + thd->variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MYF(MY_UTF8_IS_UTF8MB3): + MYF(0)))) attr.charset= &my_charset_bin; } } |