CN109597624A - 一种sql格式化的方法 - Google Patents
一种sql格式化的方法 Download PDFInfo
- Publication number
- CN109597624A CN109597624A CN201811484271.3A CN201811484271A CN109597624A CN 109597624 A CN109597624 A CN 109597624A CN 201811484271 A CN201811484271 A CN 201811484271A CN 109597624 A CN109597624 A CN 109597624A
- Authority
- CN
- China
- Prior art keywords
- sql
- annotation
- formatted
- node
- further include
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Machine Translation (AREA)
Abstract
本发明涉及一种SQL格式化的方法,该方法包括:A、词法分析提取注释;B、自定义语法分析过程;C、重新定义ANTLR的createToken方法;D、遍历虚拟语法树,确定注释位置;E、格式化输出。本发明通用性强,适用于SQL体系的任意一种具体场景,比如hive sql,mysql等,极大提高了SQL开发人员的编码效率和质量。
Description
技术领域
本发明涉及计算机程序设计工具的技术领域,具体涉及一种SQL格式化的方法。
背景技术
SQL语言的开发人员在编写SQL程序的时候,通常会按照特定的编程规范来编写。但是手工编写过程中容易产生不规范的问题,或者一些初级编码人员或业余编码人员编写的SQL语言会存在很多不符合规范的情况。为了使代码更容易读懂,不同层次的人员都能够产出完全符合规范的SQL程序。SQL自动格式化的系统性工具成为了开发过程中的必要工具。该工具提供了一种自动化的方法将SQL语言进行格式化,将规范自动应用于SQL语句,节约了开发人员手工格式化SQL的时间,提升开发的效率和质量。
现有的相关工具:1、ApexSQL Refactor SQL formatter;2、SQL Pretty Printer;3、Druid。第一个工具和第二个工具都是运行在Windows平台,对平台兼容性差,第一个工具和第二个工具都属于商业软件,内部构造对外不公开。第三个工具提供SQL格式化的方法,是自己实现了SQL语言的语法解析,遍历虚拟语法树输出SQL格式化文本。但是注释会被忽略,而且个性化的格式化规范支持不好,另外有些方言的语法支持不完善。这三种工具对很多种SQL方言支持不好。
以Druid为例,它的SQL格式化实现步骤是:
1、进行词法和语法的分析生成虚拟语法树。
2、从根节点开始向下遍历虚拟语法树的每个节点。
3、每个节点根据自己的类型按照语法规范格式化输出子节点和自身的信息。
当访问过每个节点后,程序会生成相应的格式化后的SQL。
这种格式化方式为了处理方便会忽略掉注释,然而保留注释的格式化才能算是完整的格式化。
自己实现SQL语言解析的方式,系统难以维护。已目前的Druid为例。当前对一些SQL方言的语法支持不是太友好,如果在代码成面实现一些语法难度非常大。
发明内容
为解决现有技术中存在的上述问题,本发明提供一种SQL格式化的方法,该方法构建在ANTLR工具之上,依赖ANTLR的词法和语法解析器的自动生成技术,使得整体技术方案通用性(可以方便的支持其他SQL方言)和可维护性(修改ANTLR的语法词法定义,避免语法和词法分析器的复杂代码维护)更强。技术着重在SQL脚本本身的格式化和原始脚本注释位置的精准还原上。
本发明通过下述技术方案实现:一种SQL格式化的方法,该方法包括:
A、词法分析提取注释;
B、自定义语法分析过程;
C、重新定义ANTLR的createToken方法;
D、遍历虚拟语法树,确定注释位置;
E、格式化输出。
进一步的,所述步骤A中还包括编写ANTLR词法和语法脚本。
进一步的,所述步骤A中还包括设定行注释的词法分析通道为一个特殊通道,区别于空格和换行,为后续直接在词法分析结果中直接过滤出所有的注释。
进一步的,所述步骤A中还包括完成词法分析后,将所有的注释Token保存到一个单独队列;当前Token信息包含:所在原始字符串的行号和行内的偏移量。
进一步的,所述步骤B中还包括对特定语法分析单元添加动作脚本。
进一步的,所述步骤B中还包括保存文法分析过程的具体Token偏移量。
进一步的,所述步骤B中还包括分析脚本中的每个文法规则添加一个init和after的方法,将恢复节点放入和弹出堆栈。
进一步的,所述步骤D中还包括:
对虚拟语法树深度遍历;
在遍历过程中使用allnodelist对所有的节点进行倒序存储,此处的倒序是为了模拟出正常代码顺序的相反顺序;
对于注释队列中的每个注释确定输出位置。
进一步的,所述步骤E中还包括再次对虚拟语法树深度遍历,遇到某个节点,如果该节点是某个注释的输出节点就输出注释,并且去掉该注释节点,然后按照当前节点类型格式化输出当前节点,及深度遍历其子节点。
本发明与现有技术相比具有如下优点:
1、本发明通用性强,适用于SQL体系的任意一种具体场景,比如hive sql,mysql等。
2、本发明极大提高了SQL开发人员的编码效率和质量。
具体实施方式
实施例一:
一种SQL格式化的方法,该方法包括:
A、词法分析提取注释;
编写ANTLR词法和语法脚本。以hive sql语法为例进行介绍。针对hive sql语法:定义6个文件分别是HiveLexer.g(词法定义)、FromClauseParser.g(from语句解析)、IdentifiersParser.g(标识符定义函数名称、系统函数、关键字等)、ResourcePlanParser.g(资源计划)、SelectClauseParser.g(select语句解析)、HiveParser.g(包含了SelectClauseParser,FromClauseParser,IdentifiersParser,ResourcePlanParser实现了所有的hive语法解析)。
1.1HiveLexer.g中设定行注释(line comment)的词法分析通道为一个特殊通道,区别与空格和换行。为后续直接在词法分析结果中直接过滤出所有的注释。
LINE_COMMENT
:'--'(~('\n'|'\r'))*{$channel=88;}/*这个地方保留源码中的注释{$channel=HIDDEN;}*/
;
1.2完成词法分析后,将所有的注释token保存到一个单独队列(注释队列)。当前token信息包含:所在原始字符串的行号和行内的偏移量。
B、自定义语法分析过程;对特定语法分析单元添加动作脚本。
构建虚拟语法树节点包含在原始字符串中的偏移信息。
2.1保存文法分析过程的具体token偏移量
(1)在HiveParser.g添加一个栈(代码会直接生成到HivePaser.java的类定义中)
@members{
public Stack xstarttokens=new Stack<Token〉();
}
并添加pushstack方法和popstack方法
public void pushstack(Token t){
xstarttokens.push(t);
}
public void popMsg(){
xstarttokens.pop();
}
(2)分析脚本中的每个文法规则添加一个init和after的方法,将恢复节点放入和弹出堆栈。
@init{pushstack(retval.start);}
@after{popstack();}
该步骤非常重要,ANTLR语法分析过程中,对当前ASTNode的类型会进行预测,预测前会保存当前词法节点(当前的词法节点包含原始sql中的所在行和列的偏移量),此时利用该步骤将恢复节点进行入栈保存,当判定该节点类型后当前栈顶的节点会被应用到下一个步骤。
C、重新定义ANTLR的createToken方法;
重写CommonTreeAdaptor的,public Token createToken(int tokenType,Stringtext)方法。
//语法分析的时候使用
HiveParser parser=new HiveParser(tokens);
MyCommonTreeADaptor adaptor=new MyCommonTreeADaptor(parser);
parser.setTreeADaptor(adaptor);
该方法(createToken)在构建ASTNode的时候会被调用,默认会构建无偏移量的ASTNode。经过重新定义后,此时将堆栈的顶部节点的偏移量作为该虚拟节点的偏移量保存(Line和CharPositionInLine)到当前ASTNode的token中。此步骤为后续的注释定位提供偏移量依据。
D、遍历虚拟语法树,确定注释位置;
3.1对ASTTree深度遍历:当前节点保存到一个队列,如果有子节点,按照子节点的TokenStartIndex从小到大进行排序,并递归该子节点。
3.2在遍历过程中使用allnodelist对所有的节点进行倒序存储,此处的倒序是为了模拟出正常代码顺序的相反顺序。
3.3对于注释队列中的每个注释确定输出位置:遍历allnodelist如果当前节点的lineindex<注释的lineindex或者(lineindex=注释的lineindex&&charpositioninline<=注释的),记录当前节点的下一个节点。作为该注释的输出节点。即以下伪代码中的UpdateCommentsWhere函数。
利用输出顺序反向推导注释位置,此步骤解决了两个比较棘手的问题:(1)语法解析过程中新增虚拟节点使得注释位置无法被精准定位;(2)逻辑节点在树的靠顶部的位置,深度遍历过程中会优先经过它影响注释位置的精确输出。
此步骤比较精妙的标注该注释应该在ASTTree的具体哪个节点之后需要输出,而且确保了位置的精确性。
//注释节点和输出位置
E、格式化输出。
再次对ASTTree深度遍历,遇到某个节点,如果该节点是某个注释的输出节点就输出注释,并且去掉该注释节点。然后按照当前节点类型格式化输出当前节点,及深度遍历其子节点。
注释输出:
1)依赖上一步的注释标注的工作,当我们在遍历到具体的节点的时候。可以确定是否应该输出注释。
2)此时为了格式的标准需要考虑:上一行是否是注释或者空行:如果是就换行根据缩进输出注释否则不换行添加固定空白符进行注释输出;上一行是否是具体语句:如果是就添加具体空白符进行注释输出,否则换行根据缩进输出注释;
脚本输出:
1)输出当前的注释
2)根据当前节点的类型进行具体的格式化输出,这一步比较繁琐,需要根据不同的类型进行特殊处理,如果包含子节点继续调用输出方法递归自己进行格式化输出。以下伪代码演示了如何进行处理。
SQL:SQL是一种特定领域的计算机语言,适用于管理关系数据库管理系统中保存的数据或关系数据流管理系统中的流处理。
ANTLR:ANTLR(另一种语言识别工具)是一个功能强大的解析器生成器,用于读取,处理,执行或转换结构化文本或二进制文件。它广泛用于构建语言,工具和框架。从语法上,ANTLR生成一个可以构建和遍历解析树的解析器。
虚拟语法树(ASTTree):在计算机科学中,抽象语法树(AST)或语法树是用编程语言编写的源代码的抽象语法结构的树表示。树的每个节点表示在源代码中出现的构造。语法是“抽象的”,因为它不代表真实语法中出现的每个细节,而只是结构,内容相关的细节。例如,分组括号在树结构中是隐式的,并且诸如if-condition-then表达式的句法结构可以通过具有三个分支的单个节点来表示。
词法分析(lexer):词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为标记(token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(lexical analyzer,简称lexer),也叫扫描器(scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
语法分析(parser):在计算机科学和语言学中,语法分析(英:Syntacticanalysis,也叫Parsing)是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。
语法分析器(Parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。实际开发中,语法分析器可以手工编写,也可以使用工具(半)自动生成。
最后需要说明的是,上面实施例仅用以说明本发明技术方案而非限制,虽然参照实施例对本发明进行了详细的说明,本领域的技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明的精神和相关范围,其均应涵盖在本发明的权利要求范围内。
Claims (9)
1.一种SQL格式化的方法,其特征在于:该方法包括:
A、词法分析提取注释;
B、自定义语法分析过程;
C、重新定义ANTLR的createToken方法;
D、遍历虚拟语法树,确定注释位置;
E、格式化输出。
2.根据权利要求1所述的一种SQL格式化的方法,其特征在于:所述步骤A中还包括编写ANTLR词法和语法脚本。
3.根据权利要求2所述的一种SQL格式化的方法,其特征在于:所述步骤A中还包括设定行注释的词法分析通道为一个特殊通道,区别于空格和换行,为后续直接在词法分析结果中直接过滤出所有的注释。
4.根据权利要求3所述的一种SQL格式化的方法,其特征在于:所述步骤A中还包括完成词法分析后,将所有的注释Token保存到一个单独队列;当前Token信息包含:所在原始字符串的行号和行内的偏移量。
5.根据权利要求1所述的一种SQL格式化的方法,其特征在于:所述步骤B中还包括对特定语法分析单元添加动作脚本。
6.根据权利要求5所述的一种SQL格式化的方法,其特征在于:所述步骤B中还包括保存文法分析过程的具体Token偏移量。
7.根据权利要求6所述的一种SQL格式化的方法,其特征在于:所述步骤B中还包括分析脚本中的每个文法规则添加一个init和after的方法,将恢复节点放入和弹出堆栈。
8.根据权利要求1所述的一种SQL格式化的方法,其特征在于:所述步骤D中还包括:
对虚拟语法树深度遍历;
在遍历过程中使用allnodelist对所有的节点进行倒序存储,此处的倒序是为了模拟出正常代码顺序的相反顺序;
对于注释队列中的每个注释确定输出位置。
9.根据权利要求1所述的一种SQL格式化的方法,其特征在于:所述步骤E中还包括再次对虚拟语法树深度遍历,遇到某个节点,如果该节点是某个注释的输出节点就输出注释,并且去掉该注释节点,然后按照当前节点类型格式化输出当前节点,及深度遍历其子节点。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811484271.3A CN109597624A (zh) | 2018-12-06 | 2018-12-06 | 一种sql格式化的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811484271.3A CN109597624A (zh) | 2018-12-06 | 2018-12-06 | 一种sql格式化的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109597624A true CN109597624A (zh) | 2019-04-09 |
Family
ID=65962194
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811484271.3A Pending CN109597624A (zh) | 2018-12-06 | 2018-12-06 | 一种sql格式化的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109597624A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112579058A (zh) * | 2019-09-27 | 2021-03-30 | 陕西星邑空间技术有限公司 | 应用程序的开发方法及相关装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102222004A (zh) * | 2011-07-01 | 2011-10-19 | 福建富士通信息软件有限公司 | 交换机专用语言转换为c语言的方法 |
CN105787044A (zh) * | 2016-02-26 | 2016-07-20 | 广州品唯软件有限公司 | 一种基于MySQL的SQL解析器及其解析方法 |
US20180218031A1 (en) * | 2017-01-31 | 2018-08-02 | Salesforce.com. inc. | Systems, methods, and apparatuses for implementing dynamic macros within a multi-tenant aware structured query language |
-
2018
- 2018-12-06 CN CN201811484271.3A patent/CN109597624A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102222004A (zh) * | 2011-07-01 | 2011-10-19 | 福建富士通信息软件有限公司 | 交换机专用语言转换为c语言的方法 |
CN105787044A (zh) * | 2016-02-26 | 2016-07-20 | 广州品唯软件有限公司 | 一种基于MySQL的SQL解析器及其解析方法 |
US20180218031A1 (en) * | 2017-01-31 | 2018-08-02 | Salesforce.com. inc. | Systems, methods, and apparatuses for implementing dynamic macros within a multi-tenant aware structured query language |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112579058A (zh) * | 2019-09-27 | 2021-03-30 | 陕西星邑空间技术有限公司 | 应用程序的开发方法及相关装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106227668B (zh) | 数据处理方法和装置 | |
Lämmel et al. | Semi‐automatic grammar recovery | |
Conte et al. | MadAnalysis 5, a user-friendly framework for collider phenomenology | |
US10042637B1 (en) | Computerized software development environment including customized presentation of source code | |
US9146712B2 (en) | Extensible code auto-fix framework based on XML query languages | |
EP1672528A2 (en) | File Formats, Methods, and Computer Program Products for Representing Workbooks | |
US8954940B2 (en) | Integrating preprocessor behavior into parsing | |
CN101996131A (zh) | 基于xml封装关键字的gui自动测试方法及自动测试平台 | |
JPS6375835A (ja) | 目的コ−ド、プログラム・リスト及び設計文書を生成する装置 | |
CN105893014A (zh) | 用于前端的项目开发方法及系统 | |
CN104199871A (zh) | 一种用于智慧教学的高速化试题导入方法 | |
CN111913739B (zh) | 一种服务接口原语定义方法和系统 | |
WO2006136055A1 (fr) | Procédé d'exploration de données texte | |
CN112363706A (zh) | 一种嵌套组合的预处理方法及设备 | |
CN102541614A (zh) | 基于代码分析的计算模块输入输出数据自动解析方法 | |
US10691434B2 (en) | System and method for converting a first programming language application to a second programming language application | |
CN101201750B (zh) | 利用语法词法分析工具为编解码提供数据的方法 | |
Roeder | Juxta web service, lera, and variance viewer. web based collation tools for tei | |
CN109857458A (zh) | 基于ANTLR的AltaRica 3.0的扁平化的转化方法 | |
Savic et al. | Language for use case specification | |
CN109597624A (zh) | 一种sql格式化的方法 | |
WO2013154055A1 (ja) | 構造解析装置及びプログラム | |
CN114625413A (zh) | 一种路由数据生成方法、装置、设备及存储介质 | |
CN110554860B (zh) | 一种软件项目自然语言编程接口nli的构造方法及代码生成方法 | |
CN113971044A (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 | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20190409 |
|
WD01 | Invention patent application deemed withdrawn after publication |