Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Metz
oceanbase
提交
d06570ba
O
oceanbase
项目概览
Metz
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d06570ba
编写于
11月 30, 2021
作者:
M
Monk-Liu
提交者:
LINGuanRen
11月 30, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support sql_mode "ANSI_QUOTES".
上级
ec9c2087
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
94 addition
and
14 deletion
+94
-14
deps/oblib/src/common/sql_mode/ob_sql_mode.h
deps/oblib/src/common/sql_mode/ob_sql_mode.h
+5
-0
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.cpp
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.cpp
+2
-1
src/sql/parser/sql_parser_mysql_mode.l
src/sql/parser/sql_parser_mysql_mode.l
+87
-13
未找到文件。
deps/oblib/src/common/sql_mode/ob_sql_mode.h
浏览文件 @
d06570ba
...
...
@@ -135,6 +135,11 @@ typedef uint64_t ObSQLMode;
is_true = (SMO_NO_BACKSLASH_ESCAPES & mode); \
}
#define IS_ANSI_QUOTES(mode, is_true) \
{ \
is_true = (SMO_ANSI_QUOTES & mode); \
}
#ifdef __cplusplus
}
#endif
...
...
deps/oblib/src/common/sql_mode/ob_sql_mode_utils.cpp
浏览文件 @
d06570ba
...
...
@@ -70,7 +70,8 @@ ObSQLMode SUPPORT_MODE = SMO_STRICT_ALL_TABLES
|
SMO_NO_KEY_OPTIONS
|
SMO_NO_TABLE_OPTIONS
|
SMO_NO_FIELD_OPTIONS
|
SMO_NO_BACKSLASH_ESCAPES
;
|
SMO_NO_BACKSLASH_ESCAPES
|
SMO_ANSI_QUOTES
;
bool
is_sql_mode_supported
(
ObSQLMode
mode
)
{
...
...
src/sql/parser/sql_parser_mysql_mode.l
浏览文件 @
d06570ba
...
...
@@ -34,6 +34,8 @@ extern void obsql_mysql_parser_fatal_error(yyconst char *msg, yyscan_t yyscanner
%x sq
%x dq
%x bt
/* the adq is used to process dq in ANSI_QUOTES sql_mode*/
%x adq
U [\x80-\xbf]
U_2 [\xc2-\xdf]
...
...
@@ -79,6 +81,7 @@ dqbegin {dquote}
dqend {dquote}
dqdouble {dquote}{dquote}
dqcontent [^\\\n\r"]+
adqcontent [^"]+
dqnewline {dquote}{whitespace}{dquote}
backtick `
...
...
@@ -631,20 +634,41 @@ FALSE {
}
{dqbegin} {
BEGIN(dq);
ParseResult *p = (ParseResult *)yyextra;
p->start_col_ = yylloc->first_column;
char **tmp_literal = &p->tmp_literal_;
if (*tmp_literal == NULL)
{
*tmp_literal = (char*) parse_malloc(p->input_sql_len_ + 1, p->malloc_pool_);
check_value(*tmp_literal);
}
malloc_new_node(yylval->node, p->malloc_pool_, T_VARCHAR, 0);
yylval->node->str_len_ = 0;
p->last_well_formed_len_ = 0;
if (IS_FAST_PARAMETERIZE && !IS_NEED_PARAMETERIZE) {
return OUTLINE_DEFAULT_TOKEN;
ObSQLMode mode = p->sql_mode_;
bool is_ansi_quotes = false;
IS_ANSI_QUOTES(mode, is_ansi_quotes);
if (is_ansi_quotes) {
BEGIN(adq);
if (IS_FAST_PARAMETERIZE) {
COPY_WRITE();
} else {
check_value(yylval);
p->start_col_ = yylloc->first_column;
char **tmp_literal = &p->tmp_literal_;
if (*tmp_literal == NULL)
{
*tmp_literal = (char*) parse_malloc(p->input_sql_len_ + 1, p->malloc_pool_);
check_value(*tmp_literal);
}
malloc_new_node(yylval->node, p->malloc_pool_, T_IDENT, 0);
yylval->node->str_len_ = 0;
}
} else {
BEGIN(dq);
p->start_col_ = yylloc->first_column;
char **tmp_literal = &p->tmp_literal_;
if (*tmp_literal == NULL)
{
*tmp_literal = (char*) parse_malloc(p->input_sql_len_ + 1, p->malloc_pool_);
check_value(*tmp_literal);
}
malloc_new_node(yylval->node, p->malloc_pool_, T_VARCHAR, 0);
yylval->node->str_len_ = 0;
p->last_well_formed_len_ = 0;
if (IS_FAST_PARAMETERIZE && !IS_NEED_PARAMETERIZE) {
return OUTLINE_DEFAULT_TOKEN;
}
}
}
...
...
@@ -745,6 +769,56 @@ FALSE {
return PARSER_SYNTAX_ERROR;
}
<adq>{dqdouble} {
if (IS_FAST_PARAMETERIZE) {
COPY_WRITE();
} else {
check_value(yylval);
((ParseResult *)yyextra)->tmp_literal_[yylval->node->str_len_++] = '"';
}
}
<adq>{adqcontent} {
if (IS_FAST_PARAMETERIZE) {
COPY_WRITE();
} else {
check_value(yylval);
memmove(((ParseResult *)yyextra)->tmp_literal_ + yylval->node->str_len_, yytext, yyleng);
yylval->node->str_len_ += yyleng;
}
}
<adq>{dqend} {
BEGIN(INITIAL);
if (IS_FAST_PARAMETERIZE) {
COPY_WRITE();
} else {
ParseResult *p = (ParseResult *)yyextra;
check_value(yylval);
yylloc->first_column = p->start_col_;
char *tmp_literal = p->tmp_literal_;
tmp_literal[yylval->node->str_len_] = '\0';
char *dup_value = NULL;
if (p->is_not_utf8_connection_) {
dup_value = parse_str_convert_utf8(p->charset_info_, tmp_literal, p->malloc_pool_, &(yylval->node->str_len_), &(p->extra_errno_));
check_identifier_convert_result(p->extra_errno_);
//fprintf(stderr, "parse identifier result, str=%s, str_len=%ld\n", node->str_value_, node->str_len_);
} else {
dup_value = parse_strndup(tmp_literal, yylval->node->str_len_ + 1, p->malloc_pool_);
}
check_value(dup_value);
yylval->node->str_value_ = dup_value;
setup_token_pos_info(yylval->node, yylloc->first_column, yylval->node->str_len_);
return NAME_OB;
}
}
<adq><<EOF>> {
yyerror(yylloc, yyextra, "unterminated backtick string\n");
return PARSER_SYNTAX_ERROR;
}
{btbegin} {
BEGIN(bt); /*fast parameterize don't handle connent in ``*/
if (IS_FAST_PARAMETERIZE) {
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录