引用标识符的大小写转换设计

1. 目的

  • 为了满足PG和Oracle的引用标识符大小写兼容,ivorysql设计了三种引用标识符的大小写转换模式。通过guc参数“identifier_case_switch”选择转换模式;

2. 功能

2.1. 大小写转换的三种模式(默认为interchange)

  • 如果 guc参数“identifier_case_switch”值为“interchange”:

    1). 如果双引号所引用的标识符中的字母全部为大写,则将大写转换为小写。
    2). 如果双引号所引用的标识符中的字母全部为小写,则将小写转换为大写。
    3). 如果用双引号引起来的标识符中的字母是大小写混合的,则保持标识符不变。

2.2. 初始化数据库集簇时

  • 在initdb程序中加入 -C选项设置大小写转换模式,-C对应的值为:

    "normal"   ------ "0"同义
    "interchange" ------ "1"同义
    "lowercase"  ------ "2"同义
    在初始化数据库集簇的过程中,将大小写转换模式保存到data目录的global/pg_control文件中。

2.3. 测试用例

SET ivorysql.enable_case_switch = true;
SET ivorysql.identifier_case_switch = interchange;
CREATE TABLE "ABC"(c1 int, c2 int);
SELECT relname FROM pg_class WHERE relname = 'ABC';
SELECT relname FROM pg_class WHERE relname = 'abc';
SELECT * FROM "ABC";
SELECT * FROM ABC;
SELECT * FROM abc;
SELECT * FROM Abc;
SELECT * FROM "Abc"; -- ERROR
DROP TABLE abc;

CREATE TABLE "Abc"(c1 int, c2 int);
SELECT relname FROM pg_class WHERE relname = 'ABC';
SELECT relname FROM pg_class WHERE relname = 'abc';
SELECT relname FROM pg_class WHERE relname = 'Abc';
SELECT * FROM "ABC"; -- ERROR
SELECT * FROM ABC; -- ERROR
SELECT * FROM abc; -- ERROR
SELECT * FROM Abc; -- ERROR
SELECT * FROM "Abc";
DROP TABLE "Abc";