SELECT*vs SELECT*

Jus*_*ier 5 sql postgresql parsing lexical-analysis

昨天,一位同事向我展示了以下postgres查询.我们都很惊讶它的工作原理:

SELECT* FROM mytable;
Run Code Online (Sandbox Code Playgroud)

由于我最近编译了另一种语言的解析器,我试图更深入地理解为什么这个查询"编译"并返回相同的结果SELECT * FROM mytable;.

据推测,这被认为是一个有效的查询,因为在词法分析期间,postgres SELECT从输入中读取 作为令牌,然后搜索下一个令牌,它找到*,等等 - 这或多或少是在这里发生了什么?

此外,postgres词法分析器/解析器恰好是否足以理解此查询,或者其他数据库是否理解类似的SELECT*查询?

Set*_*gie 5

通常词法分析器会在当前令牌中添加字符,直到它找到一个不属于当前令牌的字符,然后退出并从之前无法继续的位置开始.

所以这里发生的事情是,词法分析器吞噬SELECT并看到下一个字符是一个*,因为它正在收集一个单词,不属于SELECT.所以它停止,分析SELECT结果是一个关键字,并从*它识别的,重新开始,等等.这与你4从两种编程语言2*22 * 2其他编程语言中获得的原因相同.

至于它是否适用于其他数据库,这一切都取决于词法分析器的细节和语法规则.