2013-08-29 18 views
0

總之,在mysql命令行界面,鍵入desc TABLE_Juliaselect 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'DESCRIBE命令的內部定義以及如何擴展?

東西相當於我想知道它發生有關變換這是我從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,這對App開發人員來說非常方便。

其實,我已經改變了lex.hmysqld.ccsql_cmd.hsql_parse.ccsql_yacc.yy,其結果是info TABLE_Julia輸出僅僅是完全相同desc TABLE_Julia現在,但這是遠遠不夠的。

我搜索LEXdo_selectJOIN::execmysql_execute_selectmysql_selecthandle_selectexecute_sqlcom_selectmysql_execute_commandmysql_parsedispatch_commanddo_commanddo_handle_one_connectionhandle_one_connectionpfs_spawn_threadstart_threadclone

但不幸的是,倒黴,還是沒有線索。任何人,請給我一些建議,謝謝。

+0

請不要把標籤信息在您的標題。這裏的標記系統非常擅長對事物進行分類,並且不需要幫助。 :-)請參閱[應的問題包括「標籤」,在他們的頭銜?(http://meta.stackexchange.com/q/19190/172661)。謝謝。 –

+0

@KenWhite。謝謝。 – hylepo

回答

0

@RandomSeed

對於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,就是這樣:

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'); 
+0

謝謝,雅,我們有選擇,幾個。問題不僅在於找到一個選項,原因是我們並不偶爾檢查表格信息,這是非常頻繁的操作,如果可以用一個字母來完成,我們不想輸入兩個字母。我認爲這也是desc可以執行什麼描述的原因。 – hylepo