summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/event_data_objects.cc4
-rw-r--r--sql/event_db_repository.cc14
-rw-r--r--sql/item.cc5
-rw-r--r--sql/mysqld.cc13
-rw-r--r--sql/set_var.cc5
-rw-r--r--sql/share/charsets/Index.xml6
-rw-r--r--sql/share/errmsg-utf8.txt2
-rw-r--r--sql/sp.cc30
-rw-r--r--sql/sp.h2
-rw-r--r--sql/sql_class.h14
-rw-r--r--sql/sql_db.cc8
-rw-r--r--sql/sql_lex.cc4
-rw-r--r--sql/sql_parse.cc5
-rw-r--r--sql/sql_show.cc5
-rw-r--r--sql/sql_statistics.cc18
-rw-r--r--sql/sql_trigger.cc7
-rw-r--r--sql/sql_yacc.yy12
-rw-r--r--sql/sys_vars.cc12
-rw-r--r--sql/table.cc10
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))
diff --git a/sql/sp.h b/sql/sp.h
index e92525e1930..44c8d9ca751 100644
--- a/sql/sp.h
+++ b/sql/sp.h
@@ -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;
}
}