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

前端之家收集整理的这篇文章主要介绍了antlr4 – 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

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

我想我可以通过某种方式说明table_alias是除了K_LEFT,K_RIGHT,K_INNER之外的任何名称但我不知道如何在语法中表达它

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

UPDATE.只是为了澄清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

失败. “查询失败:靠近”:“语法错误”.

解决方法

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

解决方法可能是添加验证谓词,如果当前令牌是应该以其原始含义使用的内容,则会检查以下令牌并使table_alias规则失败.您可以通过从关键字规则中删除LEFT关键字来获得相同的结果.但是,在您希望LEFT关键字成为标识符的有效输入的位置可能会产生其他副作用.

猜你在找的Sqlite相关文章