Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
大炮V587
oceanbase
提交
e57d864e
O
oceanbase
项目概览
大炮V587
/
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,发现更多精彩内容 >>
提交
e57d864e
编写于
12月 08, 2022
作者:
O
obdev
提交者:
ob-robot
1月 12, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixbug46241845: OB hits the wrong cached plan when rollup exprs contains const exprs
上级
0b093e2a
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
157 addition
and
244 deletion
+157
-244
src/sql/resolver/dml/ob_group_by_checker.cpp
src/sql/resolver/dml/ob_group_by_checker.cpp
+60
-17
src/sql/resolver/dml/ob_group_by_checker.h
src/sql/resolver/dml/ob_group_by_checker.h
+6
-2
src/sql/resolver/dml/ob_select_resolver.cpp
src/sql/resolver/dml/ob_select_resolver.cpp
+51
-70
src/sql/resolver/dml/ob_select_resolver.h
src/sql/resolver/dml/ob_select_resolver.h
+0
-2
src/sql/resolver/expr/ob_raw_expr.cpp
src/sql/resolver/expr/ob_raw_expr.cpp
+7
-3
src/sql/resolver/expr/ob_raw_expr.h
src/sql/resolver/expr/ob_raw_expr.h
+6
-2
src/sql/rewrite/ob_stmt_comparer.cpp
src/sql/rewrite/ob_stmt_comparer.cpp
+2
-0
src/sql/rewrite/ob_transform_pre_process.cpp
src/sql/rewrite/ob_transform_pre_process.cpp
+2
-2
src/sql/rewrite/ob_transform_utils.cpp
src/sql/rewrite/ob_transform_utils.cpp
+20
-133
src/sql/rewrite/ob_transform_utils.h
src/sql/rewrite/ob_transform_utils.h
+3
-13
未找到文件。
src/sql/resolver/dml/ob_group_by_checker.cpp
浏览文件 @
e57d864e
...
@@ -209,7 +209,7 @@ int ObGroupByChecker::check_groupby_valid(ObRawExpr *expr)
...
@@ -209,7 +209,7 @@ int ObGroupByChecker::check_groupby_valid(ObRawExpr *expr)
// eg:
// eg:
// select c1 +1 +2 from t1 having c1+1 >0; // it need check, report error
// select c1 +1 +2 from t1 having c1+1 >0; // it need check, report error
// select c1 from t1 having 1>0; // it don't need check, it will success
// select c1 from t1 having 1>0; // it don't need check, it will success
int
ObGroupByChecker
::
check_group_by
(
ObSelectStmt
*
ref_stmt
,
bool
has_having_self_column
/*default false*/
,
bool
has_group_by_clause
)
int
ObGroupByChecker
::
check_group_by
(
ObSelectStmt
*
ref_stmt
,
bool
has_having_self_column
,
bool
has_group_by_clause
,
bool
only_need_constraints
)
{
{
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
// group by checker
// group by checker
...
@@ -217,10 +217,11 @@ int ObGroupByChecker::check_group_by(ObSelectStmt *ref_stmt, bool has_having_sel
...
@@ -217,10 +217,11 @@ int ObGroupByChecker::check_group_by(ObSelectStmt *ref_stmt, bool has_having_sel
ret
=
OB_ERR_UNEXPECTED
;
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"stmt is null"
,
K
(
ret
));
LOG_WARN
(
"stmt is null"
,
K
(
ret
));
}
else
if
(
ref_stmt
->
has_group_by
()
||
}
else
if
(
ref_stmt
->
has_group_by
()
||
ref_stmt
->
has_rollup
()
||
ref_stmt
->
has_rollup
()
||
ref_stmt
->
has_grouping_sets
()
||
(
is_oracle_mode
()
&&
has_having_self_column
||
(
ref_stmt
->
has_grouping_sets
()
||
has_group_by_clause
)
{
has_having_self_column
||
has_group_by_clause
)))
{
ObSEArray
<
ObGroupbyExpr
,
4
>
all_grouping_sets_exprs
;
ObSEArray
<
ObGroupbyExpr
,
4
>
all_grouping_sets_exprs
;
ObSEArray
<
ObRawExpr
*
,
4
>
all_rollup_exprs
;
ObSEArray
<
ObRawExpr
*
,
4
>
all_rollup_exprs
;
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
ref_stmt
->
get_grouping_sets_items_size
();
++
i
)
{
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
ref_stmt
->
get_grouping_sets_items_size
();
++
i
)
{
...
@@ -257,9 +258,10 @@ int ObGroupByChecker::check_group_by(ObSelectStmt *ref_stmt, bool has_having_sel
...
@@ -257,9 +258,10 @@ int ObGroupByChecker::check_group_by(ObSelectStmt *ref_stmt, bool has_having_sel
&
all_grouping_sets_exprs
);
&
all_grouping_sets_exprs
);
checker
.
set_query_ctx
(
ref_stmt
->
get_query_ctx
());
checker
.
set_query_ctx
(
ref_stmt
->
get_query_ctx
());
checker
.
set_nested_aggr
(
ref_stmt
->
contain_nested_aggr
());
checker
.
set_nested_aggr
(
ref_stmt
->
contain_nested_aggr
());
checker
.
only_need_contraints_
=
only_need_constraints
;
if
(
OB_FAIL
(
checker
.
check_select_stmt
(
ref_stmt
)))
{
if
(
OB_FAIL
(
checker
.
check_select_stmt
(
ref_stmt
)))
{
LOG_WARN
(
"failed to check group by"
,
K
(
ret
));
LOG_WARN
(
"failed to check group by"
,
K
(
ret
));
}
else
{
}
else
if
(
!
only_need_constraints
)
{
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
ref_stmt
->
get_group_expr_size
();
i
++
)
{
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
ref_stmt
->
get_group_expr_size
();
i
++
)
{
if
(
OB_FAIL
(
check_groupby_valid
(
ref_stmt
->
get_group_exprs
().
at
(
i
))))
{
if
(
OB_FAIL
(
check_groupby_valid
(
ref_stmt
->
get_group_exprs
().
at
(
i
))))
{
LOG_WARN
(
"failed to check groupby valid."
,
K
(
ret
));
LOG_WARN
(
"failed to check groupby valid."
,
K
(
ret
));
...
@@ -341,9 +343,24 @@ bool ObGroupByChecker::find_in_rollup(ObRawExpr &expr)
...
@@ -341,9 +343,24 @@ bool ObGroupByChecker::find_in_rollup(ObRawExpr &expr)
LOG_DEBUG
(
"found in rollup exprs"
,
K
(
expr
));
LOG_DEBUG
(
"found in rollup exprs"
,
K
(
expr
));
}
}
}
}
if
(
OB_SUCCESS
==
check_ctx
.
err_code_
&&
!
found
&&
is_top_select_stmt
())
{
for
(
int64_t
nth_rollup
=
0
;
!
found
&&
nth_rollup
<
rollup_cnt
;
++
nth_rollup
)
{
//in oracle mode, only non static const expr will be replaced later in replace_group_by_exprs
if
(
is_mysql_mode
()
||
!
rollup_exprs_
->
at
(
nth_rollup
)
->
is_static_const_expr
())
{
check_ctx
.
reset
();
check_ctx
.
ignore_param_
=
true
;
check_ctx
.
override_const_compare_
=
true
;
check_ctx
.
override_query_compare_
=
true
;
if
(
expr
.
same_as
(
*
rollup_exprs_
->
at
(
nth_rollup
),
&
check_ctx
))
{
found
=
true
;
LOG_DEBUG
(
"found same structure in rollup exprs"
,
K
(
expr
));
}
}
}
}
}
}
if
(
OB_FAIL
(
ret
))
{
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
found
&&
OB_SUCCESS
==
check_ctx
.
err_code_
&&
lib
::
is_oracle_mode
()
)
{
}
else
if
(
found
&&
OB_SUCCESS
==
check_ctx
.
err_code_
)
{
if
(
OB_FAIL
(
append
(
query_ctx_
->
all_equal_param_constraints_
,
if
(
OB_FAIL
(
append
(
query_ctx_
->
all_equal_param_constraints_
,
check_ctx
.
equal_param_info_
)))
{
check_ctx
.
equal_param_info_
)))
{
LOG_WARN
(
"failed to append equal params constraints"
,
K
(
ret
));
LOG_WARN
(
"failed to append equal params constraints"
,
K
(
ret
));
...
@@ -376,7 +393,7 @@ bool ObGroupByChecker::find_in_group_by(ObRawExpr &expr)
...
@@ -376,7 +393,7 @@ bool ObGroupByChecker::find_in_group_by(ObRawExpr &expr)
}
}
}
}
if
(
OB_FAIL
(
ret
))
{
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
found
&&
OB_SUCCESS
==
check_ctx
.
err_code_
&&
lib
::
is_oracle_mode
()
)
{
}
else
if
(
found
&&
OB_SUCCESS
==
check_ctx
.
err_code_
)
{
// 这里抽取了两种约束:
// 这里抽取了两种约束:
// 1. select a+1 from t1 group by a+1 --> select a+? from t1 group by a+?
// 1. select a+1 from t1 group by a+1 --> select a+? from t1 group by a+?
// 抽取一种等值约束,使得只要是两个问号值相同就可以匹配,比如:
// 抽取一种等值约束,使得只要是两个问号值相同就可以匹配,比如:
...
@@ -479,7 +496,15 @@ int ObGroupByChecker::add_abs_equal_constraint_in_grouping_sets(ObConstRawExpr &
...
@@ -479,7 +496,15 @@ int ObGroupByChecker::add_abs_equal_constraint_in_grouping_sets(ObConstRawExpr &
}
}
// add precalc_constraint in transformer: expr > 0;
// add precalc_constraint in transformer: expr > 0;
}
else
{
}
else
{
//do nothing.
// same stucture, add pc const param constraint
ObStmtCompareContext
check_ctx
;
if
(
OB_FAIL
(
check_ctx
.
add_param_pair
(
expr
.
get_value
().
get_unknown
(),
NULL
)))
{
LOG_WARN
(
"fail to add param pair"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
check_ctx
.
add_param_pair
(
c_expr
->
get_value
().
get_unknown
(),
NULL
)))
{
LOG_WARN
(
"fail to add param pair"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
add_pc_const_param_info
(
check_ctx
)))
{
LOG_WARN
(
"failed to append pc constraints"
,
K
(
ret
));
}
}
}
}
}
}
}
...
@@ -574,7 +599,11 @@ int ObGroupByChecker::colref_belongs_to_check_stmt(ObRawExpr &expr, bool &belong
...
@@ -574,7 +599,11 @@ int ObGroupByChecker::colref_belongs_to_check_stmt(ObRawExpr &expr, bool &belong
int
ObGroupByChecker
::
visit
(
ObConstRawExpr
&
expr
)
int
ObGroupByChecker
::
visit
(
ObConstRawExpr
&
expr
)
{
{
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
if
(
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
if
(
is_mysql_mode
())
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
}
}
else
if
(
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
set_skip_expr
(
&
expr
);
}
else
if
(
OB_FAIL
(
add_abs_equal_constraint_in_grouping_sets
(
expr
)))
{
}
else
if
(
OB_FAIL
(
add_abs_equal_constraint_in_grouping_sets
(
expr
)))
{
LOG_WARN
(
"fail to add abs_equal constraintd"
,
K
(
ret
));
LOG_WARN
(
"fail to add abs_equal constraintd"
,
K
(
ret
));
...
@@ -585,7 +614,9 @@ int ObGroupByChecker::visit(ObConstRawExpr &expr)
...
@@ -585,7 +614,9 @@ int ObGroupByChecker::visit(ObConstRawExpr &expr)
int
ObGroupByChecker
::
visit
(
ObExecParamRawExpr
&
expr
)
int
ObGroupByChecker
::
visit
(
ObExecParamRawExpr
&
expr
)
{
{
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
if
(
OB_ISNULL
(
expr
.
get_ref_expr
()))
{
if
(
only_need_contraints_
)
{
// do nothing
}
else
if
(
OB_ISNULL
(
expr
.
get_ref_expr
()))
{
ret
=
OB_ERR_UNEXPECTED
;
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"ref expr is invalid"
,
K
(
ret
));
LOG_WARN
(
"ref expr is invalid"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
expr
.
get_ref_expr
()
->
preorder_accept
(
*
this
)))
{
}
else
if
(
OB_FAIL
(
expr
.
get_ref_expr
()
->
preorder_accept
(
*
this
)))
{
...
@@ -627,7 +658,7 @@ int ObGroupByChecker::check_select_stmt(const ObSelectStmt *ref_stmt)
...
@@ -627,7 +658,7 @@ int ObGroupByChecker::check_select_stmt(const ObSelectStmt *ref_stmt)
// non ref query
// non ref query
}
else
{
}
else
{
int32_t
ignore_scope
=
0
;
int32_t
ignore_scope
=
0
;
if
(
is_top_select_stmt
())
{
if
(
is_top_select_stmt
()
||
only_need_contraints_
)
{
// 当前select stmt,则仅仅check having, select item, order
// 当前select stmt,则仅仅check having, select item, order
// eg:
// eg:
// select c1,c2,(select d2 from t2 where t1.c1=t2.d1) as c3 from t1 group by c1,c2;
// select c1,c2,(select d2 from t2 where t1.c1=t2.d1) as c3 from t1 group by c1,c2;
...
@@ -676,7 +707,7 @@ int ObGroupByChecker::check_select_stmt(const ObSelectStmt *ref_stmt)
...
@@ -676,7 +707,7 @@ int ObGroupByChecker::check_select_stmt(const ObSelectStmt *ref_stmt)
ret
=
tmp_ret
;
ret
=
tmp_ret
;
LOG_WARN
(
"failed to pop back stmt"
,
K
(
ret
));
LOG_WARN
(
"failed to pop back stmt"
,
K
(
ret
));
}
}
if
(
OB_SUCC
(
ret
))
{
if
(
OB_SUCC
(
ret
)
&&
!
only_need_contraints_
)
{
const
ObIArray
<
ObSelectStmt
*>
&
child_stmts
=
ref_stmt
->
get_set_query
();
const
ObIArray
<
ObSelectStmt
*>
&
child_stmts
=
ref_stmt
->
get_set_query
();
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
child_stmts
.
count
();
++
i
)
{
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
child_stmts
.
count
();
++
i
)
{
ret
=
check_select_stmt
(
child_stmts
.
at
(
i
));
ret
=
check_select_stmt
(
child_stmts
.
at
(
i
));
...
@@ -698,7 +729,7 @@ int ObGroupByChecker::visit(ObQueryRefRawExpr &expr)
...
@@ -698,7 +729,7 @@ int ObGroupByChecker::visit(ObQueryRefRawExpr &expr)
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
set_skip_expr
(
&
expr
);
}
else
{
}
else
if
(
!
only_need_contraints_
)
{
const
ObSelectStmt
*
ref_stmt
=
expr
.
get_ref_stmt
();
const
ObSelectStmt
*
ref_stmt
=
expr
.
get_ref_stmt
();
if
(
OB_FAIL
(
check_select_stmt
(
ref_stmt
)))
{
if
(
OB_FAIL
(
check_select_stmt
(
ref_stmt
)))
{
LOG_WARN
(
"failed to check select stmt"
,
K
(
ret
));
LOG_WARN
(
"failed to check select stmt"
,
K
(
ret
));
...
@@ -716,7 +747,11 @@ int ObGroupByChecker::visit(ObColumnRefRawExpr &expr)
...
@@ -716,7 +747,11 @@ int ObGroupByChecker::visit(ObColumnRefRawExpr &expr)
{
{
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
bool
belongs_to
=
true
;
bool
belongs_to
=
true
;
if
(
OB_FAIL
(
colref_belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
if
(
only_need_contraints_
)
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
}
}
else
if
(
OB_FAIL
(
colref_belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
LOG_WARN
(
"failed to get belongs to stmt"
,
K
(
ret
));
LOG_WARN
(
"failed to get belongs to stmt"
,
K
(
ret
));
}
else
if
(
belongs_to
)
{
}
else
if
(
belongs_to
)
{
// expr is in the current stmt
// expr is in the current stmt
...
@@ -763,6 +798,8 @@ int ObGroupByChecker::visit(ObOpRawExpr &expr)
...
@@ -763,6 +798,8 @@ int ObGroupByChecker::visit(ObOpRawExpr &expr)
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
set_skip_expr
(
&
expr
);
}
else
if
(
only_need_contraints_
)
{
// do nothing
}
else
{
}
else
{
switch
(
expr
.
get_expr_type
())
{
switch
(
expr
.
get_expr_type
())
{
case
T_OP_CONNECT_BY_ROOT
:
case
T_OP_CONNECT_BY_ROOT
:
...
@@ -803,6 +840,8 @@ int ObGroupByChecker::visit(ObAggFunRawExpr &expr)
...
@@ -803,6 +840,8 @@ int ObGroupByChecker::visit(ObAggFunRawExpr &expr)
// then a.d2 that is in max(a.d2) is not in group by d1, it will report error
// then a.d2 that is in max(a.d2) is not in group by d1, it will report error
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
set_skip_expr
(
&
expr
);
}
else
if
(
only_need_contraints_
)
{
// do nothing
}
else
if
(
OB_FAIL
(
belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
}
else
if
(
OB_FAIL
(
belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
LOG_WARN
(
"failed to get belongs to stmt"
,
K
(
ret
));
LOG_WARN
(
"failed to get belongs to stmt"
,
K
(
ret
));
}
else
if
(
belongs_to
)
{
}
else
if
(
belongs_to
)
{
...
@@ -825,7 +864,7 @@ int ObGroupByChecker::visit(ObSysFunRawExpr &expr)
...
@@ -825,7 +864,7 @@ int ObGroupByChecker::visit(ObSysFunRawExpr &expr)
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
set_skip_expr
(
&
expr
);
}
else
{
}
else
if
(
!
only_need_contraints_
)
{
if
(
T_FUN_SYS_ROWNUM
==
expr
.
get_expr_type
())
{
if
(
T_FUN_SYS_ROWNUM
==
expr
.
get_expr_type
())
{
bool
belongs_to
=
true
;
bool
belongs_to
=
true
;
if
(
OB_FAIL
(
belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
if
(
OB_FAIL
(
belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
...
@@ -875,7 +914,11 @@ int ObGroupByChecker::visit(ObPseudoColumnRawExpr &expr)
...
@@ -875,7 +914,11 @@ int ObGroupByChecker::visit(ObPseudoColumnRawExpr &expr)
{
{
int
ret
=
OB_SUCCESS
;
int
ret
=
OB_SUCCESS
;
bool
belongs_to
=
true
;
bool
belongs_to
=
true
;
if
(
OB_FAIL
(
belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
if
(
only_need_contraints_
)
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
set_skip_expr
(
&
expr
);
}
}
else
if
(
OB_FAIL
(
belongs_to_check_stmt
(
expr
,
belongs_to
)))
{
LOG_WARN
(
"failed to get belongs to stmt"
,
K
(
ret
));
LOG_WARN
(
"failed to get belongs to stmt"
,
K
(
ret
));
}
else
if
(
belongs_to
)
{
}
else
if
(
belongs_to
)
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
if
(
find_in_group_by
(
expr
)
||
find_in_rollup
(
expr
)
||
find_in_grouping_sets
(
expr
))
{
...
...
src/sql/resolver/dml/ob_group_by_checker.h
浏览文件 @
e57d864e
...
@@ -37,7 +37,8 @@ public:
...
@@ -37,7 +37,8 @@ public:
query_ctx_
(
nullptr
),
query_ctx_
(
nullptr
),
has_nested_aggr_
(
false
),
has_nested_aggr_
(
false
),
is_check_order_by_
(
false
),
is_check_order_by_
(
false
),
dblink_groupby_expr_
(
NULL
)
dblink_groupby_expr_
(
NULL
),
only_need_contraints_
(
false
)
{}
{}
virtual
~
ObGroupByChecker
()
virtual
~
ObGroupByChecker
()
{}
{}
...
@@ -74,6 +75,8 @@ private:
...
@@ -74,6 +75,8 @@ private:
bool
has_nested_aggr_
;
bool
has_nested_aggr_
;
bool
is_check_order_by_
;
bool
is_check_order_by_
;
common
::
ObIArray
<
ObRawExpr
*>
*
dblink_groupby_expr_
;
common
::
ObIArray
<
ObRawExpr
*>
*
dblink_groupby_expr_
;
// if true, only add constraints for shared exprs which will be replaced in replace_stmt_expr_with_groupby_exprs
bool
only_need_contraints_
;
private:
private:
// Top select stmt 是指当前调用group by checker的select_stmt,不是select_stmt的level
// Top select stmt 是指当前调用group by checker的select_stmt,不是select_stmt的level
// 其他select_stmt会每进入一层,递增一层,同时检查结束退出,会递减一层
// 其他select_stmt会每进入一层,递增一层,同时检查结束退出,会递减一层
...
@@ -100,7 +103,8 @@ public:
...
@@ -100,7 +103,8 @@ public:
// all functions below should only called in resolver
// all functions below should only called in resolver
static
int
check_group_by
(
ObSelectStmt
*
ref_stmt
,
static
int
check_group_by
(
ObSelectStmt
*
ref_stmt
,
bool
has_having_self_column
,
bool
has_having_self_column
,
bool
has_group_by_clause
);
bool
has_group_by_clause
,
bool
only_need_constraints
);
static
int
check_groupby_valid
(
ObRawExpr
*
expr
);
static
int
check_groupby_valid
(
ObRawExpr
*
expr
);
static
int
check_by_expr
(
static
int
check_by_expr
(
const
ObSelectStmt
*
ref_stmt
,
const
ObSelectStmt
*
ref_stmt
,
...
...
src/sql/resolver/dml/ob_select_resolver.cpp
浏览文件 @
e57d864e
...
@@ -740,9 +740,11 @@ int ObSelectResolver::check_group_by()
...
@@ -740,9 +740,11 @@ int ObSelectResolver::check_group_by()
ObSelectStmt
*
select_stmt
=
get_select_stmt
();
ObSelectStmt
*
select_stmt
=
get_select_stmt
();
CK
(
OB_NOT_NULL
(
select_stmt
),
OB_NOT_NULL
(
session_info_
));
CK
(
OB_NOT_NULL
(
select_stmt
),
OB_NOT_NULL
(
session_info_
));
CK
(
OB_NOT_NULL
(
select_stmt
->
get_query_ctx
()));
CK
(
OB_NOT_NULL
(
select_stmt
->
get_query_ctx
()));
bool
only_need_constraints
=
true
;
if
(
is_only_full_group_by_on
(
session_info_
->
get_sql_mode
())
&&
if
(
is_only_full_group_by_on
(
session_info_
->
get_sql_mode
())
&&
!
select_stmt
->
get_query_ctx
()
->
is_prepare_stmt
())
{
!
select_stmt
->
get_query_ctx
()
->
is_prepare_stmt
())
{
if
(
is_oracle_mode
())
{
if
(
is_oracle_mode
())
{
only_need_constraints
=
false
;
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
select_stmt
->
get_group_expr_size
();
i
++
)
{
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
select_stmt
->
get_group_expr_size
();
i
++
)
{
ObRawExpr
*
group_by_expr
=
NULL
;
ObRawExpr
*
group_by_expr
=
NULL
;
if
(
OB_ISNULL
(
group_by_expr
=
select_stmt
->
get_group_exprs
().
at
(
i
)))
{
if
(
OB_ISNULL
(
group_by_expr
=
select_stmt
->
get_group_exprs
().
at
(
i
)))
{
...
@@ -795,54 +797,6 @@ int ObSelectResolver::check_group_by()
...
@@ -795,54 +797,6 @@ int ObSelectResolver::check_group_by()
LOG_WARN
(
"failed to check multi rollup items valid"
,
K
(
ret
));
LOG_WARN
(
"failed to check multi rollup items valid"
,
K
(
ret
));
}
else
{
/*do nothing*/
}
}
else
{
/*do nothing*/
}
}
}
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
OB_FAIL
(
ObGroupByChecker
::
check_group_by
(
select_stmt
,
having_has_self_column_
,
has_group_by_clause
())))
{
LOG_WARN
(
"failed to check group by in oracle mode"
);
}
else
if
(
OB_ISNULL
(
params_
.
param_list_
)
||
OB_ISNULL
(
params_
.
query_ctx_
))
{
// do nothing
LOG_DEBUG
(
"null obj"
,
K
(
params_
.
param_list_
),
K
(
params_
.
query_ctx_
));
}
else
if
(
NULL
!=
params_
.
secondary_namespace_
)
{
//处于PL的prepare阶段,跳过即可
}
else
{
// group by checker只是把表达式中常量的index存在了常量约束里,需要在这里回填obj
// 填充all_plan_const_param_constraints_中的obj
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
params_
.
query_ctx_
->
all_plan_const_param_constraints_
.
count
();
i
++
)
{
ObPCConstParamInfo
&
const_param_info
=
params_
.
query_ctx_
->
all_plan_const_param_constraints_
.
at
(
i
);
const_param_info
.
const_params_
.
reset
();
for
(
int64_t
j
=
0
;
OB_SUCC
(
ret
)
&&
j
<
const_param_info
.
const_idx_
.
count
();
j
++
)
{
int64_t
idx
=
const_param_info
.
const_idx_
.
at
(
j
);
if
(
idx
<
0
||
idx
>=
params_
.
param_list_
->
count
())
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid index"
,
K
(
ret
),
K
(
idx
),
K
(
i
),
K
(
j
));
}
else
if
(
OB_FAIL
(
const_param_info
.
const_params_
.
push_back
(
params_
.
param_list_
->
at
(
idx
))))
{
LOG_WARN
(
"failed to push back element"
,
K
(
ret
));
}
else
{
// do nothing
}
}
}
// for end
// 填充all_possible_const_param_constraints_中的obj
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
params_
.
query_ctx_
->
all_possible_const_param_constraints_
.
count
();
i
++
)
{
ObPCConstParamInfo
&
const_param_info
=
params_
.
query_ctx_
->
all_possible_const_param_constraints_
.
at
(
i
);
const_param_info
.
const_params_
.
reset
();
for
(
int64_t
j
=
0
;
OB_SUCC
(
ret
)
&&
j
<
const_param_info
.
const_idx_
.
count
();
j
++
)
{
int64_t
idx
=
const_param_info
.
const_idx_
.
at
(
j
);
if
(
idx
<
0
||
idx
>=
params_
.
param_list_
->
count
())
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid index"
,
K
(
ret
),
K
(
idx
),
K
(
i
),
K
(
j
));
}
else
if
(
OB_FAIL
(
const_param_info
.
const_params_
.
push_back
(
params_
.
param_list_
->
at
(
idx
))))
{
LOG_WARN
(
"failed to push back element"
,
K
(
ret
));
}
else
{
// do nothing
}
}
}
// for end
}
}
else
{
}
else
{
//在解析过程中,standard group checker会记录需要检查的column和expr,在所有语句都解析完成后
//在解析过程中,standard group checker会记录需要检查的column和expr,在所有语句都解析完成后
if
(
OB_FAIL
(
standard_group_checker_
.
check_only_full_group_by
()))
{
if
(
OB_FAIL
(
standard_group_checker_
.
check_only_full_group_by
()))
{
...
@@ -851,39 +805,66 @@ int ObSelectResolver::check_group_by()
...
@@ -851,39 +805,66 @@ int ObSelectResolver::check_group_by()
}
}
}
}
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
OB_FAIL
(
ObGroupByChecker
::
check_group_by
(
select_stmt
,
having_has_self_column_
,
has_group_by_clause
(),
only_need_constraints
)))
{
LOG_WARN
(
"failed to check group by in oracle mode"
);
}
else
if
(
OB_ISNULL
(
params_
.
param_list_
)
||
OB_ISNULL
(
params_
.
query_ctx_
))
{
// do nothing
LOG_DEBUG
(
"null obj"
,
K
(
params_
.
param_list_
),
K
(
params_
.
query_ctx_
));
}
else
if
(
NULL
!=
params_
.
secondary_namespace_
)
{
//处于PL的prepare阶段,跳过即可
}
else
{
// group by checker只是把表达式中常量的index存在了常量约束里,需要在这里回填obj
// 填充all_plan_const_param_constraints_中的obj
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
params_
.
query_ctx_
->
all_plan_const_param_constraints_
.
count
();
i
++
)
{
ObPCConstParamInfo
&
const_param_info
=
params_
.
query_ctx_
->
all_plan_const_param_constraints_
.
at
(
i
);
const_param_info
.
const_params_
.
reset
();
for
(
int64_t
j
=
0
;
OB_SUCC
(
ret
)
&&
j
<
const_param_info
.
const_idx_
.
count
();
j
++
)
{
int64_t
idx
=
const_param_info
.
const_idx_
.
at
(
j
);
if
(
idx
<
0
||
idx
>=
params_
.
param_list_
->
count
())
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid index"
,
K
(
ret
),
K
(
idx
),
K
(
i
),
K
(
j
));
}
else
if
(
OB_FAIL
(
const_param_info
.
const_params_
.
push_back
(
params_
.
param_list_
->
at
(
idx
))))
{
LOG_WARN
(
"failed to push back element"
,
K
(
ret
));
}
else
{
// do nothing
}
}
}
// for end
// 填充all_possible_const_param_constraints_中的obj
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
params_
.
query_ctx_
->
all_possible_const_param_constraints_
.
count
();
i
++
)
{
ObPCConstParamInfo
&
const_param_info
=
params_
.
query_ctx_
->
all_possible_const_param_constraints_
.
at
(
i
);
const_param_info
.
const_params_
.
reset
();
for
(
int64_t
j
=
0
;
OB_SUCC
(
ret
)
&&
j
<
const_param_info
.
const_idx_
.
count
();
j
++
)
{
int64_t
idx
=
const_param_info
.
const_idx_
.
at
(
j
);
if
(
idx
<
0
||
idx
>=
params_
.
param_list_
->
count
())
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid index"
,
K
(
ret
),
K
(
idx
),
K
(
i
),
K
(
j
));
}
else
if
(
OB_FAIL
(
const_param_info
.
const_params_
.
push_back
(
params_
.
param_list_
->
at
(
idx
))))
{
LOG_WARN
(
"failed to push back element"
,
K
(
ret
));
}
else
{
// do nothing
}
}
}
// for end
}
// replace with same group by columns.
// replace with same group by columns.
// groupby之上的计算我们放在这里统一处理:
// groupby之上的计算我们放在这里统一处理:
// 1. select item/having/order item中的表达式树(子树)需要每个都在group by列中找到
// 1. select item/having/order item中的表达式树(子树)需要每个都在group by列中找到
// 2. 递归查找是否在groupby列中,将在groupby的列的指针替换。
// 2. 递归查找是否在groupby列中,将在groupby的列的指针替换。
if
(
OB_SUCC
(
ret
))
{
if
(
OB_SUCC
(
ret
))
{
if
(
OB_FAIL
(
replace_stmt_expr_with_groupby_exprs
(
select_stmt
,
params_
.
query_ctx_
)))
{
if
(
OB_FAIL
(
ObTransformUtils
::
replace_stmt_expr_with_groupby_exprs
(
select_stmt
,
NULL
)))
{
LOG_WARN
(
"failed to replace stmt expr with groupby columns"
,
K
(
ret
));
LOG_WARN
(
"failed to replace stmt expr with groupby columns"
,
K
(
ret
));
}
}
}
}
return
ret
;
return
ret
;
}
}
int
ObSelectResolver
::
replace_stmt_expr_with_groupby_exprs
(
ObSelectStmt
*
select_stmt
,
ObQueryCtx
*
query_ctx
)
{
int
ret
=
OB_SUCCESS
;
ObSEArray
<
ObPCConstParamInfo
,
4
>
pc_constraints
;
ObSEArray
<
ObPCParamEqualInfo
,
4
>
eq_constraints
;
if
(
OB_ISNULL
(
query_ctx
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"unexpected null"
,
K
(
ret
),
K
(
query_ctx
));
}
else
if
(
OB_FAIL
(
ObTransformUtils
::
inner_replace_stmt_expr_with_groupby_exprs
(
select_stmt
,
params_
.
param_list_
,
pc_constraints
,
eq_constraints
)))
{
LOG_WARN
(
"failed to replace stmt expr with groupby columns"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
append_array_no_dup
(
query_ctx
->
all_plan_const_param_constraints_
,
pc_constraints
)))
{
LOG_WARN
(
"failed to append const param info"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
append_array_no_dup
(
query_ctx
->
all_possible_const_param_constraints_
,
pc_constraints
)))
{
LOG_WARN
(
"failed to append const param info"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
append_array_no_dup
(
query_ctx
->
all_equal_param_constraints_
,
eq_constraints
)))
{
LOG_WARN
(
"failed to append const param info"
,
K
(
ret
));
}
return
ret
;
}
// 1. lob type can't be ordered
// 1. lob type can't be ordered
// 2. the order item should be exists in select items if has distinct
// 2. the order item should be exists in select items if has distinct
int
ObSelectResolver
::
check_order_by
()
int
ObSelectResolver
::
check_order_by
()
...
...
src/sql/resolver/dml/ob_select_resolver.h
浏览文件 @
e57d864e
...
@@ -428,8 +428,6 @@ private:
...
@@ -428,8 +428,6 @@ private:
int
add_name_for_anonymous_view
();
int
add_name_for_anonymous_view
();
int
add_name_for_anonymous_view_recursive
(
TableItem
*
table_item
);
int
add_name_for_anonymous_view_recursive
(
TableItem
*
table_item
);
int
replace_stmt_expr_with_groupby_exprs
(
ObSelectStmt
*
select_stmt
,
ObQueryCtx
*
query_ctx
);
int
is_need_check_col_dup
(
const
ObRawExpr
*
expr
,
bool
&
need_check
);
int
is_need_check_col_dup
(
const
ObRawExpr
*
expr
,
bool
&
need_check
);
protected:
protected:
// data members
// data members
...
...
src/sql/resolver/expr/ob_raw_expr.cpp
浏览文件 @
e57d864e
...
@@ -805,11 +805,15 @@ bool ObExprEqualCheckContext::compare_const(const ObConstRawExpr &left,
...
@@ -805,11 +805,15 @@ bool ObExprEqualCheckContext::compare_const(const ObConstRawExpr &left,
int
&
ret
=
err_code_
;
int
&
ret
=
err_code_
;
bool
result
=
false
;
bool
result
=
false
;
if
(
left
.
get_result_type
()
==
right
.
get_result_type
())
{
if
(
left
.
get_result_type
()
==
right
.
get_result_type
())
{
const
ObObj
&
this_value
=
left
.
get_value
().
is_unknown
()
?
if
(
ignore_param_
&&
(
left
.
get_value
().
is_unknown
()
||
right
.
get_value
().
is_unknown
()))
{
result
=
true
;
}
else
{
const
ObObj
&
this_value
=
left
.
get_value
().
is_unknown
()
?
left
.
get_result_type
().
get_param
()
:
left
.
get_value
();
left
.
get_result_type
().
get_param
()
:
left
.
get_value
();
const
ObObj
&
other_value
=
right
.
get_value
().
is_unknown
()
?
const
ObObj
&
other_value
=
right
.
get_value
().
is_unknown
()
?
right
.
get_result_type
().
get_param
()
:
right
.
get_value
();
right
.
get_result_type
().
get_param
()
:
right
.
get_value
();
result
=
this_value
.
is_equal
(
other_value
,
CS_TYPE_BINARY
);
result
=
this_value
.
is_equal
(
other_value
,
CS_TYPE_BINARY
);
}
}
}
if
(
OB_SUCC
(
ret
)
&&
result
&&
left
.
get_value
().
is_unknown
())
{
if
(
OB_SUCC
(
ret
)
&&
result
&&
left
.
get_value
().
is_unknown
())
{
if
(
OB_FAIL
(
add_param_pair
(
left
.
get_value
().
get_unknown
(),
NULL
)))
{
if
(
OB_FAIL
(
add_param_pair
(
left
.
get_value
().
get_unknown
(),
NULL
)))
{
...
...
src/sql/resolver/expr/ob_raw_expr.h
浏览文件 @
e57d864e
...
@@ -1191,7 +1191,8 @@ struct ObExprEqualCheckContext
...
@@ -1191,7 +1191,8 @@ struct ObExprEqualCheckContext
override_set_op_compare_
(
false
),
override_set_op_compare_
(
false
),
err_code_
(
common
::
OB_SUCCESS
),
err_code_
(
common
::
OB_SUCCESS
),
param_expr_
(),
param_expr_
(),
need_check_deterministic_
(
false
)
need_check_deterministic_
(
false
),
ignore_param_
(
false
)
{
}
{
}
ObExprEqualCheckContext
(
bool
need_check_deterministic
)
ObExprEqualCheckContext
(
bool
need_check_deterministic
)
:
override_const_compare_
(
false
),
:
override_const_compare_
(
false
),
...
@@ -1202,7 +1203,8 @@ struct ObExprEqualCheckContext
...
@@ -1202,7 +1203,8 @@ struct ObExprEqualCheckContext
override_set_op_compare_
(
false
),
override_set_op_compare_
(
false
),
err_code_
(
common
::
OB_SUCCESS
),
err_code_
(
common
::
OB_SUCCESS
),
param_expr_
(),
param_expr_
(),
need_check_deterministic_
(
need_check_deterministic
)
need_check_deterministic_
(
need_check_deterministic
),
ignore_param_
(
false
)
{
}
{
}
virtual
~
ObExprEqualCheckContext
()
{}
virtual
~
ObExprEqualCheckContext
()
{}
struct
ParamExprPair
struct
ParamExprPair
...
@@ -1248,6 +1250,7 @@ struct ObExprEqualCheckContext
...
@@ -1248,6 +1250,7 @@ struct ObExprEqualCheckContext
err_code_
=
OB_SUCCESS
;
err_code_
=
OB_SUCCESS
;
param_expr_
.
reset
();
param_expr_
.
reset
();
need_check_deterministic_
=
false
;
need_check_deterministic_
=
false
;
ignore_param_
=
false
;
}
}
bool
override_const_compare_
;
bool
override_const_compare_
;
bool
override_column_compare_
;
bool
override_column_compare_
;
...
@@ -1259,6 +1262,7 @@ struct ObExprEqualCheckContext
...
@@ -1259,6 +1262,7 @@ struct ObExprEqualCheckContext
//when compare with T_QUESTIONMARK, as T_QUESTIONMARK is unkown, record this first.
//when compare with T_QUESTIONMARK, as T_QUESTIONMARK is unkown, record this first.
common
::
ObSEArray
<
ParamExprPair
,
3
,
common
::
ModulePageAllocator
,
true
>
param_expr_
;
common
::
ObSEArray
<
ParamExprPair
,
3
,
common
::
ModulePageAllocator
,
true
>
param_expr_
;
bool
need_check_deterministic_
;
bool
need_check_deterministic_
;
bool
ignore_param_
;
// only compare structure of expr
};
};
struct
ObExprParamCheckContext
:
ObExprEqualCheckContext
struct
ObExprParamCheckContext
:
ObExprEqualCheckContext
...
...
src/sql/rewrite/ob_stmt_comparer.cpp
浏览文件 @
e57d864e
...
@@ -189,6 +189,8 @@ bool ObStmtCompareContext::compare_const(const ObConstRawExpr &left, const ObCon
...
@@ -189,6 +189,8 @@ bool ObStmtCompareContext::compare_const(const ObConstRawExpr &left, const ObCon
}
}
}
else
if
(
is_left_calc_item
||
is_right_calc_item
)
{
}
else
if
(
is_left_calc_item
||
is_right_calc_item
)
{
bret
=
false
;
bret
=
false
;
}
else
if
(
ignore_param_
)
{
bret
=
ObExprEqualCheckContext
::
compare_const
(
left
,
right
);
}
else
if
(
left
.
get_result_type
().
get_param
().
is_equal
(
}
else
if
(
left
.
get_result_type
().
get_param
().
is_equal
(
right
.
get_result_type
().
get_param
(),
CS_TYPE_BINARY
))
{
right
.
get_result_type
().
get_param
(),
CS_TYPE_BINARY
))
{
ObPCParamEqualInfo
info
;
ObPCParamEqualInfo
info
;
...
...
src/sql/rewrite/ob_transform_pre_process.cpp
浏览文件 @
e57d864e
...
@@ -1237,7 +1237,7 @@ int ObTransformPreProcess::create_set_view_stmt(ObSelectStmt *origin_stmt,
...
@@ -1237,7 +1237,7 @@ int ObTransformPreProcess::create_set_view_stmt(ObSelectStmt *origin_stmt,
1
1
so that 1 in "select c1-1 from t1 group by grouping sets(c1,1);" share same expr.
so that 1 in "select c1-1 from t1 group by grouping sets(c1,1);" share same expr.
*/
*/
if
(
OB_FAIL
(
ObTransformUtils
::
replace_stmt_expr_with_groupby_exprs
(
origin_stmt
,
ctx_
,
true
)))
{
if
(
OB_FAIL
(
ObTransformUtils
::
replace_stmt_expr_with_groupby_exprs
(
origin_stmt
,
ctx_
)))
{
LOG_WARN
(
"failed to replace stmt expr with groupby columns"
,
K
(
ret
));
LOG_WARN
(
"failed to replace stmt expr with groupby columns"
,
K
(
ret
));
}
}
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
count
;
i
++
)
{
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
count
;
i
++
)
{
...
@@ -1277,7 +1277,7 @@ int ObTransformPreProcess::create_set_view_stmt(ObSelectStmt *origin_stmt,
...
@@ -1277,7 +1277,7 @@ int ObTransformPreProcess::create_set_view_stmt(ObSelectStmt *origin_stmt,
groupby_stmt
->
get_window_func_exprs
().
reset
();
groupby_stmt
->
get_window_func_exprs
().
reset
();
ObSEArray
<
ObRawExpr
*
,
4
>
old_exprs
;
ObSEArray
<
ObRawExpr
*
,
4
>
old_exprs
;
ObSEArray
<
ObRawExpr
*
,
4
>
new_exprs
;
ObSEArray
<
ObRawExpr
*
,
4
>
new_exprs
;
if
(
OB_FAIL
(
ObTransformUtils
::
replace_stmt_expr_with_groupby_exprs
(
groupby_stmt
,
ctx_
)))
{
if
(
OB_FAIL
(
ObTransformUtils
::
replace_stmt_expr_with_groupby_exprs
(
groupby_stmt
,
NULL
)))
{
LOG_WARN
(
"failed to replace stmt expr with groupby columns"
,
K
(
ret
));
LOG_WARN
(
"failed to replace stmt expr with groupby columns"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
create_select_list_from_grouping_sets
(
groupby_stmt
,
}
else
if
(
OB_FAIL
(
create_select_list_from_grouping_sets
(
groupby_stmt
,
groupby_exprs_list
,
groupby_exprs_list
,
...
...
src/sql/rewrite/ob_transform_utils.cpp
浏览文件 @
e57d864e
...
@@ -9168,32 +9168,9 @@ int ObTransformUtils::add_const_param_constraints(ObRawExpr *expr,
...
@@ -9168,32 +9168,9 @@ int ObTransformUtils::add_const_param_constraints(ObRawExpr *expr,
return ret;
return ret;
}
}
int ObTransformUtils::replace_stmt_expr_with_groupby_exprs(ObSelectStmt *select_stmt,
ObTransformerCtx *trans_ctx,
bool need_check_add_expr) {
int ret = OB_SUCCESS;
ObPhysicalPlanCtx *plan_ctx = NULL;
ObSEArray<ObPCConstParamInfo, 4> pc_constraints;
ObSEArray<ObPCParamEqualInfo, 4> eq_constraints;
if (OB_ISNULL(trans_ctx) || OB_ISNULL(trans_ctx->exec_ctx_) || OB_ISNULL(plan_ctx = trans_ctx->exec_ctx_->get_physical_plan_ctx())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(trans_ctx), K(plan_ctx));
} else if (OB_FAIL(inner_replace_stmt_expr_with_groupby_exprs(select_stmt, &plan_ctx->get_param_store(), pc_constraints, eq_constraints, need_check_add_expr ? trans_ctx : NULL))) {
LOG_WARN("fail to replace stmt expr with group by exprs", K(ret));
} else if (OB_FAIL(append_array_no_dup(trans_ctx->plan_const_param_constraints_, pc_constraints))) {
LOG_WARN("failed to append const param info", K(ret));
} else if (OB_FAIL(append_array_no_dup(trans_ctx->equal_param_constraints_, eq_constraints))) {
LOG_WARN("failed to append const param info", K(ret));
}
return ret;
}
//pc_constraints are for non-paramlized groupby exprs while eq_constraints are for paramlized groupby exprs
//pc_constraints are for non-paramlized groupby exprs while eq_constraints are for paramlized groupby exprs
int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *select_stmt,
int ObTransformUtils::replace_stmt_expr_with_groupby_exprs(ObSelectStmt *select_stmt,
const ParamStore *param_store,
ObTransformerCtx *trans_ctx)
ObIArray<ObPCConstParamInfo>& pc_constraints,
ObIArray<ObPCParamEqualInfo> & eq_constraints,
ObTransformerCtx *trans_ctx/*default null*/)
{
{
int ret = OB_SUCCESS;
int ret = OB_SUCCESS;
if (OB_ISNULL(select_stmt)) {
if (OB_ISNULL(select_stmt)) {
...
@@ -9206,9 +9183,8 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
...
@@ -9206,9 +9183,8 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
if (OB_FAIL(replace_with_groupby_exprs(select_stmt,
if (OB_FAIL(replace_with_groupby_exprs(select_stmt,
select_items.at(i).expr_,
select_items.at(i).expr_,
true,
true,
param_expr_idxs,
trans_ctx,
eq_constraints,
false))) {
trans_ctx))) {
LOG_WARN("failed to replace with groupby columns.", K(ret));
LOG_WARN("failed to replace with groupby columns.", K(ret));
} else { /*do nothing.*/ }
} else { /*do nothing.*/ }
}
}
...
@@ -9217,9 +9193,8 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
...
@@ -9217,9 +9193,8 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
if (OB_FAIL(replace_with_groupby_exprs(select_stmt,
if (OB_FAIL(replace_with_groupby_exprs(select_stmt,
having_exprs.at(i),
having_exprs.at(i),
true,
true,
param_expr_idxs,
trans_ctx,
eq_constraints,
false))) {
trans_ctx))) {
LOG_WARN("failed to replace with groupby columns.", K(ret));
LOG_WARN("failed to replace with groupby columns.", K(ret));
} else { /*do nothing.*/ }
} else { /*do nothing.*/ }
}
}
...
@@ -9228,35 +9203,11 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
...
@@ -9228,35 +9203,11 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
if (OB_FAIL(replace_with_groupby_exprs(select_stmt,
if (OB_FAIL(replace_with_groupby_exprs(select_stmt,
order_items.at(i).expr_,
order_items.at(i).expr_,
false,
false,
param_expr_idxs,
trans_ctx,
eq_constraints,
false))) {
trans_ctx))) {
LOG_WARN("failed to replace with groupby columns.", K(ret));
LOG_WARN("failed to replace with groupby columns.", K(ret));
} else { /*do nothing.*/ }
} else { /*do nothing.*/ }
}
}
if (OB_SUCC(ret) && param_expr_idxs.count() > 0) {
//build pc_constraints
if (OB_ISNULL(param_store)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(param_store));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < param_expr_idxs.count(); i++) {
ObPCConstParamInfo const_param_info;
int64_t param_idx = param_expr_idxs.at(i);
if (OB_UNLIKELY(param_idx < 0 || param_idx >= param_store->count())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected error", K(ret), K(param_idx),
K(param_store->count()));
} else if (OB_FAIL(const_param_info.const_idx_.push_back(param_idx))) {
LOG_WARN("failed to push back param idx", K(ret));
} else if (OB_FAIL(const_param_info.const_params_.push_back(param_store->at(param_idx)))) {
LOG_WARN("failed to push back value", K(ret));
} else if (OB_FAIL(pc_constraints.push_back(const_param_info))) {
LOG_WARN("failed to push back param info", K(ret));
} else {/*do nothing*/}
}
}
}
}
}
return ret;
return ret;
}
}
...
@@ -9264,10 +9215,8 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
...
@@ -9264,10 +9215,8 @@ int ObTransformUtils::inner_replace_stmt_expr_with_groupby_exprs(ObSelectStmt *s
int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
ObRawExpr *&expr,
ObRawExpr *&expr,
bool need_query_compare,
bool need_query_compare,
ObIArray<int64_t> & param_expr_idxs,
ObIArray<ObPCParamEqualInfo> & eq_constraints,
ObTransformerCtx *trans_ctx,
ObTransformerCtx *trans_ctx,
bool in_add_expr
/*default false*/
)
bool in_add_expr)
{
{
int ret = OB_SUCCESS;
int ret = OB_SUCCESS;
ObStmtCompareContext check_context;
ObStmtCompareContext check_context;
...
@@ -9293,8 +9242,6 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
...
@@ -9293,8 +9242,6 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
if (OB_FAIL(SMART_CALL(replace_with_groupby_exprs(select_stmt,
if (OB_FAIL(SMART_CALL(replace_with_groupby_exprs(select_stmt,
expr->get_param_expr(i),
expr->get_param_expr(i),
need_query_compare,
need_query_compare,
param_expr_idxs,
eq_constraints,
trans_ctx,
trans_ctx,
T_OP_ADD == expr->get_expr_type())))) {
T_OP_ADD == expr->get_expr_type())))) {
LOG_WARN("failed to replace with groupby columns.", K(ret));
LOG_WARN("failed to replace with groupby columns.", K(ret));
...
@@ -9306,41 +9253,22 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
...
@@ -9306,41 +9253,22 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
ObIArray<ObGroupingSetsItem> &grouping_sets_items = select_stmt->get_grouping_sets_items();
ObIArray<ObGroupingSetsItem> &grouping_sets_items = select_stmt->get_grouping_sets_items();
ObIArray<ObMultiRollupItem> &multi_rollup_items = select_stmt->get_multi_rollup_items();
ObIArray<ObMultiRollupItem> &multi_rollup_items = select_stmt->get_multi_rollup_items();
for (int64_t i = 0; OB_SUCC(ret) && !is_existed && i < groupby_exprs.count(); i++) {
for (int64_t i = 0; OB_SUCC(ret) && !is_existed && i < groupby_exprs.count(); i++) {
check_context.param_expr_.reset();
check_context.equal_param_info_.reset();
if (OB_ISNULL(groupby_exprs.at(i))) {
if (OB_ISNULL(groupby_exprs.at(i))) {
ret = OB_ERR_UNEXPECTED;
ret = OB_ERR_UNEXPECTED;
LOG_WARN("got an unexpected null", K(ret));
LOG_WARN("got an unexpected null", K(ret));
} else if (groupby_exprs.at(i)->same_as(*expr, &check_context)) {
} else if (groupby_exprs.at(i)->same_as(*expr, &check_context)) {
// add_var_to_array_no_dup
expr = groupby_exprs.at(i);
if (OB_FAIL(append(param_exprs_local, check_context.param_expr_))) {
is_existed = true;
LOG_WARN("fail to append param expr", K(ret));
} else if (OB_FAIL(append(equal_params_local, check_context.equal_param_info_))) {
LOG_WARN("fail to append equal param info", K(ret));
} else {
expr = groupby_exprs.at(i);
is_existed = true;
}
} else { /*do nothing.*/ }
} else { /*do nothing.*/ }
}
}
for (int64_t i = 0; OB_SUCC(ret) && !is_existed && i < rollup_exprs.count(); i++) {
for (int64_t i = 0; OB_SUCC(ret) && !is_existed && i < rollup_exprs.count(); i++) {
check_context.param_expr_.reset();
check_context.equal_param_info_.reset();
if (OB_ISNULL(rollup_exprs.at(i))) {
if (OB_ISNULL(rollup_exprs.at(i))) {
ret = OB_ERR_UNEXPECTED;
ret = OB_ERR_UNEXPECTED;
LOG_WARN("got an unexpected null", K(ret));
LOG_WARN("got an unexpected null", K(ret));
} else if (((lib::is_mysql_mode() && !(expr->has_flag(IS_CONST) && ob_is_integer_type(expr->get_result_type().get_type())))||
} else if ((lib::is_mysql_mode()|| !expr->is_static_const_expr())
(lib::is_oracle_mode() && !expr->is_static_const_expr()))
&& rollup_exprs.at(i)->same_as(*expr, &check_context)) {
&& rollup_exprs.at(i)->same_as(*expr, &check_context)) {
if (OB_FAIL(append(param_exprs_local, check_context.param_expr_))) {
expr = rollup_exprs.at(i);
LOG_WARN("fail to append param expr", K(ret));
is_existed = true;
} else if (OB_FAIL(append(equal_params_local, check_context.equal_param_info_))) {
LOG_WARN("fail to append equal param info", K(ret));
} else {
expr = rollup_exprs.at(i);
is_existed = true;
}
} else { /*do nothing.*/ }
} else { /*do nothing.*/ }
}
}
for (int64_t i = 0; OB_SUCC(ret) && !is_existed && i < grouping_sets_items.count(); i++) {
for (int64_t i = 0; OB_SUCC(ret) && !is_existed && i < grouping_sets_items.count(); i++) {
...
@@ -9354,14 +9282,8 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
...
@@ -9354,14 +9282,8 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
ret = OB_ERR_UNEXPECTED;
ret = OB_ERR_UNEXPECTED;
LOG_WARN("got an unexpected null", K(ret));
LOG_WARN("got an unexpected null", K(ret));
} else if (groupby_exprs.at(k)->same_as(*expr, &check_context)) {
} else if (groupby_exprs.at(k)->same_as(*expr, &check_context)) {
if (OB_FAIL(append(param_exprs_local, check_context.param_expr_))) {
expr = groupby_exprs.at(k);
LOG_WARN("fail to append param expr", K(ret));
is_existed = true;
} else if (OB_FAIL(append(equal_params_local, check_context.equal_param_info_))) {
LOG_WARN("fail to append equal param info", K(ret));
} else {
expr = groupby_exprs.at(k);
is_existed = true;
}
} else if (trans_ctx != NULL && in_add_expr &&
} else if (trans_ctx != NULL && in_add_expr &&
expr->get_expr_type() == T_QUESTIONMARK &&
expr->get_expr_type() == T_QUESTIONMARK &&
groupby_exprs.at(k)->get_expr_type() == T_QUESTIONMARK &&
groupby_exprs.at(k)->get_expr_type() == T_QUESTIONMARK &&
...
@@ -9377,7 +9299,6 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
...
@@ -9377,7 +9299,6 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
if (OB_FAIL(replace_add_exprs_with_groupby_exprs(expr,
if (OB_FAIL(replace_add_exprs_with_groupby_exprs(expr,
groupby_exprs.at(k),
groupby_exprs.at(k),
trans_ctx,
trans_ctx,
equal_params_local,
is_existed))) {
is_existed))) {
LOG_WARN("replace exprs in add failed", K(ret));
LOG_WARN("replace exprs in add failed", K(ret));
}
}
...
@@ -9391,20 +9312,12 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
...
@@ -9391,20 +9312,12 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
for (int64_t k = 0; OB_SUCC(ret) && !is_existed && k < rollup_list_exprs.count(); k++) {
for (int64_t k = 0; OB_SUCC(ret) && !is_existed && k < rollup_list_exprs.count(); k++) {
ObIArray<ObRawExpr*> &groupby_exprs = rollup_list_exprs.at(k).groupby_exprs_;
ObIArray<ObRawExpr*> &groupby_exprs = rollup_list_exprs.at(k).groupby_exprs_;
for (int64_t m = 0; OB_SUCC(ret) && !is_existed && m < groupby_exprs.count(); m++) {
for (int64_t m = 0; OB_SUCC(ret) && !is_existed && m < groupby_exprs.count(); m++) {
check_context.param_expr_.reset();
check_context.equal_param_info_.reset();
if (OB_ISNULL(groupby_exprs.at(m))) {
if (OB_ISNULL(groupby_exprs.at(m))) {
ret = OB_ERR_UNEXPECTED;
ret = OB_ERR_UNEXPECTED;
LOG_WARN("got an unexpected null", K(ret));
LOG_WARN("got an unexpected null", K(ret));
} else if (groupby_exprs.at(m)->same_as(*expr, &check_context)) {
} else if (groupby_exprs.at(m)->same_as(*expr, &check_context)) {
if (OB_FAIL(append(param_exprs_local, check_context.param_expr_))) {
expr = groupby_exprs.at(m);
LOG_WARN("fail to append param expr", K(ret));
is_existed = true;
} else if (OB_FAIL(append(equal_params_local, check_context.equal_param_info_))) {
LOG_WARN("fail to append equal param info", K(ret));
} else {
expr = groupby_exprs.at(m);
is_existed = true;
}
} else { /*do nothing.*/ }
} else { /*do nothing.*/ }
}
}
}
}
...
@@ -9417,36 +9330,17 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
...
@@ -9417,36 +9330,17 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
for (int64_t j = 0; OB_SUCC(ret) && !is_existed && j < rollup_list_exprs.count(); j++) {
for (int64_t j = 0; OB_SUCC(ret) && !is_existed && j < rollup_list_exprs.count(); j++) {
ObIArray<ObRawExpr*> &groupby_exprs = rollup_list_exprs.at(j).groupby_exprs_;
ObIArray<ObRawExpr*> &groupby_exprs = rollup_list_exprs.at(j).groupby_exprs_;
for (int64_t k = 0; OB_SUCC(ret) && !is_existed && k < groupby_exprs.count(); k++) {
for (int64_t k = 0; OB_SUCC(ret) && !is_existed && k < groupby_exprs.count(); k++) {
check_context.param_expr_.reset();
check_context.equal_param_info_.reset();
if (OB_ISNULL(groupby_exprs.at(k))) {
if (OB_ISNULL(groupby_exprs.at(k))) {
ret = OB_ERR_UNEXPECTED;
ret = OB_ERR_UNEXPECTED;
LOG_WARN("got an unexpected null", K(ret));
LOG_WARN("got an unexpected null", K(ret));
} else if (groupby_exprs.at(k)->same_as(*expr, &check_context)) {
} else if (groupby_exprs.at(k)->same_as(*expr, &check_context)) {
if (OB_FAIL(append(param_exprs_local, check_context.param_expr_))) {
expr = groupby_exprs.at(k);
LOG_WARN("fail to append param expr", K(ret));
is_existed = true;
} else if (OB_FAIL(append(equal_params_local, check_context.equal_param_info_))) {
LOG_WARN("fail to append equal param info", K(ret));
} else {
expr = groupby_exprs.at(k);
is_existed = true;
}
} else { /*do nothing.*/ }
} else { /*do nothing.*/ }
}
}
}
}
}
}
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(append_array_no_dup(eq_constraints, equal_params_local))) {
LOG_WARN("fail to append equal param info", K(ret));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < param_exprs_local.count(); ++i) {
if (OB_FAIL(add_var_to_array_no_dup(param_expr_idxs, param_exprs_local.at(i).param_idx_))) {
LOG_WARN("fail to append equal param constraints", K(ret));
}
}
}
}
}
}
return ret;
return ret;
}
}
...
@@ -9454,7 +9348,6 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
...
@@ -9454,7 +9348,6 @@ int ObTransformUtils::replace_with_groupby_exprs(ObSelectStmt *select_stmt,
int ObTransformUtils::replace_add_exprs_with_groupby_exprs(ObRawExpr *&expr_l,
int ObTransformUtils::replace_add_exprs_with_groupby_exprs(ObRawExpr *&expr_l,
ObRawExpr *expr_r,
ObRawExpr *expr_r,
ObTransformerCtx *trans_ctx,
ObTransformerCtx *trans_ctx,
ObIArray<ObPCParamEqualInfo> & eq_constraints,
bool &is_existed)
bool &is_existed)
{
{
int ret = OB_SUCCESS;
int ret = OB_SUCCESS;
...
@@ -9487,14 +9380,8 @@ int ObTransformUtils::replace_add_exprs_with_groupby_exprs(ObRawExpr *&expr_l,
...
@@ -9487,14 +9380,8 @@ int ObTransformUtils::replace_add_exprs_with_groupby_exprs(ObRawExpr *&expr_l,
} else if (check_objparam_negative(left_param) && !check_objparam_negative(right_param)) {
} else if (check_objparam_negative(left_param) && !check_objparam_negative(right_param)) {
// replace the expr with a T_OP_NEG expr who's child is groupby_exprs.at(k);
// replace the expr with a T_OP_NEG expr who's child is groupby_exprs.at(k);
ObOpRawExpr *neg = NULL;
ObOpRawExpr *neg = NULL;
ObPCParamEqualInfo eq_info;
eq_info.first_param_idx_ = idx_left;
eq_info.second_param_idx_ = idx_right;
eq_info.use_abs_cmp_ = true;
if (OB_FAIL(expr_factory->create_raw_expr(T_OP_NEG, neg))) {
if (OB_FAIL(expr_factory->create_raw_expr(T_OP_NEG, neg))) {
LOG_WARN("failed to create neg expr", K(ret));
LOG_WARN("failed to create neg expr", K(ret));
} else if (OB_FAIL(eq_constraints.push_back(eq_info))) {
LOG_WARN("failed to push back equal param", K(ret));
} else if (OB_ISNULL(expr_l = neg)) {
} else if (OB_ISNULL(expr_l = neg)) {
ret = OB_ERR_UNEXPECTED;
ret = OB_ERR_UNEXPECTED;
LOG_WARN("neg expr is NULL", K(ret));
LOG_WARN("neg expr is NULL", K(ret));
...
...
src/sql/rewrite/ob_transform_utils.h
浏览文件 @
e57d864e
...
@@ -1337,20 +1337,12 @@ public:
...
@@ -1337,20 +1337,12 @@ public:
static
int
add_const_param_constraints
(
ObRawExpr
*
expr
,
static
int
add_const_param_constraints
(
ObRawExpr
*
expr
,
ObTransformerCtx
*
ctx
);
ObTransformerCtx
*
ctx
);
static
int
inner_replace_stmt_expr_with_groupby_exprs
(
ObSelectStmt
*
select_stmt
,
const
ParamStore
*
param_store
,
ObIArray
<
ObPCConstParamInfo
>&
pc_constrants
,
ObIArray
<
ObPCParamEqualInfo
>
&
eq_constraints
,
ObTransformerCtx
*
trans_ctx
=
NULL
);
static
int
replace_stmt_expr_with_groupby_exprs
(
ObSelectStmt
*
select_stmt
,
static
int
replace_stmt_expr_with_groupby_exprs
(
ObSelectStmt
*
select_stmt
,
ObTransformerCtx
*
trans_ctx
,
ObTransformerCtx
*
trans_ctx
);
bool
need_check_add_expr
=
false
);
static
int
replace_add_exprs_with_groupby_exprs
(
ObRawExpr
*&
expr_l
,
static
int
replace_add_exprs_with_groupby_exprs
(
ObRawExpr
*&
expr_l
,
ObRawExpr
*
expr_r
,
ObRawExpr
*
expr_r
,
ObTransformerCtx
*
trans_ctx
,
ObTransformerCtx
*
trans_ctx
,
ObIArray
<
ObPCParamEqualInfo
>
&
eq_constraints
,
bool
&
is_existed
);
bool
&
is_existed
);
static
bool
check_objparam_abs_equal
(
const
ObObjParam
&
obj1
,
const
ObObjParam
&
obj2
);
static
bool
check_objparam_abs_equal
(
const
ObObjParam
&
obj1
,
const
ObObjParam
&
obj2
);
...
@@ -1364,10 +1356,8 @@ public:
...
@@ -1364,10 +1356,8 @@ public:
static
int
replace_with_groupby_exprs
(
ObSelectStmt
*
select_stmt
,
static
int
replace_with_groupby_exprs
(
ObSelectStmt
*
select_stmt
,
ObRawExpr
*&
expr
,
ObRawExpr
*&
expr
,
bool
need_query_compare
,
bool
need_query_compare
,
ObIArray
<
int64_t
>&
param_expr_idxs
,
ObTransformerCtx
*
tran_ctx
,
ObIArray
<
ObPCParamEqualInfo
>
&
eq_constraints
,
bool
in_add_expr
);
ObTransformerCtx
*
tran_ctx
=
NULL
,
bool
in_add_expr
=
false
);
static
int
add_constraint_for_groupby_expr
(
ObTransformerCtx
*
trans_ctx
,
ObSelectStmt
*
select_stmt
,
ObRawExpr
*
groupby_expr
,
ObRawExpr
*
old_expr
);
static
int
add_constraint_for_groupby_expr
(
ObTransformerCtx
*
trans_ctx
,
ObSelectStmt
*
select_stmt
,
ObRawExpr
*
groupby_expr
,
ObRawExpr
*
old_expr
);
static
int
add_param_not_null_constraint
(
ObTransformerCtx
&
ctx
,
static
int
add_param_not_null_constraint
(
ObTransformerCtx
&
ctx
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录