This is an automated email from the ASF dual-hosted git repository. vsarathy1 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new 747a1ff25f [ASTERIXDB-3445][COMP] Hash join picked by CBO in the
presence of non-equality join predicates
747a1ff25f is described below
commit 747a1ff25ff890d696032cb1960fcd5d03f09585
Author: Vijay Sarathy <[email protected]>
AuthorDate: Tue Jun 25 23:58:58 2024 -0700
[ASTERIXDB-3445][COMP] Hash join picked by CBO in the presence of
non-equality join predicates
Change-Id: Ibe2a2765fa71c8263e36f9e5dc93dc1d37724890
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18403
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: <[email protected]>
Reviewed-by: Vijay Sarathy <[email protected]>
---
.../asterix/optimizer/rules/cbo/JoinEnum.java | 7 +-
.../optimizerts/results_cbo/ch2/ch2_q7.plan | 122 ++++++++++-----------
2 files changed, 64 insertions(+), 65 deletions(-)
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
index 892a4ea452..e842b7b1ec 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/JoinEnum.java
@@ -300,14 +300,15 @@ public class JoinEnum {
ScalarFunctionCallExpression andExpr = new
ScalarFunctionCallExpression(
BuiltinFunctions.getBuiltinFunctionInfo(AlgebricksBuiltinFunctions.AND));
- // at least one equality predicate needs to be present for a hash join
to be possible.
+ // All the join predicates need to be equality predicates for a hash
join to be possible.
boolean eqPredFound = false;
for (int joinNum : newJoinConditions) {
// need to AND all the expressions.
JoinCondition jc = joinConditions.get(joinNum);
- if (jc.comparisonType == JoinCondition.comparisonOp.OP_EQ) {
- eqPredFound = true;
+ if (jc.comparisonType != JoinCondition.comparisonOp.OP_EQ) {
+ return null;
}
+ eqPredFound = true;
andExpr.getArguments().add(new MutableObject<>(jc.joinCondition));
}
// return null if no equality predicates were found
diff --git
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
index a6eab49312..1ae72b1960 100644
---
a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
+++
b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/ch2/ch2_q7.plan
@@ -18,87 +18,85 @@
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
- -- STREAM_SELECT |PARTITIONED|
- -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$303, $$326][$$277, $$300]
|PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$288][$$304] |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$277][$$303]
|PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$277]
|PARTITIONED|
+ -- NESTED_LOOP |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- HYBRID_HASH_JOIN
[$$300][$$326] |PARTITIONED|
+ -- HYBRID_HASH_JOIN
[$$304][$$288] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
- -- ASSIGN |PARTITIONED|
+ -- REPLICATE |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- DATASOURCE_SCAN
(test.supplier) |PARTITIONED|
+ -- ASSIGN
|PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
EMPTY_TUPLE_SOURCE |PARTITIONED|
+ --
DATASOURCE_SCAN (test.nation) |PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
-- BROADCAST_EXCHANGE
|PARTITIONED|
-- STREAM_PROJECT
|PARTITIONED|
- -- ASSIGN |PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- HYBRID_HASH_JOIN
[$$275, $$276][$$310, $$311] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- HYBRID_HASH_JOIN
[$$275, $$276][$$310, $$311] |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
STREAM_PROJECT |PARTITIONED|
- -- ASSIGN
|PARTITIONED|
- --
STREAM_PROJECT |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
DATASOURCE_SCAN (test.stock) |PARTITIONED|
- --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
EMPTY_TUPLE_SOURCE |PARTITIONED|
- --
BROADCAST_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
+ -- ASSIGN
|PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
--
ONE_TO_ONE_EXCHANGE |PARTITIONED|
- --
HYBRID_HASH_JOIN [$$291, $$293, $$295][$$305, $$306, $$307] |PARTITIONED|
- --
HASH_PARTITION_EXCHANGE [$$291, $$293, $$295] |PARTITIONED|
+ --
DATASOURCE_SCAN (test.stock) |PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- BROADCAST_EXCHANGE
|PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
HYBRID_HASH_JOIN [$$291, $$293, $$295][$$305, $$306, $$307] |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$291, $$293, $$295] |PARTITIONED|
+ --
STREAM_PROJECT |PARTITIONED|
+ --
STREAM_SELECT |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
- --
STREAM_SELECT |PARTITIONED|
+ --
ASSIGN |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
- --
ASSIGN |PARTITIONED|
+ --
UNNEST |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-
-- UNNEST |PARTITIONED|
+
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-
-- ASSIGN |PARTITIONED|
-
-- STREAM_PROJECT |PARTITIONED|
+
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+
-- DATASOURCE_SCAN (test.orders) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-
-- DATASOURCE_SCAN (test.orders) |PARTITIONED|
-
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- --
HASH_PARTITION_EXCHANGE [$$305, $$306, $$307] |PARTITIONED|
+
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ --
HASH_PARTITION_EXCHANGE [$$305, $$306, $$307] |PARTITIONED|
+ -- ASSIGN
|PARTITIONED|
+ --
STREAM_PROJECT |PARTITIONED|
--
ASSIGN |PARTITIONED|
--
STREAM_PROJECT |PARTITIONED|
- --
ASSIGN |PARTITIONED|
- --
STREAM_PROJECT |PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
DATASOURCE_SCAN (test.customer) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-
-- DATASOURCE_SCAN (test.customer) |PARTITIONED|
-
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$303]
|PARTITIONED|
- -- REPLICATE |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- STREAM_PROJECT |PARTITIONED|
- -- ASSIGN |PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- DATASOURCE_SCAN
(test.nation) |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- --
EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- BROADCAST_EXCHANGE |PARTITIONED|
- -- STREAM_PROJECT |PARTITIONED|
- -- ASSIGN |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- REPLICATE |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STREAM_PROJECT |PARTITIONED|
- -- ASSIGN |PARTITIONED|
- -- STREAM_PROJECT
|PARTITIONED|
+
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- BROADCAST_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
+ -- REPLICATE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- DATASOURCE_SCAN
(test.nation) |PARTITIONED|
- -- ONE_TO_ONE_EXCHANGE
|PARTITIONED|
- -- EMPTY_TUPLE_SOURCE
|PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT
|PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN
(test.nation) |PARTITIONED|
+ --
ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ --
EMPTY_TUPLE_SOURCE |PARTITIONED|
+ -- BROADCAST_EXCHANGE |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ASSIGN |PARTITIONED|
+ -- STREAM_PROJECT |PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- DATASOURCE_SCAN (test.supplier)
|PARTITIONED|
+ -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
+ -- EMPTY_TUPLE_SOURCE |PARTITIONED|
