添加GUC参数vb_casesensitive,设置数据库的大小写敏感。
如为on,则大小写敏感,则与现行数据库实现一致,加双引号大小写敏感,不加双引号默认小写大小写不敏感;如为off,大小写不敏感,即不管是否使用双引号,均视为小写
- guc参数设置
guc相关参数在guc.cpp中初始化,调用InitializeGUCOptions函数。其中bool类型的参数在InitConfigureNamesBool中初始化。
添加参数vb_casesensitive
// 在InitConfigureNamesBool函数,将参数加入到数组localConfigureNamesBool中
{{"vb_casesensitive",
PGC_USERSET, // 参数可被所有用户修改
QUERY_TUNING,
gettext_noop("case sensitive."),
NULL},
&u_sess->attr.attr_common.casesensitive, // 绑定knl_session_attr_common的casesensitive成员
false, // 默认值为false
NULL,
NULL,
NULL}
// 由于绑定的knl_session_attr_common的casesensitive成员,需要在knl_session_attr_common中增加该成员
bool casesensitive;
-- 语法解析中处理大小写
按需求,只要vb_casesensitive为off时,将对象名处理为小写。sql语句的执行需要先进行词法语法解析,可以在解析过程中去处理大小写。
gram.y中,名称如字段名表名等,都在ColId分支,type_function_name分支处理type,function的名称。在这两个分支中处理大小写。
// 在定义段增加函数定义
static char * dealwithCaseSensitive(char *name);
// 在代码段定义处理大小写的函数
static char *
dealwithCaseSensitive(char *name) {
if (name == NULL)
return name;
if (!u_sess->attr.attr_common.casesensitive) {
// vb_casesensitive为off时,处理成小写
int len = strlen(name);
for (int i = 0; i < len; i++) {
char ch = name[i];
if (ch >= 'A' && ch <= 'Z') {
ch += 'a' - 'A';
}
name[i] = ch;
}
}
return name;
}
// 在规则段增加处理
ColId: IDENT { $$ = dealwithCaseSensitive(pstrdup($1)); }
| unreserved_keyword { $$ = dealwithCaseSensitive(pstrdup($1)); }
| col_name_keyword { $$ = dealwithCaseSensitive(pstrdup($1)); }
;
/* Type/function identifier --- names that can be type or function names.
*/
type_function_name: IDENT { $$ = dealwithCaseSensitive(pstrdup($1)); }
| unreserved_keyword { $$ = dealwithCaseSensitive(pstrdup($1)); }
| type_func_name_keyword { $$ = dealwithCaseSensitive(pstrdup($1)); }
;
重新编译后,启动数据库,进入gsql命令行
postgres=# show vb_casesensitive;
vb_casesensitive
------------------------
off
(1 row)
postgres=# \d a
Did not find any relation named "a".
postgres=# create table "A"("ID" int);
CREATE TABLE
postgres=# \d a
Table "public.a"
Column | Type | Modifiers
--------+---------+-----------
id | integer |
postgres=#