MySQL擴(kuò)展WITH語法

我們在擴(kuò)展MySQL語法時(shí),可能需要額外的信息,以下面的方式由用戶給出,比如:

CREATE TABLE t(a INT) WITH TWIN; //TWIN的語義可能是創(chuàng)建表t,再創(chuàng)建孿生表t_twin

那么我們就需要擴(kuò)展WITH TWIN,然而如果按照下面的形式書寫,會產(chǎn)生移進(jìn)/規(guī)約沖突:

opt_with_subtable:
     /* empty */ { $$= false; }
   | WITH TWIN_SYM{ $$= true; }
   ;

如何擴(kuò)展WITH TWIN?參考WITH_ROLLUP_SYM?。ㄖ涣信e關(guān)鍵代碼)
1. gen_lex_token.cc文件,函數(shù)compute_tokens硬編碼了WITH_ROLLUP_SYM;
2. sql_lex.cc文件,函數(shù)MySQLlex函數(shù)特別解析WITH,WITH_ROLLUP_SYM;

如何擴(kuò)展WITH TWIN?代碼示例!

  1. 定義WITH_TWIN_SYM,TWIN_SYM
1.1 sql/lex.h
    在symbols[]末追加{ SYM("TWIN", TWIN_SYM) }而WITH_TWIN_SYM會被硬編碼,不在此聲明
1.2 sql/sql_yacc.yy
    聲明%token TWIN_SYM
    聲明%token WITH_TWIN_SYM
    增加WITH_TWIN_SYM的解析邏輯,比如:  
        opt_with_twintable:
        /* empty */     { $$= false; }
        | WITH_TWIN_SYM { $$= true; }
        ;
  1. gen_lex_token.cc,compute_tokens硬編碼WITH_TWIN_SYM
/* With twin table */
set_token(WITH_TWIN_SYM, "WITH TWIN");
  1. sql_lex.cc,MySQLlex特別解析WITH_TWIN_SYM
switch(token) {
case WITH:
    token= lex_one_token(yylval, thd); //拿下一個(gè)token
    switch(token) {
    case ROLLUP_SYM:
        ...
        return WITH_ROLLUP_SYM;

    /* With twin table */
    case TWIN_SYM: //如果下一個(gè)token是TWIN_SYM,那么返回解析token為WITH_TWIN_SYM
        yylloc->cpp.end= lip->get_cpp_ptr();
        yylloc->raw.end= lip->get_ptr();
        lip->add_digest_token(WITH_TWIN_SYM, yylval);
        return WITH_TWIN_SYM;

    default:
        ...
        return WITH;
    }
    break;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容