Merge "Merge branch 'gerrit/trinity' into 'master'"
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
index 02f1f0e..302d4e0 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
@@ -21,7 +21,6 @@
import static org.apache.asterix.external.util.ExternalDataConstants.SUBPATH;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -912,14 +911,10 @@
}
private Expression translateProjectVarStar(Expression projectionExpr, SourceLocation sourceLoc) {
- // var.* -> if_missing_or_null(to_object(var), {})
- CallExpr toObjectExpr = new CallExpr(new FunctionSignature(BuiltinFunctions.TO_OBJECT),
+ CallExpr toObjectExpr = new CallExpr(new FunctionSignature(BuiltinFunctions.TO_OBJECT_VAR_STR),
Collections.singletonList(projectionExpr));
toObjectExpr.setSourceLocation(sourceLoc);
- CallExpr ifMissingOrNullExpr = new CallExpr(new FunctionSignature(BuiltinFunctions.IF_MISSING_OR_NULL),
- Arrays.asList(toObjectExpr, new RecordConstructor(Collections.emptyList())));
- ifMissingOrNullExpr.setSourceLocation(sourceLoc);
- return ifMissingOrNullExpr;
+ return toObjectExpr;
}
private static boolean includeInSelectStar(VariableExpr varExpr) {
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan
index 578e272..1821d02 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate-sql-sugar/distinct_mixed/distinct_mixed.17.plan
@@ -6,22 +6,22 @@
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$149] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$156] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- MICRO_PRE_SORTED_DISTINCT_BY |LOCAL|
- -- MICRO_STABLE_SORT [$$115(ASC)] |LOCAL|
+ -- MICRO_STABLE_SORT [$$124(ASC)] |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
{
-- AGGREGATE |LOCAL|
-- MICRO_PRE_SORTED_DISTINCT_BY |LOCAL|
- -- MICRO_STABLE_SORT [$$120(ASC)] |LOCAL|
+ -- MICRO_STABLE_SORT [$$129(ASC)] |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$149(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$149] |PARTITIONED|
+ -- STABLE_SORT [$$156(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$156] |PARTITIONED|
-- NESTED_LOOP |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
@@ -54,22 +54,22 @@
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$150] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$157] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- MICRO_PRE_SORTED_DISTINCT_BY |LOCAL|
- -- MICRO_STABLE_SORT [$$133(ASC)] |LOCAL|
+ -- MICRO_STABLE_SORT [$$142(ASC)] |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
{
-- AGGREGATE |LOCAL|
-- MICRO_PRE_SORTED_DISTINCT_BY |LOCAL|
- -- MICRO_STABLE_SORT [$$138(ASC)] |LOCAL|
+ -- MICRO_STABLE_SORT [$$147(ASC)] |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$150(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$150] |PARTITIONED|
+ -- STABLE_SORT [$$157(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$157] |PARTITIONED|
-- NESTED_LOOP |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan
index 1351492..a7234b3b6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query_issue3316.plan
@@ -2,13 +2,13 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- PRE_SORTED_DISTINCT_BY |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$194(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$194] |PARTITIONED|
+ -- STABLE_SORT [$$192(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$192] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$229] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$227] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
@@ -17,60 +17,60 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$229][$$390] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$227][$$388] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$195] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$193] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$195(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$193(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$195][$$242] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$195] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$193][$$240] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$193] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$242] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$240] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$128][$$201] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$126][$$199] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$227, $$196] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$225, $$194] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$227(ASC), $$196(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$225(ASC), $$194(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$227, $$196][$$256, $$257] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$227, $$196] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$225, $$194][$$254, $$255] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$225, $$194] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$225][$$209] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$223][$$207] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -82,7 +82,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$209] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$207] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -101,7 +101,7 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$240, $$237] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$238, $$235] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
@@ -109,26 +109,26 @@
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$240(ASC), $$237(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$238(ASC), $$235(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$240, $$237][$$254, $$251] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$238, $$235][$$252, $$249] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$427, $$428] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$425, $$426] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$430][$$429] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$428][$$427] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -140,7 +140,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$429] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$427] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -155,15 +155,15 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$254, $$251] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$252, $$249] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$137][$$200] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$135][$$198] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$245][$$212] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$243][$$210] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -172,13 +172,13 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$447][$$450] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$445][$$448] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -190,7 +190,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$450] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$448] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -205,7 +205,7 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$212] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$210] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -228,56 +228,56 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$390] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$388] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$164][$$204] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$162][$$202] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$167][$$203] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$165][$$201] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$258, $$198] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$256, $$196] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$258(ASC), $$198(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$256(ASC), $$196(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$258, $$198][$$461, $$462] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$258, $$198] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$256, $$196][$$459, $$460] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$256, $$196] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$262][$$216] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$262] |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$259] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$260][$$214] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$260] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$257] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$259(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$257(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$259][$$263] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$257][$$261] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$401] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$399] |PARTITIONED|
-- REPLICATE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
@@ -286,40 +286,40 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$263] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$261] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$268][$$267] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$266][$$265] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$270, $$272] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$268, $$270] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$270(ASC), $$272(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$268(ASC), $$270(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$270, $$272][$$280, $$281] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$268, $$270][$$278, $$279] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$411, $$413] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$409, $$411] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$416][$$417] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$417][$$418] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -331,7 +331,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$418] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -348,7 +348,7 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$286, $$287] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$284, $$285] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
@@ -356,26 +356,26 @@
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$286(ASC), $$287(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$284(ASC), $$285(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$286, $$287][$$296, $$297] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$284, $$285][$$294, $$295] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$427, $$428] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$425, $$426] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$430][$$429] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$428][$$427] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -387,7 +387,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$429] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$427] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -402,15 +402,15 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$296, $$297] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$294, $$295] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$304][$$303] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$302][$$301] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$306][$$305] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$304][$$303] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -419,13 +419,13 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$447][$$450] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$445][$$448] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -437,7 +437,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$450] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$448] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -457,7 +457,7 @@
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$446] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$444] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -478,7 +478,7 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$216] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$214] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
@@ -496,7 +496,7 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$329, $$328] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$327, $$326] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
@@ -504,34 +504,34 @@
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$329(ASC), $$328(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$327(ASC), $$326(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$329, $$328][$$400, $$399] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$329, $$328] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$327, $$326][$$398, $$397] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$327, $$326] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$322][$$321] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$322] |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$330] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$320][$$319] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$320] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$328] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$330(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$328(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$330][$$333] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$328][$$331] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$401] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$399] |PARTITIONED|
-- REPLICATE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
@@ -540,40 +540,40 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$333] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$331] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$338][$$337] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$336][$$335] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$340, $$342] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$338, $$340] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$340(ASC), $$342(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$338(ASC), $$340(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$340, $$342][$$350, $$351] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$338, $$340][$$348, $$349] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$411, $$413] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$409, $$411] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$416][$$417] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$417][$$418] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -585,7 +585,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$418] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -602,7 +602,7 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$356, $$357] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$354, $$355] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
@@ -610,26 +610,26 @@
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$356(ASC), $$357(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$354(ASC), $$355(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$356, $$357][$$366, $$367] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$354, $$355][$$364, $$365] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$427, $$428] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$425, $$426] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$430][$$429] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$428][$$427] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -641,7 +641,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$429] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$427] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -656,15 +656,15 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$366, $$367] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$364, $$365] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$374][$$373] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$372][$$371] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$376][$$375] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$374][$$373] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -673,13 +673,13 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$447][$$450] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$445][$$448] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -691,7 +691,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$450] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$448] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -711,7 +711,7 @@
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$446] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$444] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -732,7 +732,7 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$321] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$319] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -747,35 +747,35 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$400, $$399] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$398, $$397] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$174][$$202] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$172][$$200] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$393][$$218] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$391][$$216] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$393][$$392] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$393] |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$401] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$391][$$390] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$391] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$399] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$401(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$399(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$401][$$404] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$399][$$402] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$401] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$399] |PARTITIONED|
-- REPLICATE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
@@ -784,37 +784,37 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$404] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$402] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$409][$$408] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$407][$$406] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$411, $$413] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$409, $$411] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$411(ASC), $$413(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$409(ASC), $$411(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$411, $$413][$$421, $$422] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$409, $$411][$$419, $$420] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$411, $$413] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$409, $$411] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$416][$$417] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$417][$$418] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -826,7 +826,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$418] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -843,7 +843,7 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$427, $$428] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$425, $$426] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
@@ -851,23 +851,23 @@
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$427(ASC), $$428(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$425(ASC), $$426(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$427, $$428][$$437, $$438] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$425, $$426][$$435, $$436] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$427, $$428] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$425, $$426] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$430][$$429] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$428][$$427] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -879,7 +879,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$429] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$427] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -894,27 +894,27 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$437, $$438] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$435, $$436] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$445][$$444] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$443][$$442] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$447][$$446] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$445][$$444] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$447][$$450] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$445][$$448] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$416] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -926,7 +926,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$450] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$448] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -943,7 +943,7 @@
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$446] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$444] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -964,7 +964,7 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$392] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$390] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -979,7 +979,7 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$218] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$216] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan
index 755f182..96df2d9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_cbo/query_issue3316.plan
@@ -2,13 +2,13 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- PRE_SORTED_DISTINCT_BY |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$194(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$194] |PARTITIONED|
+ -- STABLE_SORT [$$192(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$192] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$229] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$227] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
@@ -17,60 +17,60 @@
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$229][$$390] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$227][$$388] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$195] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$193] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$195(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$193(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$195][$$242] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$195] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$193][$$240] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$193] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$242] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$240] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$128][$$201] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$126][$$199] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$227, $$196] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$225, $$194] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$227(ASC), $$196(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$225(ASC), $$194(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$227, $$196][$$256, $$257] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$227, $$196] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$225, $$194][$$254, $$255] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$225, $$194] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$225][$$209] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$223][$$207] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -82,7 +82,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$209] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$207] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -101,34 +101,34 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$240, $$237] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$238, $$235] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$240(ASC), $$237(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$240, $$237] |PARTITIONED|
+ -- STABLE_SORT [$$238(ASC), $$235(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$238, $$235] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$251, $$231][$$237, $$230] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$249, $$229][$$235, $$228] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$245][$$244] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$243][$$242] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$254][$$240] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$252][$$238] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$212][$$245] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$212] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$210][$$243] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$210] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$137][$$200] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$135][$$198] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
@@ -151,7 +151,7 @@
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -220,56 +220,56 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$390] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$388] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$164][$$204] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$162][$$202] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$167][$$203] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$165][$$201] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$258, $$198] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$256, $$196] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$258(ASC), $$198(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$256(ASC), $$196(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$258, $$198][$$461, $$462] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$258, $$198] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$256, $$196][$$459, $$460] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$256, $$196] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$262][$$216] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$262] |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$259] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$260][$$214] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$260] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$257] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$259(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$257(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$259][$$263] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$257][$$261] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$401] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$399] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -281,43 +281,43 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$263] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$261] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$268][$$267] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$266][$$265] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$270, $$272] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$268, $$270] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$270(ASC), $$272(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$268(ASC), $$270(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$270, $$272][$$280, $$281] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$268, $$270][$$278, $$279] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$411, $$413] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$409, $$411] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$416][$$417] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$417][$$418] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -329,7 +329,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$418] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -346,34 +346,34 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$286, $$287] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$284, $$285] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$286(ASC), $$287(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$286, $$287] |PARTITIONED|
+ -- STABLE_SORT [$$284(ASC), $$285(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$284, $$285] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$297, $$289][$$287, $$288] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$295, $$287][$$285, $$286] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$306][$$309] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$304][$$307] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$296][$$286] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$294][$$284] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$305][$$306] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$305] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$303][$$304] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$303] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$304][$$303] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$302][$$301] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -399,7 +399,7 @@
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -468,7 +468,7 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$216] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$214] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
@@ -486,7 +486,7 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$329, $$328] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$327, $$326] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
@@ -494,34 +494,34 @@
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$329(ASC), $$328(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$327(ASC), $$326(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$329, $$328][$$400, $$399] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$329, $$328] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$327, $$326][$$398, $$397] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$327, $$326] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$322][$$321] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$322] |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$330] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$320][$$319] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$320] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$328] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$330(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$328(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$330][$$333] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$328][$$331] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$401] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$399] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -533,43 +533,43 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$333] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$331] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$338][$$337] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$336][$$335] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$340, $$342] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$338, $$340] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$340(ASC), $$342(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$338(ASC), $$340(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$340, $$342][$$350, $$351] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$338, $$340][$$348, $$349] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$411, $$413] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$409, $$411] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$416][$$417] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$417][$$418] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -581,7 +581,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$418] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -598,34 +598,34 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$356, $$357] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$354, $$355] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$356(ASC), $$357(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$356, $$357] |PARTITIONED|
+ -- STABLE_SORT [$$354(ASC), $$355(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$354, $$355] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$367, $$359][$$357, $$358] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$365, $$357][$$355, $$356] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$376][$$379] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$374][$$377] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$366][$$356] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$364][$$354] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$375][$$376] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$375] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$373][$$374] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$373] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$374][$$373] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$372][$$371] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -651,7 +651,7 @@
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -720,7 +720,7 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$321] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$319] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -735,35 +735,35 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$400, $$399] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$398, $$397] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$174][$$202] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$172][$$200] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$393][$$218] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$391][$$216] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$393][$$392] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$393] |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$401] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$391][$$390] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$391] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$399] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$401(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$399(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$401][$$404] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$399][$$402] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$401] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$399] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -775,40 +775,40 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$404] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$402] |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$409][$$408] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$407][$$406] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$411, $$413] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$409, $$411] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- STREAM_SELECT |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$411(ASC), $$413(ASC)] |PARTITIONED|
+ -- STABLE_SORT [$$409(ASC), $$411(ASC)] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$411, $$413][$$421, $$422] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$409, $$411][$$419, $$420] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$411, $$413] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$409, $$411] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$416][$$417] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$417][$$418] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -820,7 +820,7 @@
-- DATASOURCE_SCAN (test.collection0) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$417] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$418] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- STREAM_SELECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
@@ -837,34 +837,34 @@
-- STREAM_PROJECT |PARTITIONED|
-- UNNEST |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- PRE_CLUSTERED_GROUP_BY[$$427, $$428] |PARTITIONED|
+ -- PRE_CLUSTERED_GROUP_BY[$$425, $$426] |PARTITIONED|
{
-- AGGREGATE |LOCAL|
-- AGGREGATE |LOCAL|
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- STABLE_SORT [$$427(ASC), $$428(ASC)] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$427, $$428] |PARTITIONED|
+ -- STABLE_SORT [$$425(ASC), $$426(ASC)] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$425, $$426] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$438, $$430][$$428, $$429] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$436, $$428][$$426, $$427] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$447][$$450] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$445][$$448] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$437][$$427] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$435][$$425] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$446][$$447] |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$446] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$444][$$445] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$444] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- -- HYBRID_HASH_JOIN [$$445][$$444] |PARTITIONED|
+ -- HYBRID_HASH_JOIN [$$443][$$442] |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -884,7 +884,7 @@
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- REPLICATE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$447] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$445] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -944,7 +944,7 @@
-- BROADCAST_EXCHANGE |PARTITIONED|
-- UNNEST |UNPARTITIONED|
-- EMPTY_TUPLE_SOURCE |UNPARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$392] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$390] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
@@ -959,7 +959,7 @@
-- DATASOURCE_SCAN (test.collection1) |PARTITIONED|
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
- -- HASH_PARTITION_EXCHANGE [$$218] |PARTITIONED|
+ -- HASH_PARTITION_EXCHANGE [$$216] |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
-- ASSIGN |PARTITIONED|
-- STREAM_PROJECT |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.1.ddl.sqlpp
new file mode 100644
index 0000000..f18ac2b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.1.ddl.sqlpp
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3419
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type dt1 as {__id: uuid};
+
+create dataset users_channels1(dt1) PRIMARY KEY __id AUTOGENERATED;
+
+create view users_channel (__id string, name string, user_id string) DEFAULT NULL AS SELECT __id, name, user_id FROM `users_channels1`;
+
+create view users_channel_with_pk (__id string, name string, user_id string) DEFAULT NULL PRIMARY KEY (__id) NOT ENFORCED AS SELECT __id, name, user_id FROM `users_channels1`;
+
+create view users_channel_with_nulls (__id string, name string, user_id string) DEFAULT NULL AS SELECT __id, name, user_id FROM [null, {"name":"aa"}, null, {"user_id":"AA"}] `users_channels1`;
+
+
+create type dt4 as {
+ n: int
+};
+
+create type dt3 as {
+ a: int, b: dt4
+};
+
+create type dt2 as {
+ id: string,
+ y: string,
+ x: dt3?
+};
+
+create dataset col(dt2) primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.2.update.sqlpp
new file mode 100644
index 0000000..4e19b3a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.2.update.sqlpp
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+insert into users_channels1
+([
+ {
+ "name": "John",
+ "user_id": "AWXSI"
+ },
+ {
+ "name": "Sarah",
+ "user_id": "SSAw"
+ },
+ {
+ "name": "Mike"
+ },
+ {
+ "user_id": "AWXSI"
+ },
+ {
+ }
+]);
+
+
+upsert into col [
+ {"id": "1", "y":"yval1", "x": {"a": 1, "b": {"n": 2}}},
+ {"id": "2", "y": "yval2", "x": null}
+]
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.3.query.sqlpp
new file mode 100644
index 0000000..bb954ff
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.3.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3419
+ */
+
+use test;
+
+select users_channel.* from users_channel where user_id="AWXSI" order by if_null(name, "A");
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.4.query.sqlpp
new file mode 100644
index 0000000..e1a56eb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.4.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3419
+ */
+
+use test;
+
+select users_channel.* from users_channel order by if_null(user_id, "A"), if_null(name, "A");
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.5.query.sqlpp
new file mode 100644
index 0000000..a623bcf
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.5.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3419
+ */
+
+use test;
+
+select users_channel_with_pk.* from users_channel_with_pk order by if_null(user_id, "A"), if_null(name, "A");
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.6.query.sqlpp
new file mode 100644
index 0000000..c0da1c9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.6.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3419
+ */
+
+use test;
+
+select x.* from [null, {"val":1}] x;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.7.query.sqlpp
new file mode 100644
index 0000000..2e78c08
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.7.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3419
+ */
+
+use test;
+
+select users_channel_with_nulls.* from users_channel_with_nulls;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.8.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.8.query.sqlpp
new file mode 100644
index 0000000..ac568ce
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.8.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description: This test case is to verify the fix for ASTERIXDB-3419
+ */
+
+use test;
+
+select t.* from (select col.x as t from col) as t;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
index e370904..b06cd7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.020.plan
@@ -1,49 +1,49 @@
-distribute result [$$68] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+distribute result [$$66] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- DISTRIBUTE_RESULT |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |UNPARTITIONED|
- project ([$$68]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |UNPARTITIONED|
- assign [$$68] <- [{"count": $$71}] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ assign [$$66] <- [{"count": $$69}] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |UNPARTITIONED|
- aggregate [$$71] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ aggregate [$$69] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- SORT_MERGE_EXCHANGE [$$66(ASC) ] |PARTITIONED|
- distinct ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- SORT_MERGE_EXCHANGE [$$64(ASC) ] |PARTITIONED|
+ distinct ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- PRE_SORTED_DISTINCT_BY |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- order (ASC, $$66) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STABLE_SORT [$$66(ASC)] |PARTITIONED|
+ order (ASC, $$64) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STABLE_SORT [$$64(ASC)] |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- HASH_PARTITION_EXCHANGE [$$66] |PARTITIONED|
- project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- HASH_PARTITION_EXCHANGE [$$64] |PARTITIONED|
+ project ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
- select (ge($$70, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ select (ge($$68, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_SELECT |PARTITIONED|
- project ([$$66, $$70]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ project ([$$64, $$68]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
subplan {
- aggregate [$$70] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ aggregate [$$68] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |LOCAL|
- unnest $$i <- scan-collection($$72) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ unnest $$i <- scan-collection($$70) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- UNNEST |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
} [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- SUBPLAN |PARTITIONED|
- project ([$$66, $$72]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ project ([$$64, $$70]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$66, $$72] <- [if-missing-or-null(to-object($$t), cast({ })).getField(0), $$t.getField("a1")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |PARTITIONED|
project ([$$t]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$69, $$t] <- test.ColumnDataset [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ data-scan []<-[$$67, $$t] <- test.ColumnDataset [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- DATASOURCE_SCAN |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan
index e370904..b06cd7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/pushdown/other-pushdowns/other-pushdowns.021.plan
@@ -1,49 +1,49 @@
-distribute result [$$68] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+distribute result [$$66] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- DISTRIBUTE_RESULT |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |UNPARTITIONED|
- project ([$$68]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |UNPARTITIONED|
- assign [$$68] <- [{"count": $$71}] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ assign [$$66] <- [{"count": $$69}] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |UNPARTITIONED|
- aggregate [$$71] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ aggregate [$$69] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- SORT_MERGE_EXCHANGE [$$66(ASC) ] |PARTITIONED|
- distinct ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- SORT_MERGE_EXCHANGE [$$64(ASC) ] |PARTITIONED|
+ distinct ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- PRE_SORTED_DISTINCT_BY |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- order (ASC, $$66) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- STABLE_SORT [$$66(ASC)] |PARTITIONED|
+ order (ASC, $$64) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- STABLE_SORT [$$64(ASC)] |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
- -- HASH_PARTITION_EXCHANGE [$$66] |PARTITIONED|
- project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ -- HASH_PARTITION_EXCHANGE [$$64] |PARTITIONED|
+ project ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
- select (ge($$70, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ select (ge($$68, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_SELECT |PARTITIONED|
- project ([$$66, $$70]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ project ([$$64, $$68]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
subplan {
- aggregate [$$70] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ aggregate [$$68] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |LOCAL|
- unnest $$i <- scan-collection($$72) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ unnest $$i <- scan-collection($$70) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- UNNEST |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
} [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- SUBPLAN |PARTITIONED|
- project ([$$66, $$72]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ project ([$$64, $$70]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$66, $$72] <- [if-missing-or-null(to-object($$t), cast({ })).getField(0), $$t.getField("a1")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |PARTITIONED|
project ([$$t]) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- STREAM_PROJECT |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$69, $$t] <- test.ColumnDataset [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ data-scan []<-[$$67, $$t] <- test.ColumnDataset [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- DATASOURCE_SCAN |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.3.jsonl b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.3.jsonl
new file mode 100644
index 0000000..1897644
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.3.jsonl
@@ -0,0 +1,2 @@
+{ "__id": "R{.*}", "name": null, "user_id": "AWXSI" }
+{ "__id": "R{.*}", "name": "John", "user_id": "AWXSI" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.4.jsonl b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.4.jsonl
new file mode 100644
index 0000000..88b77b6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.4.jsonl
@@ -0,0 +1,5 @@
+{ "__id": "R{.*}", "name": null, "user_id": null }
+{ "__id": "R{.*}", "name": "Mike", "user_id": null }
+{ "__id": "R{.*}", "name": null, "user_id": "AWXSI" }
+{ "__id": "R{.*}", "name": "John", "user_id": "AWXSI" }
+{ "__id": "R{.*}", "name": "Sarah", "user_id": "SSAw" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.5.jsonl b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.5.jsonl
new file mode 100644
index 0000000..88b77b6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.5.jsonl
@@ -0,0 +1,5 @@
+{ "__id": "R{.*}", "name": null, "user_id": null }
+{ "__id": "R{.*}", "name": "Mike", "user_id": null }
+{ "__id": "R{.*}", "name": null, "user_id": "AWXSI" }
+{ "__id": "R{.*}", "name": "John", "user_id": "AWXSI" }
+{ "__id": "R{.*}", "name": "Sarah", "user_id": "SSAw" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.6.adm
new file mode 100644
index 0000000..5cd8375
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.6.adm
@@ -0,0 +1,2 @@
+{ }
+{ "val": 1 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.7.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.7.adm
new file mode 100644
index 0000000..7541d23
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.7.adm
@@ -0,0 +1,4 @@
+{ "__id": null, "name": null, "user_id": null }
+{ "__id": null, "name": "aa", "user_id": null }
+{ "__id": null, "name": null, "user_id": null }
+{ "__id": null, "name": null, "user_id": "AA" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.8.adm
new file mode 100644
index 0000000..c7bb5e2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-3419/query-ASTERIXDB-3419.8.adm
@@ -0,0 +1,2 @@
+{ "t": null }
+{ "t": { "a": 1, "b": { "n": 2 } } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan
index 4e264fa..2ada1fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.020.plan
@@ -1,49 +1,49 @@
-distribute result [$$68] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+distribute result [$$66] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- DISTRIBUTE_RESULT |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- ONE_TO_ONE_EXCHANGE |UNPARTITIONED|
- project ([$$68]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |UNPARTITIONED|
- assign [$$68] <- [{"count": $$71}] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ assign [$$66] <- [{"count": $$69}] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- ASSIGN |UNPARTITIONED|
- aggregate [$$71] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ aggregate [$$69] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- AGGREGATE |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
- -- SORT_MERGE_EXCHANGE [$$66(ASC) ] |PARTITIONED|
- distinct ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ -- SORT_MERGE_EXCHANGE [$$64(ASC) ] |PARTITIONED|
+ distinct ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- PRE_SORTED_DISTINCT_BY |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- order (ASC, $$66) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
- -- STABLE_SORT [$$66(ASC)] |PARTITIONED|
+ order (ASC, $$64) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ -- STABLE_SORT [$$64(ASC)] |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
- -- HASH_PARTITION_EXCHANGE [$$66] |PARTITIONED|
- project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ -- HASH_PARTITION_EXCHANGE [$$64] |PARTITIONED|
+ project ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
- select (ge($$70, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ select (ge($$68, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_SELECT |PARTITIONED|
- project ([$$66, $$70]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+ project ([$$64, $$68]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
subplan {
- aggregate [$$70] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ aggregate [$$68] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |LOCAL|
- unnest $$i <- scan-collection($$72) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ unnest $$i <- scan-collection($$70) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- UNNEST |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
} [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- SUBPLAN |PARTITIONED|
- project ([$$66, $$72]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+ project ([$$64, $$70]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$66, $$72] <- [if-missing-or-null(to-object($$t), cast({ })).getField(0), $$t.getField("a1")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+ assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- ASSIGN |PARTITIONED|
project ([$$t]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$69, $$t] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.0]
+ data-scan []<-[$$67, $$t] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.0]
-- DATASOURCE_SCAN |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan
index 4e264fa..2ada1fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_cbo/column/pushdown/other-pushdowns/other-pushdowns.021.plan
@@ -1,49 +1,49 @@
-distribute result [$$68] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+distribute result [$$66] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- DISTRIBUTE_RESULT |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- ONE_TO_ONE_EXCHANGE |UNPARTITIONED|
- project ([$$68]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |UNPARTITIONED|
- assign [$$68] <- [{"count": $$71}] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ assign [$$66] <- [{"count": $$69}] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- ASSIGN |UNPARTITIONED|
- aggregate [$$71] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ aggregate [$$69] <- [agg-sql-count(1)] [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- AGGREGATE |UNPARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
- -- SORT_MERGE_EXCHANGE [$$66(ASC) ] |PARTITIONED|
- distinct ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ -- SORT_MERGE_EXCHANGE [$$64(ASC) ] |PARTITIONED|
+ distinct ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- PRE_SORTED_DISTINCT_BY |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- order (ASC, $$66) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
- -- STABLE_SORT [$$66(ASC)] |PARTITIONED|
+ order (ASC, $$64) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ -- STABLE_SORT [$$64(ASC)] |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
- -- HASH_PARTITION_EXCHANGE [$$66] |PARTITIONED|
- project ([$$66]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ -- HASH_PARTITION_EXCHANGE [$$64] |PARTITIONED|
+ project ([$$64]) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
- select (ge($$70, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
+ select (ge($$68, 3)) [cardinality: 0.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_SELECT |PARTITIONED|
- project ([$$66, $$70]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+ project ([$$64, $$68]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
subplan {
- aggregate [$$70] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ aggregate [$$68] <- [agg-sql-sum($$52)] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- AGGREGATE |LOCAL|
assign [$$52] <- [$$i.getField("count")] [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ASSIGN |LOCAL|
- unnest $$i <- scan-collection($$72) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
+ unnest $$i <- scan-collection($$70) [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- UNNEST |LOCAL|
nested tuple source [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- NESTED_TUPLE_SOURCE |LOCAL|
} [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- SUBPLAN |PARTITIONED|
- project ([$$66, $$72]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+ project ([$$64, $$70]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
- assign [$$66, $$72] <- [if-missing-or-null(to-object($$t), cast({ })).getField(0), $$t.getField("a1")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
+ assign [$$64, $$70] <- [to-object-var-str($$t).getField(0), $$t.getField("a1")] [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- ASSIGN |PARTITIONED|
project ([$$t]) [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- STREAM_PROJECT |PARTITIONED|
exchange [cardinality: 2.0, op-cost: 0.0, total-cost: 2.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
- data-scan []<-[$$69, $$t] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.0]
+ data-scan []<-[$$67, $$t] <- test.ColumnDataset [cardinality: 2.0, op-cost: 2.0, total-cost: 2.0]
-- DATASOURCE_SCAN |PARTITIONED|
exchange [cardinality: 0.0, op-cost: 0.0, total-cost: 0.0]
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index 040b3ca..afb829e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -7391,6 +7391,11 @@
<output-dir compare="Text">query-ASTERIXDB-3415</output-dir>
</compilation-unit>
</test-case>
+ <test-case FilePath="misc">
+ <compilation-unit name="query-ASTERIXDB-3419">
+ <output-dir compare="Text">query-ASTERIXDB-3419</output-dir>
+ </compilation-unit>
+ </test-case>
</test-group>
<test-group name="multipart-dataverse">
<test-case FilePath="multipart-dataverse">
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
index d7e9210..21b8b60 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
@@ -138,6 +138,7 @@
import org.apache.asterix.om.typecomputer.impl.ToDoubleTypeComputer;
import org.apache.asterix.om.typecomputer.impl.ToNumberTypeComputer;
import org.apache.asterix.om.typecomputer.impl.ToObjectTypeComputer;
+import org.apache.asterix.om.typecomputer.impl.ToObjectVarStrTypeComputer;
import org.apache.asterix.om.typecomputer.impl.TreatAsTypeComputer;
import org.apache.asterix.om.typecomputer.impl.UnaryBinaryInt64TypeComputer;
import org.apache.asterix.om.typecomputer.impl.UniformInputTypeComputer;
@@ -1263,6 +1264,7 @@
public static final FunctionIdentifier TO_DOUBLE = FunctionConstants.newAsterix("to-double", 1);
public static final FunctionIdentifier TO_NUMBER = FunctionConstants.newAsterix("to-number", 1);
public static final FunctionIdentifier TO_OBJECT = FunctionConstants.newAsterix("to-object", 1);
+ public static final FunctionIdentifier TO_OBJECT_VAR_STR = FunctionConstants.newAsterix("to-object-var-str", 1);
public static final FunctionIdentifier TO_STRING = FunctionConstants.newAsterix("to-string", 1);
public static final FunctionIdentifier TREAT_AS_INTEGER = FunctionConstants.newAsterix("treat-as-integer", 1);
@@ -1529,6 +1531,7 @@
addFunction(TO_DOUBLE, ToDoubleTypeComputer.INSTANCE, true);
addFunction(TO_NUMBER, ToNumberTypeComputer.INSTANCE, true);
addFunction(TO_OBJECT, ToObjectTypeComputer.INSTANCE, true);
+ addPrivateFunction(TO_OBJECT_VAR_STR, ToObjectVarStrTypeComputer.INSTANCE, true);
addFunction(TO_STRING, AStringTypeComputer.INSTANCE_NULLABLE, true);
addPrivateFunction(TREAT_AS_INTEGER, TreatAsTypeComputer.INSTANCE_INTEGER, true);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ToObjectVarStrTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ToObjectVarStrTypeComputer.java
new file mode 100644
index 0000000..2d67029
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ToObjectVarStrTypeComputer.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.om.typecomputer.impl;
+
+import java.util.List;
+
+import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
+import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.types.TypeHelper;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
+import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
+
+public class ToObjectVarStrTypeComputer implements IResultTypeComputer {
+ public static final ToObjectVarStrTypeComputer INSTANCE = new ToObjectVarStrTypeComputer();
+
+ private ToObjectVarStrTypeComputer() {
+ }
+
+ @Override
+ public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
+ IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
+ AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expression;
+
+ List<Mutable<ILogicalExpression>> arguments = fce.getArguments();
+ ILogicalExpression arg = arguments.get(0).getValue();
+ IAType inputType = (IAType) env.getType(arg);
+ IAType knownInputType = TypeComputeUtils.getActualType(inputType);
+ if (TypeHelper.canBeUnknown(inputType) || knownInputType.getTypeTag() != ATypeTag.OBJECT) {
+ return DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE;
+ } else {
+ return knownInputType;
+ }
+ }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/TypeComputeUtils.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/TypeComputeUtils.java
index 94fb998..77b4c04 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/TypeComputeUtils.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/TypeComputeUtils.java
@@ -187,7 +187,7 @@
return actualTypes;
}
- private static boolean[] isUnknownableType(IAType... inputTypes) {
+ public static boolean[] isUnknownableType(IAType... inputTypes) {
boolean[] unknownable = new boolean[inputTypes.length];
for (int index = 0; index < unknownable.length; ++index) {
IAType type = inputTypes[index];
diff --git a/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java b/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java
index 07f2021..cbcb8b3 100644
--- a/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java
+++ b/asterixdb/asterix-om/src/test/java/org/apache/asterix/test/om/typecomputer/TypeComputerTest.java
@@ -43,6 +43,7 @@
import org.apache.asterix.om.typecomputer.impl.RecordAddFieldsTypeComputer;
import org.apache.asterix.om.typecomputer.impl.RecordMergeTypeComputer;
import org.apache.asterix.om.typecomputer.impl.RecordRemoveFieldsTypeComputer;
+import org.apache.asterix.om.typecomputer.impl.ToObjectVarStrTypeComputer;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.AUnionType;
import org.apache.asterix.om.types.BuiltinType;
@@ -169,9 +170,8 @@
ATypeTag typeTag = resultType.getTypeTag();
// Result should be ANY, Missable or Nullable
- Assert.assertTrue(typeTag == ATypeTag.ANY
- || (typeTag == ATypeTag.UNION && ((AUnionType) resultType).isNullableType()
- || ((AUnionType) resultType).isMissableType()));
+ Assert.assertTrue(typeTag == ATypeTag.ANY || (typeTag == ATypeTag.UNION
+ && (((AUnionType) resultType).isNullableType() || ((AUnionType) resultType).isMissableType())));
}
}
}
@@ -198,6 +198,7 @@
differentBehaviorFunctions.add(RecordMergeTypeComputer.class.getSimpleName());
differentBehaviorFunctions.add(BooleanOrMissingTypeComputer.class.getSimpleName());
differentBehaviorFunctions.add(LocalSingleVarStatisticsTypeComputer.class.getSimpleName());
+ differentBehaviorFunctions.add(ToObjectVarStrTypeComputer.class.getSimpleName());
}
/**
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
new file mode 100644
index 0000000..6b72fc9
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToObjectVarStrDescriptor.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import static org.apache.asterix.om.pointables.base.DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE;
+
+import java.io.DataOutput;
+
+import org.apache.asterix.builders.RecordBuilder;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
+import org.apache.asterix.om.pointables.ARecordVisitablePointable;
+import org.apache.asterix.om.pointables.base.IVisitablePointable;
+import org.apache.asterix.om.pointables.cast.ACastVisitor;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.types.TypeHelper;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
+import org.apache.hyracks.algebricks.common.utils.Triple;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.VoidPointable;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+
+public class ToObjectVarStrDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+
+ private static final long serialVersionUID = 1L;
+ private ARecordType argType;
+ private ARecordType outType;
+
+ public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+ @Override
+ public IFunctionDescriptor createFunctionDescriptor() {
+ return new ToObjectVarStrDescriptor();
+ }
+
+ @Override
+ public IFunctionTypeInferer createFunctionTypeInferer() {
+ return new FunctionTypeInferers.ToObjectVarStrTypeInferer();
+ }
+ };
+
+ @Override
+ public void setImmutableStates(Object... states) {
+ outType = (ARecordType) states[0];
+ if (((IAType) states[1]).getTypeTag() == ATypeTag.OBJECT) {
+ argType = (ARecordType) states[1];
+ } else {
+ argType = NESTED_OPEN_RECORD_TYPE;
+ }
+ }
+
+ @Override
+ public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) {
+ return new IScalarEvaluatorFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public IScalarEvaluator createScalarEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+ return new ToObjectVarStrEvaluator(ctx);
+ }
+
+ final class ToObjectVarStrEvaluator implements IScalarEvaluator {
+
+ private final IPointable arg0 = new VoidPointable();
+ private final ArrayBackedValueStorage emptyRecStorage = new ArrayBackedValueStorage();
+ private final DataOutput emptyRecOut = emptyRecStorage.getDataOutput();
+ private final IScalarEvaluator eval0;
+ private final ARecordVisitablePointable argRec;
+ private final boolean castRequired;
+ private ACastVisitor castVisitor;
+ private Triple<IVisitablePointable, IAType, Boolean> castVisitorArg;
+ private boolean wroteEmpty;
+
+ private ToObjectVarStrEvaluator(final IEvaluatorContext ctx) throws HyracksDataException {
+ eval0 = args[0].createScalarEvaluator(ctx);
+ if (!TypeHelper.isFullyOpen(argType) && TypeHelper.isFullyOpen(outType)) {
+ castRequired = true;
+ argRec = new ARecordVisitablePointable(argType);
+ ARecordVisitablePointable openRec = new ARecordVisitablePointable(NESTED_OPEN_RECORD_TYPE);
+ castVisitor = new ACastVisitor();
+ castVisitorArg = new Triple<>(openRec, openRec.getInputRecordType(), Boolean.FALSE);
+ } else {
+ castRequired = false;
+ argRec = null;
+ }
+ }
+
+ @Override
+ public void evaluate(IFrameTupleReference tuple, IPointable resultPointable)
+ throws HyracksDataException {
+ eval0.evaluate(tuple, arg0);
+ if (arg0.getByteArray()[arg0.getStartOffset()] == ATypeTag.SERIALIZED_RECORD_TYPE_TAG) {
+ if (castRequired) {
+ argRec.set(arg0);
+ argRec.accept(castVisitor, castVisitorArg);
+ resultPointable.set(castVisitorArg.first);
+ } else {
+ resultPointable.set(arg0);
+ }
+ } else {
+ writeEmpty();
+ resultPointable.set(emptyRecStorage);
+ }
+ }
+
+ private void writeEmpty() throws HyracksDataException {
+ if (!wroteEmpty) {
+ wroteEmpty = true;
+ emptyRecStorage.reset();
+ RecordBuilder openRecordBuilder = new RecordBuilder();
+ openRecordBuilder.reset(NESTED_OPEN_RECORD_TYPE);
+ openRecordBuilder.init();
+ openRecordBuilder.write(emptyRecOut, true);
+ }
+
+ }
+ }
+ };
+ }
+
+ @Override
+ public FunctionIdentifier getIdentifier() {
+ return BuiltinFunctions.TO_OBJECT_VAR_STR;
+ }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index 4149e1c..214c8a0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -511,6 +511,7 @@
import org.apache.asterix.runtime.evaluators.functions.ToDoubleDescriptor;
import org.apache.asterix.runtime.evaluators.functions.ToNumberDescriptor;
import org.apache.asterix.runtime.evaluators.functions.ToObjectDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.ToObjectVarStrDescriptor;
import org.apache.asterix.runtime.evaluators.functions.ToStringDescriptor;
import org.apache.asterix.runtime.evaluators.functions.TreatAsIntegerDescriptor;
import org.apache.asterix.runtime.evaluators.functions.UUIDDescriptor;
@@ -1323,6 +1324,7 @@
fc.add(ToDoubleDescriptor.FACTORY);
fc.add(ToNumberDescriptor.FACTORY);
fc.add(ToObjectDescriptor.FACTORY);
+ fc.add(ToObjectVarStrDescriptor.FACTORY);
fc.add(ToStringDescriptor.FACTORY);
fc.add(TreatAsIntegerDescriptor.FACTORY);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
index 731a880..67c5ee3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
@@ -393,4 +393,16 @@
}
return argsTypes;
}
+
+ public static final class ToObjectVarStrTypeInferer implements IFunctionTypeInferer {
+ @Override
+ public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+ CompilerProperties compilerProps) throws AlgebricksException {
+ AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
+ List<Mutable<ILogicalExpression>> args = f.getArguments();
+ fd.setImmutableStates(context.getType(expr),
+ TypeComputeUtils.getActualType((IAType) context.getType(args.get(0).getValue())));
+ }
+
+ }
}
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SelectOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SelectOperator.java
index 3bcf29c..2d2910f 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SelectOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/SelectOperator.java
@@ -129,9 +129,24 @@
return env;
}
AbstractFunctionCallExpression f1 = (AbstractFunctionCallExpression) condition.getValue();
- if (!f1.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.NOT)) {
+ if (f1.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.AND)) {
+ for (Mutable<ILogicalExpression> a1 : f1.getArguments()) {
+ if (a1.getValue().getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
+ computeMissableNullAble(env, (AbstractFunctionCallExpression) a1.getValue());
+ }
+ }
return env;
}
+ if (f1.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.NOT)) {
+ computeMissableNullAble(env, f1);
+ }
+ return env;
+ }
+
+ private void computeMissableNullAble(PropagatingTypeEnvironment env, AbstractFunctionCallExpression f1) {
+ if (!f1.getFunctionIdentifier().equals(AlgebricksBuiltinFunctions.NOT)) {
+ return;
+ }
ILogicalExpression a1 = f1.getArguments().get(0).getValue();
if (a1.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
AbstractFunctionCallExpression f2 = (AbstractFunctionCallExpression) a1;
@@ -142,7 +157,6 @@
extractFunctionArgVarInto(f2, env.getNonNullableVariables());
}
}
- return env;
}
@Override