diff options
Diffstat (limited to 'sql/sql_show.cc')
-rw-r--r-- | sql/sql_show.cc | 96 |
1 files changed, 65 insertions, 31 deletions
diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 2320c148b3a..af4d4409115 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1263,11 +1263,11 @@ mysqld_show_create_get_fields(THD *thd, TABLE_LIST *table_list, mem_root); field_list->push_back(new (mem_root) Item_empty_string(thd, "character_set_client", - MY_CS_NAME_SIZE), + MY_CS_CHARACTER_SET_NAME_SIZE), mem_root); field_list->push_back(new (mem_root) Item_empty_string(thd, "collation_connection", - MY_CS_NAME_SIZE), + MY_CS_COLLATION_NAME_SIZE), mem_root); } else @@ -6355,16 +6355,39 @@ int fill_schema_collation(THD *thd, TABLE_LIST *tables, COND *cond) if (!(wild && wild[0] && wild_case_compare(scs, tmp_cl->coll_name.str, wild))) { - const char *tmp_buff; + LEX_CSTRING context_collation_name= + tmp_cl->get_collation_name(MY_COLLATION_NAME_MODE_CONTEXT); + LEX_CSTRING full_collation_name= + tmp_cl->get_collation_name(MY_COLLATION_NAME_MODE_FULL); + bool is_context= cmp(context_collation_name, full_collation_name); + /* + Some collations are applicable to multiple character sets. + Display them only once, with the short name (without the + character set prefix). + */ + if (is_context && + cmp(tmp_cl->cs_name, Lex_cstring(STRING_WITH_LEN("utf8mb4")))) + continue; restore_record(table, s->default_values); - table->field[0]->store(tmp_cl->coll_name.str, tmp_cl->coll_name.length, - scs); - table->field[1]->store(&tmp_cl->cs_name, scs); - table->field[2]->store((longlong) tmp_cl->number, TRUE); - tmp_buff= (tmp_cl->state & MY_CS_PRIMARY) ? "Yes" : ""; - table->field[3]->store(tmp_buff, strlen(tmp_buff), scs); - tmp_buff= (tmp_cl->state & MY_CS_COMPILED)? "Yes" : ""; - table->field[4]->store(tmp_buff, strlen(tmp_buff), scs); + table->field[0]->store(context_collation_name, scs); + if (is_context) + { + table->field[1]->set_null(); // CHARACTER_SET_NAME + table->field[2]->set_null(); // ID + table->field[3]->set_null(); // IS_DEFAULT + } + else + { + table->field[1]->set_notnull(); // CHARACTER_SET_NAME + table->field[1]->store(tmp_cl->cs_name, scs); + table->field[2]->set_notnull(); // ID + table->field[2]->store((longlong) tmp_cl->number, TRUE); + table->field[3]->set_notnull(); // IS_DEFAULT + table->field[3]->store( + Show::Yes_or_empty::value(tmp_cl->default_flag()), scs); + } + table->field[4]->store( + Show::Yes_or_empty::value(tmp_cl->compiled_flag()), scs); table->field[5]->store((longlong) tmp_cl->strxfrm_multiply, TRUE); if (schema_table_store_record(thd, table)) return 1; @@ -6399,8 +6422,16 @@ int fill_schema_coll_charset_app(THD *thd, TABLE_LIST *tables, COND *cond) !my_charset_same(tmp_cs,tmp_cl)) continue; restore_record(table, s->default_values); - table->field[0]->store(&tmp_cl->coll_name, scs); + LEX_CSTRING context_collation_name= + tmp_cl->get_collation_name(MY_COLLATION_NAME_MODE_CONTEXT); + LEX_CSTRING full_collation_name= + tmp_cl->get_collation_name(MY_COLLATION_NAME_MODE_FULL); + table->field[0]->store(context_collation_name, scs); table->field[1]->store(&tmp_cl->cs_name, scs); + table->field[2]->store(full_collation_name, scs); + table->field[3]->store(tmp_cl->number); + table->field[4]->store( + Show::Yes_or_empty::value(tmp_cl->default_flag()), scs); if (schema_table_store_record(thd, table)) return 1; } @@ -9075,7 +9106,7 @@ ST_FIELD_INFO schema_fields_info[]= Column("CATALOG_NAME", Catalog(), NOT_NULL), Column("SCHEMA_NAME", Name(), NOT_NULL, "Database"), Column("DEFAULT_CHARACTER_SET_NAME", CSName(), NOT_NULL), - Column("DEFAULT_COLLATION_NAME", CSName(), NOT_NULL), + Column("DEFAULT_COLLATION_NAME", CLName(), NOT_NULL), Column("SQL_PATH", Varchar(FN_REFLEN), NULLABLE), Column("SCHEMA_COMMENT", Varchar(DATABASE_COMMENT_MAXLEN), NOT_NULL), CEnd() @@ -9104,7 +9135,7 @@ ST_FIELD_INFO tables_fields_info[]= Column("CREATE_TIME", Datetime(0), NULLABLE, "Create_time",OPEN_FULL_TABLE), Column("UPDATE_TIME", Datetime(0), NULLABLE, "Update_time",OPEN_FULL_TABLE), Column("CHECK_TIME", Datetime(0), NULLABLE, "Check_time", OPEN_FULL_TABLE), - Column("TABLE_COLLATION", CSName(), NULLABLE, "Collation", OPEN_FRM_ONLY), + Column("TABLE_COLLATION", CLName(), NULLABLE, "Collation", OPEN_FRM_ONLY), Column("CHECKSUM", ULonglong(), NULLABLE, "Checksum", OPEN_FULL_TABLE), Column("CREATE_OPTIONS", Varchar(2048),NULLABLE, "Create_options", OPEN_FULL_TABLE), @@ -9134,7 +9165,7 @@ ST_FIELD_INFO columns_fields_info[]= Column("NUMERIC_SCALE", ULonglong(), NULLABLE, OPEN_FRM_ONLY), Column("DATETIME_PRECISION", ULonglong(), NULLABLE, OPEN_FRM_ONLY), Column("CHARACTER_SET_NAME", CSName(), NULLABLE, OPEN_FRM_ONLY), - Column("COLLATION_NAME", CSName(), NULLABLE, "Collation", OPEN_FRM_ONLY), + Column("COLLATION_NAME", CLName(), NULLABLE, "Collation", OPEN_FRM_ONLY), Column("COLUMN_TYPE", Longtext(65535), NOT_NULL, "Type", OPEN_FRM_ONLY), Column("COLUMN_KEY", Varchar(3), NOT_NULL, "Key", OPEN_FRM_ONLY), Column("EXTRA", Varchar(80), NOT_NULL, "Extra", OPEN_FRM_ONLY), @@ -9151,7 +9182,7 @@ ST_FIELD_INFO columns_fields_info[]= ST_FIELD_INFO charsets_fields_info[]= { Column("CHARACTER_SET_NAME", CSName(), NOT_NULL, "Charset"), - Column("DEFAULT_COLLATE_NAME", CSName(), NOT_NULL, "Default collation"), + Column("DEFAULT_COLLATE_NAME", CLName(), NOT_NULL, "Default collation"), Column("DESCRIPTION", Varchar(60), NOT_NULL, "Description"), Column("MAXLEN", SLonglong(3), NOT_NULL, "Maxlen"), CEnd() @@ -9160,10 +9191,10 @@ ST_FIELD_INFO charsets_fields_info[]= ST_FIELD_INFO collation_fields_info[]= { - Column("COLLATION_NAME", CSName(), NOT_NULL, "Collation"), - Column("CHARACTER_SET_NAME", CSName(), NOT_NULL, "Charset"), - Column("ID", SLonglong(MY_INT32_NUM_DECIMAL_DIGITS), NOT_NULL, "Id"), - Column("IS_DEFAULT", Yes_or_empty(), NOT_NULL, "Default"), + Column("COLLATION_NAME", CLName(), NOT_NULL, "Collation"), + Column("CHARACTER_SET_NAME", CSName(), NULLABLE, "Charset"), + Column("ID", SLonglong(MY_INT32_NUM_DECIMAL_DIGITS), NULLABLE, "Id"), + Column("IS_DEFAULT", Yes_or_empty(), NULLABLE, "Default"), Column("IS_COMPILED", Yes_or_empty(), NOT_NULL, "Compiled"), Column("SORTLEN", SLonglong(3), NOT_NULL, "Sortlen"), CEnd() @@ -9236,8 +9267,8 @@ ST_FIELD_INFO events_fields_info[]= Column("EVENT_COMMENT", Name(), NOT_NULL), Column("ORIGINATOR", SLonglong(10),NOT_NULL,"Originator"), Column("CHARACTER_SET_CLIENT", CSName(), NOT_NULL, "character_set_client"), - Column("COLLATION_CONNECTION", CSName(), NOT_NULL, "collation_connection"), - Column("DATABASE_COLLATION", CSName(), NOT_NULL, "Database Collation"), + Column("COLLATION_CONNECTION", CLName(), NOT_NULL, "collation_connection"), + Column("DATABASE_COLLATION", CLName(), NOT_NULL, "Database Collation"), CEnd() }; @@ -9245,8 +9276,11 @@ ST_FIELD_INFO events_fields_info[]= ST_FIELD_INFO coll_charset_app_fields_info[]= { - Column("COLLATION_NAME", CSName(), NOT_NULL), + Column("COLLATION_NAME", CLName(), NOT_NULL), Column("CHARACTER_SET_NAME", CSName(), NOT_NULL), + Column("FULL_COLLATION_NAME",CLName(), NOT_NULL), + Column("ID", SLonglong(MY_INT32_NUM_DECIMAL_DIGITS), NOT_NULL), + Column("IS_DEFAULT", Yes_or_empty(), NOT_NULL), CEnd() }; @@ -9282,8 +9316,8 @@ ST_FIELD_INFO proc_fields_info[]= Column("ROUTINE_COMMENT", Longtext(65535), NOT_NULL, "Comment"), Column("DEFINER", Definer(), NOT_NULL, "Definer"), Column("CHARACTER_SET_CLIENT", CSName(), NOT_NULL, "character_set_client"), - Column("COLLATION_CONNECTION", CSName(), NOT_NULL, "collation_connection"), - Column("DATABASE_COLLATION", CSName(), NOT_NULL, "Database Collation"), + Column("COLLATION_CONNECTION", CLName(), NOT_NULL, "collation_connection"), + Column("DATABASE_COLLATION", CLName(), NOT_NULL, "Database Collation"), CEnd() }; @@ -9323,7 +9357,7 @@ ST_FIELD_INFO view_fields_info[]= Column("DEFINER", Definer(), NOT_NULL, OPEN_FRM_ONLY), Column("SECURITY_TYPE", Varchar(7), NOT_NULL, OPEN_FRM_ONLY), Column("CHARACTER_SET_CLIENT", CSName(), NOT_NULL, OPEN_FRM_ONLY), - Column("COLLATION_CONNECTION", CSName(), NOT_NULL, OPEN_FRM_ONLY), + Column("COLLATION_CONNECTION", CLName(), NOT_NULL, OPEN_FRM_ONLY), Column("ALGORITHM", Varchar(10),NOT_NULL, OPEN_FRM_ONLY), CEnd() }; @@ -9450,9 +9484,9 @@ ST_FIELD_INFO triggers_fields_info[]= Column("DEFINER", Definer(), NOT_NULL, "Definer", OPEN_FRM_ONLY), Column("CHARACTER_SET_CLIENT", CSName(), NOT_NULL, "character_set_client", OPEN_FRM_ONLY), - Column("COLLATION_CONNECTION", CSName(), NOT_NULL, "collation_connection", + Column("COLLATION_CONNECTION", CLName(), NOT_NULL, "collation_connection", OPEN_FRM_ONLY), - Column("DATABASE_COLLATION", CSName(), NOT_NULL, "Database Collation", + Column("DATABASE_COLLATION", CLName(), NOT_NULL, "Database Collation", OPEN_FRM_ONLY), CEnd() }; @@ -10018,17 +10052,17 @@ static bool show_create_trigger_impl(THD *thd, Trigger *trigger) fields.push_back(new (mem_root) Item_empty_string(thd, "character_set_client", - MY_CS_NAME_SIZE), + MY_CS_CHARACTER_SET_NAME_SIZE), mem_root); fields.push_back(new (mem_root) Item_empty_string(thd, "collation_connection", - MY_CS_NAME_SIZE), + MY_CS_COLLATION_NAME_SIZE), mem_root); fields.push_back(new (mem_root) Item_empty_string(thd, "Database Collation", - MY_CS_NAME_SIZE), + MY_CS_COLLATION_NAME_SIZE), mem_root); static const Datetime zero_datetime(Datetime::zero()); |