fix user variable not do eval
This commit is contained in:
@ -55,6 +55,18 @@ int ObSubPlanScanOp::inner_get_next_row()
|
|||||||
LOG_WARN("get row from child failed", K(ret));
|
LOG_WARN("get row from child failed", K(ret));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// eval child's output expr
|
||||||
|
// For some expression in the subquery, we must eval, even if it not output.
|
||||||
|
// e.g.
|
||||||
|
// select 1 from (select @a=3);
|
||||||
|
for (int64_t i = 0; OB_SUCC(ret) && i < child_->get_spec().output_.count(); i++) {
|
||||||
|
ObExpr *expr = child_->get_spec().output_[i];
|
||||||
|
ObDatum *datum = NULL;
|
||||||
|
if (OB_FAIL(expr->eval(eval_ctx_, datum))) {
|
||||||
|
LOG_WARN("expr evaluate failed", K(ret), K(*expr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.projector_.count(); i += 2) {
|
for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.projector_.count(); i += 2) {
|
||||||
ObExpr* from = MY_SPEC.projector_[i];
|
ObExpr* from = MY_SPEC.projector_[i];
|
||||||
ObExpr* to = MY_SPEC.projector_[i + 1];
|
ObExpr* to = MY_SPEC.projector_[i + 1];
|
||||||
|
|||||||
@ -56,6 +56,7 @@ enum ObExprInfoFlag {
|
|||||||
IS_VOLATILE_CONST, // the const expr may be altered by overwrite, non-const in execution.
|
IS_VOLATILE_CONST, // the const expr may be altered by overwrite, non-const in execution.
|
||||||
IS_ORA_ROWSCN_EXPR,
|
IS_ORA_ROWSCN_EXPR,
|
||||||
IS_VAR_EXPR,
|
IS_VAR_EXPR,
|
||||||
|
IS_ASSIGN_EXPR,
|
||||||
IS_CONST_EXPR, // expression contains calculable expression
|
IS_CONST_EXPR, // expression contains calculable expression
|
||||||
CNT_CONST_EXPR, // IS_CONST_EXPR and CNT_CONST_EXPR at most one is true
|
CNT_CONST_EXPR, // IS_CONST_EXPR and CNT_CONST_EXPR at most one is true
|
||||||
|
|
||||||
@ -98,6 +99,7 @@ enum ObExprInfoFlag {
|
|||||||
CNT_VOLATILE_CONST,
|
CNT_VOLATILE_CONST,
|
||||||
CNT_ORA_ROWSCN_EXPR,
|
CNT_ORA_ROWSCN_EXPR,
|
||||||
CNT_VAR_EXPR,
|
CNT_VAR_EXPR,
|
||||||
|
CNT_ASSIGN_EXPR,
|
||||||
|
|
||||||
BE_USED, // expression has been applied
|
BE_USED, // expression has been applied
|
||||||
IS_SIMPLE_COND, // column = const
|
IS_SIMPLE_COND, // column = const
|
||||||
@ -117,11 +119,11 @@ enum ObExprInfoFlag {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define IS_INFO_MASK_BEGIN IS_CONST
|
#define IS_INFO_MASK_BEGIN IS_CONST
|
||||||
#define IS_INFO_MASK_END IS_VAR_EXPR
|
#define IS_INFO_MASK_END IS_ASSIGN_EXPR
|
||||||
#define CNT_INFO_MASK_BEGIN CNT_CONST
|
#define CNT_INFO_MASK_BEGIN CNT_CONST
|
||||||
#define CNT_INFO_MASK_END CNT_VAR_EXPR
|
#define CNT_INFO_MASK_END CNT_ASSIGN_EXPR
|
||||||
#define INHERIT_MASK_BEGIN CNT_CONST_EXPR
|
#define INHERIT_MASK_BEGIN CNT_CONST_EXPR
|
||||||
#define INHERIT_MASK_END CNT_VAR_EXPR
|
#define INHERIT_MASK_END CNT_ASSIGN_EXPR
|
||||||
|
|
||||||
inline const char* get_expr_info_flag_str(const ObExprInfoFlag flag)
|
inline const char* get_expr_info_flag_str(const ObExprInfoFlag flag)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -161,7 +161,8 @@ int ObRawExprInfoExtractor::add_const(ObRawExpr& expr)
|
|||||||
T_FUN_SYS_ROWKEY_TO_ROWID == expr.get_expr_type() || T_OP_CONNECT_BY_ROOT == expr.get_expr_type() ||
|
T_FUN_SYS_ROWKEY_TO_ROWID == expr.get_expr_type() || T_OP_CONNECT_BY_ROOT == expr.get_expr_type() ||
|
||||||
T_FUN_SYS_CONNECT_BY_PATH == expr.get_expr_type() || T_FUN_SYS_GUID == expr.get_expr_type() ||
|
T_FUN_SYS_CONNECT_BY_PATH == expr.get_expr_type() || T_FUN_SYS_GUID == expr.get_expr_type() ||
|
||||||
T_FUN_SYS_STMT_ID == expr.get_expr_type() || T_FUN_SYS_SLEEP == expr.get_expr_type() ||
|
T_FUN_SYS_STMT_ID == expr.get_expr_type() || T_FUN_SYS_SLEEP == expr.get_expr_type() ||
|
||||||
T_OP_PRIOR == expr.get_expr_type() || T_OP_GET_USER_VAR == expr.get_expr_type())) {
|
T_OP_ASSIGN == expr.get_expr_type() || T_OP_PRIOR == expr.get_expr_type() ||
|
||||||
|
T_OP_GET_USER_VAR == expr.get_expr_type())) {
|
||||||
is_const_expr = false;
|
is_const_expr = false;
|
||||||
}
|
}
|
||||||
if (is_const_expr) {
|
if (is_const_expr) {
|
||||||
@ -233,7 +234,7 @@ bool ObRawExprInfoExtractor::not_calculable_expr(const ObRawExpr& expr)
|
|||||||
expr.has_flag(CNT_ALIAS) || expr.has_flag(CNT_ENUM_OR_SET) || expr.has_flag(CNT_VALUES) ||
|
expr.has_flag(CNT_ALIAS) || expr.has_flag(CNT_ENUM_OR_SET) || expr.has_flag(CNT_VALUES) ||
|
||||||
expr.has_flag(CNT_SEQ_EXPR) || expr.has_flag(CNT_SYS_CONNECT_BY_PATH) || expr.has_flag(CNT_RAND_FUNC) ||
|
expr.has_flag(CNT_SEQ_EXPR) || expr.has_flag(CNT_SYS_CONNECT_BY_PATH) || expr.has_flag(CNT_RAND_FUNC) ||
|
||||||
expr.has_flag(CNT_SO_UDF) || expr.has_flag(CNT_PRIOR) || expr.has_flag(CNT_EXEC_PARAM) ||
|
expr.has_flag(CNT_SO_UDF) || expr.has_flag(CNT_PRIOR) || expr.has_flag(CNT_EXEC_PARAM) ||
|
||||||
expr.has_flag(CNT_VOLATILE_CONST) || expr.has_flag(CNT_VAR_EXPR);
|
expr.has_flag(CNT_VOLATILE_CONST) || expr.has_flag(CNT_VAR_EXPR) || expr.has_flag(CNT_ASSIGN_EXPR);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObRawExprInfoExtractor::visit(ObOpRawExpr& expr)
|
int ObRawExprInfoExtractor::visit(ObOpRawExpr& expr)
|
||||||
@ -314,6 +315,10 @@ int ObRawExprInfoExtractor::visit(ObOpRawExpr& expr)
|
|||||||
if (OB_FAIL(expr.add_flag(IS_OR))) {
|
if (OB_FAIL(expr.add_flag(IS_OR))) {
|
||||||
LOG_WARN("failed to add flag IS_OR", K(ret));
|
LOG_WARN("failed to add flag IS_OR", K(ret));
|
||||||
}
|
}
|
||||||
|
} else if (expr.get_expr_type() == T_OP_ASSIGN) {
|
||||||
|
if (OB_FAIL(expr.add_flag(IS_ASSIGN_EXPR))) {
|
||||||
|
LOG_WARN("failed to add flag IS_ASSIGN_EXPR", K(ret));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (3 == expr.get_param_count()) {
|
} else if (3 == expr.get_param_count()) {
|
||||||
// triple operator
|
// triple operator
|
||||||
|
|||||||
@ -19310,17 +19310,19 @@ Outputs & filters:
|
|||||||
|
|
||||||
SQL: Select distinct 1, 1 + (@var:=1) from t7;
|
SQL: Select distinct 1, 1 + (@var:=1) from t7;
|
||||||
|
|
||||||
===================================
|
======================================
|
||||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||||
-----------------------------------
|
--------------------------------------
|
||||||
|0 |TABLE SCAN|t7 |1 |36 |
|
|0 |HASH DISTINCT| |1 |122 |
|
||||||
===================================
|
|1 | TABLE SCAN |t7 |100 |88 |
|
||||||
|
======================================
|
||||||
|
|
||||||
Outputs & filters:
|
Outputs & filters:
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
0 - output([?], [?]), filter(nil),
|
0 - output([?], [? + (T_OP_ASSIGN, 'var', ?)]), filter(nil),
|
||||||
|
distinct([? + (T_OP_ASSIGN, 'var', ?)])
|
||||||
|
1 - output([? + (T_OP_ASSIGN, 'var', ?)]), filter(nil),
|
||||||
access([t7.c1]), partitions(p0),
|
access([t7.c1]), partitions(p0),
|
||||||
limit(1), offset(nil),
|
|
||||||
is_index_back=false,
|
is_index_back=false,
|
||||||
range_key([t7.c1]), range(MIN ; MAX)always true
|
range_key([t7.c1]), range(MIN ; MAX)always true
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user