CN113032366A - 基于Flex和Bison的SQL语法树解析方法 - Google Patents
基于Flex和Bison的SQL语法树解析方法 Download PDFInfo
- Publication number
- CN113032366A CN113032366A CN202110312632.1A CN202110312632A CN113032366A CN 113032366 A CN113032366 A CN 113032366A CN 202110312632 A CN202110312632 A CN 202110312632A CN 113032366 A CN113032366 A CN 113032366A
- Authority
- CN
- China
- Prior art keywords
- sql
- statements
- syntax tree
- node
- lexical
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
- G06F16/217—Database tuning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/205—Parsing
- G06F40/211—Syntactic parsing, e.g. based on context-free grammar [CFG] or unification grammars
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/253—Grammatical analysis; Style critique
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Audiology, Speech & Language Pathology (AREA)
- General Health & Medical Sciences (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种基于Flex和Bison的SQL语法树解析方法,首先获取数据库历史查询文件,收集指定数据库实例对应的SQL语句,然后对每条SQL语句进行词法分析,根据构词规则将SQL语句分割为相应的记号序列,其次将词法分析处理得到的记号序列进行语法分析,根据SQL语法规则将记号序列转化为语法树形式,最后将语法树结构转化为JSON格式进行持久化的保存,本发明可以更加准确的构建出候选索引集,而且通过语法树结构还可以了解SQL语句的执行计划,对于任意的SQL语句,即使是复杂的多表查询或者嵌套查询等语句,也可以通过BNF文法转化成SQL语法树,并且由JSON格式进行保存。
Description
技术领域
本发明涉及数据库索引调优以及语法树解析技术领域,具体涉及一种基于Flex和Bison的SQL语法树解析方法。
背景技术
数据库索引调优技术是通过分析数据库中一段时间内的查询工作负载(queryworkload),构建出一组合理的候选索引集,使得查询优化效果以及索引维护代价达到平衡的技术。在数据库索引调优技术中,离不开结构化查询语言SQL的解析。
语法树(syntax tree)或者称为抽象语法树(abstract syntax tree,AST)是编译原理中的概念,其作用是将抽象的语法结构用树状形式来表现出来,树上的每个非叶子节点都是抽象语法中的一个运算符,叶子节点代表抽象语法树的具体对象。使用语法树可以让机器读懂抽象语法的内在含义,以及抽象语法的执行顺序。语法树的应用非常广泛,例如编程语言的源代码解析、表达式的分析,甚至是自然语言处理、机器翻译技术,都需要用到语法树技术。结构化查询语言(Structured Query Language)简称SQL,SQL语法树解析对于SQL语句的分析以及明确SQL语句的查询执行路径具有重要的意义。
生成语法树通常都是需要两个过程:词法分析和语法分析。词法分析的任务是从左到右逐个字符地读入文件,即对文件中的字符流进行扫描然后根据构词规则识别单词。语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语。通常做法是由专业的编译器编程人员编写词法分析器和语法分析器来解析SQL语句生成语法树。但是词法分析器以及语法分析器源代码过于复杂,不利于快速开发,而且后期的维护工作也十分繁琐。
Flex和Bison是用来生成词法分析器和语法分析器源程序的工具,它们所生成的程序能够处理结构化的输入。最初Flex和Bison用来生成编译器的,后来也应用到了其他很多领域。其中词法分析就是将输入分割成一个个有意义的词块,称为记号(token)。任何flex词法分析器的模式都使用了正则表达式语言,正则表达式使用元语言来描述想要匹配的模式。元语言使用标准的文本字符,一部分代表它们自身而另外一部分则代表模式。语法分析器则是确定这些记号是如何彼此关联的。Bison基于给定的巴科斯范式BNF文法来生成一个可以识别这个语法中有效语句的语法分析器。
当前数据库索引调优算法中,针对于SQL语句的解析通常是统计出SQL语句中出现的属性,然后进行组合得到候选索引集。该方法的不足之处在于没有考虑SQL语句自身的结构,得到的候选索引不是最优解。
发明内容
针对现有技术的不足,本发明提出一种基于Flex和Bison的SQL语法树解析方法,包括:
步骤1:获取数据库历史查询文件,收集指定数据库实例对应的SQL语句,所述SQL语句包括insert语句、delete语句、update语句以及select语句;
步骤2:对每条SQL语句进行词法分析,根据构词规则将SQL语句分割为相应的记号;
步骤3:将词法分析处理得到的记号序列进行语法分析,根据SQL语法规则将记号序列转化为语法树形式;
步骤4:将语法树结构转化为JSON格式;
步骤5:重复执行步骤2至步骤4,直到处理完所有的SQL语句。
所述步骤1包括:
步骤1.1:开启关系型数据库中的历史查询日志功能,收集query workload信息;
步骤1.2:读取数据库历史查询日志文件,通过ID跟踪用户执行的操作,筛选出指定数据库实例的查询日志;
步骤1.3:排除掉日志中的时间信息、ID信息以及命令类型信息,得到指定数据库实例的日志中包含的SQL语句,所述SQL语句包括insert语句、delete语句、update语句以及select语句。
所述步骤2包括:
步骤2.1:根据SQL语句中的关键字、数据库命名规则以及变量类型,制定正则表达式进行每个词的匹配并转换为相应的记号;
步骤2.2:利用Flex软件将正则表达式以及相应记号的转换动作转化为C语言形式;
步骤2.3:调用C语言代码文件中的yylex()函数读取SQL语句进行构词规则匹配,判断每条SQL语句是否存在词法问题;
步骤2.4:对于不存在词法问题的SQL语句分割为相应的记号,得到每条SQL语句对应的记号序列,对于存在词法问题的SQL语句则直接删除。
所述步骤3包括:
步骤3.1:设计SQL语法树节点的结构体类型,其中包含节点的类型、节点存储的数值、该节点的兄弟节点以及子节点;
步骤3.2:根据SQL语法设计BNF文法;
步骤3.3:利用Bison软件将编写好的BNF文法转化为C语言形式,读取步骤2生成的记号序列进行BNF文法匹配,得到最终的SQL语法树。
本发明的有益效果是:
本发明提出了一种基于Flex和Bison的SQL语法树解析方法,可以在数据库索引调优中对query workload中的insert语句、delete语句、update语句以及select语句进行结构化的分析。将这些语句解析为语法树形式,并使用JSON格式进行持久化。可以更加准确的构建出候选索引集,而且通过语法树结构还可以了解SQL语句的执行计划,对于任意的SQL语句,即使是复杂的多表查询或者嵌套查询等语句,也可以通过BNF文法转化成SQL语法树,并且由JSON格式进行保存。
附图说明
图1为本发明中基于Flex和Bison的SQL语法树解析方法流程图。
图2为本发明中SQL语法树结构例图。
具体实施方式
下面结合附图和具体实施实例对发明做进一步说明。为了解析SQL语句并转化为语法树结构,以便对SQL语句进行进一步的分析,本发明提出了基于Flex和Bison的SQL语法树解析算法。本发明所要解决的技术问题是对于任意的SQL语句,即使是复杂的多表查询或者嵌套查询等语句,也可以通过BNF文法转化成SQL语法树,并且由JSON格式进行保存。
如图1所示,一种基于Flex和Bison的SQL语法树解析方法,包括:
步骤1:获取数据库历史查询文件,收集指定数据库实例对应的SQL语句,包括:
步骤1.1:开启关系型数据库中的历史查询日志功能,收集query workload信息;
步骤1.2:所采集的query workload信息可能包括多个数据库实例,在信息提取的过程中需要进行特定信息的筛选工作。读取数据库历史查询日志文件,通过ID跟踪用户执行的操作,筛选出指定数据库实例的查询日志;
步骤1.3:根据关系型数据库的历史查询日志文件结构,进行数据清理操作。排除掉日志中的时间信息、标识身份的ID信息以及命令类型信息,得到指定数据库实例的日志中包含的SQL语句,所述SQL语句包括insert语句、delete语句、update语句以及select语句。
步骤2:对每条SQL语句进行词法分析,根据构词规则将SQL语句分割为相应的记号;包括:
步骤2.1:根据SQL语句中的关键字、数据库命名规则以及变量类型,制定正则表达式进行每个词的匹配并转换为相应的记号;
实施步骤2.1编写的伪代码为:
步骤2.2:利用Flex软件将正则表达式以及相应记号的转换动作转化为C语言形式。由于C语言形式的内部格式使用的是确定性有穷自动机,相较于正则表达式匹配,它的速度可以成百倍提高;
步骤2.3:调用C语言代码文件中的yylex()函数读取SQL语句进行构词规则匹配,判断每条SQL语句是否存在词法问题;
步骤2.4:对于不存在词法问题的SQL语句分割为相应的记号,得到每条SQL语句对应的记号序列,对于存在词法问题的SQL语句则直接删除;
SQL语句进行词法分析后转化为记号序列,需要对该序列进行语法分析转化为具有结构化的语法树形式。
步骤3:将词法分析处理得到的记号序列进行语法分析,根据SQL语法规则将记号序列转化为语法树形式;包括:
步骤3.1:设计SQL语法树节点的结构体类型,其中包含节点的类型、节点存储的数值、该节点的兄弟节点以及子节点;
步骤3.2:根据SQL语法设计BNF文法,例如对于简单的SELECT语句对应的BNF文法为:
select_stmt∶=SELECT select_optss elect_expr_list FROM table opt_where
其中,select_stmt表示SELECT查询语句,SELECT表示SELECT关键字,select_opts表示查询限定条件,select_expr_list表示属性列表,FROM表示FROM关键字,table表示表名,opt_where表示where子句也就是限定条件。
然后将BNF文法匹配后的子句转化为节点类型,也就是构建SQL语法树。
步骤3.3:利用Bison软件将编写好的BNF文法转化为C语言形式,读取步骤2生成的记号序列进行BNF文法匹配,得到最终的SQL语法树,如图2所示,原始SQL语句为一个select语句,目的为在顾客表CUSTOMER中查询年龄AGE大于20并且性别SEX为男性的顾客编号CID以及顾客名字FNAME,查询后按照顾客名字进行排序。经过本方法解析后,形成一个语法树的结构,将其中的SELECT子句、FROM子句、WHERE子句以及ORDER BY子句结构化的表现出来。
步骤4:最终得到的SQL语法树形式是以多叉树的数据类型体现,为了保证该语法树能够持久化以便后续推荐索引使用,将语法树结构转化为JSON格式进行持久化的保存。
步骤5:重复执行步骤2至步骤4,直到处理完所有的SQL语句,输出语法树持久化文件。
Claims (4)
1.一种基于Flex和Bison的SQL语法树解析方法,其特征在于,包括:
步骤1:获取数据库历史查询文件,收集指定数据库实例对应的SQL语句,所述SQL语句包括insert语句、delete语句、update语句以及select语句;
步骤2:对每条SQL语句进行词法分析,根据构词规则将SQL语句分割为相应的记号;
步骤3:将词法分析处理得到的记号序列进行语法分析,根据SQL语法规则将记号序列转化为语法树形式;
步骤4:将语法树结构转化为JSON格式;
步骤5:重复执行步骤2至步骤4,直到处理完所有的SQL语句。
2.根据权利要求1所述的一种基于Flex和Bison的SQL语法树解析方法,其特征在于,所述步骤1包括:
步骤1.1:开启关系型数据库中的历史查询日志功能,收集query workload信息;
步骤1.2:读取数据库历史查询日志文件,通过ID跟踪用户执行的操作,筛选出指定数据库实例的查询日志;
步骤1.3:排除掉日志中的时间信息、ID信息以及命令类型信息,得到指定数据库实例的日志中包含的SQL语句,所述SQL语句包括insert语句、delete语句、update语句以及select语句。
3.根据权利要求1所述的一种基于Flex和Bison的SQL语法树解析方法,其特征在于,所述步骤2包括:
步骤2.1:根据SQL语句中的关键字、数据库命名规则以及变量类型,制定正则表达式进行每个词的匹配并转换为相应的记号;
步骤2.2:利用Flex软件将正则表达式以及相应记号的转换动作转化为C语言形式;
步骤2.3:调用C语言代码文件中的yylex()函数读取SQL语句进行构词规则匹配,判断每条SQL语句是否存在词法问题;
步骤2.4:对于不存在词法问题的SQL语句分割为相应的记号,得到每条SQL语句对应的记号序列,对于存在词法问题的SQL语句则直接删除。
4.根据权利要求1所述的一种基于Flex和Bison的SQL语法树解析方法,其特征在于,所述步骤3包括:
步骤3.1:设计SQL语法树节点的结构体类型,其中包含节点的类型、节点存储的数值、该节点的兄弟节点以及子节点;
步骤3.2:根据SQL语法设计BNF文法;
步骤3.3:利用Bison软件将编写好的BNF文法转化为C语言形式,读取步骤2生成的记号序列进行BNF文法匹配,得到最终的SQL语法树。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110312632.1A CN113032366A (zh) | 2021-03-24 | 2021-03-24 | 基于Flex和Bison的SQL语法树解析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110312632.1A CN113032366A (zh) | 2021-03-24 | 2021-03-24 | 基于Flex和Bison的SQL语法树解析方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113032366A true CN113032366A (zh) | 2021-06-25 |
Family
ID=76473584
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110312632.1A Pending CN113032366A (zh) | 2021-03-24 | 2021-03-24 | 基于Flex和Bison的SQL语法树解析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113032366A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113792027A (zh) * | 2021-08-23 | 2021-12-14 | 浙江金惠科技有限公司 | 一种通用型数据库转换装置 |
-
2021
- 2021-03-24 CN CN202110312632.1A patent/CN113032366A/zh active Pending
Non-Patent Citations (1)
Title |
---|
邱涛等: "面向关系数据库的智能索引调优方法", 《软件学报》, vol. 31, no. 3, pages 1 - 4 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113792027A (zh) * | 2021-08-23 | 2021-12-14 | 浙江金惠科技有限公司 | 一种通用型数据库转换装置 |
CN113792027B (zh) * | 2021-08-23 | 2023-06-16 | 浙江金惠科技有限公司 | 一种通用型数据库转换装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107515887B (zh) | 一种适用于多种大数据管理***的交互式查询方法 | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
CN107203468B (zh) | 一种基于ast的软件版本演化对比分析方法 | |
CN110909016B (zh) | 基于数据库的重复关联检测方法、装置、设备及存储介质 | |
CN115576984A (zh) | 中文自然语言生成sql语句及跨数据库查询方法 | |
CN109241080B (zh) | 一种fql查询语言的构建使用方法及其*** | |
CN112860727B (zh) | 基于大数据查询引擎的数据查询方法、装置、设备及介质 | |
Guo et al. | Benchmarking meaning representations in neural semantic parsing | |
CN116450616A (zh) | 一种基于解析树的通用异构关系型数据库sql迁移方法 | |
CN110909126A (zh) | 一种信息查询方法及装置 | |
Peterfreund | Grammars for document spanners | |
CN113779062A (zh) | Sql语句生成方法、装置、存储介质及电子设备 | |
CN111831624A (zh) | 数据表创建方法、装置、计算机设备及存储介质 | |
Bai et al. | Enhanced natural language interface for web-based information retrieval | |
Rodriguez-Cardenas et al. | Benchmarking causal study to interpret large language models for source code | |
CN113032366A (zh) | 基于Flex和Bison的SQL语法树解析方法 | |
CN113297251A (zh) | 多源数据检索方法、装置、设备及存储介质 | |
CN113032371A (zh) | 数据库语法分析方法、装置和计算机设备 | |
CN110716953B (zh) | Sql语句自动生成方法、装置、设备及可读存储介质 | |
CN110008448B (zh) | 将SQL代码自动转换为Java代码的方法和装置 | |
WO2023138078A1 (zh) | 编程语言的解析方法及装置、非易失性存储介质 | |
CN117390130A (zh) | 一种基于多模态表示的代码搜索方法 | |
CN115935943A (zh) | 一种支持自然语言结构计算的分析框架 | |
CN115292347A (zh) | 一种基于规则的主动式sql算法性能检查装置及方法 | |
CN113868312A (zh) | 多方法融合的机构匹配方法、装置、设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |