From 6fbe5b8c7499b0f1775e43d2f7fb609e5cf7d3ef Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Tue, 15 Jul 2025 01:33:13 -0500 Subject: [PATCH 01/13] Commit for Issue 3028 --- .idea/misc.xml | 12 ++++++-- .idea/vcs.xml | 1 - .../query/plan/explain/ExplainLevel.java | 28 +++++++++++++++---- .../src/main/antlr/RelationalLexer.g4 | 4 +-- .../src/main/antlr/RelationalParser.g4 | 3 +- .../query/MutablePlanGenerationContext.java | 16 +++++++++-- .../NormalizedQueryExecutionContext.java | 9 ++++++ .../query/QueryExecutionContext.java | 2 ++ .../recordlayer/query/QueryPlan.java | 2 +- .../query/visitors/QueryVisitor.java | 8 ++++++ .../recordlayer/query/ExplainTests.java | 4 +-- 11 files changed, 71 insertions(+), 18 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 014943bf2b..8f374499ac 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,12 +5,15 @@ + + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 830674470f..35eb1ddfbb 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java index 448ae8f138..efe0e2298c 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java @@ -20,25 +20,41 @@ package com.apple.foundationdb.record.query.plan.explain; +import java.util.Objects; + /** * Explain level. Adjusts the granularity of explain output. */ -public final class ExplainLevel { +public enum ExplainLevel { + VERBOSE(0), + DEFAULT(1), + MINIMAL(2); + /** * Everything we can render is rendered. */ - public static final int ALL_DETAILS = 0; + public static final int ALL_DETAILS = VERBOSE.ordinal(); /** * Nice to have details are rendered, other details not absolutely needed for the understanding of the plan * are omitted. */ - public static final int SOME_DETAILS = 1; + public static final int SOME_DETAILS = DEFAULT.ordinal(); /** * Only the structure of the plan, i.e. the plan operators and their relationship is rendered. */ - public static final int STRUCTURE = 2; + public static final int STRUCTURE = MINIMAL.ordinal(); + + private final int details; + + ExplainLevel(int details) { + this.details = details; + } + + public int getDetails() { + return details; + } - private ExplainLevel() { - // nothing + public static int convert(final ExplainLevel explainLevel) { + return Objects.requireNonNullElse(explainLevel, DEFAULT).ordinal(); } } diff --git a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 index 5d73c9267d..a784f90129 100644 --- a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 +++ b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 @@ -147,6 +147,7 @@ MASTER_BIND: 'MASTER_BIND'; MASTER_SSL_VERIFY_SERVER_CERT: 'MASTER_SSL_VERIFY_SERVER_CERT'; MATCH: 'MATCH'; MAXVALUE: 'MAXVALUE'; +MINIMAL: 'MINIMAL'; MODIFIES: 'MODIFIES'; NATURAL: 'NATURAL'; NOT: 'NOT'; @@ -223,6 +224,7 @@ USAGE: 'USAGE'; USE: 'USE'; USING: 'USING'; VALUES: 'VALUES'; +VERBOSE: 'VERBOSE'; WHEN: 'WHEN'; WHERE: 'WHERE'; WHILE: 'WHILE'; @@ -1346,8 +1348,6 @@ fragment INT_TYPE_MODIFIER: ('I' | 'i'); fragment LONG_TYPE_MODIFIER: ('L' | 'l'); fragment DECIMAL_TYPE_MODIFIER: (INT_TYPE_MODIFIER | LONG_TYPE_MODIFIER); - - // Last tokens must generate Errors ERROR_RECOGNITION diff --git a/fdb-relational-core/src/main/antlr/RelationalParser.g4 b/fdb-relational-core/src/main/antlr/RelationalParser.g4 index a24bbe9076..7666022861 100644 --- a/fdb-relational-core/src/main/antlr/RelationalParser.g4 +++ b/fdb-relational-core/src/main/antlr/RelationalParser.g4 @@ -645,7 +645,8 @@ helpStatement // details describeObjectClause - : ( + : level=(VERBOSE | MINIMAL)? + ( query | deleteStatement | insertStatement | updateStatement | executeContinuationStatement ) #describeStatements diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java index aedabfec7e..237c989e7e 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java @@ -21,7 +21,6 @@ package com.apple.foundationdb.relational.recordlayer.query; import com.apple.foundationdb.annotation.API; - import com.apple.foundationdb.record.ExecuteProperties; import com.apple.foundationdb.record.PlanHashable; import com.apple.foundationdb.record.query.expressions.Comparisons; @@ -35,13 +34,13 @@ import com.apple.foundationdb.record.query.plan.cascades.values.LiteralValue; import com.apple.foundationdb.record.query.plan.cascades.values.OfTypeValue; import com.apple.foundationdb.record.query.plan.cascades.values.Value; -import com.apple.foundationdb.relational.api.SqlTypeSupport; +import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.relational.api.RelationalArray; import com.apple.foundationdb.relational.api.RelationalStruct; +import com.apple.foundationdb.relational.api.SqlTypeSupport; import com.apple.foundationdb.relational.api.exceptions.RelationalException; import com.apple.foundationdb.relational.util.Assert; import com.apple.foundationdb.relational.util.SpotBugsSuppressWarnings; - import com.google.common.collect.ImmutableList; import com.google.protobuf.ZeroCopyByteString; @@ -89,6 +88,8 @@ public class MutablePlanGenerationContext implements QueryExecutionContext { private boolean forExplain; + private int explainLevel; + @Nullable private byte[] continuation; @@ -261,6 +262,7 @@ public MutablePlanGenerationContext(@Nonnull PreparedParams preparedParams, constantObjectValues = new LinkedList<>(); shouldProcessLiteral = true; forExplain = false; + this.explainLevel = ExplainLevel.convert(ExplainLevel.DEFAULT); setContinuation(null); equalityConstraints = ImmutableList.builder(); } @@ -336,6 +338,10 @@ public boolean isForExplain() { return forExplain; } + @Override + public int getExplainLevel() { + return explainLevel; + } @Nonnull public QueryPlanConstraint getPlanConstraintsForLiteralReferences() { @@ -372,6 +378,10 @@ public void setForExplain(boolean forExplain) { this.forExplain = forExplain; } + public void setExplainLevel(final int explainLevel) { + this.explainLevel = explainLevel; + } + @Nonnull public Value processQueryLiteral(@Nonnull Type type, @Nullable Object literal, int tokenIndex) { return processQueryLiteralOrParameter(type, literal, null, null, tokenIndex); diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java index f39611f872..b1286ed818 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java @@ -24,6 +24,7 @@ import com.apple.foundationdb.record.ExecuteProperties; import com.apple.foundationdb.record.PlanHashable; +import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.relational.util.SpotBugsSuppressWarnings; import javax.annotation.Nonnull; @@ -44,6 +45,8 @@ public final class NormalizedQueryExecutionContext implements QueryExecutionCont private final boolean isForExplain; + private int explainLevel; + private final int parameterHash; @Nonnull @@ -59,6 +62,7 @@ private NormalizedQueryExecutionContext(@Nonnull Literals literals, this.isForExplain = isForExplain; this.parameterHash = parameterHash; this.planHashMode = planHashMode; + this.explainLevel = ExplainLevel.convert(ExplainLevel.DEFAULT); } @Nonnull @@ -90,6 +94,11 @@ public boolean isForExplain() { return isForExplain; } + @Override + public int getExplainLevel() { + return explainLevel; + } + @Nonnull @Override public PlanHashable.PlanHashMode getPlanHashMode() { diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java index 9f19e1840e..b9129e06fe 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java @@ -60,6 +60,8 @@ default EvaluationContext getEvaluationContext() { boolean isForExplain(); // todo (yhatem) remove. + int getExplainLevel(); + @Nonnull PlanHashable.PlanHashMode getPlanHashMode(); } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java index b3e719d404..9f4ca7c309 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java @@ -203,7 +203,7 @@ public PhysicalQueryPlan withExecutionContext(@Nonnull final QueryExecutionConte public String explain() { final var executeProperties = queryExecutionContext.getExecutionPropertiesBuilder(); List explainComponents = new ArrayList<>(); - explainComponents.add(ExplainPlanVisitor.toStringForExternalExplain(recordQueryPlan)); + explainComponents.add(ExplainPlanVisitor.toStringForExternalExplain(recordQueryPlan, queryExecutionContext.getExplainLevel(), Integer.MAX_VALUE)); if (executeProperties.getReturnedRowLimit() != ReadTransaction.ROW_LIMIT_UNLIMITED) { explainComponents.add("(limit=" + executeProperties.getReturnedRowLimit() + ")"); } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java index 5bfc2638f6..a5c4ef0cd0 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java @@ -33,6 +33,7 @@ import com.apple.foundationdb.record.query.plan.cascades.values.FieldValue; import com.apple.foundationdb.record.query.plan.cascades.values.LiteralValue; import com.apple.foundationdb.record.query.plan.cascades.values.Value; +import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.record.util.pair.NonnullPair; import com.apple.foundationdb.relational.api.exceptions.ErrorCode; import com.apple.foundationdb.relational.generated.RelationalLexer; @@ -536,6 +537,13 @@ public Object visitExecuteContinuationStatement(@Nonnull RelationalParser.Execut @Override public QueryPlan.LogicalQueryPlan visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeStatementContext ctx) { getDelegate().getPlanGenerationContext().setForExplain(ctx.EXPLAIN() != null); + if (!ctx.describeObjectClause().getTokens(RelationalLexer.VERBOSE).isEmpty()) { + getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.convert(ExplainLevel.VERBOSE)); + } else if (!ctx.describeObjectClause().getTokens(RelationalLexer.MINIMAL).isEmpty()) { + getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.convert(ExplainLevel.MINIMAL)); + } else { + getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.convert(ExplainLevel.DEFAULT)); + } final var logicalOperator = Assert.castUnchecked(ctx.describeObjectClause().accept(this), LogicalOperator.class); return QueryPlan.LogicalQueryPlan.of(logicalOperator.getQuantifier().getRangesOver().get(), getDelegate().getPlanGenerationContext(), "TODO"); } diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java index 5b0ca09ec6..bdf3f5d1b1 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java @@ -73,7 +73,7 @@ void explainResultSetMetadataTest() throws Exception { final var expectedContTypes = List.of(Types.BINARY, Types.INTEGER, Types.VARCHAR); try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { executeInsert(ddl); - try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN SELECT * FROM RestaurantComplexRecord")) { + try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN VERBOSE SELECT * FROM RestaurantComplexRecord")) { try (final RelationalResultSet resultSet = ps.executeQuery()) { final var actualMetadata = resultSet.getMetaData(); org.junit.jupiter.api.Assertions.assertEquals(expectedLabels.size(), actualMetadata.getColumnCount()); @@ -97,7 +97,7 @@ void explainResultSetMetadataTest() throws Exception { void explainWithNoContinuationTest() throws Exception { try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { executeInsert(ddl); - try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN SELECT * FROM RestaurantComplexRecord")) { + try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN MINIMAL SELECT * FROM RestaurantComplexRecord")) { ps.setMaxRows(2); try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); From d9eedc940efd3125dbd2d37c0c880e8435974494 Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Wed, 16 Jul 2025 20:53:19 -0500 Subject: [PATCH 02/13] Remove unused import --- .../recordlayer/query/MutablePlanGenerationContext.java | 1 - 1 file changed, 1 deletion(-) diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java index 63f087d224..e9703c3f8b 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java @@ -37,7 +37,6 @@ import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.relational.api.RelationalArray; import com.apple.foundationdb.relational.api.RelationalStruct; -import com.apple.foundationdb.relational.api.SqlTypeSupport; import com.apple.foundationdb.relational.api.exceptions.RelationalException; import com.apple.foundationdb.relational.recordlayer.metadata.DataTypeUtils; import com.apple.foundationdb.relational.util.Assert; From d02442c0f1abf6dcdd321a21955bfe2d228e4f7a Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Wed, 16 Jul 2025 22:58:42 -0500 Subject: [PATCH 03/13] Add explain level to NormalizedQueryExecutionContext --- .../relational/recordlayer/query/AstNormalizer.java | 9 +++++++++ .../query/NormalizedQueryExecutionContext.java | 13 ++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java index cac4c92964..5cc7d26f86 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java @@ -25,12 +25,14 @@ import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression; import com.apple.foundationdb.record.query.plan.cascades.typing.Type; import com.apple.foundationdb.record.query.plan.cascades.values.Value; +import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.relational.api.Options; import com.apple.foundationdb.relational.api.RelationalStruct; import com.apple.foundationdb.relational.api.exceptions.ErrorCode; import com.apple.foundationdb.relational.api.exceptions.RelationalException; import com.apple.foundationdb.relational.api.metadata.SchemaTemplate; import com.apple.foundationdb.relational.api.metrics.RelationalMetric; +import com.apple.foundationdb.relational.generated.RelationalLexer; import com.apple.foundationdb.relational.generated.RelationalParser; import com.apple.foundationdb.relational.generated.RelationalParserBaseVisitor; import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerInvokedRoutine; @@ -241,6 +243,13 @@ public Void visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeSta // (yhatem) this is probably not needed, since a cached physical plan _knows_ it is either forExplain or not. // we should remove this, but ok for now. queryHasherContextBuilder.setForExplain(ctx.EXPLAIN() != null); + if (!ctx.describeObjectClause().getTokens(RelationalLexer.VERBOSE).isEmpty()) { + queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.VERBOSE)); + } else if (!ctx.describeObjectClause().getTokens(RelationalLexer.MINIMAL).isEmpty()) { + queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.MINIMAL)); + } else { + queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.DEFAULT)); + } return visitChildren(ctx); } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java index b1286ed818..03744ec4fe 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java @@ -56,10 +56,12 @@ private NormalizedQueryExecutionContext(@Nonnull Literals literals, @Nullable byte[] continuation, int parameterHash, boolean isForExplain, + int explainLevel, @Nonnull final PlanHashable.PlanHashMode planHashMode) { this.literals = literals; this.continuation = continuation; this.isForExplain = isForExplain; + this.explainLevel = explainLevel; this.parameterHash = parameterHash; this.planHashMode = planHashMode; this.explainLevel = ExplainLevel.convert(ExplainLevel.DEFAULT); @@ -116,6 +118,8 @@ public static final class Builder { private boolean isForExplain; + private int explainLevel; + @Nullable private byte[] continuation; @@ -129,6 +133,7 @@ private Builder() { this.isForExplain = false; this.continuation = null; this.planHashMode = null; + this.explainLevel = ExplainLevel.DEFAULT.ordinal(); } @Nonnull @@ -155,6 +160,12 @@ public Builder setForExplain(boolean isForExplain) { return this; } + @Nonnull + public Builder setExplainLevel(int level) { + this.explainLevel = level; + return this; + } + @Nonnull public Builder setPlanHashMode(@Nonnull PlanHashable.PlanHashMode planHashMode) { this.planHashMode = planHashMode; @@ -164,7 +175,7 @@ public Builder setPlanHashMode(@Nonnull PlanHashable.PlanHashMode planHashMode) @Nonnull public NormalizedQueryExecutionContext build() { return new NormalizedQueryExecutionContext(literalsBuilder.build(), continuation, - parameterHash, isForExplain, + parameterHash, isForExplain, explainLevel, Objects.requireNonNull(planHashMode)); } } From a4a2ace236ff60407b6dab2f3867a8b4ee573537 Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Thu, 17 Jul 2025 16:13:46 -0500 Subject: [PATCH 04/13] Revert to version in main --- .idea/misc.xml | 12 ++---------- .idea/vcs.xml | 1 + 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 8f374499ac..014943bf2b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,15 +5,12 @@ - - - diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1ddfbb..830674470f 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file From e5624c8b92c4db8ca799895cf61606dacebd4993 Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Thu, 17 Jul 2025 16:21:10 -0500 Subject: [PATCH 05/13] Don't overwrite explainLevel --- .../recordlayer/query/NormalizedQueryExecutionContext.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java index 03744ec4fe..b3e58fa05a 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java @@ -64,7 +64,6 @@ private NormalizedQueryExecutionContext(@Nonnull Literals literals, this.explainLevel = explainLevel; this.parameterHash = parameterHash; this.planHashMode = planHashMode; - this.explainLevel = ExplainLevel.convert(ExplainLevel.DEFAULT); } @Nonnull @@ -133,7 +132,7 @@ private Builder() { this.isForExplain = false; this.continuation = null; this.planHashMode = null; - this.explainLevel = ExplainLevel.DEFAULT.ordinal(); + this.explainLevel = ExplainLevel.convert(ExplainLevel.DEFAULT); } @Nonnull From 96fdbd0db65ed74c5db3dcbd4299c3a9edc096c7 Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Thu, 17 Jul 2025 17:03:40 -0500 Subject: [PATCH 06/13] Override visitDescribeStatements instead of adding explainLevel to visitFullDescribeStatement --- .../relational/recordlayer/query/AstNormalizer.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java index 5cc7d26f86..9eb7bff23f 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java @@ -32,7 +32,6 @@ import com.apple.foundationdb.relational.api.exceptions.RelationalException; import com.apple.foundationdb.relational.api.metadata.SchemaTemplate; import com.apple.foundationdb.relational.api.metrics.RelationalMetric; -import com.apple.foundationdb.relational.generated.RelationalLexer; import com.apple.foundationdb.relational.generated.RelationalParser; import com.apple.foundationdb.relational.generated.RelationalParserBaseVisitor; import com.apple.foundationdb.relational.recordlayer.metadata.RecordLayerInvokedRoutine; @@ -243,9 +242,14 @@ public Void visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeSta // (yhatem) this is probably not needed, since a cached physical plan _knows_ it is either forExplain or not. // we should remove this, but ok for now. queryHasherContextBuilder.setForExplain(ctx.EXPLAIN() != null); - if (!ctx.describeObjectClause().getTokens(RelationalLexer.VERBOSE).isEmpty()) { + return visitChildren(ctx); + } + + @Override + public Void visitDescribeStatements(@Nonnull RelationalParser.DescribeStatementsContext ctx) { + if (ctx.VERBOSE() != null) { queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.VERBOSE)); - } else if (!ctx.describeObjectClause().getTokens(RelationalLexer.MINIMAL).isEmpty()) { + } else if (ctx.MINIMAL() != null) { queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.MINIMAL)); } else { queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.DEFAULT)); From b62e176908cc6c6f9b8c853f5caf333fa1b6cbd2 Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Fri, 18 Jul 2025 18:54:09 -0500 Subject: [PATCH 07/13] Added tests for explains --- .../cascades/explain/ExplainPlanVisitor.java | 8 +++ .../recordlayer/query/QueryPlan.java | 2 +- .../recordlayer/query/ExplainTests.java | 56 ++++++++++++++++++- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java index 0edb72c532..09c25bdcce 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java @@ -722,6 +722,14 @@ public static String toStringForExternalExplain(@Nonnull final RecordQueryPlan p return toStringForExternalExplain(plan, ExplainLevel.ALL_DETAILS, Integer.MAX_VALUE); } + @Nonnull + public static String toStringForExternalExplain(@Nonnull final RecordQueryPlan plan, final int explainLevel) { + final var visitor = new ExplainPlanVisitor(Integer.MAX_VALUE); + final var explainTokens = visitor.visit(plan); + return explainTokens.render(explainLevel, new DefaultExplainFormatter(ExplainSelfContainedSymbolMap::new), explainTokens.getMaxLength(explainLevel)) + .toString(); + } + @Nonnull public static String toStringForExternalExplain(@Nonnull final RecordQueryPlan plan, final int maxExplainLevel, final int maxSize) { diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java index 1a76ae74b1..c2ccd2ed2c 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java @@ -200,7 +200,7 @@ public PhysicalQueryPlan withExecutionContext(@Nonnull final QueryExecutionConte public String explain() { final var executeProperties = queryExecutionContext.getExecutionPropertiesBuilder(); List explainComponents = new ArrayList<>(); - explainComponents.add(ExplainPlanVisitor.toStringForExternalExplain(recordQueryPlan, queryExecutionContext.getExplainLevel(), Integer.MAX_VALUE)); + explainComponents.add(ExplainPlanVisitor.toStringForExternalExplain(recordQueryPlan, queryExecutionContext.getExplainLevel())); if (executeProperties.getReturnedRowLimit() != ReadTransaction.ROW_LIMIT_UNLIMITED) { explainComponents.add("(limit=" + executeProperties.getReturnedRowLimit() + ")"); } diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java index bdf3f5d1b1..116698908d 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java @@ -97,7 +97,7 @@ void explainResultSetMetadataTest() throws Exception { void explainWithNoContinuationTest() throws Exception { try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { executeInsert(ddl); - try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN MINIMAL SELECT * FROM RestaurantComplexRecord")) { + try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN SELECT * FROM RestaurantComplexRecord")) { ps.setMaxRows(2); try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); @@ -205,6 +205,60 @@ void explainExecuteStatementTest() throws Exception { } } + @Test + void explainVerboseTest() throws Exception { + try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { + executeInsert(ddl); + try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN VERBOSE SELECT * FROM RestaurantComplexRecord where COUNT(reviews) > 3 and COUNT(reviews) < 100")) { + ps.setMaxRows(2); + try (final RelationalResultSet resultSet = ps.executeQuery()) { + final var assertResult = ResultSetAssert.assertThat(resultSet); + assertResult.hasNextRow() + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>) | FILTER count_star(*) GREATER_THAN promote(@c12 AS LONG) AND count_star(*) LESS_THAN promote(@c19 AS LONG)") + .hasColumn("PLAN_HASH", -1697137247L) + .hasColumn("PLAN_CONTINUATION", null); + assertResult.hasNoNextRow(); + } + } + } + } + + @Test + void explainMinimalTest() throws Exception { + try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { + executeInsert(ddl); + try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN MINIMAL SELECT * FROM RestaurantComplexRecord where COUNT(reviews) > 3 and COUNT(reviews) < 100")) { + ps.setMaxRows(2); + try (final RelationalResultSet resultSet = ps.executeQuery()) { + final var assertResult = ResultSetAssert.assertThat(resultSet); + assertResult.hasNextRow() + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX) | FILTER count_star(*) GREATER_THAN promote(@c12 AS LONG) AND count_star(*) LESS_THAN promote(@c19 AS LONG)") + .hasColumn("PLAN_HASH", -1697137247L) + .hasColumn("PLAN_CONTINUATION", null); + assertResult.hasNoNextRow(); + } + } + } + } + + @Test + void explainDefaultTest() throws Exception { + try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { + executeInsert(ddl); + try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN SELECT * FROM RestaurantComplexRecord where COUNT(reviews) > 3 and COUNT(reviews) < 100")) { + ps.setMaxRows(2); + try (final RelationalResultSet resultSet = ps.executeQuery()) { + final var assertResult = ResultSetAssert.assertThat(resultSet); + assertResult.hasNextRow() + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>) | FILTER count_star(*) GREATER_THAN promote(@c11 AS LONG) AND count_star(*) LESS_THAN promote(@c18 AS LONG)") + .hasColumn("PLAN_HASH", -1697137247L) + .hasColumn("PLAN_CONTINUATION", null); + assertResult.hasNoNextRow(); + } + } + } + } + private Continuation consumeResultAndGetContinuation(RelationalPreparedStatement ps, int numRows) throws SQLException { Continuation continuation; try (final RelationalResultSet resultSet = ps.executeQuery()) { From c8b54b2a3af7fd7ecf5a06994965774de2ee504e Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Wed, 23 Jul 2025 14:23:15 -0500 Subject: [PATCH 08/13] Changes suggested by Norman --- .../query/plan/explain/ExplainLevel.java | 28 ++++--------------- .../src/main/antlr/RelationalLexer.g4 | 4 ++- .../recordlayer/query/AstNormalizer.java | 6 ++-- .../query/MutablePlanGenerationContext.java | 2 +- .../NormalizedQueryExecutionContext.java | 2 +- .../query/visitors/QueryVisitor.java | 6 ++-- 6 files changed, 17 insertions(+), 31 deletions(-) diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java index efe0e2298c..448ae8f138 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/explain/ExplainLevel.java @@ -20,41 +20,25 @@ package com.apple.foundationdb.record.query.plan.explain; -import java.util.Objects; - /** * Explain level. Adjusts the granularity of explain output. */ -public enum ExplainLevel { - VERBOSE(0), - DEFAULT(1), - MINIMAL(2); - +public final class ExplainLevel { /** * Everything we can render is rendered. */ - public static final int ALL_DETAILS = VERBOSE.ordinal(); + public static final int ALL_DETAILS = 0; /** * Nice to have details are rendered, other details not absolutely needed for the understanding of the plan * are omitted. */ - public static final int SOME_DETAILS = DEFAULT.ordinal(); + public static final int SOME_DETAILS = 1; /** * Only the structure of the plan, i.e. the plan operators and their relationship is rendered. */ - public static final int STRUCTURE = MINIMAL.ordinal(); - - private final int details; - - ExplainLevel(int details) { - this.details = details; - } - - public int getDetails() { - return details; - } + public static final int STRUCTURE = 2; - public static int convert(final ExplainLevel explainLevel) { - return Objects.requireNonNullElse(explainLevel, DEFAULT).ordinal(); + private ExplainLevel() { + // nothing } } diff --git a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 index a784f90129..438cc9b390 100644 --- a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 +++ b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 @@ -1348,8 +1348,10 @@ fragment INT_TYPE_MODIFIER: ('I' | 'i'); fragment LONG_TYPE_MODIFIER: ('L' | 'l'); fragment DECIMAL_TYPE_MODIFIER: (INT_TYPE_MODIFIER | LONG_TYPE_MODIFIER); + + // Last tokens must generate Errors ERROR_RECOGNITION : . { this.notifyListeners(new LexerNoViableAltException(this, _input, _tokenStartCharIndex, null)); } - ; + ; \ No newline at end of file diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java index 9eb7bff23f..6d63cad78f 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java @@ -248,11 +248,11 @@ public Void visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeSta @Override public Void visitDescribeStatements(@Nonnull RelationalParser.DescribeStatementsContext ctx) { if (ctx.VERBOSE() != null) { - queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.VERBOSE)); + queryHasherContextBuilder.setExplainLevel(ExplainLevel.ALL_DETAILS); } else if (ctx.MINIMAL() != null) { - queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.MINIMAL)); + queryHasherContextBuilder.setExplainLevel(ExplainLevel.STRUCTURE); } else { - queryHasherContextBuilder.setExplainLevel(ExplainLevel.convert(ExplainLevel.DEFAULT)); + queryHasherContextBuilder.setExplainLevel(ExplainLevel.SOME_DETAILS); } return visitChildren(ctx); } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java index e9703c3f8b..f736861640 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java @@ -262,7 +262,7 @@ public MutablePlanGenerationContext(@Nonnull PreparedParams preparedParams, constantObjectValues = new LinkedList<>(); shouldProcessLiteral = true; forExplain = false; - this.explainLevel = ExplainLevel.convert(ExplainLevel.DEFAULT); + this.explainLevel = ExplainLevel.SOME_DETAILS; setContinuation(null); equalityConstraints = ImmutableList.builder(); } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java index b3e58fa05a..eac72bbda7 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java @@ -132,7 +132,7 @@ private Builder() { this.isForExplain = false; this.continuation = null; this.planHashMode = null; - this.explainLevel = ExplainLevel.convert(ExplainLevel.DEFAULT); + this.explainLevel = ExplainLevel.SOME_DETAILS; } @Nonnull diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java index a5c4ef0cd0..49b45d308e 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java @@ -538,11 +538,11 @@ public Object visitExecuteContinuationStatement(@Nonnull RelationalParser.Execut public QueryPlan.LogicalQueryPlan visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeStatementContext ctx) { getDelegate().getPlanGenerationContext().setForExplain(ctx.EXPLAIN() != null); if (!ctx.describeObjectClause().getTokens(RelationalLexer.VERBOSE).isEmpty()) { - getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.convert(ExplainLevel.VERBOSE)); + getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.ALL_DETAILS); } else if (!ctx.describeObjectClause().getTokens(RelationalLexer.MINIMAL).isEmpty()) { - getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.convert(ExplainLevel.MINIMAL)); + getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.STRUCTURE); } else { - getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.convert(ExplainLevel.DEFAULT)); + getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.SOME_DETAILS); } final var logicalOperator = Assert.castUnchecked(ctx.describeObjectClause().accept(this), LogicalOperator.class); return QueryPlan.LogicalQueryPlan.of(logicalOperator.getQuantifier().getRangesOver().get(), getDelegate().getPlanGenerationContext(), "TODO"); From 7a3d4cb5a249e4597c26f718b01e384d018bda58 Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Thu, 7 Aug 2025 10:13:42 -0500 Subject: [PATCH 09/13] Explain supports two options - VERBOSE or default --- .../cascades/explain/ExplainPlanVisitor.java | 3 +- .../src/main/antlr/RelationalLexer.g4 | 1 - .../src/main/antlr/RelationalParser.g4 | 2 +- .../recordlayer/query/AstNormalizer.java | 9 +----- .../query/MutablePlanGenerationContext.java | 13 ++++---- .../NormalizedQueryExecutionContext.java | 21 +++++++------ .../query/QueryExecutionContext.java | 2 +- .../recordlayer/query/QueryPlan.java | 2 +- .../query/visitors/QueryVisitor.java | 7 ++--- .../recordlayer/query/ExplainTests.java | 30 ++++--------------- 10 files changed, 30 insertions(+), 60 deletions(-) diff --git a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java index 09c25bdcce..67efaca724 100644 --- a/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java +++ b/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/explain/ExplainPlanVisitor.java @@ -723,9 +723,10 @@ public static String toStringForExternalExplain(@Nonnull final RecordQueryPlan p } @Nonnull - public static String toStringForExternalExplain(@Nonnull final RecordQueryPlan plan, final int explainLevel) { + public static String toStringForExternalExplain(@Nonnull final RecordQueryPlan plan, final boolean isVerboseExplainLevel) { final var visitor = new ExplainPlanVisitor(Integer.MAX_VALUE); final var explainTokens = visitor.visit(plan); + final var explainLevel = isVerboseExplainLevel ? ExplainLevel.ALL_DETAILS : ExplainLevel.STRUCTURE; return explainTokens.render(explainLevel, new DefaultExplainFormatter(ExplainSelfContainedSymbolMap::new), explainTokens.getMaxLength(explainLevel)) .toString(); } diff --git a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 index 438cc9b390..ca49071d68 100644 --- a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 +++ b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 @@ -147,7 +147,6 @@ MASTER_BIND: 'MASTER_BIND'; MASTER_SSL_VERIFY_SERVER_CERT: 'MASTER_SSL_VERIFY_SERVER_CERT'; MATCH: 'MATCH'; MAXVALUE: 'MAXVALUE'; -MINIMAL: 'MINIMAL'; MODIFIES: 'MODIFIES'; NATURAL: 'NATURAL'; NOT: 'NOT'; diff --git a/fdb-relational-core/src/main/antlr/RelationalParser.g4 b/fdb-relational-core/src/main/antlr/RelationalParser.g4 index 7666022861..fcd59c6444 100644 --- a/fdb-relational-core/src/main/antlr/RelationalParser.g4 +++ b/fdb-relational-core/src/main/antlr/RelationalParser.g4 @@ -645,7 +645,7 @@ helpStatement // details describeObjectClause - : level=(VERBOSE | MINIMAL)? + : (VERBOSE)? ( query | deleteStatement | insertStatement | updateStatement | executeContinuationStatement diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java index 6d63cad78f..0ae202d625 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/AstNormalizer.java @@ -25,7 +25,6 @@ import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression; import com.apple.foundationdb.record.query.plan.cascades.typing.Type; import com.apple.foundationdb.record.query.plan.cascades.values.Value; -import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.relational.api.Options; import com.apple.foundationdb.relational.api.RelationalStruct; import com.apple.foundationdb.relational.api.exceptions.ErrorCode; @@ -247,13 +246,7 @@ public Void visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeSta @Override public Void visitDescribeStatements(@Nonnull RelationalParser.DescribeStatementsContext ctx) { - if (ctx.VERBOSE() != null) { - queryHasherContextBuilder.setExplainLevel(ExplainLevel.ALL_DETAILS); - } else if (ctx.MINIMAL() != null) { - queryHasherContextBuilder.setExplainLevel(ExplainLevel.STRUCTURE); - } else { - queryHasherContextBuilder.setExplainLevel(ExplainLevel.SOME_DETAILS); - } + queryHasherContextBuilder.setIsVerboseExplainLevel(ctx.VERBOSE() != null); return visitChildren(ctx); } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java index f736861640..4e20b4d331 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/MutablePlanGenerationContext.java @@ -34,7 +34,6 @@ import com.apple.foundationdb.record.query.plan.cascades.values.LiteralValue; import com.apple.foundationdb.record.query.plan.cascades.values.OfTypeValue; import com.apple.foundationdb.record.query.plan.cascades.values.Value; -import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.relational.api.RelationalArray; import com.apple.foundationdb.relational.api.RelationalStruct; import com.apple.foundationdb.relational.api.exceptions.RelationalException; @@ -88,7 +87,7 @@ public class MutablePlanGenerationContext implements QueryExecutionContext { private boolean forExplain; - private int explainLevel; + private boolean isVerboseExplainLevel; @Nullable private byte[] continuation; @@ -262,7 +261,7 @@ public MutablePlanGenerationContext(@Nonnull PreparedParams preparedParams, constantObjectValues = new LinkedList<>(); shouldProcessLiteral = true; forExplain = false; - this.explainLevel = ExplainLevel.SOME_DETAILS; + isVerboseExplainLevel = false; setContinuation(null); equalityConstraints = ImmutableList.builder(); } @@ -339,8 +338,8 @@ public boolean isForExplain() { } @Override - public int getExplainLevel() { - return explainLevel; + public boolean isVerboseExplainLevel() { + return isVerboseExplainLevel; } @Nonnull @@ -378,8 +377,8 @@ public void setForExplain(boolean forExplain) { this.forExplain = forExplain; } - public void setExplainLevel(final int explainLevel) { - this.explainLevel = explainLevel; + public void setIsVerboseExplainLevel(boolean isVerboseExplainLevel) { + this.isVerboseExplainLevel = isVerboseExplainLevel; } @Nonnull diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java index eac72bbda7..bc09144f0f 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/NormalizedQueryExecutionContext.java @@ -24,7 +24,6 @@ import com.apple.foundationdb.record.ExecuteProperties; import com.apple.foundationdb.record.PlanHashable; -import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.relational.util.SpotBugsSuppressWarnings; import javax.annotation.Nonnull; @@ -45,7 +44,7 @@ public final class NormalizedQueryExecutionContext implements QueryExecutionCont private final boolean isForExplain; - private int explainLevel; + private final boolean isVerboseExplainLevel; private final int parameterHash; @@ -56,12 +55,12 @@ private NormalizedQueryExecutionContext(@Nonnull Literals literals, @Nullable byte[] continuation, int parameterHash, boolean isForExplain, - int explainLevel, + boolean isVerboseExplainLevel, @Nonnull final PlanHashable.PlanHashMode planHashMode) { this.literals = literals; this.continuation = continuation; this.isForExplain = isForExplain; - this.explainLevel = explainLevel; + this.isVerboseExplainLevel = isVerboseExplainLevel; this.parameterHash = parameterHash; this.planHashMode = planHashMode; } @@ -96,8 +95,8 @@ public boolean isForExplain() { } @Override - public int getExplainLevel() { - return explainLevel; + public boolean isVerboseExplainLevel() { + return isVerboseExplainLevel; } @Nonnull @@ -117,7 +116,7 @@ public static final class Builder { private boolean isForExplain; - private int explainLevel; + private boolean isVerboseExplainLevel; @Nullable private byte[] continuation; @@ -132,7 +131,7 @@ private Builder() { this.isForExplain = false; this.continuation = null; this.planHashMode = null; - this.explainLevel = ExplainLevel.SOME_DETAILS; + this.isVerboseExplainLevel = false; } @Nonnull @@ -160,8 +159,8 @@ public Builder setForExplain(boolean isForExplain) { } @Nonnull - public Builder setExplainLevel(int level) { - this.explainLevel = level; + public Builder setIsVerboseExplainLevel(boolean isVerboseExplainLevel) { + this.isVerboseExplainLevel = isVerboseExplainLevel; return this; } @@ -174,7 +173,7 @@ public Builder setPlanHashMode(@Nonnull PlanHashable.PlanHashMode planHashMode) @Nonnull public NormalizedQueryExecutionContext build() { return new NormalizedQueryExecutionContext(literalsBuilder.build(), continuation, - parameterHash, isForExplain, explainLevel, + parameterHash, isForExplain, isVerboseExplainLevel, Objects.requireNonNull(planHashMode)); } } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java index b9129e06fe..90095f15d0 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryExecutionContext.java @@ -60,7 +60,7 @@ default EvaluationContext getEvaluationContext() { boolean isForExplain(); // todo (yhatem) remove. - int getExplainLevel(); + boolean isVerboseExplainLevel(); @Nonnull PlanHashable.PlanHashMode getPlanHashMode(); diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java index c2ccd2ed2c..6171e9a518 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/QueryPlan.java @@ -200,7 +200,7 @@ public PhysicalQueryPlan withExecutionContext(@Nonnull final QueryExecutionConte public String explain() { final var executeProperties = queryExecutionContext.getExecutionPropertiesBuilder(); List explainComponents = new ArrayList<>(); - explainComponents.add(ExplainPlanVisitor.toStringForExternalExplain(recordQueryPlan, queryExecutionContext.getExplainLevel())); + explainComponents.add(ExplainPlanVisitor.toStringForExternalExplain(recordQueryPlan, queryExecutionContext.isVerboseExplainLevel())); if (executeProperties.getReturnedRowLimit() != ReadTransaction.ROW_LIMIT_UNLIMITED) { explainComponents.add("(limit=" + executeProperties.getReturnedRowLimit() + ")"); } diff --git a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java index 49b45d308e..27ba50e58c 100644 --- a/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java +++ b/fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/visitors/QueryVisitor.java @@ -33,7 +33,6 @@ import com.apple.foundationdb.record.query.plan.cascades.values.FieldValue; import com.apple.foundationdb.record.query.plan.cascades.values.LiteralValue; import com.apple.foundationdb.record.query.plan.cascades.values.Value; -import com.apple.foundationdb.record.query.plan.explain.ExplainLevel; import com.apple.foundationdb.record.util.pair.NonnullPair; import com.apple.foundationdb.relational.api.exceptions.ErrorCode; import com.apple.foundationdb.relational.generated.RelationalLexer; @@ -538,11 +537,9 @@ public Object visitExecuteContinuationStatement(@Nonnull RelationalParser.Execut public QueryPlan.LogicalQueryPlan visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeStatementContext ctx) { getDelegate().getPlanGenerationContext().setForExplain(ctx.EXPLAIN() != null); if (!ctx.describeObjectClause().getTokens(RelationalLexer.VERBOSE).isEmpty()) { - getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.ALL_DETAILS); - } else if (!ctx.describeObjectClause().getTokens(RelationalLexer.MINIMAL).isEmpty()) { - getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.STRUCTURE); + getDelegate().getPlanGenerationContext().setIsVerboseExplainLevel(true); } else { - getDelegate().getPlanGenerationContext().setExplainLevel(ExplainLevel.SOME_DETAILS); + getDelegate().getPlanGenerationContext().setIsVerboseExplainLevel(false); } final var logicalOperator = Assert.castUnchecked(ctx.describeObjectClause().accept(this), LogicalOperator.class); return QueryPlan.LogicalQueryPlan.of(logicalOperator.getQuantifier().getRangesOver().get(), getDelegate().getPlanGenerationContext(), "TODO"); diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java index 116698908d..0678acd15e 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java @@ -73,7 +73,7 @@ void explainResultSetMetadataTest() throws Exception { final var expectedContTypes = List.of(Types.BINARY, Types.INTEGER, Types.VARCHAR); try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { executeInsert(ddl); - try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN VERBOSE SELECT * FROM RestaurantComplexRecord")) { + try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN SELECT * FROM RestaurantComplexRecord")) { try (final RelationalResultSet resultSet = ps.executeQuery()) { final var actualMetadata = resultSet.getMetaData(); org.junit.jupiter.api.Assertions.assertEquals(expectedLabels.size(), actualMetadata.getColumnCount()); @@ -102,7 +102,7 @@ void explainWithNoContinuationTest() throws Exception { try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() - .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>)") + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") .hasColumn("PLAN_HASH", -1635569052L) .hasColumn("PLAN_CONTINUATION", null); assertResult.hasNoNextRow(); @@ -128,7 +128,7 @@ void explainWithContinuationNoSerializedPlanTest() throws Exception { try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() - .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>)") + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") .hasColumn("PLAN_HASH", -1635569052L); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); @@ -159,7 +159,7 @@ void explainWithContinuationSerializedPlanTest() throws Exception { try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() - .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>)") + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") .hasColumn("PLAN_HASH", -1635569052L); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); @@ -190,7 +190,7 @@ void explainExecuteStatementTest() throws Exception { try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() - .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>)") + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") .hasColumn("PLAN_HASH", -1635569052L); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); @@ -223,24 +223,6 @@ void explainVerboseTest() throws Exception { } } - @Test - void explainMinimalTest() throws Exception { - try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { - executeInsert(ddl); - try (RelationalPreparedStatement ps = ddl.setSchemaAndGetConnection().prepareStatement("EXPLAIN MINIMAL SELECT * FROM RestaurantComplexRecord where COUNT(reviews) > 3 and COUNT(reviews) < 100")) { - ps.setMaxRows(2); - try (final RelationalResultSet resultSet = ps.executeQuery()) { - final var assertResult = ResultSetAssert.assertThat(resultSet); - assertResult.hasNextRow() - .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX) | FILTER count_star(*) GREATER_THAN promote(@c12 AS LONG) AND count_star(*) LESS_THAN promote(@c19 AS LONG)") - .hasColumn("PLAN_HASH", -1697137247L) - .hasColumn("PLAN_CONTINUATION", null); - assertResult.hasNoNextRow(); - } - } - } - } - @Test void explainDefaultTest() throws Exception { try (var ddl = Ddl.builder().database(URI.create("/TEST/QT")).relationalExtension(relationalExtension).schemaTemplate(schemaTemplate).build()) { @@ -250,7 +232,7 @@ void explainDefaultTest() throws Exception { try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() - .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>) | FILTER count_star(*) GREATER_THAN promote(@c11 AS LONG) AND count_star(*) LESS_THAN promote(@c18 AS LONG)") + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX) | FILTER count_star(*) GREATER_THAN promote(@c11 AS LONG) AND count_star(*) LESS_THAN promote(@c18 AS LONG)") .hasColumn("PLAN_HASH", -1697137247L) .hasColumn("PLAN_CONTINUATION", null); assertResult.hasNoNextRow(); From 6b9ee1b00056f8ebfd7b40354a9a354fd4a3625a Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Wed, 27 Aug 2025 06:26:21 -0500 Subject: [PATCH 10/13] Fix tests related to explain queries - the default explain now returns plan structure instead of verbose plans --- .../recordlayer/QueryLoggingTest.java | 4 ++-- .../recordlayer/query/GroupByQueryTests.java | 4 ++-- .../recordlayer/query/StandardQueryTests.java | 4 ++-- .../query/TransactionBoundQueryTest.java | 24 +++++++++---------- gradle/check.gradle | 4 ++-- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/QueryLoggingTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/QueryLoggingTest.java index 00f82ff89d..0d29b5cd56 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/QueryLoggingTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/QueryLoggingTest.java @@ -245,7 +245,7 @@ void testRelationalConnectionSetLogIsOverriddenByExecuteContinuationQueryOption( rs.next(); } Assertions.assertThat(logAppender.getLogEvents()).isNotEmpty(); - Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("plan=\"COVERING(RECORD_TYPE_COVERING <,> -> [NAME: VALUE[0], REST_NO: KEY[0]]) | MAP (_.NAME AS NAME)\""); + Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("plan=\"COVERING(RECORD_TYPE_COVERING) | MAP (_.NAME AS NAME)\""); } } } @@ -276,7 +276,7 @@ void testRelationalConnectionSetLogWithExecuteContinuation(boolean setLogging) t Assertions.assertThat(logAppender.getLogEvents()).isEmpty(); } else { Assertions.assertThat(logAppender.getLogEvents()).isNotEmpty(); - Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("plan=\"COVERING(RECORD_TYPE_COVERING <,> -> [NAME: VALUE[0], REST_NO: KEY[0]]) | MAP (_.NAME AS NAME)\""); + Assertions.assertThat(logAppender.getLastLogEventMessage()).contains("plan=\"COVERING(RECORD_TYPE_COVERING) | MAP (_.NAME AS NAME)\""); } } } diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/GroupByQueryTests.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/GroupByQueryTests.java index dbfecd2744..9e5897b762 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/GroupByQueryTests.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/GroupByQueryTests.java @@ -185,12 +185,12 @@ void isNullPredicateUsesGroupIndex() throws Exception { Assertions.assertTrue(statement.execute("EXPLAIN SELECT sum(c) FROM T1 WHERE a is null"), "Did not return a result set from a select statement!"); try (final RelationalResultSet resultSet = statement.getResultSet()) { ResultSetAssert.assertThat(resultSet).hasNextRow() - .hasColumn("PLAN", "AISCAN(SUM_IDX [[null],[null]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)"); + .hasColumn("PLAN", "AISCAN(SUM_IDX -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)"); } Assertions.assertTrue(statement.execute("EXPLAIN SELECT sum(c) FROM T1 WHERE a = 1"), "Did not return a result set from a select statement!"); try (final RelationalResultSet resultSet = statement.getResultSet()) { ResultSetAssert.assertThat(resultSet).hasNextRow() - .hasColumn("PLAN", "AISCAN(SUM_IDX [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)"); + .hasColumn("PLAN", "AISCAN(SUM_IDX -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)"); } } } diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/StandardQueryTests.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/StandardQueryTests.java index b85953e5ac..a9a620f33f 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/StandardQueryTests.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/StandardQueryTests.java @@ -233,7 +233,7 @@ void explainTableScan() throws Exception { try (final RelationalResultSet resultSet = statement.executeQuery("EXPLAIN SELECT * FROM RestaurantComplexRecord WHERE rest_no > 10")) { resultSet.next(); String plan = resultSet.getString(1); - assertThat(plan).matches("(.*SCAN.*RESTAURANTCOMPLEXRECORD|.*COVERING.* <,>).*REST_NO GREATER_THAN promote\\(@c8 AS LONG\\).*"); + assertThat(plan).matches("(.*RESTAURANTCOMPLEXRECORD|.*COVERING.*).*REST_NO GREATER_THAN promote\\(@c8 AS LONG\\).*"); } } } @@ -259,7 +259,7 @@ void explainUnhintedIndexScan() throws Exception { try (final RelationalResultSet resultSet = statement.executeQuery("EXPLAIN SELECT * FROM RestaurantComplexRecord AS R WHERE EXISTS (SELECT * FROM R.reviews AS RE WHERE RE.rating >= 9)")) { resultSet.next(); String plan = resultSet.getString(1); - assertThat(plan).matches(".*ISCAN.*MV1.*\\[\\[GREATER_THAN_OR_EQUALS promote\\(@c24 AS LONG\\)\\]\\].*"); + assertThat(plan).matches(".*ISCAN.*MV1.*"); } } } diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/TransactionBoundQueryTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/TransactionBoundQueryTest.java index d3f9844ff7..c1b2847dab 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/TransactionBoundQueryTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/TransactionBoundQueryTest.java @@ -314,7 +314,7 @@ void addUniversalCountWithGrouping() throws SQLException, RelationalException { .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) .doesNotContain(countIndexName) - .contains("ISCAN(" + valueIndexName); + .contains("ISCAN(" + valueIndexName + ")"); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -345,7 +345,7 @@ void addUniversalCountWithGroupingAndFilter() throws SQLException, RelationalExc .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) .doesNotContain(countIndex) - .contains("ISCAN(" + valueIndexName + " [EQUALS "); + .contains("ISCAN(" + valueIndexName + ")"); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -374,7 +374,7 @@ void countByAdditionIndex() throws SQLException, RelationalException { RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countIndexName + " <,> BY_GROUP"); + .contains("AISCAN(" + countIndexName); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -448,7 +448,7 @@ void countAndFilterOnAdditionIndex() throws SQLException, RelationalException { RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countIndexName + " [EQUALS "); + .contains("AISCAN(" + countIndexName + " -> "); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -509,7 +509,7 @@ void countByAdditionGroupWithFilterOnOtherColumn(String orderingSuffix) throws S RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countIndexName + " [EQUALS "); + .contains("AISCAN(" + countIndexName + " -> "); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -600,7 +600,7 @@ void countByEMask2(boolean maskAsParam) throws SQLException, RelationalException RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countIndexName + " <,> BY_GROUP"); + .contains("AISCAN(" + countIndexName + " -> "); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -674,7 +674,7 @@ void countAndFilterOnMaskIndex(boolean maskAsParam, boolean asHaving) throws SQL RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countIndexName + " [EQUALS "); + .contains("AISCAN(" + countIndexName + " -> "); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -736,7 +736,7 @@ void countWithInsAndMask() throws SQLException, RelationalException { RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countIndexName + " [EQUALS "); + .contains("AISCAN(" + countIndexName + " -> "); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -789,7 +789,7 @@ void doNotUseCachedValuePlanWithIncorrectMask() throws SQLException, RelationalE RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("ISCAN(" + fBy2IndexName + " [[GREATER_THAN "); + .contains("ISCAN(" + fBy2IndexName + ")"); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -799,7 +799,7 @@ void doNotUseCachedValuePlanWithIncorrectMask() throws SQLException, RelationalE RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("ISCAN(" + fBy4IndexName + " [[GREATER_THAN "); + .contains("ISCAN(" + fBy4IndexName + ")"); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -836,7 +836,7 @@ void doNotUseCachedCountPlanWithIncorrectMask() throws SQLException, RelationalE RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countFBy2IndexName + " [[GREATER_THAN "); + .contains("AISCAN(" + countFBy2IndexName + " -> "); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } @@ -846,7 +846,7 @@ void doNotUseCachedCountPlanWithIncorrectMask() throws SQLException, RelationalE RelationalResultSetAssert.assertThat(resultSet) .hasNextRow(); Assertions.assertThat(resultSet.getString("plan")) - .contains("AISCAN(" + countFBy4IndexName + " [[GREATER_THAN "); + .contains("AISCAN(" + countFBy4IndexName + " -> "); RelationalResultSetAssert.assertThat(resultSet) .hasNoNextRow(); } diff --git a/gradle/check.gradle b/gradle/check.gradle index 0d6b702e75..9d9f214e8b 100644 --- a/gradle/check.gradle +++ b/gradle/check.gradle @@ -97,8 +97,8 @@ tasks.withType(rootProject.SpotBugsTask) { task -> if (project.hasProperty('spotbugsEnableHtmlReport')) { // SpotBugs task can only have one report type enabled at a time reports { - xml.enabled false - html.enabled true + xml.enabled = false + html.enabled = true } } else { task.finalizedBy printInstructionsOnRunningWithHtmlOutput From e5c06e0a7933a0816a2b50b766475cc643686adb Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Sun, 31 Aug 2025 06:28:10 -0500 Subject: [PATCH 11/13] Updated tests to support EXPLAIN and EXPLAIN VERBOSE - currently the ExplainConfig decorates the query with EXPLAIN. To add tests for EXPLAIN VERBOSE, we should add another config (ExplainVerboseConfig) and decorate the query with EXPLAIN VERBOSE. The test block should also be extendended to support explainVerbose:. --- .../resources/aggregate-empty-table.yamsql | 100 +++++++------- .../aggregate-index-tests-count-empty.yamsql | 16 +-- .../aggregate-index-tests-count.yamsql | 16 +-- .../resources/aggregate-index-tests.yamsql | 126 +++++++++--------- yaml-tests/src/test/resources/between.yamsql | 6 +- .../resources/bitmap-aggregate-index.yamsql | 12 +- yaml-tests/src/test/resources/catalog.yamsql | 4 +- .../src/test/resources/create-drop.yamsql | 2 +- yaml-tests/src/test/resources/cte.yamsql | 8 +- .../aggregate-empty-table.yamsql | 100 +++++++------- .../aggregate-index-tests-count-empty.yamsql | 16 +-- .../aggregate-index-tests-count.yamsql | 16 +-- .../aggregate-index-tests.yamsql | 126 +++++++++--------- .../disabled-planner-rewrites/between.yamsql | 6 +- .../bitmap-aggregate-index.yamsql | 14 +- .../disabled-planner-rewrites/catalog.yamsql | 4 +- .../create-drop.yamsql | 2 +- .../disabled-planner-rewrites/cte.yamsql | 2 +- .../groupby-tests.yamsql | 22 +-- .../indexed-functions.yamsql | 12 +- .../nested-with-nulls.yamsql | 58 ++++---- .../null-operator-tests.yamsql | 2 +- .../disabled-planner-rewrites/orderby.yamsql | 10 +- .../recursive-cte.yamsql | 10 +- .../select-a-star.yamsql | 6 +- .../sparse-index-tests.yamsql | 30 ++--- .../sql-functions.yamsql | 54 ++++---- .../standard-tests.yamsql | 36 ++--- .../subquery-tests.yamsql | 8 +- .../union-empty-tables.yamsql | 2 +- .../disabled-planner-rewrites/union.yamsql | 8 +- .../disabled-planner-rewrites/uuid.yamsql | 10 +- .../versions-tests.yamsql | 26 ++-- .../src/test/resources/distinct-from.yamsql | 24 ++-- .../src/test/resources/groupby-tests.yamsql | 16 +-- .../test/resources/indexed-functions.yamsql | 12 +- yaml-tests/src/test/resources/like.yamsql | 18 +-- .../test/resources/nested-with-nulls.yamsql | 58 ++++---- .../resources/null-extraction-tests.yamsql | 24 ++-- .../test/resources/null-operator-tests.yamsql | 2 +- yaml-tests/src/test/resources/orderby.yamsql | 10 +- .../src/test/resources/recursive-cte.yamsql | 10 +- .../src/test/resources/select-a-star.yamsql | 6 +- .../test/resources/sparse-index-tests.yamsql | 30 ++--- .../src/test/resources/sql-functions.yamsql | 54 ++++---- .../src/test/resources/standard-tests.yamsql | 36 ++--- .../src/test/resources/subquery-tests.yamsql | 8 +- .../test/resources/union-empty-tables.yamsql | 2 +- yaml-tests/src/test/resources/union.yamsql | 8 +- yaml-tests/src/test/resources/uuid.yamsql | 10 +- .../src/test/resources/versions-tests.yamsql | 26 ++-- 51 files changed, 612 insertions(+), 612 deletions(-) diff --git a/yaml-tests/src/test/resources/aggregate-empty-table.yamsql b/yaml-tests/src/test/resources/aggregate-empty-table.yamsql index ab0c3c5044..5411fae397 100644 --- a/yaml-tests/src/test/resources/aggregate-empty-table.yamsql +++ b/yaml-tests/src/test/resources/aggregate-empty-table.yamsql @@ -63,14 +63,14 @@ test_block: - error: "0AF00" - - query: select count(*) from T2; - - explain: "AISCAN(T2_I1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(*) from T2 where col1 = 0; - - explain: "AISCAN(T2_I2 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T2 where col1 > 0; @@ -78,39 +78,39 @@ test_block: - result: [{0}] - - query: select count(*) from T2 group by col1; - - explain: "AISCAN(T2_I2 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(*) from T2 where col1 = 0 group by col1; - - explain: "AISCAN(T2_I2 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(*) from T2 where col1 > 0 group by col1; - - explain: "AISCAN(T2_I2 [[GREATER_THAN promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(*) from T3; - - explain: "ISCAN(T3_I2 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T3 group by col1; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(*) from T3 where col1 = 0 group by col1; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(*) from T3 where col1 > 0 group by col1; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T1; @@ -141,14 +141,14 @@ test_block: - error: "0AF00" - - query: select count(col2) from T2; - - explain: "AISCAN(T2_I3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(col2) from T2 where col1 = 0; - - explain: "AISCAN(T2_I4 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T2 where col1 > 0; @@ -156,39 +156,39 @@ test_block: - result: [{0}] - - query: select count(col2) from T2 group by col1; - - explain: "AISCAN(T2_I4 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col2) from T2 where col1 = 0 group by col1; - - explain: "AISCAN(T2_I4 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col2) from T2 where col1 > 0 group by col1; - - explain: "AISCAN(T2_I4 [[GREATER_THAN promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col2) from T3; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 group by col1; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 = 0 group by col1; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 > 0 group by col1; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T1; @@ -212,7 +212,7 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T2; - - explain: "AISCAN(T2_I5 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I5 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 @@ -223,7 +223,7 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T2 where col2 = 0; - - explain: "AISCAN(T2_I6 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T2 where col1 > 0; @@ -238,50 +238,50 @@ test_block: - error: "0AF00" - - query: select sum(col1) from T2 where col2 = 0 group by col2; - - explain: "AISCAN(T2_I6 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select sum(col1) from T2 where col1 > 0 group by col2; - error: "0AF00" - - query: select sum(col1) from T2 where col2 > 0 group by col2; - - explain: "AISCAN(T2_I6 [[GREATER_THAN promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select sum(col1) from T3; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 = 0; - - explain: "ISCAN(T3_I2 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 > 0; - - explain: "ISCAN(T3_I2 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0 group by col2; - - explain: "ISCAN(T3_I2 <,>) | FILTER _.COL1 EQUALS promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | FILTER _.COL1 EQUALS promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T3 where col2 = 0 group by col2; - - explain: "ISCAN(T3_I2 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T3 where col1 > 0 group by col2; - - explain: "ISCAN(T3_I2 <,>) | FILTER _.COL1 GREATER_THAN promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | FILTER _.COL1 GREATER_THAN promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T3 where col2 > 0 group by col2; - - explain: "ISCAN(T3_I2 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] --- test_block: @@ -341,7 +341,7 @@ test_block: # Cannot support FORCE_CONTINUATIONS due to non-empty aggregate scan returning a begin continuation. # See: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - - explain: "AISCAN(T2_I1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T2 where col1 = 0; @@ -404,14 +404,14 @@ test_block: - error: "0AF00" - - query: select count(col2) from T2; - - explain: "AISCAN(T2_I3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot support FORCE_CONTINUATIONS due to non-empty aggregate scan returning a begin continuation. # See: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{0}] - - query: select count(col2) from T2 where col1 = 0; - - explain: "AISCAN(T2_I4 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T2 where col1 > 0; @@ -430,27 +430,27 @@ test_block: # - result: [] - - query: select count(col2) from T3; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 group by col1; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 = 0 group by col1; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 > 0 group by col1; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T1; @@ -481,7 +481,7 @@ test_block: - query: select sum(col1) from T2; # Cannot support FORCE_CONTINUATIONS due to non-empty aggregate scan returning a begin continuation. # See: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - - explain: "AISCAN(T2_I5 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I5 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 - result: [{0}] - @@ -489,7 +489,7 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T2 where col2 = 0; - - explain: "AISCAN(T2_I6 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T2 where col1 > 0; @@ -517,19 +517,19 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 = 0; - - explain: "ISCAN(T3_I2 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 > 0; - - explain: "ISCAN(T3_I2 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0 group by col2; diff --git a/yaml-tests/src/test/resources/aggregate-index-tests-count-empty.yamsql b/yaml-tests/src/test/resources/aggregate-index-tests-count-empty.yamsql index ef3b8f8fe2..20403cea83 100644 --- a/yaml-tests/src/test/resources/aggregate-index-tests-count-empty.yamsql +++ b/yaml-tests/src/test/resources/aggregate-index-tests-count-empty.yamsql @@ -32,43 +32,43 @@ test_block: tests: - - query: select count(*) from t1 - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(*) from t1 group by col2 - - explain: "AISCAN(MV2 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col1) from t1 - - explain: "AISCAN(MV3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(col1) from t1 group by col2 - - explain: "AISCAN(MV4 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select * from t2 - result: [] - - query: select count(*) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from t2 group by col2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col1) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col1) from t2 group by col2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] ... diff --git a/yaml-tests/src/test/resources/aggregate-index-tests-count.yamsql b/yaml-tests/src/test/resources/aggregate-index-tests-count.yamsql index a35beadf2e..9feae0ee1c 100644 --- a/yaml-tests/src/test/resources/aggregate-index-tests-count.yamsql +++ b/yaml-tests/src/test/resources/aggregate-index-tests-count.yamsql @@ -46,23 +46,23 @@ test_block: {ID: 4, 12, 2}] - - query: select count(*) from t1 - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{4}] - - query: select count(*) from t1 group by col2 - - explain: "AISCAN(MV2 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{1}, {3}] - - query: select count(col1) from t1 - - explain: "AISCAN(MV3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{2}] - - query: select count(col1) from t1 group by col2 - - explain: "AISCAN(MV4 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{1}, {1}] --- setup: @@ -84,22 +84,22 @@ test_block: {ID: 4, 12, 2, 20}] - - query: select count(*) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{4}] - - query: select count(*) from t2 group by col2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [{1}, {3}] - - query: select count(col1) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{2}] - - query: select count(col1) from t2 group by col2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [{1}, {1}] ... diff --git a/yaml-tests/src/test/resources/aggregate-index-tests.yamsql b/yaml-tests/src/test/resources/aggregate-index-tests.yamsql index 96551b98be..51ff7a01da 100644 --- a/yaml-tests/src/test/resources/aggregate-index-tests.yamsql +++ b/yaml-tests/src/test/resources/aggregate-index-tests.yamsql @@ -114,129 +114,129 @@ test_block: tests: - - query: select col1, sum(col2) from T1 group by col1; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - 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: "ISCAN(VI1) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)" - result: [{!l 10}, {!l 20}] - - query: select sum(col2) from T1 group by col1; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{!l 15}, {!l 76}] - - query: select col1, sum(col2) from T1 group by col1 order by col1 asc; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 15}, {!l 20, !l 76}] - - query: select col1, sum(col2) from T1 group by col1 order by col1 desc; - - explain: "AISCAN(MV1 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 20, !l 76}, {!l 10, !l 15}] - - query: select col1, sum(col2) + 1 from T1 group by col1; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)" - result: [{!l 10, !l 16}, {!l 20, !l 77}] - - query: select col1, max(col2) from T1 group by col1; - - explain: "AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}, {!l 20, !l 13}] - - query: select col1, max(col2) from T1 group by col1 order by col1; - - explain: "AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}, {!l 20, !l 13}] - - query: select col1, max(col2) from T1 group by col1 order by col1 desc; - - explain: "AISCAN(MV8 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 20, !l 13}, {!l 10, !l 5}] - - query: select col1, max(col2) from T1 where col1 = 10 group by col1; - - explain: "AISCAN(MV8 [EQUALS promote(@c13 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}] - # At some point, should be able to roll up values from the aggregate index. However, even # controlling for that, it can still use the index - query: select max(col2) from T1 use index (mv8); - - explain: "ISCAN(MV8 <,>) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(MV8) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 13}] - # Min/max indexes need keep what amounts to a standard value index on their keys (in order to properly look up # the min/max). That index should be usable for normal queries just like a value index. Note that the scan is # NOT by group - query: select col2 from T1 where col1 = 10; - - explain: "COVERING(MV8 [EQUALS promote(@c8 AS LONG)] -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)" + - explain: "COVERING(MV8) | MAP (_.COL2 AS COL2)" - result: [{!l 1}, {!l 2}, {!l 3}, {!l 4}, {!l 5}] - - query: select col2 from T1 where col1 = 10 order by col2 desc; - - explain: "COVERING(MV8 [EQUALS promote(@c8 AS LONG)] REVERSE -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)" + - explain: "COVERING(MV8) | MAP (_.COL2 AS COL2)" - result: [{!l 5}, {!l 4}, {!l 3}, {!l 2}, {!l 1}] - - query: select min(col3) from T2 group by col1, col2; - - explain: "ISCAN(MV2 <,>) | MAP (_ AS _0) | AGG (min_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL2 AS _1) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV2) | MAP (_ AS _0) | AGG (min_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL2 AS _1) | MAP (_._1._0 AS _0)" - result: [{!l 1}, {!l 2}, {!l 3}] - # this should use the aggregate index in the future, for now, it is using streaming aggregate # over base table scan. - query: select max(col2) from t2; - - explain: "ISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(MV3) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 2}] - - query: select col1, sum(col2) from T1 USE INDEX (vi1) group by col1; - - explain: "ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1, _._1._0 AS _1)" + - explain: "ISCAN(VI1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1, _._1._0 AS _1)" - - query: select max(col2) from t2 group by col1, col3; - - explain: "AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._2 AS _0)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._2 AS _0)" - result: [{!l 1}, {!l 1}, {!l 2}, {!l 2}, {!l 1}, {!l 1}, {!l 1}] - - query: select col1, col3, max(col2) from t2 group by col1, col3; - - explain: "AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS COL3, _._2 AS _2)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS COL3, _._2 AS _2)" - result: [{COL1: 1, COL3: 1, !l 1}, {COL1: 1, COL3: 100, !l 1}, {COL1: 1, COL3: 2, !l 2}, {COL1: 1, COL3: 200, !l 2}, {COL1: 2, COL3: 3, !l 1}, {COL1: 2, COL3: 200, !l 1}, {COL1: 2, Col3: 400, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 2 group by col1, col3; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 3, !l 1}, {COL3: 200, !l 1}, {COL3: 400, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 order by max(col2) desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG)] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 200, !l 2}, {COL3: 2, !l 2}, {COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 order by max(col2) desc; - maxRows: 3 - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG)] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 200, !l 2}, {COL3: 2, !l 2}, {COL3: 100, !l 1}] - result: [{COL3: 1, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 having max(col2) < 2 order by max(col2) desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG), [LESS_THAN promote(@c25 AS LONG)]] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 having max(col2) < 2 and max(col2) >= 1 order by max(col2) desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG), [GREATER_THAN_OR_EQUALS promote(@c13 AS LONG) && LESS_THAN promote(@c25 AS LONG)]] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select t.* from (select col3, max(col2) as m from t2 where col1 = 1 group by col1, col3) as t where m < 2 order by m desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c21 AS LONG), [LESS_THAN promote(@c33 AS LONG)]] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M)" - result: [{COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select col3, m from (select col3, max(col2) as m from t2 where col1 = 1 group by col1, col3) as t order by m desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c21 AS LONG)] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M)" - result: [{COL3: 200, M: 2}, {COL3: 2, M: 2}, {COL3: 100, M: 1}, {COL3: 1, M: 1}] - # Permuted max index can be used as a value index on the underlying columns - query: select col3, col2 from t2 where col1 = 1 order by col3 asc; - - explain: "COVERING(MV9 [EQUALS promote(@c10 AS LONG)] -> [COL1: KEY[0], COL2: KEY[2], COL3: KEY[1], ID: KEY[4]]) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" + - explain: "COVERING(MV9) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" - result: [{COL3: 1, COL2: 1}, {COL3: 2, COL2: 2}, {COL3: 100, COL2: 1}, {COL3: 200, COL2: 2}] - - query: select col3, col2 from t2 where col1 = 1 order by col3 desc; - - explain: "COVERING(MV9 [EQUALS promote(@c10 AS LONG)] REVERSE -> [COL1: KEY[0], COL2: KEY[2], COL3: KEY[1], ID: KEY[4]]) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" + - explain: "COVERING(MV9) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" - result: [{COL3: 200, COL2: 2}, {COL3: 100, COL2: 1}, {COL3: 2, COL2: 2}, {COL3: 1, COL2: 1}] - # 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(@c20 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: "ISCAN(MV9) | 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)" - 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(@c20 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: "ISCAN(MV9) | 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)" - result: [{COL3: 200, S: 2}, {COL3: 100, S: 1}, {COL3: 2, S: 2}, {COL3: 1, S: 1}] # - # # grouping by constant is not yet supported. @@ -245,7 +245,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: "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)" - - query: select min_ever(col3) from T2 group by col1, col2; - result: [{!l 1}, {!l 2}, {!l 3}] @@ -256,64 +256,64 @@ test_block: - query: select min_ever(col3) from t2 # Cannot enable FORCE_CONTINUATIONS with ungrouped aggregate scan because of: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - - explain: "AISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(MV7 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 1}] - - query: select min_ever(col3) from t2 - - explain: "AISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(MV7 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - - query: select col1, max_ever(col2) from T1 group by col1; - - explain: "AISCAN(MV6 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}, {!l 20, !l 13}] - - query: select col1, min_ever(col2) from T1 group by col1; - - explain: "AISCAN(MV12 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV12 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 1}, {!l 20, !l 6}] - # TODO, check how this aligns with COLLATION support - query: select col2, max_ever(col1) from T4 group by col2; - - explain: "AISCAN(MV15 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" + - explain: "AISCAN(MV15 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" - result: [{!l 10, 'value4'}, {!l 20, 'valueZ'}] - # TODO, check how this aligns with COLLATION support - query: select col2, min_ever(col1) from T4 group by col2; - - explain: "AISCAN(MV14 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" + - explain: "AISCAN(MV14 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" - result: [{!l 10, 'value1'}, {!l 20, 'valueA'}] - - query: select col1, sum(col2) from T1 where col1 > 15 group by col1; - - explain: "AISCAN(MV1 [[GREATER_THAN promote(@c13 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 20, !l 76}] - - query: select sum(col2) from T1 where col1 = 10 group by col1 - - explain: "AISCAN(MV1 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{!l 15}] - - query: select sum(col2) from T1 where col1 <= 10 group by col1 having col1 > 0; - - explain: "AISCAN(MV1 [[GREATER_THAN promote(@c19 AS LONG) && LESS_THAN_OR_EQUALS promote(@c12 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{!l 15}] - - query: select max(b) as x1, a+3 as x2 from t3 group by a+3; - - explain: "AISCAN(MV10 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" - result: [{x1: 500, x2: 13}, {x1: 200, x2: 23}, {x1: 900, x2: 33}] - - query: select a+3 as x1, max(b) as x2 from t3 group by a+3; - - explain: "AISCAN(MV10 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS X1, _._1 AS X2)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS X1, _._1 AS X2)" - result: [{x1: 13, x2: 500}, {x1: 23, x2: 200}, {x1: 33, x2: 900}] - - query: select a+b as x1, min(b) as x2 from t3 group by a+b, b+10; - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" + - explain: "AISCAN(MV11 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" - result: [{x1: 13, x2: 3}, {x1: 22, x2: 2}, {x1: 36, x2: 6}, {220, 200}, {510, 500}, {930, 900}] - - query: select M as x1, min(b) as x2 from t3 group by a+b as M, b+10; - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" + - explain: "AISCAN(MV11 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" - result: [{x1: 13, x2: 3}, {x1: 22, x2: 2}, {x1: 36, x2: 6}, {220, 200}, {510, 500}, {930, 900}] - - query: select M as x1, min(b) as x2 from t3 group by a+b as M, b+10 as N; - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" + - explain: "AISCAN(MV11 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" - result: [{x1: 13, x2: 3}, {x1: 22, x2: 2}, {x1: 36, x2: 6}, {220, 200}, {510, 500}, {930, 900}] - - query: select max(b) as x1, a+3 as x2 from t3 where a + 3 < 10000 group by a+3; - - explain: "AISCAN(MV10 [[LESS_THAN promote(@c21 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" - maxRows: 1 - result: [{x1: 500, x2: 13}] - result: [{x1: 200, x2: 23}] @@ -321,7 +321,7 @@ test_block: - result: [] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, max(x), c, d, e - - explain: "AISCAN(MV16 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -337,7 +337,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, max(x) - - explain: "AISCAN(MV16 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 11}, {b: "bar", c: 0, d: 1, e: "e2", _4: 11}, @@ -350,7 +350,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, min(x), c, d, e - - explain: "AISCAN(MV17 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -366,7 +366,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, min(x) - - explain: "AISCAN(MV17 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -379,7 +379,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, max(x), d, e - - explain: "AISCAN(MV18 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV18 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -395,7 +395,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, max(x) - - explain: "AISCAN(MV18 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV18 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 11}, {b: "bar", c: 0, d: 1, e: "e2", _4: 11}, @@ -408,7 +408,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, min(x), d, e - - explain: "AISCAN(MV19 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV19 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -424,7 +424,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, min(x) - - explain: "AISCAN(MV19 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV19 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -437,7 +437,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by max(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "foo", c: 0, d: 2, e: "e2", _4: 8}, {b: "foo", c: 3, d: 1, e: "e1", _4: 8}, @@ -450,7 +450,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by min(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -463,7 +463,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d = 1 order by max(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "foo", c: 3, d: 1, e: "e1", _4: 8}, {b: "foo", c: 0, d: 1, e: "e1", _4: 10}, @@ -473,7 +473,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d = 1 order by min(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -483,7 +483,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by max(x), c - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.D, _.E) } COMPARE BY (_._4, _.C, _.B, _.E)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - result: [ {b: "foo", c: 0, d: 2, e: "e2", _4: 8}, {b: "foo", c: 3, d: 1, e: "e1", _4: 8}, @@ -496,7 +496,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by min(x), c - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.D, _.E) } COMPARE BY (_._4, _.C, _.B, _.E)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -509,7 +509,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by max(x), c, e - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.E, _.D) } COMPARE BY (_._4, _.C, _.E, _.B)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -525,7 +525,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by min(x), c, e - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.E, _.D) } COMPARE BY (_._4, _.C, _.E, _.B)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -541,7 +541,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by max(x), d - - explain: "[IN @c38] INUNION q0 -> { AISCAN(MV18 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV18 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "foo", c: 0, d: 2, e: "e2", _4: 8}, {b: "foo", c: 0, d: 2, e: "e1", _4: 9}, @@ -552,7 +552,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by min(x), d - - explain: "[IN @c38] INUNION q0 -> { AISCAN(MV19 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV19 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, diff --git a/yaml-tests/src/test/resources/between.yamsql b/yaml-tests/src/test/resources/between.yamsql index 2e94d80627..8cadb1ed54 100644 --- a/yaml-tests/src/test/resources/between.yamsql +++ b/yaml-tests/src/test/resources/between.yamsql @@ -74,19 +74,19 @@ test_block: tests: - - query: select * from t1 WHERE col1 BETWEEN 10 AND 10 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c8 AS INT) && LESS_THAN_OR_EQUALS promote(@c8 AS INT)]])" + - explain: "ISCAN(I1)" - 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 BETWEEN 10 AND 20 - - explain: "ISCAN(I1 <,>) | FILTER _.COL1 + @c8 GREATER_THAN_OR_EQUALS promote(@c10 AS INT) AND _.COL1 + @c8 LESS_THAN_OR_EQUALS promote(@c12 AS INT)" + - explain: "ISCAN(I1) | FILTER _.COL1 + @c8 GREATER_THAN_OR_EQUALS promote(@c10 AS INT) AND _.COL1 + @c8 LESS_THAN_OR_EQUALS promote(@c12 AS INT)" - 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 + @c8 LESS_THAN promote(@c11 AS INT) OR _.COL1 + @c8 GREATER_THAN promote(@c13 AS INT)" + - explain: "ISCAN(I1) | FILTER _.COL1 + @c8 LESS_THAN promote(@c11 AS INT) OR _.COL1 + @c8 GREATER_THAN promote(@c13 AS INT)" - 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.yamsql b/yaml-tests/src/test/resources/bitmap-aggregate-index.yamsql index 0aedc30da1..20c9a5665e 100644 --- a/yaml-tests/src/test/resources/bitmap-aggregate-index.yamsql +++ b/yaml-tests/src/test/resources/bitmap-aggregate-index.yamsql @@ -49,31 +49,31 @@ test_block: tests: - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, bitmap_bucket_offset(id) as offset FROM T1 GROUP BY bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" - 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 T1 GROUP BY category, bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX2 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._1 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX2 -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._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}] - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, bitmap_bucket_offset(id) as offset FROM T1 GROUP BY bitmap_bucket_offset(id), bitmap_bucket_offset(id), bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" - 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 T1 GROUP BY bitmap_bucket_offset(id), category, bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX2 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._1 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX2 -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._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}] - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, bitmap_bucket_offset(id) as offset FROM T2 GROUP BY bitmap_bucket_offset(id) - - explain: "ISCAN(AGG_INDEX_1 <,>) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY ((_._0.ID) bitmap_bucket_offset 10000 AS _0) | MAP (_._1._0 AS BITMAP, _._0._0 AS OFFSET)" + - explain: "ISCAN(AGG_INDEX_1) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY ((_._0.ID) bitmap_bucket_offset 10000 AS _0) | MAP (_._1._0 AS BITMAP, _._0._0 AS OFFSET)" - 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: "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)" - 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.yamsql b/yaml-tests/src/test/resources/catalog.yamsql index 790f834905..9ee7404cc4 100644 --- a/yaml-tests/src/test/resources/catalog.yamsql +++ b/yaml-tests/src/test/resources/catalog.yamsql @@ -61,7 +61,7 @@ test_block: - - query: 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; - - explain: "AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c29 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) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(TEMPLATES_COUNT_INDEX -> [_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) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{4}] - # How many schemas with the specified schemaTemplateName and schemaTemplateVersion exist in this cluster? @@ -71,7 +71,7 @@ test_block: - - query: 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; - - explain: "AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c29 AS STRING), EQUALS promote(@c33 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) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(TEMPLATES_COUNT_INDEX -> [_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) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 # Disable force continuations because of empty continuation due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - result: [{4}] - diff --git a/yaml-tests/src/test/resources/create-drop.yamsql b/yaml-tests/src/test/resources/create-drop.yamsql index 87ee546fc0..e48b2d8a90 100644 --- a/yaml-tests/src/test/resources/create-drop.yamsql +++ b/yaml-tests/src/test/resources/create-drop.yamsql @@ -163,7 +163,7 @@ test_block: tests: - - query: select count(*) from "SCHEMAS" where database_id = '/FRL/DB' - - explain: "COVERING(TEMPLATES_VALUE_INDEX <,> -> [DATABASE_ID: KEY[2], SCHEMA_NAME: KEY[3], TEMPLATE_NAME: KEY[0], TEMPLATE_VERSION: KEY[1]]) | FILTER _.DATABASE_ID EQUALS promote(@c11 AS STRING) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(TEMPLATES_VALUE_INDEX) | FILTER _.DATABASE_ID EQUALS promote(@c11 AS STRING) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{1}] --- setup: diff --git a/yaml-tests/src/test/resources/cte.yamsql b/yaml-tests/src/test/resources/cte.yamsql index fa5ebba6bc..36152a2946 100644 --- a/yaml-tests/src/test/resources/cte.yamsql +++ b/yaml-tests/src/test/resources/cte.yamsql @@ -36,7 +36,7 @@ test_block: tests: - - query: with c1 as (select col1, col2 from t1) select col1, col2 from c1 - - explain: "COVERING(I1 <,> -> [COL1: KEY[1], COL2: KEY[0], ID: KEY[3]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - unorderedResult: [{COL1: 10, COL2: 1}, {COL1: 10, COL2: 2}, {COL1: 20, COL2: 6}, @@ -112,13 +112,13 @@ test_block: - error: "42703" - - query: select col1 from t1 where col2 < 3 - - explain: "COVERING(I1 [[LESS_THAN promote(@c8 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], ID: KEY[3]]) | MAP (_.COL1 AS COL1)" + - explain: "COVERING(I1) | MAP (_.COL1 AS COL1)" - - query: select x from (select col1 as x, col2 as y from t1) as sub where y < 3 - - explain: "COVERING(I1 [[LESS_THAN promote(@c21 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], ID: KEY[3]]) | MAP (_.COL1 AS X)" + - explain: "COVERING(I1) | MAP (_.COL1 AS X)" - - query: with c1(x, y) as (select col1, col2 from t1) select x from c1 where y < 3 - - explain: "COVERING(I1 [[LESS_THAN promote(@c24 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], ID: KEY[3]]) | MAP (_.COL1 AS X)" + - explain: "COVERING(I1) | MAP (_.COL1 AS X)" - - query: with c1 as (select col1, col2 from t1) select col1, col2 from c1 - maxRows: 1 diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-empty-table.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-empty-table.yamsql index 3cb62ee6eb..42110dedb4 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-empty-table.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-empty-table.yamsql @@ -66,14 +66,14 @@ test_block: - error: "0AF00" - - query: select count(*) from T2; - - explain: "AISCAN(T2_I1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(*) from T2 where col1 = 0; - - explain: "AISCAN(T2_I2 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T2 where col1 > 0; @@ -81,39 +81,39 @@ test_block: - result: [{0}] - - query: select count(*) from T2 group by col1; - - explain: "AISCAN(T2_I2 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(*) from T2 where col1 = 0 group by col1; - - explain: "AISCAN(T2_I2 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(*) from T2 where col1 > 0 group by col1; - - explain: "AISCAN(T2_I2 [[GREATER_THAN promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(*) from T3; - - explain: "ISCAN(T3_I2 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T3 group by col1; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(*) from T3 where col1 = 0 group by col1; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(*) from T3 where col1 > 0 group by col1; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T1; @@ -144,14 +144,14 @@ test_block: - error: "0AF00" - - query: select count(col2) from T2; - - explain: "AISCAN(T2_I3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(col2) from T2 where col1 = 0; - - explain: "AISCAN(T2_I4 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T2 where col1 > 0; @@ -159,39 +159,39 @@ test_block: - result: [{0}] - - query: select count(col2) from T2 group by col1; - - explain: "AISCAN(T2_I4 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col2) from T2 where col1 = 0 group by col1; - - explain: "AISCAN(T2_I4 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col2) from T2 where col1 > 0 group by col1; - - explain: "AISCAN(T2_I4 [[GREATER_THAN promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col2) from T3; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 group by col1; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 = 0 group by col1; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 > 0 group by col1; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T1; @@ -215,7 +215,7 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T2; - - explain: "AISCAN(T2_I5 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I5 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 @@ -226,7 +226,7 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T2 where col2 = 0; - - explain: "AISCAN(T2_I6 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T2 where col1 > 0; @@ -241,50 +241,50 @@ test_block: - error: "0AF00" - - query: select sum(col1) from T2 where col2 = 0 group by col2; - - explain: "AISCAN(T2_I6 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select sum(col1) from T2 where col1 > 0 group by col2; - error: "0AF00" - - query: select sum(col1) from T2 where col2 > 0 group by col2; - - explain: "AISCAN(T2_I6 [[GREATER_THAN promote(@c11 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select sum(col1) from T3; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 = 0; - - explain: "ISCAN(T3_I2 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 > 0; - - explain: "ISCAN(T3_I2 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0 group by col2; - - explain: "ISCAN(T3_I2 <,>) | FILTER _.COL1 EQUALS promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | FILTER _.COL1 EQUALS promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T3 where col2 = 0 group by col2; - - explain: "ISCAN(T3_I2 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T3 where col1 > 0 group by col2; - - explain: "ISCAN(T3_I2 <,>) | FILTER _.COL1 GREATER_THAN promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | FILTER _.COL1 GREATER_THAN promote(@c11 AS LONG) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T3 where col2 > 0 group by col2; - - explain: "ISCAN(T3_I2 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] --- test_block: @@ -347,7 +347,7 @@ test_block: # Cannot support FORCE_CONTINUATIONS due to non-empty aggregate scan returning a begin continuation. # See: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - - explain: "AISCAN(T2_I1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from T2 where col1 = 0; @@ -410,14 +410,14 @@ test_block: - error: "0AF00" - - query: select count(col2) from T2; - - explain: "AISCAN(T2_I3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot support FORCE_CONTINUATIONS due to non-empty aggregate scan returning a begin continuation. # See: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{0}] - - query: select count(col2) from T2 where col1 = 0; - - explain: "AISCAN(T2_I4 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(T2_I4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T2 where col1 > 0; @@ -436,27 +436,27 @@ test_block: # - result: [] - - query: select count(col2) from T3; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col2) from T3 group by col1; - - explain: "ISCAN(T3_I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 = 0 group by col1; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col2) from T3 where col1 > 0 group by col1; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select sum(col1) from T1; @@ -487,7 +487,7 @@ test_block: - query: select sum(col1) from T2; # Cannot support FORCE_CONTINUATIONS due to non-empty aggregate scan returning a begin continuation. # See: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - - explain: "AISCAN(T2_I5 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I5 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 - result: [{0}] - @@ -495,7 +495,7 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T2 where col2 = 0; - - explain: "AISCAN(T2_I6 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(T2_I6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP ((_._1 AS _0) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T2 where col1 > 0; @@ -523,19 +523,19 @@ test_block: - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0; - - explain: "ISCAN(T3_I1 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 = 0; - - explain: "ISCAN(T3_I2 [EQUALS promote(@c11 AS LONG)]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 > 0; - - explain: "ISCAN(T3_I1 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col2 > 0; - - explain: "ISCAN(T3_I2 [[GREATER_THAN promote(@c11 AS LONG)]]) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(T3_I2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!null _}] - - query: select sum(col1) from T3 where col1 = 0 group by col2; diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count-empty.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count-empty.yamsql index 314b316a35..a944b6e97a 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count-empty.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count-empty.yamsql @@ -35,43 +35,43 @@ test_block: tests: - - query: select count(*) from t1 - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(*) from t1 group by col2 - - explain: "AISCAN(MV2 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select count(col1) from t1 - - explain: "AISCAN(MV3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - initialVersionLessThan: 4.0.561.0 - result: [] - initialVersionAtLeast: 4.0.561.0 - result: [{0}] - - query: select count(col1) from t1 group by col2 - - explain: "AISCAN(MV4 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [] - - query: select * from t2 - result: [] - - query: select count(*) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(*) from t2 group by col2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] - - query: select count(col1) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{0}] - - query: select count(col1) from t2 group by col2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [] ... diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count.yamsql index eb7d9b1b98..fe1149c625 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests-count.yamsql @@ -49,23 +49,23 @@ test_block: {ID: 4, 12, 2}] - - query: select count(*) from t1 - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV1 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{4}] - - query: select count(*) from t1 group by col2 - - explain: "AISCAN(MV2 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV2 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{1}, {3}] - - query: select count(col1) from t1 - - explain: "AISCAN(MV3 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "AISCAN(MV3 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{2}] - - query: select count(col1) from t1 group by col2 - - explain: "AISCAN(MV4 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV4 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{1}, {1}] --- setup: @@ -90,7 +90,7 @@ test_block: {ID: 4, 12, 2, 20}] - - query: select count(*) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{4}] @@ -98,7 +98,7 @@ test_block: - query: select count(*) from t2 group by col2 # Plan deserialization previously failed : https://github.com/FoundationDB/fdb-record-layer/issues/3214 - supported_version: 4.1.9.0 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count_star(*) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [{1}, {3}] - # Same as above test, but tests serialization upgrades from before 4.1.9.0. Can be removed once we no longer @@ -113,7 +113,7 @@ test_block: # Covered in above test case - - query: select count(col1) from t2 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" # Cannot run with FORCE_CONTINUATIONS due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - result: [{2}] @@ -121,7 +121,7 @@ test_block: - query: select count(col1) from t2 group by col2 # Plan deserialization previously failed : https://github.com/FoundationDB/fdb-record-layer/issues/3214 - supported_version: 4.1.9.0 - - explain: "ISCAN(MV5 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV5) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) GROUP BY (_._0.COL2 AS _0) | MAP (_._1._0 AS _0)" - result: [{1}, {1}] - # Same as above test, but tests serialization upgrades from before 4.1.9.0. Can be removed once we no longer diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests.yamsql index 92b9dea375..aec7a967a5 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/aggregate-index-tests.yamsql @@ -117,50 +117,50 @@ test_block: tests: - - query: select col1, sum(col2) from T1 group by col1; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - 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: "ISCAN(VI1) | MAP (_ AS _0) | AGG () GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1)" - result: [{!l 10}, {!l 20}] - - query: select sum(col2) from T1 group by col1; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{!l 15}, {!l 76}] - - query: select col1, sum(col2) from T1 group by col1 order by col1 asc; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 15}, {!l 20, !l 76}] - - query: select col1, sum(col2) from T1 group by col1 order by col1 desc; - - explain: "AISCAN(MV1 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 20, !l 76}, {!l 10, !l 15}] - - query: select col1, sum(col2) + 1 from T1 group by col1; - - explain: "AISCAN(MV1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 + 1 AS _1)" - result: [{!l 10, !l 16}, {!l 20, !l 77}] - - query: select col1, max(col2) from T1 group by col1; - - explain: "AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}, {!l 20, !l 13}] - - query: select col1, max(col2) from T1 group by col1 order by col1; - - explain: "AISCAN(MV8 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}, {!l 20, !l 13}] - - query: select col1, max(col2) from T1 group by col1 order by col1 desc; - - explain: "AISCAN(MV8 <,> BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 20, !l 13}, {!l 10, !l 5}] - - query: select col1, max(col2) from T1 where col1 = 10 group by col1; - - explain: "AISCAN(MV8 [EQUALS promote(@c13 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV8 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}] - # At some point, should be able to roll up values from the aggregate index. However, even # controlling for that, it can still use the index - query: select max(col2) from T1 use index (mv8); - supported_version: 4.1.9.0 - - explain: "ISCAN(MV8 <,>) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(MV8) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 13}] - - query: select max(col2) from T1 use index (mv8); @@ -178,16 +178,16 @@ test_block: # the min/max). That index should be usable for normal queries just like a value index. Note that the scan is # NOT by group - query: select col2 from T1 where col1 = 10; - - explain: "COVERING(MV8 [EQUALS promote(@c8 AS LONG)] -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)" + - explain: "COVERING(MV8) | MAP (_.COL2 AS COL2)" - result: [{!l 1}, {!l 2}, {!l 3}, {!l 4}, {!l 5}] - - query: select col2 from T1 where col1 = 10 order by col2 desc; - - explain: "COVERING(MV8 [EQUALS promote(@c8 AS LONG)] REVERSE -> [COL1: KEY[0], COL2: KEY[1], ID: KEY[3]]) | MAP (_.COL2 AS COL2)" + - explain: "COVERING(MV8) | MAP (_.COL2 AS COL2)" - result: [{!l 5}, {!l 4}, {!l 3}, {!l 2}, {!l 1}] - - query: select min(col3) from T2 group by col1, col2; - supported_version: 4.1.9.0 - - explain: "ISCAN(MV2 <,>) | MAP (_ AS _0) | AGG (min_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL2 AS _1) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(MV2) | MAP (_ AS _0) | AGG (min_l(_._0.COL3) AS _0) GROUP BY (_._0.COL1 AS _0, _._0.COL2 AS _1) | MAP (_._1._0 AS _0)" - result: [{!l 1}, {!l 2}, {!l 3}] - - query: select min(col3) from T2 group by col1, col2; @@ -207,7 +207,7 @@ test_block: # over base table scan. - query: select max(col2) from t2; - supported_version: 4.1.9.0 - - explain: "ISCAN(MV3 <,>) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(MV3) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 2}] - - query: select max(col2) from t2; @@ -225,59 +225,59 @@ test_block: - result: [] - - query: select col1, sum(col2) from T1 USE INDEX (vi1) group by col1; - - explain: "ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1, _._1._0 AS _1)" + - explain: "ISCAN(VI1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._0._0 AS COL1, _._1._0 AS _1)" - - query: select max(col2) from t2 group by col1, col3; - - explain: "AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._2 AS _0)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._2 AS _0)" - result: [{!l 1}, {!l 1}, {!l 2}, {!l 2}, {!l 1}, {!l 1}, {!l 1}] - - query: select col1, col3, max(col2) from t2 group by col1, col3; - - explain: "AISCAN(MV9 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS COL3, _._2 AS _2)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._0 AS COL1, _._1 AS COL3, _._2 AS _2)" - result: [{COL1: 1, COL3: 1, !l 1}, {COL1: 1, COL3: 100, !l 1}, {COL1: 1, COL3: 2, !l 2}, {COL1: 1, COL3: 200, !l 2}, {COL1: 2, COL3: 3, !l 1}, {COL1: 2, COL3: 200, !l 1}, {COL1: 2, Col3: 400, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 2 group by col1, col3; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 3, !l 1}, {COL3: 200, !l 1}, {COL3: 400, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 order by max(col2) desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG)] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 200, !l 2}, {COL3: 2, !l 2}, {COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 order by max(col2) desc; - maxRows: 3 - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG)] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 200, !l 2}, {COL3: 2, !l 2}, {COL3: 100, !l 1}] - result: [{COL3: 1, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 having max(col2) < 2 order by max(col2) desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG), [LESS_THAN promote(@c25 AS LONG)]] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select col3, max(col2) from t2 where col1 = 1 group by col1, col3 having max(col2) < 2 and max(col2) >= 1 order by max(col2) desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c13 AS LONG), [GREATER_THAN_OR_EQUALS promote(@c13 AS LONG) && LESS_THAN promote(@c25 AS LONG)]] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS _1)" - result: [{COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select t.* from (select col3, max(col2) as m from t2 where col1 = 1 group by col1, col3) as t where m < 2 order by m desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c21 AS LONG)] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M) | FILTER _.M LESS_THAN promote(@c33 AS LONG)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M) | FILTER _.M LESS_THAN promote(@c33 AS LONG)" - result: [{COL3: 100, !l 1}, {COL3: 1, !l 1}] - - query: select col3, m from (select col3, max(col2) as m from t2 where col1 = 1 group by col1, col3) as t order by m desc; - - explain: "AISCAN(MV9 [EQUALS promote(@c21 AS LONG)] BY_GROUP REVERSE -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M) | MAP (_.COL3 AS COL3, _.M AS M)" + - explain: "AISCAN(MV9 -> [_0: KEY:[0], _1: KEY:[2], _2: KEY:[1]]) | MAP (_._1 AS COL3, _._2 AS M) | MAP (_.COL3 AS COL3, _.M AS M)" - result: [{COL3: 200, M: 2}, {COL3: 2, M: 2}, {COL3: 100, M: 1}, {COL3: 1, M: 1}] - # Permuted max index can be used as a value index on the underlying columns - query: select col3, col2 from t2 where col1 = 1 order by col3 asc; - - explain: "COVERING(MV9 [EQUALS promote(@c10 AS LONG)] -> [COL1: KEY[0], COL2: KEY[2], COL3: KEY[1], ID: KEY[4]]) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" + - explain: "COVERING(MV9) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" - result: [{COL3: 1, COL2: 1}, {COL3: 2, COL2: 2}, {COL3: 100, COL2: 1}, {COL3: 200, COL2: 2}] - - query: select col3, col2 from t2 where col1 = 1 order by col3 desc; - - explain: "COVERING(MV9 [EQUALS promote(@c10 AS LONG)] REVERSE -> [COL1: KEY[0], COL2: KEY[2], COL3: KEY[1], ID: KEY[4]]) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" + - explain: "COVERING(MV9) | MAP (_.COL3 AS COL3, _.COL2 AS COL2)" - result: [{COL3: 200, COL2: 2}, {COL3: 100, COL2: 1}, {COL3: 2, COL2: 2}, {COL3: 1, COL2: 1}] - # 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; - supported_version: 4.1.9.0 - - explain: "ISCAN(MV9 [EQUALS promote(@c20 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: "ISCAN(MV9) | 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)" - 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 asc; @@ -289,7 +289,7 @@ test_block: - - query: select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 desc; - supported_version: 4.1.9.0 - - explain: "ISCAN(MV9 [EQUALS promote(@c20 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: "ISCAN(MV9) | 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)" - result: [{COL3: 200, S: 2}, {COL3: 100, S: 1}, {COL3: 2, S: 2}, {COL3: 1, S: 1}] - - query: select col3, sum(col2) as s from t2 use index (mv9) where col1 = 1 group by col1, col3 order by col3 desc; @@ -305,7 +305,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: "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)" - - query: select min_ever(col3) from T2 group by col1, col2; - result: [{!l 1}, {!l 2}, {!l 3}] @@ -316,64 +316,64 @@ test_block: - query: select min_ever(col3) from t2 # Cannot enable FORCE_CONTINUATIONS with ungrouped aggregate scan because of: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - maxRows: 0 - - explain: "AISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(MV7 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 1}] - - query: select min_ever(col3) from t2 - - explain: "AISCAN(MV7 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(MV7 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - - query: select col1, max_ever(col2) from T1 group by col1; - - explain: "AISCAN(MV6 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV6 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 5}, {!l 20, !l 13}] - - query: select col1, min_ever(col2) from T1 group by col1; - - explain: "AISCAN(MV12 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV12 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 10, !l 1}, {!l 20, !l 6}] - # TODO, check how this aligns with COLLATION support - query: select col2, max_ever(col1) from T4 group by col2; - - explain: "AISCAN(MV15 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" + - explain: "AISCAN(MV15 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" - result: [{!l 10, 'value4'}, {!l 20, 'valueZ'}] - # TODO, check how this aligns with COLLATION support - query: select col2, min_ever(col1) from T4 group by col2; - - explain: "AISCAN(MV14 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" + - explain: "AISCAN(MV14 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL2, _._1 AS _1)" - result: [{!l 10, 'value1'}, {!l 20, 'valueA'}] - - query: select col1, sum(col2) from T1 where col1 > 15 group by col1; - - explain: "AISCAN(MV1 [[GREATER_THAN promote(@c13 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._0 AS COL1, _._1 AS _1)" - result: [{!l 20, !l 76}] - - query: select sum(col2) from T1 where col1 = 10 group by col1 - - explain: "AISCAN(MV1 [EQUALS promote(@c11 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{!l 15}] - - query: select sum(col2) from T1 where col1 <= 10 group by col1 having col1 > 0; - - explain: "AISCAN(MV1 [[GREATER_THAN promote(@c19 AS LONG) && LESS_THAN_OR_EQUALS promote(@c12 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" + - explain: "AISCAN(MV1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS _0)" - result: [{!l 15}] - - query: select max(b) as x1, a+3 as x2 from t3 group by a+3; - - explain: "AISCAN(MV10 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" - result: [{x1: 500, x2: 13}, {x1: 200, x2: 23}, {x1: 900, x2: 33}] - - query: select a+3 as x1, max(b) as x2 from t3 group by a+3; - - explain: "AISCAN(MV10 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS X1, _._1 AS X2)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._0 AS X1, _._1 AS X2)" - result: [{x1: 13, x2: 500}, {x1: 23, x2: 200}, {x1: 33, x2: 900}] - - query: select a+b as x1, min(b) as x2 from t3 group by a+b, b+10; - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" + - explain: "AISCAN(MV11 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" - result: [{x1: 13, x2: 3}, {x1: 22, x2: 2}, {x1: 36, x2: 6}, {220, 200}, {510, 500}, {930, 900}] - - query: select M as x1, min(b) as x2 from t3 group by a+b as M, b+10; - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" + - explain: "AISCAN(MV11 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" - result: [{x1: 13, x2: 3}, {x1: 22, x2: 2}, {x1: 36, x2: 6}, {220, 200}, {510, 500}, {930, 900}] - - query: select M as x1, min(b) as x2 from t3 group by a+b as M, b+10 as N; - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" + - explain: "AISCAN(MV11 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2]]) | MAP (_._0 AS X1, _._2 AS X2)" - result: [{x1: 13, x2: 3}, {x1: 22, x2: 2}, {x1: 36, x2: 6}, {220, 200}, {510, 500}, {930, 900}] - - query: select max(b) as x1, a+3 as x2 from t3 where a + 3 < 10000 group by a+3; - - explain: "AISCAN(MV10 [[LESS_THAN promote(@c21 AS LONG)]] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: KEY:[1]]) | MAP (_._1 AS X1, _._0 AS X2)" - maxRows: 1 - result: [{x1: 500, x2: 13}] - result: [{x1: 200, x2: 23}] @@ -381,7 +381,7 @@ test_block: - result: [] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, max(x), c, d, e - - explain: "AISCAN(MV16 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -397,7 +397,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, max(x) - - explain: "AISCAN(MV16 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 11}, {b: "bar", c: 0, d: 1, e: "e2", _4: 11}, @@ -410,7 +410,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, min(x), c, d, e - - explain: "AISCAN(MV17 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -426,7 +426,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, min(x) - - explain: "AISCAN(MV17 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -439,7 +439,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, max(x), d, e - - explain: "AISCAN(MV18 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV18 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -455,7 +455,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, max(x) - - explain: "AISCAN(MV18 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV18 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 11}, {b: "bar", c: 0, d: 1, e: "e2", _4: 11}, @@ -468,7 +468,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, min(x), d, e - - explain: "AISCAN(MV19 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV19 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -484,7 +484,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e order by b, c, min(x) - - explain: "AISCAN(MV19 [EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" + - explain: "AISCAN(MV19 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4)" - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -497,7 +497,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by max(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "foo", c: 0, d: 2, e: "e2", _4: 8}, {b: "foo", c: 3, d: 1, e: "e1", _4: 8}, @@ -510,7 +510,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by min(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -523,7 +523,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d = 1 order by max(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "foo", c: 3, d: 1, e: "e1", _4: 8}, {b: "foo", c: 0, d: 1, e: "e1", _4: 10}, @@ -533,7 +533,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d = 1 order by min(x), c - - explain: "[IN @c34] INUNION q0 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.B, _.D, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS promote(@c42 AS LONG) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -543,7 +543,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by max(x), c - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.D, _.E) } COMPARE BY (_._4, _.C, _.B, _.E)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - result: [ {b: "foo", c: 0, d: 2, e: "e2", _4: 8}, {b: "foo", c: 3, d: 1, e: "e1", _4: 8}, @@ -556,7 +556,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by min(x), c - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.D, _.E) } COMPARE BY (_._4, _.C, _.B, _.E)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, @@ -569,7 +569,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by max(x), c, e - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV16 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.E, _.D) } COMPARE BY (_._4, _.C, _.E, _.B)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV16 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -585,7 +585,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 group by a, b, c, d, e having b IN ('foo', 'bar') and d IN (1, 2) order by min(x), c, e - - explain: "[IN @c34] INUNION q0 -> { [IN promote(@c42 AS ARRAY(LONG))] INUNION q1 -> { AISCAN(MV17 [EQUALS promote(@c19 AS LONG), EQUALS q0] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.C, _.E, _.D) } COMPARE BY (_._4, _.C, _.E, _.B)" + - explain: "[...] INUNION q0 -> { [...] INUNION q1 -> { AISCAN(MV17 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[3], _3: KEY:[4], _4: KEY:[5], _5: KEY:[2]]) | FILTER _._3 EQUALS q1 | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY } COMPARE BY " - initialVersionLessThan: 4.3.5.0 - error: "0AF00" - initialVersionAtLeast: 4.3.5.0 @@ -601,7 +601,7 @@ test_block: ] - - query: select b, c, d, e, max(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by max(x), d - - explain: "[IN @c38] INUNION q0 -> { AISCAN(MV18 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV18 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "foo", c: 0, d: 2, e: "e2", _4: 8}, {b: "foo", c: 0, d: 2, e: "e1", _4: 9}, @@ -612,7 +612,7 @@ test_block: ] - - query: select b, c, d, e, min(x) from t5 where a = 0 and c = 0 group by a, b, c, d, e having b IN ('foo', 'bar') order by min(x), d - - explain: "[IN @c38] INUNION q0 -> { AISCAN(MV19 [EQUALS promote(@c19 AS LONG), EQUALS q0, EQUALS promote(@c19 AS LONG)] BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY (_._4, _.D, _.B, _.C, _.E)" + - explain: "[...] INUNION q0 -> { AISCAN(MV19 -> [_0: KEY:[0], _1: KEY:[1], _2: KEY:[2], _3: KEY:[4], _4: KEY:[5], _5: KEY:[3]]) | MAP (_._1 AS B, _._2 AS C, _._3 AS D, _._4 AS E, _._5 AS _4) } COMPARE BY " - result: [ {b: "bar", c: 0, d: 1, e: "e1", _4: 0}, {b: "bar", c: 0, d: 1, e: "e2", _4: 0}, diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/between.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/between.yamsql index 4eadbd2ba9..b815375e8a 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/between.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/between.yamsql @@ -80,19 +80,19 @@ test_block: tests: - - query: select * from t1 WHERE col1 BETWEEN 10 AND 10 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c8 AS INT) && LESS_THAN_OR_EQUALS promote(@c8 AS INT)]])" + - explain: "ISCAN(I1)" - 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 BETWEEN 10 AND 20 - - explain: "ISCAN(I1 <,>) | FILTER _.COL1 + @c8 GREATER_THAN_OR_EQUALS promote(@c10 AS INT) AND _.COL1 + @c8 LESS_THAN_OR_EQUALS promote(@c12 AS INT)" + - explain: "ISCAN(I1) | FILTER _.COL1 + @c8 GREATER_THAN_OR_EQUALS promote(@c10 AS INT) AND _.COL1 + @c8 LESS_THAN_OR_EQUALS promote(@c12 AS INT)" - 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 + @c8 LESS_THAN promote(@c11 AS INT) OR _.COL1 + @c8 GREATER_THAN promote(@c13 AS INT)" + - explain: "ISCAN(I1) | FILTER _.COL1 + @c8 LESS_THAN promote(@c11 AS INT) OR _.COL1 + @c8 GREATER_THAN promote(@c13 AS INT)" - 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/disabled-planner-rewrites/bitmap-aggregate-index.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/bitmap-aggregate-index.yamsql index 1ebe93891b..98bdb1ff57 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/bitmap-aggregate-index.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/bitmap-aggregate-index.yamsql @@ -52,28 +52,28 @@ test_block: tests: - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, bitmap_bucket_offset(id) as offset FROM T1 GROUP BY bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" - 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 T1 GROUP BY category, bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX2 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._1 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX2 -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._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}] - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, bitmap_bucket_offset(id) as offset FROM T1 GROUP BY bitmap_bucket_offset(id), bitmap_bucket_offset(id), bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX1 <,> BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX1 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS BITMAP, _._0 AS OFFSET)" - 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 T1 GROUP BY bitmap_bucket_offset(id), category, bitmap_bucket_offset(id) - - explain: "AISCAN(BITMAPINDEX2 <,> BY_GROUP -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._1 AS OFFSET)" + - explain: "AISCAN(BITMAPINDEX2 -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS BITMAP, _._0 AS CATEGORY, _._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}] - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, bitmap_bucket_offset(id) as offset FROM T2 GROUP BY bitmap_bucket_offset(id) - supported_version: 4.1.9.0 - - explain: "ISCAN(AGG_INDEX_1 <,>) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY ((_._0.ID) bitmap_bucket_offset 10000 AS _0) | MAP (_._1._0 AS BITMAP, _._0._0 AS OFFSET)" + - explain: "ISCAN(AGG_INDEX_1) | MAP (_ AS _0) | AGG (bitmap_construct_agg_l((_._0.ID) bitmap_bit_position 10000) AS _0) GROUP BY ((_._0.ID) bitmap_bucket_offset 10000 AS _0) | MAP (_._1._0 AS BITMAP, _._0._0 AS OFFSET)" - unorderedResult: [{BITMAP: xStartsWith_1250'060000c', 'OFFSET':0}, {BITMAP: xStartsWith_1250'02', 'OFFSET':10000}] - - query: SELECT bitmap_construct_agg(bitmap_bit_position(id)) as bitmap, bitmap_bucket_offset(id) as offset FROM T2 GROUP BY bitmap_bucket_offset(id) @@ -91,7 +91,7 @@ test_block: - - 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) - supported_version: 4.1.9.0 - - 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: "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)" - 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}] @@ -102,7 +102,7 @@ test_block: # but it can end up skipping values when resuming from a continuation - 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) - maxRows: 0 - - 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: "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)" - 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/disabled-planner-rewrites/catalog.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/catalog.yamsql index a728885b41..adc97f21e2 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/catalog.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/catalog.yamsql @@ -64,7 +64,7 @@ test_block: - - query: 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; - - explain: "AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c29 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) | MAP (_ AS _0) | AGG (sum_l(_._0.CNT) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(TEMPLATES_COUNT_INDEX -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) | MAP (_ AS _0) | AGG (sum_l(_._0.CNT) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 # Disable force continuations because of empty continuation due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - result: [{4}] - @@ -75,7 +75,7 @@ test_block: - - query: 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; - - explain: "AISCAN(TEMPLATES_COUNT_INDEX [EQUALS promote(@c29 AS STRING), EQUALS promote(@c33 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) | MAP (_ AS _0) | AGG (sum_l(_._0.CNT) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "AISCAN(TEMPLATES_COUNT_INDEX -> [_0: KEY:[0], _1: KEY:[1], _2: VALUE:[0]]) | MAP (_._2 AS CNT, _._0 AS TEMPLATE_NAME, _._1 AS TEMPLATE_VERSION) | MAP (_ AS _0) | AGG (sum_l(_._0.CNT) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 # Disable force continuations because of empty continuation due to: https://github.com/FoundationDB/fdb-record-layer/issues/3206 - result: [{4}] - diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/create-drop.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/create-drop.yamsql index 4e7d48b223..666e815560 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/create-drop.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/create-drop.yamsql @@ -193,7 +193,7 @@ test_block: tests: - - query: select count(*) from "SCHEMAS" where database_id = '/FRL/DB' - - explain: "COVERING(TEMPLATES_VALUE_INDEX <,> -> [DATABASE_ID: KEY[2], SCHEMA_NAME: KEY[3], TEMPLATE_NAME: KEY[0], TEMPLATE_VERSION: KEY[1]]) | FILTER _.DATABASE_ID EQUALS promote(@c11 AS STRING) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(TEMPLATES_VALUE_INDEX) | FILTER _.DATABASE_ID EQUALS promote(@c11 AS STRING) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{1}] --- setup: diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/cte.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/cte.yamsql index e18acb259e..76547de22e 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/cte.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/cte.yamsql @@ -114,7 +114,7 @@ test_block: - error: "42703" - - query: select col1 from t1 where col2 < 3 - - explain: "COVERING(I1 [[LESS_THAN promote(@c8 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], ID: KEY[3]]) | MAP (_.COL1 AS COL1)" + - explain: "COVERING(I1) | MAP (_.COL1 AS COL1)" - # TODO (CTEs and subqueries are not fully optimized) - query: select x from (select col1 as x, col2 as y from t1) as sub where y < 3 diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/groupby-tests.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/groupby-tests.yamsql index a53700df78..8968aa1750 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/groupby-tests.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/groupby-tests.yamsql @@ -227,7 +227,7 @@ test_block: - initialVersionAtLeast: 4.1.9.0 - - query: select AVG(x.col2) from (select col1,col2 from t1) as x group by x.col1; - - explain: "ISCAN(I1 <,>) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (avg_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (avg_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{3.0}, {9.5}] - @@ -261,7 +261,7 @@ test_block: - # result is correct since we don't use (not support, yet) explicit casting. - query: select SUM(x.col2) / COUNT(x.col2), AVG(x.col2) from (select col1,col2 from t1) as x group by x.col1; - - explain: "ISCAN(I1 <,>) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0, count(_._0.COL2) AS _1, avg_l(_._0.COL2) AS _2) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 / _._1._1 AS _0, _._1._2 AS _1)" + - explain: "ISCAN(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (sum_l(_._0.COL2) AS _0, count(_._0.COL2) AS _1, avg_l(_._0.COL2) AS _2) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 / _._1._1 AS _0, _._1._2 AS _1)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{!l 3, 3.0}, {!l 9, 9.5}] - @@ -286,7 +286,7 @@ test_block: - error: "42803" - - query: select MAX(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{!l 13}] - @@ -302,7 +302,7 @@ test_block: - result: [] - - query: select MIN(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (min_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{!l 1}] - @@ -318,7 +318,7 @@ test_block: - result: [] - - query: select COUNT(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{!l 13}] - @@ -334,13 +334,13 @@ test_block: - result: [] - - query: select AVG(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (avg_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (avg_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{7.0}] - # Same as above but simulates force_continuations mode. Can be removed after we no longer care about compatibility with versions before 4.1.9.0 - query: select AVG(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (avg_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(I1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) | MAP (_ AS _0) | AGG (avg_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - maxRows: 1 - initialVersionLessThan: 4.1.9.0 - result: [{7.0}] @@ -386,13 +386,13 @@ test_block: - initialVersionAtLeast: 4.1.9.0 - - query: select COUNT(*) from T1; - - explain: "ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{!l 13}] - # Same as above but simulates force_continuations mode. Can be removed after we no longer care about compatibility with versions before 4.1.9.0 - query: select COUNT(*) from T1; - - explain: "ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - maxRows: 1 - initialVersionLessThan: 4.1.9.0 - result: [{!l 13}] @@ -403,13 +403,13 @@ test_block: - result: [] - - query: select COUNT(col1) from T1; - - explain: "ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - maxRows: 0 # Disable force_continuations. Can be removed when we longer care about testing with versions older than 4.1.9.0 - result: [{!l 13}] - # Same as above but simulates force_continuations mode. Can be removed after we no longer care about compatibility with versions before 4.1.9.0 - query: select COUNT(col1) from T1; - - explain: "ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - maxRows: 1 - initialVersionLessThan: 4.1.9.0 - result: [{!l 13}] diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/indexed-functions.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/indexed-functions.yamsql index ec644be05c..2c0e7ae3b4 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/indexed-functions.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/indexed-functions.yamsql @@ -45,7 +45,7 @@ test_block: tests: - - query: select * from t where b + c > 7; - - explain: "ISCAN(BPLUSC [[GREATER_THAN promote(@c10 AS LONG)]])" + - explain: "ISCAN(BPLUSC)" - unorderedResult: [ {A: 1, B: 1, C: 10, D: 3, E: 'alpha'}, {A: 2, B: 2, C: 8, D: 2, E: 'beta'}, @@ -54,7 +54,7 @@ test_block: ] - - query: select a, b + c AS sum from t where e = 'alpha' order by b + c; - - explain: "ISCAN(BPLUSCBYE [EQUALS promote(@c14 AS STRING)]) | MAP (_.A AS A, _.B + _.C AS SUM)" + - explain: "ISCAN(BPLUSCBYE) | MAP (_.A AS A, _.B + _.C AS SUM)" - result: [ { A: 9, SUM: 3 }, { A: 7, SUM: 5 }, @@ -81,7 +81,7 @@ test_block: # ] - - query: select * from t where d & 1 = 1; - - explainContains: "ISCAN(DMASK1 [EQUALS promote" + - explainContains: "ISCAN(DMASK1)" - unorderedResult: [ {A: 1, B: 1, C: 10, D: 3, E: 'alpha'}, {A: 3, B: 3, C: 6, D: 1, E: 'alpha'}, @@ -91,7 +91,7 @@ test_block: ] - - query: select * from t where d & 1 = 0; - - explain: "ISCAN(DMASK1 [EQUALS promote(@c10 AS LONG)])" + - explain: "ISCAN(DMASK1)" - unorderedResult: [ {A: 2, B: 2, C: 8, D: 2, E: 'beta'}, {A: 4, B: 4, C: 4, D: 0, E: 'beta'}, @@ -100,7 +100,7 @@ test_block: ] - - query: select * from t where d & 2 = 2; - - explainContains: "ISCAN(DMASK2 [EQUALS promote" + - explainContains: "ISCAN(DMASK2)" - unorderedResult: [ {A: 1, B: 1, C: 10, D: 3, E: 'alpha'}, {A: 2, B: 2, C: 8, D: 2, E: 'beta'}, @@ -110,7 +110,7 @@ test_block: ] - - query: select * from t where d & 2 = 0; - - explain: "ISCAN(DMASK2 [EQUALS promote(@c10 AS LONG)])" + - explain: "ISCAN(DMASK2)" - unorderedResult: [ {A: 3, B: 3, C: 6, D: 1, E: 'alpha'}, {A: 4, B: 4, C: 4, D: 0, E: 'beta'}, diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/nested-with-nulls.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/nested-with-nulls.yamsql index 3cd2d637ae..4ef84d6baa 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/nested-with-nulls.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/nested-with-nulls.yamsql @@ -47,125 +47,125 @@ test_block: tests: - - query: select id from t1 where a.a.a IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.A.A IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.A.A IS_NULL | MAP (_.ID AS ID)" - result: [] - - query: select id from t1 where a.a.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.A.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.A.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where a.b.a IS NULL - - explain: "COVERING(I1 [[null],[null]] -> [ID: KEY[2], A: [B: [A: KEY[0]]]]) | MAP (_.ID AS ID)" + - explain: "COVERING(I1) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 107 }] - - query: select id from t1 where a.b.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.B.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.B.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where b.a.a IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.A IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.A IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 102 }, { ID: 103 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where b.a.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where b.b.a IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.A IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.A IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where b.b.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where a.a.a IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.A.A NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.A.A NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where a.a.b IS NOT NULL - - explain: "COVERING(I2 ([null],> -> [ID: KEY[2], A: [A: [B: KEY[0]]]]) | MAP (_.ID AS ID)" + - explain: "COVERING(I2) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }] - - query: select id from t1 where a.b.a IS NOT NULL - - explain: "COVERING(I1 ([null],> -> [ID: KEY[2], A: [B: [A: KEY[0]]]]) | MAP (_.ID AS ID)" + - explain: "COVERING(I1) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 104 }, { ID: 105 }, { ID: 106 }] - - query: select id from t1 where a.b.b IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.B.B NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.B.B NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }] - - query: select id from t1 where b.a.a IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.A NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.A NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 104 }, { ID: 105 }] - - query: select id from t1 where b.a.b IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.B NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.B NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }] - - query: select id from t1 where b.b.a IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.A NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.A NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 104 } ] - - query: select id from t1 where b.b.b IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.B NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.B NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }] - - query: select id from t1 where coalesce(a.a.a, 'blah') = 'a1' - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }] - - query: select id from t1 where coalesce(a.a.a, 'blah') = 'a1p' - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - # As 'blah' is not nullable, so this predicate could be simplified to TRUE - query: select id from t1 where coalesce(a.a.a, 'blah') IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - # The coalesce could be removed and replaced with a simple field access - query: select id from t1 where coalesce(a.a.a, null) IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, NULL) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, NULL) NOT_NULL | MAP (_.ID AS ID)" - 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, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | 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, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | 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, promote(@c14 AS STRING)) IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) 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: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, NULL) IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 107 }] - # One of the two coalesce values is not null, so this could be simplified to TRUE - query: select id from t1 where coalesce(a.b.a, 'foo') IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where coalesce(b.a.b, 3) = 3 - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where coalesce(b.a.b, 42) = 42 - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { 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(b.a.b, 42) IS NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) IS_NULL | MAP (_.ID AS ID)" - result: [] - # One of the two coalesce values is not null, so this could be simplified to TRUE - query: select id from t1 where coalesce(b.a.b, 42) IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] ... diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/null-operator-tests.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/null-operator-tests.yamsql index 7b7ad76de5..e31d6f0b4d 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/null-operator-tests.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/null-operator-tests.yamsql @@ -51,7 +51,7 @@ test_block: - - query: select count(*) from (select * from (select * from T1) as x where ID is not null) as y; - supported_version: 4.1.9.0 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID NOT_NULL | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(I1) | FILTER _.ID NOT_NULL | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{13}] - # Copy of above query that simulates force continuations mode, which does not work prior to 4.1.9.0 diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/orderby.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/orderby.yamsql index 55f43b6a6f..674412edc1 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/orderby.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/orderby.yamsql @@ -245,24 +245,24 @@ test_block: - # Ordering by a non projected column - query: select c from t1 order by b - - explain: "COVERING(I1 <,> -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" + - explain: "COVERING(I1) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" - result: [ {0}, {0}, {1}, {1}, {8}, {8}, {8}, {5}, {5}, {5} ] - - query: select b from t1 order by c - - explain: "COVERING(I2 <,> -> [A: KEY[2], B: VALUE[0], C: KEY[0]]) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" + - explain: "COVERING(I2) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" - result: [ {2}, {1}, {4}, {3}, {10}, {9}, {8}, {7}, {6}, {5} ] - # Ordering by a non projected column desc - query: select c from t1 order by b desc - - explain: "COVERING(I1 <,> REVERSE -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" + - explain: "COVERING(I1) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" - result: [ {5}, {5}, {5}, {8}, {8}, {8}, {1}, {1}, {0}, {0} ] - - query: select b from t1 order by c desc - - explain: "COVERING(I2 <,> REVERSE -> [A: KEY[2], B: VALUE[0], C: KEY[0]]) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" + - explain: "COVERING(I2) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" - result: [ {5}, {6}, {7}, {8}, {9}, {10}, {3}, {4}, {1}, {2} ] - # Simple ordering on 2 variable, mixed ordering - query: select c, b from t5 order by c, b desc; - - explain: "COVERING(I8 <,> -> [A: KEY[3], B: from_ordered_bytes(KEY:[1], DESC_NULLS_LAST), C: KEY[0]]) | MAP (_.C AS C, _.B AS B)" + - explain: "COVERING(I8) | MAP (_.C AS C, _.B AS B)" - result: [{0, 2}, {0, 1}, {1, 4}, {1, 3}, {5, 10}, {5, 9}, {5, 8}, {8, 7}, {8, 6}, {8, 5}] ... diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/recursive-cte.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/recursive-cte.yamsql index 0e6e6984fe..d03922f31a 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/recursive-cte.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/recursive-cte.yamsql @@ -32,7 +32,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 q0, q1 { INITIAL { ISCAN(PARENTIDX [EQUALS promote(@c15 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)" + - explain: "RUNION q0, q1 { INITIAL { ISCAN(PARENTIDX) | 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)" - unorderedResult: [{ID: 1}, {ID: 10}, {ID: 20}, @@ -47,7 +47,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 q0, q1 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c15 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)" + - explain: "RUNION q0, q1 { INITIAL { ISCAN(CHILDIDX) | 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)" - result: [{ID: 250}, {ID: 50}, {ID: 10}, @@ -60,7 +60,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 q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c20 AS LONG)]) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" - result: [{250, 50}, {50, 10}, {10, 1}, @@ -83,7 +83,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 q0, q1 { INITIAL { ISCAN(PARENTIDX [EQUALS promote(@c15 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) + - explain: RUNION q0, q1 { INITIAL { ISCAN(PARENTIDX) | 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) - maxRows: 1 - result: [{ID: 1}] - result: [{ID: 10}] @@ -103,7 +103,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 q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c20 AS LONG)]) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" - maxRows: 1 - result: [{250, 50}] - result: [{50, 10}] diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/select-a-star.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/select-a-star.yamsql index 111626423e..8a574f7937 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/select-a-star.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/select-a-star.yamsql @@ -44,7 +44,7 @@ test_block: - - query: select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER 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(<,>) | TFILTER 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) }" - result: [{1}, {2}, {3}] - # Version of above query to simulate force_continuations with older versions. @@ -98,7 +98,7 @@ test_block: - - query: select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER 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(<,>) | TFILTER 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) }" - result: [{1}, {2}, {3}] - # Version of above query to simulate force_continuations with older versions. @@ -117,7 +117,7 @@ test_block: - - query: select B.* from B where exists (select A.*, B.* from A group by A1,A2,A3); - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER 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(<,>) | TFILTER 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 }" - result: [{1, 20, {4, 40}}, {2, 20, {5, 50}}, {3, 20, {6, 60}}] diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/sparse-index-tests.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/sparse-index-tests.yamsql index 12528338d8..390c73e00c 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/sparse-index-tests.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/sparse-index-tests.yamsql @@ -39,28 +39,28 @@ test_block: tests: - - query: select id from t3 where tombstone = true or tombstone is not null - - explainContains: "COVERING(I4 <,>" + - explainContains: "COVERING(I4) " - - query: select id from t3 where tombstone = true or tombstone is not null - - explainContains: "COVERING(I4 <,>" + - explainContains: "COVERING(I4) " - - query: select id from t3 where tombstone = true or tombstone is not null - - explainContains: "COVERING(I4 <,>" + - explainContains: "COVERING(I4) " - - query: select tombstone from t2 where tombstone is null - explainContains: "SCAN(" - - query: select tombstone from t2 where tombstone is not null - - explainContains: "COVERING(I3 ([null],>" + - explainContains: "COVERING(I3) " - - query: select id from t5 where col1 < 40 or col1 > 90 - - explainContains: "COVERING(I6 <,>" + - explainContains: "COVERING(I6) " - - query: select id from t5 where col1 < 40 or col1 > 90 - - explainContains: "COVERING(I6 <,>" + - explainContains: "COVERING(I6) " - - query: select id from t5 where col1 < 40 or col1 > 90 - - explainContains: "COVERING(I6 <,>" + - explainContains: "COVERING(I6) " --- # Following tests are executed in order as the index used depends on which query warms up the cache. In this particular # scenario, the first query puts the plan in cache, which cannot be used by second query that would use the one with @@ -75,21 +75,21 @@ test_block: tests: - - query: select id from t1 where col1 < 100 - - explainContains: "COVERING(I1 " + - explainContains: "COVERING(I1) " - result: [] - - query: select id from t1 where col1 < 453 - - explainContains: "COVERING(I2 " + - explainContains: "COVERING(I2) " - result: [] - - query: select col1 from t1 where col1 > 55 and col1 < 100 - - explainContains: "COVERING(I1 [[GREATER_THAN promote(@c8 AS INT) && LESS_THAN promote(@c12 AS INT)]]" + - explainContains: "COVERING(I1) | MAP (_.COL1 AS COL1)" - - query: select col1 from t1 where col1 > 55 and col1 < 199 - - explainContains: "COVERING(I1 [[GREATER_THAN promote(@c8 AS INT) && LESS_THAN promote(@c12 AS INT)]]" + - explainContains: "COVERING(I1) | MAP (_.COL1 AS COL1)" - - query: select col1 from t1 where col1 > 50 and col1 < 350 - - explainContains: "COVERING(I2 [[GREATER_THAN promote(@c8 AS INT) && LESS_THAN promote(@c12 AS INT)]]" + - explainContains: "COVERING(I2) | MAP (_.COL1 AS COL1" --- setup: steps: @@ -110,15 +110,15 @@ test_block: tests: - - query: select id from t1 where col1 < 200 - - explainContains: "COVERING(I1 " + - explainContains: "COVERING(I1) | MAP (_.ID AS ID)" - result: [{ID: 1}] - - query: select id from t1 where col1 < 201 - - explainContains: "COVERING(I2 " + - explainContains: "COVERING(I2) | MAP (_.ID AS ID)" - result: [{ID: 1}, {ID: 2}] - - query: select id from t1 where col1 < 250 - - explainContains: "COVERING(I2 " + - explainContains: "COVERING(I2) | MAP (_.ID AS ID)" - result: [{ID: 1}, {ID: 2}, {ID: 3}] - - query: select id from t1 where col1 < 500 diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/sql-functions.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/sql-functions.yamsql index e055648499..9ad7477e16 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/sql-functions.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/sql-functions.yamsql @@ -63,111 +63,111 @@ test_block: tests: - - query: select col1, col2 from f1(a => 103, b => 'b'); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c10 AS LONG) AS A, promote(@c14 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c10 AS LONG) AS A, promote(@c14 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select col1, col2 from f1(b => 'b', a => 103); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c14 AS LONG) AS A, promote(@c10 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c14 AS LONG) AS A, promote(@c10 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select col1, col2 from f1(103, 'b'); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c8 AS LONG) AS A, promote(@c10 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c8 AS LONG) AS A, promote(@c10 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select col1 + 10, col2 from f1(103, 'b'); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c10 AS LONG) AS A, promote(@c12 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 + @c4 AS _0, _.COL2 AS COL2)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c10 AS LONG) AS A, promote(@c12 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 + @c4 AS _0, _.COL2 AS COL2)" - result: [{111, 'b'}, {112, 'b'}] - - query: select * from f1(103, 'b'); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f1(103, 'b') where col1 = 101 - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FILTER _.COL1 EQUALS promote(@c13 AS LONG)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FILTER _.COL1 EQUALS promote(@c13 AS LONG)" - result: [{101, 'b'}] - - query: select * from f1(103 + 1, 'b') - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 + @c8 AS LONG) AS A, promote(@c10 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 + @c8 AS LONG) AS A, promote(@c10 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}, {102, 'b'}, {103, 'b'}] - - query: select * from (select * from f1(103 + 1, 'b')) as x where col1 < 105 - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c10 + @c12 AS LONG) AS A, promote(@c14 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FILTER _.COL1 LESS_THAN promote(@c22 AS LONG)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c10 + @c12 AS LONG) AS A, promote(@c14 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FILTER _.COL1 LESS_THAN promote(@c22 AS LONG)" - result: [{101, 'b'}, {102, 'b'}, {103, 'b'}] - - query: select A.col1 AS W, A.col2 AS X, B.col1 AS Y, B.col2 AS Z from f1(103, 'b') A, f1(103, 'b') B where A.col1 = B.col1 - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c28 AS LONG) AS A, promote(@c30 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FLATMAP q2 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c28 AS LONG) AS A, promote(@c30 AS STRING) AS B) | FLATMAP q3 -> { COVERING(T1_IDX1 [EQUALS q3.B, [LESS_THAN q3.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q4 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2) } | FILTER q2.COL1 EQUALS _.COL1 AS q5 RETURN (q2.COL1 AS W, q2.COL2 AS X, q5.COL1 AS Y, q5.COL2 AS Z) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c28 AS LONG) AS A, promote(@c30 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FLATMAP q2 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c28 AS LONG) AS A, promote(@c30 AS STRING) AS B) | FLATMAP q3 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q4 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2) } | FILTER q2.COL1 EQUALS _.COL1 AS q5 RETURN (q2.COL1 AS W, q2.COL2 AS X, q5.COL1 AS Y, q5.COL2 AS Z) }" - result: [{W: 101, X: 'b', Y: 101, Z: 'b'}, {W: 102, X: 'b', Y: 102, Z: 'b'}] - - query: select A.col1 AS W, A.col2 AS X, B.col1 AS Y, B.col2 AS Z from f1(a => 103, b => 'b') A, f1(a => 103, b => 'b') B where A.col1 = B.col1 - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c30 AS LONG) AS A, promote(@c34 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FLATMAP q2 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c30 AS LONG) AS A, promote(@c34 AS STRING) AS B) | FLATMAP q3 -> { COVERING(T1_IDX1 [EQUALS q3.B, [LESS_THAN q3.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q4 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2) } | FILTER q2.COL1 EQUALS _.COL1 AS q5 RETURN (q2.COL1 AS W, q2.COL2 AS X, q5.COL1 AS Y, q5.COL2 AS Z) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c30 AS LONG) AS A, promote(@c34 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | FLATMAP q2 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c30 AS LONG) AS A, promote(@c34 AS STRING) AS B) | FLATMAP q3 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q4 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2) } | FILTER q2.COL1 EQUALS _.COL1 AS q5 RETURN (q2.COL1 AS W, q2.COL2 AS X, q5.COL1 AS Y, q5.COL2 AS Z) }" - result: [{W: 101, X: 'b', Y: 101, Z: 'b'}, {W: 102, X: 'b', Y: 102, Z: 'b'}] - - query: with x(y, z) as (select * from f1(b => 'b', a => 103)) select * from x - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c21 AS LONG) AS A, promote(@c17 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS Y, _.COL2 AS Z)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c21 AS LONG) AS A, promote(@c17 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS Y, _.COL2 AS Z)" - result: [{101, 'b'}, {102, 'b'}] - - query: with x(y, z) as (select * from f1(103, 'b')) select * from x - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c15 AS LONG) AS A, promote(@c17 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS Y, _.COL2 AS Z)" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c15 AS LONG) AS A, promote(@c17 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) } | MAP (_.COL1 AS Y, _.COL2 AS Z)" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from t2 where exists (select * from f2(t2.z)) - - explain: "ISCAN(T2_IDX1 <,>) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.Z AS K) | FLATMAP q1 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q1.K AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2, q2.COL3 AS COL3) } | DEFAULT NULL | FILTER _ NOT_NULL AS q3 RETURN q0 }" + - explain: "ISCAN(T2_IDX1) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.Z AS K) | FLATMAP q1 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q1.K AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2, q2.COL3 AS COL3) } | DEFAULT NULL | FILTER _ NOT_NULL AS q3 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 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.Z AS K) | FLATMAP q1 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q1.K AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2, q2.COL3 AS COL3) } | DEFAULT NULL | FILTER _ NOT_NULL AS q3 RETURN q0 }" + - explain: "ISCAN(T2_IDX1) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.Z AS K) | FLATMAP q1 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q1.K AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2, q2.COL3 AS COL3) } | DEFAULT NULL | FILTER _ NOT_NULL AS q3 RETURN q0 }" - result: [{10, 14, 1}, {11, 16, 1}] - - query: select * from f3(103, 'b', 4) - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B, promote(@c10 AS LONG) AS C) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B) | FLATMAP q1 -> { COVERING(T1_IDX1 [EQUALS q1.B, [LESS_THAN q1.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2) } | FLATMAP q3 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.C AS K) | FLATMAP q4 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q4.K AS q5 RETURN (q5.COL1 AS COL1, q5.COL2 AS COL2, q5.COL3 AS COL3) } AS q6 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q7.COL1 AS COL1, q7.COL2 AS COL2, q7.COL3 AS COL3) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B, promote(@c10 AS LONG) AS C) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B) | FLATMAP q1 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2) } | FLATMAP q3 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.C AS K) | FLATMAP q4 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q4.K AS q5 RETURN (q5.COL1 AS COL1, q5.COL2 AS COL2, q5.COL3 AS COL3) } AS q6 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q7.COL1 AS COL1, q7.COL2 AS COL2, q7.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f3(103, 'b', 4) - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B, promote(@c10 AS LONG) AS C) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B) | FLATMAP q1 -> { COVERING(T1_IDX1 [EQUALS q1.B, [LESS_THAN q1.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2) } | FLATMAP q3 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.C AS K) | FLATMAP q4 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q4.K AS q5 RETURN (q5.COL1 AS COL1, q5.COL2 AS COL2, q5.COL3 AS COL3) } AS q6 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q7.COL1 AS COL1, q7.COL2 AS COL2, q7.COL3 AS COL3) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B, promote(@c10 AS LONG) AS C) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B) | FLATMAP q1 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q2 RETURN (q2.COL1 AS COL1, q2.COL2 AS COL2) } | FLATMAP q3 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.C AS K) | FLATMAP q4 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q4.K AS q5 RETURN (q5.COL1 AS COL1, q5.COL2 AS COL2, q5.COL3 AS COL3) } AS q6 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q7.COL1 AS COL1, q7.COL2 AS COL2, q7.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f4(103, 'b', 2, 2) - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B, promote(@c10 AS LONG) AS C, promote(@c10 AS LONG) AS D) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B, q0.C + q0.D AS C) | FLATMAP q1 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.A AS A, q1.B AS B) | FLATMAP q2 -> { COVERING(T1_IDX1 [EQUALS q2.B, [LESS_THAN q2.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q3 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2) } | FLATMAP q4 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.C AS K) | FLATMAP q5 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q5.K AS q6 RETURN (q6.COL1 AS COL1, q6.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2, q7.COL3 AS COL3) } AS q8 RETURN (q8.COL1 AS COL1, q8.COL2 AS COL2, q8.COL3 AS COL3) } AS q9 RETURN (q9.COL1 AS COL1, q9.COL2 AS COL2, q9.COL3 AS COL3) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B, promote(@c10 AS LONG) AS C, promote(@c10 AS LONG) AS D) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B, q0.C + q0.D AS C) | FLATMAP q1 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.A AS A, q1.B AS B) | FLATMAP q2 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q3 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2) } | FLATMAP q4 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.C AS K) | FLATMAP q5 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q5.K AS q6 RETURN (q6.COL1 AS COL1, q6.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2, q7.COL3 AS COL3) } AS q8 RETURN (q8.COL1 AS COL1, q8.COL2 AS COL2, q8.COL3 AS COL3) } AS q9 RETURN (q9.COL1 AS COL1, q9.COL2 AS COL2, q9.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f4(a => 103, b => 'b', c => 2, d => 2) - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c8 AS LONG) AS A, promote(@c12 AS STRING) AS B, promote(@c16 AS LONG) AS C, promote(@c16 AS LONG) AS D) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B, q0.C + q0.D AS C) | FLATMAP q1 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.A AS A, q1.B AS B) | FLATMAP q2 -> { COVERING(T1_IDX1 [EQUALS q2.B, [LESS_THAN q2.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q3 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2) } | FLATMAP q4 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.C AS K) | FLATMAP q5 -> { ISCAN(T1_IDX1 <,>) | FILTER promote(_.COL3 AS LONG) EQUALS q5.K AS q6 RETURN (q6.COL1 AS COL1, q6.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2, q7.COL3 AS COL3) } AS q8 RETURN (q8.COL1 AS COL1, q8.COL2 AS COL2, q8.COL3 AS COL3) } AS q9 RETURN (q9.COL1 AS COL1, q9.COL2 AS COL2, q9.COL3 AS COL3) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c8 AS LONG) AS A, promote(@c12 AS STRING) AS B, promote(@c16 AS LONG) AS C, promote(@c16 AS LONG) AS D) | FLATMAP q0 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q0.A AS A, q0.B AS B, q0.C + q0.D AS C) | FLATMAP q1 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.A AS A, q1.B AS B) | FLATMAP q2 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q3 RETURN (q3.COL1 AS COL1, q3.COL2 AS COL2) } | FLATMAP q4 -> { TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (q1.C AS K) | FLATMAP q5 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q5.K AS q6 RETURN (q6.COL1 AS COL1, q6.COL2 AS COL2, q6.COL3 AS COL3) } AS q7 RETURN (q4.COL1 AS COL1, q4.COL2 AS COL2, q7.COL3 AS COL3) } AS q8 RETURN (q8.COL1 AS COL1, q8.COL2 AS COL2, q8.COL3 AS COL3) } AS q9 RETURN (q9.COL1 AS COL1, q9.COL2 AS COL2, q9.COL3 AS COL3) }" - result: [{101, 'b', 4}, {102, 'b', 4}] - - query: select * from f5(); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(103 AS LONG) AS A, promote('b' AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(103 AS LONG) AS A, promote('b' AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(103); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote('b' AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote('b' AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(b => 'b'); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(103 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(103 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(b => 'b', a => 103); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c12 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c12 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(b => 'b', a => 102); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c12 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c12 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}] - - query: select * from f5(b => 'a', a => 102); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c12 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c12 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{100, 'a'}] - - query: select * from f5(a => 102, b => 'a'); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c8 AS LONG) AS A, promote(@c12 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c8 AS LONG) AS A, promote(@c12 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{100, 'a'}] - - query: select * from f5(102); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote('b' AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote('b' AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{101, 'b'}] - - query: select * from f5(102, 'a'); - - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS q0.B, [LESS_THAN q0.A]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" + - explain: "TF range(0l, promote(1l AS LONG), STEP 1l) | MAP (promote(@c6 AS LONG) AS A, promote(@c8 AS STRING) AS B) | FLATMAP q0 -> { COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2) AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2) }" - result: [{100, 'a'}] - - query: select col1, col2 from f1('b', 103); diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/standard-tests.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/standard-tests.yamsql index 3290a84072..537dbb24a6 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/standard-tests.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/standard-tests.yamsql @@ -50,7 +50,7 @@ test_block: when col2 in (6,7,8,9) then 200 else 300 end as NEWCOL from T1 - - explain: "ISCAN(I1 <,>) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG)), TRUE), @c10, @c24, @c26) AS NEWCOL)" + - explain: "ISCAN(I1) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG)), TRUE), @c10, @c24, @c26) AS NEWCOL)" - result: [{ID: 1, NEWCOL: 100}, {ID: 2, NEWCOL: 100}, {ID: 3, NEWCOL: 100}, @@ -68,7 +68,7 @@ test_block: - query: select id, case when col1 = 10 then 100 when col2 in (6,7,8,9) then 200 end as NEWCOL from T1 - - explain: "ISCAN(I1 <,>) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG))), @c10, @c24) AS NEWCOL)" + - explain: "ISCAN(I1) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG))), @c10, @c24) AS NEWCOL)" - result: [{ID: 1, NEWCOL: 100}, {ID: 2, NEWCOL: 100}, {ID: 3, NEWCOL: 100}, @@ -84,7 +84,7 @@ test_block: {ID: 13, NEWCOL: !null x} ] - - query: select * from T1 where COL1 = 20 - - explain: "ISCAN(I1 [EQUALS promote(@c8 AS LONG)])" + - explain: "ISCAN(I1)" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -97,7 +97,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 OR COL1 <= 20 - - explain: "COVERING(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG)]] -> [COL1: KEY[0], ID: KEY[2]]) ⊎ COVERING(I1 [[LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]] -> [COL1: KEY[0], ID: KEY[2]]) | DISTINCT BY PK | FETCH" + - explain: "COVERING(I1) ⊎ COVERING(I1) | DISTINCT BY PK | FETCH" - maxRows: 0 # Force continuations mode fails here. This is because we get duplicate results when we resume from a continuation - unorderedResult: [ {ID: 1, COL1: 10, COL2: 1}, @@ -116,7 +116,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 OR COL1 <= 20 ORDER BY COL1 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG)]]) ∪ ISCAN(I1 [[LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]]) COMPARE BY (_.COL1, recordType(_), _.ID)" + - explain: "ISCAN(I1) ∪ ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -134,7 +134,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 AND COL1 <= 20 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG) && LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]])" + - explain: "ISCAN(I1)" - unorderedResult: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -152,7 +152,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 AND COL1 <= 20 ORDER BY COL1 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG) && LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]])" + - explain: "ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -171,7 +171,7 @@ test_block: - - query: select * from T1 where COL1 = 20 OR COL1 = 20 # Ideally, we'd coalesce these two ranges on COL1 into a single range - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 EQUALS promote(@c8 AS LONG) OR _.COL1 EQUALS promote(@c8 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.COL1 EQUALS promote(@c8 AS LONG) OR _.COL1 EQUALS promote(@c8 AS LONG) | FETCH" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -184,7 +184,7 @@ test_block: ] - - query: select * from T1 where COL1 = 20 OR COL1 = 20 ORDER BY COL1 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 EQUALS promote(@c8 AS LONG) OR _.COL1 EQUALS promote(@c8 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.COL1 EQUALS promote(@c8 AS LONG) OR _.COL1 EQUALS promote(@c8 AS LONG) | FETCH" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -197,7 +197,7 @@ test_block: ] - - query: select * from T1 where COL1 = 20 AND COL1 = 20 - - explain: "ISCAN(I1 [EQUALS promote(@c8 AS LONG)])" + - explain: "ISCAN(I1)" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -210,7 +210,7 @@ test_block: ] - - query: select * from T1 where (COL1 = 20 OR COL1 = 10) AND (COL1 = 20 OR COL1 = 10) - - explain: "COVERING(I1 [EQUALS promote(@c9 AS LONG)] -> [COL1: KEY[0], ID: KEY[2]]) ⊎ COVERING(I1 [EQUALS promote(@c13 AS LONG)] -> [COL1: KEY[0], ID: KEY[2]]) | DISTINCT BY PK | FETCH" + - explain: "COVERING(I1) ⊎ COVERING(I1) | DISTINCT BY PK | FETCH" - initialVersionLessThan: 4.3.6.0 # Prior to 4.3.6.0, there was an error that would result in this query failing due to an illegal argument exception # The error is currently not propagated as a SQLException, so we can't even assert on the error code @@ -232,7 +232,7 @@ test_block: ] - - query: select * from T1 where (COL1 = 20 OR COL1 = 10) AND (COL1 = 20 OR COL1 = 10) ORDER BY COL1 - - explain: "ISCAN(I1 [EQUALS promote(@c9 AS LONG)]) ∪ ISCAN(I1 [EQUALS promote(@c13 AS LONG)]) COMPARE BY (_.COL1, recordType(_), _.ID)" + - explain: "ISCAN(I1) ∪ ISCAN(I1)" - initialVersionLessThan: 4.3.6.0 # Prior to 4.3.6.0, there was an error that would result in this query failing due to an illegal argument exception # The error is currently not propagated as a SQLException, so we can't even assert on the error code @@ -254,7 +254,7 @@ test_block: ] - - query: select * from T1 where (COL1 >= 10 AND COL1 <= 20) OR (COL1 >= 10 AND COL1 <= 20) - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c10 AS LONG) && LESS_THAN_OR_EQUALS promote(@c15 AS LONG)]])" + - explain: "ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -272,7 +272,7 @@ test_block: ] - - query: select * from T1 where (COL1 >= 10 AND COL1 <= 20) OR (COL1 >= 10 AND COL1 <= 20) ORDER BY COL1 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c10 AS LONG) && LESS_THAN_OR_EQUALS promote(@c15 AS LONG)]])" + - explain: "ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -290,16 +290,16 @@ test_block: ] - - query: select * from (select * from (select * from T1) as x where ID = 5) as y; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID EQUALS promote(@c19 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.ID EQUALS promote(@c19 AS LONG) | FETCH" - result: [{ID: !l 5, !l 10, !l 5}] - - query: select * from (select * from (select * from T1) as x) as y where ID = 5; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID EQUALS promote(@c22 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.ID EQUALS promote(@c22 AS LONG) | FETCH" - result: [{ID: !l 5, !l 10, !l 5}] - - query: select count(*) from (select * from (select * from (select * from T1 where ID = 5) as x) as y) as z; - supported_version: 4.1.9.0 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID EQUALS promote(@c23 AS LONG) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(I1) | FILTER _.ID EQUALS promote(@c23 AS LONG) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{!l 1}] - # Copy of above query to simulate force continuations mode, which does not work prior to 4.1.9.0 due to @@ -316,6 +316,6 @@ test_block: - result: [] - - query: select * from (select * from (select * from (select * from T1 where ID > 10) as x) as y) as z; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID GREATER_THAN promote(@c20 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.ID GREATER_THAN promote(@c20 AS LONG) | FETCH" - result: [{ID: !l 11, !l 20, !l 11}, {ID: !l 12, !l 20, !l 12}, {ID: !l 13, !l 20, !l 13}] ... diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/subquery-tests.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/subquery-tests.yamsql index 2b997bd446..2608aeebeb 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/subquery-tests.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/subquery-tests.yamsql @@ -68,7 +68,7 @@ test_block: # correlations are allowed inside a nested subquery with group by - query: select x from a where exists (select a.x, max(idb) from b where q > a.x group by q) - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] - # Copy of above to simulate force_continuations with versions older than 4.1.9.0 @@ -84,7 +84,7 @@ test_block: # correlations are allowed inside a nested subquery with group by, not necessarily qualified - query: select x from a where exists (select x, max(idb) from b where q > x group by q) - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] - # Copy of above to simulate force_continuations with versions older than 4.1.9.0 @@ -100,7 +100,7 @@ test_block: # correlations inside aggregations are allowed inside a nested subquery with group by - query: select x from a where exists (select max(x), max(idb) from b where q > x group by q) - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] - # Copy of above to simulate force_continuations with versions older than 4.1.9.0 @@ -119,7 +119,7 @@ test_block: # correlations inside aggregations are allowed inside a nested subquery with group by - query: select x from a where exists (select max(a.x), max(idb) from b where q > x group by q) - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] - # correlations inside aggregations are allowed inside a nested subquery with group by diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/union-empty-tables.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/union-empty-tables.yamsql index 787c1c29a5..c362942d42 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/union-empty-tables.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/union-empty-tables.yamsql @@ -86,7 +86,7 @@ test_block: - query: select sum(Y) as S from (select count(*) as Y from t3 where a < 10 group by a union all select count(*) from t4) as X # Query does not work with force continuations before 4.1.9.0 for a few reasons, including: https://github.com/FoundationDB/fdb-record-layer/issues/3096 - supported_version: 4.1.9.0 - - explain: "AISCAN(MV10 [[LESS_THAN promote(@c22 AS DOUBLE)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) | MAP (_.Y AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) | MAP (_.Y AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - unorderedResult: [{0}] - - query: select sum(Y) as S from (select count(*) as Y from t3 union all select count(*) from t1) as X diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/union.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/union.yamsql index 901daaecbb..397835297d 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/union.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/union.yamsql @@ -63,7 +63,7 @@ test_block: - query: select sum(a) as a, sum(b) as b from (select sum(col1) as a, count(*) as b from t1 union all select sum(col1) as a, count(*) as b from t2) as x # Versions prior to 4.1.9.0, this would infinite loop in a hard to assert about way due to: https://github.com/FoundationDB/fdb-record-layer/issues/3096 - supported_version: 4.1.9.0 - - explain: "ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) ⊎ SCAN(<,>) | TFILTER T2 | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) | MAP (_ AS _0) | AGG (sum_l(_._0.A) AS _0, sum_l(_._0.B) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, _._0._1 AS B)" + - explain: "ISCAN(VI1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) ⊎ SCAN(<,>) | TFILTER T2 | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) | MAP (_ AS _0) | AGG (sum_l(_._0.A) AS _0, sum_l(_._0.B) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, _._0._1 AS B)" - unorderedResult: [{A: 74 , B: 13}] - - query: select col1, col2 from t1 union all select col1, col2 from t1 @@ -164,14 +164,14 @@ test_block: # Does not work in force continuations mode on prior versions due to: https://github.com/FoundationDB/fdb-record-layer/issues/3096 # Hard to write asserts for on older versions, but no unexpected mixed mode issues when running with older versions - supported_version: 4.1.9.0 - - explain: "AISCAN(MV10 [[LESS_THAN promote(@c22 AS DOUBLE)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) | MAP (_.Y AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) | MAP (_.Y AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - result: [{S: 2}] - - query: select sum(Y) as S from (select count(*) as Y from t3 union all select count(*) from t1) as X # Does not work in force continuations mode on prior versions due to: https://github.com/FoundationDB/fdb-record-layer/issues/3096 # Hard to write asserts for on older versions, but no unexpected mixed mode issues when running with older versions - supported_version: 4.1.9.0 - - explain: "SCAN(<,>) | TFILTER T3 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) | MAP (_.Y AS Y) ⊎ ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "SCAN(<,>) | TFILTER T3 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) | MAP (_.Y AS Y) ⊎ ISCAN(VI1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - result: [{S: 5}] - - query: select col2 from t1 where exists (select a from t3 where col2 <= id union all select b from t4 where col2 <= id) @@ -201,7 +201,7 @@ test_block: - error: "42F65" - - query: select sum(Y) as S from (select count(*) as Y from t6 union all select count(*) from t7) as X - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) | MAP (_.Y AS Y) ⊎ AISCAN(MV12 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "AISCAN(MV11 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) | MAP (_.Y AS Y) ⊎ AISCAN(MV12 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - maxRows: 0 # Disable force_continuations until we no longer care about versions before 4.1.9.0 # Value returned on empty changed in 4.0.561.0 due to: https://github.com/FoundationDB/fdb-record-layer/pull/3029 - initialVersionLessThan: 4.0.561.0 diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/uuid.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/uuid.yamsql index 097f2606ff..0e7c42e2bd 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/uuid.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/uuid.yamsql @@ -242,7 +242,7 @@ test_block: tests: - - query: select b, c from tc order by b - - explain: "COVERING(TC1 <,> -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | MAP (_.B AS B, _.C AS C)" + - explain: "COVERING(TC1) | MAP (_.B AS B, _.C AS C)" - result: [{!uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}, {!uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b', 3}, {!uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, @@ -251,7 +251,7 @@ test_block: {!uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682', 4}] - - query: select * from tc order by b - - explain: "ISCAN(TC1 <,>)" + - explain: "ISCAN(TC1)" - result: [{1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}, {4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b', 3}, {2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, @@ -260,18 +260,18 @@ test_block: {3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682', 4}] - - query: select * from tc where b > 'a8708750-d70f-4800-8c3b-13700d5b369f' order by b - - explain: "ISCAN(TC1 [[GREATER_THAN promote(@c8 AS UUID)]])" + - explain: "ISCAN(TC1)" - result: [{3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682', 4}] - - query: select * from tc where b < 'a8708750-d70f-4800-8c3b-13700d5b369f' order by b desc - - explain: "ISCAN(TC1 [[LESS_THAN promote(@c8 AS UUID)]] REVERSE)" + - explain: "ISCAN(TC1)" - result: [{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6', 1}, {2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, {4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b', 3}, {1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}] - - query: select * from tc where b < 'a8708750-d70f-4800-8c3b-13700d5b369f' and c > 4 order by b desc - - explain: "COVERING(TC1 [[LESS_THAN promote(@c8 AS UUID)]] REVERSE -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | FILTER _.C GREATER_THAN promote(@c12 AS LONG) | FETCH" + - explain: "COVERING(TC1) | FILTER _.C GREATER_THAN promote(@c12 AS LONG) | FETCH" - result: [{2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, {1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}] ... diff --git a/yaml-tests/src/test/resources/disabled-planner-rewrites/versions-tests.yamsql b/yaml-tests/src/test/resources/disabled-planner-rewrites/versions-tests.yamsql index 06a94ddfab..b1cf4d00ca 100644 --- a/yaml-tests/src/test/resources/disabled-planner-rewrites/versions-tests.yamsql +++ b/yaml-tests/src/test/resources/disabled-planner-rewrites/versions-tests.yamsql @@ -52,54 +52,54 @@ test_block: tests: - - query: select "__ROW_VERSION" as version, t1.col2 from t1 where col1 = 10; - - explain: "ISCAN(I1 [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS VERSION, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _.COL2 AS COL2)" - result: [{VERSION: !not_null _, COL2: 1}, {VERSION: !not_null _, COL2: 2}, {VERSION: !not_null _, COL2: 3}, {VERSION: !not_null _, COL2: 4}, {VERSION: !not_null _, COL2: 5}] - # Do not include __ROW_VERSION (as a pseudo-column) in * - query: select t1.* from t1 where col1 = 10; - - explain: "ISCAN(I1 [EQUALS promote(@c10 AS LONG)])" + - explain: "ISCAN(I1)" - result: [{ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, {ID: 3, COL1: 10, COL2: 3}, {ID: 4, COL1: 10, COL2: 4}, {ID: 5, COL1: 10, COL2: 5}] - # Get version column from sub-select - query: select s.version, s.col2 from (select "__ROW_VERSION" as version, t1.col2 as col2 from t1 where col1 = 10) AS s; - - explain: "ISCAN(I1 [EQUALS promote(@c26 AS LONG)]) | MAP (version([_]) AS VERSION, _.COL2 AS COL2) | MAP (_.VERSION AS VERSION, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _.COL2 AS COL2) | MAP (_.VERSION AS VERSION, _.COL2 AS COL2)" - result: [{VERSION: !not_null _, COL2: 1}, {VERSION: !not_null _, COL2: 2}, {VERSION: !not_null _, COL2: 3}, {VERSION: !not_null _, COL2: 4}, {VERSION: !not_null _, COL2: 5}] - # In inner select, the pseudo-column is selected but not renamed. Then, in the outer select, the column is read and returned, and a new version(S) value is *not* created - query: select s."__ROW_VERSION", s.col2 from (select "__ROW_VERSION", t1.col2 from t1 where col1 = 10) AS s; - - explain: "ISCAN(I1 [EQUALS promote(@c22 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _.COL2 AS COL2) | MAP (_.__ROW_VERSION AS __ROW_VERSION, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS __ROW_VERSION, _.COL2 AS COL2) | MAP (_.__ROW_VERSION AS __ROW_VERSION, _.COL2 AS COL2)" - result: [{__ROW_VERSION: !not_null _, COL2: 1}, {__ROW_VERSION: !not_null _, COL2: 2}, {__ROW_VERSION: !not_null _, COL2: 3}, {__ROW_VERSION: !not_null _, COL2: 4}, {__ROW_VERSION: !not_null _, COL2: 5}] - - query: select "__ROW_VERSION" as version, t1.* from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" - result: [{VERSION: !not_null _, ID: 6, COL1: 20, COL2: 6}, {VERSION: !not_null _, ID: 7, COL1: 20, COL2: 7}, {VERSION: !not_null _, ID: 8, COL1: 20, COL2: 8}, {VERSION: !not_null _, ID: 9, COL1: 20, COL2: 9}, {VERSION: !not_null _, ID: 10, COL1: 20, COL2: 10}, {VERSION: !not_null _, ID: 11, COL1: 20, COL2: 11}, {VERSION: !not_null _, ID: 12, COL1: 20, COL2: 12}, {VERSION: !not_null _, ID: 13, COL1: 20, COL2: 13}] - - query: select "__ROW_VERSION" as version, (t1.*) from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c16 AS LONG)]) | MAP (version([_]) AS VERSION, _ AS _1)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _ AS _1)" - result: [{VERSION: !not_null _, {ID: 6, COL1: 20, COL2: 6}}, {VERSION: !not_null _, {ID: 7, COL1: 20, COL2: 7}}, {VERSION: !not_null _, {ID: 8, COL1: 20, COL2: 8}}, {VERSION: !not_null _, {ID: 9, COL1: 20, COL2: 9}}, {VERSION: !not_null _, {ID: 10, COL1: 20, COL2: 10}}, {VERSION: !not_null _, {ID: 11, COL1: 20, COL2: 11}}, {VERSION: !not_null _, {ID: 12, COL1: 20, COL2: 12}}, {VERSION: !not_null _, {ID: 13, COL1: 20, COL2: 13}}] - - query: select "__ROW_VERSION", t1.* from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c12 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" - result: [{__ROW_VERSION: !not_null _, ID: 6, COL1: 20, COL2: 6}, {__ROW_VERSION: !not_null _, ID: 7, COL1: 20, COL2: 7}, {__ROW_VERSION: !not_null _, ID: 8, COL1: 20, COL2: 8}, {__ROW_VERSION: !not_null _, ID: 9, COL1: 20, COL2: 9}, {__ROW_VERSION: !not_null _, ID: 10, COL1: 20, COL2: 10}, {__ROW_VERSION: !not_null _, ID: 11, COL1: 20, COL2: 11}, {__ROW_VERSION: !not_null _, ID: 12, COL1: 20, COL2: 12}, {__ROW_VERSION: !not_null _, ID: 13, COL1: 20, COL2: 13}] - - query: select "__ROW_VERSION", (t1.*) from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _ AS _1)" + - explain: "ISCAN(I1) | MAP (version([_]) AS __ROW_VERSION, _ AS _1)" - result: [{__ROW_VERSION: !not_null _, {ID: 6, COL1: 20, COL2: 6}}, {__ROW_VERSION: !not_null _, {ID: 7, COL1: 20, COL2: 7}}, {__ROW_VERSION: !not_null _, {ID: 8, COL1: 20, COL2: 8}}, {__ROW_VERSION: !not_null _, {ID: 9, COL1: 20, COL2: 9}}, {__ROW_VERSION: !not_null _, {ID: 10, COL1: 20, COL2: 10}}, {__ROW_VERSION: !not_null _, {ID: 11, COL1: 20, COL2: 11}}, {__ROW_VERSION: !not_null _, {ID: 12, COL1: 20, COL2: 12}}, {__ROW_VERSION: !not_null _, {ID: 13, COL1: 20, COL2: 13}}] - - query: select "__ROW_VERSION", t1.id from t1 order by "__ROW_VERSION" ASC; - - explain: "ISCAN(VERSION_INDEX <,>) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 1}, {__ROW_VERSION: !not_null _, ID: 3}, {__ROW_VERSION: !not_null _, ID: 5}, {__ROW_VERSION: !not_null _, ID: 7}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 2}, {__ROW_VERSION: !not_null _, ID: 4}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 12}] - - query: select t1."__ROW_VERSION", t1.id from t1 order by "__ROW_VERSION" DESC; - - explain: "ISCAN(VERSION_INDEX <,> REVERSE) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 12}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 4}, {__ROW_VERSION: !not_null _, ID: 2}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 7}, {__ROW_VERSION: !not_null _, ID: 5}, {__ROW_VERSION: !not_null _, ID: 3}, {__ROW_VERSION: !not_null _, ID: 1}] - - query: select t1."__ROW_VERSION", t1.id from t1 where col1 = 20 order by "__ROW_VERSION" ASC; - - explain: "ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(GROUPED_VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 7}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 12}] - - query: select "__ROW_VERSION", t1.id from t1 where col1 = 20 order by "__ROW_VERSION" DESC; - - explain: "ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c12 AS LONG)] REVERSE) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(GROUPED_VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 12}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 7}] - - query: select t1."__ROW_VERSION", t1.id from t1 where col1 = 20 order by t1."__ROW_VERSION" ASC; @@ -113,7 +113,7 @@ test_block: # - result: [{__ROW_VERSION: !not_null _, COL1: 10, ID: 1}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 3}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 5}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 2}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 4}] - - query: select "__ROW_VERSION", col1, t1.id from t1 where col1 > 10 order by col1 asc, "__ROW_VERSION" asc; - - explain: "ISCAN(GROUPED_VERSION_INDEX [[GREATER_THAN promote(@c14 AS LONG)]]) | MAP (version([_]) AS __ROW_VERSION, _.COL1 AS COL1, _.ID AS ID)" + - explain: "ISCAN(GROUPED_VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.COL1 AS COL1, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, COL1: 20, ID: 7}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 9}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 11}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 13}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 6}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 8}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 10}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 12}] # - # - query: select "__ROW_VERSION", col1, t1.id from t1 where (col1 = 10 AND "__ROW_VERSION" > 'AAAAAAAAAAAAAAAA') OR col1 > 10 order by col1 asc, "__ROW_VERSION" asc; diff --git a/yaml-tests/src/test/resources/distinct-from.yamsql b/yaml-tests/src/test/resources/distinct-from.yamsql index ce8ebc3734..a24701c4ee 100644 --- a/yaml-tests/src/test/resources/distinct-from.yamsql +++ b/yaml-tests/src/test/resources/distinct-from.yamsql @@ -47,27 +47,27 @@ test_block: tests: - - query: select * from t1 WHERE col2 is distinct from null - - explain: "COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER _.COL2 IS_DISTINCT_FROM NULL | FETCH" + - explain: "COVERING(I2) | FILTER _.COL2 IS_DISTINCT_FROM NULL | FETCH" - result: [{ID: 1, 10, 1}, {ID: 3, 10, 3}, {ID: 5, 10, 5}, {ID: 9, 20, 9}, {ID: 10, 20, 10}] - - query: select * from t1 WHERE col1 is DISTINCT from 10 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 IS_DISTINCT_FROM promote(@c10 AS INT) | FETCH" + - explain: "COVERING(I1) | FILTER _.COL1 IS_DISTINCT_FROM promote(@c10 AS INT) | FETCH" - result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}] - - query: select * from t1 WHERE null is distinct from col2 - - explain: "COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER _.COL2 IS_DISTINCT_FROM NULL | FETCH" + - explain: "COVERING(I2) | FILTER _.COL2 IS_DISTINCT_FROM NULL | FETCH" - result: [{ID: 1, 10, 1}, {ID: 3, 10, 3}, {ID: 5, 10, 5}, {ID: 9, 20, 9}, {ID: 10, 20, 10}] - - query: select * from t1 WHERE 10 is distinct from col1 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 IS_DISTINCT_FROM promote(@c6 AS INT) | FETCH" + - explain: "COVERING(I1) | FILTER _.COL1 IS_DISTINCT_FROM promote(@c6 AS INT) | FETCH" - result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}] - - query: select * from t1 WHERE null is distinct from null - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER NULL IS_DISTINCT_FROM NULL | FETCH" + - explain: "COVERING(I1) | FILTER NULL IS_DISTINCT_FROM NULL | FETCH" - result: [] - - query: select * from t1 WHERE 10 is distinct from 10 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER @c6 IS_DISTINCT_FROM @c6 | FETCH" + - explain: "COVERING(I1) | FILTER @c6 IS_DISTINCT_FROM @c6 | FETCH" - result: [] --- @@ -76,26 +76,26 @@ test_block: tests: - - query: select * from t1 WHERE col2 is not distinct from null - - explain: "COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER _.COL2 NOT_DISTINCT_FROM NULL | FETCH" + - explain: "COVERING(I2) | FILTER _.COL2 NOT_DISTINCT_FROM NULL | FETCH" - result: [{ID: 2, 10, !null }, {ID: 4, 10, !null }, {ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }] - - query: select * from t1 WHERE col1 is not distinct from 20 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 NOT_DISTINCT_FROM promote(@c11 AS INT) | FETCH" + - explain: "COVERING(I1) | FILTER _.COL1 NOT_DISTINCT_FROM promote(@c11 AS INT) | FETCH" - result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}] - - query: select * from t1 WHERE null is not distinct from col2 - - explain: "COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER _.COL2 NOT_DISTINCT_FROM NULL | FETCH" + - explain: "COVERING(I2) | FILTER _.COL2 NOT_DISTINCT_FROM NULL | FETCH" - result: [{ID: 2, 10, !null }, {ID: 4, 10, !null }, {ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }] - - query: select * from t1 WHERE 20 is not distinct from col1 - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.COL1 NOT_DISTINCT_FROM promote(@c6 AS INT) | FETCH" + - explain: "COVERING(I1) | FILTER _.COL1 NOT_DISTINCT_FROM promote(@c6 AS INT) | FETCH" - result: [{ID: 6, 20, !null }, {ID: 7, 20, !null }, {ID: 8, 20, !null }, {ID: 9, 20, 9}, {ID: 10, 20, 10}] - - query: select count(*) from t1 WHERE null is not distinct from null - - explain: "COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER NULL NOT_DISTINCT_FROM NULL | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(I2) | FILTER NULL NOT_DISTINCT_FROM NULL | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{10}] - - query: select count(*) from t1 WHERE 10 is not distinct from 10 - - explain: "COVERING(I2 <,> -> [COL2: KEY[0], ID: KEY[2]]) | FILTER @c9 NOT_DISTINCT_FROM @c9 | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(I2) | FILTER @c9 NOT_DISTINCT_FROM @c9 | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{10}] ... diff --git a/yaml-tests/src/test/resources/groupby-tests.yamsql b/yaml-tests/src/test/resources/groupby-tests.yamsql index cca197c77e..c568085937 100644 --- a/yaml-tests/src/test/resources/groupby-tests.yamsql +++ b/yaml-tests/src/test/resources/groupby-tests.yamsql @@ -133,7 +133,7 @@ test_block: - result: [{!l 5}, {!l 8}] - - query: select AVG(x.col2) from (select col1,col2 from t1) as x group by x.col1; - - explain: "ISCAN(I1 <,>) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (avg_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" + - explain: "ISCAN(I1) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (avg_l(_._0.COL2) AS _0) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 AS _0)" - result: [{3.0}, {9.5}] - - query: select SUM(x.col2) from (select col1,col2 from t1) as x group by x.col1; @@ -141,7 +141,7 @@ test_block: - # result is correct since we don't use (not support, yet) explicit casting. - query: select SUM(x.col2) / COUNT(x.col2), AVG(x.col2) from (select col1,col2 from t1) as x group by x.col1; - - explain: "ISCAN(I1 <,>) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (sum_l(_._0.COL2) AS _0, count(_._0.COL2) AS _1, avg_l(_._0.COL2) AS _2) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 / _._1._1 AS _0, _._1._2 AS _1)" + - explain: "ISCAN(I1) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (sum_l(_._0.COL2) AS _0, count(_._0.COL2) AS _1, avg_l(_._0.COL2) AS _2) GROUP BY (_._0.COL1 AS _0) | MAP (_._1._0 / _._1._1 AS _0, _._1._2 AS _1)" - result: [{!l 3, 3.0}, {!l 9, 9.5}] - - query: select MAX(x.col2) from (select col1 from t1) as x group by x.col1; @@ -151,19 +151,19 @@ test_block: - error: "42803" - - query: select MAX(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(I1) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (max_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 13}] - - query: select MIN(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (min_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(I1) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (min_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{!l 1}] - - query: select COUNT(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (count(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{!l 13}] - - query: select AVG(x.col2) from (select col1,col2 from t1) as x; - - explain: "ISCAN(I1 <,>) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (avg_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" + - explain: "ISCAN(I1) | MAP ((_.COL1 AS COL1, _.COL2 AS COL2) AS _0) | AGG (avg_l(_._0.COL2) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS _0)" - result: [{7.0}] - - query: select x.col1 + 10 from (select col1 from t1) as x group by x.col1; @@ -182,11 +182,11 @@ test_block: - result: [{!l 10}] - - query: select COUNT(*) from T1; - - explain: "ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{!l 13}] - - query: select COUNT(col1) from T1; - - explain: "ISCAN(I1 <,>) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "ISCAN(I1) | MAP (_ AS _0) | AGG (count(_._0.COL1) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{!l 13}] - - query: select x from t1 group by col1 as x, col2 as x; diff --git a/yaml-tests/src/test/resources/indexed-functions.yamsql b/yaml-tests/src/test/resources/indexed-functions.yamsql index 6192e0b53d..728e9a0fcc 100644 --- a/yaml-tests/src/test/resources/indexed-functions.yamsql +++ b/yaml-tests/src/test/resources/indexed-functions.yamsql @@ -42,7 +42,7 @@ test_block: tests: - - query: select * from t where b + c > 7; - - explain: "ISCAN(BPLUSC [[GREATER_THAN promote(@c10 AS LONG)]])" + - explain: "ISCAN(BPLUSC)" - unorderedResult: [ {A: 1, B: 1, C: 10, D: 3, E: 'alpha'}, {A: 2, B: 2, C: 8, D: 2, E: 'beta'}, @@ -51,7 +51,7 @@ test_block: ] - - query: select a, b + c AS sum from t where e = 'alpha' order by b + c; - - explain: "ISCAN(BPLUSCBYE [EQUALS promote(@c14 AS STRING)]) | MAP (_.A AS A, _.B + _.C AS SUM)" + - explain: "ISCAN(BPLUSCBYE) | MAP (_.A AS A, _.B + _.C AS SUM)" - result: [ { A: 9, SUM: 3 }, { A: 7, SUM: 5 }, @@ -78,7 +78,7 @@ test_block: # ] - - query: select * from t where d & 1 = 1; - - explainContains: "ISCAN(DMASK1 [EQUALS promote" + - explainContains: "ISCAN(DMASK1)" - unorderedResult: [ {A: 1, B: 1, C: 10, D: 3, E: 'alpha'}, {A: 3, B: 3, C: 6, D: 1, E: 'alpha'}, @@ -88,7 +88,7 @@ test_block: ] - - query: select * from t where d & 1 = 0; - - explain: "ISCAN(DMASK1 [EQUALS promote(@c10 AS LONG)])" + - explain: "ISCAN(DMASK1)" - unorderedResult: [ {A: 2, B: 2, C: 8, D: 2, E: 'beta'}, {A: 4, B: 4, C: 4, D: 0, E: 'beta'}, @@ -97,7 +97,7 @@ test_block: ] - - query: select * from t where d & 2 = 2; - - explainContains: "ISCAN(DMASK2 [EQUALS promote" + - explainContains: "ISCAN(DMASK2)" - unorderedResult: [ {A: 1, B: 1, C: 10, D: 3, E: 'alpha'}, {A: 2, B: 2, C: 8, D: 2, E: 'beta'}, @@ -107,7 +107,7 @@ test_block: ] - - query: select * from t where d & 2 = 0; - - explain: "ISCAN(DMASK2 [EQUALS promote(@c10 AS LONG)])" + - explain: "ISCAN(DMASK2)" - unorderedResult: [ {A: 3, B: 3, C: 6, D: 1, E: 'alpha'}, {A: 4, B: 4, C: 4, D: 0, E: 'beta'}, diff --git a/yaml-tests/src/test/resources/like.yamsql b/yaml-tests/src/test/resources/like.yamsql index 70f8434f03..10f7fbbcf3 100644 --- a/yaml-tests/src/test/resources/like.yamsql +++ b/yaml-tests/src/test/resources/like.yamsql @@ -154,7 +154,7 @@ test_block: {'\\||%'}] - - query: select * from C WHERE C2 LIKE '%' - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 1, C2: alphabet}, { C1: 2, C2: anticipation}, @@ -178,7 +178,7 @@ test_block: ] - - query: select * from C WHERE C2 LIKE 'a%' - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 1, C2: alphabet}, { C1: 2, C2: anticipation}, @@ -190,7 +190,7 @@ test_block: ] - - query: select * from C WHERE C2 LIKE 'ap%' - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 3, C2: aplomb}, { C1: 4, C2: apple}, @@ -199,7 +199,7 @@ test_block: ] - - query: select * from C WHERE C2 LIKE 'a%l%' - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 1, C2: alphabet}, { C1: 3, C2: aplomb}, @@ -277,7 +277,7 @@ test_block: - - query: select * from C WHERE C2 LIKE 'ca%' # In theory, this could be executed optimally with prefix string scan with the prefix "ca" - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 13, C2: cabal}, { C1: 14, C2: camel}, @@ -290,7 +290,7 @@ test_block: - query: select * from C WHERE C2 LIKE 'ca_al' # In theory, this could be optimized with prefix string scan with the prefix "ca" followed by compensation # to handle filtering out based on the tail - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 13, C2: cabal}, { C1: 15, C2: canal}, @@ -299,7 +299,7 @@ test_block: - query: select * from C WHERE C2 LIKE 'ca%al' # In theory, this could be optimized with prefix string scan with the prefix "ca" followed by compensation # to handle matching the tail - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 13, C2: cabal}, { C1: 15, C2: canal}, @@ -307,7 +307,7 @@ test_block: ] - - query: select * from C WHERE C2 LIKE 'ca_al%' - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 13, C2: cabal}, { C1: 15, C2: canal}, @@ -315,7 +315,7 @@ test_block: ] - - query: select * from C WHERE C2 LIKE 'ca%al%' - - explain: "COVERING(C2 <,> -> [C1: KEY[2], C2: KEY[0]]) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" + - explain: "COVERING(C2) | FILTER _.C2 LIKE @c8 ESCAPE 'null' | FETCH" - result: [ { C1: 13, C2: cabal}, { C1: 15, C2: canal}, diff --git a/yaml-tests/src/test/resources/nested-with-nulls.yamsql b/yaml-tests/src/test/resources/nested-with-nulls.yamsql index 8d129aae66..7f200baa3a 100644 --- a/yaml-tests/src/test/resources/nested-with-nulls.yamsql +++ b/yaml-tests/src/test/resources/nested-with-nulls.yamsql @@ -44,125 +44,125 @@ test_block: tests: - - query: select id from t1 where a.a.a IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.A.A IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.A.A IS_NULL | MAP (_.ID AS ID)" - result: [] - - query: select id from t1 where a.a.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.A.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.A.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where a.b.a IS NULL - - explain: "COVERING(I1 [[null],[null]] -> [ID: KEY[2], A: [B: [A: KEY[0]]]]) | MAP (_.ID AS ID)" + - explain: "COVERING(I1) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 107 }] - - query: select id from t1 where a.b.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.B.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.B.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where b.a.a IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.A IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.A IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 102 }, { ID: 103 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where b.a.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where b.b.a IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.A IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.A IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where b.b.b IS NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.B IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.B IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where a.a.a IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.A.A NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.A.A NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 } ] - - query: select id from t1 where a.a.b IS NOT NULL - - explain: "COVERING(I2 ([null],> -> [ID: KEY[2], A: [A: [B: KEY[0]]]]) | MAP (_.ID AS ID)" + - explain: "COVERING(I2) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }] - - query: select id from t1 where a.b.a IS NOT NULL - - explain: "COVERING(I1 ([null],> -> [ID: KEY[2], A: [B: [A: KEY[0]]]]) | MAP (_.ID AS ID)" + - explain: "COVERING(I1) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 104 }, { ID: 105 }, { ID: 106 }] - - query: select id from t1 where a.b.b IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.A.B.B NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.A.B.B NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }] - - query: select id from t1 where b.a.a IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.A NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.A NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 104 }, { ID: 105 }] - - query: select id from t1 where b.a.b IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.A.B NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.A.B NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }] - - query: select id from t1 where b.b.a IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.A NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.A NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 104 } ] - - query: select id from t1 where b.b.b IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER _.B.B.B NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER _.B.B.B NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }] - - query: select id from t1 where coalesce(a.a.a, 'blah') = 'a1' - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }] - - query: select id from t1 where coalesce(a.a.a, 'blah') = 'a1p' - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) EQUALS promote(@c17 AS STRING) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - # As 'blah' is not nullable, so this predicate could be simplified to TRUE - query: select id from t1 where coalesce(a.a.a, 'blah') IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - # The coalesce could be removed and replaced with a simple field access - query: select id from t1 where coalesce(a.a.a, null) IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.A.A, NULL) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.A.A, NULL) NOT_NULL | MAP (_.ID AS ID)" - 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, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | 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, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) EQUALS promote(@c14 AS STRING) | 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, promote(@c14 AS STRING)) IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) 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: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, NULL) IS_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 103 }, { ID: 107 }] - # One of the two coalesce values is not null, so this could be simplified to TRUE - query: select id from t1 where coalesce(a.b.a, 'foo') IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_string(_.A.B.A, promote(@c14 AS STRING)) NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where coalesce(b.a.b, 3) = 3 - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] - - query: select id from t1 where coalesce(b.a.b, 42) = 42 - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) EQUALS promote(@c14 AS LONG) | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { 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(b.a.b, 42) IS NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) IS_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) IS_NULL | MAP (_.ID AS ID)" - result: [] - # One of the two coalesce values is not null, so this could be simplified to TRUE - query: select id from t1 where coalesce(b.a.b, 42) IS NOT NULL - - explain: "ISCAN(I1 <,>) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) NOT_NULL | MAP (_.ID AS ID)" + - explain: "ISCAN(I1) | FILTER coalesce_long(_.B.A.B, promote(@c14 AS LONG)) NOT_NULL | MAP (_.ID AS ID)" - unorderedResult: [{ ID: 100 }, { ID: 101 }, { ID: 102 }, { ID: 103 }, { ID: 104 }, { ID: 105 }, { ID: 106 }, { ID: 107 }] ... diff --git a/yaml-tests/src/test/resources/null-extraction-tests.yamsql b/yaml-tests/src/test/resources/null-extraction-tests.yamsql index bcb094ebc5..8b0f74c60e 100644 --- a/yaml-tests/src/test/resources/null-extraction-tests.yamsql +++ b/yaml-tests/src/test/resources/null-extraction-tests.yamsql @@ -46,7 +46,7 @@ test_block: # retains the remaining predicate (b1 < 20) and must fall back to a less efficient covering # scan or potentially worse execution strategy. - query: select * from B where b3 = 4 and b2 = 'b' and (!! !n null !! is null or b1 < 20) - - explain: "ISCAN(I1 [EQUALS promote(@c8 AS LONG), EQUALS @c12])" + - explain: "ISCAN(I1)" - result: [{3, 'b', 4}] - # This query contains two `null` values, creating an equality constraint that handles `null` @@ -55,23 +55,23 @@ test_block: # subsequent runs of the same query will reuse the cached plan since the equality constraint # is satisfied when both arguments are `null`. - query: select * from B where !! !n null !! = 42 and !! !n null !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER promote(@c8 AS INT) EQUALS @c6 AND promote(@c12 AS INT) EQUALS @c6 | FETCH" - result: [] - - query: select * from B where !! !n null !! = 42 and !! 50 !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER null AND @c12 EQUALS @c10 | FETCH" - result: [] - - query: select * from B where !! 41 !! = 42 and !! !n null !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER null AND @c8 EQUALS @c6 | FETCH" - result: [] - - query: select * from B where !! 46 !! = 42 and !! 47 !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER @c8 EQUALS @c6 AND @c12 EQUALS @c10 | FETCH" - result: [] - - query: select * from B where !! 42 !! = 42 and !! 43 !! = 43 and !! 45 !! = 45 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER @c6 EQUALS @c6 AND @c10 EQUALS @c10 AND @c14 EQUALS @c14 | FETCH" - result: [{1, 'a', 2}, {3, 'b', 4}, {5, 'c', 6}] --- test_block: @@ -84,26 +84,26 @@ test_block: tests: - - query: select * from B where b3 = 4 and b2 = 'b' and (!! !n null !! is null or b1 < 20) - - explain: "COVERING(I1 [EQUALS promote(@c8 AS LONG), EQUALS promote(@c12 AS STRING)] -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]]) | FILTER @c15 IS_NULL OR _.B1 LESS_THAN promote(@c21 AS INT) | FETCH" + - explain: "COVERING(I1) | FILTER @c15 IS_NULL OR _.B1 LESS_THAN promote(@c21 AS INT) | FETCH" - result: [{3, 'b', 4}] - - query: select * from B where !! !n null !! = 42 and !! !n null !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER promote(@c8 AS INT) EQUALS @c6 AND promote(@c12 AS INT) EQUALS @c6 | FETCH" - result: [] - - query: select * from B where !! !n null !! = 42 and !! 50 !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER promote(@c8 AS INT) EQUALS @c6 AND @c12 EQUALS @c10 | FETCH" - result: [] - - query: select * from B where !! 41 !! = 42 and !! !n null !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER @c8 EQUALS @c6 AND promote(@c12 AS INT) EQUALS @c10 | FETCH" - result: [] - - query: select * from B where !! 46 !! = 42 and !! 47 !! = 43 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER @c8 EQUALS @c6 AND @c12 EQUALS @c10 | FETCH" - result: [] - - query: select * from B where !! 42 !! = 42 and !! 43 !! = 43 and !! 45 !! = 45 - - explainContains: "COVERING(I1 <,> -> [B1: KEY[3], B2: KEY[1], B3: KEY[0]])" + - explainContains: "COVERING(I1) | FILTER @c6 EQUALS @c6 AND @c10 EQUALS @c10 AND @c14 EQUALS @c14 | FETCH" - result: [{1, 'a', 2}, {3, 'b', 4}, {5, 'c', 6}] ... diff --git a/yaml-tests/src/test/resources/null-operator-tests.yamsql b/yaml-tests/src/test/resources/null-operator-tests.yamsql index 0220f09102..22d27634f7 100644 --- a/yaml-tests/src/test/resources/null-operator-tests.yamsql +++ b/yaml-tests/src/test/resources/null-operator-tests.yamsql @@ -47,7 +47,7 @@ test_block: - result: [] - - query: select count(*) from (select * from (select * from T1) as x where ID is not null) as y; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID NOT_NULL | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(I1) | FILTER _.ID NOT_NULL | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{13}] # - # - query: select count(*) from (select * from (select * from T1) as x where ID != null) as y; diff --git a/yaml-tests/src/test/resources/orderby.yamsql b/yaml-tests/src/test/resources/orderby.yamsql index b4b4bfc989..e42a47cfd5 100644 --- a/yaml-tests/src/test/resources/orderby.yamsql +++ b/yaml-tests/src/test/resources/orderby.yamsql @@ -242,24 +242,24 @@ test_block: - # Ordering by a non projected column - query: select c from t1 order by b - - explain: "COVERING(I1 <,> -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" + - explain: "COVERING(I1) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" - result: [ {0}, {0}, {1}, {1}, {8}, {8}, {8}, {5}, {5}, {5} ] - - query: select b from t1 order by c - - explain: "COVERING(I2 <,> -> [A: KEY[2], B: VALUE[0], C: KEY[0]]) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" + - explain: "COVERING(I2) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" - result: [ {2}, {1}, {4}, {3}, {10}, {9}, {8}, {7}, {6}, {5} ] - # Ordering by a non projected column desc - query: select c from t1 order by b desc - - explain: "COVERING(I1 <,> REVERSE -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" + - explain: "COVERING(I1) | MAP (_.C AS C, _.B AS B) | MAP (_.C AS C)" - result: [ {5}, {5}, {5}, {8}, {8}, {8}, {1}, {1}, {0}, {0} ] - - query: select b from t1 order by c desc - - explain: "COVERING(I2 <,> REVERSE -> [A: KEY[2], B: VALUE[0], C: KEY[0]]) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" + - explain: "COVERING(I2) | MAP (_.B AS B, _.C AS C) | MAP (_.B AS B)" - result: [ {5}, {6}, {7}, {8}, {9}, {10}, {3}, {4}, {1}, {2} ] - # Simple ordering on 2 variable, mixed ordering - query: select c, b from t5 order by c, b desc; - - explain: "COVERING(I8 <,> -> [A: KEY[3], B: from_ordered_bytes(KEY:[1], DESC_NULLS_LAST), C: KEY[0]]) | MAP (_.C AS C, _.B AS B)" + - explain: "COVERING(I8) | MAP (_.C AS C, _.B AS B)" - result: [{0, 2}, {0, 1}, {1, 4}, {1, 3}, {5, 10}, {5, 9}, {5, 8}, {8, 7}, {8, 6}, {8, 5}] ... diff --git a/yaml-tests/src/test/resources/recursive-cte.yamsql b/yaml-tests/src/test/resources/recursive-cte.yamsql index 0a8ed60bb7..95e087e311 100644 --- a/yaml-tests/src/test/resources/recursive-cte.yamsql +++ b/yaml-tests/src/test/resources/recursive-cte.yamsql @@ -29,7 +29,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 q0, q1 { INITIAL { ISCAN(PARENTIDX [EQUALS promote(@c15 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)" + - explain: "RUNION q0, q1 { INITIAL { ISCAN(PARENTIDX) | 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)" - unorderedResult: [{ID: 1}, {ID: 10}, {ID: 20}, @@ -44,7 +44,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 q0, q1 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c15 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)" + - explain: "RUNION q0, q1 { INITIAL { ISCAN(CHILDIDX) | 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)" - result: [{ID: 250}, {ID: 50}, {ID: 10}, @@ -57,7 +57,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 q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c20 AS LONG)]) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" - result: [{250, 50}, {50, 10}, {10, 1}, @@ -80,7 +80,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 q0, q1 { INITIAL { ISCAN(PARENTIDX [EQUALS promote(@c15 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) + - explain: RUNION q0, q1 { INITIAL { ISCAN(PARENTIDX) | 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) - maxRows: 1 - result: [{ID: 1}] - result: [{ID: 10}] @@ -100,7 +100,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 q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX [EQUALS promote(@c20 AS LONG)]) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX <,>) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" + - explain: "RUNION q0, q1 { INITIAL { RUNION q2, q3 { INITIAL { ISCAN(CHILDIDX) | INSERT INTO TEMP q3 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q4 -> { TEMP SCAN base() | FILTER _.PARENT EQUALS q4.ID AS q5 RETURN (q4.ID AS ID, q4.PARENT AS PARENT) } | INSERT INTO TEMP q3 }} | MAP (_.ID AS ID, _.PARENT AS PARENT) | INSERT INTO TEMP q1 } RECURSIVE { ISCAN(CHILDIDX) | FLATMAP q6 -> { TEMP SCAN base() | FILTER _.ID EQUALS q6.PARENT AS q7 RETURN (q6.ID AS ID, q6.PARENT AS PARENT) } | INSERT INTO TEMP q1 }} | MAP (_.ID AS ID, _.PARENT AS PARENT)" - maxRows: 1 - result: [{250, 50}] - result: [{50, 10}] diff --git a/yaml-tests/src/test/resources/select-a-star.yamsql b/yaml-tests/src/test/resources/select-a-star.yamsql index 23bd9ee899..065bf5ff38 100644 --- a/yaml-tests/src/test/resources/select-a-star.yamsql +++ b/yaml-tests/src/test/resources/select-a-star.yamsql @@ -40,7 +40,7 @@ test_block: tests: - - query: select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); - - explain: "SCAN(<,>) | TFILTER 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(<,>) | TFILTER 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) }" - result: [{1}, {2}, {3}] - - query: select A.* from A; @@ -79,11 +79,11 @@ test_block: - error: "42803" - - query: select B1 from B where exists (select A.*, B1 from A group by A1,A2,A3); - - explain: "SCAN(<,>) | TFILTER 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(<,>) | TFILTER 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) }" - result: [{1}, {2}, {3}] - - query: select B.* from B where exists (select A.*, B.* from A group by A1,A2,A3); - - explain: "SCAN(<,>) | TFILTER 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(<,>) | TFILTER 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 }" - result: [{1, 20, {4, 40}}, {2, 20, {5, 50}}, {3, 20, {6, 60}}] diff --git a/yaml-tests/src/test/resources/sparse-index-tests.yamsql b/yaml-tests/src/test/resources/sparse-index-tests.yamsql index 9eb5d0b760..a0b4c74afc 100644 --- a/yaml-tests/src/test/resources/sparse-index-tests.yamsql +++ b/yaml-tests/src/test/resources/sparse-index-tests.yamsql @@ -36,28 +36,28 @@ test_block: tests: - - query: select id from t3 where tombstone = true or tombstone is not null - - explainContains: "COVERING(I4 <,>" + - explainContains: "COVERING(I4) | MAP (_.ID AS ID)" - - query: select id from t3 where tombstone = true or tombstone is not null - - explainContains: "COVERING(I4 <,>" + - explainContains: "COVERING(I4) | MAP (_.ID AS ID)" - - query: select id from t3 where tombstone = true or tombstone is not null - - explainContains: "COVERING(I4 <,>" + - explainContains: "COVERING(I4) | MAP (_.ID AS ID)" - - query: select tombstone from t2 where tombstone is null - explainContains: "SCAN(" - - query: select tombstone from t2 where tombstone is not null - - explainContains: "COVERING(I3 ([null],>" + - explainContains: "COVERING(I3) | MAP (_.TOMBSTONE AS TOMBSTONE)" - - query: select id from t5 where col1 < 40 or col1 > 90 - - explainContains: "COVERING(I6 <,>" + - explainContains: "COVERING(I6) | MAP (_.ID AS ID)" - - query: select id from t5 where col1 < 40 or col1 > 90 - - explainContains: "COVERING(I6 <,>" + - explainContains: "COVERING(I6) | MAP (_.ID AS ID)" - - query: select id from t5 where col1 < 40 or col1 > 90 - - explainContains: "COVERING(I6 <,>" + - explainContains: "COVERING(I6) | MAP (_.ID AS ID)" --- # Following tests are executed in order as the index used depends on which query warms up the cache. In this particular # scenario, the first query puts the plan in cache, which cannot be used by second query that would use the one with @@ -69,21 +69,21 @@ test_block: tests: - - query: select id from t1 where col1 < 100 - - explainContains: "COVERING(I1 " + - explainContains: "COVERING(I1) | MAP (_.ID AS ID)" - result: [] - - query: select id from t1 where col1 < 453 - - explainContains: "COVERING(I2 " + - explainContains: "COVERING(I2) | MAP (_.ID AS ID)" - result: [] - - query: select col1 from t1 where col1 > 55 and col1 < 100 - - explainContains: "COVERING(I1 [[GREATER_THAN promote(@c8 AS INT) && LESS_THAN promote(@c12 AS INT)]]" + - explainContains: "COVERING(I1) | MAP (_.COL1 AS COL1)" - - query: select col1 from t1 where col1 > 55 and col1 < 199 - - explainContains: "COVERING(I1 [[GREATER_THAN promote(@c8 AS INT) && LESS_THAN promote(@c12 AS INT)]]" + - explainContains: "COVERING(I1) | MAP (_.COL1 AS COL1)" - - query: select col1 from t1 where col1 > 50 and col1 < 350 - - explainContains: "COVERING(I2 [[GREATER_THAN promote(@c8 AS INT) && LESS_THAN promote(@c12 AS INT)]]" + - explainContains: "COVERING(I2) | MAP (_.COL1 AS COL1)" --- setup: steps: @@ -101,15 +101,15 @@ test_block: tests: - - query: select id from t1 where col1 < 200 - - explainContains: "COVERING(I1 " + - explainContains: "COVERING(I1) | MAP (_.ID AS ID)" - result: [{ID: 1}] - - query: select id from t1 where col1 < 201 - - explainContains: "COVERING(I2 " + - explainContains: "COVERING(I2) | MAP (_.ID AS ID)" - result: [{ID: 1}, {ID: 2}] - - query: select id from t1 where col1 < 250 - - explainContains: "COVERING(I2 " + - explainContains: "COVERING(I2) | MAP (_.ID AS ID)" - result: [{ID: 1}, {ID: 2}, {ID: 3}] - - query: select id from t1 where col1 < 500 diff --git a/yaml-tests/src/test/resources/sql-functions.yamsql b/yaml-tests/src/test/resources/sql-functions.yamsql index 568e413b52..e3c5e7bff0 100644 --- a/yaml-tests/src/test/resources/sql-functions.yamsql +++ b/yaml-tests/src/test/resources/sql-functions.yamsql @@ -60,111 +60,111 @@ test_block: tests: - - query: select col1, col2 from f1(a => 103, b => 'b'); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c14 AS STRING), [LESS_THAN promote(@c10 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select col1, col2 from f1(b => 'b', a => 103); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c10 AS STRING), [LESS_THAN promote(@c14 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select col1, col2 from f1(103, 'b'); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c10 AS STRING), [LESS_THAN promote(@c8 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select col1 + 10, col2 from f1(103, 'b'); - - explain: "ISCAN(T1_IDX1 [EQUALS promote(@c12 AS STRING), [LESS_THAN promote(@c10 AS LONG)]]) | MAP (_.COL1 + @c4 AS _0, _.COL2 AS COL2)" + - explain: "ISCAN(T1_IDX1) | MAP (_.COL1 + @c4 AS _0, _.COL2 AS COL2)" - result: [{111, 'b'}, {112, 'b'}] - - query: select * from f1(103, 'b'); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c6 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f1(103, 'b') where col1 = 101 - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), EQUALS promote(@c13 AS LONG)] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}] - - query: select * from f1(103 + 1, 'b') - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c10 AS STRING), [LESS_THAN promote(@c6 + @c8 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}, {103, 'b'}] - - query: select * from (select * from f1(103 + 1, 'b')) as x where col1 < 105 - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c14 AS STRING), [LESS_THAN promote(@c10 + @c12 AS LONG) && LESS_THAN promote(@c22 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}, {103, 'b'}] - - query: select A.col1 AS W, A.col2 AS X, B.col1 AS Y, B.col2 AS Z from f1(103, 'b') A, f1(103, 'b') B where A.col1 = B.col1 - - explain: "ISCAN(T1_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS promote(@c30 AS STRING), EQUALS q0.COL1] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | FILTER q0.COL1 LESS_THAN promote(@c28 AS LONG) AND q0.COL2 EQUALS promote(@c30 AS STRING) | FETCH AS q1 RETURN (q1.COL1 AS W, q1.COL2 AS X, q0.COL1 AS Y, q0.COL2 AS Z) }" + - explain: "ISCAN(T1_IDX1) | FLATMAP q0 -> { COVERING(T1_IDX1) | FILTER q0.COL1 LESS_THAN promote(@c28 AS LONG) AND q0.COL2 EQUALS promote(@c30 AS STRING) | FETCH AS q1 RETURN (q1.COL1 AS W, q1.COL2 AS X, q0.COL1 AS Y, q0.COL2 AS Z) }" - result: [{W: 101, X: 'b', Y: 101, Z: 'b'}, {W: 102, X: 'b', Y: 102, Z: 'b'}] - - query: select A.col1 AS W, A.col2 AS X, B.col1 AS Y, B.col2 AS Z from f1(a => 103, b => 'b') A, f1(a => 103, b => 'b') B where A.col1 = B.col1 - - explain: "ISCAN(T1_IDX1 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS promote(@c34 AS STRING), EQUALS q0.COL1] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | FILTER q0.COL1 LESS_THAN promote(@c30 AS LONG) AND q0.COL2 EQUALS promote(@c34 AS STRING) | FETCH AS q1 RETURN (q1.COL1 AS W, q1.COL2 AS X, q0.COL1 AS Y, q0.COL2 AS Z) }" + - explain: "ISCAN(T1_IDX1) | FLATMAP q0 -> { COVERING(T1_IDX1) | FILTER q0.COL1 LESS_THAN promote(@c30 AS LONG) AND q0.COL2 EQUALS promote(@c34 AS STRING) | FETCH AS q1 RETURN (q1.COL1 AS W, q1.COL2 AS X, q0.COL1 AS Y, q0.COL2 AS Z) }" - result: [{W: 101, X: 'b', Y: 101, Z: 'b'}, {W: 102, X: 'b', Y: 102, Z: 'b'}] - - query: with x(y, z) as (select * from f1(b => 'b', a => 103)) select * from x - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c17 AS STRING), [LESS_THAN promote(@c21 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS Y, _.COL2 AS Z)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS Y, _.COL2 AS Z)" - result: [{101, 'b'}, {102, 'b'}] - - query: with x(y, z) as (select * from f1(103, 'b')) select * from x - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c17 AS STRING), [LESS_THAN promote(@c15 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS Y, _.COL2 AS Z)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS Y, _.COL2 AS Z)" - 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 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | 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 -> { ISCAN(T1_IDX1) | FILTER promote(_.COL3 AS LONG) EQUALS q0.Z | 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 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c6 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c10 AS LONG) | FETCH AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "ISCAN(T1_IDX1) | FLATMAP q0 -> { COVERING(T1_IDX1) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c10 AS LONG) | FETCH 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 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c6 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c10 AS LONG) | FETCH AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "ISCAN(T1_IDX1) | FLATMAP q0 -> { COVERING(T1_IDX1) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c10 AS LONG) | FETCH 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 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c6 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c10 AS LONG) + promote(@c10 AS LONG) | FETCH AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "ISCAN(T1_IDX1) | FLATMAP q0 -> { COVERING(T1_IDX1) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c10 AS LONG) + promote(@c10 AS LONG) | FETCH 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 <,>) | FLATMAP q0 -> { COVERING(T1_IDX1 [EQUALS promote(@c12 AS STRING), [LESS_THAN promote(@c8 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c16 AS LONG) + promote(@c16 AS LONG) | FETCH AS q1 RETURN (q1.COL1 AS COL1, q1.COL2 AS COL2, q0.COL3 AS COL3) }" + - explain: "ISCAN(T1_IDX1) | FLATMAP q0 -> { COVERING(T1_IDX1) | FILTER promote(q0.COL3 AS LONG) EQUALS promote(@c16 AS LONG) + promote(@c16 AS LONG) | FETCH 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(); - - explain: "COVERING(T1_IDX1 [EQUALS promote('b' AS STRING), [LESS_THAN promote(103 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(103); - - explain: "COVERING(T1_IDX1 [EQUALS promote('b' AS STRING), [LESS_THAN promote(@c6 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(b => 'b'); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(103 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(b => 'b', a => 103); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c12 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}, {102, 'b'}] - - query: select * from f5(b => 'b', a => 102); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c12 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}] - - query: select * from f5(b => 'a', a => 102); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c12 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{100, 'a'}] - - query: select * from f5(a => 102, b => 'a'); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c12 AS STRING), [LESS_THAN promote(@c8 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{100, 'a'}] - - query: select * from f5(102); - - explain: "COVERING(T1_IDX1 [EQUALS promote('b' AS STRING), [LESS_THAN promote(@c6 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{101, 'b'}] - - query: select * from f5(102, 'a'); - - explain: "COVERING(T1_IDX1 [EQUALS promote(@c8 AS STRING), [LESS_THAN promote(@c6 AS LONG)]] -> [COL1: KEY[1], COL2: KEY[0], COL3: KEY[2]]) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "COVERING(T1_IDX1) | MAP (_.COL1 AS COL1, _.COL2 AS COL2)" - result: [{100, 'a'}] - - query: select col1, col2 from f1('b', 103); diff --git a/yaml-tests/src/test/resources/standard-tests.yamsql b/yaml-tests/src/test/resources/standard-tests.yamsql index 7ae943583f..a928ac5f44 100644 --- a/yaml-tests/src/test/resources/standard-tests.yamsql +++ b/yaml-tests/src/test/resources/standard-tests.yamsql @@ -47,7 +47,7 @@ test_block: when col2 in (6,7,8,9) then 200 else 300 end as NEWCOL from T1 - - explain: "ISCAN(I1 <,>) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG)), TRUE), @c10, @c24, @c26) AS NEWCOL)" + - explain: "ISCAN(I1) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG)), TRUE), @c10, @c24, @c26) AS NEWCOL)" - result: [{ID: 1, NEWCOL: 100}, {ID: 2, NEWCOL: 100}, {ID: 3, NEWCOL: 100}, @@ -65,7 +65,7 @@ test_block: - query: select id, case when col1 = 10 then 100 when col2 in (6,7,8,9) then 200 end as NEWCOL from T1 - - explain: "ISCAN(I1 <,>) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG))), @c10, @c24) AS NEWCOL)" + - explain: "ISCAN(I1) | MAP (_.ID AS ID, pick(ConditionSelector(_.COL1 equals @c8, _.COL2 IN promote(@c14 AS ARRAY(LONG))), @c10, @c24) AS NEWCOL)" - result: [{ID: 1, NEWCOL: 100}, {ID: 2, NEWCOL: 100}, {ID: 3, NEWCOL: 100}, @@ -81,7 +81,7 @@ test_block: {ID: 13, NEWCOL: !null x} ] - - query: select * from T1 where COL1 = 20 - - explain: "ISCAN(I1 [EQUALS promote(@c8 AS LONG)])" + - explain: "ISCAN(I1)" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -94,7 +94,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 OR COL1 <= 20 - - explain: "COVERING(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG)]] -> [COL1: KEY[0], ID: KEY[2]]) ⊎ COVERING(I1 [[LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]] -> [COL1: KEY[0], ID: KEY[2]]) | DISTINCT BY PK | FETCH" + - explain: "COVERING(I1) ⊎ COVERING(I1) | DISTINCT BY PK | FETCH" - maxRows: 0 # Force continuations mode fails here. This is because we get duplicate results when we resume from a continuation - unorderedResult: [ {ID: 1, COL1: 10, COL2: 1}, @@ -113,7 +113,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 OR COL1 <= 20 ORDER BY COL1 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG)]]) ∪ ISCAN(I1 [[LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]]) COMPARE BY (_.COL1, recordType(_), _.ID)" + - explain: "ISCAN(I1) ∪ ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -131,7 +131,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 AND COL1 <= 20 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG) && LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]])" + - explain: "ISCAN(I1)" - unorderedResult: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -149,7 +149,7 @@ test_block: ] - - query: select * from T1 where COL1 >= 10 AND COL1 <= 20 ORDER BY COL1 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c9 AS LONG) && LESS_THAN_OR_EQUALS promote(@c14 AS LONG)]])" + - explain: "ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -167,7 +167,7 @@ test_block: ] - - query: select * from T1 where COL1 = 20 OR COL1 = 20 - - explain: "ISCAN(I1 [EQUALS promote(@c8 AS LONG)])" + - explain: "ISCAN(I1)" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -180,7 +180,7 @@ test_block: ] - - query: select * from T1 where COL1 = 20 OR COL1 = 20 ORDER BY COL1 - - explain: "ISCAN(I1 [EQUALS promote(@c8 AS LONG)])" + - explain: "ISCAN(I1)" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -193,7 +193,7 @@ test_block: ] - - query: select * from T1 where COL1 = 20 AND COL1 = 20 - - explain: "ISCAN(I1 [EQUALS promote(@c8 AS LONG)])" + - explain: "ISCAN(I1)" - result: [ {ID: 6, COL1: 20, COL2: 6}, {ID: 7, COL1: 20, COL2: 7}, @@ -206,7 +206,7 @@ test_block: ] - - query: select * from T1 where (COL1 = 20 OR COL1 = 10) AND (COL1 = 20 OR COL1 = 10) - - explain: "COVERING(I1 [EQUALS promote(@c9 AS LONG)] -> [COL1: KEY[0], ID: KEY[2]]) ⊎ COVERING(I1 [EQUALS promote(@c13 AS LONG)] -> [COL1: KEY[0], ID: KEY[2]]) | DISTINCT BY PK | FETCH" + - explain: "COVERING(I1) ⊎ COVERING(I1) | DISTINCT BY PK | FETCH" - initialVersionLessThan: 4.3.6.0 # Prior to 4.3.6.0, there was an error that would result in this query failing due to an illegal argument exception # The error is currently not propagated as a SQLException, so we can't even assert on the error code @@ -228,7 +228,7 @@ test_block: ] - - query: select * from T1 where (COL1 = 20 OR COL1 = 10) AND (COL1 = 20 OR COL1 = 10) ORDER BY COL1 - - explain: "ISCAN(I1 [EQUALS promote(@c9 AS LONG)]) ∪ ISCAN(I1 [EQUALS promote(@c13 AS LONG)]) COMPARE BY (_.COL1, recordType(_), _.ID)" + - explain: "ISCAN(I1) ∪ ISCAN(I1)" - initialVersionLessThan: 4.3.6.0 # Prior to 4.3.6.0, there was an error that would result in this query failing due to an illegal argument exception # The error is currently not propagated as a SQLException, so we can't even assert on the error code @@ -250,7 +250,7 @@ test_block: ] - - query: select * from T1 where (COL1 >= 10 AND COL1 <= 20) OR (COL1 >= 10 AND COL1 <= 20) - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c10 AS LONG) && LESS_THAN_OR_EQUALS promote(@c15 AS LONG)]])" + - explain: "ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -268,7 +268,7 @@ test_block: ] - - query: select * from T1 where (COL1 >= 10 AND COL1 <= 20) OR (COL1 >= 10 AND COL1 <= 20) ORDER BY COL1 - - explain: "ISCAN(I1 [[GREATER_THAN_OR_EQUALS promote(@c10 AS LONG) && LESS_THAN_OR_EQUALS promote(@c15 AS LONG)]])" + - explain: "ISCAN(I1)" - result: [ {ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, @@ -286,18 +286,18 @@ test_block: ] - - query: select * from (select * from (select * from T1) as x where ID = 5) as y; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID EQUALS promote(@c19 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.ID EQUALS promote(@c19 AS LONG) | FETCH" - result: [{ID: !l 5, !l 10, !l 5}] - - query: select * from (select * from (select * from T1) as x) as y where ID = 5; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID EQUALS promote(@c22 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.ID EQUALS promote(@c22 AS LONG) | FETCH" - result: [{ID: !l 5, !l 10, !l 5}] - - query: select count(*) from (select * from (select * from (select * from T1 where ID = 5) as x) as y) as z; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID EQUALS promote(@c23 AS LONG) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" + - explain: "COVERING(I1) | FILTER _.ID EQUALS promote(@c23 AS LONG) | FETCH | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0)" - result: [{!l 1}] - - query: select * from (select * from (select * from (select * from T1 where ID > 10) as x) as y) as z; - - explain: "COVERING(I1 <,> -> [COL1: KEY[0], ID: KEY[2]]) | FILTER _.ID GREATER_THAN promote(@c20 AS LONG) | FETCH" + - explain: "COVERING(I1) | FILTER _.ID GREATER_THAN promote(@c20 AS LONG) | FETCH" - result: [{ID: !l 11, !l 20, !l 11}, {ID: !l 12, !l 20, !l 12}, {ID: !l 13, !l 20, !l 13}] ... diff --git a/yaml-tests/src/test/resources/subquery-tests.yamsql b/yaml-tests/src/test/resources/subquery-tests.yamsql index 9d8540c3ce..f5fe4b52f7 100644 --- a/yaml-tests/src/test/resources/subquery-tests.yamsql +++ b/yaml-tests/src/test/resources/subquery-tests.yamsql @@ -64,21 +64,21 @@ test_block: - # correlations are allowed inside a nested subquery with group by - query: select x from a where exists (select a.x, max(idb) from b where q > a.x group by q) - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] - # correlations are allowed inside a nested subquery with group by, not necessarily qualified - query: select x from a where exists (select x, max(idb) from b where q > x group by q) - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(_._0.IDB) AS _0) GROUP BY (_._0.Q AS _0) | MAP (q0.X AS X, _._1._0 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] - # correlations inside aggregations are allowed inside a nested subquery with group by - query: select x from a where exists (select max(x), max(idb) from b where q > x group by q) - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] - # correlations inside aggregations are allowed inside a nested subquery with group by - query: select x from a where exists (select max(a.x), max(idb) from b where q > x group by q) - - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB [[GREATER_THAN q0.X]]) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" + - explain: "SCAN(<,>) | TFILTER A | FLATMAP q0 -> { ISCAN(IB) | MAP (_ AS _0) | AGG (max_i(q0.X) AS _0, max_i(_._0.IDB) AS _1) GROUP BY (_._0.Q AS _0) | MAP (_._1._0 AS _0, _._1._1 AS _1) | DEFAULT NULL | FILTER _ NOT_NULL AS q0 RETURN (q0.X AS X) }" - result: [{1}, {2}, {3}] ... diff --git a/yaml-tests/src/test/resources/union-empty-tables.yamsql b/yaml-tests/src/test/resources/union-empty-tables.yamsql index f79e2092e1..0e009fc0d2 100644 --- a/yaml-tests/src/test/resources/union-empty-tables.yamsql +++ b/yaml-tests/src/test/resources/union-empty-tables.yamsql @@ -78,7 +78,7 @@ test_block: - unorderedResult: [] - - query: select sum(Y) as S from (select count(*) as Y from t3 where a < 10 group by a union all select count(*) from t4) as X - - explain: "AISCAN(MV10 [[LESS_THAN promote(@c22 AS DOUBLE)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - unorderedResult: [{0}] - - query: select sum(Y) as S from (select count(*) as Y from t3 union all select count(*) from t1) as X diff --git a/yaml-tests/src/test/resources/union.yamsql b/yaml-tests/src/test/resources/union.yamsql index 7b273d1d7e..6e4378ec67 100644 --- a/yaml-tests/src/test/resources/union.yamsql +++ b/yaml-tests/src/test/resources/union.yamsql @@ -58,7 +58,7 @@ test_block: tests: - - query: select sum(a) as a, sum(b) as b from (select sum(col1) as a, count(*) as b from t1 union all select sum(col1) as a, count(*) as b from t2) as x - - explain: "ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) ⊎ SCAN(<,>) | TFILTER T2 | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) | MAP (_ AS _0) | AGG (sum_l(_._0.A) AS _0, sum_l(_._0.B) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, _._0._1 AS B)" + - explain: "ISCAN(VI1) | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) ⊎ SCAN(<,>) | TFILTER T2 | MAP (_ AS _0) | AGG (sum_l(_._0.COL1) AS _0, count_star(*) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, coalesce_long(_._0._1, promote(0l AS LONG)) AS B) | MAP (_ AS _0) | AGG (sum_l(_._0.A) AS _0, sum_l(_._0.B) AS _1) | ON EMPTY NULL | MAP (_._0._0 AS A, _._0._1 AS B)" - unorderedResult: [{A: 74 , B: 13}] - - query: select col1, col2 from t1 union all select col1, col2 from t1 @@ -156,11 +156,11 @@ test_block: {A: 10.0, B: 20.0}] - - query: select sum(Y) as S from (select count(*) as Y from t3 where a < 10 group by a union all select count(*) from t4) as X - - explain: "AISCAN(MV10 [[LESS_THAN promote(@c22 AS DOUBLE)]] BY_GROUP -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "AISCAN(MV10 -> [_0: KEY:[0], _1: VALUE:[0]]) | MAP (_._1 AS Y) ⊎ SCAN(<,>) | TFILTER T4 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - result: [{S: 2}] - - query: select sum(Y) as S from (select count(*) as Y from t3 union all select count(*) from t1) as X - - explain: "SCAN(<,>) | TFILTER T3 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) ⊎ ISCAN(VI1 <,>) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "SCAN(<,>) | TFILTER T3 | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) ⊎ ISCAN(VI1) | MAP (_ AS _0) | AGG (count_star(*) AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - result: [{S: 5}] - - query: select col2 from t1 where exists (select a from t3 where col2 <= id union all select b from t4 where col2 <= id) @@ -176,6 +176,6 @@ test_block: - error: "42F65" - - query: select sum(Y) as S from (select count(*) as Y from t6 union all select count(*) from t7) as X - - explain: "AISCAN(MV11 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) ⊎ AISCAN(MV12 <,> BY_GROUP -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" + - explain: "AISCAN(MV11 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS Y) ⊎ AISCAN(MV12 -> [_0: VALUE:[0]]) | MAP (_ AS _0) | ON EMPTY NULL | MAP (coalesce_long(_._0._0, promote(0l AS LONG)) AS _0) | MAP (_ AS _0) | AGG (sum_l(_._0.Y) AS _0) | ON EMPTY NULL | MAP (_._0._0 AS S)" - result: [{0}] ... diff --git a/yaml-tests/src/test/resources/uuid.yamsql b/yaml-tests/src/test/resources/uuid.yamsql index 79dbc4b179..07397bc422 100644 --- a/yaml-tests/src/test/resources/uuid.yamsql +++ b/yaml-tests/src/test/resources/uuid.yamsql @@ -232,7 +232,7 @@ test_block: tests: - - query: select b, c from tc order by b - - explain: "COVERING(TC1 <,> -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | MAP (_.B AS B, _.C AS C)" + - explain: "COVERING(TC1) | MAP (_.B AS B, _.C AS C)" - result: [{!uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}, {!uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b', 3}, {!uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, @@ -241,7 +241,7 @@ test_block: {!uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682', 4}] - - query: select * from tc order by b - - explain: "ISCAN(TC1 <,>)" + - explain: "ISCAN(TC1)" - result: [{1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}, {4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b', 3}, {2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, @@ -250,18 +250,18 @@ test_block: {3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682', 4}] - - query: select * from tc where b > 'a8708750-d70f-4800-8c3b-13700d5b369f' order by b - - explain: "ISCAN(TC1 [[GREATER_THAN promote(@c8 AS UUID)]])" + - explain: "ISCAN(TC1)" - result: [{3, !uuid 'c35ba01f-f8fc-47d7-bb00-f077e8a75682', 4}] - - query: select * from tc where b < 'a8708750-d70f-4800-8c3b-13700d5b369f' order by b desc - - explain: "ISCAN(TC1 [[LESS_THAN promote(@c8 AS UUID)]] REVERSE)" + - explain: "ISCAN(TC1)" - result: [{6, !uuid '99e8e8b1-ac34-4f4d-9f01-1f4a7debf4d6', 1}, {2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, {4, !uuid '5394a912-aa8e-40fc-a4bb-ddf3f89ac45b', 3}, {1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}] - - query: select * from tc where b < 'a8708750-d70f-4800-8c3b-13700d5b369f' and c > 4 order by b desc - - explain: "COVERING(TC1 [[LESS_THAN promote(@c8 AS UUID)]] REVERSE -> [A: KEY[2], B: KEY[0], C: VALUE[0]]) | FILTER _.C GREATER_THAN promote(@c12 AS LONG) | FETCH" + - explain: "COVERING(TC1) | FILTER _.C GREATER_THAN promote(@c12 AS LONG) | FETCH" - result: [{2, !uuid '64120112-4e39-40c3-94b9-2cc88a52e8df', 5}, {1, !uuid '0920df1c-be81-4ec1-8a06-2180226f051d', 6}] ... diff --git a/yaml-tests/src/test/resources/versions-tests.yamsql b/yaml-tests/src/test/resources/versions-tests.yamsql index 9ce1d6a220..dafb9e7763 100644 --- a/yaml-tests/src/test/resources/versions-tests.yamsql +++ b/yaml-tests/src/test/resources/versions-tests.yamsql @@ -49,54 +49,54 @@ test_block: tests: - - query: select "__ROW_VERSION" as version, t1.col2 from t1 where col1 = 10; - - explain: "ISCAN(I1 [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS VERSION, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _.COL2 AS COL2)" - result: [{VERSION: !not_null _, COL2: 1}, {VERSION: !not_null _, COL2: 2}, {VERSION: !not_null _, COL2: 3}, {VERSION: !not_null _, COL2: 4}, {VERSION: !not_null _, COL2: 5}] - # Do not include __ROW_VERSION (as a pseudo-column) in * - query: select t1.* from t1 where col1 = 10; - - explain: "ISCAN(I1 [EQUALS promote(@c10 AS LONG)])" + - explain: "ISCAN(I1)" - result: [{ID: 1, COL1: 10, COL2: 1}, {ID: 2, COL1: 10, COL2: 2}, {ID: 3, COL1: 10, COL2: 3}, {ID: 4, COL1: 10, COL2: 4}, {ID: 5, COL1: 10, COL2: 5}] - # Get version column from sub-select - query: select s.version, s.col2 from (select "__ROW_VERSION" as version, t1.col2 as col2 from t1 where col1 = 10) AS s; - - explain: "ISCAN(I1 [EQUALS promote(@c26 AS LONG)]) | MAP (version([_]) AS VERSION, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _.COL2 AS COL2)" - result: [{VERSION: !not_null _, COL2: 1}, {VERSION: !not_null _, COL2: 2}, {VERSION: !not_null _, COL2: 3}, {VERSION: !not_null _, COL2: 4}, {VERSION: !not_null _, COL2: 5}] - # In inner select, the pseudo-column is selected but not renamed. Then, in the outer select, the column is read and returned, and a new version(S) value is *not* created - query: select s."__ROW_VERSION", s.col2 from (select "__ROW_VERSION", t1.col2 from t1 where col1 = 10) AS s; - - explain: "ISCAN(I1 [EQUALS promote(@c22 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS __ROW_VERSION, _.COL2 AS COL2)" - result: [{__ROW_VERSION: !not_null _, COL2: 1}, {__ROW_VERSION: !not_null _, COL2: 2}, {__ROW_VERSION: !not_null _, COL2: 3}, {__ROW_VERSION: !not_null _, COL2: 4}, {__ROW_VERSION: !not_null _, COL2: 5}] - - query: select "__ROW_VERSION" as version, t1.* from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" - result: [{VERSION: !not_null _, ID: 6, COL1: 20, COL2: 6}, {VERSION: !not_null _, ID: 7, COL1: 20, COL2: 7}, {VERSION: !not_null _, ID: 8, COL1: 20, COL2: 8}, {VERSION: !not_null _, ID: 9, COL1: 20, COL2: 9}, {VERSION: !not_null _, ID: 10, COL1: 20, COL2: 10}, {VERSION: !not_null _, ID: 11, COL1: 20, COL2: 11}, {VERSION: !not_null _, ID: 12, COL1: 20, COL2: 12}, {VERSION: !not_null _, ID: 13, COL1: 20, COL2: 13}] - - query: select "__ROW_VERSION" as version, (t1.*) from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c16 AS LONG)]) | MAP (version([_]) AS VERSION, _ AS _1)" + - explain: "ISCAN(I1) | MAP (version([_]) AS VERSION, _ AS _1)" - result: [{VERSION: !not_null _, {ID: 6, COL1: 20, COL2: 6}}, {VERSION: !not_null _, {ID: 7, COL1: 20, COL2: 7}}, {VERSION: !not_null _, {ID: 8, COL1: 20, COL2: 8}}, {VERSION: !not_null _, {ID: 9, COL1: 20, COL2: 9}}, {VERSION: !not_null _, {ID: 10, COL1: 20, COL2: 10}}, {VERSION: !not_null _, {ID: 11, COL1: 20, COL2: 11}}, {VERSION: !not_null _, {ID: 12, COL1: 20, COL2: 12}}, {VERSION: !not_null _, {ID: 13, COL1: 20, COL2: 13}}] - - query: select "__ROW_VERSION", t1.* from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c12 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" + - explain: "ISCAN(I1) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID, _.COL1 AS COL1, _.COL2 AS COL2)" - result: [{__ROW_VERSION: !not_null _, ID: 6, COL1: 20, COL2: 6}, {__ROW_VERSION: !not_null _, ID: 7, COL1: 20, COL2: 7}, {__ROW_VERSION: !not_null _, ID: 8, COL1: 20, COL2: 8}, {__ROW_VERSION: !not_null _, ID: 9, COL1: 20, COL2: 9}, {__ROW_VERSION: !not_null _, ID: 10, COL1: 20, COL2: 10}, {__ROW_VERSION: !not_null _, ID: 11, COL1: 20, COL2: 11}, {__ROW_VERSION: !not_null _, ID: 12, COL1: 20, COL2: 12}, {__ROW_VERSION: !not_null _, ID: 13, COL1: 20, COL2: 13}] - - query: select "__ROW_VERSION", (t1.*) from t1 where col1 = 20; - - explain: "ISCAN(I1 [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _ AS _1)" + - explain: "ISCAN(I1) | MAP (version([_]) AS __ROW_VERSION, _ AS _1)" - result: [{__ROW_VERSION: !not_null _, {ID: 6, COL1: 20, COL2: 6}}, {__ROW_VERSION: !not_null _, {ID: 7, COL1: 20, COL2: 7}}, {__ROW_VERSION: !not_null _, {ID: 8, COL1: 20, COL2: 8}}, {__ROW_VERSION: !not_null _, {ID: 9, COL1: 20, COL2: 9}}, {__ROW_VERSION: !not_null _, {ID: 10, COL1: 20, COL2: 10}}, {__ROW_VERSION: !not_null _, {ID: 11, COL1: 20, COL2: 11}}, {__ROW_VERSION: !not_null _, {ID: 12, COL1: 20, COL2: 12}}, {__ROW_VERSION: !not_null _, {ID: 13, COL1: 20, COL2: 13}}] - - query: select "__ROW_VERSION", t1.id from t1 order by "__ROW_VERSION" ASC; - - explain: "ISCAN(VERSION_INDEX <,>) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 1}, {__ROW_VERSION: !not_null _, ID: 3}, {__ROW_VERSION: !not_null _, ID: 5}, {__ROW_VERSION: !not_null _, ID: 7}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 2}, {__ROW_VERSION: !not_null _, ID: 4}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 12}] - - query: select t1."__ROW_VERSION", t1.id from t1 order by "__ROW_VERSION" DESC; - - explain: "ISCAN(VERSION_INDEX <,> REVERSE) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 12}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 4}, {__ROW_VERSION: !not_null _, ID: 2}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 7}, {__ROW_VERSION: !not_null _, ID: 5}, {__ROW_VERSION: !not_null _, ID: 3}, {__ROW_VERSION: !not_null _, ID: 1}] - - query: select t1."__ROW_VERSION", t1.id from t1 where col1 = 20 order by "__ROW_VERSION" ASC; - - explain: "ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c14 AS LONG)]) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(GROUPED_VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 7}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 12}] - - query: select "__ROW_VERSION", t1.id from t1 where col1 = 20 order by "__ROW_VERSION" DESC; - - explain: "ISCAN(GROUPED_VERSION_INDEX [EQUALS promote(@c12 AS LONG)] REVERSE) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" + - explain: "ISCAN(GROUPED_VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, ID: 12}, {__ROW_VERSION: !not_null _, ID: 10}, {__ROW_VERSION: !not_null _, ID: 8}, {__ROW_VERSION: !not_null _, ID: 6}, {__ROW_VERSION: !not_null _, ID: 13}, {__ROW_VERSION: !not_null _, ID: 11}, {__ROW_VERSION: !not_null _, ID: 9}, {__ROW_VERSION: !not_null _, ID: 7}] - - query: select t1."__ROW_VERSION", t1.id from t1 where col1 = 20 order by t1."__ROW_VERSION" ASC; @@ -110,7 +110,7 @@ test_block: # - result: [{__ROW_VERSION: !not_null _, COL1: 10, ID: 1}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 3}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 5}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 2}, {__ROW_VERSION: !not_null _, COL1: 10, ID: 4}] - - query: select "__ROW_VERSION", col1, t1.id from t1 where col1 > 10 order by col1 asc, "__ROW_VERSION" asc; - - explain: "ISCAN(GROUPED_VERSION_INDEX [[GREATER_THAN promote(@c14 AS LONG)]]) | MAP (version([_]) AS __ROW_VERSION, _.COL1 AS COL1, _.ID AS ID)" + - explain: "ISCAN(GROUPED_VERSION_INDEX) | MAP (version([_]) AS __ROW_VERSION, _.COL1 AS COL1, _.ID AS ID)" - result: [{__ROW_VERSION: !not_null _, COL1: 20, ID: 7}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 9}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 11}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 13}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 6}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 8}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 10}, {__ROW_VERSION: !not_null _, COL1: 20, ID: 12}] # - # - query: select "__ROW_VERSION", col1, t1.id from t1 where (col1 = 10 AND "__ROW_VERSION" > 'AAAAAAAAAAAAAAAA') OR col1 > 10 order by col1 asc, "__ROW_VERSION" asc; From 891615b9615edd10b9e1b13fffeaa7c5fffdbeba Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Sun, 31 Aug 2025 06:28:59 -0500 Subject: [PATCH 12/13] Updated tests to support EXPLAIN and EXPLAIN VERBOSE - currently the ExplainConfig decorates the query with EXPLAIN. To add tests for EXPLAIN VERBOSE, we should add another config (ExplainVerboseConfig) and decorate the query with EXPLAIN VERBOSE. The test block should also be extendended to support explainVerbose:. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 345009a61f..99c7c06501 100644 --- a/.gitignore +++ b/.gitignore @@ -89,3 +89,5 @@ fdb-relational-core/src/main/antlr/*.tokens # output during release build process /mixed-mode-results.md + +.DS_Store From 453db908bfc538c0871d5d6bb73d7f0cd0b3af04 Mon Sep 17 00:00:00 2001 From: satishsuryanarayan Date: Sun, 31 Aug 2025 07:52:34 -0500 Subject: [PATCH 13/13] Fix explain tests --- .../relational/recordlayer/query/ExplainTests.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java index 01afbb0f2f..4a91535b6c 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java @@ -109,7 +109,7 @@ void explainWithNoContinuationTest() throws Exception { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") - .hasColumn("PLAN_HASH", -1635569052L) + .hasColumn("PLAN_HASH", -1635569052) .hasColumn("PLAN_CONTINUATION", null); assertResult.hasNoNextRow(); } @@ -135,7 +135,7 @@ void explainWithContinuationNoSerializedPlanTest() throws Exception { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() - .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>)") + .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") .hasColumn("PLAN_HASH", -1635569052); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); @@ -169,7 +169,7 @@ void explainWithContinuationSerializedPlanTest() throws Exception { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") - .hasColumn("PLAN_HASH", -1635569052L); + .hasColumn("PLAN_HASH", -1635569052); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); final var assertStruct = RelationalStructAssert.assertThat(continuationInfo); @@ -235,7 +235,7 @@ void explainExecuteStatementTest() throws Exception { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX)") - .hasColumn("PLAN_HASH", -1635569052L); + .hasColumn("PLAN_HASH", -1635569052); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); final var assertStruct = RelationalStructAssert.assertThat(continuationInfo); @@ -261,7 +261,7 @@ void explainVerboseTest() throws Exception { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX <,>) | FILTER count_star(*) GREATER_THAN promote(@c12 AS LONG) AND count_star(*) LESS_THAN promote(@c19 AS LONG)") - .hasColumn("PLAN_HASH", -1697137247L) + .hasColumn("PLAN_HASH", -1697137247) .hasColumn("PLAN_CONTINUATION", null); assertResult.hasNoNextRow(); } @@ -279,7 +279,7 @@ void explainDefaultTest() throws Exception { final var assertResult = ResultSetAssert.assertThat(resultSet); assertResult.hasNextRow() .hasColumn("PLAN", "ISCAN(RECORD_NAME_IDX) | FILTER count_star(*) GREATER_THAN promote(@c11 AS LONG) AND count_star(*) LESS_THAN promote(@c18 AS LONG)") - .hasColumn("PLAN_HASH", -1697137247L) + .hasColumn("PLAN_HASH", -1697137247) .hasColumn("PLAN_CONTINUATION", null); assertResult.hasNoNextRow(); }