sqlite3.g4 语法无法正确处理左连接



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

对于此 sql

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

"左"字被解析为table_alias。事情从那里迅速走下坡路

我想我可以通过以某种方式说除了K_LEFT、K_RIGHT K_INNER之外table_aliasany_name来解决它,但我不知道如何在语法中表达这一点

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

更新。只是为了澄清 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规则。您可以通过从keyword规则中删除LEFT关键字来获得相同的结果。但是,在您希望LEFT关键字作为标识符的有效输入的地方,这可能会产生其他副作用。

相关内容

  • 没有找到相关文章

最新更新