Commit 3a453df6 authored by bar@bar.mysql.r18.ru's avatar bar@bar.mysql.r18.ru

Two separate commands: SHOW COLLATION and SHOW CHARACTER SET

parent 1c5dd1f5
...@@ -528,6 +528,7 @@ int mysqld_show_variables(THD *thd,const char *wild); ...@@ -528,6 +528,7 @@ int mysqld_show_variables(THD *thd,const char *wild);
int mysqld_show(THD *thd, const char *wild, show_var_st *variables, int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
enum enum_var_type value_type); enum enum_var_type value_type);
int mysqld_show_charsets(THD *thd,const char *wild); int mysqld_show_charsets(THD *thd,const char *wild);
int mysqld_show_collations(THD *thd,const char *wild);
int mysqld_show_table_types(THD *thd); int mysqld_show_table_types(THD *thd);
int mysqld_show_privileges(THD *thd); int mysqld_show_privileges(THD *thd);
int mysqld_show_column_types(THD *thd); int mysqld_show_column_types(THD *thd);
......
...@@ -52,7 +52,7 @@ enum enum_sql_command { ...@@ -52,7 +52,7 @@ enum enum_sql_command {
SQLCOM_SHOW_INNODB_STATUS, SQLCOM_SHOW_INNODB_STATUS,
SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT, SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS, SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, SQLCOM_SHOW_CHARSETS,
SQLCOM_SHOW_CREATE_DB, SQLCOM_SHOW_COLLATIONS, SQLCOM_SHOW_CREATE_DB,
SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES, SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
SQLCOM_GRANT, SQLCOM_GRANT,
......
...@@ -2566,6 +2566,9 @@ mysql_execute_command(THD *thd) ...@@ -2566,6 +2566,9 @@ mysql_execute_command(THD *thd)
case SQLCOM_SHOW_CHARSETS: case SQLCOM_SHOW_CHARSETS:
res= mysqld_show_charsets(thd,(lex->wild ? lex->wild->ptr() : NullS)); res= mysqld_show_charsets(thd,(lex->wild ? lex->wild->ptr() : NullS));
break; break;
case SQLCOM_SHOW_COLLATIONS:
res= mysqld_show_collations(thd,(lex->wild ? lex->wild->ptr() : NullS));
break;
case SQLCOM_SHOW_FIELDS: case SQLCOM_SHOW_FIELDS:
#ifdef DONT_ALLOW_SHOW_COMMANDS #ifdef DONT_ALLOW_SHOW_COMMANDS
send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */
......
...@@ -1414,7 +1414,22 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) ...@@ -1414,7 +1414,22 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
Status functions Status functions
*****************************************************************************/ *****************************************************************************/
int mysqld_show_charsets(THD *thd, const char *wild) static bool write_collation(Protocol *protocol, CHARSET_INFO *cs)
{
char flags[4];
protocol->prepare_for_resend();
protocol->store(cs->csname, system_charset_info);
protocol->store(cs->name, system_charset_info);
protocol->store_short((longlong) cs->number);
flags[0]='\0';
if (cs->state & MY_CS_PRIMARY)
strcat(flags,"def");
protocol->store(flags, system_charset_info);
protocol->store_short((longlong) cs->strxfrm_multiply);
return protocol->write();
}
int mysqld_show_collations(THD *thd, const char *wild)
{ {
char buff[8192]; char buff[8192];
String packet2(buff,sizeof(buff),thd->charset()); String packet2(buff,sizeof(buff),thd->charset());
...@@ -1425,32 +1440,69 @@ int mysqld_show_charsets(THD *thd, const char *wild) ...@@ -1425,32 +1440,69 @@ int mysqld_show_charsets(THD *thd, const char *wild)
DBUG_ENTER("mysqld_show_charsets"); DBUG_ENTER("mysqld_show_charsets");
field_list.push_back(new Item_empty_string("CS_Name",30)); field_list.push_back(new Item_empty_string("Charset",30));
field_list.push_back(new Item_empty_string("COL_Name",30)); field_list.push_back(new Item_empty_string("Collation",30));
field_list.push_back(new Item_return_int("Id",11, FIELD_TYPE_SHORT)); field_list.push_back(new Item_return_int("Id",11, FIELD_TYPE_SHORT));
field_list.push_back(new Item_empty_string("Flags",30)); field_list.push_back(new Item_empty_string("Flags",30));
field_list.push_back(new Item_return_int("strx_maxlen",3, FIELD_TYPE_TINY)); field_list.push_back(new Item_return_int("strx_maxlen",3, FIELD_TYPE_SHORT));
field_list.push_back(new Item_return_int("mb_maxlen",3, FIELD_TYPE_TINY));
if (protocol->send_fields(&field_list, 1)) if (protocol->send_fields(&field_list, 1))
DBUG_RETURN(1); DBUG_RETURN(1);
for (cs=all_charsets ; cs < all_charsets+255 ; cs++ ) for ( cs= all_charsets ; cs < all_charsets+255 ; cs++ )
{ {
if (cs[0] && !(wild && wild[0] && CHARSET_INFO **cl;
for ( cl= all_charsets; cl < all_charsets+255 ;cl ++)
{
if (!cs[0] || !cl[0] || !my_charset_same(cs[0],cl[0]) || !(cs[0]->state & MY_CS_PRIMARY))
continue;
if (cs[0] && !(wild && wild[0] &&
wild_case_compare(system_charset_info,cs[0]->name,wild))) wild_case_compare(system_charset_info,cs[0]->name,wild)))
{
if (write_collation(protocol, cl[0]))
goto err;
}
}
}
send_eof(thd);
DBUG_RETURN(0);
err:
DBUG_RETURN(1);
}
static bool write_charset(Protocol *protocol, CHARSET_INFO *cs)
{
protocol->prepare_for_resend();
protocol->store(cs->csname, system_charset_info);
protocol->store(cs->name, system_charset_info);
protocol->store_short((longlong) cs->mbmaxlen);
return protocol->write();
}
int mysqld_show_charsets(THD *thd, const char *wild)
{
char buff[8192];
String packet2(buff,sizeof(buff),thd->charset());
List<Item> field_list;
CHARSET_INFO **cs;
Protocol *protocol= thd->protocol;
char flags[64];
DBUG_ENTER("mysqld_show_charsets");
field_list.push_back(new Item_empty_string("Charset",30));
field_list.push_back(new Item_empty_string("Default collation",60));
field_list.push_back(new Item_return_int("Maxlen",3, FIELD_TYPE_SHORT));
if (protocol->send_fields(&field_list, 1))
DBUG_RETURN(1);
for ( cs= all_charsets ; cs < all_charsets+255 ; cs++ )
{
if (cs[0] && (cs[0]->state & MY_CS_PRIMARY) && !(wild && wild[0] &&
wild_case_compare(system_charset_info,cs[0]->name,wild)))
{ {
protocol->prepare_for_resend(); if (write_charset(protocol, cs[0]))
protocol->store(cs[0]->csname, system_charset_info);
protocol->store(cs[0]->name, system_charset_info);
protocol->store_short((longlong) cs[0]->number);
flags[0]='\0';
if (cs[0]->state & MY_CS_PRIMARY)
strcat(flags,"pri");
protocol->store(flags, system_charset_info);
protocol->store_tiny((longlong) cs[0]->strxfrm_multiply);
protocol->store_tiny((longlong) cs[0]->mbmaxlen);
if (protocol->write())
goto err; goto err;
} }
} }
......
...@@ -3578,6 +3578,8 @@ show_param: ...@@ -3578,6 +3578,8 @@ show_param:
} }
| charset wild | charset wild
{ Lex->sql_command= SQLCOM_SHOW_CHARSETS; } { Lex->sql_command= SQLCOM_SHOW_CHARSETS; }
| COLLATION_SYM wild
{ Lex->sql_command= SQLCOM_SHOW_COLLATIONS; }
| LOGS_SYM | LOGS_SYM
{ Lex->sql_command= SQLCOM_SHOW_LOGS; } { Lex->sql_command= SQLCOM_SHOW_LOGS; }
| GRANTS FOR_SYM user | GRANTS FOR_SYM user
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment