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 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..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 @@ -722,6 +722,15 @@ 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 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(); + } + @Nonnull public static String toStringForExternalExplain(@Nonnull final RecordQueryPlan plan, final int maxExplainLevel, final int maxSize) { diff --git a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 index b729d6b5b5..bd345851ee 100644 --- a/fdb-relational-core/src/main/antlr/RelationalLexer.g4 +++ b/fdb-relational-core/src/main/antlr/RelationalLexer.g4 @@ -223,6 +223,7 @@ USAGE: 'USAGE'; USE: 'USE'; USING: 'USING'; VALUES: 'VALUES'; +VERBOSE: 'VERBOSE'; WHEN: 'WHEN'; WHERE: 'WHERE'; WHILE: 'WHILE'; @@ -1352,4 +1353,4 @@ fragment DECIMAL_TYPE_MODIFIER: (INT_TYPE_MODIFIER | LONG_TYPE_MODIFIER); ERROR_RECOGNITION : . { this.notifyListeners(new LexerNoViableAltException(this, _input, _tokenStartCharIndex, null)); } - ; + ; \ No newline at end of file diff --git a/fdb-relational-core/src/main/antlr/RelationalParser.g4 b/fdb-relational-core/src/main/antlr/RelationalParser.g4 index 89e9cc6fb5..54ef7c1df3 100644 --- a/fdb-relational-core/src/main/antlr/RelationalParser.g4 +++ b/fdb-relational-core/src/main/antlr/RelationalParser.g4 @@ -650,7 +650,8 @@ helpStatement // details describeObjectClause - : ( + : (VERBOSE)? + ( query | deleteStatement | insertStatement | updateStatement | executeContinuationStatement ) #describeStatements 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 d434fb8b11..fc5c9cb768 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 @@ -244,6 +244,12 @@ public Void visitFullDescribeStatement(@Nonnull RelationalParser.FullDescribeSta return visitChildren(ctx); } + @Override + public Void visitDescribeStatements(@Nonnull RelationalParser.DescribeStatementsContext ctx) { + queryHasherContextBuilder.setIsVerboseExplainLevel(ctx.VERBOSE() != null); + return visitChildren(ctx); + } + @Override public Void visitLimitClause(@Nonnull RelationalParser.LimitClauseContext ctx) { if (ctx.offset != null) { 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 db31f0e630..a74e205c75 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; @@ -43,7 +42,6 @@ import com.apple.foundationdb.relational.recordlayer.metadata.DataTypeUtils; 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; @@ -91,6 +89,8 @@ public class MutablePlanGenerationContext implements QueryExecutionContext { private boolean forExplain; + private boolean isVerboseExplainLevel; + @Nullable private byte[] continuation; @@ -279,6 +279,7 @@ public MutablePlanGenerationContext(@Nonnull PreparedParams preparedParams, constantObjectValues = new LinkedList<>(); shouldProcessLiteral = true; forExplain = false; + isVerboseExplainLevel = false; setContinuation(null); equalityConstraints = ImmutableList.builder(); } @@ -354,6 +355,10 @@ public boolean isForExplain() { return forExplain; } + @Override + public boolean isVerboseExplainLevel() { + return isVerboseExplainLevel; + } @Nonnull public QueryPlanConstraint getPlanConstraintsForLiteralReferences() { @@ -390,6 +395,10 @@ public void setForExplain(boolean forExplain) { this.forExplain = forExplain; } + public void setIsVerboseExplainLevel(boolean isVerboseExplainLevel) { + this.isVerboseExplainLevel = isVerboseExplainLevel; + } + @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 5b950dd436..4fd9a3f8d2 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 @@ -44,6 +44,8 @@ public final class NormalizedQueryExecutionContext implements QueryExecutionCont private final boolean isForExplain; + private final boolean isVerboseExplainLevel; + private final int parameterHash; @Nonnull @@ -53,10 +55,12 @@ private NormalizedQueryExecutionContext(@Nonnull Literals literals, @Nullable byte[] continuation, int parameterHash, boolean isForExplain, + boolean isVerboseExplainLevel, @Nonnull final PlanHashable.PlanHashMode planHashMode) { this.literals = literals; this.continuation = continuation; this.isForExplain = isForExplain; + this.isVerboseExplainLevel = isVerboseExplainLevel; this.parameterHash = parameterHash; this.planHashMode = planHashMode; } @@ -90,6 +94,11 @@ public boolean isForExplain() { return isForExplain; } + @Override + public boolean isVerboseExplainLevel() { + return isVerboseExplainLevel; + } + @Nonnull @Override public PlanHashable.PlanHashMode getPlanHashMode() { @@ -107,6 +116,8 @@ public static final class Builder { private boolean isForExplain; + private boolean isVerboseExplainLevel; + @Nullable private byte[] continuation; @@ -120,6 +131,7 @@ private Builder() { this.isForExplain = false; this.continuation = null; this.planHashMode = null; + this.isVerboseExplainLevel = false; } @Nonnull @@ -146,6 +158,12 @@ public Builder setForExplain(boolean isForExplain) { return this; } + @Nonnull + public Builder setIsVerboseExplainLevel(boolean isVerboseExplainLevel) { + this.isVerboseExplainLevel = isVerboseExplainLevel; + return this; + } + @Nonnull public Builder setPlanHashMode(@Nonnull PlanHashable.PlanHashMode planHashMode) { this.planHashMode = planHashMode; @@ -155,7 +173,7 @@ public Builder setPlanHashMode(@Nonnull PlanHashable.PlanHashMode planHashMode) @Nonnull public NormalizedQueryExecutionContext build() { return new NormalizedQueryExecutionContext(literalsBuilder.build(), continuation, - parameterHash, isForExplain, + 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 616b6d6857..61de5c47db 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. + 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 7f81ee693f..b923d85efc 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)); + 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 5baf04800b..8ab0a5958d 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 @@ -536,6 +536,11 @@ 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().setIsVerboseExplainLevel(true); + } else { + 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/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/ExplainTests.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/query/ExplainTests.java index 10969a8d59..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 @@ -108,7 +108,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", -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); @@ -168,7 +168,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", -1635569052); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); @@ -196,7 +196,7 @@ void explainWithContinuationSerializedPlanWithDifferentQueryTest() throws Except continuation = consumeResultAndGetContinuation(ps, 2); } - try (RelationalPreparedStatement ps = connection.prepareStatement("EXPLAIN SELECT rest_no FROM RestaurantComplexRecord WITH CONTINUATION ?cont")) { + try (RelationalPreparedStatement ps = connection.prepareStatement("EXPLAIN VERBOSE SELECT rest_no FROM RestaurantComplexRecord WITH CONTINUATION ?cont")) { ps.setObject("cont", continuation.serialize()); try (final RelationalResultSet resultSet = ps.executeQuery()) { final var assertResult = ResultSetAssert.assertThat(resultSet); @@ -234,7 +234,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", -1635569052); final var continuationInfo = resultSet.getStruct(5); org.junit.jupiter.api.Assertions.assertNotNull(continuationInfo); @@ -251,6 +251,42 @@ 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", -1697137247) + .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", -1697137247) + .hasColumn("PLAN_CONTINUATION", null); + assertResult.hasNoNextRow(); + } + } + } + } + private Continuation consumeResultAndGetContinuation(RelationalPreparedStatement ps, int numRows) throws SQLException { Continuation continuation; try (final RelationalResultSet resultSet = ps.executeQuery()) { 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 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;