Mysql源码学习——打造专属语法(11)
#define MYSQL_COMPILATION_COMMENT "Source distribution"
#define MYSQL_COMPILATION_NOCODE_TEST_SYSVAR "No code in heart" /*add by nocode*/
?
1
注释add by nocode的地方,即是新添加的系统变量和宏定义,我们的系统变量叫@@nocode_test_sysvar,其值为No code in heartOK,重新编译代码,执行SELECT语句,OK了。
?
mysql> select @@nocode_test_sysvar;
+----------------------+
| @@nocode_test_sysvar |
+----------------------+
| No code in heart |
+----------------------+
1 row in set (0.01 sec)
上面添加了一个系统变量,并没有修改语法文件sql_yacc.yy,为了加深理解,我们添加一个属于自己的语法:nocode语法,为了简单化实现,我们的目标很简单,在客户端输入no_code后显示字符串"MAKE BY NOCODE"。
定义关键字
首先在sql_yacc.yy文件中添加相应的SYMBOL
?
%token NO_SYM /* SQL-2003-R */
%token NO_CODE_SYM /* add by nocode*/
%token NO_WAIT_SYM
然后在lex.h中的symblos数组中添加nocode的字符串和符号的对应关系:
?
{ "NO", SYM(NO_SYM)},
{ "NO_CODE", SYM(NO_CODE_SYM)}, /*add by nocode*/
{ "NO_WAIT", SYM(NO_WAIT_SYM)},
ok,至此我们关键字已经添加进去了
添加语法节点
我们给语法分支节点起名叫nocode,定义如下:
?
/**add by nocode*/
nocode:
NO_CODE_SYM
{
THD *thd= YYTHD;
LEX *lex= Lex;
SELECT_LEX *sel= lex->current_select;
Item_string* field;
LEX_STRING tmp;
CHARSET_INFO *cs_con= thd->variables.collation_connection;
CHARSET_INFO *cs_cli= thd->variables.character_set_client;
if (sel->linkage != UNION_TYPE)
mysql_init_select(lex);
相关新闻>>
- 发表评论
-
- 最新评论 更多>>