主要观点:作者一直在开发 PostgreSQL 的 linter Squawk,现在使用手工解析器;探讨了 PostgreSQL 语法的一些有趣方面,包括自定义操作符、复合select
的优先级、百分比类型、字符串续接、带引号的标识符、Unicode 转义和操作符函数等。
关键信息:
- 自定义操作符在语法中定义较少,很多 Postgres 特性依赖它,如
<-
用于比较几何类型等,自定义操作符可为前缀或中缀,不能是后缀,Trino 的 lambda 表达式语法在 Postgres 中可原生解析但优先级错误。 select foo union select bar order by baz;
与(select foo union select bar) order by baz;
解析相同,order by
应用于整个复合选择。create function
可基于表的列类型指定类型,如create function f(a t.c%type) as 'select 1' language plpgsql;
。- 两个字符串字面量换行会合并,有注释则为语法错误,这是 SQL 标准的一部分。
- 在 Postgres 中可选择性地引用标识符,要包含双引号可转义,还可前缀
U&
并传递 Unicode 转义码,可更改转义字符。 - 可使用操作符函数代替直接使用操作符,能指定操作符的模式,也可作为前缀操作符。
重要细节: - Squawk 的相关链接、Squawk 的版本发布链接、Postgres 语法的相关链接等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。