0

简而言之,在 mysql 命令行界面中,typedesc TABLE_Julia相当于select COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, EXTRA from information_schema.COLUMNS where TABLE_SCHEMA = database() and TABLE_NAME like 'TABLE_Julia'

desc我想知道我的意思是从服务器程序中的等效语句的转换发生在哪里select,因为我想实现命令,例如添加的info TABLE_Julia行为,这对应用程序开发人员来说非常方便。select COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, EXTRA, COLUMN_COMMENT from information_schema.COLUMNS where TABLE_SCHEMA = database() and TABLE_NAME like 'TABLE_Julia'COLUMN_COMMENT

其实我已经改过lex.h, mysqld.cc, sql_cmd.h, sql_parse.cc,sql_yacc.yy了,结果就是和现在的输出info TABLE_Julia完全一样desc TABLE_Julia,但这还不够。

我搜索了LEX, do_select, JOIN::exec, mysql_execute_select, mysql_select, handle_select, execute_sqlcom_select, mysql_execute_command, mysql_parse, dispatch_command, do_command, do_handle_one_connection, handle_one_connection, pfs_spawn_thread,start_threadclone

但是,不幸的是,不走运,仍然没有任何线索。任何人请给我一些建议,谢谢。

4

2 回答 2

1

这当然需要深入挖掘解析器代码,所以我建议与 MySQL 开发人员联系。

另一方面, 的输出SHOW CREATE TABLE the_table可能对您的同事来说已经足够了。

另一方面,您也可以创建一个存储过程来更轻松地完成这项工作。类似的东西:

CREATE PROCEDURE info(tablename VARCHAR(200)
BEGIN SELECT column_name, ...,  column_comment FROM information_schema.columns WHERE table_name = tablename;
END;

-- then
CALL info('table_name');
于 2013-08-29T16:58:09.563 回答
0

@随机种子

对于 mysql 5.6.12,答案是内部方法:

int make_columns_old_format(THD*, st_schema_table*)

更改自:

int make_columns_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table)
{
      int fields_arr[]= {IS_COLUMNS_COLUMN_NAME,
                         IS_COLUMNS_COLUMN_TYPE,
                         IS_COLUMNS_COLLATION_NAME,
                         IS_COLUMNS_IS_NULLABLE,
                         IS_COLUMNS_COLUMN_KEY,
                         IS_COLUMNS_COLUMN_DEFAULT,
                         IS_COLUMNS_EXTRA,
                         IS_COLUMNS_PRIVILEGES,
                         IS_COLUMNS_COLUMN_COMMENT,
                         -1};
      int *field_num= fields_arr;
      ST_FIELD_INFO *field_info;
      Name_resolution_context *context= &thd->lex->select_lex.context;
      for (; *field_num >= 0; field_num++)
      {
        field_info= &schema_table->fields_info[*field_num];
        if (!thd->lex->verbose && (*field_num == IS_COLUMNS_COLLATION_NAME ||
                                   *field_num == IS_COLUMNS_PRIVILEGES     ||
                                   *field_num == IS_COLUMNS_COLUMN_COMMENT))
          continue;
        Item_field *field= new Item_field(context,
                                          NullS, NullS, field_info->field_name);

至:

int make_columns_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table)
{
      int fields_arr[]= {IS_COLUMNS_COLUMN_NAME,
                         IS_COLUMNS_COLUMN_TYPE,
                         IS_COLUMNS_COLLATION_NAME,
                         IS_COLUMNS_IS_NULLABLE,
                         IS_COLUMNS_COLUMN_KEY,
                         IS_COLUMNS_COLUMN_DEFAULT,
                         IS_COLUMNS_EXTRA,
                         IS_COLUMNS_PRIVILEGES,
                         IS_COLUMNS_COLUMN_COMMENT,
                         -1};
      int *field_num= fields_arr;
      ST_FIELD_INFO *field_info;
      Name_resolution_context *context= &thd->lex->select_lex.context;
      for (; *field_num >= 0; field_num++)
      {
        field_info= &schema_table->fields_info[*field_num];
        if (!thd->lex->verbose && (*field_num == IS_COLUMNS_COLLATION_NAME ||
                                   *field_num == IS_COLUMNS_PRIVILEGES     /*||
                                   *field_num == IS_COLUMNS_COLUMN_COMMENT*/))
          continue;
        Item_field *field= new Item_field(context,
                                          NullS, NullS, field_info->field_name);

更改使程序包含 IS_COLUMNS_COLUMN_COMMENT,就是这样:

于 2013-09-01T18:35:20.793 回答