我們在擴(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?代碼示例!
- 定義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; }
;
- gen_lex_token.cc,compute_tokens硬編碼WITH_TWIN_SYM
/* With twin table */
set_token(WITH_TWIN_SYM, "WITH TWIN");
- 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;
}