gpt4 book ai didi

antlr4 - sqlite3.g4 语法不能正确处理左连接

转载 作者:行者123 更新时间:2023-12-03 17:32:36 26 4
gpt4 key购买 nike

github sqlite3 语法 github.com/antlr/grammars-v4/blob/master/sqlite/SQLite.g4 存在左连接问题。

对于这个 sql

select * from t1 left join t2 on t1.owner = t2.email

单词“left”被解析为 table_alias。事情从那里迅速走下坡路

我想我可以通过某种方式说 table_alias 来解决它是 any_name除了 K_LEFT、K_RIGHT、K_INNER 但我不知道如何用语法表达

或者也许有更好的方法来解决这个问题

更新。只是为了澄清sqlite行为。 (不谈 antlr ,谈什么 sqlite 理解)

这个
select username from user left join device on device.owner = user.id limit 2

作品。

这个
select username from user alias join device on device.owner = user.id limit 2

失败说列 user.id 不存在。

显然,“左”这个词被识别为关键字而不是表别名。
select username from user alias join device on device.owner = alias.id limit 2

有效,并进行内部联接
select username from user alias left join device on device.owner = user.id limit 2

工作并进行左连接

@Mike Lischke 的进一步更新
select username from user left where device.owner = left.id limit 2

失败。 "Query has failed: near "where": syntax error".

最佳答案

行为是正确的。 LEFT包含在 keyword 中规则依次用于 any_name ,这是 table_alias 的有效输入(这被称为关键字作为标识符问题)。根据语法,句点,您的查询是错误的。表名后面的任何单词都是表别名,无论它是否通常是关键字。

一种解决方法可能是添加一个验证谓词,它检查以下标记并失败 table_alias规则当前标记是否应该以其原始含义使用。您可以通过删除 LEFT 获得相同的结果。来自 keyword 的关键字规则。但是,这可能会在您 的地方产生其他副作用。想要 LEFT关键字作为标识符的有效输入。

关于antlr4 - sqlite3.g4 语法不能正确处理左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51218746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com