[CP] Fix the issue of incorrect results with batch NLJ + SET OP
This commit is contained in:
@ -1407,9 +1407,9 @@ int ObTableScanOp::do_init_before_get_row()
|
|||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
if (need_init_before_get_row_) {
|
if (need_init_before_get_row_) {
|
||||||
LOG_DEBUG("do init before get row", K(MY_SPEC.use_dist_das_), K(MY_SPEC.gi_above_));
|
LOG_DEBUG("do init before get row", K(MY_SPEC.id_), K(MY_SPEC.use_dist_das_), K(MY_SPEC.gi_above_));
|
||||||
if (OB_UNLIKELY(iter_end_)) {
|
if (OB_UNLIKELY(iter_end_)) {
|
||||||
//do nothing
|
LOG_DEBUG("do init before get row meet iter end", K(MY_SPEC.id_));
|
||||||
} else {
|
} else {
|
||||||
if (MY_SPEC.gi_above_) {
|
if (MY_SPEC.gi_above_) {
|
||||||
ObGranuleTaskInfo info;
|
ObGranuleTaskInfo info;
|
||||||
|
|||||||
@ -20,6 +20,7 @@
|
|||||||
#include "sql/optimizer/ob_log_exchange.h"
|
#include "sql/optimizer/ob_log_exchange.h"
|
||||||
#include "sql/optimizer/ob_log_table_scan.h"
|
#include "sql/optimizer/ob_log_table_scan.h"
|
||||||
#include "sql/optimizer/ob_log_join_filter.h"
|
#include "sql/optimizer/ob_log_join_filter.h"
|
||||||
|
#include "sql/optimizer/ob_log_set.h"
|
||||||
#include "sql/optimizer/ob_optimizer_util.h"
|
#include "sql/optimizer/ob_optimizer_util.h"
|
||||||
#include "sql/optimizer/ob_log_granule_iterator.h"
|
#include "sql/optimizer/ob_log_granule_iterator.h"
|
||||||
#include "sql/rewrite/ob_transform_utils.h"
|
#include "sql/rewrite/ob_transform_utils.h"
|
||||||
@ -1414,6 +1415,13 @@ int ObLogJoin::check_if_disable_batch(ObLogicalOperator* root, bool &can_use_bat
|
|||||||
LOG_WARN("failed to check if disable batch", K(ret));
|
LOG_WARN("failed to check if disable batch", K(ret));
|
||||||
}
|
}
|
||||||
} else if (log_op_def::LOG_SET == root->get_type()) {
|
} else if (log_op_def::LOG_SET == root->get_type()) {
|
||||||
|
ObLogSet *log_set = static_cast<ObLogSet *>(root);
|
||||||
|
if (log_set->get_set_op() != ObSelectStmt::UNION) {
|
||||||
|
//Disable batch nested loop join that contains set operations other than UNION
|
||||||
|
//because other set operations may involve short-circuit operations.
|
||||||
|
//Currently, batch NLJ does not support short-circuit execution.
|
||||||
|
can_use_batch_nlj = false;
|
||||||
|
}
|
||||||
for (int64_t i = 0; OB_SUCC(ret) && can_use_batch_nlj && i < root->get_num_of_child(); ++i) {
|
for (int64_t i = 0; OB_SUCC(ret) && can_use_batch_nlj && i < root->get_num_of_child(); ++i) {
|
||||||
ObLogicalOperator *child = root->get_child(i);
|
ObLogicalOperator *child = root->get_child(i);
|
||||||
if (OB_ISNULL(child)) {
|
if (OB_ISNULL(child)) {
|
||||||
@ -1424,10 +1432,16 @@ int ObLogJoin::check_if_disable_batch(ObLogicalOperator* root, bool &can_use_bat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (log_op_def::LOG_JOIN == root->get_type()) {
|
} else if (log_op_def::LOG_JOIN == root->get_type()) {
|
||||||
ObLogJoin *join = NULL;
|
ObLogJoin *join = static_cast<ObLogJoin *>(root);
|
||||||
if (OB_ISNULL(join = static_cast<ObLogJoin *>(root))) {
|
ObSQLSessionInfo *session_info = NULL;
|
||||||
|
ObLogPlan *plan = NULL;
|
||||||
|
if (OB_ISNULL(plan = get_plan())
|
||||||
|
|| OB_ISNULL(session_info = plan->get_optimizer_context().get_session_info())) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("invalid input", K(ret));
|
LOG_WARN("unexpected null", K(ret), K(plan), K(session_info));
|
||||||
|
} else if (!session_info->is_spf_mlj_group_rescan_enabled()) {
|
||||||
|
//Group rescan optimization for nested joins at multiple levels is disabled by default.
|
||||||
|
can_use_batch_nlj = false;
|
||||||
} else if (!join->can_use_batch_nlj()) {
|
} else if (!join->can_use_batch_nlj()) {
|
||||||
can_use_batch_nlj = false;
|
can_use_batch_nlj = false;
|
||||||
LOG_TRACE("child join not support batch_nlj", K(root->get_name()));
|
LOG_TRACE("child join not support batch_nlj", K(root->get_name()));
|
||||||
|
|||||||
@ -535,17 +535,10 @@ int ObLogSubPlanFilter::check_and_set_das_group_rescan()
|
|||||||
|| OB_ISNULL(session_info = plan->get_optimizer_context().get_session_info())) {
|
|| OB_ISNULL(session_info = plan->get_optimizer_context().get_session_info())) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("unexpected null", K(ret));
|
LOG_WARN("unexpected null", K(ret));
|
||||||
|
} else if (!session_info->is_spf_mlj_group_rescan_enabled()) {
|
||||||
|
enable_das_group_rescan_ = false;
|
||||||
} else if (OB_FAIL(session_info->get_nlj_batching_enabled(enable_das_group_rescan_))) {
|
} else if (OB_FAIL(session_info->get_nlj_batching_enabled(enable_das_group_rescan_))) {
|
||||||
LOG_WARN("failed to get enable batch variable", K(ret));
|
LOG_WARN("failed to get enable batch variable", K(ret));
|
||||||
} else {
|
|
||||||
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(session_info->get_effective_tenant_id()));
|
|
||||||
if (tenant_config.is_valid()) {
|
|
||||||
enable_das_group_rescan_ = tenant_config->_enable_spf_batch_rescan;
|
|
||||||
LOG_TRACE("trace disable hash groupby in second stage for three-stage",
|
|
||||||
K(enable_das_group_rescan_));
|
|
||||||
} else {
|
|
||||||
enable_das_group_rescan_ = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// check use batch
|
// check use batch
|
||||||
for (int64_t i = 1; OB_SUCC(ret) && enable_das_group_rescan_ && i < get_num_of_child(); i++) {
|
for (int64_t i = 1; OB_SUCC(ret) && enable_das_group_rescan_ && i < get_num_of_child(); i++) {
|
||||||
|
|||||||
@ -563,6 +563,18 @@ int ObSQLSessionInfo::is_adj_index_cost_enabled(bool &enabled, int64_t &stats_co
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//to control subplan filter and multiple level join group rescan
|
||||||
|
bool ObSQLSessionInfo::is_spf_mlj_group_rescan_enabled() const
|
||||||
|
{
|
||||||
|
bool bret = false;
|
||||||
|
int64_t tenant_id = get_effective_tenant_id();
|
||||||
|
omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id));
|
||||||
|
if (tenant_config.is_valid()) {
|
||||||
|
bret = tenant_config->_enable_spf_batch_rescan;
|
||||||
|
}
|
||||||
|
return bret;
|
||||||
|
}
|
||||||
|
|
||||||
void ObSQLSessionInfo::destroy(bool skip_sys_var)
|
void ObSQLSessionInfo::destroy(bool skip_sys_var)
|
||||||
{
|
{
|
||||||
if (is_inited_) {
|
if (is_inited_) {
|
||||||
|
|||||||
@ -1192,6 +1192,7 @@ public:
|
|||||||
int is_enable_range_extraction_for_not_in(bool &enabled) const;
|
int is_enable_range_extraction_for_not_in(bool &enabled) const;
|
||||||
bool is_var_assign_use_das_enabled() const;
|
bool is_var_assign_use_das_enabled() const;
|
||||||
int is_adj_index_cost_enabled(bool &enabled, int64_t &stats_cost_percent) const;
|
int is_adj_index_cost_enabled(bool &enabled, int64_t &stats_cost_percent) const;
|
||||||
|
bool is_spf_mlj_group_rescan_enabled() const;
|
||||||
|
|
||||||
ObSessionDDLInfo &get_ddl_info() { return ddl_info_; }
|
ObSessionDDLInfo &get_ddl_info() { return ddl_info_; }
|
||||||
void set_ddl_info(const ObSessionDDLInfo &ddl_info) { ddl_info_ = ddl_info; }
|
void set_ddl_info(const ObSessionDDLInfo &ddl_info) { ddl_info_ = ddl_info; }
|
||||||
|
|||||||
Reference in New Issue
Block a user