当前位置:首页 > 开发教程 > 数据库 >

MySQLParser一个MySQL的DDL解析器

时间:2016-02-17 09:18 来源:互联网 作者:源码搜藏 收藏

MySQLParser 这是解析SQL命令库。 当前支持的唯一命令是DDL语句,特别是CREATE TABLE,ALTER TABLE,DROP VIEW和DROP TABLE。 安装 在命令行: gem install mysql-parser.x.x.x.gem 用法 在红宝石: require mysql-parser MySQLParser.new.parse ALTER TABLE

MySQLParser

这是解析SQL命令库。当前支持的唯一命令是DDL语句,特别是CREATE TABLE,ALTER TABLE,DROP VIEW和DROP TABLE。

安装

在命令行:


> gem install mysql-parser.x.x.x.gem

用法

In ruby


> require 'mysql-parser'
> MySQLParser.new.parse "ALTER TABLE `table` DROP INDEX abc, DROP INDEX def"
=> {:tree=><root: [<S: [" "]>, <r_commands: [<r_ALTER_TABLE: ["ALTER", <S: [" "]>, <r_ONLINE_OFFLINE: []>, <r_opt_IGNORE: []>, "TABLE", <S: [" "]>, <r_tbl_name: [<r_tbl_name_int: [<ident: ["`", <opt_ident_in_backtick: [<opt_ident_in_backtick: []>, "table"]>, "`", <S: [" "]>]>]>]>, <r_opt_alter_commands: [<r_comma_separated_alter_specification: [<r_comma_separated_alter_specification: [<r_alter_specification: ["DROP", <S: [" "]>, <r_INDEX_or_KEY: ["INDEX", <S: [" "]>]>, <r_index_name: [<ident: [<raw_ident: ["abc", <S: [" "]>]>]>]>]>]>, <comma: [",", <S: [" "]>]>, <r_alter_specification: ["DROP", <S: [" "]>, <r_INDEX_or_KEY: ["INDEX", <S: [" "]>]>, <r_index_name: [<ident: [<raw_ident: ["def", <S: [" "]>]>]>]>]>]>]>, <r_opt_after_alter: []>, <r_opt_PARTITION_options: []>]>]>]>, :state=>{}}

mysql.rex.rb

这个文件是一个词法分析器。它确定DROP是一个命令,而“ABCDEF”是一个字符串。本文件主要是自动生成的由斌/生成字面其内容mysql.y.rb并自动生成所需的文字。因此,这个文件通常不需要进行编辑。理由如下可能的理由编辑:

  1. 创建同义词
  2. 创建一个长的文字[1]
  3. 创建不在解析器已经存在一个文字

[1]一个长文字是这是需要一个特殊的目的,例如文字,因为它由空格并且需要被分配给它的同义词。通常情况下,但是,我们不需要他们。

惯例

  1. S_... means some symbol
  2. A_... means some state
  3. L_... means long literal
  4. Everything else is literal

mysql.y.rb

这是该库的主要文件。它包含了所有的语法和相关联的动作。

语法

原来MySQL的语法可以发现 https://github.com/twitter/mysql/blob/master/sql/sql_yacc.yy文档下可以找到https://dev.mysql.com/doc/refman/5.6/en/

冲突

sql_yacc.yy是不完美的。它包含了很多冲突。当翻译成mysql.y.rb,请解决这些冲突,这样的规则可以预见的。

调试

调试mysql.y.rb可以通过设置来完成@yydebug真正的 初始化

字面

一个新的文字介绍可以通过只完成使用它。斌/生成-literal.rb 将读取mysql.y.rb并确保新的文字创建。同样,删除任何文字可以通过只做到不使用它。

惯例

以下是一般的惯例。

  1. 空间是小号
  2. 选择_...意味着该规则是可选的。第一个分支应该是空的。
  3. {逗号,空格} _separated _...指由一个分离器分离项的集合(逗号或空格)

斌/生成,literal.rb

该脚本扫描mysql.y.rb(或实际上,parser.output这是从产生mysql.y.rb),并补充说,不存在新的文本,并删除未使用的文字。

斌/亚军

这是一个REPL。只需输入任何发送档案结尾字符(CTRL-D ),以让脚本流程的输入。要退出,只是终止使用CTRL-C 


> DROP TABLE


table
^D
parse error on value "table" (TABLE)
>

斌/ sanity_check

该脚本可以确保没有跳过的动作,所有动作名称是正确的。

发展

改变后mysql.rex.rbmysql.y.rb,运行耙生成,生成真正的词法和语法分析器。运行耙规范运行所有测试案例

下载地址https://github.com/square/mysql-parser/archive/master.zip


数据库阅读排行

最新文章