postgresql/lightdb保留关键字与非保留关键字及AS_LABEL、BARE_LABEL

  PG中别名的实现包括AS 别名和不带AS的别名,实现为AS_LABEL和BARE_LABEL之分。BARE_LABEL是可以直接做列别名,AS_LABEL是必须带as或双引号。

  关键字作为别名的实现,也需要区分为AS_LABEL或BARE_LABEL。在PG的实现中,绝大部分都实现为BARE_LABEL。

  有几个地方会添加关键字,xxx_kwlist.h, xxx_garm.y,包括解析器、ecpg、plpgsql、pgorasql、复制以及gin中的。如下:

  

 

  

  postgresql-13.3\doc\src\sgml\generate-keywords-table.pl负责生成keywords.sgml。

  postgresql-13.3\src\backend\parser\check_keywords.pl负责校验gram.y和kwlist.h中的关键字相同。

  其它各xxx_keywords.c/h各个文件一般include各种kwlist.h文件,这样可以保证只有2类源。

  SQL 区分保留关键字和 非保留关键字。根据标准,保留关键字是唯一真正的关键字;它们绝不允许作为标识符非保留关键字仅在特定上下文中具有特殊含义,可以在其他上下文中用作标识符。大多数非保留关键字实际上是 SQL 指定的内置表和函数的名称。非保留关键字的概念本质上只是为了声明在某些上下文中将某些预定义的含义附加到单词上。如下:

  

  在LightDB解析器中,事情有点复杂。有几种不同类别的标记,从永远不能用作标识符的标记到与普通标识符相比在解析器中绝对没有特殊地位的标记。(后者通常是由 SQL 指定的函数的情况。)添加关键字最重要之一的是在决定在gramy中的哪几类关键字列表中添加。即使保留关键字在LightDB中也不是完全保留的,但可以用作列标签(例如,SELECT 55 AS CHECK即使CHECK是保留关键字)。

  添加关键字需要考虑的第二个点是原有的应用如果使用了相应的标识符,升级是否会受影响,如果希望不受影响,就只能添加非保留关键字

  查看所有关键字的函数为pg_get_keywords,如下:

pg_get_keywords() → setof record ( word textcatcode "char"catdesc text

返回一组描述服务器识别的 SQL 关键字的记录。word列包含关键字。catcode列包含一个类别代码:U对于未保留C的关键字、可以是列名T的关键字、可以是类型或函数名称的关键字或R完全保留的关键字。catdesc列包含描述类别的可能本地化字符串。

 
  完整的lightdb以及postgresql关键字清单可见http://www.light-pg.com/docs/lightdb/13.3-22.2/sql-keywords-appendix.html
posted @ 2022-08-28 22:37  zhjh256  阅读(295)  评论(0编辑  收藏  举报