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/item.cc | 5 | ||||
-rw-r--r-- | sql/mysqld.cc | 13 | ||||
-rw-r--r-- | sql/set_var.cc | 5 | ||||
-rw-r--r-- | sql/share/charsets/Index.xml | 6 | ||||
-rw-r--r-- | sql/share/errmsg-utf8.txt | 2 | ||||
-rw-r--r-- | sql/sp.cc | 30 | ||||
-rw-r--r-- | sql/sp.h | 2 | ||||
-rw-r--r-- | sql/sql_class.h | 14 | ||||
-rw-r--r-- | sql/sql_db.cc | 8 | ||||
-rw-r--r-- | sql/sql_lex.cc | 4 | ||||
-rw-r--r-- | sql/sql_parse.cc | 5 | ||||
-rw-r--r-- | sql/sql_show.cc | 5 | ||||
-rw-r--r-- | sql/sql_statistics.cc | 18 | ||||
-rw-r--r-- | sql/sql_trigger.cc | 7 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 12 | ||||
-rw-r--r-- | sql/sys_vars.cc | 12 | ||||
-rw-r--r-- | sql/table.cc | 10 |
19 files changed, 105 insertions, 71 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/item.cc b/sql/item.cc index 1d13fee58ed..e821cb5bac7 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -2359,6 +2359,9 @@ left_is_superset(const DTCollation *left, const DTCollation *right) bool DTCollation::aggregate(const DTCollation &dt, uint flags) { + + myf utf8_flag= global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? MY_UTF8_IS_UTF8MB3 : 0; if (!my_charset_same(collation, dt.collation)) { /* @@ -2447,7 +2450,7 @@ bool DTCollation::aggregate(const DTCollation &dt, uint flags) return 0; } CHARSET_INFO *bin= get_charset_by_csname(collation->csname, - MY_CS_BINSORT,MYF(0)); + MY_CS_BINSORT,MYF(utf8_flag)); set(bin, DERIVATION_NONE); } } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 4a61897856d..770890138a2 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -296,7 +296,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 */ @@ -4099,6 +4098,8 @@ 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). */ + myf utf8_flag= global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? MY_UTF8_IS_UTF8MB3 : 0; for (;;) { char *next_character_set_name= strchr(default_character_set_name, ','); @@ -4106,7 +4107,7 @@ 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, MYF(utf8_flag | MY_WME)))) { if (next_character_set_name) { @@ -4123,7 +4124,7 @@ 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, MYF(utf8_flag)); if (!default_collation) { #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE @@ -4164,7 +4165,7 @@ 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, MYF(utf8_flag | MY_WME)))) return 1; global_system_variables.character_set_filesystem= character_set_filesystem; @@ -7485,9 +7486,11 @@ static void print_help() static void usage(void) { DBUG_ENTER("usage"); + myf utf8_flag= global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? MY_UTF8_IS_UTF8MB3 : 0; if (!(default_charset_info= get_charset_by_csname(default_character_set_name, MY_CS_PRIMARY, - MYF(MY_WME)))) + MYF(utf8_flag | MY_WME)))) exit(1); if (!default_collation_name) default_collation_name= (char*) default_charset_info->name; diff --git a/sql/set_var.cc b/sql/set_var.cc index fe98d98fbd4..4f863819bde 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -533,11 +533,12 @@ static my_old_conv old_conv[]= CHARSET_INFO *get_old_charset_by_name(const char *name) { my_old_conv *conv; - + myf utf8_flag= global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? MY_UTF8_IS_UTF8MB3 : 0; for (conv= old_conv; conv->old_name; conv++) { if (!my_strcasecmp(&my_charset_latin1, name, conv->old_name)) - return get_charset_by_csname(conv->new_name, MY_CS_PRIMARY, MYF(0)); + return get_charset_by_csname(conv->new_name, MY_CS_PRIMARY, MYF(utf8_flag)); } return NULL; } 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 555836406fb..2d24063c928 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..57700839a33 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") }, @@ -291,7 +291,8 @@ bool load_charset(MEM_ROOT *mem_root, CHARSET_INFO **cs) { LEX_CSTRING cs_name; - + myf utf8_flag= global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? MY_UTF8_IS_UTF8MB3 : 0; if (field->val_str_nopad(mem_root, &cs_name)) { *cs= dflt_cs; @@ -299,7 +300,7 @@ bool load_charset(MEM_ROOT *mem_root, } DBUG_ASSERT(cs_name.str[cs_name.length] == 0); - *cs= get_charset_by_csname(cs_name.str, MY_CS_PRIMARY, MYF(0)); + *cs= get_charset_by_csname(cs_name.str, MY_CS_PRIMARY, MYF(utf8_flag)); if (*cs == NULL) { @@ -312,7 +313,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) @@ -324,9 +325,10 @@ bool load_collation(MEM_ROOT *mem_root, *cl= dflt_cl; return TRUE; } + myf utf8_flag= thd->get_utf8_flag(); 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, MYF(utf8_flag)); if (*cl == NULL) { @@ -368,7 +370,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 +383,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 f001f14c219..cc3eea89008 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]; @@ -1051,14 +1052,16 @@ static inline void update_global_memory_status(int64 size) @retval NULL on error @retval Pointter to CHARSET_INFO with the given name on success */ -static inline CHARSET_INFO * -mysqld_collation_get_by_name(const char *name, +inline CHARSET_INFO * +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; + myf utf8_flag= utf8_is_utf8mb3 ? MY_UTF8_IS_UTF8MB3 : 0; my_charset_loader_init_mysys(&loader); - if (!(cs= my_collation_get_by_name(&loader, name, MYF(0)))) + + if (!(cs= my_collation_get_by_name(&loader, name, MYF(utf8_flag)))) { ErrConvString err(name, name_cs); my_error(ER_UNKNOWN_COLLATION, MYF(0), err.ptr()); @@ -5438,6 +5441,11 @@ public: Item *sp_prepare_func_item(Item **it_addr, uint cols= 1); bool sp_eval_expr(Field *result_field, Item **expr_item_ptr); + myf get_utf8_flag() + { + return (variables.old_behavior & OLD_MODE_UTF8_IS_UTF8MB3 ? + MY_UTF8_IS_UTF8MB3 : 0); + } }; diff --git a/sql/sql_db.cc b/sql/sql_db.cc index d4fd66e233d..be90ee88a50 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -547,6 +547,7 @@ bool load_db_opt(THD *thd, const char *path, Schema_specification_st *create) DBUG_ENTER("load_db_opt"); bool error=1; size_t nbytes; + myf utf8_flag= thd->get_utf8_flag(); bzero((char*) create,sizeof(*create)); create->default_table_charset= thd->variables.collation_server; @@ -583,9 +584,9 @@ 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, MYF(utf8_flag))) && !(create->default_table_charset= - get_charset_by_name(pos+1, MYF(0)))) + get_charset_by_name(pos+1, MYF(utf8_flag)))) { sql_print_error("Error while loading database options: '%s':",path); sql_print_error(ER_THD(thd, ER_UNKNOWN_CHARACTER_SET),pos+1); @@ -594,8 +595,7 @@ 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)))) + if (!(create->default_table_charset= get_charset_by_name(pos+1, MYF(utf8_flag)))) { 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 1dbeff69cb5..6b9a43865d4 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -2789,8 +2789,10 @@ int Lex_input_stream::scan_ident_middle(THD *thd, Lex_ident_cli_st *str, m_cpp_text_end= m_cpp_text_start + length; body_utf8_append(m_cpp_text_start, m_cpp_tok_start + length); ErrConvString csname(str->str + 1, str->length - 1, &my_charset_bin); + myf utf8_flag= thd->get_utf8_flag(); CHARSET_INFO *cs= get_charset_by_csname(csname.ptr(), - MY_CS_PRIMARY, MYF(0)); + MY_CS_PRIMARY, + MYF(utf8_flag)); if (cs) { *introducer= cs; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ddfc49c6d52..40f038a5c15 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -10449,7 +10449,10 @@ merge_charset_and_collation(CHARSET_INFO *cs, CHARSET_INFO *cl) CHARSET_INFO *find_bin_collation(CHARSET_INFO *cs) { const char *csname= cs->csname; - cs= get_charset_by_csname(csname, MY_CS_BINSORT, MYF(0)); + myf utf8_flag= global_system_variables.old_behavior & + OLD_MODE_UTF8_IS_UTF8MB3 ? + MY_UTF8_IS_UTF8MB3 : 0; + cs= get_charset_by_csname(csname, MY_CS_BINSORT, MYF(utf8_flag)); if (!cs) { char tmp[65]; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index b1cc696e9fe..1d2a81212a3 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -9744,8 +9744,9 @@ static bool show_create_trigger_impl(THD *thd, Trigger *trigger) sql_mode_string_representation(thd, trigger->sql_mode, &trg_sql_mode_str); /* Resolve trigger client character set. */ - - if (resolve_charset(trigger->client_cs_name.str, NULL, &trg_client_cs)) + myf utf8_flag= thd->get_utf8_flag(); + if (resolve_charset(trigger->client_cs_name.str, NULL, &trg_client_cs, + MYF(utf8_flag))) return TRUE; /* Send header. */ diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 821448740e7..1f034f490c8 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 fd9095ea659..2125223e12b 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -94,10 +94,11 @@ Trigger_creation_ctx::create(THD *thd, CHARSET_INFO *db_cl; bool invalid_creation_ctx= FALSE; + myf utf8_flag= thd->get_utf8_flag(); if (resolve_charset(client_cs_name->str, thd->variables.character_set_client, - &client_cs)) + &client_cs, MYF(utf8_flag))) { sql_print_warning("Trigger for table '%s'.'%s': " "invalid character_set_client value (%s).", @@ -110,7 +111,7 @@ Trigger_creation_ctx::create(THD *thd, if (resolve_collation(connection_cl_name->str, thd->variables.collation_connection, - &connection_cl)) + &connection_cl,MYF(utf8_flag))) { sql_print_warning("Trigger for table '%s'.'%s': " "invalid collation_connection value (%s).", @@ -121,7 +122,7 @@ 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, MYF(utf8_flag))) { 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 be7df51ff42..04ef1c3b256 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -6681,7 +6681,9 @@ charset: charset_name: ident_or_text { - if (unlikely(!($$=get_charset_by_csname($1.str,MY_CS_PRIMARY,MYF(0))))) + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!($$=get_charset_by_csname($1.str, MY_CS_PRIMARY, + MYF(utf8_flag))))) my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str)); } | BINARY { $$= &my_charset_bin; } @@ -6700,8 +6702,10 @@ opt_load_data_charset: old_or_new_charset_name: ident_or_text { + myf utf8_flag= thd->get_utf8_flag(); if (unlikely(!($$=get_charset_by_csname($1.str, - MY_CS_PRIMARY,MYF(0))) && + MY_CS_PRIMARY, + MYF(utf8_flag))) && !($$=get_old_charset_by_name($1.str)))) my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), $1.str)); } @@ -6716,7 +6720,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 b72d4a3c358..7d7c6ad4379 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -759,9 +759,10 @@ static bool check_charset(sys_var *self, THD *thd, set_var *var) else { ErrConvString err(res); /* Get utf8 '\0' terminated string */ + myf utf8_flag= thd->get_utf8_flag(); if (!(var->save_result.ptr= get_charset_by_csname(err.ptr(), - MY_CS_PRIMARY, - MYF(0))) && + MY_CS_PRIMARY, + MYF(utf8_flag))) && !(var->save_result.ptr= get_old_charset_by_name(err.ptr()))) { my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), err.ptr()); @@ -875,7 +876,7 @@ static bool check_collation_not_null(sys_var *self, THD *thd, set_var *var) { if (!var->value) return false; - + myf utf8_flag= thd->get_utf8_flag(); char buff[STRING_BUFFER_USUAL_SIZE]; if (var->value->result_type() == STRING_RESULT) { @@ -885,7 +886,7 @@ 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(), MYF(utf8_flag)))) { my_error(ER_UNKNOWN_COLLATION, MYF(0), err.ptr()); return true; @@ -3694,6 +3695,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 +3707,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 26dadba9ebc..39fcd86e41c 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -208,14 +208,14 @@ View_creation_ctx * View_creation_ctx::create(THD *thd, /* Resolve cs names. Throw a warning if there is unknown cs name. */ bool invalid_creation_ctx; - + myf utf8_flag= thd->get_utf8_flag(); invalid_creation_ctx= resolve_charset(view->view_client_cs_name.str, system_charset_info, - &ctx->m_client_cs); + &ctx->m_client_cs, MYF(utf8_flag)); invalid_creation_ctx= resolve_collation(view->view_connection_cl_name.str, system_charset_info, - &ctx->m_connection_cl) || + &ctx->m_connection_cl, MYF(utf8_flag)) || invalid_creation_ctx; if (invalid_creation_ctx) @@ -2577,8 +2577,10 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, if (!f_is_blob(attr.pack_flag)) { // 3.23 or 4.0 string + myf utf8_flag= thd->get_utf8_flag(); if (!(attr.charset= get_charset_by_csname(share->table_charset->csname, - MY_CS_BINSORT, MYF(0)))) + MY_CS_BINSORT, + MYF(utf8_flag)))) attr.charset= &my_charset_bin; } } |