From a98731d487b2a6c01cbd7ebf256031593b235236 Mon Sep 17 00:00:00 2001 From: Youssef Hatem Date: Wed, 11 Nov 2026 09:48:28 +0000 Subject: [PATCH] Cost-free covering scans for values computed from index columns Replace `ScanWithFetchMatchCandidate.isOfPushableTypesOrConstant` and the hand-rolled `mapMaybe` fold in `pushValueThroughFetch` with a `MaxMatchMap` against the record a covering scan can provide. The removed guard allowed only `FieldValue` and `RecordConstructorValue`, so any arithmetic in a projection forced a record fetch: `SELECT a + b` over an index on `(a, b)` could not use a covering scan even though both columns are in the index entry. The guard was added by be93a3c27 (#2090) to keep a `VersionValue` from being pushed; `VersionValue` was since deleted in f73792126 (#4101), and `__ROW_VERSION` is now a `PseudoField` that is excluded upstream by `IndexKeyValueToPartialRecord.Builder.validateField`, so the guard no longer protected anything. `IndexEntryToLogicalRecord` gains a `providedRecordValue`: the base record with each carried field reading itself and the rest absent, keyed by ordinal so that escaped SQL identifiers line up with their descriptor names. The translated value is simplified, so a correlated `q0.x` does not come back as a field of a record constructed over `q0`. Plan expectations are updated across the yamsql files; queries only gain covering scans. Where a union now runs over covering legs the fetch sits above the union. --- .../IndexEntryToRecordValueHelper.java | 2 +- .../cascades/ScanWithFetchMatchCandidate.java | 114 +-- .../ValueIndexScanMatchCandidate.java | 8 +- .../WindowedIndexScanMatchCandidate.java | 6 +- .../FDBLongArithmeticFunctionQueryTest.java | 31 +- .../query/FDBOrderingQueryTest.java | 47 +- .../src/test/java/YamlIntegrationTests.java | 12 + .../aggregate-index-tests.metrics.binpb | 178 ++--- .../aggregate-index-tests.metrics.yaml | 424 +++++------ .../resources/aggregate-index-tests.yamsql | 10 +- .../src/test/resources/between.metrics.binpb | 37 +- .../src/test/resources/between.metrics.yaml | 36 +- yaml-tests/src/test/resources/between.yamsql | 4 +- .../bitmap-aggregate-index.metrics.binpb | 16 +- .../bitmap-aggregate-index.metrics.yaml | 20 +- .../resources/bitmap-aggregate-index.yamsql | 2 +- .../src/test/resources/catalog.metrics.binpb | 13 +- .../src/test/resources/catalog.metrics.yaml | 24 +- .../composite-aggregates.metrics.binpb | 16 +- .../composite-aggregates.metrics.yaml | 13 +- .../resources/composite-aggregates.yamsql | 2 +- .../covering-sum-pushdown.metrics.binpb | 14 + .../covering-sum-pushdown.metrics.yaml | 13 + .../resources/covering-sum-pushdown.yamsql | 50 ++ .../test/resources/create-drop.metrics.binpb | 4 +- .../test/resources/create-drop.metrics.yaml | 12 +- .../resources/join-tests-outer.metrics.binpb | 14 +- .../resources/join-tests-outer.metrics.yaml | 24 +- .../test/resources/join-tests-outer.yamsql | 2 +- .../join-with-order-by-tests.metrics.binpb | 72 +- .../join-with-order-by-tests.metrics.yaml | 42 +- .../resources/nested-with-nulls.metrics.binpb | 65 +- .../resources/nested-with-nulls.metrics.yaml | 68 +- .../test/resources/nested-with-nulls.yamsql | 8 +- .../record-type-key-tests.metrics.binpb | 25 +- .../record-type-key-tests.metrics.yaml | 20 +- .../resources/record-type-key-tests.yamsql | 4 +- .../resources/recursive-cte.metrics.binpb | 273 ++++---- .../test/resources/recursive-cte.metrics.yaml | 301 ++++---- .../src/test/resources/recursive-cte.yamsql | 28 +- .../row-version-pushdown.metrics.binpb | 61 ++ .../row-version-pushdown.metrics.yaml | 65 ++ .../resources/row-version-pushdown.yamsql | 70 ++ .../resources/select-a-star.metrics.binpb | 33 +- .../test/resources/select-a-star.metrics.yaml | 63 +- .../src/test/resources/select-a-star.yamsql | 6 +- .../resources/sql-functions.metrics.binpb | 145 ++-- .../test/resources/sql-functions.metrics.yaml | 155 ++-- .../src/test/resources/sql-functions.yamsql | 14 +- .../resources/subquery-tests.metrics.binpb | Bin 290686 -> 292061 bytes .../resources/subquery-tests.metrics.yaml | 661 +++++++++--------- .../src/test/resources/subquery-tests.yamsql | 62 +- .../resources/valid-identifiers.metrics.binpb | 34 +- .../resources/valid-identifiers.metrics.yaml | 81 +-- .../test/resources/valid-identifiers.yamsql | 4 +- 55 files changed, 1941 insertions(+), 1567 deletions(-) create mode 100644 yaml-tests/src/test/resources/covering-sum-pushdown.metrics.binpb create mode 100644 yaml-tests/src/test/resources/covering-sum-pushdown.metrics.yaml create mode 100644 yaml-tests/src/test/resources/covering-sum-pushdown.yamsql create mode 100644 yaml-tests/src/test/resources/row-version-pushdown.metrics.binpb create mode 100644 yaml-tests/src/test/resources/row-version-pushdown.metrics.yaml create mode 100644 yaml-tests/src/test/resources/row-version-pushdown.yamsql diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/IndexEntryToRecordValueHelper.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/IndexEntryToRecordValueHelper.java index e5a8faab282..176bca3930a 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/IndexEntryToRecordValueHelper.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/IndexEntryToRecordValueHelper.java @@ -111,7 +111,7 @@ public RecordConstructorValue toRecordValue(@Nonnull final Type.Record targetTyp * array, which cannot be null and whose emptiness is indistinguishable from being unset. */ @Nonnull - private static Value absent(@Nonnull final Type fieldType) { + static Value absent(@Nonnull final Type fieldType) { if (fieldType.getTypeCode() == Type.TypeCode.ARRAY && !fieldType.isNullable()) { return LightArrayConstructorValue.emptyArray( Objects.requireNonNull(((Type.Array)fieldType).getElementType())); diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ScanWithFetchMatchCandidate.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ScanWithFetchMatchCandidate.java index 16a7cc00e18..74119ca4d95 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ScanWithFetchMatchCandidate.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ScanWithFetchMatchCandidate.java @@ -28,6 +28,7 @@ import com.apple.foundationdb.record.query.plan.cascades.values.QuantifiedObjectValue; import com.apple.foundationdb.record.query.plan.cascades.values.RecordConstructorValue; import com.apple.foundationdb.record.query.plan.cascades.values.Value; +import com.apple.foundationdb.record.query.plan.cascades.values.translation.MaxMatchMap; import com.apple.foundationdb.record.util.pair.NonnullPair; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -54,47 +55,21 @@ static Optional pushValueThroughFetch(@Nonnull final Value toBePushedValu @Nonnull final CorrelationIdentifier baseAlias, @Nonnull final CorrelationIdentifier sourceAlias, @Nonnull final CorrelationIdentifier targetAlias, - @Nonnull final Iterable providedValuesFromIndex) { - if (!isOfPushableTypesOrConstant(toBePushedValue, sourceAlias)) { - return Optional.empty(); - } - - final AliasMap equivalenceMap = AliasMap.ofAliases(sourceAlias, baseAlias); - final AliasMap toTargetAliasMap = AliasMap.ofAliases(sourceAlias, targetAlias); - - final var translatedValueOptional = - toBePushedValue.mapMaybe((value, mappedChildren) -> { - for (final var providedValue : providedValuesFromIndex) { - if (value.semanticEquals(providedValue, equivalenceMap)) { - return value.withChildren(mappedChildren) - .rebase(toTargetAliasMap); - } - } - return value.withChildren(mappedChildren); // this may be correlated to sourceAlias - }); + @Nonnull final Value providedRecordValue) { + // + // Maximum-match the value against the record the index scan provides, so that as much of it as the entry can + // supply gets expressed over the scan. A value computed from provided fields pushes even though it is not + // itself a field, while one reading a field the entry lacks stays correlated to sourceAlias and fails below. + // + final var maxMatchMap = + MaxMatchMap.compute(toBePushedValue, providedRecordValue, + ImmutableSet.of(baseAlias), + ValueEquivalence.fromAliasMap(AliasMap.ofAliases(sourceAlias, baseAlias))); // the translation was successful if the translated value is not correlated to sourceAlias anymore - return translatedValueOptional.filter(translatedValue -> !translatedValue.getCorrelatedTo().contains(sourceAlias)); - } - - private static boolean isOfPushableTypesOrConstant(@Nonnull final Value toBePushedValue, - @Nonnull final CorrelationIdentifier sourceAlias) { - if (!toBePushedValue.getCorrelatedTo().contains(sourceAlias)) { - return true; - } - if (toBePushedValue instanceof FieldValue) { - return true; - } else if (toBePushedValue instanceof RecordConstructorValue) { - return ((RecordConstructorValue)toBePushedValue).getColumns().stream() - .allMatch(column -> isOfPushableTypesOrConstant(column.getValue(), sourceAlias)); - } else { - // Effectively, this check is needed because of values like the VersionValue, which aren't - // accessible without a record fetch, even if the index entry contains a VersionValue. We - // should address this by attaching the version to a partial record if there's one in the - // index entry, but until then, this prevents us from incorrectly applying a covering - // optimization. - return false; - } + return maxMatchMap.translateQueryValueMaybe(targetAlias) + .map(translatedValue -> translatedValue.simplify(EvaluationContext.empty(), AliasMap.emptyMap(), ImmutableSet.of())) + .filter(translatedValue -> !translatedValue.getCorrelatedTo().contains(sourceAlias)); } static boolean addCoveringField(@Nonnull final IndexKeyValueToPartialRecord.Builder builder, @@ -146,6 +121,7 @@ static Optional computeIn final var builder = IndexKeyValueToPartialRecord.newBuilder(queriedRecordType); final var baseObjectValue = QuantifiedObjectValue.of(baseAlias, baseType); final var covered = new IndexEntryToRecordValueHelper(); + final var providedFieldsBuilder = ImmutableList.builder(); final var logicalKeyValuesBuilder = ImmutableList.builder(); for (int i = 0; i < indexKeyValues.size(); i++) { final Value keyValue = indexKeyValues.get(i); @@ -160,6 +136,7 @@ static Optional computeIn return Optional.empty(); } recordCoveredField(covered, extractFromIndexEntryPair); + providedFieldsBuilder.add(extractFromIndexEntryPair.getKey()); logicalKeyValuesBuilder.add(extractFromIndexEntryPair.getLeft()); } } @@ -178,6 +155,7 @@ static Optional computeIn return Optional.empty(); } recordCoveredField(covered, extractFromIndexEntryPair); + providedFieldsBuilder.add(extractFromIndexEntryPair.getKey()); logicalValueValuesBuilder.add(extractFromIndexEntryPair.getLeft()); } } @@ -189,7 +167,58 @@ static Optional computeIn return Optional.of( new ScanWithFetchMatchCandidate.IndexEntryToLogicalRecord(queriedRecordType, builder.build(), logicalKeyValuesBuilder.build(), logicalValueValuesBuilder.build(), - indexEntryToRecordValue(baseType, covered))); + indexEntryToRecordValue(baseType, covered), + providedRecordValue(baseType, providedFieldsBuilder.build()))); + } + + /** + * The record a covering scan provides, as a value over the base: every field the entry carries reads itself, the + * rest read absent. Addressed by ordinal rather than by field name, because the names an index's extracted + * {@link FieldValue}s carry are the record descriptor's, which differ from the base type's wherever an identifier + * had to be escaped. + * + * @param baseType the record an entry is read into + * @param providedFields what the entry carries, as paths into {@code baseType} + * + * @return that value, or {@code null} if one cannot be built + */ + @Nullable + private static Value providedRecordValue(@Nonnull final Type baseType, + @Nonnull final List providedFields) { + if (!(baseType instanceof Type.Record)) { + return null; + } + return providedRecordValue((Type.Record)baseType, providedFields, 0); + } + + @Nonnull + private static Value providedRecordValue(@Nonnull final Type.Record recordType, + @Nonnull final List providedFields, + final int depth) { + final var fields = recordType.getFields(); + final var columns = ImmutableList.>builder(); + for (int ordinal = 0; ordinal < fields.size(); ordinal++) { + final var field = fields.get(ordinal); + final int currentOrdinal = ordinal; + final var through = providedFields.stream() + .filter(fieldValue -> fieldValue.getFieldOrdinals().length() > depth + && fieldValue.getFieldOrdinals().get(depth) == currentOrdinal) + .collect(ImmutableList.toImmutableList()); + // the first one ending here wins, keeping the first of an index's repeated columns for one field + final var endingHere = through.stream() + .filter(fieldValue -> fieldValue.getFieldOrdinals().length() == depth + 1) + .findFirst(); + final Value column; + if (endingHere.isPresent()) { + column = endingHere.get(); + } else if (!through.isEmpty() && field.getFieldType() instanceof Type.Record) { + column = providedRecordValue((Type.Record)field.getFieldType(), through, depth + 1); + } else { + column = IndexEntryToRecordValueHelper.absent(field.getFieldType()); + } + columns.add(Column.of(field, column)); + } + return RecordConstructorValue.ofColumns(columns.build()); } /** @@ -228,10 +257,13 @@ private static Value indexEntryToRecordValue(@Nonnull final Type baseType, * @param logicalKeyValues what each entry key column reads from the record * @param logicalValueValues what each entry value column reads from the record * @param indexEntryToRecordValue the value that decodes it, or {@code null} if one cannot be built + * @param providedRecordValue the record a covering scan provides, each carried field reading itself, or + * {@code null} if one cannot be built */ record IndexEntryToLogicalRecord(@Nonnull RecordType queriedRecordType, @Nonnull IndexKeyValueToPartialRecord indexKeyValueToPartialRecord, @Nonnull List logicalKeyValues, @Nonnull List logicalValueValues, - @Nullable Value indexEntryToRecordValue) { + @Nullable Value indexEntryToRecordValue, + @Nullable Value providedRecordValue) { } } diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ValueIndexScanMatchCandidate.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ValueIndexScanMatchCandidate.java index a7e3d90f5d5..c8d37242cb6 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ValueIndexScanMatchCandidate.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/ValueIndexScanMatchCandidate.java @@ -37,7 +37,6 @@ import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -289,13 +288,16 @@ public Optional pushValueThroughFetch(@Nonnull final Value toBePushedValu @Nonnull final CorrelationIdentifier targetAlias) { final var indexEntryToLogicalRecord = getIndexEntryToLogicalRecordMaybe().orElseThrow(() -> new RecordCoreException("need index entry to logical record")); + final var providedRecordValue = indexEntryToLogicalRecord.providedRecordValue(); + if (providedRecordValue == null) { + return Optional.empty(); + } return ScanWithFetchMatchCandidate.pushValueThroughFetch(toBePushedValue, baseAlias, sourceAlias, targetAlias, - Iterables.concat(indexEntryToLogicalRecord.logicalKeyValues(), - indexEntryToLogicalRecord.logicalValueValues())); + providedRecordValue); } @Override diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/WindowedIndexScanMatchCandidate.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/WindowedIndexScanMatchCandidate.java index 13be511c3f4..c83bcffdcaa 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/WindowedIndexScanMatchCandidate.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/WindowedIndexScanMatchCandidate.java @@ -457,12 +457,16 @@ public Optional pushValueThroughFetch(@Nonnull Value toBePushedValue, @Nonnull CorrelationIdentifier targetAlias) { final var indexEntryToLogicalRecord = getIndexEntryToLogicalRecordMaybe().orElseThrow(() -> new RecordCoreException("need index entry to logical record")); + final var providedRecordValue = indexEntryToLogicalRecord.providedRecordValue(); + if (providedRecordValue == null) { + return Optional.empty(); + } return ScanWithFetchMatchCandidate.pushValueThroughFetch(toBePushedValue, baseAlias, sourceAlias, targetAlias, - indexEntryToLogicalRecord.logicalKeyValues()); + providedRecordValue); } @Nonnull diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBLongArithmeticFunctionQueryTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBLongArithmeticFunctionQueryTest.java index 70c25ade3f0..50e41157a1c 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBLongArithmeticFunctionQueryTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBLongArithmeticFunctionQueryTest.java @@ -448,16 +448,19 @@ void matchConstantMaskValue() { assertEquals(-1043926565, plan.planHash(PlanHashable.CURRENT_LEGACY)); assertEquals(-1859939974, plan.planHash(PlanHashable.CURRENT_FOR_CONTINUATION)); } else { - // The other mask values do not work, and so they require executing as a scan + // The other mask values do not match the literal in the expected index, but both the predicate + // and the result can be computed from the entries of the index on num_value_unique, so the scan + // over that index stays covering and the mask is applied as a residual predicate. assertMatchesExactly(plan, mapPlan( predicatesFilterPlan( - typeFilterPlan( - scanPlan().where(scanComparisons(unbounded()) - ) + coveringIndexPlan().where(indexPlanOf( + indexPlan().where(indexName("MySimpleRecord$num_value_unique")) + .and(scanComparisons(unbounded())) + )) ) - ))); - // assertEquals(0, plan.planHash(PlanHashable.CURRENT_LEGACY)); - assertEquals(-1713033856, plan.planHash(PlanHashable.CURRENT_FOR_CONTINUATION)); + )); + // ConstantObjectValue does not support the legacy plan hash mode + assertEquals(-1086853773, plan.planHash(PlanHashable.CURRENT_FOR_CONTINUATION)); } for (long queryMaskValue : List.of(0L, mask, mask + 1)) { @@ -512,15 +515,15 @@ void calculateFunctionFromCoveringIndexScan() { Quantifier selectQun = Quantifier.forEach(Reference.initialOf(select)); return Reference.initialOf(new LogicalSortExpression(RequestedOrdering.preserve(), selectQun)); }); - // This should be planned as a covering index scan of the index because the functions can be calculated from the values - // in the index. Until matching improves, we can get by with this plan + // This is planned as a covering index scan of the index because the functions can be calculated from the + // values in the index. assertMatchesExactly(plan, mapPlan( - typeFilterPlan( - scanPlan().where(scanComparisons(unbounded())) - ) + coveringIndexPlan().where(indexPlanOf( + indexPlan().where(indexName(index.getName())).and(scanComparisons(unbounded())) + )) )); - assertEquals(1263343956, plan.planHash(PlanHashable.CURRENT_LEGACY)); - assertEquals(-2029074143, plan.planHash(PlanHashable.CURRENT_FOR_CONTINUATION)); + assertEquals(1905107315, plan.planHash(PlanHashable.CURRENT_LEGACY)); + assertEquals(355706836, plan.planHash(PlanHashable.CURRENT_FOR_CONTINUATION)); Set> results = new HashSet<>(); try (RecordCursor cursor = executeCascades(recordStore, plan)) { diff --git a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrderingQueryTest.java b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrderingQueryTest.java index 8d64222b0c3..9a316107d37 100644 --- a/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrderingQueryTest.java +++ b/fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/foundationdb/query/FDBOrderingQueryTest.java @@ -30,6 +30,7 @@ import com.apple.foundationdb.record.query.expressions.Query; import com.apple.foundationdb.record.query.expressions.QueryComponent; import com.apple.foundationdb.record.query.plan.RecordQueryPlanner; +import com.apple.foundationdb.record.query.plan.plans.RecordQueryFetchFromPartialRecordPlan; import com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan; import com.apple.foundationdb.record.query.plan.plans.RecordQueryUnionOnKeyExpressionPlan; import com.apple.foundationdb.record.query.plan.plans.RecordQueryUnionOnValuesPlan; @@ -52,12 +53,14 @@ import static com.apple.foundationdb.record.metadata.Key.Expressions.field; import static com.apple.foundationdb.record.metadata.Key.Expressions.function; import static com.apple.foundationdb.record.query.plan.ScanComparisons.range; +import static com.apple.foundationdb.record.query.plan.ScanComparisons.unbounded; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.ListMatcher.exactly; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.ListMatcher.only; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.QueryPredicateMatchers.anyComparisonOfType; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.QueryPredicateMatchers.valuePredicate; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.RecordQueryPlanMatchers.comparisonKeyValues; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.RecordQueryPlanMatchers.coveringIndexPlan; +import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.RecordQueryPlanMatchers.fetchFromPartialRecordPlan; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.RecordQueryPlanMatchers.indexName; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.RecordQueryPlanMatchers.indexPlan; import static com.apple.foundationdb.record.query.plan.cascades.matching.structure.RecordQueryPlanMatchers.indexPlanOf; @@ -261,7 +264,9 @@ void testUnionOrdered() throws Exception { if (planner instanceof RecordQueryPlanner) { assertTrue(plan instanceof RecordQueryUnionOnKeyExpressionPlan); } else { - assertTrue(plan instanceof RecordQueryUnionOnValuesPlan); + // the union is over covering scans, so the fetch is hoisted above it + assertTrue(plan instanceof RecordQueryFetchFromPartialRecordPlan); + assertTrue(((RecordQueryFetchFromPartialRecordPlan)plan).getChild() instanceof RecordQueryUnionOnValuesPlan); } } @@ -282,15 +287,16 @@ void testUnionOrdered2() throws Exception { assertTrue(plan instanceof RecordQueryUnionOnKeyExpressionPlan); } else { final var planMatcher = - unionOnValuesPlan( - indexPlan().where(indexName("num_value_2_str_value_num_value_3_indexed")).and(scanComparisons(range("[[100, hello, 2],[100, hello, 2]]"))), - indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(range("[[101],[101]]"))), - indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(range("[[102],[102]]"))) - ).where( - comparisonKeyValues(exactly(fieldValueWithFieldNames("num_value_2"), - toOrderedBytesValue(fieldValueWithFieldNames("str_value_indexed"), - TupleOrdering.Direction.DESC_NULLS_LAST), - fieldValueWithFieldNames("rec_no")))); + fetchFromPartialRecordPlan( + unionOnValuesPlan( + coveringIndexPlan().where(indexPlanOf(indexPlan().where(indexName("num_value_2_str_value_num_value_3_indexed")).and(scanComparisons(range("[[100, hello, 2],[100, hello, 2]]"))))), + coveringIndexPlan().where(indexPlanOf(indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(range("[[101],[101]]"))))), + coveringIndexPlan().where(indexPlanOf(indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(range("[[102],[102]]"))))) + ).where( + comparisonKeyValues(exactly(fieldValueWithFieldNames("num_value_2"), + toOrderedBytesValue(fieldValueWithFieldNames("str_value_indexed"), + TupleOrdering.Direction.DESC_NULLS_LAST), + fieldValueWithFieldNames("rec_no"))))); assertMatchesExactly(plan, planMatcher); } } @@ -315,15 +321,26 @@ void testUnionOrdered3() throws Exception { } else { final var planMatcher = unionOnValuesPlan( + fetchFromPartialRecordPlan( + unionOnValuesPlan( + predicatesFilterPlan( + coveringIndexPlan().where(indexPlanOf(indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(unbounded()))))) + .where(predicates(only(valuePredicate(fieldValueWithFieldNames("num_value_2"), + anyComparisonOfType(Comparisons.Type.EQUALS))))), + predicatesFilterPlan( + coveringIndexPlan().where(indexPlanOf(indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(unbounded()))))) + .where(predicates(only(valuePredicate(fieldValueWithFieldNames("num_value_2"), + anyComparisonOfType(Comparisons.Type.EQUALS))))) + ).where(comparisonKeyValues(exactly(fieldValueWithFieldNames("num_value_2"), + toOrderedBytesValue(fieldValueWithFieldNames("str_value_indexed"), + TupleOrdering.Direction.DESC_NULLS_LAST), + fieldValueWithFieldNames("rec_no"))))), predicatesFilterPlan( indexPlan().where(indexName("ordered_str_value")) .and(scanComparisons(range("[EQUALS 100, EQUALS to_ordered_bytes('hello', DESC_NULLS_LAST)]")))) .where(predicates(only(valuePredicate(fieldValueWithFieldNames("num_value_3_indexed"), - anyComparisonOfType(Comparisons.Type.GREATER_THAN))))), - indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(range("[[101],[101]]"))), - indexPlan().where(indexName("ordered_str_value")).and(scanComparisons(range("[[102],[102]]"))) - ).where( - comparisonKeyValues(exactly(fieldValueWithFieldNames("num_value_2"), + anyComparisonOfType(Comparisons.Type.GREATER_THAN))))) + ).where(comparisonKeyValues(exactly(fieldValueWithFieldNames("num_value_2"), toOrderedBytesValue(fieldValueWithFieldNames("str_value_indexed"), TupleOrdering.Direction.DESC_NULLS_LAST), fieldValueWithFieldNames("rec_no")))); diff --git a/yaml-tests/src/test/java/YamlIntegrationTests.java b/yaml-tests/src/test/java/YamlIntegrationTests.java index 104b7984a8e..ccd34fb0781 100644 --- a/yaml-tests/src/test/java/YamlIntegrationTests.java +++ b/yaml-tests/src/test/java/YamlIntegrationTests.java @@ -150,6 +150,12 @@ public void compositeAggregates(YamlTest.Runner runner) throws Exception { runner.runYamsql("composite-aggregates.yamsql"); } + @TestTemplate + @MaintainYamlTestConfig(YamlTestConfigFilters.CORRECT_EXPECTATIONS) + public void coveringSumPushdown(YamlTest.Runner runner) throws Exception { + runner.runYamsql("covering-sum-pushdown.yamsql"); + } + @TestTemplate void createDrop(YamlTest.Runner runner) throws Exception { runner.runYamsql("create-drop.yamsql"); @@ -363,6 +369,12 @@ public void recursiveCte(YamlTest.Runner runner) throws Exception { runner.runYamsql("recursive-cte.yamsql"); } + @TestTemplate + @MaintainYamlTestConfig(YamlTestConfigFilters.CORRECT_EXPECTATIONS) + public void rowVersionPushdown(YamlTest.Runner runner) throws Exception { + runner.runYamsql("row-version-pushdown.yamsql"); + } + @TestTemplate public void rightDeepPlanTests(YamlTest.Runner runner) throws Exception { runner.runYamsql("right-deep-plan-tests.yamsql"); diff --git a/yaml-tests/src/test/resources/aggregate-index-tests.metrics.binpb b/yaml-tests/src/test/resources/aggregate-index-tests.metrics.binpb index cc7f3ebc0ed..a6c5f74c6c3 100644 --- a/yaml-tests/src/test/resources/aggregate-index-tests.metrics.binpb +++ b/yaml-tests/src/test/resources/aggregate-index-tests.metrics.binpb @@ -1,7 +1,7 @@ ™ H agg-index-tests5EXPLAIN select col1, sum(col2) from T1 group by col1;Ì -ð·ûá� ¯ù¾(@0¤Ñ>80@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò +‚þŸ¿’ À²� (A0ÜÛ/83@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò digraph G { fontname=courier; rankdir=BT; @@ -11,26 +11,28 @@ digraph G { 3 [ label=<
Index
MV1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}Ô +}– = -agg-index-tests*EXPLAIN select col1 from T1 group by col1;’ -ýݪšh اÁ(60öö-8%@ZISCAN(VI1 <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)˜digraph G { +agg-index-tests*EXPLAIN select col1 from T1 group by col1;Ô +�¬Æ  +k ‰Š†(70ŒÛ8(@ŒCOVERING(MV8 <,> -> [COL1: KEY:[0], COL2: KEY:[1], ID: KEY:[3]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)§digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._0 AS COL1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT ()
GROUP BY (q115._0.COL1 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0, AS _1)" ]; - 3 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2 AS _0)" ]; - 4 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ]; - 5 [ label=<
Index
VI1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ]; - 3 -> 2 [ label=< q115> label="q115" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 [ label=<
Streaming Aggregate
COLLECT ()
GROUP BY (q118._0.COL1 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0, AS _1)" ]; + 3 [ label=<
Value Computation
MAP (q103 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2 AS _0)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ]; + 5 [ label=<
Index
MV8
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ]; + 3 -> 2 [ label=< q118> label="q118" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q103> label="q103" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }è B agg-index-tests/EXPLAIN select sum(col2) from T1 group by col1;¡ -ð‰¥»� Õ—î (@0ñ¸980@KAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)µ +‚¦çˆ’ ØœÌ +(A0üì+83@KAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)µ digraph G { fontname=courier; rankdir=BT; @@ -43,7 +45,7 @@ digraph G { }« Z agg-index-testsGEXPLAIN select col1, sum(col2) from T1 group by col1 order by col1 asc;Ì -ð™ø“� žñå(@0©×@80@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò +‚ÌãÈ’ ÁÖ¨ (A0Òà/83@YAISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò digraph G { fontname=courier; rankdir=BT; @@ -56,7 +58,7 @@ digraph G { }æ [ agg-index-testsHEXPLAIN select col1, sum(col2) from T1 group by col1 order by col1 desc;† -ðݘ½ � ¨¢¿(@0þòI80@aAISCAN(MV1 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)„ digraph G { +‚͈©’ “Ù¢ (A0ò‹'83@aAISCAN(MV1 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)„ digraph G { fontname=courier; rankdir=BT; splines=line; @@ -68,7 +70,7 @@ digraph G { }¥ L agg-index-tests9EXPLAIN select col1, sum(col2) + 1 from T1 group by col1;Ô -ðÝèÕ� ÂÌâ(@0ì’F80@]AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)Ö +‚ÁÓ�’ öõÑ (A0âë.83@]AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)Ö digraph G { fontname=courier; rankdir=BT; @@ -81,7 +83,7 @@ digraph G { }— H agg-index-tests5EXPLAIN select col1, max(col2) from T1 group by col1;Ê -„�ÃÒ“ Õªß(B0ÁÞD82@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò +–ÙÞø– ø¦Š(C0ÿ‰"85@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò digraph G { fontname=courier; rankdir=BT; @@ -94,7 +96,7 @@ digraph G { }¥ V agg-index-testsCEXPLAIN select col1, max(col2) from T1 group by col1 order by col1;Ê -„Ñ¥ “ Ë�à(B0¼å=82@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò +–„Ýß– ¢’ˆ(C0¢â/85@WAISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò digraph G { fontname=courier; rankdir=BT; @@ -107,7 +109,7 @@ digraph G { }ä [ agg-index-testsHEXPLAIN select col1, max(col2) from T1 group by col1 order by col1 desc;„ -„Ä„ù“ ¤¤á(B0Úí<82@_AISCAN(MV8 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)„ digraph G { +–ɯ¬– ý×™ (C0Žß-85@_AISCAN(MV8 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)„ digraph G { fontname=courier; rankdir=BT; splines=line; @@ -119,7 +121,7 @@ digraph G { }Õ X agg-index-testsEEXPLAIN select col1, max(col2) from T1 where col1 = 10 group by col1;ø -Æ�µÑ#Æ ô‘ (J0—œH8F@rAISCAN(MV8 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)å +íØÐ©"Ë Ä�±(L0�±;8L@rAISCAN(MV8 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)å digraph G { fontname=courier; rankdir=BT; @@ -132,19 +134,19 @@ digraph G { }Û D agg-index-tests1EXPLAIN select max(col2) from T1 use index (mv8);’ -Ý™’¼ ] ŒÔ€(0”ê)8"@•AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | AGG max_l(_._1) GROUP BY () | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)Üdigraph G { +ïÁ’™ ` ±“œ(0ɶ"8%@•AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | AGG max_l(_._1) GROUP BY () | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)Üdigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Value Computation
MAP ((q4._1 AS _0) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; - 4 [ label=<
Streaming Aggregate
COLLECT max_l(q104._1)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; + 4 [ label=<
Streaming Aggregate
COLLECT max_l(q105._1)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 5 [ label=<
Index Scan
scan type: BY_GROUP
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1)" ]; 6 [ label=<
Index
MV8
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ label=< q4> label="q4" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 4 [ label=< q104> label="q104" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ label=< q105> label="q105" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }� @@ -193,19 +195,19 @@ H }ó 4 agg-index-tests!EXPLAIN select max(col2) from t2;º -…±§â&  ɇù(R0öð~8M@ ¢AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | AGG max_l(_._2) GROUP BY () | MAP ((_._2 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)ödigraph G { +—§š££ Ê®—(S0²½Z8P@ ¢AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | AGG max_l(_._2) GROUP BY () | MAP ((_._2 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)ödigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Value Computation
MAP ((q4._2 AS _0) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; - 4 [ label=<
Streaming Aggregate
COLLECT max_l(q175._2)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; + 4 [ label=<
Streaming Aggregate
COLLECT max_l(q176._2)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 5 [ label=<
Index Scan
scan type: BY_GROUP
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2)" ]; 6 [ label=<
Index
MV9
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ label=< q4> label="q4" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 4 [ label=< q175> label="q175" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ label=< q176> label="q176" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }Ó @@ -227,7 +229,7 @@ X }“ H agg-index-tests5EXPLAIN select max(col2) from t2 group by col1, col3;Æ -œËÜ‘$š ‡ËÀ(N0·¤A82@VAISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._2 AS _0)Ï +®êÉ£� î‡Æ(O0âÿ185@VAISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._2 AS _0)Ï digraph G { fontname=courier; rankdir=BT; @@ -240,7 +242,7 @@ digraph G { }õ T agg-index-testsAEXPLAIN select col1, col3, max(col2) from t2 group by col1, col3;œ -œÑøÀ)› †½Î(N0±ÿD82@rAISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS COL3, _._2 AS _2)‰ digraph G { +® €„ž ã�¨(O0—ù285@rAISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS COL3, _._2 AS _2)‰ digraph G { fontname=courier; rankdir=BT; splines=line; @@ -252,7 +254,7 @@ T }� ] agg-index-testsJEXPLAIN select col3, max(col2) from t2 where col1 = 2 group by col1, col3;Ÿ -ÞÛ�é0Î �Ù¿(V0�­S8F@AISCAN(MV9 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)ÿ +…ìâ¬'Ó Õ��(X0 �=8L@AISCAN(MV9 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)ÿ digraph G { fontname=courier; rankdir=BT; @@ -347,60 +349,61 @@ W 3 [ label=<
Index
MV9
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q102> label="q102" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}‡ +}× „ -agg-index-testsqEXPLAIN select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 asc;ý -•ª’ë -Q ›ø×(0�� 8@ªISCAN(MV9 [EQUALS promote(@c19 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)²digraph G { +agg-index-testsqEXPLAIN select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 asc;Í +§¹úû +T Ðá¦(0ú +8@ëCOVERING(MV9 [EQUALS promote(@c19 AS LONG)] -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)Ádigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._1 AS COL3, q6._1._0 AS S)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL3, LONG AS S)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT (sum_l(q102._0.COL2) AS _0)
GROUP BY (q102._0.COL1 AS _0, q102._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0 AS _1)" ]; - 3 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; - 4 [ label=<
Index Scan
comparisons: [EQUALS promote(@c19 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; + 2 [ label=<
Streaming Aggregate
COLLECT (sum_l(q103._0.COL2) AS _0)
GROUP BY (q103._0.COL1 AS _0, q103._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0 AS _1)" ]; + 3 [ label=<
Value Computation
MAP (q101 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; + 4 [ label=<
Covering Index Scan
comparisons: [EQUALS promote(@c19 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 5 [ label=<
Index
MV9
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 3 -> 2 [ label=< q102> label="q102" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q103> label="q103" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q101> label="q101" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -} +}’ … -agg-index-testsrEXPLAIN select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 desc;· -•üØÑ Q ®×³(0Áû 8@²ISCAN(MV9 [EQUALS promote(@c19 AS LONG)] REVERSE) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)ädigraph G { +agg-index-testsrEXPLAIN select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 desc;‡ +§äõ� T ÃÐò(0—å +8@óCOVERING(MV9 [EQUALS promote(@c19 AS LONG)] REVERSE -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)ódigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._1 AS COL3, q6._1._0 AS S)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL3, LONG AS S)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT (sum_l(q102._0.COL2) AS _0)
GROUP BY (q102._0.COL1 AS _0, q102._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0 AS _1)" ]; - 3 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; - 4 [ label=<
Index Scan
comparisons: [EQUALS promote(@c19 AS LONG)]
direction: reversed
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; + 2 [ label=<
Streaming Aggregate
COLLECT (sum_l(q103._0.COL2) AS _0)
GROUP BY (q103._0.COL1 AS _0, q103._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0 AS _1)" ]; + 3 [ label=<
Value Computation
MAP (q101 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; + 4 [ label=<
Covering Index Scan
comparisons: [EQUALS promote(@c19 AS LONG)]
direction: reversed
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 5 [ label=<
Index
MV9
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 3 -> 2 [ label=< q102> label="q102" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q103> label="q103" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q101> label="q101" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}í +}¾ H -agg-index-tests5EXPLAIN select max(col3) from t2 group by col1, col3;  -•Ðç³p ¼à -(B0Ѻ.8%@ISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (max_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._1._0 AS _0)�digraph G { +agg-index-tests5EXPLAIN select max(col3) from t2 group by col1, col3;ñ +§ß«‘s ç«� (C0àÈ#8(@ÀCOVERING(MV9 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (max_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._1._0 AS _0)�digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._1._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT (max_l(q127._0.COL3) AS _0)
GROUP BY (q127._0.COL1 AS _0, q127._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0 AS _1)" ]; - 3 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; - 4 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 5 [ label=<
Index
MV3
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 3 -> 2 [ label=< q127> label="q127" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 [ label=<
Streaming Aggregate
COLLECT (max_l(q126._0.COL3) AS _0)
GROUP BY (q126._0.COL1 AS _0, q126._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0 AS _1)" ]; + 3 [ label=<
Value Computation
MAP (q114 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; + 5 [ label=<
Index
MV9
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; + 3 -> 2 [ label=< q126> label="q126" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q114> label="q114" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }’ 8 agg-index-tests%EXPLAIN select min_ever(col3) from t2Õ -¬’úÖ˜ ä›° (L0°£K8<@ aAISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)Ódigraph G { +¾³Ð�› 篳 (M0Ù¨A8>@ aAISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)Ódigraph G { fontname=courier; rankdir=BT; splines=line; @@ -416,7 +419,7 @@ H }ž M agg-index-tests:EXPLAIN select col1, max_ever(col2) from T1 group by col1;Ì -Å€œø­ •Ëñ(H0–ªL85@YAISCAN(MV6 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò +×£—ø° …ƒ¨(I0ˆÏ887@YAISCAN(MV6 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ò digraph G { fontname=courier; rankdir=BT; @@ -429,7 +432,7 @@ digraph G { }  M agg-index-tests:EXPLAIN select col1, min_ever(col2) from T1 group by col1;Î -ÒÃ�«Œ ñ�º(>0äù<8*@ZAISCAN(MV12 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ó +䕬‰� Žëœ (?0¬Š&8,@ZAISCAN(MV12 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)Ó digraph G { fontname=courier; rankdir=BT; @@ -468,7 +471,7 @@ digraph G { }ç X agg-index-testsEEXPLAIN select col1, sum(col2) from T1 where col1 > 15 group by col1;Š -²�üç' ‹ Œ(H0ãÊY8D@|AISCAN(MV1 [[GREATER_THAN promote(@c12 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)í +ÙÓ¾¾Ç ×’˜(J0ó‡68J@|AISCAN(MV1 [[GREATER_THAN promote(@c12 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)í digraph G { fontname=courier; rankdir=BT; @@ -481,7 +484,7 @@ digraph G { }¦ R agg-index-tests?EXPLAIN select sum(col2) from T1 where col1 = 10 group by col1Ï -²³ÔÓ# šÉ—(H0¹×C8D@fAISCAN(MV1 [EQUALS promote(@c10 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)È +ÙÃ…ûÇ Ì´”(J0ø¨48J@fAISCAN(MV1 [EQUALS promote(@c10 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)È digraph G { fontname=courier; rankdir=BT; @@ -508,7 +511,7 @@ x }ª c agg-index-testsPEXPLAIN select sum(col2) from T1 where col1 <= 10 group by col1 having col1 > 0; -½Ò®äÄ þÙÜ (H0¹Ý@8E@›AISCAN(MV1 [[GREATER_THAN promote(@c18 AS LONG) && LESS_THAN_OR_EQUALS promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)… digraph G { +ä»ãÍÉ ù‚ù(J0ÉŽ=8K@›AISCAN(MV1 [[GREATER_THAN promote(@c18 AS LONG) && LESS_THAN_OR_EQUALS promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)… digraph G { fontname=courier; rankdir=BT; splines=line; @@ -964,20 +967,21 @@ A 3 -> 2 [ label=< q126> label="q126" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}µ +}† A -agg-index-tests.EXPLAIN select sum(col3) from T2 group by col1ï -Ñ´å™z ýÇö (F0ßÂJ81@nISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)ádigraph G { +agg-index-tests.EXPLAIN select sum(col3) from T2 group by col1À +ã©Ô¾} ðëÐ +(G0–€584@¯COVERING(MV9 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)ðdigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._1._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT (sum_l(q142._0.COL3) AS _0)
GROUP BY (q142._0.COL1 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0, LONG AS _0 AS _1)" ]; - 3 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; - 4 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 5 [ label=<
Index
MV3
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 3 -> 2 [ label=< q142> label="q142" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 [ label=<
Streaming Aggregate
COLLECT (sum_l(q141._0.COL3) AS _0)
GROUP BY (q141._0.COL1 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0, LONG AS _0 AS _1)" ]; + 3 [ label=<
Value Computation
MAP (q124 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; + 5 [ label=<
Index
MV9
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; + 3 -> 2 [ label=< q141> label="q141" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q124> label="q124" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }ü @@ -994,18 +998,18 @@ X 3 -> 2 [ label=< q127> label="q127" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}ƒ +}‚ [ -agg-index-testsHEXPLAIN select col1, sum(col3) as s from T2 where col2 = 2 group by col1£ -½‹ÅÂFþ á£ý!(^0‘ƒƒ8e@ÂAISCAN(MV21 [EQUALS promote(@c14 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0, _._1 AS _1) | MAP (_._1 AS COL1, _._3 AS S)¾digraph G { +agg-index-testsHEXPLAIN select col1, sum(col3) as s from T2 where col2 = 2 group by col1¢ +Ò»œý3€ “áš(_0˜�^8i@ÂAISCAN(MV21 [EQUALS promote(@c14 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0, _._1 AS _1) | MAP (_._1 AS COL1, _._3 AS S)¾digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._1 AS COL1, q6._3 AS S)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, LONG AS S)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT sum_l(q192._3)
GROUP BY (q192._0 AS _0, q192._1 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2)" ]; + 2 [ label=<
Streaming Aggregate
COLLECT sum_l(q194._3)
GROUP BY (q194._0 AS _0, q194._1 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2)" ]; 3 [ label=<
Index Scan
scan type: BY_GROUP
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2, LONG AS _3)" ]; 4 [ label=<
Index
MV21
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 3 -> 2 [ label=< q192> label="q192" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q194> label="q194" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }Á @@ -1042,58 +1046,58 @@ l 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}ó +}ò G -agg-index-tests4EXPLAIN select sum(col3) as s from T2 where col2 = 2§ -ö¢ËÛ=¥ Ãú‰(e0¤êÀ8�@ÖAISCAN(MV21 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0) | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)­digraph G { +agg-index-tests4EXPLAIN select sum(col3) as s from T2 where col2 = 2¦ +‹ ‚õŽ0§ ©ß¡(f0ÃÉy8…@ ÖAISCAN(MV21 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0) | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)­digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._0 AS S)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS S)" ]; 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Value Computation
MAP ((q4._3 AS _0) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; - 4 [ label=<
Streaming Aggregate
COLLECT sum_l(q218._3)
GROUP BY (q218._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1)" ]; + 4 [ label=<
Streaming Aggregate
COLLECT sum_l(q220._3)
GROUP BY (q220._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1)" ]; 5 [ label=<
Index Scan
scan type: BY_GROUP
comparisons: [EQUALS promote(@c12 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2, LONG AS _3)" ]; 6 [ label=<
Index
MV21
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ label=< q4> label="q4" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 4 [ label=< q218> label="q218" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ label=< q220> label="q220" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}ô +}ó H -agg-index-tests5EXPLAIN select sum(col3) as s from T2 where col2 = 90§ -ö¢ËÛ=¥ Ãú‰(e0¤êÀ8�@ÖAISCAN(MV21 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0) | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)­digraph G { +agg-index-tests5EXPLAIN select sum(col3) as s from T2 where col2 = 90¦ +‹ ‚õŽ0§ ©ß¡(f0ÃÉy8…@ ÖAISCAN(MV21 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0) | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)­digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._0 AS S)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS S)" ]; 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Value Computation
MAP ((q4._3 AS _0) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; - 4 [ label=<
Streaming Aggregate
COLLECT sum_l(q218._3)
GROUP BY (q218._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1)" ]; + 4 [ label=<
Streaming Aggregate
COLLECT sum_l(q220._3)
GROUP BY (q220._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1)" ]; 5 [ label=<
Index Scan
scan type: BY_GROUP
comparisons: [EQUALS promote(@c12 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2, LONG AS _3)" ]; 6 [ label=<
Index
MV21
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ label=< q4> label="q4" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 4 [ label=< q218> label="q218" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ label=< q220> label="q220" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }� 4 agg-index-tests!EXPLAIN select sum(col3) from T2;× -…¯Ÿ–   ÕÁ¹(R0Ì÷i8M@ ²AISCAN(MV21 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY () | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)ƒdigraph G { +—úðû£ ÓÙÅ (S0ÖÿI8P@ ²AISCAN(MV21 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY () | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)ƒdigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Value Computation
MAP ((q4._3 AS _0) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; - 4 [ label=<
Streaming Aggregate
COLLECT sum_l(q175._3)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; + 4 [ label=<
Streaming Aggregate
COLLECT sum_l(q176._3)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 5 [ label=<
Index Scan
scan type: BY_GROUP
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2, LONG AS _3)" ]; 6 [ label=<
Index
MV21
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ label=< q4> label="q4" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 4 [ label=< q175> label="q175" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ label=< q176> label="q176" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }Ò diff --git a/yaml-tests/src/test/resources/aggregate-index-tests.metrics.yaml b/yaml-tests/src/test/resources/aggregate-index-tests.metrics.yaml index c3f977edb0e..49f854e0b27 100644 --- a/yaml-tests/src/test/resources/aggregate-index-tests.metrics.yaml +++ b/yaml-tests/src/test/resources/aggregate-index-tests.metrics.yaml @@ -3,133 +3,133 @@ agg-index-tests: ref: aggregate-index-tests.yamsql:127 explain: 'AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 496 - task_total_time_ms: 58 - transform_count: 143 - transform_time_ms: 32 - transform_yield_count: 64 - insert_time_ms: 1 - insert_new_count: 48 + task_count: 514 + task_total_time_ms: 49 + transform_count: 146 + transform_time_ms: 25 + transform_yield_count: 65 + insert_time_ms: 0 + insert_new_count: 51 insert_reused_count: 5 - query: EXPLAIN select col1 from T1 group by col1; ref: aggregate-index-tests.yamsql:132 - explain: ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | - MAP (_._0._0 AS COL1) - task_count: 381 - task_total_time_ms: 36 - transform_count: 104 - transform_time_ms: 13 - transform_yield_count: 54 + explain: 'COVERING(MV8 <,> -> [COL1: KEY:[0], COL2: KEY:[1], ID: KEY:[3]]) | MAP + (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)' + task_count: 399 + task_total_time_ms: 21 + transform_count: 107 + transform_time_ms: 8 + transform_yield_count: 55 insert_time_ms: 0 - insert_new_count: 37 + insert_new_count: 40 insert_reused_count: 4 - query: EXPLAIN select sum(col2) from T1 group by col1; ref: aggregate-index-tests.yamsql:137 explain: 'AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)' - task_count: 496 - task_total_time_ms: 51 - transform_count: 143 - transform_time_ms: 29 - transform_yield_count: 64 + task_count: 514 + task_total_time_ms: 42 + transform_count: 146 + transform_time_ms: 22 + transform_yield_count: 65 insert_time_ms: 0 - insert_new_count: 48 + insert_new_count: 51 insert_reused_count: 5 - query: EXPLAIN select col1, sum(col2) from T1 group by col1 order by col1 asc; ref: aggregate-index-tests.yamsql:142 explain: 'AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 496 - task_total_time_ms: 63 - transform_count: 143 - transform_time_ms: 35 - transform_yield_count: 64 - insert_time_ms: 1 - insert_new_count: 48 + task_count: 514 + task_total_time_ms: 47 + transform_count: 146 + transform_time_ms: 25 + transform_yield_count: 65 + insert_time_ms: 0 + insert_new_count: 51 insert_reused_count: 5 - query: EXPLAIN select col1, sum(col2) from T1 group by col1 order by col1 desc; ref: aggregate-index-tests.yamsql:147 explain: 'AISCAN(MV1 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 496 - task_total_time_ms: 68 - transform_count: 143 - transform_time_ms: 36 - transform_yield_count: 64 - insert_time_ms: 1 - insert_new_count: 48 + task_count: 514 + task_total_time_ms: 48 + transform_count: 146 + transform_time_ms: 25 + transform_yield_count: 65 + insert_time_ms: 0 + insert_new_count: 51 insert_reused_count: 5 - query: EXPLAIN select col1, sum(col2) + 1 from T1 group by col1; ref: aggregate-index-tests.yamsql:152 explain: 'AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)' - task_count: 496 - task_total_time_ms: 62 - transform_count: 143 - transform_time_ms: 33 - transform_yield_count: 64 - insert_time_ms: 1 - insert_new_count: 48 + task_count: 514 + task_total_time_ms: 46 + transform_count: 146 + transform_time_ms: 24 + transform_yield_count: 65 + insert_time_ms: 0 + insert_new_count: 51 insert_reused_count: 5 - query: EXPLAIN select col1, max(col2) from T1 group by col1; ref: aggregate-index-tests.yamsql:157 explain: 'AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 516 - task_total_time_ms: 66 - transform_count: 147 - transform_time_ms: 35 - transform_yield_count: 66 - insert_time_ms: 1 - insert_new_count: 50 + task_count: 534 + task_total_time_ms: 33 + transform_count: 150 + transform_time_ms: 16 + transform_yield_count: 67 + insert_time_ms: 0 + insert_new_count: 53 insert_reused_count: 5 - query: EXPLAIN select col1, max(col2) from T1 group by col1 order by col1; ref: aggregate-index-tests.yamsql:162 explain: 'AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 516 - task_total_time_ms: 65 - transform_count: 147 - transform_time_ms: 35 - transform_yield_count: 66 - insert_time_ms: 1 - insert_new_count: 50 + task_count: 534 + task_total_time_ms: 49 + transform_count: 150 + transform_time_ms: 29 + transform_yield_count: 67 + insert_time_ms: 0 + insert_new_count: 53 insert_reused_count: 5 - query: EXPLAIN select col1, max(col2) from T1 group by col1 order by col1 desc; ref: aggregate-index-tests.yamsql:167 explain: 'AISCAN(MV8 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 516 - task_total_time_ms: 62 - transform_count: 147 - transform_time_ms: 33 - transform_yield_count: 66 + task_count: 534 + task_total_time_ms: 51 + transform_count: 150 + transform_time_ms: 27 + transform_yield_count: 67 insert_time_ms: 0 - insert_new_count: 50 + insert_new_count: 53 insert_reused_count: 5 - query: EXPLAIN select col1, max(col2) from T1 where col1 = 10 group by col1; ref: aggregate-index-tests.yamsql:172 explain: 'AISCAN(MV8 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 710 - task_total_time_ms: 74 - transform_count: 198 - transform_time_ms: 31 - transform_yield_count: 74 - insert_time_ms: 1 - insert_new_count: 70 + task_count: 749 + task_total_time_ms: 71 + transform_count: 203 + transform_time_ms: 32 + transform_yield_count: 76 + insert_time_ms: 0 + insert_new_count: 76 insert_reused_count: 3 - query: EXPLAIN select max(col2) from T1 use index (mv8); ref: aggregate-index-tests.yamsql:179 explain: 'AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | AGG max_l(_._1) GROUP BY () | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)' - task_count: 349 - task_total_time_ms: 28 - transform_count: 93 - transform_time_ms: 12 - transform_yield_count: 27 + task_count: 367 + task_total_time_ms: 25 + transform_count: 96 + transform_time_ms: 10 + transform_yield_count: 28 insert_time_ms: 0 - insert_new_count: 34 + insert_new_count: 37 insert_reused_count: 3 - query: EXPLAIN select col2 from T1 where col1 = 10; ref: aggregate-index-tests.yamsql:187 @@ -172,13 +172,13 @@ agg-index-tests: explain: 'AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | AGG max_l(_._2) GROUP BY () | MAP ((_._2 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)' - task_count: 645 - task_total_time_ms: 81 - transform_count: 160 - transform_time_ms: 41 - transform_yield_count: 82 - insert_time_ms: 2 - insert_new_count: 77 + task_count: 663 + task_total_time_ms: 61 + transform_count: 163 + transform_time_ms: 31 + transform_yield_count: 83 + insert_time_ms: 1 + insert_new_count: 80 insert_reused_count: 11 - query: EXPLAIN select col1, sum(col2) from T1 USE INDEX (vi1) group by col1; ref: aggregate-index-tests.yamsql:209 @@ -196,37 +196,37 @@ agg-index-tests: ref: aggregate-index-tests.yamsql:212 explain: 'AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._2 AS _0)' - task_count: 540 - task_total_time_ms: 75 - transform_count: 154 - transform_time_ms: 45 - transform_yield_count: 78 - insert_time_ms: 1 - insert_new_count: 50 + task_count: 558 + task_total_time_ms: 61 + transform_count: 157 + transform_time_ms: 38 + transform_yield_count: 79 + insert_time_ms: 0 + insert_new_count: 53 insert_reused_count: 5 - query: EXPLAIN select col1, col3, max(col2) from t2 group by col1, col3; ref: aggregate-index-tests.yamsql:217 explain: 'AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS COL3, _._2 AS _2)' - task_count: 540 - task_total_time_ms: 87 - transform_count: 155 - transform_time_ms: 51 - transform_yield_count: 78 - insert_time_ms: 1 - insert_new_count: 50 + task_count: 558 + task_total_time_ms: 65 + transform_count: 158 + transform_time_ms: 38 + transform_yield_count: 79 + insert_time_ms: 0 + insert_new_count: 53 insert_reused_count: 5 - query: EXPLAIN select col3, max(col2) from t2 where col1 = 2 group by col1, col3; ref: aggregate-index-tests.yamsql:222 explain: 'AISCAN(MV9 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)' - task_count: 734 - task_total_time_ms: 102 - transform_count: 206 - transform_time_ms: 47 - transform_yield_count: 86 + task_count: 773 + task_total_time_ms: 82 + transform_count: 211 + transform_time_ms: 44 + transform_yield_count: 88 insert_time_ms: 1 - insert_new_count: 70 + insert_new_count: 76 insert_reused_count: 3 - query: EXPLAIN select col3, max(col2) from t2 where col1 = 1 group by col1, col3 order by max(col2) desc; @@ -337,90 +337,93 @@ agg-index-tests: - query: EXPLAIN select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 asc; ref: aggregate-index-tests.yamsql:271 - explain: ISCAN(MV9 [EQUALS promote(@c19 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) + explain: 'COVERING(MV9 [EQUALS promote(@c19 AS LONG)] -> [COL1: KEY:[0], COL2: + KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, - _._1._0 AS S) - task_count: 277 - task_total_time_ms: 22 - transform_count: 81 - transform_time_ms: 7 - transform_yield_count: 22 + _._1._0 AS S)' + task_count: 295 + task_total_time_ms: 23 + transform_count: 84 + transform_time_ms: 6 + transform_yield_count: 23 insert_time_ms: 0 - insert_new_count: 23 + insert_new_count: 26 insert_reused_count: 0 - query: EXPLAIN select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 desc; ref: aggregate-index-tests.yamsql:276 - explain: ISCAN(MV9 [EQUALS promote(@c19 AS LONG)] REVERSE) | MAP (_ AS _0) | AGG - (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP - (_._0._1 AS COL3, _._1._0 AS S) - task_count: 277 - task_total_time_ms: 28 - transform_count: 81 - transform_time_ms: 9 - transform_yield_count: 22 - insert_time_ms: 0 - insert_new_count: 23 + explain: 'COVERING(MV9 [EQUALS promote(@c19 AS LONG)] REVERSE -> [COL1: KEY:[0], + COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) + AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, + _._1._0 AS S)' + task_count: 295 + task_total_time_ms: 25 + transform_count: 84 + transform_time_ms: 8 + transform_yield_count: 23 + insert_time_ms: 0 + insert_new_count: 26 insert_reused_count: 0 - query: EXPLAIN select max(col3) from t2 group by col1, col3; ref: aggregate-index-tests.yamsql:286 - explain: ISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (max_l(_._0.COL3) AS _0) GROUP BY - (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._1._0 AS _0) - task_count: 405 - task_total_time_ms: 44 - transform_count: 112 - transform_time_ms: 22 - transform_yield_count: 66 + explain: 'COVERING(MV9 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: + KEY:[4]]) | MAP (_ AS _0) | AGG (max_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 + AS _0, _._0.COL3 AS _1) | MAP (_._1._0 AS _0)' + task_count: 423 + task_total_time_ms: 38 + transform_count: 115 + transform_time_ms: 19 + transform_yield_count: 67 insert_time_ms: 0 - insert_new_count: 37 + insert_new_count: 40 insert_reused_count: 4 - query: EXPLAIN select min_ever(col3) from t2 ref: aggregate-index-tests.yamsql:297 explain: 'AISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)' - task_count: 556 - task_total_time_ms: 47 - transform_count: 152 - transform_time_ms: 28 - transform_yield_count: 76 + task_count: 574 + task_total_time_ms: 42 + transform_count: 155 + transform_time_ms: 26 + transform_yield_count: 77 insert_time_ms: 1 - insert_new_count: 60 + insert_new_count: 62 insert_reused_count: 11 - query: EXPLAIN select min_ever(col3) from t2 ref: aggregate-index-tests.yamsql:302 explain: 'AISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)' - task_count: 556 - task_total_time_ms: 47 - transform_count: 152 - transform_time_ms: 28 - transform_yield_count: 76 + task_count: 574 + task_total_time_ms: 42 + transform_count: 155 + transform_time_ms: 26 + transform_yield_count: 77 insert_time_ms: 1 - insert_new_count: 60 + insert_new_count: 62 insert_reused_count: 11 - query: EXPLAIN select col1, max_ever(col2) from T1 group by col1; ref: aggregate-index-tests.yamsql:305 explain: 'AISCAN(MV6 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 581 - task_total_time_ms: 66 - transform_count: 173 - transform_time_ms: 39 - transform_yield_count: 72 - insert_time_ms: 1 - insert_new_count: 53 + task_count: 599 + task_total_time_ms: 58 + transform_count: 176 + transform_time_ms: 36 + transform_yield_count: 73 + insert_time_ms: 0 + insert_new_count: 55 insert_reused_count: 6 - query: EXPLAIN select col1, min_ever(col2) from T1 group by col1; ref: aggregate-index-tests.yamsql:310 explain: 'AISCAN(MV12 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 466 - task_total_time_ms: 55 - transform_count: 140 - transform_time_ms: 32 - transform_yield_count: 62 + task_count: 484 + task_total_time_ms: 39 + transform_count: 143 + transform_time_ms: 23 + transform_yield_count: 63 insert_time_ms: 0 - insert_new_count: 42 + insert_new_count: 44 insert_reused_count: 5 - query: EXPLAIN select col2, max_ever(col1) from T4 group by col2; ref: aggregate-index-tests.yamsql:316 @@ -450,25 +453,25 @@ agg-index-tests: ref: aggregate-index-tests.yamsql:327 explain: 'AISCAN(MV1 [[GREATER_THAN promote(@c12 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)' - task_count: 690 - task_total_time_ms: 83 - transform_count: 194 - transform_time_ms: 35 - transform_yield_count: 72 - insert_time_ms: 1 - insert_new_count: 68 + task_count: 729 + task_total_time_ms: 59 + transform_count: 199 + transform_time_ms: 29 + transform_yield_count: 74 + insert_time_ms: 0 + insert_new_count: 74 insert_reused_count: 3 - query: EXPLAIN select sum(col2) from T1 where col1 = 10 group by col1 ref: aggregate-index-tests.yamsql:332 explain: 'AISCAN(MV1 [EQUALS promote(@c10 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)' - task_count: 690 - task_total_time_ms: 74 - transform_count: 194 - transform_time_ms: 33 - transform_yield_count: 72 - insert_time_ms: 1 - insert_new_count: 68 + task_count: 729 + task_total_time_ms: 62 + transform_count: 199 + transform_time_ms: 29 + transform_yield_count: 74 + insert_time_ms: 0 + insert_new_count: 74 insert_reused_count: 3 - query: EXPLAIN select col1 as g, sum(col2) as s from T1 use index (mv1) where col1 in (10, 20) group by col1 @@ -489,13 +492,13 @@ agg-index-tests: explain: 'AISCAN(MV1 [[GREATER_THAN promote(@c18 AS LONG) && LESS_THAN_OR_EQUALS promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)' - task_count: 701 - task_total_time_ms: 60 - transform_count: 196 - transform_time_ms: 26 - transform_yield_count: 72 + task_count: 740 + task_total_time_ms: 62 + transform_count: 201 + transform_time_ms: 31 + transform_yield_count: 74 insert_time_ms: 1 - insert_new_count: 69 + insert_new_count: 75 insert_reused_count: 3 - query: EXPLAIN select max(b) as x1, a+3 as x2 from t3 group by a+3; ref: aggregate-index-tests.yamsql:348 @@ -859,15 +862,16 @@ agg-index-tests: insert_reused_count: 3 - query: EXPLAIN select sum(col3) from T2 group by col1 ref: aggregate-index-tests.yamsql:647 - explain: ISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL3) AS _0) GROUP BY - (_._0.COL1 AS _0) | MAP (_._1._0 AS _0) - task_count: 465 - task_total_time_ms: 59 - transform_count: 122 - transform_time_ms: 29 - transform_yield_count: 70 - insert_time_ms: 1 - insert_new_count: 49 + explain: 'COVERING(MV9 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: + KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 + AS _0) | MAP (_._1._0 AS _0)' + task_count: 483 + task_total_time_ms: 45 + transform_count: 125 + transform_time_ms: 22 + transform_yield_count: 71 + insert_time_ms: 0 + insert_new_count: 52 insert_reused_count: 6 - query: EXPLAIN select col1, col2, sum(col3) as s from T2 group by col1, col2 ref: aggregate-index-tests.yamsql:656 @@ -887,14 +891,14 @@ agg-index-tests: explain: 'AISCAN(MV21 [EQUALS promote(@c14 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0, _._1 AS _1) | MAP (_._1 AS COL1, _._3 AS S)' - task_count: 957 - task_total_time_ms: 147 - transform_count: 254 - transform_time_ms: 71 - transform_yield_count: 94 - insert_time_ms: 2 - insert_new_count: 101 - insert_reused_count: 5 + task_count: 978 + task_total_time_ms: 109 + transform_count: 256 + transform_time_ms: 54 + transform_yield_count: 95 + insert_time_ms: 1 + insert_new_count: 105 + insert_reused_count: 6 - query: EXPLAIN select col2, sum(col3) as s from T2 where col3 = 200 group by col2 ref: aggregate-index-tests.yamsql:671 explain: ISCAN(VI2 <,>) | FILTER _.COL3 EQUALS promote(@c14 AS LONG) | MAP (_ @@ -927,39 +931,39 @@ agg-index-tests: explain: 'AISCAN(MV21 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0) | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)' - task_count: 1142 - task_total_time_ms: 129 - transform_count: 293 + task_count: 1163 + task_total_time_ms: 100 + transform_count: 295 transform_time_ms: 48 - transform_yield_count: 101 - insert_time_ms: 3 - insert_new_count: 129 - insert_reused_count: 8 + transform_yield_count: 102 + insert_time_ms: 1 + insert_new_count: 133 + insert_reused_count: 9 - query: EXPLAIN select sum(col3) as s from T2 where col2 = 90 ref: aggregate-index-tests.yamsql:695 explain: 'AISCAN(MV21 [EQUALS promote(@c12 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY (_._0 AS _0) | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)' - task_count: 1142 - task_total_time_ms: 129 - transform_count: 293 + task_count: 1163 + task_total_time_ms: 100 + transform_count: 295 transform_time_ms: 48 - transform_yield_count: 101 - insert_time_ms: 3 - insert_new_count: 129 - insert_reused_count: 8 + transform_yield_count: 102 + insert_time_ms: 1 + insert_new_count: 133 + insert_reused_count: 9 - query: EXPLAIN select sum(col3) from T2; ref: aggregate-index-tests.yamsql:699 explain: 'AISCAN(MV21 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: VALUE:[0]]) | AGG sum_l(_._3) GROUP BY () | MAP ((_._3 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)' - task_count: 645 - task_total_time_ms: 67 - transform_count: 160 - transform_time_ms: 36 - transform_yield_count: 82 + task_count: 663 + task_total_time_ms: 48 + transform_count: 163 + transform_time_ms: 26 + transform_yield_count: 83 insert_time_ms: 1 - insert_new_count: 77 + insert_new_count: 80 insert_reused_count: 11 - query: EXPLAIN select a, ek.k, b, max(d) from t6, (select k from t6.c) as ek group by a, ek.k, b diff --git a/yaml-tests/src/test/resources/aggregate-index-tests.yamsql b/yaml-tests/src/test/resources/aggregate-index-tests.yamsql index 328624b5b3a..d4ab5a8ce70 100644 --- a/yaml-tests/src/test/resources/aggregate-index-tests.yamsql +++ b/yaml-tests/src/test/resources/aggregate-index-tests.yamsql @@ -129,7 +129,7 @@ test_block: - result: [{!l 10, !l 15}, {!l 20, !l 76}] - - query: select col1 from T1 group by col1; - - explain: "ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)" + - explain: "COVERING(MV8 <,> -> [COL1: KEY:[0], COL2: KEY:[1], ID: KEY:[3]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)" - resultMetadata: [{COL1: BIGINT}] - result: [{!l 10}, {!l 20}] - @@ -268,12 +268,12 @@ test_block: - # Permuted max index can also be used to evaluate other aggregate functions via aggregation and roll-up - query: select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 asc; - - explain: "ISCAN(MV9 [EQUALS promote(@c19 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)" + - explain: "COVERING(MV9 [EQUALS promote(@c19 AS LONG)] -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)" - resultMetadata: [{COL3: BIGINT}, {S: BIGINT}] - result: [{COL3: 1, S: 1}, {COL3: 2, S: 2}, {COL3: 100, S: 1}, {COL3: 200, S: 2}] - - query: select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 desc; - - explain: "ISCAN(MV9 [EQUALS promote(@c19 AS LONG)] REVERSE) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)" + - explain: "COVERING(MV9 [EQUALS promote(@c19 AS LONG)] REVERSE -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._1 AS COL3, _._1._0 AS S)" - resultMetadata: [{COL3: BIGINT}, {S: BIGINT}] - result: [{COL3: 200, S: 2}, {COL3: 100, S: 1}, {COL3: 2, S: 2}, {COL3: 1, S: 1}] # - @@ -283,7 +283,7 @@ test_block: - # make sure we're not choosing the aggregate index (because we aggregate by col3 not col2) - query: select max(col3) from t2 group by col1, col3; - - explain: "ISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (max_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._1._0 AS _0)" + - explain: "COVERING(MV9 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (max_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._1._0 AS _0)" - - query: select min_ever(col3) from T2 group by col1, col2; - resultMetadata: [{_0: BIGINT}] @@ -644,7 +644,7 @@ test_block: - # The aggregate index MV21 can't be used as the query's grouping value is not a prefix of the index grouping values. - query: select sum(col3) from T2 group by col1 - - explain: "ISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "COVERING(MV9 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - initialVersionLessThan: 4.12.2.0 - unorderedResult: [{!l 1504}, {!l 202}] - initialVersionAtLeast: 4.12.2.0 diff --git a/yaml-tests/src/test/resources/between.metrics.binpb b/yaml-tests/src/test/resources/between.metrics.binpb index 87d37b841ce..fb6891935bd 100644 --- a/yaml-tests/src/test/resources/between.metrics.binpb +++ b/yaml-tests/src/test/resources/between.metrics.binpb @@ -8,29 +8,32 @@ L 1 [ label=<
Index Scan
comparisons: [[GREATER_THAN_OR_EQUALS promote(@c7 AS INT) && LESS_THAN_OR_EQUALS promote(@c7 AS INT)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; 2 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; 2 -> 1 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}Š +}õ P -between-index-tests9EXPLAIN select * from t1 WHERE col1 + 5 BETWEEN 10 AND 20µ -Ÿ‰Ü  M ó¸¶(0™Œ,8!@ˆISCAN(I1 <,>) | FILTER _.COL1 + @c7 GREATER_THAN_OR_EQUALS promote(@c9 AS INT) AND _.COL1 + @c7 LESS_THAN_OR_EQUALS promote(@c11 AS INT)Œ digraph G { +between-index-tests9EXPLAIN select * from t1 WHERE col1 + 5 BETWEEN 10 AND 20  +Ʀåñ R œã¶(0Î�!8'@³COVERING(I1 <,> -> [COL1: KEY:[0], ID: KEY:[2]]) | FILTER _.COL1 + @c7 GREATER_THAN_OR_EQUALS promote(@c9 AS INT) AND _.COL1 + @c7 LESS_THAN_OR_EQUALS promote(@c11 AS INT) | FETCHÌdigraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Predicate Filter
WHERE q2.COL1 + @c7 GREATER_THAN_OR_EQUALS promote(@c9 AS INT) AND q2.COL1 + @c7 LESS_THAN_OR_EQUALS promote(@c11 AS INT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; - 2 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; - 3 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; - 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}å + 1 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 2 [ label=<
Predicate Filter
WHERE q38.COL1 + @c7 GREATER_THAN_OR_EQUALS promote(@c9 AS INT) AND q38.COL1 + @c7 LESS_THAN_OR_EQUALS promote(@c11 AS INT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 3 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 4 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 3 -> 2 [ label=< q38> label="q38" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q40> label="q40" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}Ñ T -between-index-tests=EXPLAIN select * from t1 WHERE col1 + 5 NOT BETWEEN 10 AND 20Œ -Ÿή¼N ¶Ìµ(0’¬08!@tISCAN(I1 <,>) | FILTER _.COL1 + @c7 LESS_THAN promote(@c10 AS INT) OR _.COL1 + @c7 GREATER_THAN promote(@c12 AS INT)ø -digraph G { +between-index-tests=EXPLAIN select * from t1 WHERE col1 + 5 NOT BETWEEN 10 AND 20ø +Æ÷¤¨ S �¸°(0’¨-8'@ŸCOVERING(I1 <,> -> [COL1: KEY:[0], ID: KEY:[2]]) | FILTER _.COL1 + @c7 LESS_THAN promote(@c10 AS INT) OR _.COL1 + @c7 GREATER_THAN promote(@c12 AS INT) | FETCH¸digraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Predicate Filter
WHERE q2.COL1 + @c7 LESS_THAN promote(@c10 AS INT) OR q2.COL1 + @c7 GREATER_THAN promote(@c12 AS INT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; - 2 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; - 3 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; - 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 1 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 2 [ label=<
Predicate Filter
WHERE q38.COL1 + @c7 LESS_THAN promote(@c10 AS INT) OR q38.COL1 + @c7 GREATER_THAN promote(@c12 AS INT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 3 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 4 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(INT AS ID, INT AS COL1, INT AS COL2)" ]; + 3 -> 2 [ label=< q38> label="q38" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q40> label="q40" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; } \ No newline at end of file diff --git a/yaml-tests/src/test/resources/between.metrics.yaml b/yaml-tests/src/test/resources/between.metrics.yaml index 93e23adf01b..a4fa668a75e 100644 --- a/yaml-tests/src/test/resources/between.metrics.yaml +++ b/yaml-tests/src/test/resources/between.metrics.yaml @@ -13,25 +13,27 @@ between-index-tests: insert_reused_count: 4 - query: EXPLAIN select * from t1 WHERE col1 + 5 BETWEEN 10 AND 20 ref: between.yamsql:83 - explain: ISCAN(I1 <,>) | FILTER _.COL1 + @c7 GREATER_THAN_OR_EQUALS promote(@c9 - AS INT) AND _.COL1 + @c7 LESS_THAN_OR_EQUALS promote(@c11 AS INT) - task_count: 287 - task_total_time_ms: 27 - transform_count: 77 + explain: 'COVERING(I1 <,> -> [COL1: KEY:[0], ID: KEY:[2]]) | FILTER _.COL1 + @c7 + GREATER_THAN_OR_EQUALS promote(@c9 AS INT) AND _.COL1 + @c7 LESS_THAN_OR_EQUALS + promote(@c11 AS INT) | FETCH' + task_count: 326 + task_total_time_ms: 20 + transform_count: 82 transform_time_ms: 9 - transform_yield_count: 29 + transform_yield_count: 31 insert_time_ms: 0 - insert_new_count: 33 - insert_reused_count: 3 + insert_new_count: 39 + insert_reused_count: 4 - query: EXPLAIN select * from t1 WHERE col1 + 5 NOT BETWEEN 10 AND 20 ref: between.yamsql:89 - explain: ISCAN(I1 <,>) | FILTER _.COL1 + @c7 LESS_THAN promote(@c10 AS INT) OR - _.COL1 + @c7 GREATER_THAN promote(@c12 AS INT) - task_count: 287 - task_total_time_ms: 30 - transform_count: 78 - transform_time_ms: 13 - transform_yield_count: 29 + explain: 'COVERING(I1 <,> -> [COL1: KEY:[0], ID: KEY:[2]]) | FILTER _.COL1 + @c7 + LESS_THAN promote(@c10 AS INT) OR _.COL1 + @c7 GREATER_THAN promote(@c12 AS + INT) | FETCH' + task_count: 326 + task_total_time_ms: 23 + transform_count: 83 + transform_time_ms: 11 + transform_yield_count: 31 insert_time_ms: 0 - insert_new_count: 33 - insert_reused_count: 3 + insert_new_count: 39 + insert_reused_count: 4 diff --git a/yaml-tests/src/test/resources/between.yamsql b/yaml-tests/src/test/resources/between.yamsql index 23843d29ffc..c4a1b0c0654 100644 --- a/yaml-tests/src/test/resources/between.yamsql +++ b/yaml-tests/src/test/resources/between.yamsql @@ -80,13 +80,13 @@ test_block: ] - - query: select * from t1 WHERE col1 + 5 BETWEEN 10 AND 20 - - explain: "ISCAN(I1 <,>) | FILTER _.COL1 + @c7 GREATER_THAN_OR_EQUALS promote(@c9 AS INT) AND _.COL1 + @c7 LESS_THAN_OR_EQUALS promote(@c11 AS INT)" + - explain: "COVERING(I1 <,> -> [COL1: KEY:[0], ID: KEY:[2]]) | FILTER _.COL1 + @c7 GREATER_THAN_OR_EQUALS promote(@c9 AS INT) AND _.COL1 + @c7 LESS_THAN_OR_EQUALS promote(@c11 AS INT) | FETCH" - result: [ {ID: 1, 10, 1}, {ID: 2, 10, 2}, {ID: 3, 10, 3}, {ID: 4, 10, 4}, {ID: 5, 10, 5} ] - - query: select * from t1 WHERE col1 + 5 NOT BETWEEN 10 AND 20 - - explain: "ISCAN(I1 <,>) | FILTER _.COL1 + @c7 LESS_THAN promote(@c10 AS INT) OR _.COL1 + @c7 GREATER_THAN promote(@c12 AS INT)" + - explain: "COVERING(I1 <,> -> [COL1: KEY:[0], ID: KEY:[2]]) | FILTER _.COL1 + @c7 LESS_THAN promote(@c10 AS INT) OR _.COL1 + @c7 GREATER_THAN promote(@c12 AS INT) | FETCH" - result: [ {ID: 6, 20, 6}, {ID: 7, 20, 7}, {ID: 8, 20, 8}, {ID: 9, 20, 9}, {ID: 10, 20, 10}, {ID: 11, 30, 11}, {ID: 12, 30, 12}, {ID: 13, 30, 13} diff --git a/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.binpb b/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.binpb index 0a0726d220b..94619f98e64 100644 --- a/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.binpb +++ b/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.binpb @@ -40,20 +40,20 @@ digraph G { 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}Í +}€ à -bitmap-agg-index-tests¨EXPLAIN SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, category, bitmap_bucket_offset(id) as offset FROM T2 GROUP BY category, bitmap_bucket_offset(id)„ -™ä͇ J ¯­¢(0æ§8@ýISCAN(AGG_INDEX_2 <,>) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY (_._0.CATEGORY AS _0, (_._0.ID) bitmap_bucket_offset 10000 AS _1) | MAP (_._1._0 AS BITMAP, _._0._0 AS CATEGORY, _._0._1 AS OFFSET)ædigraph G { +bitmap-agg-index-tests¨EXPLAIN SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, category, bitmap_bucket_offset(id) as offset FROM T2 GROUP BY category, bitmap_bucket_offset(id)· +«Ì õM ãå“(0”¦8@¤COVERING(AGG_INDEX_2 <,> -> [CATEGORY: KEY:[0], ID: KEY:[3]]) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY (_._0.CATEGORY AS _0, (_._0.ID) bitmap_bucket_offset 10000 AS _1) | MAP (_._1._0 AS BITMAP, _._0._0 AS CATEGORY, _._0._1 AS OFFSET)òdigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._1._0 AS BITMAP, q6._0._0 AS CATEGORY, q6._0._1 AS OFFSET)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(BYTES AS BITMAP, STRING AS CATEGORY, LONG AS OFFSET)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT (bitmap_construct_agg_l((q50._0.ID) bitmap_bit_position 10000) AS _0)
GROUP BY (q50._0.CATEGORY AS _0, (q50._0.ID) bitmap_bucket_offset 10000 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS _0, LONG AS _1 AS _0, BYTES AS _0 AS _1)" ]; - 3 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS CATEGORY AS _0)" ]; - 4 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS CATEGORY)" ]; + 2 [ label=<
Streaming Aggregate
COLLECT (bitmap_construct_agg_l((q51._0.ID) bitmap_bit_position 10000) AS _0)
GROUP BY (q51._0.CATEGORY AS _0, (q51._0.ID) bitmap_bucket_offset 10000 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS _0, LONG AS _1 AS _0, BYTES AS _0 AS _1)" ]; + 3 [ label=<
Value Computation
MAP (q44 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS CATEGORY AS _0)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS CATEGORY)" ]; 5 [ label=<
Index
AGG_INDEX_2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS CATEGORY)" ]; - 3 -> 2 [ label=< q50> label="q50" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q51> label="q51" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q44> label="q44" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; } \ No newline at end of file diff --git a/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.yaml b/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.yaml index 9bf1a1ac2e9..e3489086c56 100644 --- a/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.yaml +++ b/yaml-tests/src/test/resources/bitmap-aggregate-index.metrics.yaml @@ -42,15 +42,15 @@ bitmap-agg-index-tests: - query: EXPLAIN SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, category, bitmap_bucket_offset(id) as offset FROM T2 GROUP BY category, bitmap_bucket_offset(id) ref: bitmap-aggregate-index.yamsql:78 - explain: ISCAN(AGG_INDEX_2 <,>) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) - bitmap_bit_position 10000) AS _0) GROUP BY (_._0.CATEGORY AS _0, (_._0.ID) - bitmap_bucket_offset 10000 AS _1) | MAP (_._1._0 AS BITMAP, _._0._0 AS CATEGORY, - _._0._1 AS OFFSET) - task_count: 281 - task_total_time_ms: 27 - transform_count: 74 - transform_time_ms: 11 - transform_yield_count: 30 + explain: 'COVERING(AGG_INDEX_2 <,> -> [CATEGORY: KEY:[0], ID: KEY:[3]]) | MAP + (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) + AS _0) GROUP BY (_._0.CATEGORY AS _0, (_._0.ID) bitmap_bucket_offset 10000 + AS _1) | MAP (_._1._0 AS BITMAP, _._0._0 AS CATEGORY, _._0._1 AS OFFSET)' + task_count: 299 + task_total_time_ms: 10 + transform_count: 77 + transform_time_ms: 4 + transform_yield_count: 31 insert_time_ms: 0 - insert_new_count: 25 + insert_new_count: 28 insert_reused_count: 2 diff --git a/yaml-tests/src/test/resources/bitmap-aggregate-index.yamsql b/yaml-tests/src/test/resources/bitmap-aggregate-index.yamsql index 58b31eedc15..583ffa43462 100644 --- a/yaml-tests/src/test/resources/bitmap-aggregate-index.yamsql +++ b/yaml-tests/src/test/resources/bitmap-aggregate-index.yamsql @@ -75,7 +75,7 @@ test_block: - unorderedResult: [{BITMAP: xStartsWith_1250'060000c', 'OFFSET':0}, {BITMAP: xStartsWith_1250'02', 'OFFSET':10000}] - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, category, bitmap_bucket_offset(id) as offset FROM T2 GROUP BY category, bitmap_bucket_offset(id) - - explain: "ISCAN(AGG_INDEX_2 <,>) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY (_._0.CATEGORY AS _0, (_._0.ID) bitmap_bucket_offset 10000 AS _1) | MAP (_._1._0 AS BITMAP, _._0._0 AS CATEGORY, _._0._1 AS OFFSET)" + - explain: "COVERING(AGG_INDEX_2 <,> -> [CATEGORY: KEY:[0], ID: KEY:[3]]) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY (_._0.CATEGORY AS _0, (_._0.ID) bitmap_bucket_offset 10000 AS _1) | MAP (_._1._0 AS BITMAP, _._0._0 AS CATEGORY, _._0._1 AS OFFSET)" - unorderedResult: [{BITMAP: xStartsWith_1250'0200004', 'CATEGORY': 'hello', 'OFFSET':0}, {BITMAP: xStartsWith_1250'02', 'CATEGORY': 'hello', 'OFFSET':10000}, {BITMAP: xStartsWith_1250'0400008', 'CATEGORY': 'world', 'OFFSET':0}] diff --git a/yaml-tests/src/test/resources/catalog.metrics.binpb b/yaml-tests/src/test/resources/catalog.metrics.binpb index ab268da052a..5abcad1d029 100644 --- a/yaml-tests/src/test/resources/catalog.metrics.binpb +++ b/yaml-tests/src/test/resources/catalog.metrics.binpb @@ -1,37 +1,36 @@ Ê Í catalog-tests»EXPLAIN select sum(cnt) from (select count(*) as cnt, template_name, template_version from schemas group by template_name, template_version having template_name = 'TEST_TEMPLATE_1') as t;÷ -‘ØÆÚ’ �Ї -(-0‘ /86@‘AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c28 AS STRING)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP ((_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) AS _0) | AGG (sum_l(_._0.CNT) AS _0) GROUP BY () | ON EMPTY NULL | MAP (_._0._0 AS _0)Ädigraph G { +£‡©’• ÙÝù (.0ú¤189@‘AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c28 AS STRING)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP ((_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) AS _0) | AGG (sum_l(_._0.CNT) AS _0) GROUP BY () | ON EMPTY NULL | MAP (_._0._0 AS _0)Ädigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q12._0._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 2 [ label=<
Value Computation
$q12 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; - 3 [ label=<
Streaming Aggregate
COLLECT (sum_l(q80._0.CNT) AS _0)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; + 3 [ label=<
Streaming Aggregate
COLLECT (sum_l(q81._0.CNT) AS _0)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 4 [ label=<
Value Computation
MAP ((q6._2 AS CNT, q6._0 AS TEMPLATE_NAME, q6._1 AS TEMPLATE_VERSION) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS CNT, STRING AS TEMPLATE_NAME, INT AS TEMPLATE_VERSION AS _0)" ]; 5 [ label=<
Index Scan
scan type: BY_GROUP
comparisons: [EQUALS promote(@c28 AS STRING)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS _0, INT AS _1, LONG AS _2)" ]; 6 [ label=<
Index
TEMPLATES_COUNT_INDEX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS DATABASE_ID, STRING AS SCHEMA_NAME, STRING AS TEMPLATE_NAME, INT AS TEMPLATE_VERSION)" ]; 3 -> 2 [ label=< q12> label="q12" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q80> label="q80" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q81> label="q81" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q12> label="q12" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }� æ catalog-testsÔEXPLAIN select sum(cnt) from (select count(*) as cnt, template_name, template_version from schemas group by template_name, template_version having template_name = 'TEST_TEMPLATE_1' and template_version = 1) as t;± -‘俞’ ̓à (-0 ‘886@®AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c28 AS STRING), EQUALS promote(@c32 AS INT)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP ((_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) AS _0) | AGG (sum_l(_._0.CNT) AS _0) GROUP BY () | ON EMPTY NULL | MAP (_._0._0 AS _0)ádigraph G { +£Èߌ• Ƹª (.0ÑÉ-89@®AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c28 AS STRING), EQUALS promote(@c32 AS INT)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP ((_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) AS _0) | AGG (sum_l(_._0.CNT) AS _0) GROUP BY () | ON EMPTY NULL | MAP (_._0._0 AS _0)ádigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q12._0._0 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0)" ]; 2 [ label=<
Value Computation
$q12 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; - 3 [ label=<
Streaming Aggregate
COLLECT (sum_l(q80._0.CNT) AS _0)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; + 3 [ label=<
Streaming Aggregate
COLLECT (sum_l(q81._0.CNT) AS _0)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 4 [ label=<
Value Computation
MAP ((q6._2 AS CNT, q6._0 AS TEMPLATE_NAME, q6._1 AS TEMPLATE_VERSION) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS CNT, STRING AS TEMPLATE_NAME, INT AS TEMPLATE_VERSION AS _0)" ]; 5 [ label=<
Index Scan
scan type: BY_GROUP
comparisons: [EQUALS promote(@c28 AS STRING), EQUALS promote(@c32 AS INT)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS _0, INT AS _1, LONG AS _2)" ]; 6 [ label=<
Index
TEMPLATES_COUNT_INDEX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS DATABASE_ID, STRING AS SCHEMA_NAME, STRING AS TEMPLATE_NAME, INT AS TEMPLATE_VERSION)" ]; 3 -> 2 [ label=< q12> label="q12" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q80> label="q80" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q81> label="q81" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q12> label="q12" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; diff --git a/yaml-tests/src/test/resources/catalog.metrics.yaml b/yaml-tests/src/test/resources/catalog.metrics.yaml index ee305514b7b..d33f8da0194 100644 --- a/yaml-tests/src/test/resources/catalog.metrics.yaml +++ b/yaml-tests/src/test/resources/catalog.metrics.yaml @@ -7,13 +7,13 @@ catalog-tests: -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP ((_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) AS _0) | AGG (sum_l(_._0.CNT) AS _0) GROUP BY () | ON EMPTY NULL | MAP (_._0._0 AS _0)' - task_count: 529 - task_total_time_ms: 47 - transform_count: 146 - transform_time_ms: 21 - transform_yield_count: 45 + task_count: 547 + task_total_time_ms: 42 + transform_count: 149 + transform_time_ms: 20 + transform_yield_count: 46 insert_time_ms: 0 - insert_new_count: 54 + insert_new_count: 57 insert_reused_count: 3 - query: EXPLAIN select sum(cnt) from (select count(*) as cnt, template_name, template_version from schemas group by template_name, template_version having template_name @@ -24,11 +24,11 @@ catalog-tests: | MAP ((_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) AS _0) | AGG (sum_l(_._0.CNT) AS _0) GROUP BY () | ON EMPTY NULL | MAP (_._0._0 AS _0)' - task_count: 529 - task_total_time_ms: 55 - transform_count: 146 - transform_time_ms: 28 - transform_yield_count: 45 + task_count: 547 + task_total_time_ms: 54 + transform_count: 149 + transform_time_ms: 23 + transform_yield_count: 46 insert_time_ms: 0 - insert_new_count: 54 + insert_new_count: 57 insert_reused_count: 3 diff --git a/yaml-tests/src/test/resources/composite-aggregates.metrics.binpb b/yaml-tests/src/test/resources/composite-aggregates.metrics.binpb index 9101f10cb60..82068471a27 100644 --- a/yaml-tests/src/test/resources/composite-aggregates.metrics.binpb +++ b/yaml-tests/src/test/resources/composite-aggregates.metrics.binpb @@ -136,20 +136,20 @@ z 6 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}ž +}ë _ -agg-empty-table-testsFEXPLAIN select col1, min(col2), max(col2) from T3 group by col1, col3;º -à¹�ïe ëè¯(20ò± 8!@¹ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0, max_l(_._0.COL2) AS _1) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._0 AS COL1, _._1._0 AS _1, _._1._1 AS _2)àdigraph G { +agg-empty-table-testsFEXPLAIN select col1, min(col2), max(col2) from T3 group by col1, col3;‡ +„»�Œk ò®¾(40¢º8'@úCOVERING(T3_I1 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0, max_l(_._0.COL2) AS _1) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._0 AS COL1, _._1._0 AS _1, _._1._1 AS _2)ìdigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q6._0._0 AS COL1, q6._1._0 AS _1, q6._1._1 AS _2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, LONG AS _1, LONG AS _2)" ]; - 2 [ label=<
Streaming Aggregate
COLLECT (min_l(q84._0.COL2) AS _0, max_l(q84._0.COL2) AS _1)
GROUP BY (q84._0.COL1 AS _0, q84._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0, LONG AS _1 AS _1)" ]; - 3 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; - 4 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; + 2 [ label=<
Streaming Aggregate
COLLECT (min_l(q86._0.COL2) AS _0, max_l(q86._0.COL2) AS _1)
GROUP BY (q86._0.COL1 AS _0, q86._0.COL3 AS _1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1 AS _0, LONG AS _0, LONG AS _1 AS _1)" ]; + 3 [ label=<
Value Computation
MAP (q74 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3 AS _0)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; 5 [ label=<
Index
T3_I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, LONG AS COL3)" ]; - 3 -> 2 [ label=< q84> label="q84" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q86> label="q86" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q74> label="q74" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }� diff --git a/yaml-tests/src/test/resources/composite-aggregates.metrics.yaml b/yaml-tests/src/test/resources/composite-aggregates.metrics.yaml index 2c8b635b1ab..9d6b47b6668 100644 --- a/yaml-tests/src/test/resources/composite-aggregates.metrics.yaml +++ b/yaml-tests/src/test/resources/composite-aggregates.metrics.yaml @@ -107,16 +107,17 @@ agg-empty-table-tests: insert_reused_count: 1 - query: EXPLAIN select col1, min(col2), max(col2) from T3 group by col1, col3; ref: composite-aggregates.yamsql:105 - explain: ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0, max_l(_._0.COL2) + explain: 'COVERING(T3_I1 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], + ID: KEY:[4]]) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0, max_l(_._0.COL2) AS _1) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._0 AS COL1, - _._1._0 AS _1, _._1._1 AS _2) - task_count: 352 + _._1._0 AS _1, _._1._1 AS _2)' + task_count: 388 task_total_time_ms: 12 - transform_count: 101 + transform_count: 107 transform_time_ms: 9 - transform_yield_count: 50 + transform_yield_count: 52 insert_time_ms: 0 - insert_new_count: 33 + insert_new_count: 39 insert_reused_count: 4 - query: EXPLAIN select col1 as "a", col1 as "b", sum(col2) as "a1", sum(col2) as "b1" from T2 group by col1; diff --git a/yaml-tests/src/test/resources/composite-aggregates.yamsql b/yaml-tests/src/test/resources/composite-aggregates.yamsql index a3f407e4d3e..1beba30a38b 100644 --- a/yaml-tests/src/test/resources/composite-aggregates.yamsql +++ b/yaml-tests/src/test/resources/composite-aggregates.yamsql @@ -102,7 +102,7 @@ test_block: - result: [] - - query: select col1, min(col2), max(col2) from T3 group by col1, col3; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0, max_l(_._0.COL2) AS _1) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._0 AS COL1, _._1._0 AS _1, _._1._1 AS _2)" + - explain: "COVERING(T3_I1 <,> -> [COL1: KEY:[0], COL2: KEY:[2], COL3: KEY:[1], ID: KEY:[4]]) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0, max_l(_._0.COL2) AS _1) GROUP BY (_._0.COL1 AS _0, _._0.COL3 AS _1) | MAP (_._0._0 AS COL1, _._1._0 AS _1, _._1._1 AS _2)" - result: [] - - query: select col1 as "a", col1 as "b", sum(col2) as "a1", sum(col2) as "b1" from T2 group by col1; diff --git a/yaml-tests/src/test/resources/covering-sum-pushdown.metrics.binpb b/yaml-tests/src/test/resources/covering-sum-pushdown.metrics.binpb new file mode 100644 index 00000000000..fce1e046753 --- /dev/null +++ b/yaml-tests/src/test/resources/covering-sum-pushdown.metrics.binpb @@ -0,0 +1,14 @@ +Ý +: +covering-sum-pushdown!EXPLAIN select a + b as s from t;ž +ï™ñß4: †Û $(0Îï„8@PCOVERING(AB <,> -> [A: KEY:[0], B: KEY:[1], PK: KEY:[3]]) | MAP (_.A + _.B AS S)­ +digraph G { + fontname=courier; + rankdir=BT; + splines=line; + 1 [ label=<
Value Computation
MAP (q37.A + q37.B AS S)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS S)" ]; + 2 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS PK, LONG AS A, LONG AS B, LONG AS C)" ]; + 3 [ label=<
Index
AB
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS PK, LONG AS A, LONG AS B, LONG AS C)" ]; + 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q37> label="q37" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} \ No newline at end of file diff --git a/yaml-tests/src/test/resources/covering-sum-pushdown.metrics.yaml b/yaml-tests/src/test/resources/covering-sum-pushdown.metrics.yaml new file mode 100644 index 00000000000..ac633d3d131 --- /dev/null +++ b/yaml-tests/src/test/resources/covering-sum-pushdown.metrics.yaml @@ -0,0 +1,13 @@ +covering-sum-pushdown: +- query: EXPLAIN select a + b as s from t; + ref: covering-sum-pushdown.yamsql:48 + explain: 'COVERING(AB <,> -> [A: KEY:[0], B: KEY:[1], PK: KEY:[3]]) | MAP (_.A + + _.B AS S)' + task_count: 239 + task_total_time_ms: 110 + transform_count: 58 + transform_time_ms: 76 + transform_yield_count: 25 + insert_time_ms: 4 + insert_new_count: 25 + insert_reused_count: 4 diff --git a/yaml-tests/src/test/resources/covering-sum-pushdown.yamsql b/yaml-tests/src/test/resources/covering-sum-pushdown.yamsql new file mode 100644 index 00000000000..bc20b5e45cd --- /dev/null +++ b/yaml-tests/src/test/resources/covering-sum-pushdown.yamsql @@ -0,0 +1,50 @@ +# +# covering-sum-pushdown.yamsql +# +# This source file is part of the FoundationDB open source project +# +# Copyright 2021-2026 Apple Inc. and the FoundationDB project authors +# +# Licensed 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. +# +# Investigation: a plain value index on (a, b) carries everything needed to evaluate +# `a + b`, so `SELECT a + b` ought to plan as a COVERING index scan with the addition +# computed above the scan. Instead the arithmetic blocks the projection from being +# pushed below the fetch, so the plan keeps a fetching ISCAN. +# +# Reduced to the single query under investigation, so that a breakpoint in +# ScanWithFetchMatchCandidate is hit for this query only. +# +--- +schema_template: + create table t(pk bigint, a bigint, b bigint, c bigint, primary key(pk)) + create index ab as select a, b from t order by a, b +--- +setup: + steps: + - query: INSERT INTO T + VALUES (1, 10, 1, 100), + (2, 20, 2, 200), + (3, 30, 3, 300), + (4, 40, 4, 400), + (5, 50, 5, 500) +--- +test_block: + name: covering-sum-pushdown + preset: single_repetition_ordered + tests: + - + - query: select a + b as s from t; + - explain: "COVERING(AB <,> -> [A: KEY:[0], B: KEY:[1], PK: KEY:[3]]) | MAP (_.A + _.B AS S)" + - result: [{S: 11}, {S: 22}, {S: 33}, {S: 44}, {S: 55}] +... diff --git a/yaml-tests/src/test/resources/create-drop.metrics.binpb b/yaml-tests/src/test/resources/create-drop.metrics.binpb index 2aad1b7477c..e1585345b86 100644 --- a/yaml-tests/src/test/resources/create-drop.metrics.binpb +++ b/yaml-tests/src/test/resources/create-drop.metrics.binpb @@ -39,7 +39,7 @@ unnamed-10FEXPLAIN select count(*) from "DATABASES" where database_id = '/FRL/D R unnamed-20DEXPLAIN select count(*) from "SCHEMAS" where database_id = '/FRL/DB'¥ -›÷­¾� øîˆ(,0Øî8<@£SCAN([IS SCHEMAS, EQUALS promote(@c10 AS STRING)]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)àdigraph G { +°õ§Ý� Ê´¦(-0œÿ8@@£SCAN([IS SCHEMAS, EQUALS promote(@c10 AS STRING)]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)àdigraph G { fontname=courier; rankdir=BT; splines=line; @@ -50,7 +50,7 @@ unnamed-20DEXPLAIN select count(*) from "SCHEMAS" where database_id = '/FRL/DB' 5 [ label=<
Scan
comparisons: [IS SCHEMAS, EQUALS promote(@c10 AS STRING)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS DATABASE_ID, STRING AS SCHEMA_NAME, STRING AS TEMPLATE_NAME, INT AS TEMPLATE_VERSION)" ]; 6 [ label=<
Primary Storage
record types: [DATABASES, SCHEMAS, TEMPLATES]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(STRING AS DATABASE_ID, STRING AS SCHEMA_NAME, STRING AS TEMPLATE_NAME, INT AS TEMPLATE_VERSION)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q80> label="q80" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q82> label="q82" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; diff --git a/yaml-tests/src/test/resources/create-drop.metrics.yaml b/yaml-tests/src/test/resources/create-drop.metrics.yaml index 0e282eb97b3..574f8fe1fac 100644 --- a/yaml-tests/src/test/resources/create-drop.metrics.yaml +++ b/yaml-tests/src/test/resources/create-drop.metrics.yaml @@ -32,11 +32,11 @@ unnamed-20: explain: SCAN([IS SCHEMAS, EQUALS promote(@c10 AS STRING)]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0) - task_count: 539 - task_total_time_ms: 11 - transform_count: 141 + task_count: 560 + task_total_time_ms: 9 + transform_count: 143 transform_time_ms: 4 - transform_yield_count: 44 + transform_yield_count: 45 insert_time_ms: 0 - insert_new_count: 60 - insert_reused_count: 2 + insert_new_count: 64 + insert_reused_count: 3 diff --git a/yaml-tests/src/test/resources/join-tests-outer.metrics.binpb b/yaml-tests/src/test/resources/join-tests-outer.metrics.binpb index 3c4cea016c2..c05f82973f8 100644 --- a/yaml-tests/src/test/resources/join-tests-outer.metrics.binpb +++ b/yaml-tests/src/test/resources/join-tests-outer.metrics.binpb @@ -582,10 +582,10 @@ z rankDir=LR; 2 -> 4 [ color="red" style="invis" ]; } -}�0 +}­0 ¹ -left-outer-join¥EXPLAIN SELECT "x"."c", "e"."fname", "e"."lname" FROM (SELECT COUNT(*) AS "c" FROM "dept") "x" LEFT OUTER JOIN "emp" "e" ON "e"."id" >= "x"."c" ORDER BY "e"."fname";Ñ. -ò¢º½£  ÜÊ(>0´¯8S@éISCAN(dept$name <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { COVERING(emp$fname <,> -> [fname: KEY:[0], id: KEY:[2]]) | FILTER _.id GREATER_THAN_OR_EQUALS promote(coalesce_long(q0._0._0, 0l) AS LONG) | FETCH | ON EMPTY NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS c, q1.fname AS fname, q1.lname AS lname) }Æ+digraph G { +left-outer-join¥EXPLAIN SELECT "x"."c", "e"."fname", "e"."lname" FROM (SELECT COUNT(*) AS "c" FROM "dept") "x" LEFT OUTER JOIN "emp" "e" ON "e"."id" >= "x"."c" ORDER BY "e"."fname";î. +„‡„Œ¦ ð‘ö(?0ÌÑ8V@äSCAN([IS dept]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { COVERING(emp$fname <,> -> [fname: KEY:[0], id: KEY:[2]]) | FILTER _.id GREATER_THAN_OR_EQUALS promote(coalesce_long(q0._0._0, 0l) AS LONG) | FETCH | ON EMPTY NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS c, q1.fname AS fname, q1.lname AS lname) }è+digraph G { fontname=courier; rankdir=BT; splines=line; @@ -593,15 +593,15 @@ z 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Streaming Aggregate
COLLECT (count_star(*) AS _0)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 4 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name AS _0)" ]; - 5 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name)" ]; - 6 [ label=<
Index
dept$name
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name)" ]; + 5 [ label=<
Scan
comparisons: [IS dept]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name)" ]; + 6 [ label=<
Primary Storage
record types: [project, emp, award, dept]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name)" ]; 7 [ label=<
Value Computation
$q12 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS fname, STRING AS lname, LONG AS dept_id)" ]; 8 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS id, STRING AS fname, STRING AS lname, LONG AS dept_id)" ]; 9 [ label=<
Predicate Filter
WHERE q69.id GREATER_THAN_OR_EQUALS promote(coalesce_long(q6._0._0, 0l) AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS fname, STRING AS lname, LONG AS dept_id)" ]; 10 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS fname, STRING AS lname, LONG AS dept_id)" ]; 11 [ label=<
Index
emp$fname
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS fname, STRING AS lname, LONG AS dept_id)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q108> label="q108" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q107> label="q107" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; @@ -1022,7 +1022,7 @@ k }Õ" ± left-outer-join�EXPLAIN SELECT "e"."fname", "sq"."info" FROM "emp" "e" LEFT JOIN (SELECT "id" AS "k", ("id", "name") AS "info" FROM "dept") "sq" ON "e"."dept_id" = "sq"."k";ž! -Œ–„ç¬ ‘ÔÅ(90‚É8P@·ISCAN(emp$fname <,>) | FLATMAP q0 -> { SCAN([IS dept]) | FILTER q0.dept_id EQUALS _.id | MAP (_.id AS k, _ AS info) | ON EMPTY NULL AS q1 RETURN (q0.fname AS fname, q1.info AS info) }Ådigraph G { +Œ÷›ì¬ ³äÓ(90´‰8Q@·ISCAN(emp$fname <,>) | FLATMAP q0 -> { SCAN([IS dept]) | FILTER q0.dept_id EQUALS _.id | MAP (_.id AS k, _ AS info) | ON EMPTY NULL AS q1 RETURN (q0.fname AS fname, q1.info AS info) }Ådigraph G { fontname=courier; rankdir=BT; splines=line; diff --git a/yaml-tests/src/test/resources/join-tests-outer.metrics.yaml b/yaml-tests/src/test/resources/join-tests-outer.metrics.yaml index 1e1dee48f4f..f6ef20da5b3 100644 --- a/yaml-tests/src/test/resources/join-tests-outer.metrics.yaml +++ b/yaml-tests/src/test/resources/join-tests-outer.metrics.yaml @@ -264,18 +264,18 @@ left-outer-join: AS "c" FROM "dept") "x" LEFT OUTER JOIN "emp" "e" ON "e"."id" >= "x"."c" ORDER BY "e"."fname"; ref: join-tests-outer.yamsql:290 - explain: 'ISCAN(dept$name <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP - BY () | ON EMPTY NULL | FLATMAP q0 -> { COVERING(emp$fname <,> -> [fname: - KEY:[0], id: KEY:[2]]) | FILTER _.id GREATER_THAN_OR_EQUALS promote(coalesce_long(q0._0._0, + explain: 'SCAN([IS dept]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY + () | ON EMPTY NULL | FLATMAP q0 -> { COVERING(emp$fname <,> -> [fname: KEY:[0], + id: KEY:[2]]) | FILTER _.id GREATER_THAN_OR_EQUALS promote(coalesce_long(q0._0._0, 0l) AS LONG) | FETCH | ON EMPTY NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS c, q1.fname AS fname, q1.lname AS lname) }' - task_count: 626 - task_total_time_ms: 7 - transform_count: 163 - transform_time_ms: 3 - transform_yield_count: 62 + task_count: 644 + task_total_time_ms: 8 + transform_count: 166 + transform_time_ms: 4 + transform_yield_count: 63 insert_time_ms: 0 - insert_new_count: 83 + insert_new_count: 86 insert_reused_count: 6 - query: EXPLAIN SELECT "d"."name", COUNT(*) FROM "dept" "d" LEFT JOIN "project" "p" ON "d"."id" = "p"."emp_id" GROUP BY "d"."name"; @@ -463,13 +463,13 @@ left-outer-join: EQUALS _.id | MAP (_.id AS k, _ AS info) | ON EMPTY NULL AS q1 RETURN (q0.fname AS fname, q1.info AS info) } task_count: 652 - task_total_time_ms: 7 + task_total_time_ms: 8 transform_count: 172 transform_time_ms: 3 transform_yield_count: 57 insert_time_ms: 0 - insert_new_count: 80 - insert_reused_count: 2 + insert_new_count: 81 + insert_reused_count: 3 - query: EXPLAIN SELECT "e"."fname", "d"."name" FROM "emp" "e" LEFT JOIN "dept" "d" ON "e"."dept_id" = "d"."id" WHERE "e"."fname" = 'Alice' OR "e"."fname" = 'Dave'; diff --git a/yaml-tests/src/test/resources/join-tests-outer.yamsql b/yaml-tests/src/test/resources/join-tests-outer.yamsql index e9b61a39109..ddcd535ef66 100644 --- a/yaml-tests/src/test/resources/join-tests-outer.yamsql +++ b/yaml-tests/src/test/resources/join-tests-outer.yamsql @@ -287,7 +287,7 @@ test_block: # The result cardinality is bounded by the null-producing side, so the planner can satisfy the ordering by # scanning the inner side ordered by `emp$fname`. - query: SELECT "x"."c", "e"."fname", "e"."lname" FROM (SELECT COUNT(*) AS "c" FROM "dept") "x" LEFT OUTER JOIN "emp" "e" ON "e"."id" >= "x"."c" ORDER BY "e"."fname"; - - explain: "ISCAN(dept$name <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { COVERING(emp$fname <,> -> [fname: KEY:[0], id: KEY:[2]]) | FILTER _.id GREATER_THAN_OR_EQUALS promote(coalesce_long(q0._0._0, 0l) AS LONG) | FETCH | ON EMPTY NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS c, q1.fname AS fname, q1.lname AS lname) }" + - explain: "SCAN([IS dept]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { COVERING(emp$fname <,> -> [fname: KEY:[0], id: KEY:[2]]) | FILTER _.id GREATER_THAN_OR_EQUALS promote(coalesce_long(q0._0._0, 0l) AS LONG) | FETCH | ON EMPTY NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS c, q1.fname AS fname, q1.lname AS lname) }" - result: [ {!l 3, 'Carol', 'Lee'}, {!l 3, 'Dave', 'Kim'}] diff --git a/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.binpb b/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.binpb index f90181ddcb6..7f74ce72e54 100644 --- a/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.binpb +++ b/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.binpb @@ -1161,10 +1161,10 @@ j rankDir=LR; 2 -> 7 [ color="red" style="invis" ]; } -}‰' +}Š' � -joins-with-order-by-testsrEXPLAIN select (t1.*), (t3.*) from t1, t3 where t1.a1 IN (1, 2) and t3.aRef = t1.id order by t1.a1 asc, t1.a2 descô% -©§ƒÜÄô ¢°¢m(æ0Æ�È8þ@+í[IN arrayDistinct(promote(@c21 AS ARRAY(LONG))) SORTED] | INJOIN q0 -> { COVERING(t1$a1_a2 [EQUALS q0] REVERSE -> [a1: KEY:[0], a2: KEY:[1], id: KEY:[2]]) } | FETCH | FLATMAP q1 -> { ISCAN(t3$aRef [EQUALS q1.id]) AS q2 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS t1, (q2.id AS id, q2.c1 AS c1, q2.c2 AS c2, q2.c3 AS c3, q2.aRef AS aRef) AS t3) }á"digraph G { +joins-with-order-by-testsrEXPLAIN select (t1.*), (t3.*) from t1, t3 where t1.a1 IN (1, 2) and t3.aRef = t1.id order by t1.a1 asc, t1.a2 descõ% +†ô¹“Ö� £¬©€(é0†œŸ8‡@+í[IN arrayDistinct(promote(@c21 AS ARRAY(LONG))) SORTED] | INJOIN q0 -> { COVERING(t1$a1_a2 [EQUALS q0] REVERSE -> [a1: KEY:[0], a2: KEY:[1], id: KEY:[2]]) } | FETCH | FLATMAP q1 -> { ISCAN(t3$aRef [EQUALS q1.id]) AS q2 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS t1, (q2.id AS id, q2.c1 AS c1, q2.c2 AS c2, q2.c3 AS c3, q2.aRef AS aRef) AS t3) }á"digraph G { fontname=courier; rankdir=BT; splines=line; @@ -1172,34 +1172,34 @@ j 2 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 3 [ label=<
Nested Loop Join
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 4 [ label=<
Table Function
EXPLODE(arrayDistinct(promote(@c21 AS ARRAY(LONG))))
> color="black" shape="plain" style="filled" fillcolor="darkseagreen2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; - 5 [ label=<
Covering Index Scan
comparisons: [EQUALS q178]
direction: reversed
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; + 5 [ label=<
Covering Index Scan
comparisons: [EQUALS q181]
direction: reversed
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 6 [ label=<
Index
t1$a1_a2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 7 [ label=<
Index Scan
comparisons: [EQUALS q2.id]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; 8 [ label=<
Index
t3$aRef
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; - 3 -> 2 [ label=< q193> label="q193" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q199> label="q199" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="black" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 3 [ color="black" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q2> label="q2" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 1 [ label=< q6> label="q6" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - { - 7 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; - } { rank=same; rankDir=LR; - 2 -> 7 [ color="red" style="invis" ]; + 4 -> 5 [ color="red" style="invis" ]; + } + { + 7 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { rank=same; rankDir=LR; - 4 -> 5 [ color="red" style="invis" ]; + 2 -> 7 [ color="red" style="invis" ]; } -}Ô& +}Õ& � -joins-with-order-by-testsrEXPLAIN select (t1.*), (t3.*) from t1, t3 where t1.a1 IN (1, 2) and t3.aRef = t1.id order by t1.a1 desc, t1.a2 asc¿% -©ÖšÔãô õÄß(æ0§¦ô8þ@+ê[IN arrayDistinct(promote(@c21 AS ARRAY(LONG))) SORTED DESC] | INJOIN q0 -> { COVERING(t1$a1_a2 [EQUALS q0] -> [a1: KEY:[0], a2: KEY:[1], id: KEY:[2]]) } | FETCH | FLATMAP q1 -> { ISCAN(t3$aRef [EQUALS q1.id]) AS q2 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS t1, (q2.id AS id, q2.c1 AS c1, q2.c2 AS c2, q2.c3 AS c3, q2.aRef AS aRef) AS t3) }¯"digraph G { +joins-with-order-by-testsrEXPLAIN select (t1.*), (t3.*) from t1, t3 where t1.a1 IN (1, 2) and t3.aRef = t1.id order by t1.a1 desc, t1.a2 ascÀ% +†ôè­Ø� ¹âµ�(é0Éî¦8‡@+ê[IN arrayDistinct(promote(@c21 AS ARRAY(LONG))) SORTED DESC] | INJOIN q0 -> { COVERING(t1$a1_a2 [EQUALS q0] -> [a1: KEY:[0], a2: KEY:[1], id: KEY:[2]]) } | FETCH | FLATMAP q1 -> { ISCAN(t3$aRef [EQUALS q1.id]) AS q2 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS t1, (q2.id AS id, q2.c1 AS c1, q2.c2 AS c2, q2.c3 AS c3, q2.aRef AS aRef) AS t3) }¯"digraph G { fontname=courier; rankdir=BT; splines=line; @@ -1207,11 +1207,11 @@ j 2 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 3 [ label=<
Nested Loop Join
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 4 [ label=<
Table Function
EXPLODE(arrayDistinct(promote(@c21 AS ARRAY(LONG))))
> color="black" shape="plain" style="filled" fillcolor="darkseagreen2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; - 5 [ label=<
Covering Index Scan
comparisons: [EQUALS q178]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; + 5 [ label=<
Covering Index Scan
comparisons: [EQUALS q181]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 6 [ label=<
Index
t1$a1_a2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 7 [ label=<
Index Scan
comparisons: [EQUALS q2.id]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; 8 [ label=<
Index
t3$aRef
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; - 3 -> 2 [ label=< q193> label="q193" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q199> label="q199" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="black" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 3 [ color="black" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; @@ -1234,7 +1234,7 @@ j }­C Ü joins-with-order-by-tests¾EXPLAIN select (t1.*) as a, (t3.*) as b from t1, t3 where t1.a1 IN (1, 2) and t3.c1 = t1.a1 and exists (select 4 from t2 where t2.b1 = t1.a1) and t3.c2 = t1.a2 order by t1.a1 asc, t1.a2 descËA -�!¦øœýú ÷¼­Í(»0¹¤æ8Ì@U‘[IN arrayDistinct(promote(@c25 AS ARRAY(LONG))) SORTED] | INJOIN q0 -> { COVERING(t1$a1_a2 [EQUALS q0] REVERSE -> [a1: KEY:[0], a2: KEY:[1], id: KEY:[2]]) } | FETCH | FLATMAP q1 -> { COVERING(t2$b1 [EQUALS q1.a1] -> [b1: KEY:[0], id: KEY:[1]]) | MAP (@c42 AS _0) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q2 -> { ISCAN(t3$c1_c2 [EQUALS q1.a1, EQUALS q1.a2]) AS q3 RETURN q3 } AS q3 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS a, (q3.id AS id, q3.c1 AS c1, q3.c2 AS c2, q3.c3 AS c3, q3.aRef AS aRef) AS b) }“=digraph G { +¾!øõßɃ òÇà�(½0½Ñ÷8Ò@U‘[IN arrayDistinct(promote(@c25 AS ARRAY(LONG))) SORTED] | INJOIN q0 -> { COVERING(t1$a1_a2 [EQUALS q0] REVERSE -> [a1: KEY:[0], a2: KEY:[1], id: KEY:[2]]) } | FETCH | FLATMAP q1 -> { COVERING(t2$b1 [EQUALS q1.a1] -> [b1: KEY:[0], id: KEY:[1]]) | MAP (@c42 AS _0) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q2 -> { ISCAN(t3$c1_c2 [EQUALS q1.a1, EQUALS q1.a2]) AS q3 RETURN q3 } AS q3 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS a, (q3.id AS id, q3.c1 AS c1, q3.c2 AS c2, q3.c3 AS c3, q3.aRef AS aRef) AS b) }“=digraph G { fontname=courier; rankdir=BT; splines=line; @@ -1242,47 +1242,42 @@ j 2 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 3 [ label=<
Nested Loop Join
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 4 [ label=<
Table Function
EXPLODE(arrayDistinct(promote(@c25 AS ARRAY(LONG))))
> color="black" shape="plain" style="filled" fillcolor="darkseagreen2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; - 5 [ label=<
Covering Index Scan
comparisons: [EQUALS q300]
direction: reversed
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; + 5 [ label=<
Covering Index Scan
comparisons: [EQUALS q303]
direction: reversed
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 6 [ label=<
Index
t1$a1_a2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS a1, LONG AS a2, STRING AS a3, VERSION AS __ROW_VERSION)" ]; 7 [ label=<
Nested Loop Join
FLATMAP q6
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; - 8 [ label=<
Index Scan
comparisons: [EQUALS q2.a1, EQUALS q2.a2]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; - 9 [ label=<
Predicate Filter
WHERE q14 NOT_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS _0)" ]; - 10 [ label=<
Index
t3$c1_c2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; - 11 [ label=<
Value Computation
FIRST $q14 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS _0)" ]; + 8 [ label=<
Predicate Filter
WHERE q14 NOT_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS _0)" ]; + 9 [ label=<
Index Scan
comparisons: [EQUALS q2.a1, EQUALS q2.a2]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; + 10 [ label=<
Value Computation
FIRST $q14 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS _0)" ]; + 11 [ label=<
Index
t3$c1_c2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS c1, LONG AS c2, STRING AS c3, LONG AS aRef, VERSION AS __ROW_VERSION)" ]; 12 [ label=<
Value Computation
MAP (@c42 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS _0)" ]; 13 [ label=<
Covering Index Scan
comparisons: [EQUALS q2.a1]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS b1, LONG AS b2, STRING AS b3, VERSION AS __ROW_VERSION)" ]; 14 [ label=<
Index
t2$b1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, LONG AS b1, LONG AS b2, STRING AS b3, VERSION AS __ROW_VERSION)" ]; - 3 -> 2 [ label=< q315> label="q315" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q321> label="q321" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="black" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 3 [ color="black" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q2> label="q2" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 8 -> 7 [ label=< q6> label="q6" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 9 -> 7 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 10 -> 8 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 11 -> 9 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 12 -> 11 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 8 -> 7 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 7 [ label=< q6> label="q6" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 10 -> 8 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 11 -> 9 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 12 -> 10 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 13 -> 12 [ label=< q158> label="q158" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 14 -> 13 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 1 [ label=< q6> label="q6" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { - rank=same; - rankDir=LR; - 4 -> 5 [ color="red" style="invis" ]; - } - { - 9 -> 7 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; + 8 -> 7 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { rank=same; rankDir=LR; - 9 -> 8 [ color="red" style="invis" ]; + 8 -> 9 [ color="red" style="invis" ]; } { - 8 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; + 13 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { - 13 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; + 9 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { 7 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; @@ -1292,6 +1287,11 @@ j rankDir=LR; 2 -> 7 [ color="red" style="invis" ]; } + { + rank=same; + rankDir=LR; + 4 -> 5 [ color="red" style="invis" ]; + } }� j joins-with-order-by-testsMEXPLAIN select (a.*), (b.*) from t1_f(1) as a, t2_f(1) as b where a.a3 = b.b3’ diff --git a/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.yaml b/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.yaml index 1b8f14eaace..e10b9334de5 100644 --- a/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.yaml +++ b/yaml-tests/src/test/resources/join-with-order-by-tests.metrics.yaml @@ -604,13 +604,13 @@ joins-with-order-by-tests: KEY:[2]]) } | FETCH | FLATMAP q1 -> { ISCAN(t3$aRef [EQUALS q1.id]) AS q2 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS t1, (q2.id AS id, q2.c1 AS c1, q2.c2 AS c2, q2.c3 AS c3, q2.aRef AS aRef) AS t3) }' - task_count: 3113 - task_total_time_ms: 412 - transform_count: 1140 - transform_time_ms: 229 - transform_yield_count: 230 - insert_time_ms: 15 - insert_new_count: 382 + task_count: 3206 + task_total_time_ms: 449 + transform_count: 1153 + transform_time_ms: 269 + transform_yield_count: 233 + insert_time_ms: 10 + insert_new_count: 391 insert_reused_count: 43 - query: EXPLAIN select (t1.*), (t3.*) from t1, t3 where t1.a1 IN (1, 2) and t3.aRef = t1.id order by t1.a1 desc, t1.a2 asc @@ -620,13 +620,13 @@ joins-with-order-by-tests: } | FETCH | FLATMAP q1 -> { ISCAN(t3$aRef [EQUALS q1.id]) AS q2 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS t1, (q2.id AS id, q2.c1 AS c1, q2.c2 AS c2, q2.c3 AS c3, q2.aRef AS aRef) AS t3) }' - task_count: 3113 - task_total_time_ms: 477 - transform_count: 1140 - transform_time_ms: 267 - transform_yield_count: 230 - insert_time_ms: 16 - insert_new_count: 382 + task_count: 3206 + task_total_time_ms: 453 + transform_count: 1153 + transform_time_ms: 271 + transform_yield_count: 233 + insert_time_ms: 11 + insert_new_count: 391 insert_reused_count: 43 - query: EXPLAIN select (t1.*) as a, (t3.*) as b from t1, t3 where t1.a1 IN (1, 2) and t3.c1 = t1.a1 and exists (select 4 from t2 where t2.b1 = t1.a1) and @@ -640,13 +640,13 @@ joins-with-order-by-tests: q3 } AS q3 RETURN ((q1.id AS id, q1.a1 AS a1, q1.a2 AS a2, q1.a3 AS a3) AS a, (q3.id AS id, q3.c1 AS c1, q3.c2 AS c2, q3.c3 AS c3, q3.aRef AS aRef) AS b) }' - task_count: 4225 - task_total_time_ms: 1067 - transform_count: 1786 - transform_time_ms: 430 - transform_yield_count: 315 - insert_time_ms: 54 - insert_new_count: 588 + task_count: 4286 + task_total_time_ms: 691 + transform_count: 1795 + transform_time_ms: 301 + transform_yield_count: 317 + insert_time_ms: 31 + insert_new_count: 594 insert_reused_count: 85 - query: EXPLAIN select (a.*), (b.*) from t1_f(1) as a, t2_f(1) as b where a.a3 = b.b3 diff --git a/yaml-tests/src/test/resources/nested-with-nulls.metrics.binpb b/yaml-tests/src/test/resources/nested-with-nulls.metrics.binpb index e79213e5b88..65aa04c10c2 100644 --- a/yaml-tests/src/test/resources/nested-with-nulls.metrics.binpb +++ b/yaml-tests/src/test/resources/nested-with-nulls.metrics.binpb @@ -274,63 +274,62 @@ Z 3 -> 2 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q46> label="q46" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}‘ +}Ç W -nested-with-nulls-tests) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)Ádigraph G { +nested-with-nulls-tests -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)Ídigraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Value Computation
MAP (q45.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; - 2 [ label=<
Predicate Filter
WHERE coalesce_string(q2.A.B.A, @c13) EQUALS @c13
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 1 [ label=<
Value Computation
MAP (q51.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; + 2 [ label=<
Predicate Filter
WHERE coalesce_string(q47.A.B.A, @c13) EQUALS @c13
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 3 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; 4 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 -> 2 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q47> label="q47" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q45> label="q45" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}“ + 2 -> 1 [ label=< q51> label="q51" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}É Y -nested-with-nulls-tests>EXPLAIN select id from t1 where coalesce(a.b.a, 'foo') = 'foo'µ -áÂ�Æ c ú‹Â(0ï¤$8$@TISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)Ádigraph G { +nested-with-nulls-tests>EXPLAIN select id from t1 where coalesce(a.b.a, 'foo') = 'foo'ë +Ĩ�é r ðæú(#0Çä*81@~COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)Ídigraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Value Computation
MAP (q45.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; - 2 [ label=<
Predicate Filter
WHERE coalesce_string(q2.A.B.A, @c13) EQUALS @c13
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 1 [ label=<
Value Computation
MAP (q51.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; + 2 [ label=<
Predicate Filter
WHERE coalesce_string(q47.A.B.A, @c13) EQUALS @c13
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 3 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; 4 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 -> 2 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q47> label="q47" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q45> label="q45" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}‹ + 2 -> 1 [ label=< q51> label="q51" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}Á Y -nested-with-nulls-tests>EXPLAIN select id from t1 where coalesce(a.b.a, 'foo') IS NULL­ -ï ÿàh ÞíÚ( 0„â8(@PISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) IS_NULL | MAP (_.ID AS ID)½digraph G { +nested-with-nulls-tests>EXPLAIN select id from t1 where coalesce(a.b.a, 'foo') IS NULLã +Ò̲² w ³��(%0ɪ+85@zCOVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, @c13) IS_NULL | MAP (_.ID AS ID)Édigraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Value Computation
MAP (q46.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; - 2 [ label=<
Predicate Filter
WHERE coalesce_string(q2.A.B.A, @c13) IS_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 1 [ label=<
Value Computation
MAP (q52.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; + 2 [ label=<
Predicate Filter
WHERE coalesce_string(q48.A.B.A, @c13) IS_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 3 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; 4 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 -> 2 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q48> label="q48" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q46> label="q46" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}Š + 2 -> 1 [ label=< q52> label="q52" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}À X -nested-with-nulls-tests=EXPLAIN select id from t1 where coalesce(a.b.a, null) IS NULL­ -· -h ÷§¹( 0Œ¸(8(@PISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, NULL) IS_NULL | MAP (_.ID AS ID)½digraph G { +nested-with-nulls-tests=EXPLAIN select id from t1 where coalesce(a.b.a, null) IS NULLã +Ò»’Äw ­�é(%0¡ä%85@zCOVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, NULL) IS_NULL | MAP (_.ID AS ID)Édigraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Value Computation
MAP (q46.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; - 2 [ label=<
Predicate Filter
WHERE coalesce_string(q2.A.B.A, NULL) IS_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 1 [ label=<
Value Computation
MAP (q52.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; + 2 [ label=<
Predicate Filter
WHERE coalesce_string(q48.A.B.A, NULL) IS_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; + 3 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; 4 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS A, STRING AS A, LONG AS B AS A, STRING AS A, LONG AS B AS B AS B)" ]; - 3 -> 2 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q48> label="q48" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q46> label="q46" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q52> label="q52" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }® ] nested-with-nulls-testsBEXPLAIN select id from t1 where coalesce(a.b.a, 'foo') IS NOT NULLÌ diff --git a/yaml-tests/src/test/resources/nested-with-nulls.metrics.yaml b/yaml-tests/src/test/resources/nested-with-nulls.metrics.yaml index c5bca439a68..65ca93d6eb0 100644 --- a/yaml-tests/src/test/resources/nested-with-nulls.metrics.yaml +++ b/yaml-tests/src/test/resources/nested-with-nulls.metrics.yaml @@ -228,52 +228,52 @@ nested-with-nulls-tests: insert_reused_count: 4 - query: EXPLAIN select id from t1 where coalesce(a.b.a, 'a2') = 'a2' ref: nested-with-nulls.yamsql:129 - explain: ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP - (_.ID AS ID) - task_count: 353 + explain: 'COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, + @c13) EQUALS @c13 | MAP (_.ID AS ID)' + task_count: 452 task_total_time_ms: 24 - transform_count: 99 - transform_time_ms: 7 - transform_yield_count: 30 + transform_count: 114 + transform_time_ms: 10 + transform_yield_count: 35 insert_time_ms: 0 - insert_new_count: 36 - insert_reused_count: 4 + insert_new_count: 49 + insert_reused_count: 5 - query: EXPLAIN select id from t1 where coalesce(a.b.a, 'foo') = 'foo' ref: nested-with-nulls.yamsql:133 - explain: ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP - (_.ID AS ID) - task_count: 353 + explain: 'COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, + @c13) EQUALS @c13 | MAP (_.ID AS ID)' + task_count: 452 task_total_time_ms: 24 - transform_count: 99 - transform_time_ms: 7 - transform_yield_count: 30 + transform_count: 114 + transform_time_ms: 10 + transform_yield_count: 35 insert_time_ms: 0 - insert_new_count: 36 - insert_reused_count: 4 + insert_new_count: 49 + insert_reused_count: 5 - query: EXPLAIN select id from t1 where coalesce(a.b.a, 'foo') IS NULL ref: nested-with-nulls.yamsql:138 - explain: ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) IS_NULL | MAP (_.ID - AS ID) - task_count: 367 - task_total_time_ms: 12 - transform_count: 104 - transform_time_ms: 3 - transform_yield_count: 32 + explain: 'COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, + @c13) IS_NULL | MAP (_.ID AS ID)' + task_count: 466 + task_total_time_ms: 25 + transform_count: 119 + transform_time_ms: 8 + transform_yield_count: 37 insert_time_ms: 0 - insert_new_count: 40 - insert_reused_count: 4 + insert_new_count: 53 + insert_reused_count: 5 - query: EXPLAIN select id from t1 where coalesce(a.b.a, null) IS NULL ref: nested-with-nulls.yamsql:143 - explain: ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, NULL) IS_NULL | MAP (_.ID - AS ID) - task_count: 367 - task_total_time_ms: 21 - transform_count: 104 - transform_time_ms: 7 - transform_yield_count: 32 + explain: 'COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, + NULL) IS_NULL | MAP (_.ID AS ID)' + task_count: 466 + task_total_time_ms: 15 + transform_count: 119 + transform_time_ms: 5 + transform_yield_count: 37 insert_time_ms: 0 - insert_new_count: 40 - insert_reused_count: 4 + insert_new_count: 53 + insert_reused_count: 5 - query: EXPLAIN select id from t1 where coalesce(a.b.a, 'foo') IS NOT NULL ref: nested-with-nulls.yamsql:148 explain: 'COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | MAP (_.ID diff --git a/yaml-tests/src/test/resources/nested-with-nulls.yamsql b/yaml-tests/src/test/resources/nested-with-nulls.yamsql index 60845d4e709..812ff3ae369 100644 --- a/yaml-tests/src/test/resources/nested-with-nulls.yamsql +++ b/yaml-tests/src/test/resources/nested-with-nulls.yamsql @@ -126,21 +126,21 @@ test_block: - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where coalesce(a.b.a, 'a2') = 'a2' - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)" + - explain: "COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)" - unorderedResult: [ { ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 107 }] - - query: select id from t1 where coalesce(a.b.a, 'foo') = 'foo' - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)" + - explain: "COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, @c13) EQUALS @c13 | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 107 }] - # One of the two coalesce values is not null, so this could be simplified to FALSE - query: select id from t1 where coalesce(a.b.a, 'foo') IS NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, @c13) IS_NULL | MAP (_.ID AS ID)" + - explain: "COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, @c13) IS_NULL | MAP (_.ID AS ID)" - result: [] - # This cannot be simplified to FALSE, as both of the coalesce values are nullable. We could however remove the coalesce entirely - query: select id from t1 where coalesce(a.b.a, null) IS NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, NULL) IS_NULL | MAP (_.ID AS ID)" + - explain: "COVERING(I1 <,> -> [ID: KEY:[2], A: [B: [A: KEY:[0]]]]) | FILTER coalesce_string(_.A.B.A, NULL) IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 107 }] - # One of the two COALESCE() arguments is not nullable, so the predicate is simplified away. diff --git a/yaml-tests/src/test/resources/record-type-key-tests.metrics.binpb b/yaml-tests/src/test/resources/record-type-key-tests.metrics.binpb index 7490441530f..bb548ca218d 100644 --- a/yaml-tests/src/test/resources/record-type-key-tests.metrics.binpb +++ b/yaml-tests/src/test/resources/record-type-key-tests.metrics.binpb @@ -120,10 +120,11 @@ index-scan&EXPLAIN SELECT * from t2 where d = 201 1 [ label=<
Index Scan
comparisons: [EQUALS promote(@c7 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS C, LONG AS D)" ]; 2 [ label=<
Index
I2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS C, LONG AS D)" ]; 2 -> 1 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}† +}š 2 -table-isolationEXPLAIN SELECT count(*) from t1Ï -»׃ÎL ‚íP(0²ó 8!@~ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)²digraph G { +table-isolationEXPLAIN SELECT count(*) from t1ã +ͲøÒO ñ O(0îã +8$@~SCAN([IS T1]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)Ædigraph G { fontname=courier; rankdir=BT; splines=line; @@ -131,17 +132,17 @@ index-scan&EXPLAIN SELECT * from t2 where d = 201 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Streaming Aggregate
COLLECT (count_star(*) AS _0)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 4 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A, LONG AS B AS _0)" ]; - 5 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A, LONG AS B)" ]; - 6 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A, LONG AS B)" ]; + 5 [ label=<
Scan
comparisons: [IS T1]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A, LONG AS B)" ]; + 6 [ label=<
Primary Storage
record types: [T1, T2]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A, LONG AS B)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q54> label="q54" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q53> label="q53" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}† +}š 2 -table-isolationEXPLAIN SELECT count(*) from t2Ï -»ÏáÈL …½P(0®¤ 8!@~ISCAN(I2 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)²digraph G { +table-isolationEXPLAIN SELECT count(*) from t2ã +ÍòÇòO Ⱦ`(0؃ 8$@~SCAN([IS T2]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)Ædigraph G { fontname=courier; rankdir=BT; splines=line; @@ -149,10 +150,10 @@ index-scan&EXPLAIN SELECT * from t2 where d = 201 2 [ label=<
Value Computation
$q6 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 3 [ label=<
Streaming Aggregate
COLLECT (count_star(*) AS _0)
GROUP BY ()
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0 AS _0)" ]; 4 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS C, LONG AS D AS _0)" ]; - 5 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS C, LONG AS D)" ]; - 6 [ label=<
Index
I2
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS C, LONG AS D)" ]; + 5 [ label=<
Scan
comparisons: [IS T2]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS C, LONG AS D)" ]; + 6 [ label=<
Primary Storage
record types: [T1, T2]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS C, LONG AS D)" ]; 3 -> 2 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ label=< q54> label="q54" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q53> label="q53" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; diff --git a/yaml-tests/src/test/resources/record-type-key-tests.metrics.yaml b/yaml-tests/src/test/resources/record-type-key-tests.metrics.yaml index 54f5bd28151..2d8a86e1c43 100644 --- a/yaml-tests/src/test/resources/record-type-key-tests.metrics.yaml +++ b/yaml-tests/src/test/resources/record-type-key-tests.metrics.yaml @@ -138,27 +138,27 @@ index-scan: table-isolation: - query: EXPLAIN SELECT count(*) from t1 ref: record-type-key-tests.yamsql:115 - explain: ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () + explain: SCAN([IS T1]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0) - task_count: 315 + task_count: 333 task_total_time_ms: 3 - transform_count: 76 + transform_count: 79 transform_time_ms: 1 - transform_yield_count: 27 + transform_yield_count: 28 insert_time_ms: 0 - insert_new_count: 33 + insert_new_count: 36 insert_reused_count: 4 - query: EXPLAIN SELECT count(*) from t2 ref: record-type-key-tests.yamsql:119 - explain: ISCAN(I2 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () + explain: SCAN([IS T2]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0) - task_count: 315 + task_count: 333 task_total_time_ms: 3 - transform_count: 76 + transform_count: 79 transform_time_ms: 1 - transform_yield_count: 27 + transform_yield_count: 28 insert_time_ms: 0 - insert_new_count: 33 + insert_new_count: 36 insert_reused_count: 4 dml-operations: - query: EXPLAIN SELECT * from t1 where a = 13 diff --git a/yaml-tests/src/test/resources/record-type-key-tests.yamsql b/yaml-tests/src/test/resources/record-type-key-tests.yamsql index 270e2f01b90..b0bfc371c6d 100644 --- a/yaml-tests/src/test/resources/record-type-key-tests.yamsql +++ b/yaml-tests/src/test/resources/record-type-key-tests.yamsql @@ -112,11 +112,11 @@ test_block: tests: - - query: SELECT count(*) from t1 - - explain: "ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)" + - explain: "SCAN([IS T1]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)" - result: [{!l 3}] - - query: SELECT count(*) from t2 - - explain: "ISCAN(I2 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)" + - explain: "SCAN([IS T2]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | MAP (coalesce_long(_._0._0, 0l) AS _0)" - result: [{!l 3}] --- # DML: insert and verify record type key scans still work diff --git a/yaml-tests/src/test/resources/recursive-cte.metrics.binpb b/yaml-tests/src/test/resources/recursive-cte.metrics.binpb index d20b0b06717..7ad2b8bf648 100644 --- a/yaml-tests/src/test/resources/recursive-cte.metrics.binpb +++ b/yaml-tests/src/test/resources/recursive-cte.metrics.binpb @@ -111,26 +111,26 @@ rankDir=LR; 10 -> 11 [ color="red" style="invis" ]; } -} ! +}Þ Á -recursive-cte-tests©EXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) select id from c1Ù -¯ñÔšO� í Å(|0�Ï‘8„@ ëRUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)Êdigraph G { +recursive-cte-tests©EXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) select id from c1— +�“Ž”L¬ èÓç(…0Þ×Ô8§@ ËRUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)§digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q20.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; 2 [ label=<
Nested Loop Join
RECURSIVE derived(q14, q16)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 4 [ label=<
Value Computation
MAP (q237.ID AS ID, q237.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 4 [ label=<
Value Computation
MAP q248
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 5 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Predicate Filter
WHERE q8.ID EQUALS q229.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Predicate Filter
WHERE q8.ID EQUALS q242.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 7 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 8 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 -> 2 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 2 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 4 [ label=< q237> label="q237" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 7 -> 6 [ label=< q229> label="q229" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 4 [ label=< q248> label="q248" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 6 [ label=< q242> label="q242" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { @@ -138,26 +138,26 @@ rankDir=LR; 3 -> 4 [ color="red" style="invis" ]; } -}¼! +}ú Ü -recursive-cte-testsÄEXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) traversal order post_order select id from c1Ú -ˆõ…ˆP‡ (y0ôȃ8ü@ ìRUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)Êdigraph G { +recursive-cte-testsÄEXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) traversal order post_order select id from c1˜ +æá’üJ¦ †¶‹(‚0¨ØÕ8ž@ ÌRUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)§digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q20.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; 2 [ label=<
Nested Loop Join
RECURSIVE derived(q14, q16)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 3 [ label=<
Value Computation
MAP (q237.ID AS ID, q237.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 3 [ label=<
Value Computation
MAP q248
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 4 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 5 [ label=<
Predicate Filter
WHERE q8.ID EQUALS q229.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 5 [ label=<
Predicate Filter
WHERE q8.ID EQUALS q242.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 6 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 7 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 8 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 -> 2 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 2 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 3 [ label=< q237> label="q237" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 3 [ label=< q248> label="q248" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 7 -> 5 [ label=< q229> label="q229" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 5 [ label=< q242> label="q242" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { @@ -165,11 +165,11 @@ rankDir=LR; 4 -> 3 [ color="red" style="invis" ]; } -}œ5 +}š5 Ý -recursive-cte-testsÅEXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) traversal order level_order select id from c1¹3 -ñ -åûƒ:Ï ó‡±(j0Ìóí8À@ ¢RUNION q0, q1 { INITIAL { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q2 -> { TEMP SCAN base() | FILTER _.ID EQUALS q2.PARENT AS q3 RETURN (q2.ID AS ID, q2.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID)ó0digraph G { +recursive-cte-testsÅEXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) traversal order level_order select id from c1·3 +ú +ã«Ú0Ñ —ðä(k0êö�8Â@ ¢RUNION q0, q1 { INITIAL { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q2 -> { TEMP SCAN base() | FILTER _.ID EQUALS q2.PARENT AS q3 RETURN (q2.ID AS ID, q2.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID)ñ0digraph G { fontname=courier; rankdir=BT; splines=line; @@ -177,65 +177,65 @@ 2 [ label=<
Recursive Union
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 [ label=<
Modification
TempTableInsert
> color="black" shape="plain" style="filled" fillcolor="lightcoral" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 4 [ label=<
Modification
TempTableInsert
> color="black" shape="plain" style="filled" fillcolor="lightcoral" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 5 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Temporary Buffer
C1forInsert
> color="black" shape="plain" style="filled" fillcolor="goldenrod2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 7 [ label=<
Nested Loop Join
FLATMAP (q10.ID AS ID, q10.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Temporary Buffer
C1forInsert
> color="black" shape="plain" style="filled" fillcolor="goldenrod2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 9 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 10 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 11 [ label=<
Predicate Filter
WHERE q8.ID EQUALS q10.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 5 [ label=<
Temporary Buffer
C1forInsert
> color="black" shape="plain" style="filled" fillcolor="goldenrod2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Nested Loop Join
FLATMAP (q10.ID AS ID, q10.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 7 [ label=<
Temporary Buffer
C1forInsert
> color="black" shape="plain" style="filled" fillcolor="goldenrod2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 8 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 9 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 10 [ label=<
Predicate Filter
WHERE q8.ID EQUALS q10.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 11 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 12 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 13 [ label=<
Temp Table Scan
C1forScan
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 3 -> 2 [ label=< q209> label="q209" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 2 [ label=< q211> label="q211" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="none" arrowtail="normal" dir="both" ]; - 7 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 8 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="none" arrowtail="normal" dir="both" ]; - 9 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 10 -> 7 [ label=< q10> label="q10" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 11 -> 7 [ label=< q8> label="q8" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 12 -> 10 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 13 -> 11 [ label=< q8> label="q8" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 3 -> 2 [ label=< q212> label="q212" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 2 [ label=< q210> label="q210" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="none" arrowtail="normal" dir="both" ]; + 6 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="none" arrowtail="normal" dir="both" ]; + 8 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 6 [ label=< q10> label="q10" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 10 -> 6 [ label=< q8> label="q8" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 11 -> 8 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 12 -> 9 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 13 -> 10 [ label=< q8> label="q8" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 7 -> 8 [ color="red" style="invis" ]; + 6 -> 5 [ color="red" style="invis" ]; } { - rank=same; - rankDir=LR; - 5 -> 6 [ color="red" style="invis" ]; + 10 -> 6 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { - 11 -> 7 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; + rank=same; + rankDir=LR; + 9 -> 10 [ color="red" style="invis" ]; } { rank=same; rankDir=LR; - 10 -> 11 [ color="red" style="invis" ]; + 8 -> 7 [ color="red" style="invis" ]; } -}œ! +}Ù ¾ -recursive-cte-tests¦EXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) select id from c1Ø -‰è§õ]· ‘˜Ÿ(‡0‹ÓÜ8»@ êRUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)Édigraph G { +recursive-cte-tests¦EXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) select id from c1• +çØà¯Ö ¹®� (�0×ûŒ8Þ@ ÊRUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)¦digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q20.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; 2 [ label=<
Nested Loop Join
RECURSIVE derived(q14, q16)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 4 [ label=<
Value Computation
MAP (q243.ID AS ID, q243.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 4 [ label=<
Value Computation
MAP q254
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 5 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q235.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q248.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 7 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 8 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 -> 2 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 2 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 4 [ label=< q243> label="q243" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 7 -> 6 [ label=< q235> label="q235" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 4 [ label=< q254> label="q254" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 6 [ label=< q248> label="q248" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { @@ -243,11 +243,11 @@ rankDir=LR; 3 -> 4 [ color="red" style="invis" ]; } -}—5 +}•5 Ú -recursive-cte-testsÂEXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order level_order select id from c1·3 -¡ -™“„;¿ ­·Ç(e0Ű¯8µ@ ¡RUNION q0, q1 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q2 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q2.ID AS q3 RETURN (q2.ID AS ID, q2.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID)ò0digraph G { +recursive-cte-testsÂEXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order level_order select id from c1µ3 +ª +£€‚8Á ©ÏÖ(f0ÏúŒ8·@ ¡RUNION q0, q1 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q2 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q2.ID AS q3 RETURN (q2.ID AS ID, q2.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID)ð0digraph G { fontname=courier; rankdir=BT; splines=line; @@ -255,131 +255,132 @@ 2 [ label=<
Recursive Union
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 [ label=<
Modification
TempTableInsert
> color="black" shape="plain" style="filled" fillcolor="lightcoral" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 4 [ label=<
Modification
TempTableInsert
> color="black" shape="plain" style="filled" fillcolor="lightcoral" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 5 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Temporary Buffer
C1forInsert
> color="black" shape="plain" style="filled" fillcolor="goldenrod2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 7 [ label=<
Nested Loop Join
FLATMAP (q10.ID AS ID, q10.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 5 [ label=<
Temporary Buffer
C1forInsert
> color="black" shape="plain" style="filled" fillcolor="goldenrod2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Nested Loop Join
FLATMAP (q10.ID AS ID, q10.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 7 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 8 [ label=<
Temporary Buffer
C1forInsert
> color="black" shape="plain" style="filled" fillcolor="goldenrod2" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 9 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 10 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 11 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q10.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 9 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 10 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q10.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 11 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 12 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 13 [ label=<
Temp Table Scan
C1forScan
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 3 -> 2 [ label=< q199> label="q199" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 2 [ label=< q201> label="q201" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="none" arrowtail="normal" dir="both" ]; + 3 -> 2 [ label=< q202> label="q202" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 2 [ label=< q200> label="q200" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="none" arrowtail="normal" dir="both" ]; + 6 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="none" arrowtail="normal" dir="both" ]; - 9 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 10 -> 7 [ label=< q10> label="q10" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 11 -> 7 [ label=< q8> label="q8" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 12 -> 10 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 13 -> 11 [ label=< q8> label="q8" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 6 [ label=< q10> label="q10" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 10 -> 6 [ label=< q8> label="q8" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 11 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 12 -> 9 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 13 -> 10 [ label=< q8> label="q8" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 7 -> 8 [ color="red" style="invis" ]; + 6 -> 5 [ color="red" style="invis" ]; } { - rank=same; - rankDir=LR; - 5 -> 6 [ color="red" style="invis" ]; + 10 -> 6 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { - 11 -> 7 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; + rank=same; + rankDir=LR; + 9 -> 10 [ color="red" style="invis" ]; } { rank=same; rankDir=LR; - 10 -> 11 [ color="red" style="invis" ]; + 7 -> 8 [ color="red" style="invis" ]; } -}¶! +}ó Ø -recursive-cte-testsÀEXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order pre_order select id from c1Ø -â¥Ô³V± ªªÜ(„0ô³µ8±@ êRUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)Édigraph G { +recursive-cte-testsÀEXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order pre_order select id from c1• +Àž’íÐ ŠÏ­ +(�0㮕8Ó@ ÊRUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)¦digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q20.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; 2 [ label=<
Nested Loop Join
RECURSIVE derived(q14, q16)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 3 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 4 [ label=<
Value Computation
MAP (q243.ID AS ID, q243.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 5 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q235.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 3 [ label=<
Value Computation
MAP q254
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 4 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 5 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q248.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 7 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 3 -> 2 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 2 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 4 [ label=< q243> label="q243" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 7 -> 6 [ label=< q235> label="q235" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 8 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 3 -> 2 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 2 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 3 [ label=< q254> label="q254" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 5 [ label=< q248> label="q248" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 3 -> 4 [ color="red" style="invis" ]; + 4 -> 3 [ color="red" style="invis" ]; } -}¸! +}õ Ù -recursive-cte-testsÁEXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order post_order select id from c1Ù -ą̂­T± ûŒñ(„0¡ƒ±8±@ ëRUNION-DFS POSTORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)Édigraph G { +recursive-cte-testsÁEXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order post_order select id from c1– +ÀßýÆIÐ ¼ƒÐ(�0Œ�ç8Ó@ ËRUNION-DFS POSTORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)¦digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q20.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID)" ]; 2 [ label=<
Nested Loop Join
RECURSIVE derived(q14, q16)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 3 [ label=<
Value Computation
MAP (q243.ID AS ID, q243.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 4 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 5 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q235.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 3 [ label=<
Index Scan
comparisons: [EQUALS promote(@c14 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 4 [ label=<
Value Computation
MAP q254
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 5 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q248.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 7 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 3 -> 2 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 2 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 3 [ label=< q243> label="q243" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 7 -> 5 [ label=< q235> label="q235" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 8 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 3 -> 2 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 2 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 4 [ label=< q254> label="q254" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 6 [ label=< q248> label="q248" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 4 -> 3 [ color="red" style="invis" ]; + 3 -> 4 [ color="red" style="invis" ]; } -}¨< +}¢; Œ -recursive-cte-testsôEXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from ancestorsOf250 as a, t1 as b where a.parent = b.id) select id, parent from ancestorsOf250 union all select b.id, b.parent from allDescendants as a, t1 as b where a.id = b.parent) select id, parent from allDescendants–9 -צ¸¬VÁ ‰ýç(Ï0Ýýƒ8ó@ÎRUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)£5digraph G { +recursive-cte-testsôEXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from ancestorsOf250 as a, t1 as b where a.parent = b.id) select id, parent from ancestorsOf250 union all select b.id, b.parent from allDescendants as a, t1 as b where a.id = b.parent) select id, parent from allDescendants�8 +µÖ­Ö@à ì©ß(Ø0ŒÑÿ8–@ŽRUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT)Ý4digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q38.ID AS ID, q38.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 2 [ label=<
Nested Loop Join
RECURSIVE derived(q32, q34)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 [ label=<
Value Computation
MAP (q20.ID AS ID, q20.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 4 [ label=<
Value Computation
MAP (q450.ID AS ID, q450.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 4 [ label=<
Value Computation
MAP q477
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 5 [ label=<
Nested Loop Join
RECURSIVE derived(q14, q16)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Predicate Filter
WHERE q26.ID EQUALS q442.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Predicate Filter
WHERE q26.ID EQUALS q471.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 7 [ label=<
Index Scan
comparisons: [EQUALS promote(@c19 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Value Computation
MAP (q346.ID AS ID, q346.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 8 [ label=<
Value Computation
MAP q357
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 9 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 10 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 11 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q338.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 12 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 11 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q351.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 12 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 13 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 14 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 14 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 -> 2 [ label=< q32> label="q32" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 2 [ label=< q34> label="q34" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 3 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 4 [ label=< q450> label="q450" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 4 [ label=< q477> label="q477" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 5 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 5 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 9 -> 6 [ label=< q442> label="q442" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 6 [ label=< q471> label="q471" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 10 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 11 -> 8 [ label=< q346> label="q346" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 11 -> 8 [ label=< q357> label="q357" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 12 -> 9 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 13 -> 11 [ label=< q338> label="q338" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 13 -> 11 [ label=< q351> label="q351" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 14 -> 13 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q38> label="q38" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { @@ -392,49 +393,49 @@ rankDir=LR; 7 -> 8 [ color="red" style="invis" ]; } -}à< +}Ú;  -recursive-cte-testsªEXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from ancestorsOf250 as a, t1 as b where a.parent = b.id) traversal order post_order select id, parent from ancestorsOf250 union all select b.id, b.parent from allDescendants as a, t1 as b where a.id = b.parent) traversal order post_order select id, parent from allDescendants˜9 -µúàÕ˜ Äïþ(Á0‚“Ò8¿@ÐRUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)£5digraph G { +recursive-cte-testsªEXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from ancestorsOf250 as a, t1 as b where a.parent = b.id) traversal order post_order select id, parent from ancestorsOf250 union all select b.id, b.parent from allDescendants as a, t1 as b where a.id = b.parent) traversal order post_order select id, parent from allDescendants’8 +“þã‰u· 륕$(Ê0ø€•8á@�RUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT)Ý4digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q38.ID AS ID, q38.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 2 [ label=<
Nested Loop Join
RECURSIVE derived(q32, q34)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 [ label=<
Value Computation
MAP (q20.ID AS ID, q20.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 4 [ label=<
Value Computation
MAP (q420.ID AS ID, q420.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 4 [ label=<
Value Computation
MAP q447
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 5 [ label=<
Nested Loop Join
RECURSIVE derived(q14, q16)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 6 [ label=<
Predicate Filter
WHERE q26.ID EQUALS q412.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 6 [ label=<
Predicate Filter
WHERE q26.ID EQUALS q441.PARENT
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 7 [ label=<
Index Scan
comparisons: [EQUALS promote(@c19 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 8 [ label=<
Value Computation
MAP (q346.ID AS ID, q346.PARENT AS PARENT)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 8 [ label=<
Value Computation
MAP q357
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 9 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 10 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 11 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q338.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 12 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 11 [ label=<
Predicate Filter
WHERE q8.PARENT EQUALS q351.ID
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 12 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 13 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; - 14 [ label=<
Index
PARENTIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; + 14 [ label=<
Index
CHILDIDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS PARENT)" ]; 3 -> 2 [ label=< q32> label="q32" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 2 [ label=< q34> label="q34" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 3 [ label=< q20> label="q20" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 4 [ label=< q420> label="q420" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 4 [ label=< q447> label="q447" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 5 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 8 -> 5 [ label=< q16> label="q16" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 9 -> 6 [ label=< q412> label="q412" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 6 [ label=< q441> label="q441" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 10 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 11 -> 8 [ label=< q346> label="q346" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 11 -> 8 [ label=< q357> label="q357" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 12 -> 9 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 13 -> 11 [ label=< q338> label="q338" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 13 -> 11 [ label=< q351> label="q351" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 14 -> 13 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q38> label="q38" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 3 -> 4 [ color="red" style="invis" ]; + 7 -> 8 [ color="red" style="invis" ]; } { rank=same; rankDir=LR; - 7 -> 8 [ color="red" style="invis" ]; + 3 -> 4 [ color="red" style="invis" ]; } }ï, â @@ -525,10 +526,10 @@ rankDir=LR; 4 -> 3 [ color="red" style="invis" ]; } -}Ø +}¹ § -recursive-cte-tests-with-hints„EXPLAIN with recursive allDescendants as ( select * from t1 where id = 50 union all select c.* from allDescendants as p, t1 as c use index (childIdxNoNulls) where c.parent is not null and c.parent = p.id) traversal order pre_order select * from allDescendants« -ÌÇîÔú ”lj(H0ÙÊ[8o@óRUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c12 AS LONG)]) } { RECURSIVE COVERING(CHILDIDXNONULLS <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER _.PARENT EQUALS q0.ID AND _.PARENT NOT_NULL | MAP (_.ID AS ID, _.PARENT AS PARENT) }–digraph G { +recursive-cte-tests-with-hints„EXPLAIN with recursive allDescendants as ( select * from t1 where id = 50 union all select c.* from allDescendants as p, t1 as c use index (childIdxNoNulls) where c.parent is not null and c.parent = p.id) traversal order pre_order select * from allDescendantsŒ +ÌÇîÔú ”lj(H0ÙÊ[8o@ÔRUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c12 AS LONG)]) } { RECURSIVE COVERING(CHILDIDXNONULLS <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER _.PARENT EQUALS q0.ID AND _.PARENT NOT_NULL | MAP _ }–digraph G { fontname=courier; rankdir=BT; splines=line; diff --git a/yaml-tests/src/test/resources/recursive-cte.metrics.yaml b/yaml-tests/src/test/resources/recursive-cte.metrics.yaml index c1fdd9a6f06..ce29f519b22 100644 --- a/yaml-tests/src/test/resources/recursive-cte.metrics.yaml +++ b/yaml-tests/src/test/resources/recursive-cte.metrics.yaml @@ -59,32 +59,30 @@ recursive-cte-tests: select id from c1 ref: recursive-cte.yamsql:77 explain: 'RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 1839 - task_total_time_ms: 166 - transform_count: 397 - transform_time_ms: 36 - transform_yield_count: 124 - insert_time_ms: 4 - insert_new_count: 260 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)' + task_count: 2061 + task_total_time_ms: 159 + transform_count: 428 + transform_time_ms: 49 + transform_yield_count: 133 + insert_time_ms: 3 + insert_new_count: 295 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) traversal order post_order select id from c1 ref: recursive-cte.yamsql:107 explain: 'RUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 1800 - task_total_time_ms: 167 - transform_count: 391 - transform_time_ms: 38 - transform_yield_count: 121 - insert_time_ms: 4 - insert_new_count: 252 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)' + task_count: 2022 + task_total_time_ms: 157 + transform_count: 422 + transform_time_ms: 52 + transform_yield_count: 130 + insert_time_ms: 3 + insert_new_count: 286 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) @@ -94,29 +92,28 @@ recursive-cte-tests: | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q2 -> { TEMP SCAN base() | FILTER _.ID EQUALS q2.PARENT AS q3 RETURN (q2.ID AS ID, q2.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID) - task_count: 1393 - task_total_time_ms: 121 - transform_count: 335 - transform_time_ms: 34 - transform_yield_count: 106 - insert_time_ms: 5 - insert_new_count: 192 + task_count: 1402 + task_total_time_ms: 102 + transform_count: 337 + transform_time_ms: 33 + transform_yield_count: 107 + insert_time_ms: 2 + insert_new_count: 194 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) select id from c1 ref: recursive-cte.yamsql:140 explain: 'RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 2185 - task_total_time_ms: 196 - transform_count: 439 - transform_time_ms: 36 - transform_yield_count: 135 - insert_time_ms: 5 - insert_new_count: 315 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)' + task_count: 2407 + task_total_time_ms: 53 + transform_count: 470 + transform_time_ms: 19 + transform_yield_count: 144 + insert_time_ms: 2 + insert_new_count: 350 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) @@ -126,45 +123,43 @@ recursive-cte-tests: | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q2 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q2.ID AS q3 RETURN (q2.ID AS ID, q2.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID) - task_count: 1313 - task_total_time_ms: 123 - transform_count: 319 - transform_time_ms: 32 - transform_yield_count: 101 + task_count: 1322 + task_total_time_ms: 117 + transform_count: 321 + transform_time_ms: 37 + transform_yield_count: 102 insert_time_ms: 2 - insert_new_count: 181 + insert_new_count: 183 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order pre_order select id from c1 ref: recursive-cte.yamsql:166 explain: 'RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 2146 - task_total_time_ms: 181 - transform_count: 433 - transform_time_ms: 32 - transform_yield_count: 132 - insert_time_ms: 5 - insert_new_count: 305 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)' + task_count: 2368 + task_total_time_ms: 66 + transform_count: 464 + transform_time_ms: 21 + transform_yield_count: 141 + insert_time_ms: 2 + insert_new_count: 339 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) traversal order post_order select id from c1 ref: recursive-cte.yamsql:179 explain: 'RUNION-DFS POSTORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 2146 - task_total_time_ms: 176 - transform_count: 433 - transform_time_ms: 31 - transform_yield_count: 132 - insert_time_ms: 4 - insert_new_count: 305 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)' + task_count: 2368 + task_total_time_ms: 154 + transform_count: 464 + transform_time_ms: 43 + transform_yield_count: 141 + insert_time_ms: 3 + insert_new_count: 339 insert_reused_count: 9 - query: EXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent @@ -173,18 +168,18 @@ recursive-cte-tests: a, t1 as b where a.id = b.parent) select id, parent from allDescendants ref: recursive-cte.yamsql:192 explain: 'RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS - promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], - PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT - AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX - <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP - (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)' - task_count: 3415 - task_total_time_ms: 181 - transform_count: 705 - transform_time_ms: 43 - transform_yield_count: 207 - insert_time_ms: 6 - insert_new_count: 499 + promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT)' + task_count: 3637 + task_total_time_ms: 135 + transform_count: 736 + transform_time_ms: 49 + transform_yield_count: 216 + insert_time_ms: 4 + insert_new_count: 534 insert_reused_count: 15 - query: EXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent @@ -194,66 +189,63 @@ recursive-cte-tests: select id, parent from allDescendants ref: recursive-cte.yamsql:242 explain: 'RUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS - promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], - PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT - AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX - <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP - (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)' - task_count: 3125 - task_total_time_ms: 267 - transform_count: 664 - transform_time_ms: 54 - transform_yield_count: 193 - insert_time_ms: 7 - insert_new_count: 447 + promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT)' + task_count: 3347 + task_total_time_ms: 245 + transform_count: 695 + transform_time_ms: 75 + transform_yield_count: 202 + insert_time_ms: 8 + insert_new_count: 481 insert_reused_count: 15 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) select id from c1 ref: recursive-cte.yamsql:266 explain: 'RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 1839 - task_total_time_ms: 166 - transform_count: 397 - transform_time_ms: 36 - transform_yield_count: 124 - insert_time_ms: 4 - insert_new_count: 260 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)' + task_count: 2061 + task_total_time_ms: 159 + transform_count: 428 + transform_time_ms: 49 + transform_yield_count: 133 + insert_time_ms: 3 + insert_new_count: 295 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) select id from c1 ref: recursive-cte.yamsql:283 explain: 'RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 1839 - task_total_time_ms: 166 - transform_count: 397 - transform_time_ms: 36 - transform_yield_count: 124 - insert_time_ms: 4 - insert_new_count: 260 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)' + task_count: 2061 + task_total_time_ms: 159 + transform_count: 428 + transform_time_ms: 49 + transform_yield_count: 133 + insert_time_ms: 3 + insert_new_count: 295 insert_reused_count: 9 - query: EXPLAIN with recursive c1 as ( select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) traversal order post_order select id from c1 ref: recursive-cte.yamsql:308 explain: 'RUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) - } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | - FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP - (_.ID AS ID)' - task_count: 1800 - task_total_time_ms: 167 - transform_count: 391 - transform_time_ms: 38 - transform_yield_count: 121 - insert_time_ms: 4 - insert_new_count: 252 + } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER + q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)' + task_count: 2022 + task_total_time_ms: 157 + transform_count: 422 + transform_time_ms: 52 + transform_yield_count: 130 + insert_time_ms: 3 + insert_new_count: 286 insert_reused_count: 9 - query: EXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent @@ -262,18 +254,18 @@ recursive-cte-tests: a, t1 as b where a.id = b.parent) select id, parent from allDescendants ref: recursive-cte.yamsql:329 explain: 'RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS - promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], - PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT - AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX - <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP - (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)' - task_count: 3415 - task_total_time_ms: 181 - transform_count: 705 - transform_time_ms: 43 - transform_yield_count: 207 - insert_time_ms: 6 - insert_new_count: 499 + promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT)' + task_count: 3637 + task_total_time_ms: 135 + transform_count: 736 + transform_time_ms: 49 + transform_yield_count: 216 + insert_time_ms: 4 + insert_new_count: 534 insert_reused_count: 15 - query: EXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent @@ -282,18 +274,18 @@ recursive-cte-tests: a, t1 as b where a.id = b.parent) select id, parent from allDescendants ref: recursive-cte.yamsql:357 explain: 'RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS - promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], - PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT - AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX - <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP - (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)' - task_count: 3415 - task_total_time_ms: 181 - transform_count: 705 - transform_time_ms: 43 - transform_yield_count: 207 - insert_time_ms: 6 - insert_new_count: 499 + promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT)' + task_count: 3637 + task_total_time_ms: 135 + transform_count: 736 + transform_time_ms: 49 + transform_yield_count: 216 + insert_time_ms: 4 + insert_new_count: 534 insert_reused_count: 15 - query: EXPLAIN with recursive allDescendants as ( with recursive ancestorsOf250 as ( select id, parent from t1 where id = 250 union all select b.id, b.parent @@ -303,18 +295,18 @@ recursive-cte-tests: select id, parent from allDescendants ref: recursive-cte.yamsql:394 explain: 'RUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS - promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], - PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT - AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX - <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP - (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)' - task_count: 3125 - task_total_time_ms: 267 - transform_count: 664 - transform_time_ms: 54 - transform_yield_count: 193 - insert_time_ms: 7 - insert_new_count: 447 + promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], + PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS + ID, _.PARENT AS PARENT)' + task_count: 3347 + task_total_time_ms: 245 + transform_count: 695 + transform_time_ms: 75 + transform_yield_count: 202 + insert_time_ms: 8 + insert_new_count: 481 insert_reused_count: 15 recursive-cte-tests-with-hints: - query: EXPLAIN with recursive c1 as ( select id, parent, 0 as level from t1 use @@ -385,8 +377,7 @@ recursive-cte-tests-with-hints: ref: recursive-cte.yamsql:473 explain: 'RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c12 AS LONG)]) } { RECURSIVE COVERING(CHILDIDXNONULLS <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) - | FILTER _.PARENT EQUALS q0.ID AND _.PARENT NOT_NULL | MAP (_.ID AS ID, _.PARENT - AS PARENT) }' + | FILTER _.PARENT EQUALS q0.ID AND _.PARENT NOT_NULL | MAP _ }' task_count: 972 task_total_time_ms: 66 transform_count: 250 diff --git a/yaml-tests/src/test/resources/recursive-cte.yamsql b/yaml-tests/src/test/resources/recursive-cte.yamsql index 9d52f17a91d..90b8e0fc3ef 100644 --- a/yaml-tests/src/test/resources/recursive-cte.yamsql +++ b/yaml-tests/src/test/resources/recursive-cte.yamsql @@ -74,7 +74,7 @@ test_block: select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) select id from c1 - - explain: "RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)" - initialVersionAtLeast: 4.7.1.0 - result: [{ID: 1}, {ID: 10}, @@ -104,7 +104,7 @@ test_block: traversal order post_order select id from c1 - supported_version: 4.7.3.0 - - explain: "RUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)" - result: [{ID: 40}, {ID: 250}, {ID: 50}, @@ -137,7 +137,7 @@ test_block: select id, parent from t1 where id = 250 union all select b.id, b.parent from c1 as a, t1 as b where a.parent = b.id) select id from c1 - - explain: "RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)" - result: [{ID: 250}, {ID: 50}, {ID: 10}, @@ -163,7 +163,7 @@ test_block: traversal order pre_order select id from c1 - supported_version: 4.7.3.0 - - explain: "RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)" - result: [{ID: 250}, {ID: 50}, {ID: 10}, @@ -176,7 +176,7 @@ test_block: traversal order post_order select id from c1 - supported_version: 4.7.3.0 - - explain: "RUNION-DFS POSTORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS POSTORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID)" - result: [{ID: 1}, {ID: 10}, {ID: 50}, @@ -189,7 +189,7 @@ test_block: select b.id, b.parent from ancestorsOf250 as a, t1 as b where a.parent = b.id) select id, parent from ancestorsOf250 union all select b.id, b.parent from allDescendants as a, t1 as b where a.id = b.parent) select id, parent from allDescendants - - explain: "RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT)" - initialVersionAtLeast: 4.7.1.0 - result: [{250, 50}, {50, 10}, @@ -239,7 +239,7 @@ test_block: traversal order post_order select id, parent from allDescendants - supported_version: 4.7.3.0 - - explain: "RUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT)" - result: [{40, 10}, {250, 50}, {50, 10}, @@ -263,7 +263,7 @@ test_block: union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) select id from c1 - supported_version: 4.7.1.0 - - explain: "RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)" - maxRows: 1 - result: [{ID: 1}] - result: [{ID: 10}] @@ -280,7 +280,7 @@ test_block: select id, parent from t1 where parent = -1 union all select b.id, b.parent from c1 as a, t1 as b where a.id = b.parent) select id from c1 - - explain: "RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS PREORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)" - maxRows: 1 # new hierarchical plans contain a newly introduced physical operator, so new plan continuations can not be resumed on older versions # which is ok because we do not care about backward-compatibility for that particular scenario. @@ -305,7 +305,7 @@ test_block: traversal order post_order select id from c1 - supported_version: 4.7.3.0 - - explain: "RUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID)" + - explain: "RUNION-DFS POSTORDER q0 { ISCAN(PARENTIDX [EQUALS promote(@c14 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID)" - maxRows: 1 - result: [{ID: 40}] - result: [{ID: 250}] @@ -326,7 +326,7 @@ test_block: union all select b.id, b.parent from allDescendants as a, t1 as b where a.id = b.parent) select id, parent from allDescendants - supported_version: 4.7.1.0 - - explain: "RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT)" - maxRows: 1 - result: [{250, 50}] - result: [{50, 10}] @@ -354,7 +354,7 @@ test_block: select b.id, b.parent from ancestorsOf250 as a, t1 as b where a.parent = b.id) select id, parent from ancestorsOf250 union all select b.id, b.parent from allDescendants as a, t1 as b where a.id = b.parent) select id, parent from allDescendants - - explain: "RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION-DFS PREORDER q0 { RUNION-DFS PREORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT)" - maxRows: 1 # new hierarchical plans contain a newly introduced physical operator, so new plan continuations can not be resumed on older versions # which is ok because we do not care about backward-compatibility for that particular scenario. @@ -391,7 +391,7 @@ test_block: traversal order post_order select id, parent from allDescendants - supported_version: 4.7.3.0 - - explain: "RUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q1.PARENT EQUALS _.ID | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(PARENTIDX <,> -> [ID: KEY:[1], PARENT: KEY:[0]]) | FILTER q0.ID EQUALS _.PARENT | MAP (_.ID AS ID, _.PARENT AS PARENT) } | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION-DFS POSTORDER q0 { RUNION-DFS POSTORDER q1 { ISCAN(CHILDIDX [EQUALS promote(@c19 AS LONG)]) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q1.PARENT EQUALS _.ID | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT) } { RECURSIVE COVERING(CHILDIDX <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER q0.ID EQUALS _.PARENT | MAP _ } | MAP (_.ID AS ID, _.PARENT AS PARENT)" - maxRows: 1 - result: [{40, 10}] - result: [{250, 50}] @@ -470,7 +470,7 @@ test_block: traversal order pre_order select * from allDescendants - supported_version: 4.10.4.0 - - explain: "RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c12 AS LONG)]) } { RECURSIVE COVERING(CHILDIDXNONULLS <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER _.PARENT EQUALS q0.ID AND _.PARENT NOT_NULL | MAP (_.ID AS ID, _.PARENT AS PARENT) }" + - explain: "RUNION-DFS PREORDER q0 { ISCAN(CHILDIDX [EQUALS promote(@c12 AS LONG)]) } { RECURSIVE COVERING(CHILDIDXNONULLS <,> -> [ID: KEY:[0], PARENT: KEY:[1]]) | FILTER _.PARENT EQUALS q0.ID AND _.PARENT NOT_NULL | MAP _ }" - result: [{50, 10}, {250, 50}] ... diff --git a/yaml-tests/src/test/resources/row-version-pushdown.metrics.binpb b/yaml-tests/src/test/resources/row-version-pushdown.metrics.binpb new file mode 100644 index 00000000000..d4ba4d178e2 --- /dev/null +++ b/yaml-tests/src/test/resources/row-version-pushdown.metrics.binpb @@ -0,0 +1,61 @@ +™ +z +row-version-pushdownbEXPLAIN select "__ROW_VERSION" as version from t1 where col1 = 10 and "__ROW_VERSION" is not null;š +ÒþϾX’ €ë�<(.0ÇÒÈ8?@iISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c9 AS LONG), [NOT_NULL]]) | MAP (_.__ROW_VERSION AS VERSION)� digraph G { + fontname=courier; + rankdir=BT; + splines=line; + 1 [ label=<
Value Computation
MAP (q2.__ROW_VERSION AS VERSION)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(VERSION AS VERSION)" ]; + 2 [ label=<
Index Scan
comparisons: [EQUALS promote(@c9 AS LONG), [NOT_NULL]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 [ label=<
Index
GROUPED_VERSION_INDEX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}Ñ +€ +row-version-pushdownhEXPLAIN select "__ROW_VERSION" as version, col2 from t1 where col1 = 10 and "__ROW_VERSION" is not null;Ë +Òß©±’ ðûž (.0îšÀ8?@zISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c11 AS LONG), [NOT_NULL]]) | MAP (_.__ROW_VERSION AS VERSION, _.COL2 AS COL2)¯ digraph G { + fontname=courier; + rankdir=BT; + splines=line; + 1 [ label=<
Value Computation
MAP (q2.__ROW_VERSION AS VERSION, q2.COL2 AS COL2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(VERSION AS VERSION, LONG AS COL2)" ]; + 2 [ label=<
Index Scan
comparisons: [EQUALS promote(@c11 AS LONG), [NOT_NULL]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 [ label=<
Index
GROUPED_VERSION_INDEX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}• +d +row-version-pushdownLEXPLAIN select col1 from t1 where col1 = 10 and "__ROW_VERSION" is not null;¬ +î˜èí• ý¢Ð (00×ñÐ8B@€COVERING(GROUPED_VERSION_INDEX [EQUALS promote(@c7 AS LONG), [NOT_NULL]] -> [COL1: KEY:[0], ID: KEY:[3]]) | MAP (_.COL1 AS COL1)‰ digraph G { + fontname=courier; + rankdir=BT; + splines=line; + 1 [ label=<
Value Computation
MAP (q93.COL1 AS COL1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1)" ]; + 2 [ label=<
Covering Index Scan
comparisons: [EQUALS promote(@c7 AS LONG), [NOT_NULL]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 [ label=<
Index
GROUPED_VERSION_INDEX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q93> label="q93" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}š +d +row-version-pushdownLEXPLAIN select "__ROW_VERSION" as version, col1, id from t1 where col1 = 10;± +¨§ÆéŽ ºó“(-0–óg8:@gISCAN(I1 [EQUALS promote(@c13 AS LONG)]) | MAP (_.__ROW_VERSION AS VERSION, _.COL1 AS COL1, _.ID AS ID)© digraph G { + fontname=courier; + rankdir=BT; + splines=line; + 1 [ label=<
Value Computation
MAP (q2.__ROW_VERSION AS VERSION, q2.COL1 AS COL1, q2.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(VERSION AS VERSION, LONG AS COL1, LONG AS ID)" ]; + 2 [ label=<
Index Scan
comparisons: [EQUALS promote(@c13 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}ß +H +row-version-pushdown0EXPLAIN select col1, id from t1 where col1 = 10;’ +žŸÓ„œ �âé(50íîv8H@mCOVERING(I1 [EQUALS promote(@c9 AS LONG)] -> [COL1: KEY:[0], ID: KEY:[2]]) | MAP (_.COL1 AS COL1, _.ID AS ID)„ digraph G { + fontname=courier; + rankdir=BT; + splines=line; + 1 [ label=<
Value Computation
MAP (q88.COL1 AS COL1, q88.ID AS ID)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, LONG AS ID)" ]; + 2 [ label=<
Covering Index Scan
comparisons: [EQUALS promote(@c9 AS LONG)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 [ label=<
Index
I1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, LONG AS COL1, LONG AS COL2, VERSION AS __ROW_VERSION)" ]; + 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q88> label="q88" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} \ No newline at end of file diff --git a/yaml-tests/src/test/resources/row-version-pushdown.metrics.yaml b/yaml-tests/src/test/resources/row-version-pushdown.metrics.yaml new file mode 100644 index 00000000000..9be87fa963b --- /dev/null +++ b/yaml-tests/src/test/resources/row-version-pushdown.metrics.yaml @@ -0,0 +1,65 @@ +row-version-pushdown: +- query: EXPLAIN select "__ROW_VERSION" as version from t1 where col1 = 10 and "__ROW_VERSION" + is not null; + ref: row-version-pushdown.yamsql:46 + explain: ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c9 AS LONG), [NOT_NULL]]) + | MAP (_.__ROW_VERSION AS VERSION) + task_count: 594 + task_total_time_ms: 185 + transform_count: 146 + transform_time_ms: 126 + transform_yield_count: 46 + insert_time_ms: 7 + insert_new_count: 63 + insert_reused_count: 4 +- query: EXPLAIN select "__ROW_VERSION" as version, col2 from t1 where col1 = 10 + and "__ROW_VERSION" is not null; + ref: row-version-pushdown.yamsql:51 + explain: ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c11 AS LONG), [NOT_NULL]]) + | MAP (_.__ROW_VERSION AS VERSION, _.COL2 AS COL2) + task_count: 594 + task_total_time_ms: 53 + transform_count: 146 + transform_time_ms: 25 + transform_yield_count: 46 + insert_time_ms: 3 + insert_new_count: 63 + insert_reused_count: 4 +- query: EXPLAIN select col1 from t1 where col1 = 10 and "__ROW_VERSION" is not + null; + ref: row-version-pushdown.yamsql:57 + explain: 'COVERING(GROUPED_VERSION_INDEX [EQUALS promote(@c7 AS LONG), [NOT_NULL]] + -> [COL1: KEY:[0], ID: KEY:[3]]) | MAP (_.COL1 AS COL1)' + task_count: 622 + task_total_time_ms: 52 + transform_count: 149 + transform_time_ms: 24 + transform_yield_count: 48 + insert_time_ms: 3 + insert_new_count: 66 + insert_reused_count: 4 +- query: EXPLAIN select "__ROW_VERSION" as version, col1, id from t1 where col1 + = 10; + ref: row-version-pushdown.yamsql:63 + explain: ISCAN(I1 [EQUALS promote(@c13 AS LONG)]) | MAP (_.__ROW_VERSION AS VERSION, + _.COL1 AS COL1, _.ID AS ID) + task_count: 552 + task_total_time_ms: 35 + transform_count: 142 + transform_time_ms: 17 + transform_yield_count: 45 + insert_time_ms: 1 + insert_new_count: 58 + insert_reused_count: 4 +- query: EXPLAIN select col1, id from t1 where col1 = 10; + ref: row-version-pushdown.yamsql:68 + explain: 'COVERING(I1 [EQUALS promote(@c9 AS LONG)] -> [COL1: KEY:[0], ID: KEY:[2]]) + | MAP (_.COL1 AS COL1, _.ID AS ID)' + task_count: 670 + task_total_time_ms: 33 + transform_count: 156 + transform_time_ms: 14 + transform_yield_count: 53 + insert_time_ms: 1 + insert_new_count: 72 + insert_reused_count: 6 diff --git a/yaml-tests/src/test/resources/row-version-pushdown.yamsql b/yaml-tests/src/test/resources/row-version-pushdown.yamsql new file mode 100644 index 00000000000..a2a428413df --- /dev/null +++ b/yaml-tests/src/test/resources/row-version-pushdown.yamsql @@ -0,0 +1,70 @@ +# +# row-version-pushdown.yamsql +# +# This source file is part of the FoundationDB open source project +# +# Copyright 2021-2026 Apple Inc. and the FoundationDB project authors +# +# Licensed 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. +# +# GROUPED_VERSION_INDEX carries the row version in its entry, but the partial record a +# covering scan builds cannot hold one. These queries are the ones that must therefore +# keep a fetch, even though the value they project is available in the entry. +# +--- +schema_template: | + create table t1(id bigint, col1 bigint, col2 bigint, primary key(id)) + create index i1 as select col1 from t1 + create index grouped_version_index as select col1, "__ROW_VERSION" from t1 order by col1, "__ROW_VERSION" + + with options (store_row_versions=true) +--- +setup: + steps: + - query: INSERT INTO T1 VALUES + (1, 10, 1), + (2, 10, 2), + (3, 20, 3) +--- +test_block: + name: row-version-pushdown + preset: single_repetition_ordered + tests: + - + # projects the version itself off the version index — must not go covering + - query: select "__ROW_VERSION" as version from t1 where col1 = 10 and "__ROW_VERSION" is not null; + - explain: "ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c9 AS LONG), [NOT_NULL]]) | MAP (_.__ROW_VERSION AS VERSION)" + - unorderedResult: [{VERSION: !not_null _}, {VERSION: !not_null _}] + - + # projects the version alongside a field the entry does not carry + - query: select "__ROW_VERSION" as version, col2 from t1 where col1 = 10 and "__ROW_VERSION" is not null; + - explain: "ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c11 AS LONG), [NOT_NULL]]) | MAP (_.__ROW_VERSION AS VERSION, _.COL2 AS COL2)" + - unorderedResult: [{VERSION: !not_null _, COL2: 1}, {VERSION: !not_null _, COL2: 2}] + - + # version only in the predicate, projection is a field the entry does carry — + # this one is legitimately coverable + - query: select col1 from t1 where col1 = 10 and "__ROW_VERSION" is not null; + - explain: "COVERING(GROUPED_VERSION_INDEX [EQUALS promote(@c7 AS LONG), [NOT_NULL]] -> [COL1: KEY:[0], ID: KEY:[3]]) | MAP (_.COL1 AS COL1)" + - unorderedResult: [{COL1: 10}, {COL1: 10}] + - + # projection fits entirely inside GROUPED_VERSION_INDEX (col1, version, pk): + # the only thing standing between this and a covering scan is reading the version + - query: select "__ROW_VERSION" as version, col1, id from t1 where col1 = 10; + - explain: "ISCAN(I1 [EQUALS promote(@c13 AS LONG)]) | MAP (_.__ROW_VERSION AS VERSION, _.COL1 AS COL1, _.ID AS ID)" + - unorderedResult: [{VERSION: !not_null _, COL1: 10, ID: 1}, {VERSION: !not_null _, COL1: 10, ID: 2}] + - + # same projection, version dropped — the comparison case + - query: select col1, id from t1 where col1 = 10; + - explain: "COVERING(I1 [EQUALS promote(@c9 AS LONG)] -> [COL1: KEY:[0], ID: KEY:[2]]) | MAP (_.COL1 AS COL1, _.ID AS ID)" + - unorderedResult: [{COL1: 10, ID: 1}, {COL1: 10, ID: 2}] +... diff --git a/yaml-tests/src/test/resources/select-a-star.metrics.binpb b/yaml-tests/src/test/resources/select-a-star.metrics.binpb index 51600c72d55..1ad5accd5cb 100644 --- a/yaml-tests/src/test/resources/select-a-star.metrics.binpb +++ b/yaml-tests/src/test/resources/select-a-star.metrics.binpb @@ -1,7 +1,7 @@ -æ+ + , e -select-star-testsPEXPLAIN select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3);ü* -ò„Õæ� ýïó(*0«ß!8/@€SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) }Ú(digraph G { +select-star-testsPEXPLAIN select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3);¶+ +„ð�Ø“ �Ѻ(+0Û´82@®SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) }æ(digraph G { fontname=courier; rankdir=BT; splines=line; @@ -11,17 +11,17 @@ e 4 [ label=<
Predicate Filter
WHERE q14 NOT_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3, LONG AS B1)" ]; 5 [ label=<
Value Computation
FIRST $q14 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3, LONG AS B1)" ]; 6 [ label=<
Value Computation
MAP (q10._0._0 AS A1, q10._0._1 AS A2, q10._0._2 AS A3, q2.B1 AS B1)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3, LONG AS B1)" ]; - 7 [ label=<
Streaming Aggregate
COLLECT ()
GROUP BY (q61._0.A1 AS _0, q61._0.A2 AS _1, q61._0.A3 AS _2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2 AS _0, AS _1)" ]; - 8 [ label=<
Value Computation
MAP (q6 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3 AS _0)" ]; - 9 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3)" ]; + 7 [ label=<
Streaming Aggregate
COLLECT ()
GROUP BY (q62._0.A1 AS _0, q62._0.A2 AS _1, q62._0.A3 AS _2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2 AS _0, AS _1)" ]; + 8 [ label=<
Value Computation
MAP (q55 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3 AS _0)" ]; + 9 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3)" ]; 10 [ label=<
Index
A_IDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q2> label="q2" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 6 [ label=< q10> label="q10" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 8 -> 7 [ label=< q61> label="q61" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 9 -> 8 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 8 -> 7 [ label=< q62> label="q62" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 8 [ label=< q55> label="q55" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 10 -> 9 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 1 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { @@ -35,10 +35,11 @@ e rankDir=LR; 2 -> 4 [ color="red" style="invis" ]; } -}®- +}è- g -select-star-testsREXPLAIN select B.* from B where exists (select A.*, B.* from A group by A1,A2,A3);Â, -ò¤¡ � õ½‹(*0ÈÒ"8/@�SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1, q0.B2 AS B2, q0.B3 AS B3) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN q0 }‘*digraph G { +select-star-testsREXPLAIN select B.* from B where exists (select A.*, B.* from A group by A1,A2,A3);ü, +„”ïË +“ âÌ‹(+0�‚82@½SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1, q0.B2 AS B2, q0.B3 AS B3) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN q0 }�*digraph G { fontname=courier; rankdir=BT; splines=line; @@ -48,17 +49,17 @@ g 4 [ label=<
Predicate Filter
WHERE q14 NOT_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3, LONG AS B1, LONG AS B2, LONG AS S1, LONG AS S2 AS B3)" ]; 5 [ label=<
Value Computation
FIRST $q14 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3, LONG AS B1, LONG AS B2, LONG AS S1, LONG AS S2 AS B3)" ]; 6 [ label=<
Value Computation
MAP (q10._0._0 AS A1, q10._0._1 AS A2, q10._0._2 AS A3, q2.B1 AS B1, q2.B2 AS B2, q2.B3 AS B3)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3, LONG AS B1, LONG AS B2, LONG AS S1, LONG AS S2 AS B3)" ]; - 7 [ label=<
Streaming Aggregate
COLLECT ()
GROUP BY (q61._0.A1 AS _0, q61._0.A2 AS _1, q61._0.A3 AS _2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2 AS _0, AS _1)" ]; - 8 [ label=<
Value Computation
MAP (q6 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3 AS _0)" ]; - 9 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3)" ]; + 7 [ label=<
Streaming Aggregate
COLLECT ()
GROUP BY (q62._0.A1 AS _0, q62._0.A2 AS _1, q62._0.A3 AS _2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, LONG AS _1, LONG AS _2 AS _0, AS _1)" ]; + 8 [ label=<
Value Computation
MAP (q55 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3 AS _0)" ]; + 9 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3)" ]; 10 [ label=<
Index
A_IDX
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS A1, LONG AS A2, LONG AS A3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q2> label="q2" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 7 -> 6 [ label=< q10> label="q10" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 8 -> 7 [ label=< q61> label="q61" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 9 -> 8 [ label=< q6> label="q6" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 8 -> 7 [ label=< q62> label="q62" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 8 [ label=< q55> label="q55" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 10 -> 9 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 1 [ label=< q14> label="q14" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { diff --git a/yaml-tests/src/test/resources/select-a-star.metrics.yaml b/yaml-tests/src/test/resources/select-a-star.metrics.yaml index e6e652de721..f4b11338bfe 100644 --- a/yaml-tests/src/test/resources/select-a-star.metrics.yaml +++ b/yaml-tests/src/test/resources/select-a-star.metrics.yaml @@ -1,44 +1,47 @@ select-star-tests: - query: EXPLAIN select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); ref: select-a-star.yamsql:47 - explain: SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS - A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL - AS q0 RETURN (q0.B1 AS B1) } - task_count: 498 - task_total_time_ms: 41 - transform_count: 144 - transform_time_ms: 12 - transform_yield_count: 42 + explain: 'SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: + KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 + AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, + q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) + }' + task_count: 516 + task_total_time_ms: 30 + transform_count: 147 + transform_time_ms: 9 + transform_yield_count: 43 insert_time_ms: 0 - insert_new_count: 47 + insert_new_count: 50 insert_reused_count: 2 - query: EXPLAIN select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); ref: select-a-star.yamsql:86 - explain: SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS - A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL - AS q0 RETURN (q0.B1 AS B1) } - task_count: 498 - task_total_time_ms: 41 - transform_count: 144 - transform_time_ms: 12 - transform_yield_count: 42 + explain: 'SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: + KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 + AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, + q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) + }' + task_count: 516 + task_total_time_ms: 30 + transform_count: 147 + transform_time_ms: 9 + transform_yield_count: 43 insert_time_ms: 0 - insert_new_count: 47 + insert_new_count: 50 insert_reused_count: 2 - query: EXPLAIN select B.* from B where exists (select A.*, B.* from A group by A1,A2,A3); ref: select-a-star.yamsql:90 - explain: SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS - A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1, q0.B2 AS B2, q0.B3 AS B3) | - DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN q0 } - task_count: 498 - task_total_time_ms: 36 - transform_count: 144 - transform_time_ms: 10 - transform_yield_count: 42 + explain: 'SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: + KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 + AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, + q0.B1 AS B1, q0.B2 AS B2, q0.B3 AS B3) | DEFAULT NULL | FILTER _ NOT_NULL + AS q0 RETURN q0 }' + task_count: 516 + task_total_time_ms: 22 + transform_count: 147 + transform_time_ms: 6 + transform_yield_count: 43 insert_time_ms: 0 - insert_new_count: 47 + insert_new_count: 50 insert_reused_count: 2 diff --git a/yaml-tests/src/test/resources/select-a-star.yamsql b/yaml-tests/src/test/resources/select-a-star.yamsql index 36bd641bb16..546de4b9d97 100644 --- a/yaml-tests/src/test/resources/select-a-star.yamsql +++ b/yaml-tests/src/test/resources/select-a-star.yamsql @@ -44,7 +44,7 @@ test_block: tests: - - query: select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); - - explain: "SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) }" + - explain: "SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) }" - result: [{1}, {2}, {3}] - - query: select A.* from A; @@ -83,11 +83,11 @@ test_block: - error: GROUPING_ERROR - - query: select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); - - explain: "SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) }" + - explain: "SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.B1 AS B1) }" - result: [{1}, {2}, {3}] - - query: select B.* from B where exists (select A.*, B.* from A group by A1,A2,A3); - - explain: "SCAN([IS B]) | FLATMAP q0 -> { ISCAN(A_IDX <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1, q0.B2 AS B2, q0.B3 AS B3) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN q0 }" + - explain: "SCAN([IS B]) | FLATMAP q0 -> { COVERING(A_IDX <,> -> [A1: KEY:[0], A2: KEY:[1], A3: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.A1 AS _0, _._0.A2 AS _1, _._0.A3 AS _2) | MAP (_._0._0 AS A1, _._0._1 AS A2, _._0._2 AS A3, q0.B1 AS B1, q0.B2 AS B2, q0.B3 AS B3) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN q0 }" - result: [{1, 20, {4, 40}}, {2, 20, {5, 50}}, {3, 20, {6, 60}}] diff --git a/yaml-tests/src/test/resources/sql-functions.metrics.binpb b/yaml-tests/src/test/resources/sql-functions.metrics.binpb index 1a9bef0b947..a1722ba1900 100644 --- a/yaml-tests/src/test/resources/sql-functions.metrics.binpb +++ b/yaml-tests/src/test/resources/sql-functions.metrics.binpb @@ -37,19 +37,19 @@ digraph G { 3 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q178> label="q178" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}Ë +}Ž M -basic-sql-function-tests1EXPLAIN select col1 + 10, col2 from f1(103, 'b');ù -ØÔõ×,ð Îɶ (V0Úç›8z@iISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]]) | MAP (_.COL1 + @c3 AS _0, _.COL2 AS COL2)î +basic-sql-function-tests1EXPLAIN select col1 + 10, col2 from f1(103, 'b');¼ +ðï™Ø4€ ™àš(`0 Û©8Ž@ �COVERING(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]] -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | MAP (_.COL1 + @c3 AS _0, _.COL2 AS COL2)û digraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Value Computation
MAP (q12.COL1 + @c3 AS _0, q12.COL2 AS COL2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, STRING AS COL2)" ]; - 2 [ label=<
Index Scan
comparisons: [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 1 [ label=<
Value Computation
MAP (q178.COL1 + @c3 AS _0, q178.COL2 AS COL2)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS _0, STRING AS COL2)" ]; + 2 [ label=<
Covering Index Scan
comparisons: [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 3 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q12> label="q12" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q178> label="q178" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }ø ? basic-sql-function-tests#EXPLAIN select * from f1(103, 'b');´ @@ -200,10 +200,10 @@ digraph G { 3 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q183> label="q183" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}ó! +}ö% Z -basic-sql-function-tests>EXPLAIN select * from t2 where exists (select * from f2(t2.z))”! -�ÅÙØ.Œ Ò¿–(r0 îˆ8�@™ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }×digraph G { +basic-sql-function-tests>EXPLAIN select * from t2 where exists (select * from f2(t2.z))—% +ØáÁÍ0˜ –ìž(u0豋8¥@ÕISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | FETCH | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }ž#digraph G { fontname=courier; rankdir=BT; splines=line; @@ -212,18 +212,20 @@ Z 3 [ label=<
Index
T2_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS X, LONG AS Y, LONG AS Z)" ]; 4 [ label=<
Predicate Filter
WHERE q27 NOT_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 5 [ label=<
Value Computation
FIRST $q27 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 6 [ label=<
Predicate Filter
WHERE promote(q16.COL3 AS LONG) EQUALS q2.Z
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 7 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 8 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 6 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 7 [ label=<
Predicate Filter
WHERE promote(q143.COL3 AS LONG) EQUALS q2.Z
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 8 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 9 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q2> label="q2" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q27> label="q27" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ label=< q27> label="q27" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 7 -> 6 [ label=< q16> label="q16" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 6 [ label=< q145> label="q145" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 8 -> 7 [ label=< q143> label="q143" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 8 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 1 [ label=< q27> label="q27" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { - 6 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; + 7 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { 4 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; @@ -233,10 +235,10 @@ Z rankDir=LR; 2 -> 4 [ color="red" style="invis" ]; } -}ø! +}û% _ -basic-sql-function-testsCEXPLAIN select * from t2 where exists (select * from f2(k => t2.z))”! -��÷Í8Œ Å�•(r0¿³�8�@™ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }×digraph G { +basic-sql-function-testsCEXPLAIN select * from t2 where exists (select * from f2(k => t2.z))—% +Ø�òÉ.˜ ¥âÔ(u0±’‰8¥@ÕISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | FETCH | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }ž#digraph G { fontname=courier; rankdir=BT; splines=line; @@ -245,18 +247,20 @@ _ 3 [ label=<
Index
T2_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS X, LONG AS Y, LONG AS Z)" ]; 4 [ label=<
Predicate Filter
WHERE q27 NOT_NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 5 [ label=<
Value Computation
FIRST $q27 OR NULL
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 6 [ label=<
Predicate Filter
WHERE promote(q16.COL3 AS LONG) EQUALS q2.Z
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 7 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 8 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 6 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 7 [ label=<
Predicate Filter
WHERE promote(q143.COL3 AS LONG) EQUALS q2.Z
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 8 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 9 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q2> label="q2" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 5 -> 4 [ label=< q27> label="q27" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 6 -> 5 [ label=< q27> label="q27" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 7 -> 6 [ label=< q16> label="q16" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 8 -> 7 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 7 -> 6 [ label=< q145> label="q145" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 8 -> 7 [ label=< q143> label="q143" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 9 -> 8 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 4 -> 1 [ label=< q27> label="q27" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { - 6 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; + 7 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; } { 4 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; @@ -266,83 +270,80 @@ _ rankDir=LR; 2 -> 4 [ color="red" style="invis" ]; } -}à +}ð A -basic-sql-function-tests%EXPLAIN select * from f3(103, 'b', 4)š -õºæ»›– ÍÙý6(Ú0›Ÿ–8Æ@âISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }’digraph G { +basic-sql-function-tests%EXPLAIN select * from f3(103, 'b', 4)ª +ú¨•Ÿ‘º ‚àø:(ã0˜³€8í@žCOVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }ædigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Nested Loop Join
FLATMAP (q50.COL1 AS COL1, q50.COL2 AS COL2, q61.COL3 AS COL3)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 2 [ label=<
Predicate Filter
WHERE promote(q61.COL3 AS LONG) EQUALS promote(@c9 AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 3 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 4 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 5 [ label=<
Index Scan
comparisons: [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 6 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 3 -> 2 [ label=< q61> label="q61" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 3 [ label=<
Predicate Filter
WHERE promote(q330.COL3 AS LONG) EQUALS promote(@c9 AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 5 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 6 [ label=<
Index Scan
comparisons: [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 7 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 3 -> 2 [ label=< q332> label="q332" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q330> label="q330" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q61> label="q61" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 1 [ label=< q50> label="q50" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - { - 2 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; - } + 7 -> 6 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 1 [ label=< q50> label="q50" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 2 -> 5 [ color="red" style="invis" ]; + 2 -> 6 [ color="red" style="invis" ]; } -}‘ +}¡ D -basic-sql-function-tests(EXPLAIN select * from f4(103, 'b', 2, 2)È -Î øÆúå› ùí¾t(ƒ0óûš8ç@gùISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) + promote(@c9 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }©digraph G { +basic-sql-function-tests(EXPLAIN select * from f4(103, 'b', 2, 2)Ø +Ó"Λ�›¿ °èÙ2(Œ0äÐÏ 8Ž @jµCOVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) + promote(@c9 AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }ýdigraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Nested Loop Join
FLATMAP (q87.COL1 AS COL1, q87.COL2 AS COL2, q98.COL3 AS COL3)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 2 [ label=<
Predicate Filter
WHERE promote(q98.COL3 AS LONG) EQUALS promote(@c9 AS LONG) + promote(@c9 AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 3 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 4 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 5 [ label=<
Index Scan
comparisons: [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 6 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 3 -> 2 [ label=< q98> label="q98" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 3 [ label=<
Predicate Filter
WHERE promote(q621.COL3 AS LONG) EQUALS promote(@c9 AS LONG) + promote(@c9 AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 5 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 6 [ label=<
Index Scan
comparisons: [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 7 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 3 -> 2 [ label=< q623> label="q623" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q621> label="q621" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q98> label="q98" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 1 [ label=< q87> label="q87" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - { - 2 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; - } + 7 -> 6 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 1 [ label=< q87> label="q87" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 2 -> 5 [ color="red" style="invis" ]; + 2 -> 6 [ color="red" style="invis" ]; } -}« +}» X -basic-sql-function-tests 103, b => 'b', c => 2, d => 2)Î -Î ž‡Šì› ð»ãy(ƒ0—¯Ÿ8ç@güISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c15 AS LONG) + promote(@c15 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c7 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }¬digraph G { +basic-sql-function-tests 103, b => 'b', c => 2, d => 2)Þ +Ó"ˆ»öŠ¿ ÿþÕ\(Œ0ä¾ä 8Ž @j¸COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c15 AS LONG) + promote(@c15 AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c7 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }€digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Nested Loop Join
FLATMAP (q87.COL1 AS COL1, q87.COL2 AS COL2, q98.COL3 AS COL3)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 2 [ label=<
Predicate Filter
WHERE promote(q98.COL3 AS LONG) EQUALS promote(@c15 AS LONG) + promote(@c15 AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 3 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 4 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 5 [ label=<
Index Scan
comparisons: [EQUALS @c11, [LESS_THAN promote(@c7 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 6 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; - 3 -> 2 [ label=< q98> label="q98" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 [ label=<
Fetch Records
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="12" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 3 [ label=<
Predicate Filter
WHERE promote(q621.COL3 AS LONG) EQUALS promote(@c15 AS LONG) + promote(@c15 AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 4 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 5 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 6 [ label=<
Index Scan
comparisons: [EQUALS @c11, [LESS_THAN promote(@c7 AS LONG)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 7 [ label=<
Index
T1_IDX1
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS COL1, STRING AS COL2, INT AS COL3)" ]; + 3 -> 2 [ label=< q623> label="q623" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ label=< q621> label="q621" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 5 -> 4 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q98> label="q98" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 6 -> 5 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 5 -> 1 [ label=< q87> label="q87" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - { - 2 -> 1 [ color="blue" style="dotted" arrowhead="none" tailport="nw" headport="s" constraint="false" ]; - } + 7 -> 6 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 6 -> 1 [ label=< q87> label="q87" color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; { rank=same; rankDir=LR; - 2 -> 5 [ color="red" style="invis" ]; + 2 -> 6 [ color="red" style="invis" ]; } }ž 7 diff --git a/yaml-tests/src/test/resources/sql-functions.metrics.yaml b/yaml-tests/src/test/resources/sql-functions.metrics.yaml index 8e4abb1e7c4..0c3f0e6138e 100644 --- a/yaml-tests/src/test/resources/sql-functions.metrics.yaml +++ b/yaml-tests/src/test/resources/sql-functions.metrics.yaml @@ -39,16 +39,17 @@ basic-sql-function-tests: insert_reused_count: 9 - query: EXPLAIN select col1 + 10, col2 from f1(103, 'b'); ref: sql-functions.yamsql:75 - explain: ISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]]) | MAP - (_.COL1 + @c3 AS _0, _.COL2 AS COL2) - task_count: 984 - task_total_time_ms: 93 - transform_count: 240 - transform_time_ms: 28 - transform_yield_count: 86 + explain: 'COVERING(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]] -> + [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | MAP (_.COL1 + @c3 AS _0, + _.COL2 AS COL2)' + task_count: 1136 + task_total_time_ms: 110 + transform_count: 256 + transform_time_ms: 42 + transform_yield_count: 96 insert_time_ms: 2 - insert_new_count: 122 - insert_reused_count: 4 + insert_new_count: 142 + insert_reused_count: 9 - query: EXPLAIN select * from f1(103, 'b'); ref: sql-functions.yamsql:79 explain: 'COVERING(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]] -> [COL1: @@ -175,84 +176,88 @@ basic-sql-function-tests: insert_reused_count: 9 - query: EXPLAIN select * from t2 where exists (select * from f2(t2.z)) ref: sql-functions.yamsql:122 - explain: ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 - AS LONG) EQUALS q0.Z | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 } - task_count: 1025 - task_total_time_ms: 97 - transform_count: 268 - transform_time_ms: 38 - transform_yield_count: 114 + explain: 'ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 <,> -> [COL1: + KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS + q0.Z | FETCH | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }' + task_count: 1112 + task_total_time_ms: 101 + transform_count: 280 + transform_time_ms: 40 + transform_yield_count: 117 insert_time_ms: 2 - insert_new_count: 144 - insert_reused_count: 5 + insert_new_count: 165 + insert_reused_count: 8 - query: EXPLAIN select * from t2 where exists (select * from f2(k => t2.z)) ref: sql-functions.yamsql:126 - explain: ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 - AS LONG) EQUALS q0.Z | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 } - task_count: 1025 - task_total_time_ms: 118 - transform_count: 268 - transform_time_ms: 44 - transform_yield_count: 114 + explain: 'ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 <,> -> [COL1: + KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS + q0.Z | FETCH | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }' + task_count: 1112 + task_total_time_ms: 97 + transform_count: 280 + transform_time_ms: 39 + transform_yield_count: 117 insert_time_ms: 2 - insert_new_count: 144 - insert_reused_count: 5 + insert_new_count: 165 + insert_reused_count: 8 - query: EXPLAIN select * from f3(103, 'b', 4) ref: sql-functions.yamsql:130 - explain: ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 - AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 - AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) - } - task_count: 2293 - task_total_time_ms: 326 - transform_count: 534 - transform_time_ms: 115 - transform_yield_count: 218 - insert_time_ms: 10 - insert_new_count: 454 - insert_reused_count: 24 + explain: 'COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) + | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FETCH | FLATMAP + q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 + RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }' + task_count: 2554 + task_total_time_ms: 304 + transform_count: 570 + transform_time_ms: 123 + transform_yield_count: 227 + insert_time_ms: 8 + insert_new_count: 493 + insert_reused_count: 27 - query: EXPLAIN select * from f3(103, 'b', 4) ref: sql-functions.yamsql:134 - explain: ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 - AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 - AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) - } - task_count: 2293 - task_total_time_ms: 326 - transform_count: 534 - transform_time_ms: 115 - transform_yield_count: 218 - insert_time_ms: 10 - insert_new_count: 454 - insert_reused_count: 24 + explain: 'COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) + | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FETCH | FLATMAP + q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 + RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }' + task_count: 2554 + task_total_time_ms: 304 + transform_count: 570 + transform_time_ms: 123 + transform_yield_count: 227 + insert_time_ms: 8 + insert_new_count: 493 + insert_reused_count: 27 - query: EXPLAIN select * from f4(103, 'b', 2, 2) ref: sql-functions.yamsql:138 - explain: ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 - AS LONG) + promote(@c9 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, - [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 - AS COL2, q0.COL3 AS COL3) } - task_count: 4174 - task_total_time_ms: 750 - transform_count: 923 - transform_time_ms: 244 - transform_yield_count: 387 - insert_time_ms: 44 - insert_new_count: 1127 - insert_reused_count: 103 + explain: 'COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) + | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) + promote(@c9 + AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 + AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) + }' + task_count: 4435 + task_total_time_ms: 325 + transform_count: 959 + transform_time_ms: 106 + transform_yield_count: 396 + insert_time_ms: 24 + insert_new_count: 1166 + insert_reused_count: 106 - query: EXPLAIN select * from f4(a => 103, b => 'b', c => 2, d => 2) ref: sql-functions.yamsql:142 - explain: ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c15 - AS LONG) + promote(@c15 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c11, - [LESS_THAN promote(@c7 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 - AS COL2, q0.COL3 AS COL3) } - task_count: 4174 - task_total_time_ms: 763 - transform_count: 923 - transform_time_ms: 255 - transform_yield_count: 387 - insert_time_ms: 50 - insert_new_count: 1127 - insert_reused_count: 103 + explain: 'COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) + | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c15 AS LONG) + promote(@c15 + AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN + promote(@c7 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 + AS COL3) }' + task_count: 4435 + task_total_time_ms: 559 + transform_count: 959 + transform_time_ms: 194 + transform_yield_count: 396 + insert_time_ms: 28 + insert_new_count: 1166 + insert_reused_count: 106 - query: EXPLAIN select * from f5(); ref: sql-functions.yamsql:146 explain: 'COVERING(T1_IDX1 [EQUALS promote(''b'' AS STRING), [LESS_THAN promote(103 diff --git a/yaml-tests/src/test/resources/sql-functions.yamsql b/yaml-tests/src/test/resources/sql-functions.yamsql index 292bd4763f5..9ef68d74aaf 100644 --- a/yaml-tests/src/test/resources/sql-functions.yamsql +++ b/yaml-tests/src/test/resources/sql-functions.yamsql @@ -72,7 +72,7 @@ test_block: - result: [{101, 'b'}, {102, 'b'}] - - query: select col1 + 10, col2 from f1(103, 'b'); - - explain: "ISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]]) | MAP (_.COL1 + @c3 AS _0, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c9 AS LONG)]] -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | MAP (_.COL1 + @c3 AS _0, _.COL2 AS COL2)" - result: [{111, 'b'}, {112, 'b'}] - - query: select * from f1(103, 'b'); @@ -119,27 +119,27 @@ test_block: - result: [{101, 'b'}, {102, 'b'}] - - query: select * from t2 where exists (select * from f2(t2.z)) - - explain: "ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }" + - explain: "ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | FETCH | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }" - result: [{10, 14, 1}, {11, 16, 1}] - - query: select * from t2 where exists (select * from f2(k => t2.z)) - - explain: "ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }" + - explain: "ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | FETCH | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 }" - result: [{10, 14, 1}, {11, 16, 1}] - - query: select * from f3(103, 'b', 4) - - explain: "ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f3(103, 'b', 4) - - explain: "ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f4(103, 'b', 2, 2) - - explain: "ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) + promote(@c9 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c9 AS LONG) + promote(@c9 AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c7, [LESS_THAN promote(@c5 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f4(a => 103, b => 'b', c => 2, d => 2) - - explain: "ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c15 AS LONG) + promote(@c15 AS LONG) | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c7 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "COVERING(T1_IDX1 <,> -> [COL1: KEY:[1], COL2: KEY:[0], COL3: KEY:[2]]) | FILTER promote(_.COL3 AS LONG) EQUALS promote(@c15 AS LONG) + promote(@c15 AS LONG) | FETCH | FLATMAP q0 -> { ISCAN(T1_IDX1 [EQUALS @c11, [LESS_THAN promote(@c7 AS LONG)]]) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f5(); diff --git a/yaml-tests/src/test/resources/subquery-tests.metrics.binpb b/yaml-tests/src/test/resources/subquery-tests.metrics.binpb index c603e0774cc71674d55ca4269bee17ff4e73470f..bb3d409118dff102d8a305829ff2801606769e70 100644 GIT binary patch delta 7214 zcmeHMYgANMmR|duTRaLV%2K3IBNtyO1oW0X>Q*LEm}nbO!I)?=@r{mlPtpN3#+axS zl4%uRzzu9Q5sRc-P{xR&-ZWxF9ZY;ZuQ}&l9wi!kW|CgLdaeFN zv8XEc`Ode${q67Gt8Mem`8K6(QpsYQ(l#|sT=}H2gO5uvAIxp=w=M&5SjoH=yo6qOcPIqr-=vA;PB+}ypPp4e?hY9Q>%3?I zR-S+fSXxYn^3VB}#n1STLR?wGuKqycoa)q6@B^$3Bz;gEPPUY#R)q-uaec+tCZzo9 zYtM9<>cE__WVT}7XTnZ*iK{F-V`@MfI zu*+=<9C#z_!$uku7uA?~ao3Mu6IgM3ZuZxTa}mq{8l^~I7?pzuVjrr@p^QHmOkCYH zDwK^sbm-^SRd)I0q7WhPMdJbG+R3)cvLCjE?HLBI0+f$WA39`mr24*7peUg&UrLgSa9U_nzY0DA#6+j%; zd(l<6%ubNnqoa}0bshQ|=|q&mA(4N*QHh^XfG!7}(86MMkr%vWz_b7&V_5(cV21#h zpp-72Ozl#%lCWz%PV^O)W270}7#<}|P%10pz=_Y-lM+1RC#2->A#wPT1uC&kCTpJN z?!c6`kb+m+K}}g&RRpM2K_F98jMUOD_88o_jZDY1Kq1&uey zJl_fCp`kNa`5!aT&0d+=2|d18ipGuYgjv`x6fAfll)dSTP_PC#JqmMTLbUJ(zAAzd z4T(%g!ocMviBWw;JA#eO!1OTi0y`dQBh1F4EU=hjJr5kKAJ{w*x?^>Fp%0p$CZXQ; zXzdG>oyH!*TAOhp=M5%zg}3y^TOpYDZ9i$Wz6avrJA0_Dw^V*pmj6kUxWW?Xg>Q$m zYC^j~D{{BixP9JW*QLx6^9U*X3UKltNP3w&_frUv?Jc;-xf`=^O1maKTNH^-2fP|p z5Wz^jNiY{|*lx7ugSa4f0kuieimHKfLcEvdUGl=S2}!n5gI*9{j2WZAyCKTZs8Fn( z#js5+r~Pnt5~Pt^Hb&#)>SxK&)u5D?#6pacu_I3@9pH;&1~cNiR>MX9n;P&E90E*y zn(LQyup+P@o=u1^QCFa0pzAJ2x2J?dV(-&k$dfvS5K?-kQM( z6^vI+0^`Uc2uAZl_Rj1KBW}1(P3S&NTv$066#kALSQo*1J&!g=gI6y}6qbTbMkER$N|F#B@INFPD9Z-0{oTv1E1s_+dwkH zn~oVQu(q;mt*QLxtky2^Sa*P!l)6Dim3^wl$K+_i-Yz+?ejsEi*Gn@VcNq2C@i3bR zMLms6HTKM$2y?=ea8`01HDBLSVzMp<@!uC76l@XFCATd1VeF~Ul(84S6V4EPm_C?2 z3;N)RN$@h+(nBAV9Vdgg55zH1Sd9()$OicTjKmN?_e|JM@}h9uTdd0bNLJ+n!F>1H zexo%P#ESXfP+Ko)-QIZlDaNB^x_-BaV{#H0iOwiqVmh2w&2PhV{w?&us{`QG-1Cn7i<-Rz z`h##zHZIXXy|@%+haGdUa&rvkUAftT*6kq9-j{ImQV1NDSf?wE&1AnV2f zI6fODlH)Oq3}>)38+_EV97r^Plgq4Hf^ZOsUBa|fD8b{e17~@hx@{$h9;QP{t;EcXs@dXfdNjfd$?y15pg=nR>fJ}QBmEGm<|Q<;COF7AxhSOO^+-8<^L41JCA>kq?eftjr@$C{!!^)31RQ>rks_ z&{qlewy`!%E~e|%-R~0+z^;vvx-JxnBL)kn&=Tx~o-+t9`#{RpmDEgBra^s4fT#S} zabpqD6^J+JY<@m3 zX)N<$slJ|H<-AzijC$6Qd)Ktr}`E^B9>e);B`^pRWBr zyw=r)3LgMx?{w8_EqWx>F|DBX!oHVCAuLzxE|K?qIIufTwg8)agOq!UOe3)CPdygc z#h`A#Pb47q5tuzn(D412=5pWP^(PJ5yYp{xXlo9{KBnBbU!vSexBge zcjFR+`Rv)#KGsbjmY3&ITeP(3&X zb3U#GhqAl(Fgy<3@Gz4VtP!_$2bM*$4WXOj{z1UdV4C>%RXyy$`;l~J*k_H9A3brZ zEr-17@D>AuJb&#}4f0GTfaT1L+>WBUbTqG#x&VIIjCriORHEfi7}DEWqrMR5zWv1vAG}tH0bb)Eu~TE1PLe zKF#!ioU%P3Z#sqs(RZ4L_6prxEVOfT(Jg-(9T{m4w`55SFU8yZ%^>tPLR6U*9Cy z`bil_|4n`^-rKVO0rM8o zYa7@$#lcsZ;XMsF_!a8Q3=g{lHu!Z5fTImUO78iaIBpE{v)sWd;#a}SwbFUq0h^q$ zEikegj*KSna4)Rv>THWO|s1|VBpIP0)-J-wkavV8ZcgSSE}WD0Csy1;}#3RzWYlo3y@=4 z*d;61u4g^Cas4HhDPpcGU!@^i57Q9@KEb1fbjm-#`iYi&04$QrR)jy&H^Wx;)>Uow zg_D6?)iU<)HZWD&?@H5Dtw0-FucNz$t=v5QgFRrS;47N_vnY*EKceZtvwC*C0u%Z1IbR^jpq7+8es6oG{y+NIRly+~O zHgN6LS4I)juESg|q}mItZeTjD9e{-ijj=-G0T$xv@i2$X*^E9X=^M@7XHC&P6Soon zQNgB6v~(`(g~vNLo{oA=;lqUm&^(ZyTuss00*vaQx zqxt)jYkOK1DxN;I*~j*hR8?~y; zPQX*Q8IO42!vjg;)Q!c8?!x<+e2;#B)jfn1o<|aAqs@3~BNM}`cH&T0e^7t}!-W)& zKr$o%cv`6iM?w4qYn9{@K6>|S!6wftk7%u-yU@B4TW!|vb`%P{G|y7rRnR?)ep7mK%=V2O zbO*2uPV6TvQYworcxMkF$a;J{b~)9q4~uPr8@0P@iI4f^v2Tt=V}!69FMG4(ncvhT zU-qK3p?4^kJuEHCBVEi;&O7!=Xhf}xp24-$zz8VhH_ zv^E?_ydjX{0jcG#kD88ex~!^wzPZE-Jat~QebkrJRx_??I&DosAn*&8mo}HgbJf<}}GqjkRM9vb} zq9}hX&6VzoDVdS|;c$(|blL59p#A~G`rAn-FlM>8%4~*bI$8spc+tbK0^rXWk9Q+03qH7=>$bZVraweBy zV>ADxtuT41c3~So&&6^lJ%WS&4aT7IEZK{B&(blh`qB?-MgZ&t)|mD$SlvQQ(m~2ac@H=-IS|U&`pvm)_lgvfs9?x`vWbz3G2%U*35Ig~Q^?)F7{Njo<)RWv zQgO5ucHy{(_;c~IkjP5b>9MGLI)Rf0J>qQd8OI~Ix;LGI6V^j$u*0XB9FAnRI`p-r z8z4;UD9lR%1CH(}S+VgQT8QP(Q-hin0sat};`4P$*zAfAhar|0 z+>XJ_92$VHQ#?lWguhxwIzNr4xadn>6p;gI zC3fuz{_4V)VGq?3N}S65sp~pm#aB?M=1hiKV38AC0$?3#oxHy3jT4;kvV13&6KT0* z`C-SohinYwg$IB1vnMFGE*Cn}GyJS`P^qQyn9-l(;?tE$ST>l$v0^F&VQeWor2_=_-Fd6prG~*{}j#ec@|0XAZm% zzU3XEHm1{G12*PDAdndk*p5@Opdflj zZ+@_S2Ft!fdjf5rgIsxdi@~0%+&J?a=gaG{T&?;c7aFjJgw)UtGY zZ3kNs$ftIEC)wka9bb=jrt)$q(aPa23gqDxlDb};;QpPxv^+pvI}LIJ9!NHWdXq`$ zx&Q;D9ZvH?4a1sZm?m#b@?J9A{Od=R4hrPJfs*w{mZl^hm-7Yn26P)-) zI@QO#OFQeVY!Z&oFD38Fr6MUy43=ZXhr( z_nc|u-Cm+zE~puPbg51#sSkye+nU(?8 z{{)=TLS%!t1!YKP2>5Caw&#a)CsmD%%ooZoS@N^k{17h52BLkoVh>w6Krt8Bnu5B_0|HXdx~lMnnOp~F^$ zugNrdn;>%z`=0-3&?3K6Q!gSv`R6CK$mgP~g+%$Hp45i=da}Uo1-!^Zs*D2Sj30^9 z7ixd(cb0tkH}QV<+JPY?ADn^;p+-j zqE__gew%|?a<()=fY~(jj){YL>uMQjXr9&499>IOFmfyj#;)C@0Oq=7yc^b~?XdO& z-2Hn_Aa&W4Vf6`aS-1%)!Mtp4M-uAjGB$B%8FB`!K>np>HR21pkhb~cKCN@kgUSdw z-v=lDD=qAEP8{=NgXQgWXM$`Ed{XtSHE{C&=;ADJ4&p{+u5Lu^&m_Gto+)u%#jx7B zWR?|k(jX2WeS#{Ohs2NMEBIbEjmGbWkO*w(31+`uazW=$^wT4!_-pM)N!1LZ`%5JX zw82(zySsB@5Am)G3%{sacg%T?Q)c5<;uPQf2^NneFJnfwbOifW(-PcWM~yh-BzK{C zz}hGC-(W(ap?z`WVS${Gt?nkmx$ z(5&cy=cub)NHo*mw24e*aRzJWO6k z4wMXnM|kuKUVk03YKB?B04VW!+0_K8!R_JozvA; z1M-EIQjt#q_WJr=Jn=52Ss`r)f7-o+94yjjW>l{1LTm`}N2*aqOk z-dY;2&((L=29)CIb@avmGv_7e5`^sZz}lU3Xv`InWlkPnx7@S{@>uxETt7}8Ke^}W z%H}Kqspmu z0Uvxz$zhd~>3&c-k?=|Qg<3w8aNQ|We|FP!dT(z}LO!v#QmI_MSoqYXn@NsZwVFN# zDyN7m1gf#(2z@g4LT7Wh=}*M6>tc(^mL)ed)=_&G<>TXN&hC5)s?g8UCM%DMfxRQX zdXx?$rQvLK+)=gk7=6aiYxXg31WZF-Pt9!iN7DtLi&xCMMs4`?b9^JinJG-=e%}Jf z$MFJE@HQ5nrLRXVX_fJP_3OihjL)6-qmj$_y7Mb^8UK5xC<%klQ3KJP(RuZ!bF}F} zJ0odJe{;DuPwl%wi@MKw+#F&0%50hW{mKMeF_jy?`!c{jT$$Z)m^imUMn`Llcf!>L zxYI2?@qtplA{StDIO)vZSQc>4TA5tSXdQvW)TU^@w_?ijRGRNdR2|DnEJ4?8NX2~y zX{9hA+Tsn5S;!(R?oZa}3zGxOxf$ulqE~E*{16IWJJ!sLD^k2tdB| z8>3I8eEihrP(0p&52S5-K$51pf=YZk81A0>#OBXi2O77C?VsQlBPlZscZR(w1len~RB8J88 zB3|KzEa;;EY&-<{nsX4s&(gPr2d4Shj5N(=5Jw7T%B}r@{bVqrsk1a0ucS#veBv;K zw5@^yIKejW-~!E8bBXw?aEjnypPHkkJ&&2!Y1QD4kd|~`naK&E-p{h+{l>1g8z3(^ zea+wgxU%pn17|MxX6Ff3rc1J@gaEc`Sr@GA$~R3uw+c?I>?UQx64ld9vYC9a)>f_+ z%(I54RAjzi49`6GQHW8!r7hUFmT0TkG&XwdJD6wTsKxDVn_qnx9&v0Rshq`bY;|lr zqljnYr8>U7-72C9P>USWAW6%PAPS7^!gH1LG~bkYH>!bYi9Qa3W&U{*DjUJZlvko# zcMlTAIi(=p@P+K>AI!|<4i;b06LZ3(-{HswG+!VbpzT?OffL!$UXN^>CdTP7tVoig zwRxId{i7ew=}lh6;zy;=@pKo-04Z83_}aPo4Tx1k(xt^g#1n(-21+jPJ;mnQRl(v; z;LLkv;-2E*`$K&1DY)(?{Bn(R_dUgaD#Y0zxxi{$#^Lk<+*`E72qV>lW#1eaKX~Zl o{fEkrjg+5BiXU%nyM8)RRun42p5gw$#KUGc$G3<5zkL1l-zh3zr~m)} diff --git a/yaml-tests/src/test/resources/subquery-tests.metrics.yaml b/yaml-tests/src/test/resources/subquery-tests.metrics.yaml index c81ef0ca3b7..b50190dc744 100644 --- a/yaml-tests/src/test/resources/subquery-tests.metrics.yaml +++ b/yaml-tests/src/test/resources/subquery-tests.metrics.yaml @@ -144,30 +144,32 @@ exists-subquery: - query: EXPLAIN SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i ref: subquery-tests.yamsql:147 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } - task_count: 494 - task_total_time_ms: 37 - transform_count: 140 - transform_time_ms: 12 - transform_yield_count: 44 - insert_time_ms: 1 - insert_new_count: 52 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS i, exists(q0) AS e) }' + task_count: 512 + task_total_time_ms: 26 + transform_count: 143 + transform_time_ms: 8 + transform_yield_count: 45 + insert_time_ms: 0 + insert_new_count: 55 insert_reused_count: 4 - query: EXPLAIN SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) AS e FROM T4 GROUP BY T4.i ref: subquery-tests.yamsql:153 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } - task_count: 494 - task_total_time_ms: 37 - transform_count: 140 - transform_time_ms: 12 - transform_yield_count: 44 - insert_time_ms: 1 - insert_new_count: 52 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS i, exists(q0) AS e) }' + task_count: 512 + task_total_time_ms: 26 + transform_count: 143 + transform_time_ms: 8 + transform_yield_count: 45 + insert_time_ms: 0 + insert_new_count: 55 insert_reused_count: 4 - query: EXPLAIN SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 WHERE EXISTS (SELECT id FROM T1 WHERE T1.T2 = T4.id AND T1.id > 1) GROUP @@ -190,31 +192,32 @@ exists-subquery: - query: EXPLAIN SELECT g, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i AS g ref: subquery-tests.yamsql:169 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c14 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g, exists(q0) AS e) } - task_count: 494 - task_total_time_ms: 30 - transform_count: 140 - transform_time_ms: 11 - transform_yield_count: 44 - insert_time_ms: 1 - insert_new_count: 52 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c14 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS g, exists(q0) AS e) }' + task_count: 512 + task_total_time_ms: 20 + transform_count: 143 + transform_time_ms: 7 + transform_yield_count: 45 + insert_time_ms: 0 + insert_new_count: 55 insert_reused_count: 4 - query: EXPLAIN SELECT T4.i, NOT EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i ref: subquery-tests.yamsql:175 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c17 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, NOT exists(q0) AS - e) } - task_count: 494 - task_total_time_ms: 27 - transform_count: 140 - transform_time_ms: 9 - transform_yield_count: 44 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c17 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS i, NOT exists(q0) AS e) }' + task_count: 512 + task_total_time_ms: 34 + transform_count: 143 + transform_time_ms: 10 + transform_yield_count: 45 insert_time_ms: 1 - insert_new_count: 52 + insert_new_count: 55 insert_reused_count: 4 - query: EXPLAIN SELECT p.id, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e, COUNT(*) AS n FROM T5 p JOIN T6 c ON c.i1 = p.id GROUP BY p.id @@ -236,109 +239,113 @@ exists-subquery: T4 GROUP BY T4.i UNION ALL SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) AS e FROM T4 GROUP BY T4.i ref: subquery-tests.yamsql:191 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } - ⊎ SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c45 AS INT) | MAP (_.id AS id) - | DEFAULT NULL | FLATMAP q1 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () - GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q1) AS e) } - task_count: 961 - task_total_time_ms: 56 - transform_count: 268 - transform_time_ms: 22 - transform_yield_count: 80 - insert_time_ms: 3 - insert_new_count: 106 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS i, exists(q0) AS e) } ⊎ SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c45 + AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q1 -> { COVERING(T4_i + <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i + AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q1) AS e) }' + task_count: 997 + task_total_time_ms: 31 + transform_count: 274 + transform_time_ms: 11 + transform_yield_count: 82 + insert_time_ms: 1 + insert_new_count: 112 insert_reused_count: 8 - query: EXPLAIN WITH g AS (SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i) SELECT * FROM g ref: subquery-tests.yamsql:199 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } - task_count: 519 - task_total_time_ms: 32 - transform_count: 145 - transform_time_ms: 10 - transform_yield_count: 46 - insert_time_ms: 1 - insert_new_count: 56 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS i, exists(q0) AS e) }' + task_count: 537 + task_total_time_ms: 22 + transform_count: 148 + transform_time_ms: 7 + transform_yield_count: 47 + insert_time_ms: 0 + insert_new_count: 59 insert_reused_count: 4 - query: EXPLAIN SELECT COUNT(*) AS n, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 ref: subquery-tests.yamsql:209 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c19 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL AS q0 RETURN (coalesce_long(q0._0._0, - 0l) AS n, exists(q0) AS e) } - task_count: 544 - task_total_time_ms: 43 - transform_count: 147 - transform_time_ms: 14 - transform_yield_count: 47 - insert_time_ms: 2 - insert_new_count: 62 + explain: SCAN([IS T4]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () + | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c19 + AS INT) | MAP (_.id AS id) | DEFAULT NULL AS q1 RETURN (coalesce_long(q0._0._0, + 0l) AS n, exists(q1) AS e) } + task_count: 562 + task_total_time_ms: 21 + transform_count: 150 + transform_time_ms: 6 + transform_yield_count: 48 + insert_time_ms: 1 + insert_new_count: 65 insert_reused_count: 6 - query: EXPLAIN SELECT COUNT(*) AS n, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 WHERE T4.i > 100 ref: subquery-tests.yamsql:215 - explain: ISCAN(T4_i [[GREATER_THAN promote(@c30 AS INT)]]) | MAP (_ AS _0) | AGG - (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS - T1]) | FILTER _.T2 EQUALS promote(@c19 AS INT) | MAP (_.id AS id) | DEFAULT - NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS n, exists(q1) AS e) } - task_count: 715 - task_total_time_ms: 28 - transform_count: 196 - transform_time_ms: 11 - transform_yield_count: 55 + explain: 'COVERING(T4_i [[GREATER_THAN promote(@c30 AS INT)]] -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON + EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c19 + AS INT) | MAP (_.id AS id) | DEFAULT NULL AS q1 RETURN (coalesce_long(q0._0._0, + 0l) AS n, exists(q1) AS e) }' + task_count: 754 + task_total_time_ms: 24 + transform_count: 201 + transform_time_ms: 8 + transform_yield_count: 57 insert_time_ms: 1 - insert_new_count: 82 + insert_new_count: 88 insert_reused_count: 5 - query: EXPLAIN SELECT T4.i, SUM(CASE WHEN EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) THEN 1 ELSE 0 END) AS s FROM T4 GROUP BY T4.i ref: subquery-tests.yamsql:223 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - (sum_i(pick(ConditionSelector(exists(q0), TRUE), @c20, @c25)) AS _0) GROUP - BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, q0._1._0 AS s) } - task_count: 462 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG (sum_i(pick(ConditionSelector(exists(q0), + TRUE), @c20, @c25)) AS _0) GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 + AS i, q0._1._0 AS s) }' + task_count: 480 task_total_time_ms: 30 - transform_count: 137 - transform_time_ms: 12 - transform_yield_count: 42 - insert_time_ms: 1 - insert_new_count: 47 + transform_count: 140 + transform_time_ms: 9 + transform_yield_count: 43 + insert_time_ms: 0 + insert_new_count: 50 insert_reused_count: 4 - query: EXPLAIN SELECT SUM(CASE WHEN EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) THEN 1 ELSE 0 END) AS s FROM T4 ref: subquery-tests.yamsql:229 explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - (sum_i(pick(ConditionSelector(exists(q0), TRUE), @c16, @c21)) AS _0) GROUP - BY () | ON EMPTY NULL AS q0 RETURN (q0._0._0 AS s) } - task_count: 502 - task_total_time_ms: 26 - transform_count: 143 - transform_time_ms: 10 - transform_yield_count: 45 + id) | DEFAULT NULL | FLATMAP q0 -> { SCAN([IS T4]) | MAP (_ AS _0) | AGG (sum_i(pick(ConditionSelector(exists(q0), + TRUE), @c16, @c21)) AS _0) GROUP BY () | ON EMPTY NULL AS q0 RETURN (q0._0._0 + AS s) } + task_count: 520 + task_total_time_ms: 22 + transform_count: 146 + transform_time_ms: 7 + transform_yield_count: 46 insert_time_ms: 1 - insert_new_count: 55 + insert_new_count: 58 insert_reused_count: 6 - query: EXPLAIN SELECT p.id, EXISTS (SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) FROM T4 GROUP BY T4.i) AS e FROM T5 p ref: subquery-tests.yamsql:246 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS _1) - } | DEFAULT NULL | FLATMAP q1 -> { SCAN([IS T5]) AS q2 RETURN (q2.id AS id, - exists(q1) AS e) } - task_count: 639 - task_total_time_ms: 51 - transform_count: 186 - transform_time_ms: 19 - transform_yield_count: 61 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS i, exists(q0) AS _1) } | DEFAULT NULL | FLATMAP q1 -> { SCAN([IS + T5]) AS q2 RETURN (q2.id AS id, exists(q1) AS e) }' + task_count: 657 + task_total_time_ms: 31 + transform_count: 189 + transform_time_ms: 10 + transform_yield_count: 62 insert_time_ms: 1 - insert_new_count: 69 + insert_new_count: 72 insert_reused_count: 4 - query: EXPLAIN SELECT * FROM VALUES (1, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1)) AS t (a, e) @@ -524,270 +531,276 @@ exists-subquery: - CREATE TEMPORARY FUNCTION TF2() ON COMMIT DROP FUNCTION AS SELECT T4.i FROM T4 GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) ref: subquery-tests.yamsql:327 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@cTF234 AS INT) | MAP (_.id - AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) - | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS - i) } - task_count: 660 - task_total_time_ms: 49 - transform_count: 180 - transform_time_ms: 15 - transform_yield_count: 52 - insert_time_ms: 2 - insert_new_count: 72 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@cTF234 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i + <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i + AS _0) AS q0 RETURN (q0._0._0 AS i) }' + task_count: 678 + task_total_time_ms: 24 + transform_count: 183 + transform_time_ms: 7 + transform_yield_count: 53 + insert_time_ms: 1 + insert_new_count: 75 insert_reused_count: 6 - query: EXPLAIN SELECT T2 FROM T1 WHERE EXISTS (SELECT T1.T2, MAX(id) FROM T4 WHERE i > T1.T2 * 10 GROUP BY i) ref: subquery-tests.yamsql:333 - explain: SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c25]]) - | MAP (_ AS _0) | AGG (max_i(_._0.id) AS _0) GROUP BY (_._0.i AS _0) | MAP - (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN - (q0.T2 AS T2) } - task_count: 595 - task_total_time_ms: 43 - transform_count: 170 - transform_time_ms: 15 - transform_yield_count: 46 - insert_time_ms: 1 - insert_new_count: 57 + explain: 'SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * + @c25]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(_._0.id) + AS _0) GROUP BY (_._0.i AS _0) | MAP (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT + NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }' + task_count: 634 + task_total_time_ms: 25 + transform_count: 175 + transform_time_ms: 10 + transform_yield_count: 48 + insert_time_ms: 0 + insert_new_count: 63 insert_reused_count: 1 - query: EXPLAIN SELECT T2 FROM T1 WHERE EXISTS (SELECT T2, MAX(id) FROM T4 WHERE i > T2 * 10 GROUP BY i) ref: subquery-tests.yamsql:338 - explain: SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c21]]) - | MAP (_ AS _0) | AGG (max_i(_._0.id) AS _0) GROUP BY (_._0.i AS _0) | MAP - (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN - (q0.T2 AS T2) } - task_count: 595 - task_total_time_ms: 43 - transform_count: 170 - transform_time_ms: 16 - transform_yield_count: 46 - insert_time_ms: 1 - insert_new_count: 57 + explain: 'SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * + @c21]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(_._0.id) + AS _0) GROUP BY (_._0.i AS _0) | MAP (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT + NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }' + task_count: 634 + task_total_time_ms: 31 + transform_count: 175 + transform_time_ms: 10 + transform_yield_count: 48 + insert_time_ms: 0 + insert_new_count: 63 insert_reused_count: 1 - query: EXPLAIN SELECT T2 FROM T1 WHERE EXISTS (SELECT MAX(T2), MAX(id) FROM T4 WHERE i > T2 * 10 GROUP BY i) ref: subquery-tests.yamsql:344 - explain: SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c24]]) - | MAP (_ AS _0) | AGG (max_i(q0.T2) AS _0, max_i(_._0.id) AS _1) GROUP BY - (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER - _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) } - task_count: 595 - task_total_time_ms: 43 - transform_count: 170 - transform_time_ms: 15 - transform_yield_count: 46 - insert_time_ms: 1 - insert_new_count: 57 + explain: 'SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * + @c24]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(q0.T2) AS + _0, max_i(_._0.id) AS _1) GROUP BY (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 + AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }' + task_count: 634 + task_total_time_ms: 18 + transform_count: 175 + transform_time_ms: 6 + transform_yield_count: 48 + insert_time_ms: 0 + insert_new_count: 63 insert_reused_count: 1 - query: EXPLAIN SELECT T2 FROM T1 WHERE EXISTS (SELECT MAX(T1.T2), MAX(id) FROM T4 WHERE i > T2 * 10 GROUP BY i) ref: subquery-tests.yamsql:349 - explain: SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c26]]) - | MAP (_ AS _0) | AGG (max_i(q0.T2) AS _0, max_i(_._0.id) AS _1) GROUP BY - (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER - _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) } - task_count: 595 - task_total_time_ms: 25 - transform_count: 170 + explain: 'SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * + @c26]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(q0.T2) AS + _0, max_i(_._0.id) AS _1) GROUP BY (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 + AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }' + task_count: 634 + task_total_time_ms: 32 + transform_count: 175 transform_time_ms: 10 - transform_yield_count: 46 + transform_yield_count: 48 insert_time_ms: 0 - insert_new_count: 57 + insert_new_count: 63 insert_reused_count: 1 - query: EXPLAIN SELECT T4.i FROM T4 GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) ref: subquery-tests.yamsql:361 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | - MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) - } - task_count: 635 - task_total_time_ms: 38 - transform_count: 175 - transform_time_ms: 12 - transform_yield_count: 50 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i + <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i + AS _0) AS q0 RETURN (q0._0._0 AS i) }' + task_count: 653 + task_total_time_ms: 18 + transform_count: 178 + transform_time_ms: 6 + transform_yield_count: 51 insert_time_ms: 1 - insert_new_count: 68 + insert_new_count: 71 insert_reused_count: 6 - query: EXPLAIN SELECT T4.i FROM T4 GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) ref: subquery-tests.yamsql:367 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | - MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) - } - task_count: 635 - task_total_time_ms: 38 - transform_count: 175 - transform_time_ms: 12 - transform_yield_count: 50 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i + <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i + AS _0) AS q0 RETURN (q0._0._0 AS i) }' + task_count: 653 + task_total_time_ms: 18 + transform_count: 178 + transform_time_ms: 6 + transform_yield_count: 51 insert_time_ms: 1 - insert_new_count: 68 + insert_new_count: 71 insert_reused_count: 6 - query: EXPLAIN SELECT T4.i FROM T4 GROUP BY T4.i HAVING NOT EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) ref: subquery-tests.yamsql:373 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c24 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER NOT _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) - | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS - i) } - task_count: 635 - task_total_time_ms: 59 - transform_count: 175 - transform_time_ms: 18 - transform_yield_count: 50 - insert_time_ms: 2 - insert_new_count: 68 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c24 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FILTER NOT _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i + <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i + AS _0) AS q0 RETURN (q0._0._0 AS i) }' + task_count: 653 + task_total_time_ms: 41 + transform_count: 178 + transform_time_ms: 11 + transform_yield_count: 51 + insert_time_ms: 1 + insert_new_count: 71 insert_reused_count: 6 - query: EXPLAIN SELECT T4.i FROM T4 GROUP BY T4.i HAVING T4.i = 10 OR EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) ref: subquery-tests.yamsql:380 - explain: ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) | FLATMAP - q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c29 AS INT) | MAP (_.id - AS id) | DEFAULT NULL | FILTER q0._0._0 EQUALS promote(@c16 AS INT) OR _ NOT_NULL - AS q1 RETURN (q0._0._0 AS i) } - task_count: 696 - task_total_time_ms: 30 - transform_count: 205 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c29 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) | FILTER _._0._0 + EQUALS promote(@c16 AS INT) OR q0 NOT_NULL AS q0 RETURN (q0._0._0 AS i) }' + task_count: 714 + task_total_time_ms: 37 + transform_count: 208 transform_time_ms: 11 - transform_yield_count: 52 - insert_time_ms: 2 - insert_new_count: 77 + transform_yield_count: 53 + insert_time_ms: 1 + insert_new_count: 80 insert_reused_count: 5 - query: EXPLAIN SELECT COUNT(*) AS n FROM T4 WHERE T4.i > 100 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) ref: subquery-tests.yamsql:387 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN - promote(@c14 AS INT)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP - BY () | ON EMPTY NULL AS q0 RETURN (coalesce_long(q0._0._0, 0l) AS n) } - task_count: 876 - task_total_time_ms: 60 - transform_count: 234 - transform_time_ms: 18 - transform_yield_count: 61 - insert_time_ms: 3 - insert_new_count: 102 + explain: 'COVERING(T4_i [[GREATER_THAN promote(@c14 AS INT)]] -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON + EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 + AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN + (coalesce_long(q0._0._0, 0l) AS n) }' + task_count: 915 + task_total_time_ms: 27 + transform_count: 239 + transform_time_ms: 9 + transform_yield_count: 63 + insert_time_ms: 1 + insert_new_count: 108 insert_reused_count: 7 - query: EXPLAIN SELECT COUNT(*) AS n FROM T4 WHERE T4.i > 100 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) ref: subquery-tests.yamsql:393 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN - promote(@c14 AS INT)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP - BY () | ON EMPTY NULL AS q0 RETURN (coalesce_long(q0._0._0, 0l) AS n) } - task_count: 876 - task_total_time_ms: 60 - transform_count: 234 - transform_time_ms: 18 - transform_yield_count: 61 - insert_time_ms: 3 - insert_new_count: 102 + explain: 'COVERING(T4_i [[GREATER_THAN promote(@c14 AS INT)]] -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON + EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 + AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN + (coalesce_long(q0._0._0, 0l) AS n) }' + task_count: 915 + task_total_time_ms: 27 + transform_count: 239 + transform_time_ms: 9 + transform_yield_count: 63 + insert_time_ms: 1 + insert_new_count: 108 insert_reused_count: 7 - query: EXPLAIN SELECT 7 AS x FROM T4 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) ref: subquery-tests.yamsql:400 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | - MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL AS q0 RETURN (7 AS x) } - task_count: 705 - task_total_time_ms: 60 - transform_count: 185 - transform_time_ms: 17 - transform_yield_count: 53 - insert_time_ms: 3 - insert_new_count: 82 + explain: SCAN([IS T4]) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL | + FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | + MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (7 AS x) + } + task_count: 723 + task_total_time_ms: 37 + transform_count: 188 + transform_time_ms: 9 + transform_yield_count: 54 + insert_time_ms: 1 + insert_new_count: 85 insert_reused_count: 8 - query: EXPLAIN SELECT 7 AS x FROM T4 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) ref: subquery-tests.yamsql:406 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | - MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL AS q0 RETURN (7 AS x) } - task_count: 705 - task_total_time_ms: 60 - transform_count: 185 - transform_time_ms: 17 - transform_yield_count: 53 - insert_time_ms: 3 - insert_new_count: 82 + explain: SCAN([IS T4]) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL | + FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | + MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (7 AS x) + } + task_count: 723 + task_total_time_ms: 37 + transform_count: 188 + transform_time_ms: 9 + transform_yield_count: 54 + insert_time_ms: 1 + insert_new_count: 85 insert_reused_count: 8 - query: EXPLAIN SELECT 7 AS x FROM T4 WHERE T4.i > 100 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) ref: subquery-tests.yamsql:412 - explain: ISCAN(T4_i [[GREATER_THAN promote(@c11 AS INT)]]) | MAP (_ AS _0) | AGG - () GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 - EQUALS promote(@c24 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL - AS q1 RETURN (7 AS x) } - task_count: 876 - task_total_time_ms: 35 - transform_count: 234 - transform_time_ms: 12 - transform_yield_count: 61 - insert_time_ms: 2 - insert_new_count: 102 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c24 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i + [[GREATER_THAN promote(@c11 AS INT)]] -> [i: KEY:[0], id: KEY:[2]]) | MAP + (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL AS q0 RETURN (7 AS x) }' + task_count: 915 + task_total_time_ms: 33 + transform_count: 239 + transform_time_ms: 11 + transform_yield_count: 63 + insert_time_ms: 1 + insert_new_count: 108 insert_reused_count: 7 - query: EXPLAIN SELECT 7 AS x FROM T4 HAVING COUNT(*) > 5 ref: subquery-tests.yamsql:418 - explain: ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY - () | ON EMPTY NULL | FILTER coalesce_long(_._0._0, 0l) GREATER_THAN promote(@c12 + explain: SCAN([IS T4]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () + | ON EMPTY NULL | FILTER coalesce_long(_._0._0, 0l) GREATER_THAN promote(@c12 AS LONG) | MAP (7 AS x) - task_count: 326 - task_total_time_ms: 18 - transform_count: 78 - transform_time_ms: 7 - transform_yield_count: 27 + task_count: 344 + task_total_time_ms: 10 + transform_count: 81 + transform_time_ms: 3 + transform_yield_count: 28 insert_time_ms: 0 - insert_new_count: 34 + insert_new_count: 37 insert_reused_count: 4 - query: EXPLAIN SELECT g FROM T4 GROUP BY T4.i AS g HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) ref: subquery-tests.yamsql:429 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | - MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g) - } - task_count: 635 - task_total_time_ms: 53 - transform_count: 175 - transform_time_ms: 16 - transform_yield_count: 50 - insert_time_ms: 2 - insert_new_count: 68 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i + <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i + AS _0) AS q0 RETURN (q0._0._0 AS g) }' + task_count: 653 + task_total_time_ms: 31 + transform_count: 178 + transform_time_ms: 9 + transform_yield_count: 51 + insert_time_ms: 1 + insert_new_count: 71 insert_reused_count: 6 - query: EXPLAIN SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 2) ref: subquery-tests.yamsql:442 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c39 - AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN - q0 } | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i - AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } - task_count: 1362 - task_total_time_ms: 99 - transform_count: 400 - transform_time_ms: 24 - transform_yield_count: 86 - insert_time_ms: 5 - insert_new_count: 172 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS + promote(@c39 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL + | FLATMAP q1 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ + AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN q0 } AS q0 RETURN (q0._0._0 + AS i, exists(q0) AS e) }' + task_count: 1380 + task_total_time_ms: 88 + transform_count: 403 + transform_time_ms: 17 + transform_yield_count: 87 + insert_time_ms: 4 + insert_new_count: 175 insert_reused_count: 21 - query: EXPLAIN SELECT p.id FROM T5 p WHERE EXISTS (SELECT T4.i FROM T4 GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.id = p.id AND T1.id > 1)) ref: subquery-tests.yamsql:454 - explain: SCAN([IS T5]) | FLATMAP q0 -> { SCAN([IS T1, [GREATER_THAN promote(@c41 + explain: 'SCAN([IS T5]) | FLATMAP q0 -> { SCAN([IS T1, [GREATER_THAN promote(@c41 AS INT)]]) | FILTER promote(_.id AS LONG) EQUALS q0.id | MAP (_.id AS id) - | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q1 -> { ISCAN(T4_i <,>) | MAP - (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) } - | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (q0.id AS id) } - task_count: 844 - task_total_time_ms: 62 - transform_count: 249 - transform_time_ms: 20 - transform_yield_count: 68 - insert_time_ms: 2 - insert_new_count: 97 + | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q1 -> { COVERING(T4_i <,> -> + [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) + AS q0 RETURN (q0._0._0 AS i) } | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN + (q0.id AS id) }' + task_count: 862 + task_total_time_ms: 47 + transform_count: 252 + transform_time_ms: 12 + transform_yield_count: 69 + insert_time_ms: 1 + insert_new_count: 100 insert_reused_count: 5 - query: EXPLAIN SELECT p.id AS x, EXISTS (SELECT c.id FROM T6 c WHERE c.i1 = p.id) AS e FROM T5 p ORDER BY x @@ -806,28 +819,30 @@ exists-subquery: - query: EXPLAIN SELECT T4.i AS g, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i ORDER BY g ref: subquery-tests.yamsql:500 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g, exists(q0) AS e) } - task_count: 494 - task_total_time_ms: 31 - transform_count: 140 - transform_time_ms: 10 - transform_yield_count: 44 - insert_time_ms: 1 - insert_new_count: 52 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS g, exists(q0) AS e) }' + task_count: 512 + task_total_time_ms: 18 + transform_count: 143 + transform_time_ms: 7 + transform_yield_count: 45 + insert_time_ms: 0 + insert_new_count: 55 insert_reused_count: 4 - query: EXPLAIN SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i ORDER BY T4.i ref: subquery-tests.yamsql:510 - explain: SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS - id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG - () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } - task_count: 494 - task_total_time_ms: 40 - transform_count: 140 - transform_time_ms: 17 - transform_yield_count: 44 - insert_time_ms: 1 - insert_new_count: 52 + explain: 'SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id + AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], + id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN + (q0._0._0 AS i, exists(q0) AS e) }' + task_count: 512 + task_total_time_ms: 24 + transform_count: 143 + transform_time_ms: 9 + transform_yield_count: 45 + insert_time_ms: 0 + insert_new_count: 55 insert_reused_count: 4 diff --git a/yaml-tests/src/test/resources/subquery-tests.yamsql b/yaml-tests/src/test/resources/subquery-tests.yamsql index 8ab31210225..69444ac8e4e 100644 --- a/yaml-tests/src/test/resources/subquery-tests.yamsql +++ b/yaml-tests/src/test/resources/subquery-tests.yamsql @@ -144,13 +144,13 @@ test_block: # It is evaluated on top of the grouping, where it is constant for every group. - query: SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" - unorderedResult: [{i: 10, e: true}, {i: 20, e: true}, {i: 30, e: true}] - # The same but with an EXISTS subquery that is false for every group. - query: SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) AS e FROM T4 GROUP BY T4.i - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" - unorderedResult: [{i: 10, e: false}, {i: 20, e: false}, {i: 30, e: false}] - # The same but with a correlated EXISTS subquery in the WHERE clause as well, which is evaluated below the @@ -166,13 +166,13 @@ test_block: # The same but selecting an aliased grouping column. - query: SELECT g, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i AS g - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c14 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g, exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c14 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g, exists(q0) AS e) }" - unorderedResult: [{g: 10, e: true}, {g: 20, e: true}, {g: 30, e: true}] - # The same but with NOT EXISTS. - query: SELECT T4.i, NOT EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c17 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, NOT exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c17 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, NOT exists(q0) AS e) }" - unorderedResult: [{i: 10, e: false}, {i: 20, e: false}, {i: 30, e: false}] - # The same but grouping a join. @@ -188,7 +188,7 @@ test_block: UNION ALL SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) AS e FROM T4 GROUP BY T4.i - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } ⊎ SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c45 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q1 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q1) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) } ⊎ SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c45 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q1 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q1) AS e) }" - unorderedResult: [{i: 10, e: true}, {i: 20, e: true}, {i: 30, e: true}, {i: 10, e: false}, {i: 20, e: false}, {i: 30, e: false}] - @@ -196,7 +196,7 @@ test_block: - query: WITH g AS (SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i) SELECT * FROM g - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" - unorderedResult: [{i: 10, e: true}, {i: 20, e: true}, {i: 30, e: true}] - # EXISTS subquery in the SELECT list of a grouped query, correlated to a non-grouping column (`T4.id`). @@ -206,13 +206,13 @@ test_block: # Uncorrelated EXISTS subquery in the SELECT list of an aggregate query without GROUP BY. - query: SELECT COUNT(*) AS n, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c19 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL AS q0 RETURN (coalesce_long(q0._0._0, 0l) AS n, exists(q0) AS e) }" + - explain: "SCAN([IS T4]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c19 AS INT) | MAP (_.id AS id) | DEFAULT NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS n, exists(q1) AS e) }" - result: [{n: 3, e: true}] - # The same but over an empty input, which still yields a single row. - query: SELECT COUNT(*) AS n, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 WHERE T4.i > 100 - supported_version: 4.16.3.0 - - explain: "ISCAN(T4_i [[GREATER_THAN promote(@c30 AS INT)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c19 AS INT) | MAP (_.id AS id) | DEFAULT NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS n, exists(q1) AS e) }" + - explain: "COVERING(T4_i [[GREATER_THAN promote(@c30 AS INT)]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c19 AS INT) | MAP (_.id AS id) | DEFAULT NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS n, exists(q1) AS e) }" - result: [{n: 0, e: true}] - # Uncorrelated EXISTS subquery inside an aggregate function argument of a grouped query. @@ -220,13 +220,13 @@ test_block: FROM T4 GROUP BY T4.i - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG (sum_i(pick(ConditionSelector(exists(q0), TRUE), @c20, @c25)) AS _0) GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, q0._1._0 AS s) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c20 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (sum_i(pick(ConditionSelector(exists(q0), TRUE), @c20, @c25)) AS _0) GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, q0._1._0 AS s) }" - unorderedResult: [{i: 10, s: 1}, {i: 20, s: 1}, {i: 30, s: 1}] - # The same but in an aggregate query without GROUP BY, so that the aggregate sees several rows. - query: SELECT SUM(CASE WHEN EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) THEN 1 ELSE 0 END) AS s FROM T4 - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG (sum_i(pick(ConditionSelector(exists(q0), TRUE), @c16, @c21)) AS _0) GROUP BY () | ON EMPTY NULL AS q0 RETURN (q0._0._0 AS s) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { SCAN([IS T4]) | MAP (_ AS _0) | AGG (sum_i(pick(ConditionSelector(exists(q0), TRUE), @c16, @c21)) AS _0) GROUP BY () | ON EMPTY NULL AS q0 RETURN (q0._0._0 AS s) }" - result: [{s: 3}] - # EXISTS subquery inside an aggregate function argument of a grouped query, correlated to the grouped rows (`T4.id`). @@ -243,7 +243,7 @@ test_block: EXISTS (SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) FROM T4 GROUP BY T4.i) AS e FROM T5 p - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS _1) } | DEFAULT NULL | FLATMAP q1 -> { SCAN([IS T5]) AS q2 RETURN (q2.id AS id, exists(q1) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS _1) } | DEFAULT NULL | FLATMAP q1 -> { SCAN([IS T5]) AS q2 RETURN (q2.id AS id, exists(q1) AS e) }" - unorderedResult: [{id: 1, e: true}, {id: 2, e: true}, {id: 3, e: true}] - # EXISTS subquery in a row of an inline VALUES table in the FROM clause. @@ -324,29 +324,29 @@ test_block: - query: SELECT * FROM TF2() - supported_version: 4.16.3.0 - setupReference: temporary_function_with_grouped_exists - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@cTF234 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@cTF234 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" - unorderedResult: [{10}, {20}, {30}] - # Correlated EXISTS subquery in the WHERE clause, containing a grouped query that projects a qualified outer # column (`T1.T2`). - query: SELECT T2 FROM T1 WHERE EXISTS (SELECT T1.T2, MAX(id) FROM T4 WHERE i > T1.T2 * 10 GROUP BY i) - - explain: "SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c25]]) | MAP (_ AS _0) | AGG (max_i(_._0.id) AS _0) GROUP BY (_._0.i AS _0) | MAP (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" + - explain: "SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * @c25]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(_._0.id) AS _0) GROUP BY (_._0.i AS _0) | MAP (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" - unorderedResult: [{1}, {2}] - # The same but with an unqualified outer column (`T2`). - query: SELECT T2 FROM T1 WHERE EXISTS (SELECT T2, MAX(id) FROM T4 WHERE i > T2 * 10 GROUP BY i) - - explain: "SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c21]]) | MAP (_ AS _0) | AGG (max_i(_._0.id) AS _0) GROUP BY (_._0.i AS _0) | MAP (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" + - explain: "SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * @c21]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(_._0.id) AS _0) GROUP BY (_._0.i AS _0) | MAP (q0.T2 AS T2, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" - unorderedResult: [{1}, {2}] - # Correlated EXISTS subquery in the WHERE clause, containing a grouped query that aggregates an unqualified outer # column (`MAX(T2)`). - query: SELECT T2 FROM T1 WHERE EXISTS (SELECT MAX(T2), MAX(id) FROM T4 WHERE i > T2 * 10 GROUP BY i) - - explain: "SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c24]]) | MAP (_ AS _0) | AGG (max_i(q0.T2) AS _0, max_i(_._0.id) AS _1) GROUP BY (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" + - explain: "SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * @c24]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(q0.T2) AS _0, max_i(_._0.id) AS _1) GROUP BY (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" - unorderedResult: [{1}, {2}] - # The same but with a qualified outer column (`MAX(T1.T2)`). - query: SELECT T2 FROM T1 WHERE EXISTS (SELECT MAX(T1.T2), MAX(id) FROM T4 WHERE i > T2 * 10 GROUP BY i) - - explain: "SCAN([IS T1]) | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN q0.T2 * @c26]]) | MAP (_ AS _0) | AGG (max_i(q0.T2) AS _0, max_i(_._0.id) AS _1) GROUP BY (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" + - explain: "SCAN([IS T1]) | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN q0.T2 * @c26]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (max_i(q0.T2) AS _0, max_i(_._0.id) AS _1) GROUP BY (_._0.i AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.T2 AS T2) }" - unorderedResult: [{1}, {2}] - # EXISTS subquery in GROUP BY. This is not supported. @@ -358,64 +358,64 @@ test_block: # It is evaluated on top of the grouping, where it is constant for every group. - query: SELECT T4.i FROM T4 GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" - unorderedResult: [{10}, {20}, {30}] - # The same but with an empty subquery, which rejects every group. - query: SELECT T4.i FROM T4 GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" - unorderedResult: [] - # The same but with NOT EXISTS. - query: SELECT T4.i FROM T4 GROUP BY T4.i HAVING NOT EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c24 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER NOT _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c24 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER NOT _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) }" - unorderedResult: [{10}, {20}, {30}] - # The same but as one term of an OR disjunction. # Unlike above, the plan evaluates the EXISTS subquery inside the FLATMAP over the groups, i.e., once per group. - query: SELECT T4.i FROM T4 GROUP BY T4.i HAVING T4.i = 10 OR EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) - supported_version: 4.16.3.0 - - explain: "ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c29 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER q0._0._0 EQUALS promote(@c16 AS INT) OR _ NOT_NULL AS q1 RETURN (q0._0._0 AS i) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c29 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) | FILTER _._0._0 EQUALS promote(@c16 AS INT) OR q0 NOT_NULL AS q0 RETURN (q0._0._0 AS i) }" - unorderedResult: [{10}] - # Uncorrelated EXISTS subquery in the HAVING clause of an aggregate query without GROUP BY, over an empty input. # The single group is kept. - query: SELECT COUNT(*) AS n FROM T4 WHERE T4.i > 100 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN promote(@c14 AS INT)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL AS q0 RETURN (coalesce_long(q0._0._0, 0l) AS n) }" + - explain: "COVERING(T4_i [[GREATER_THAN promote(@c14 AS INT)]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS n) }" - result: [{n: 0}] - # The same but with an empty subquery, which rejects the single group. - query: SELECT COUNT(*) AS n FROM T4 WHERE T4.i > 100 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i [[GREATER_THAN promote(@c14 AS INT)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL AS q0 RETURN (coalesce_long(q0._0._0, 0l) AS n) }" + - explain: "COVERING(T4_i [[GREATER_THAN promote(@c14 AS INT)]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c27 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (coalesce_long(q0._0._0, 0l) AS n) }" - result: [] - # Uncorrelated EXISTS subquery in the HAVING clause of a query without GROUP BY or aggregate functions. # The HAVING clause alone makes all rows a single group, so the query yields a single row. - query: SELECT 7 AS x FROM T4 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL AS q0 RETURN (7 AS x) }" + - explain: "SCAN([IS T4]) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (7 AS x) }" - result: [{x: 7}] - # The same but with an empty subquery, which rejects the single group. - query: SELECT 7 AS x FROM T4 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 99) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL AS q0 RETURN (7 AS x) }" + - explain: "SCAN([IS T4]) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (7 AS x) }" - result: [] - # The same but over an empty input, which still forms a single group. - query: SELECT 7 AS x FROM T4 WHERE T4.i > 100 HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) - supported_version: 4.16.3.0 - - explain: "ISCAN(T4_i [[GREATER_THAN promote(@c11 AS INT)]]) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c24 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (7 AS x) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c24 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i [[GREATER_THAN promote(@c11 AS INT)]] -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY () | ON EMPTY NULL AS q0 RETURN (7 AS x) }" - result: [{x: 7}] - # The same but with an aggregate function only in the HAVING clause, and without a subquery. - query: SELECT 7 AS x FROM T4 HAVING COUNT(*) > 5 - supported_version: 4.16.3.0 - - explain: "ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FILTER coalesce_long(_._0._0, 0l) GREATER_THAN promote(@c12 AS LONG) | MAP (7 AS x)" + - explain: "SCAN([IS T4]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY () | ON EMPTY NULL | FILTER coalesce_long(_._0._0, 0l) GREATER_THAN promote(@c12 AS LONG) | MAP (7 AS x)" - result: [] - # The same but selecting a column that is neither grouped nor aggregated. @@ -426,7 +426,7 @@ test_block: # The same but with an aliased grouping column. - query: SELECT g FROM T4 GROUP BY T4.i AS g HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c23 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g) }" - unorderedResult: [{10}, {20}, {30}] - # EXISTS subquery in the HAVING clause, correlated to an aliased grouping column (`g`). @@ -439,7 +439,7 @@ test_block: GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.T2 = 2) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c39 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN q0 } | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c39 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q1 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN q0 } AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" - unorderedResult: [{i: 10, e: true}, {i: 20, e: true}, {i: 30, e: true}] - # EXISTS subquery in the HAVING clause of a grouped subquery, correlated to the enclosing query (`p.id`) rather @@ -451,7 +451,7 @@ test_block: GROUP BY T4.i HAVING EXISTS (SELECT id FROM T1 WHERE T1.id = p.id AND T1.id > 1)) - supported_version: 4.16.3.0 - - explain: "SCAN([IS T5]) | FLATMAP q0 -> { SCAN([IS T1, [GREATER_THAN promote(@c41 AS INT)]]) | FILTER promote(_.id AS LONG) EQUALS q0.id | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q1 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) } | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (q0.id AS id) }" + - explain: "SCAN([IS T5]) | FLATMAP q0 -> { SCAN([IS T1, [GREATER_THAN promote(@c41 AS INT)]]) | FILTER promote(_.id AS LONG) EQUALS q0.id | MAP (_.id AS id) | DEFAULT NULL | FILTER _ NOT_NULL | FLATMAP q1 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i) } | DEFAULT NULL | FILTER _ NOT_NULL AS q1 RETURN (q0.id AS id) }" - unorderedResult: [{2}, {3}] - # EXISTS subquery in the HAVING clause, correlated to a grouping column (`T4.i`). @@ -497,7 +497,7 @@ test_block: # The same in a grouped query, with an uncorrelated EXISTS subquery. - query: SELECT T4.i AS g, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i ORDER BY g - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g, exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c18 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS g, exists(q0) AS e) }" - result: [{g: 10, e: true}, {g: 20, e: true}, {g: 30, e: true}] - # EXISTS subquery in the ORDER BY clause of a grouped query. This is not supported. @@ -507,7 +507,7 @@ test_block: # Uncorrelated EXISTS subquery in the SELECT list of a grouped query that is sorted by its grouping column. - query: SELECT T4.i, EXISTS (SELECT id FROM T1 WHERE T1.T2 = 1) AS e FROM T4 GROUP BY T4.i ORDER BY T4.i - supported_version: 4.16.3.0 - - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { ISCAN(T4_i <,>) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" + - explain: "SCAN([IS T1]) | FILTER _.T2 EQUALS promote(@c16 AS INT) | MAP (_.id AS id) | DEFAULT NULL | FLATMAP q0 -> { COVERING(T4_i <,> -> [i: KEY:[0], id: KEY:[2]]) | MAP (_ AS _0) | AGG () GROUP BY (_._0.i AS _0) AS q0 RETURN (q0._0._0 AS i, exists(q0) AS e) }" - result: [{i: 10, e: true}, {i: 20, e: true}, {i: 30, e: true}] --- # Tests for subqueries in INSERT, UPDATE and DELETE statements. diff --git a/yaml-tests/src/test/resources/valid-identifiers.metrics.binpb b/yaml-tests/src/test/resources/valid-identifiers.metrics.binpb index 2e82b0f7dfa..4b8cf35ffb6 100644 --- a/yaml-tests/src/test/resources/valid-identifiers.metrics.binpb +++ b/yaml-tests/src/test/resources/valid-identifiers.metrics.binpb @@ -418,42 +418,42 @@ D rankdir=BT; splines=line; 1 [ label=<
Value Computation
EXPLODE array((@c5 AS _$$$, @c7 AS _$$, @c9 AS _$), (@c13 AS _$$$, @c15 AS _$$, @c17 AS _$))
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(INT AS _$$$, INT AS _$$, INT AS _$)" ]; -}š +}– n - all-testsaEXPLAIN select struct "x$$" ("foo.tableA.A1", "foo.tableA.A2", "foo.tableA.A3") from "foo.tableA"§ -ñÔÞ³ˆ àÌö(20Çš083@'SCAN([IS foo__2tableA]) | MAP (_ AS _0)ß digraph G { + all-testsaEXPLAIN select struct "x$$" ("foo.tableA.A1", "foo.tableA.A2", "foo.tableA.A3") from "foo.tableA"£ +ñ¤ÓȈ ±¿Ê(20‡Æ84@%SCAN([IS foo.tableA]) | MAP (_ AS _0)Ý digraph G { fontname=courier; rankdir=BT; splines=line; 1 [ label=<
Value Computation
MAP (q2 AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3 AS _0)" ]; - 2 [ label=<
Scan
comparisons: [IS foo__2tableA]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; + 2 [ label=<
Scan
comparisons: [IS foo.tableA]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; 3 [ label=<
Primary Storage
record types: [foo__2tableA, foo__1tableC, foo__2table__1nested, foo__2table__1repeated, foo__2table__1nested__2repeated, my__1adjacency__1list, foo__2enum__2type, foo__2tableB, __foo__0tableD, foo__2tableE]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}Ç +}­ K - all-tests>EXPLAIN select struct "x$$" ("foo.tableA".*) from "foo.tableA"÷ -žë²¶ J Ô´Ò(%0âÄ-8 @2ISCAN(foo.tableA.idx3 <,>) | MAP (_ AS foo.tableA)¥ digraph G { + all-tests>EXPLAIN select struct "x$$" ("foo.tableA".*) from "foo.tableA"Ý +º­ÆŽN ïÁÌ('0æ¿8#@ŒCOVERING(foo.tableA.idx <,> -> [foo__2tableA__2A1: KEY:[0], foo__2tableA__2A2: KEY:[1], foo__2tableA__2A3: KEY:[2]]) | MAP (_ AS foo.tableA)° digraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Value Computation
MAP (q2 AS foo.tableA)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3 AS foo.tableA)" ]; - 2 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; - 3 [ label=<
Index
foo.tableA.idx3
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; + 1 [ label=<
Value Computation
MAP (q62 AS foo.tableA)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3 AS foo.tableA)" ]; + 2 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; + 3 [ label=<
Index
foo.tableA.idx
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; -}ò + 2 -> 1 [ label=< q62> label="q62" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +}¿ j - all-tests]EXPLAIN select struct "x$$" ("foo.tableA.A2" + "foo.tableA.A1" as "__$$__") from "foo.tableA"ƒ -žþ�ûH §ãÍ(%0™æ!8 @VISCAN(foo.tableA.idx3 <,>) | MAP ((_.foo.tableA.A2 + _.foo.tableA.A1 AS __$$__) AS _0)� digraph G { + all-tests]EXPLAIN select struct "x$$" ("foo.tableA.A2" + "foo.tableA.A1" as "__$$__") from "foo.tableA"Ð +Ö¯ÐÆP ™˜™()0ìì8&@•COVERING(foo.tableA.idx3 <,> -> [foo__2tableA__2A1: KEY:[2], foo__2tableA__2A2: KEY:[0]]) | MAP ((_.foo.tableA.A2 + _.foo.tableA.A1 AS __$$__) AS _0)š digraph G { fontname=courier; rankdir=BT; splines=line; - 1 [ label=<
Value Computation
MAP ((q2.foo.tableA.A2 + q2.foo.tableA.A1 AS __$$__) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS __$$__ AS _0)" ]; - 2 [ label=<
Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; + 1 [ label=<
Value Computation
MAP ((q64.foo.tableA.A2 + q64.foo.tableA.A1 AS __$$__) AS _0)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS __$$__ AS _0)" ]; + 2 [ label=<
Covering Index Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; 3 [ label=<
Index
foo.tableA.idx3
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS foo.tableA.A1, LONG AS foo.tableA.A2, LONG AS foo.tableA.A3)" ]; 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; - 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q64> label="q64" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; }Ö 3 all-tests&EXPLAIN select * from "foo.enum.type";ž diff --git a/yaml-tests/src/test/resources/valid-identifiers.metrics.yaml b/yaml-tests/src/test/resources/valid-identifiers.metrics.yaml index a53a4601a85..3f1b7d022ba 100644 --- a/yaml-tests/src/test/resources/valid-identifiers.metrics.yaml +++ b/yaml-tests/src/test/resources/valid-identifiers.metrics.yaml @@ -43,7 +43,7 @@ all-tests: - query: EXPLAIN select "level0.field1"."level1$field.1"."level2$field.1" from "foo.table$nested" where id = 1 ref: valid-identifiers.yamsql:171 - explain: SCAN([IS foo.table$nested, EQUALS promote(@c11 AS LONG)]) | MAP (_.level0.field1.level1$field.1.level2$field.1 + explain: SCAN([IS foo__2table__1nested, EQUALS promote(@c11 AS LONG)]) | MAP (_.level0.field1.level1$field.1.level2$field.1 AS level2$field.1) task_count: 448 task_total_time_ms: 34 @@ -56,7 +56,7 @@ all-tests: - query: EXPLAIN select "foo.table$repeated".id from "foo.table$repeated" where 'foo' IN "foo.table$repeated"."field.1$array" ref: valid-identifiers.yamsql:178 - explain: SCAN([IS foo.table$repeated]) | FLATMAP q0 -> { EXPLODE arrayDistinct(q0.field.1$array) + explain: SCAN([IS foo__2table__1repeated]) | FLATMAP q0 -> { EXPLODE arrayDistinct(q0.field.1$array) | FILTER @c7 EQUALS _ AS q1 RETURN (q0.ID AS ID) } task_count: 345 task_total_time_ms: 17 @@ -82,7 +82,7 @@ all-tests: - query: EXPLAIN select t."field.1$array" from "foo.table$repeated" as t where 3 IN t."field.0$array" ref: valid-identifiers.yamsql:190 - explain: SCAN([IS foo.table$repeated]) | FLATMAP q0 -> { EXPLODE arrayDistinct(q0.field.0$array) + explain: SCAN([IS foo__2table__1repeated]) | FLATMAP q0 -> { EXPLODE arrayDistinct(q0.field.0$array) | FILTER promote(@c9 AS LONG) EQUALS _ AS q1 RETURN (q0.field.1$array AS field.1$array) } task_count: 345 @@ -155,7 +155,7 @@ all-tests: - query: EXPLAIN select * from "foo.tableA", "foo.tableB" where "foo.tableA"."foo.tableA.A1" = "foo.tableB"."foo.tableB.B1"; ref: valid-identifiers.yamsql:286 - explain: SCAN([IS foo.tableB]) | FLATMAP q0 -> { ISCAN(foo.tableA.idx [EQUALS + explain: SCAN([IS foo__2tableB]) | FLATMAP q0 -> { ISCAN(foo.tableA.idx [EQUALS q0.foo.tableB.B1]) AS q1 RETURN (q1.foo.tableA.A1 AS foo.tableA.A1, q1.foo.tableA.A2 AS foo.tableA.A2, q1.foo.tableA.A3 AS foo.tableA.A3, q0.foo.tableB.B1 AS foo.tableB.B1, q0.foo.tableB.B2 AS foo.tableB.B2, q0.foo.tableB.B3 AS foo.tableB.B3) } @@ -246,7 +246,7 @@ all-tests: - query: EXPLAIN select "βήτα__f"("f__e"."foo.tableE.E3") AS "___h.1" from "foo.tableE" as "f__e" where "alpha__f"("f__e"."foo.tableE.E3") = 5 ref: valid-identifiers.yamsql:346 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c21 + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c21 AS LONG) | MAP (_.foo.tableE.E3.S2 AS ___h.1) task_count: 204 task_total_time_ms: 11 @@ -259,7 +259,7 @@ all-tests: - query: EXPLAIN select "alpha__f"("f__e"."foo.tableE.E3") AS "___h.1" from "foo.tableE" as "f__e" where "βήτα__f"("f__e"."foo.tableE.E3") >= 50 ref: valid-identifiers.yamsql:350 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S2 GREATER_THAN_OR_EQUALS + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S2 GREATER_THAN_OR_EQUALS promote(@c22 AS LONG) | MAP (_.foo.tableE.E3.S1 AS ___h.1) task_count: 204 task_total_time_ms: 10 @@ -271,8 +271,8 @@ all-tests: insert_reused_count: 2 - query: EXPLAIN select * from "__$func3"(10, 1, 1); ref: valid-identifiers.yamsql:356 - explain: SCAN([IS my$adjacency$list, EQUALS promote(@c7 AS LONG)]) | FLATMAP - q0 -> { SCAN([IS my$adjacency$list, [LESS_THAN promote(@c5 AS LONG)]]) + explain: SCAN([IS my__1adjacency__1list, EQUALS promote(@c7 AS LONG)]) | FLATMAP + q0 -> { SCAN([IS my__1adjacency__1list, [LESS_THAN promote(@c5 AS LONG)]]) | FILTER _.my__parent EQUALS promote(@c7 AS LONG) AS q1 RETURN (q1.me AS _0, q1.my__parent AS _1, q0.me AS _2, q0.my__parent AS _3) } task_count: 1337 @@ -285,7 +285,7 @@ all-tests: insert_reused_count: 17 - query: EXPLAIN select * from "$yay"(5); ref: valid-identifiers.yamsql:360 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c5 + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c5 AS LONG) | MAP (_.foo.tableE.E1 AS _$x.id) task_count: 338 task_total_time_ms: 28 @@ -297,7 +297,7 @@ all-tests: insert_reused_count: 2 - query: EXPLAIN select * from "__2yay"(6); ref: valid-identifiers.yamsql:364 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c5 + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c5 AS LONG) | MAP (_.foo.tableE.E1 AS _$y.id) task_count: 338 task_total_time_ms: 12 @@ -309,7 +309,7 @@ all-tests: insert_reused_count: 2 - query: EXPLAIN select * from "नमसà¥�त"(4); ref: valid-identifiers.yamsql:368 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c5 + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS promote(@c5 AS LONG) | MAP (_.foo.tableE.E1 AS _$z.id) task_count: 338 task_total_time_ms: 24 @@ -321,7 +321,7 @@ all-tests: insert_reused_count: 2 - query: EXPLAIN select * from "$yay__view"; ref: valid-identifiers.yamsql:374 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS 4 | MAP (_.foo.tableE.E1 + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS 4 | MAP (_.foo.tableE.E1 AS _$x.id) task_count: 294 task_total_time_ms: 14 @@ -333,7 +333,7 @@ all-tests: insert_reused_count: 2 - query: EXPLAIN select * from "__2yay__view"; ref: valid-identifiers.yamsql:378 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS 5 | MAP (_.foo.tableE.E1 + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS 5 | MAP (_.foo.tableE.E1 AS _$y.id) task_count: 294 task_total_time_ms: 14 @@ -345,7 +345,7 @@ all-tests: insert_reused_count: 2 - query: EXPLAIN select * from "வணகà¯�கமà¯�"; ref: valid-identifiers.yamsql:382 - explain: SCAN([IS foo.tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS 6 | MAP (_.foo.tableE.E1 + explain: SCAN([IS foo__2tableE]) | FILTER _.foo.tableE.E3.S1 EQUALS 6 | MAP (_.foo.tableE.E1 AS _$z.id) task_count: 294 task_total_time_ms: 15 @@ -372,37 +372,38 @@ all-tests: from "foo.tableA" ref: valid-identifiers.yamsql:392 explain: SCAN([IS foo.tableA]) | MAP (_ AS _0) - task_count: 499 - task_total_time_ms: 50 + task_count: 497 + task_total_time_ms: 15 transform_count: 136 - transform_time_ms: 10 + transform_time_ms: 5 transform_yield_count: 50 insert_time_ms: 0 - insert_new_count: 51 - insert_reused_count: 3 + insert_new_count: 52 + insert_reused_count: 4 - query: EXPLAIN select struct "x$$" ("foo.tableA".*) from "foo.tableA" ref: valid-identifiers.yamsql:397 - explain: ISCAN(foo.tableA.idx3 <,>) | MAP (_ AS foo.tableA) - task_count: 286 - task_total_time_ms: 23 - transform_count: 74 - transform_time_ms: 9 - transform_yield_count: 37 + explain: 'COVERING(foo.tableA.idx <,> -> [foo__2tableA__2A1: KEY:[0], foo__2tableA__2A2: + KEY:[1], foo__2tableA__2A3: KEY:[2]]) | MAP (_ AS foo.tableA)' + task_count: 314 + task_total_time_ms: 10 + transform_count: 78 + transform_time_ms: 5 + transform_yield_count: 39 insert_time_ms: 0 - insert_new_count: 32 + insert_new_count: 35 insert_reused_count: 6 - query: EXPLAIN select struct "x$$" ("foo.tableA.A2" + "foo.tableA.A1" as "__$$__") from "foo.tableA" ref: valid-identifiers.yamsql:402 - explain: ISCAN(foo.tableA.idx3 <,>) | MAP ((_.foo.tableA.A2 + _.foo.tableA.A1 - AS __$$__) AS _0) - task_count: 286 - task_total_time_ms: 12 - transform_count: 72 - transform_time_ms: 5 - transform_yield_count: 37 + explain: 'COVERING(foo.tableA.idx3 <,> -> [foo__2tableA__2A1: KEY:[2], foo__2tableA__2A2: + KEY:[0]]) | MAP ((_.foo.tableA.A2 + _.foo.tableA.A1 AS __$$__) AS _0)' + task_count: 342 + task_total_time_ms: 11 + transform_count: 80 + transform_time_ms: 4 + transform_yield_count: 41 insert_time_ms: 0 - insert_new_count: 32 + insert_new_count: 38 insert_reused_count: 6 - query: EXPLAIN select * from "foo.enum.type"; ref: valid-identifiers.yamsql:408 @@ -493,9 +494,9 @@ update-delete-statements: ref: valid-identifiers.yamsql:510 explain: 'COVERING(foo.tableA.idx [EQUALS promote(@c9 AS LONG)] -> [foo__2tableA__2A1: KEY:[0], foo__2tableA__2A2: KEY:[1], foo__2tableA__2A3: KEY:[2]]) | DISTINCT - BY PK | FETCH | UPDATE foo.tableA' - task_count: 709 - task_total_time_ms: 19 + BY PK | FETCH | UPDATE foo__2tableA' + task_count: 707 + task_total_time_ms: 16 transform_count: 141 transform_time_ms: 6 transform_yield_count: 57 @@ -507,9 +508,9 @@ update-delete-statements: ref: valid-identifiers.yamsql:514 explain: 'COVERING(foo.tableA.idx [[GREATER_THAN promote(@c9 AS LONG)]] -> [foo__2tableA__2A1: KEY:[0], foo__2tableA__2A2: KEY:[1], foo__2tableA__2A3: KEY:[2]]) | DISTINCT - BY PK | FETCH | UPDATE foo.tableA | MAP (_.new.foo.tableA.A1 AS foo.tableA.A1)' - task_count: 766 - task_total_time_ms: 17 + BY PK | FETCH | UPDATE foo__2tableA | MAP (_.new.foo.tableA.A1 AS foo.tableA.A1)' + task_count: 762 + task_total_time_ms: 10 transform_count: 155 transform_time_ms: 4 transform_yield_count: 57 diff --git a/yaml-tests/src/test/resources/valid-identifiers.yamsql b/yaml-tests/src/test/resources/valid-identifiers.yamsql index ff67c65073c..af2f18cce15 100644 --- a/yaml-tests/src/test/resources/valid-identifiers.yamsql +++ b/yaml-tests/src/test/resources/valid-identifiers.yamsql @@ -394,12 +394,12 @@ test_block: - # named record construction with uid star - query: select struct "x$$" ("foo.tableA".*) from "foo.tableA" - - explain: "ISCAN(foo.tableA.idx3 <,>) | MAP (_ AS foo.tableA)" + - explain: "COVERING(foo.tableA.idx <,> -> [foo__2tableA__2A1: KEY:[0], foo__2tableA__2A2: KEY:[1], foo__2tableA__2A3: KEY:[2]]) | MAP (_ AS foo.tableA)" - result: [{{"foo.tableA.A1": 1 , "foo.tableA.A2": 10, "foo.tableA.A3": 1}}, {{"foo.tableA.A1": 2, "foo.tableA.A2": 10, "foo.tableA.A3": 2}}, {{"foo.tableA.A1": 3, "foo.tableA.A2": 10, "foo.tableA.A3": 3}}] - # named record construction with aliased expressions - query: select struct "x$$" ("foo.tableA.A2" + "foo.tableA.A1" as "__$$__") from "foo.tableA" - - explain: "ISCAN(foo.tableA.idx3 <,>) | MAP ((_.foo.tableA.A2 + _.foo.tableA.A1 AS __$$__) AS _0)" + - explain: "COVERING(foo.tableA.idx3 <,> -> [foo__2tableA__2A1: KEY:[2], foo__2tableA__2A2: KEY:[0]]) | MAP ((_.foo.tableA.A2 + _.foo.tableA.A1 AS __$$__) AS _0)" - result: [{{"__$$__": 11}}, {{"__$$__": 12}}, {{"__$$__": 13}}] # enums