ApacheCalcite教程-SQL解析-CalciteSQL解析
Calcite SQL解析
代码⽬录
如图:
config.fmpp
calcite 模板配置
Parser.jj
JavaCC解析器
parserImpls.ftl/compoundIdentifier.ftl ⾃定义JavaCC语法格式的解析SQL代码
⽣成解析器的流程
如图:
Sql解析使⽤
解析⽰例代码
public class SqlParserSample {
public static void main(String[] args)throws SqlParseException {
// Sql语句
String sql ="select * from emps where id = 1";
// 解析配置
SqlParser.Config mysqlConfig = figBuilder().setLex(Lex.MYSQL).build();
// 创建解析器
SqlParser parser = ate(sql, mysqlConfig);
// 解析sql
SqlNode sqlNode = parser.parseQuery();
// 还原某个⽅⾔的SQL
System.out.SqlString(OracleSqlDialect.DEFAULT));
}
}
解析流程
1. ⾸先⽣成SQL解析器SqlParser.Config,SqlParser.Config中存在获取解析⼯⼚类SqlParser.Config#parserFactory()⽅法,可以
在figBuilder()配置类中设置解析⼯⼚
2. SqlParserImplFactory解析⼯⼚中调⽤getParser⽅法获取解析器
3. SqlAbstractParserImpl抽象解析器,JavaCC中⽣成的解析器的⽗类,Calcite中默认的解析类名为SqlParserImpl
4. SqlParserImpl中,有静态字段FACTORY,主要是实现SqlParserImplFactory,并创建解析器
5. SqlParser调⽤create⽅法,从SqlParser.Config中获取⼯⼚SqlParserImplFactory,并创建解析器
6. 调⽤SqlParser#parseQuery⽅法,解析SQL,最终调⽤SqlAbstractParserImpl(默认实现类SqlParserImpl)的parseSqlStmtEof或
者parseSqlExpressionEof⽅法,获取解析后的抽象语法树SqlNode
Parser.jj 解析简单介绍
1. 调⽤SqlParserImplFactory的SqlAbstractParserImpl getParser(Reader stream);⽅法,解析获取解器,
或者,直接调⽤SqlParser#parseQuery传⼊sql语句,解析器重新传⼊sql parser.ReInit(new StringReader(sql));
2. 解析器⼊⼝类SqlAbstractParserImpl#parseSqlExpressionEof或者SqlAbstractParserImpl#parseSqlStmtEof
3. Parser.jj解析SQL语句⼊⼝SqlStmtEof() 解析SQL语句,直到⽂件结束符,SqlStmtEof()调⽤SqlStmt()
4. SqlStmt()中定义各个类型的解析,例如 SqlExplain()(explain语句),OrderedQueryOrExpr()(select语句),之后解析各个关键字常⽤类
Span
SqlParserPos的建造者
具体使⽤还不太清楚
SqlAbstractParserImpl
抽象解析器,Calcite所有的解析的⽗类,主要是设置⼀些解析的配置信息
SqlParseException
SQL解析异常
SqlParser
解析SQL语句
SqlParserImplFactory
解析器的⼯⼚类接⼝,可以⾃定义解析⼯⼚
SqlParserPos
表⽰SQL语句⽂本中已解析标记的位置
SqlParserUtil
SQL解析⼯具类
SqlNode
SQL解析树,是所有解析的节点的⽗类
SqlCall
SqlCall是对操作符的调⽤.
操作符可以⽤来描述任何语法结构,因此在实践中,SQL解析树中的每个⾮叶节点都是某种类型的SqlCall 常⽤类⼦类
// update语句
SqlUpdate (org.apache.calcite.sql)
// insert语句
SqlInsert (org.apache.calcite.sql)
// case语句
SqlCase (org.apache.calcite.sql.fun)
// explain语句
SqlExplain (org.apache.calcite.sql)
// delete语句
SqlDelete (org.apache.calcite.sql)
// with 列语句,mysql不⽀持,oracle⽀持
SqlWithItem (org.apache.calcite.sql)
// merge语法,mysql不⽀持,oracle⽀持
SqlMerge (org.apache.calcite.sql)
// ddl语句中的check语句
SqlCheckConstraint (org.apache.calcite.sql.ddl)
// 保存所有的操作
SqlBasicCall (org.apache.calcite.sql)
// 模式匹配
SqlMatchRecognize (org.apache.calcite.sql)
// alter语句
SqlAlter (org.apache.calcite.sql)
// UNIQUE,PRIMARY KEY,FOREIGN KEY解析
SqlKeyConstraint (org.apache.calcite.sql.ddl)
// with语句
SqlWith (org.apache.calcite.sql)
// order by 语句
SqlOrderBy (org.apache.calcite.sql)
// DESCRIBE SCHEMA 语句
mysql中delete语句
SqlDescribeSchema (org.apache.calcite.sql)
// ddl语句
SqlDdl (org.apache.calcite.sql)
/
/ join语句
SqlJoin (org.apache.calcite.sql)
// window语句
SqlWindow (org.apache.calcite.sql)
// select语句
SqlSelect (org.apache.calcite.sql)
//
SqlAttributeDefinition (org.apache.calcite.sql.ddl)
// DESCRIBE TABLE 语句
SqlDescribeTable (org.apache.calcite.sql)
// UNIQUE,PRIMARY KEY,FOREIGN KEY解析
SqlColumnDeclaration (org.apache.calcite.sql.ddl)
SqlLiteral
常量,表⽰输⼊的常量,需要返回值,则调⽤public Object getValue()⽅法,或者public <T> T getValueAs(Class<T> clazz)获取字段值常⽤⼦类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。