ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

org.apache.calcite.sql.parser.impl.ParseException: Encountered "create"

2020-02-21 15:51:38  阅读:554  来源: 互联网

标签:... SqlParserImpl create parser Encountered CURRENT apache calcite CREATE


在用calcite解析oracle的建表语句时报这样的错:

Caused by: org.apache.calcite.sql.parser.impl.ParseException: Encountered "CREATE" at line 3, column 2.
Was expecting one of:
    "SET" ...
    "RESET" ...
    "ALTER" ...
    "WITH" ...
    "+" ...
    "-" ...
    "NOT" ...
    "EXISTS" ...
    <UNSIGNED_INTEGER_LITERAL> ...
    <DECIMAL_NUMERIC_LITERAL> ...
    <APPROX_NUMERIC_LITERAL> ...
    <BINARY_STRING_LITERAL> ...
    <PREFIXED_STRING_LITERAL> ...
    <QUOTED_STRING> ...
    <UNICODE_STRING_LITERAL> ...
    "TRUE" ...
    "FALSE" ...
    "UNKNOWN" ...
    "NULL" ...
    <LBRACE_D> ...
    <LBRACE_T> ...
    <LBRACE_TS> ...
    "DATE" ...
    "TIME" ...
    "TIMESTAMP" ...
    "INTERVAL" ...
    "?" ...
    "CAST" ...
    "EXTRACT" ...
    "POSITION" ...
    "CONVERT" ...
    "TRANSLATE" ...
    "OVERLAY" ...
    "FLOOR" ...
    "CEIL" ...
    "CEILING" ...
    "SUBSTRING" ...
    "TRIM" ...
    "CLASSIFIER" ...
    "MATCH_NUMBER" ...
    "RUNNING" ...
    "PREV" ...
    "NEXT" ...
    "JSON_EXISTS" ...
    "JSON_VALUE" ...
    "JSON_QUERY" ...
    "JSON_OBJECT" ...
    "JSON_OBJECTAGG" ...
    "JSON_ARRAY" ...
    "JSON_ARRAYAGG" ...
    <LBRACE_FN> ...
    "MULTISET" ...
    "ARRAY" ...
    "PERIOD" ...
    "SPECIFIC" ...
    <IDENTIFIER> ...
    <QUOTED_IDENTIFIER> ...
    <BACK_QUOTED_IDENTIFIER> ...
    <BRACKET_QUOTED_IDENTIFIER> ...
    <UNICODE_QUOTED_IDENTIFIER> ...
    "ABS" ...
    "AVG" ...
    "CARDINALITY" ...
    "CHAR_LENGTH" ...
    "CHARACTER_LENGTH" ...
    "COALESCE" ...
    "COLLECT" ...
    "COVAR_POP" ...
    "COVAR_SAMP" ...
    "CUME_DIST" ...
    "COUNT" ...
    "CURRENT_DATE" ...
    "CURRENT_TIME" ...
    "CURRENT_TIMESTAMP" ...
    "DENSE_RANK" ...
    "ELEMENT" ...
    "EXP" ...
    "FIRST_VALUE" ...
    "FUSION" ...
    "GROUPING" ...
    "HOUR" ...
    "LAG" ...
    "LEAD" ...
    "LAST_VALUE" ...
    "LN" ...
    "LOCALTIME" ...
    "LOCALTIMESTAMP" ...
    "LOWER" ...
    "MAX" ...
    "MIN" ...
    "MINUTE" ...
    "MOD" ...
    "MONTH" ...
    "NTH_VALUE" ...
    "NTILE" ...
    "NULLIF" ...
    "OCTET_LENGTH" ...
    "PERCENT_RANK" ...
    "POWER" ...
    "RANK" ...
    "REGR_COUNT" ...
    "REGR_SXX" ...
    "REGR_SYY" ...
    "ROW_NUMBER" ...
    "SECOND" ...
    "SQRT" ...
    "STDDEV_POP" ...
    "STDDEV_SAMP" ...
    "SUM" ...
    "UPPER" ...
    "TRUNCATE" ...
    "USER" ...
    "VAR_POP" ...
    "VAR_SAMP" ...
    "YEAR" ...
    "CURRENT_CATALOG" ...
    "CURRENT_DEFAULT_TRANSFORM_GROUP" ...
    "CURRENT_PATH" ...
    "CURRENT_ROLE" ...
    "CURRENT_SCHEMA" ...
    "CURRENT_USER" ...
    "SESSION_USER" ...
    "SYSTEM_USER" ...
    "NEW" ...
    "CASE" ...
    "CURRENT" ...
    "CURSOR" ...
    "ROW" ...
    "(" ...
    "SELECT" ...
    "VALUES" ...
    "TABLE" ...
    "EXPLAIN" ...
    "DESCRIBE" ...
    "INSERT" ...
    "UPSERT" ...
    "DELETE" ...
    "UPDATE" ...
    "MERGE" ...
    "CALL" ...
    
    at org.apache.calcite.sql.parser.impl.SqlParserImpl.generateParseException(SqlParserImpl.java:25004)
    at org.apache.calcite.sql.parser.impl.SqlParserImpl.jj_consume_token(SqlParserImpl.java:24821)
    at org.apache.calcite.sql.parser.impl.SqlParserImpl.SqlStmt(SqlParserImpl.java:864)
    at org.apache.calcite.sql.parser.impl.SqlParserImpl.SqlStmtEof(SqlParserImpl.java:876)
    at org.apache.calcite.sql.parser.impl.SqlParserImpl.parseSqlStmtEof(SqlParserImpl.java:198)
    at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:148)
    ... 1 more

 

可能的情况:

1、可能是使用了oracle的保留关键字来命名了,这时候需要检查一下报错的语句,

2、如果是在解析DDL操作,比如:CREATE TABLE, ALTER TABLE, DROP TABLE, etc.

那么只引入calcite-core是不够的,

Calcite的核心模块(calcite-core)支持SQL查询(SELECT)和DML操作(INSERT,UPDATE,DELETE,MERGE),但不支持DDL操作,如CREATE SCHEMA或CREATE TABLE。正如我们将要看到的,DDL使存储库的状态模型变得复杂,并且使得解析器更难以扩展,因此我们将DDL留在了核心之外。
  服务器模块(calcite-server)向Calcite添加DDL支持。它扩展了SQL解析器,使用与子项目相同的机制,添加了一些DDL命令:

    • CREATE 和 DROP SCHEMA
    • CREATE 和 DROP FOREIGN SCHEMA
    • CREATE和DROP TABLE(含CREATE TABLE ... AS SELECT)
    • CREATE 和 DROP MATERIALIZED VIEW
    • CREATE 和 DROP VIEW

这时候需要

① 在pom.xml文件中引入服务器包,

        <dependency>
            <groupId>org.apache.calcite</groupId>
            <artifactId>calcite-server</artifactId>
            <version>1.18.0</version>
        </dependency>

② 在解析配置中添加相应的工厂和待解析语句的适配数据库配置,

SqlParser.Config sqlParserConfig = SqlParser.configBuilder()
    .setParserFactory(SqlDdlParserImpl.FACTORY)
    .setConformance(SqlConformanceEnum.MYSQL_5)
    .setLex(Lex.MYSQL)
    .build();

SqlParser parser = SqlParser.create(query, sqlParserConfig);

 

这样就可以解析DDL了,

标签:...,SqlParserImpl,create,parser,Encountered,CURRENT,apache,calcite,CREATE
来源: https://www.cnblogs.com/1394htw/p/12341639.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有