aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpilik <pudge1000-7@ydb.tech>2024-10-02 20:43:00 +0300
committerGitHub <noreply@github.com>2024-10-02 20:43:00 +0300
commitac7e20cc3c1d2a1910b95a0822183be6ca2e1f87 (patch)
treefa199a660dc557e50b169442e1363405f0d209ad
parente552def618e91f70afcbf6821836b09a9e33c33f (diff)
downloadydb-ac7e20cc3c1d2a1910b95a0822183be6ca2e1f87.tar.gz
[CBO] Fix LeftOnly (LeftAntiJoin) algebraic matrix (#9974)
-rw-r--r--ydb/library/yql/core/cbo/cbo_optimizer_new.h4
-rw-r--r--ydb/library/yql/dq/opt/dq_opt_conflict_rules_collector.cpp19
2 files changed, 11 insertions, 12 deletions
diff --git a/ydb/library/yql/core/cbo/cbo_optimizer_new.h b/ydb/library/yql/core/cbo/cbo_optimizer_new.h
index 7f009a61d5..0a564e4c35 100644
--- a/ydb/library/yql/core/cbo/cbo_optimizer_new.h
+++ b/ydb/library/yql/core/cbo/cbo_optimizer_new.h
@@ -47,8 +47,8 @@ enum EJoinKind: ui32
LeftJoin,
RightJoin,
OuterJoin,
- LeftOnly,
- RightOnly,
+ LeftOnly /* == LeftAntiJoin */,
+ RightOnly /* == RightAntiJoin */,
LeftSemi,
RightSemi,
Cross,
diff --git a/ydb/library/yql/dq/opt/dq_opt_conflict_rules_collector.cpp b/ydb/library/yql/dq/opt/dq_opt_conflict_rules_collector.cpp
index 266553a433..68d702aa3b 100644
--- a/ydb/library/yql/dq/opt/dq_opt_conflict_rules_collector.cpp
+++ b/ydb/library/yql/dq/opt/dq_opt_conflict_rules_collector.cpp
@@ -8,8 +8,6 @@ EJoinKind GetEquivalentJoinByAlgebraicProperties(EJoinKind joinKind) {
switch (joinKind) {
case EJoinKind::Exclusion:
return EJoinKind::OuterJoin;
- case EJoinKind::LeftOnly:
- return EJoinKind::LeftJoin;
default:
return joinKind;
}
@@ -34,9 +32,9 @@ bool OperatorsAreAssociative(EJoinKind lhs, EJoinKind rhs) {
rhs = GetEquivalentJoinByAlgebraicProperties(rhs);
static THashMap<EJoinKind, THashSet<EJoinKind>> ASSOC_TABLE = {
- {EJoinKind::Cross, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftJoin}},
- {EJoinKind::InnerJoin, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftJoin}},
- {EJoinKind::LeftJoin, {EJoinKind::LeftJoin}},
+ {EJoinKind::Cross, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftOnly, EJoinKind::LeftJoin}},
+ {EJoinKind::InnerJoin, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftOnly, EJoinKind::LeftJoin}},
+ {EJoinKind::LeftJoin, {EJoinKind::LeftJoin}},
{EJoinKind::OuterJoin, {EJoinKind::LeftJoin, EJoinKind::OuterJoin}}
};
@@ -52,10 +50,11 @@ bool OperatorsAreLeftAsscom(EJoinKind lhs, EJoinKind rhs) {
rhs = GetEquivalentJoinByAlgebraicProperties(rhs);
static THashMap<EJoinKind, THashSet<EJoinKind>> LASSCOM_TABLE = {
- {EJoinKind::Cross, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftJoin}},
- {EJoinKind::InnerJoin, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftJoin}},
- {EJoinKind::LeftSemi, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftJoin}},
- {EJoinKind::LeftJoin, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftJoin, EJoinKind::OuterJoin}},
+ {EJoinKind::Cross, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftOnly, EJoinKind::LeftJoin}},
+ {EJoinKind::InnerJoin, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftOnly, EJoinKind::LeftJoin}},
+ {EJoinKind::LeftSemi, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftOnly, EJoinKind::LeftJoin}},
+ {EJoinKind::LeftOnly, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftOnly, EJoinKind::LeftJoin}},
+ {EJoinKind::LeftJoin, {EJoinKind::Cross, EJoinKind::InnerJoin, EJoinKind::LeftSemi, EJoinKind::LeftJoin, EJoinKind::OuterJoin}},
{EJoinKind::OuterJoin, {EJoinKind::LeftJoin, EJoinKind::OuterJoin}}
};
@@ -71,7 +70,7 @@ bool OperatorsAreRightAsscom(EJoinKind lhs, EJoinKind rhs) {
rhs = GetEquivalentJoinByAlgebraicProperties(rhs);
static THashMap<EJoinKind, THashSet<EJoinKind>> RASSCOM_TABLE = {
- {EJoinKind::Cross, {EJoinKind::Cross, EJoinKind::InnerJoin}},
+ {EJoinKind::Cross, {EJoinKind::Cross, EJoinKind::InnerJoin}},
{EJoinKind::InnerJoin, {EJoinKind::Cross, EJoinKind::InnerJoin}},
{EJoinKind::OuterJoin, {EJoinKind::OuterJoin}}
};