tsql - 解析 TSQL/Sybase *= 用于使用 ANTLR4 表示外连接的条件运算符
问题描述
Sybase 具有用于表示外连接的非 ANSI SQL 条件运算符:*=。
它已被弃用(http://dcx.sybase.com/1200/en/dbusage/apxa-transactsqlouter-joins-aspen.html)。
当我们从 Sybase ASE 迁移到 MySQL 时,我开始使用 ANTLR4 来解析 Sybase SQL 代码,以尝试将其转换为 MySQL 代码等价物。
我已尝试将其添加到此处提供的 TSqlParser.g4 语法中:https ://github.com/antlr/grammars-v4/tree/master/sql/tsql 。请参阅下面行尾的 '*' '=' 但它不起作用
// https://msdn.microsoft.com/en-us/library/ms188074.aspx
// Spaces are allowed for comparison operators.
comparison_operator
: '=' | '>' | '<' | '<' '=' | '>' '=' | '<' '>' | '!' '=' | '!' '>' | '!' '<' | '*' '='
;
我尝试了一些方法来使其工作,例如转义 \* 并删除 *= assignment_operator 但没有任何效果。这可能是一个愚蠢的问题,因为我是 ANTLR 的新手。:-(
请帮忙。
解决方案
输入*=
被MULT_ASSIGN
词法分析器标记为 a 。您将其定义为两个单独的标记:'*' '='
,这与'*='
.
如果您使用语法解析输入:
SELECT Q
FROM T
WHERE ID * = 42;
它会很好,但要正确解析:
SELECT Q
FROM T
WHERE ID *= 42;
你需要这样做:
comparison_operator
: ... | '*='
;
并支持两者,请执行以下操作:
comparison_operator
: ... | '*' '=' | '*='
;
推荐阅读
- grafana - 格拉法纳 | 身份验证代理 - 安全
- python - 无法将外部文本粘贴到 kivy 窗口(Python)
- java - Java - 将在功能块上同步对实例属性的访问?
- jupyter-notebook - jupyter-notebook 可以包含指向本地文件的链接吗?
- php - 在 Centos 8 上使用 ODBC 17 和 Laravel 连接到 SQL Server 时出现 SSL 错误“dh 密钥太小”
- c# - 正则表达式 - 如何将 'ß' 与 'ss' 匹配,反之亦然
- inno-setup - IsDotNetInstalled Inno Setup 函数中的 `MinServicePack` 参数是什么
- rxjs - 用户使用 RxJS 完成输入后如何开始处理?
- javascript - React 无法识别已定义的函数
- java - Kotlin 泛型:从 Java 迁移的麻烦