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_alias
any_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
关键字作为标识符的有效输入的地方,这可能会产生其他副作用。