空字符串转NULL功能
1. 目的
在Oracle数据库中,空字符串('')被视为NULL值,这是Oracle的一个重要特性。为了兼容Oracle的这一行为,IvorySQL提供了空字符串转NULL功能。当启用该功能后,SQL语句中的空字符串将自动转换为NULL值,从而保证Oracle应用程序在IvorySQL上的行为一致性。
2. 实现说明
参数 ivorysql.enable_emptystring_to_NULL 对应的GUC变量为 enable_emptystring_to_NULL。
在文件 ora_scan.l 中可以看到对这个变量的使用:
case xe:
yylval->str = litbufdup(yyscanner);
if (strcmp(yylval->str, "") == 0 &&
ORA_PARSER == compatible_db &&
enable_emptystring_to_NULL)
{
return NULL_P;
}
return SCONST;
其中 xe 代表被引号包围的字符串:
<xe> extended quoted strings (support backslash escape sequences)
上面代码的逻辑是,在词法分析时如果遇到空字符串,在空转NULL功能启用的情况下,返回 NULL_P,否则返回 SCONST。
在语法分析文件 ora_gram.y 里,对语句 insert into abc values(''); 是这样解析的:
values_clause:
VALUES '(' expr_list ')'
{
SelectStmt *n = makeNode(SelectStmt);
n->valuesLists = list_make1($3);
$$ = (Node *) n;
}
expr_list: a_expr
{
$$ = list_make1($1);
}
a_expr: c_expr { $$ = $1; }
c_expr: AexprConst { $$ = $1; }
AexprConst: Iconst
| Sconst
{
$$ = makeStringConst($1, @1);
}
| NULL_P
{
$$ = makeNullAConst(@1);
}
以上代码对词法分析时返回的 NULL_P 或者 SCONST 分别构建对应的节点进行处理。