Github
calcite 模板配置
JavaCC解析器
自定义JavaCC语法格式的解析SQL代码
public class SqlParserSample {
public static void main(String[] args) throws SqlParseException {
// Sql语句
String sql = "select * from emps where id = 1";
// 解析配置
SqlParser.Config mysqlConfig = SqlParser.configBuilder().setLex(Lex.MYSQL).build();
// 创建解析器
SqlParser parser = SqlParser.create(sql, mysqlConfig);
// 解析sql
SqlNode sqlNode = parser.parseQuery();
// 还原某个方言的SQL
System.out.println(sqlNode.toSqlString(OracleSqlDialect.DEFAULT));
}
}
SqlParser.Config
,SqlParser.Config
中存在获取解析工厂类SqlParser.Config#parserFactory()
方法,可以在SqlParser.configBuilder()
配置类中设置解析工厂SqlParserImplFactory
解析工厂中调用getParser
方法获取解析器SqlAbstractParserImpl
抽象解析器,JavaCC中生成的解析器的父类,Calcite中默认的解析类名为SqlParserImpl
SqlParserImpl
中,有静态字段FACTORY
,主要是实现SqlParserImplFactory
,并创建解析器SqlParser
调用create
方法,从SqlParser.Config
中获取工厂SqlParserImplFactory
,并创建解析器SqlParser#parseQuery
方法,解析SQL,最终调用SqlAbstractParserImpl
(默认实现类SqlParserImpl
)的parseSqlStmtEof
或者parseSqlExpressionEof
方法,获取解析后的抽象语法树SqlNode
Parser.jj 解析简单介绍
SqlParserImplFactory
的SqlAbstractParserImpl getParser(Reader stream);
方法,解析获取解器,SqlParser#parseQuery
传入sql语句,解析器重新传入sqlparser.ReInit(new StringReader(sql));
SqlAbstractParserImpl#parseSqlExpressionEof
或者SqlAbstractParserImpl#parseSqlStmtEof
SqlStmtEof()
解析SQL语句,直到文件结束符,SqlStmtEof()
调用SqlStmt()
SqlStmt()
中定义各个类型的解析,例如 SqlExplain()
(explain语句),OrderedQueryOrExpr()
(select语句),之后解析各个关键字Span
SqlParserPos的建造者
具体使用还不太清楚
SqlAbstractParserImpl
抽象解析器,Calcite所有的解析的父类,主要是设置一些解析的配置信息
SqlParseException
SQL解析异常
SqlParser
解析SQL语句
SqlParserImplFactory
解析器的工厂类接口,可以自定义解析工厂
SqlParserPos
表示SQL语句文本中已解析标记的位置
SqlParserUtil
SQL解析工具类
SQL解析树,是所有解析的节点的父类
SqlNode
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 语句
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
获取字段值
常用子类
SqlNumericLiteral
SqlNumericLiteral
数字常量
SqlAbstractStringLiteral
SqlAbstractStringLiteral
字符和二进制字符串文字常量
SqlBinaryStringLiteral
SqlBinaryStringLiteral
二进制(或十六进制)字符串。
SqlCharStringLiteral
SqlCharStringLiteral
类型为SqlTypeName.CHAR
的信息
SqlAbstractDateTimeLiteral
SqlAbstractDateTimeLiteral
表示日期、时间或时间戳值的常量
SqlDateLiteral
SqlDateLiteral
样例: 2004-10-22
SqlTimestampLiteral
SqlTimestampLiteral
样例: 1969-07-21 03:15 GMT
SqlTimeLiteral
SqlTimeLiteral
样例: 14:33:44.567
SqlIntervalLiteral
SqlIntervalLiteral
时间间隔常量
例子:
INTERVAL '1' SECOND
INTERVAL '1:00:05.345' HOUR
INTERVAL '3:4' YEAR TO MONTH
SqlIdentifier
Sql中的Id标示符
SqlNodeList
SqlNode的集合
SqlDataTypeSpec
SQL数据类型规范.
目前,它只支持简单的数据类型,如CHAR、VARCHAR和DOUBLE
SqlDynamicParam
表示SQL语句中的动态参数标记
SqlIntervalQualifier
标示区间定义
Examples include:
INTERVAL '1:23:45.678' HOUR TO SECOND
INTERVAL '1 2:3:4' DAY TO SECOND
INTERVAL '1 2:3:4' DAY(4) TO SECOND(4)
SqlKind
SqlNode类型
SqlOperator
Sql解析的节点类型,包括:函数,操作符(=),语法结构(case)等操作
SqlOperatorTable
定义了一个用于枚举和查找SQL运算符(=)和函数(cast)的目录接口。
SqlStdOperatorTable
包含标准运算符和函数的SqlOperatorTable的实现
OracleSqlOperatorTable
仅包含Oracle特定功能和运算符的运算符表
public interface Config {
/** 默认配置. */
Config DEFAULT = configBuilder().build();
/**
* 最大字段长度
*/
int identifierMaxLength();
/**
* 转义内 大小写转换
*/
Casing quotedCasing();
/**
* 转义字符外 大小写转换
*/
Casing unquotedCasing();
/**
* 转义字符符号
*/
Quoting quoting();
/**
* 大小写匹配 - 在planner内生效
*/
boolean caseSensitive();
/**
* sql模式
*/
SqlConformance conformance();
@Deprecated // to be removed before 2.0
boolean allowBangEqual();
/**
* 解析工厂类
*/
SqlParserImplFactory parserFactory();
}
public static class ConfigBuilder {
// Casing.UNCHANGED
private Casing quotedCasing = Lex.ORACLE.quotedCasing;
// Quoting.DOUBLE_QUOTE
private Casing unquotedCasing = Lex.ORACLE.unquotedCasing;
// Casing.TO_UPPER
private Quoting quoting = Lex.ORACLE.quoting;
// 128
private int identifierMaxLength = DEFAULT_IDENTIFIER_MAX_LENGTH;
// true
private boolean caseSensitive = Lex.ORACLE.caseSensitive;
// Calcite's default SQL behavior.
private SqlConformance conformance = SqlConformanceEnum.DEFAULT;
// 解析工厂类
private SqlParserImplFactory parserFactory = SqlParserImpl.FACTORY;
}
https://github.com/quxiucheng/apache-calcite-tutorial/tree/master/calcite-tutorial-2-parser/parser-3-calcite-tutorial