MySQL扩展WITH语法

我们在扩展MySQL语法时,可能需要额外的信息,以下面的方式由用户给出,比如:

CREATE TABLE t(a INT) WITH TWIN; //TWIN的语义可能是创建表t,再创建孪生表t_twin

那么我们就需要扩展WITH TWIN,然而如果按照下面的形式书写,会产生移进/规约冲突:

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

如何扩展WITH TWIN?参考WITH_ROLLUP_SYM!(只列举关键代码)
1. gen_lex_token.cc文件,函数compute_tokens硬编码了WITH_ROLLUP_SYM;
2. sql_lex.cc文件,函数MySQLlex函数特别解析WITH,WITH_ROLLUP_SYM;

如何扩展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); //拿下一个token
    switch(token) {
    case ROLLUP_SYM:
        ...
        return WITH_ROLLUP_SYM;

    /* With twin table */
    case TWIN_SYM: //如果下一个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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Adding full support for a language touches many different...
    Joe_Gao_89f1阅读 12,881评论 0 3
  • 导读 数据库作为核心的基础组件,是需要重点保护的对象。任何一个线上的不慎操作,都有可能给数据库带来严重的故障,从而...
    Java小铺阅读 3,671评论 0 2
  • 我与你的相遇 如同哪美丽的曼陀罗花 但却 花开叶落 叶盛花衰 一生无法相见 我与你的距离 如一张薄纱 却无法看见亦...
    悲风吹泪阅读 1,007评论 0 2
  • 北风恶,欢情薄。万里卷覆粉春梦,悚骨凄神无情寒。留学微辞谢绝余,颓然一霎诗万句。参商人字字苍瘦,风流梦已觉情休。生...
    东方惠阅读 1,820评论 0 1