浅谈mysql语法解析调试方法

本文向您介绍一种利用mysql解析器和bison的调试选项进行sql语法解析跟踪的方法。

数据库开发过程中我们常会遇到修改sql语法的需求。我们知道,mysql的sql解析器是基于yacc文法,采用EBNF格式进行规则描述(sql/sql_yacc.yy),并借助bison工具生成(sql_yacc.h, sql_yacc.cc), 所以修改sql语法,不可避免地要和这些yacc文法打交道,对sql_yacc.yy进行改造升级。

yacc文法是对语法解析的高度概括,它为我们修改解析器提供了一种优雅的方式,但与此同时当我们遇到语句解析问题,通常比较难直接从抽象的语法规则中找到原因。幸运的是,结合mysql和bison提供的调试工具,我们有机会将整个语法解析的过程形象化,通过解析日志,yacc规则和自动状态机的对应,能够比较快地完成问题的定位。

  • mysql解析器调试开关

sql/sql_yacc.yy文件下,可以看到如下一段代码:

#ifndef NDEBUGvoid turn_parser_debug_on(){  /*     MYSQLdebug is in sql/sql_yacc.cc, in bison generated code.     Turning this option on is **VERY** verbose, and should be     used when investigating a syntax error problem only.     The syntax to run with bison traces is as follows :     - Starting a server manually :       mysqld --debug="d,parser_debug" ...     - Running a test :       mysql-test-run.pl --mysqld="--debug=d,parser_debug" ...     The result will be in the process stderr (var/log/master.err)   */  extern int yydebug;  yydebug= 1;}#endif