开发者社区> 问答> 正文

oracle interval语句解析bug

druid版本:最新1.1.0 sql: create table month_part (c1 number,c3 date) partition by range(c3) interval(numtoyminterval (1,'month')) (partition part1 values less than (to_date('2010-01-01','YYYY-MM-DD')), partition part2 values less than (to_date('2010-02-01','YYYY-MM-DD')) )

调用方法: OracleStatementParser parser=new OracleStatementParser(allSql); List stmtList=parser.parseStatementList(); for(SQLStatement stmt : stmtList) { System.out.println("druid parse sql is:"+stmt.toString()); } 此时输出的sql结果为: druid parse sql is:CREATE TABLE month_part ( c1 number, c3 date ) PARTITION BY RANGE (c3) INTERVAL numtoyminterval(1, 'month') ( PARTITION part1 VALUES LESS THAN (to_date('2010-01-01', 'YYYY-MM-DD')), PARTITION part2 VALUES LESS THAN (to_date('2010-02-01', 'YYYY-MM-DD')) ); interval后面numtoyminterval两边括号不见了,然后check报错 expect LPAREN, actual IDENTIFIER numtoyminterval

原提问者GitHub用户zzx8170

展开
收起
山海行 2023-07-05 20:53:09 84 0
3 条回答
写回答
取消 提交回答
  • 在 Druid 1.1.0 版本中,解析 Oracle 数据库中的 INTERVAL 关键字存在一个 bug,导致解析结果不正确。具体表现为 INTERVAL 后面的 numtoyminterval 中的括号消失,从而引发解析错误。

    为了解决这个问题,你可以尝试以下方法:

    1. 升级到最新版本:Druid 团队已经意识到这个 bug,并在后续的版本中进行了修复。你可以升级到最新版本的 Druid(例如 1.1.14 版本),以获取修复后的解析行为。

    2. 关闭 intervalCheck 功能(不推荐):如果你无法升级到最新版本或者有其他原因不能立即升级,可以在 Druid 数据源的配置文件中关闭 WallFilter 的 intervalCheck 功能。通过设置 druid.filter.wall.intervalCheck 为 false,来禁用对 INTERVAL 关键字的特殊处理。请注意,这可能会导致其他语法校验问题,因此不推荐长期使用。

    建议优先考虑升级到最新版本,以获得最新的修复和改进。如果问题仍然存在,请向 Druid 社区报告该问题,以便他们能够意识到并修复该 bug。

    2023-07-30 14:35:12
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    Druid Spring Boot Starter 中,使用 Oracle 数据库时,如果你的 SQL 语句中包含 INTERVAL 关键字,可能会导致解析错误。

    这是因为 Druid 数据源默认使用了 WallFilter 进行 SQL 语句的语法解析和校验,而 WallFilter 对于 INTERVAL 关键字的解析存在一些问题。
    为了解决这个问题,你可以尝试在 Druid 数据源的配置文件中关闭 WallFilter 的 intervalCheck 功能,例如:

    yaml
    Copy
    spring:
    datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@localhost:1521/orcl
    username: scott
    password: tiger
    druid:
    filter:
    wall:

          # 关闭intervalCheck
          intervalCheck: false
    

    这样修改后,Druid 数据源将不再对 INTERVAL 关键字进行特殊处理,而是将其视为普通的 SQL 关键字。

    2023-07-30 13:13:25
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:47:36
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像