添加GUC参数

添加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=# 

你可能感兴趣的:(添加GUC参数)