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/mysqld.cc21
-rw-r--r--sql/share/charsets/Index.xml6
-rw-r--r--sql/share/errmsg-utf8.txt2
-rw-r--r--sql/sp.cc27
-rw-r--r--sql/sp.h2
-rw-r--r--sql/sql_class.h35
-rw-r--r--sql/sql_db.cc13
-rw-r--r--sql/sql_lex.cc5
-rw-r--r--sql/sql_show.cc4
-rw-r--r--sql/sql_statistics.cc18
-rw-r--r--sql/sql_trigger.cc14
-rw-r--r--sql/sql_yacc.yy16
-rw-r--r--sql/sys_vars.cc16
-rw-r--r--sql/table.cc16
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))
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 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;
}
}