加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 19:00:30 所属栏目:百科 来源:网络整理
导读: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.事情从那里迅速走下坡路 我想我可以通过某种方式说明
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关键字成为标识符的有效输入的位置可能会产生其他副作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读