Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
野花太放肆
oceanbase
提交
d30a2a77
O
oceanbase
项目概览
野花太放肆
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
1
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,体验更适合开发者的 AI 搜索 >>
提交
d30a2a77
编写于
2月 15, 2023
作者:
0
0xacc
提交者:
ob-robot
2月 15, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[to #42398480] fix NEW obj(...) syntax
上级
17bea01c
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
23 addition
and
0 deletion
+23
-0
src/pl/ob_pl_resolver.cpp
src/pl/ob_pl_resolver.cpp
+9
-0
src/sql/resolver/expr/ob_raw_expr.h
src/sql/resolver/expr/ob_raw_expr.h
+3
-0
src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp
src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp
+11
-0
未找到文件。
src/pl/ob_pl_resolver.cpp
浏览文件 @
d30a2a77
...
...
@@ -9802,11 +9802,15 @@ int ObPLResolver::resolve_qualified_name(ObQualifiedName &q_name,
if (q_name.is_pl_udf()) {
// 首先尝试下是不是复杂类型的构造函数
int64_t acc_cnt = q_name.access_idents_.count();
bool is_construct = false;
if (1 < acc_cnt && q_name.access_idents_.at(acc_cnt - 2).is_udt_ns()) {
// udt obj.func(), this func can not be a constructor
ret = OB_ERR_SP_UNDECLARED_TYPE;
} else {
OZ (resolve_construct(q_name, udf_info, expr), K(q_name));
if (OB_SUCC(ret)) {
is_construct = true;
}
}
// 其次尝试下是不是UDF
if (OB_ERR_SP_UNDECLARED_TYPE == ret || OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret) {
...
...
@@ -9815,6 +9819,11 @@ int ObPLResolver::resolve_qualified_name(ObQualifiedName &q_name,
OZ (access_name.push_back(ObString("SELF")));
OZ (resolve_udf(udf_info, access_name, unit_ast), q_name, udf_info);
}
if (OB_SUCC(ret) && is_construct == false && udf_info.is_new_keyword_used_) {
ret = OB_ERR_PARSER_SYNTAX;
LOG_WARN("NEW key word is only allowed for constructors", K(q_name));
}
} else { //如果是udf return access,需要当做var解析
if (OB_FAIL(resolve_var(q_name, unit_ast, expr))) {
LOG_WARN("failed to resolve var", K(q_name), K(ret));
...
...
src/sql/resolver/expr/ob_raw_expr.h
浏览文件 @
d30a2a77
...
...
@@ -948,6 +948,7 @@ struct ObUDFInfo
is_udt_udf_
(
false
),
is_contain_self_param_
(
false
),
is_udt_udf_inside_pkg_
(
false
),
is_new_keyword_used_
(
false
),
flag_
(
0
),
self_arg_
(
NULL
)
{}
...
...
@@ -997,6 +998,7 @@ struct ObUDFInfo
K_
(
is_udt_udf
),
K_
(
is_contain_self_param
),
K_
(
is_udt_udf_inside_pkg
),
K_
(
is_new_keyword_used
),
K_
(
flag
));
common
::
ObString
udf_name_
;
...
...
@@ -1009,6 +1011,7 @@ struct ObUDFInfo
bool
is_udt_udf_
;
// if this udf is udt object routine
bool
is_contain_self_param_
;
// self param is mocked.
bool
is_udt_udf_inside_pkg_
;
bool
is_new_keyword_used_
;
// if in NEW obj(...) form
uint64_t
flag_
;
ObRawExpr
*
self_arg_
;
// if this is udt routine, it has self argument
};
...
...
src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp
浏览文件 @
d30a2a77
...
...
@@ -1943,6 +1943,13 @@ int ObRawExprResolverImpl::resolve_obj_access_idents(const ParseNode &node, ObQu
LOG_WARN
(
"node is NULL"
,
K
(
node
.
num_child_
),
K
(
ret
));
}
else
{
ObString
ident_name
(
static_cast
<
int32_t
>
(
func_node
.
children_
[
0
]
->
str_len_
),
func_node
.
children_
[
0
]
->
str_value_
);
// first bit in value_ of T_FUN_SYS node is used to mark NEW keyword,
// value_ & 0x1 == 1: not used,
// value_ & 0x1 == 0: used,
// refer to sql_parser_oracle_mode.y
bool
is_new_key_word_used
=
!
(
func_node
.
value_
&
0x1
);
if
(
lib
::
is_oracle_mode
()
&&
T_PL_SCOPE
==
ctx_
.
current_scope_
&&
ident_name
.
empty
())
{
...
...
@@ -1964,6 +1971,9 @@ int ObRawExprResolverImpl::resolve_obj_access_idents(const ParseNode &node, ObQu
||
func_node
.
children_
[
2
]
->
type_
==
T_ALL
))
{
ret
=
OB_DISTINCT_NOT_ALLOWED
;
LOG_WARN
(
"distinct/all/unique not allowed here"
,
K
(
ret
));
}
else
if
(
is_new_key_word_used
&&
PL_UDF
!=
name_type
)
{
ret
=
OB_ERR_PARSER_SYNTAX
;
LOG_WARN
(
"NEW keyword is only allowed for constructors"
,
K
(
q_name
));
}
else
{
switch
(
name_type
)
{
case
SYS_FUNC
:
{
...
...
@@ -1990,6 +2000,7 @@ int ObRawExprResolverImpl::resolve_obj_access_idents(const ParseNode &node, ObQu
int64_t
cnt
=
q_name
.
access_idents_
.
count
();
ParseNode
*
udt_udf_self_param_node
=
NULL
;
ObRawExpr
*
self_param
=
NULL
;
access_ident
.
udf_info_
.
is_new_keyword_used_
=
is_new_key_word_used
;
if
(
OB_FAIL
(
ObResolverUtils
::
transform_func_sys_to_udf
(
&
ctx_
.
expr_factory_
.
get_allocator
(),
&
func_node
,
q_name
.
database_name_
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录