summaryrefslogtreecommitdiffstats
path: root/yql/essentials/tests/sql/suites
diff options
context:
space:
mode:
authorlucius <[email protected]>2025-07-21 13:57:54 +0300
committerlucius <[email protected]>2025-07-21 14:13:37 +0300
commitfea05ea76fdac14746236e14bda98ce8cc29fb00 (patch)
tree8c6fe4bf0602c2b77b9270bce0816e9ed3b19ba8 /yql/essentials/tests/sql/suites
parentcaefbb016b70b186bad0fa7f07a1524b3211fec4 (diff)
YQL-19896: allow optional side in SingleInputPredicatePushdownOverEquiJoin in some cases
Разрешаем пушить на необязательную сторону предикат, который использует только ключевые колонки с обязательной стороны джоина. 1) рассматриваемый предикат зависит только 1 стороны и это обязательная сторона джоина 2) предикат зависит только от ключевых колонок джоина 3) все соответствующие по ключу джоина колонки в обязательном  и необязательном инпутах должны полностью совпадать по типу В этих случаях мы пушим предикат не только на обязательную, но и на необязательную сторону commit_hash:1404e877fdd271dbe8342478a20b99b6f99a4fda
Diffstat (limited to 'yql/essentials/tests/sql/suites')
-rw-r--r--yql/essentials/tests/sql/suites/join/pushdown_all_sides.sql145
1 files changed, 145 insertions, 0 deletions
diff --git a/yql/essentials/tests/sql/suites/join/pushdown_all_sides.sql b/yql/essentials/tests/sql/suites/join/pushdown_all_sides.sql
new file mode 100644
index 00000000000..6abbd0890a9
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/join/pushdown_all_sides.sql
@@ -0,0 +1,145 @@
+PRAGMA config.flags("OptimizerFlags", "PredicatePushdownOverEquiJoinBothSides");
+
+SELECT *
+FROM AS_TABLE([
+ <|k1: -2|>,
+ <|k1: -1|>,
+ <|k1: 0|>,
+ <|k1: 0|>,
+ <|k1: 1|>,
+ <|k1: 2|>,
+ <|k1: 3|>,
+ <|k1: 4|>,
+]) AS t1
+LEFT JOIN AS_TABLE([
+ <|k2: -2|>,
+ <|k2: 0|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 4|>,
+ <|k2: 6|>,
+]) AS t2
+ON t1.k1 == t2.k2
+WHERE t1.k1 > 0
+;
+
+SELECT *
+FROM AS_TABLE([
+ <|k1: -2|>,
+ <|k1: -1|>,
+ <|k1: 0|>,
+ <|k1: 0|>,
+ <|k1: 1|>,
+ <|k1: 2|>,
+ <|k1: 3|>,
+ <|k1: 4|>,
+]) AS t1
+RIGHT JOIN AS_TABLE([
+ <|k2: -2|>,
+ <|k2: 0|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 4|>,
+ <|k2: 6|>,
+]) AS t2
+ON t1.k1 == t2.k2
+WHERE t2.k2 > 0
+;
+
+SELECT *
+FROM AS_TABLE([
+ <|k1: -2|>,
+ <|k1: -1|>,
+ <|k1: 0|>,
+ <|k1: 0|>,
+ <|k1: 1|>,
+ <|k1: 2|>,
+ <|k1: 3|>,
+ <|k1: 4|>,
+]) AS t1
+LEFT SEMI JOIN AS_TABLE([
+ <|k2: -2|>,
+ <|k2: 0|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 4|>,
+ <|k2: 6|>,
+]) AS t2
+ON t1.k1 == t2.k2
+WHERE t1.k1 > 0
+;
+
+SELECT *
+FROM AS_TABLE([
+ <|k1: -2|>,
+ <|k1: -1|>,
+ <|k1: 0|>,
+ <|k1: 0|>,
+ <|k1: 1|>,
+ <|k1: 2|>,
+ <|k1: 3|>,
+ <|k1: 4|>,
+]) AS t1
+RIGHT SEMI JOIN AS_TABLE([
+ <|k2: -2|>,
+ <|k2: 0|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 4|>,
+ <|k2: 6|>,
+]) AS t2
+ON t1.k1 == t2.k2
+WHERE t2.k2 > 0
+;
+
+SELECT *
+FROM AS_TABLE([
+ <|k1: -2|>,
+ <|k1: -1|>,
+ <|k1: 0|>,
+ <|k1: 0|>,
+ <|k1: 1|>,
+ <|k1: 2|>,
+ <|k1: 3|>,
+ <|k1: 4|>,
+]) AS t1
+LEFT ONLY JOIN AS_TABLE([
+ <|k2: -2|>,
+ <|k2: 0|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 4|>,
+ <|k2: 6|>,
+]) AS t2
+ON t1.k1 == t2.k2
+WHERE t1.k1 > 0
+;
+
+SELECT *
+FROM AS_TABLE([
+ <|k1: -2|>,
+ <|k1: -1|>,
+ <|k1: 0|>,
+ <|k1: 0|>,
+ <|k1: 1|>,
+ <|k1: 2|>,
+ <|k1: 3|>,
+ <|k1: 4|>,
+]) AS t1
+RIGHT ONLY JOIN AS_TABLE([
+ <|k2: -2|>,
+ <|k2: 0|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 2|>,
+ <|k2: 4|>,
+ <|k2: 6|>,
+]) AS t2
+ON t1.k1 == t2.k2
+WHERE t2.k2 > 0
+;