diff --git a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlExecutionContext.java b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlExecutionContext.java index d51adf7436..857065c57a 100644 --- a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlExecutionContext.java +++ b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlExecutionContext.java @@ -179,11 +179,10 @@ public synchronized PlannerMetricsProto.Info putMetrics(@Nonnull final String bl @Nonnull final String query, final int lineNumber, @Nonnull final PlannerMetricsProto.Info info, - boolean isDirtyMetrics) { - return actualMetricsMap.put(new QueryAndLocation(blockName, query, lineNumber), info); + @Nonnull final List setups) { + return actualMetricsMap.put(new QueryAndLocation(blockName, query, lineNumber, setups), info); } - @Nullable @SuppressWarnings("UnusedReturnValue") public synchronized void markDirty() { this.isDirtyMetrics = true; @@ -388,10 +387,7 @@ public void saveMetricsAsBinaryProto() { final var condensedMetricsMap = new LinkedHashMap(); for (final var entry : actualMetricsMap.entrySet()) { final var queryAndLocation = entry.getKey(); - final var identifier = PlannerMetricsProto.Identifier.newBuilder() - .setBlockName(queryAndLocation.getBlockName()) - .setQuery(queryAndLocation.getQuery()) - .build(); + final var identifier = queryAndLocation.getIdentifier(); if (condensedMetricsMap.containsKey(identifier)) { logger.warn("⚠️ Repeated query in block {} at line {}", queryAndLocation.getBlockName(), queryAndLocation.getLineNumber()); @@ -423,20 +419,25 @@ public void saveMetricsAsYaml() { final var mmap = LinkedListMultimap.>create(); for (final var entry : actualMetricsMap.entrySet()) { - final var identifier = entry.getKey(); + final var identifier = entry.getKey().getIdentifier(); final var info = entry.getValue(); final var countersAndTimers = info.getCountersAndTimers(); - final var infoMap = - ImmutableMap.of("query", identifier.getQuery(), - "explain", info.getExplain(), - "task_count", countersAndTimers.getTaskCount(), - "task_total_time_ms", TimeUnit.NANOSECONDS.toMillis(countersAndTimers.getTaskTotalTimeNs()), - "transform_count", countersAndTimers.getTransformCount(), - "transform_time_ms", TimeUnit.NANOSECONDS.toMillis(countersAndTimers.getTransformTimeNs()), - "transform_yield_count", countersAndTimers.getTransformYieldCount(), - "insert_time_ms", TimeUnit.NANOSECONDS.toMillis(countersAndTimers.getInsertTimeNs()), - "insert_new_count", countersAndTimers.getInsertNewCount(), - "insert_reused_count", countersAndTimers.getInsertReusedCount()); + final var infoMap = new LinkedHashMap(); + infoMap.put("query", identifier.getQuery()); + // only include setup if it is non-empty, in part so that the PR that adds setup doesn't change every + // metric in the yaml files + if (identifier.getSetupsCount() > 0) { + infoMap.put("setup", identifier.getSetupsList()); + } + infoMap.put("explain", info.getExplain()); + infoMap.put("task_count", countersAndTimers.getTaskCount()); + infoMap.put("task_total_time_ms", TimeUnit.NANOSECONDS.toMillis(countersAndTimers.getTaskTotalTimeNs())); + infoMap.put("transform_count", countersAndTimers.getTransformCount()); + infoMap.put("transform_time_ms", TimeUnit.NANOSECONDS.toMillis(countersAndTimers.getTransformTimeNs())); + infoMap.put("transform_yield_count", countersAndTimers.getTransformYieldCount()); + infoMap.put("insert_time_ms", TimeUnit.NANOSECONDS.toMillis(countersAndTimers.getInsertTimeNs())); + infoMap.put("insert_new_count", countersAndTimers.getInsertNewCount()); + infoMap.put("insert_reused_count", countersAndTimers.getInsertReusedCount()); mmap.put(identifier.getBlockName(), infoMap); } @@ -513,23 +514,31 @@ private static String baseName(@Nonnull final String resourcePath) { private static class QueryAndLocation { @Nonnull - private final String blockName; - private final String query; + private final PlannerMetricsProto.Identifier identifier; private final int lineNumber; - public QueryAndLocation(@Nonnull final String blockName, final String query, final int lineNumber) { - this.blockName = blockName; - this.query = query; + public QueryAndLocation(@Nonnull final String blockName, final String query, final int lineNumber, + @Nonnull List setups) { + identifier = PlannerMetricsProto.Identifier.newBuilder() + .setBlockName(blockName) + .setQuery(query) + .addAllSetups(setups) + .build(); this.lineNumber = lineNumber; } + @Nonnull + public PlannerMetricsProto.Identifier getIdentifier() { + return identifier; + } + @Nonnull public String getBlockName() { - return blockName; + return identifier.getBlockName(); } public String getQuery() { - return query; + return identifier.getQuery(); } public int getLineNumber() { @@ -542,12 +551,12 @@ public boolean equals(final Object o) { return false; } final QueryAndLocation that = (QueryAndLocation)o; - return lineNumber == that.lineNumber && Objects.equals(blockName, that.blockName) && Objects.equals(query, that.query); + return lineNumber == that.lineNumber && Objects.equals(identifier, that.identifier); } @Override public int hashCode() { - return Objects.hash(blockName, query, lineNumber); + return Objects.hash(identifier, lineNumber); } } diff --git a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryConfig.java b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryConfig.java index eb5167cc91..f7d5059f57 100644 --- a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryConfig.java +++ b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryConfig.java @@ -134,9 +134,9 @@ String decorateQuery(@Nonnull String query) { } final void checkResult(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription, - @Nonnull YamlConnection connection) { + @Nonnull YamlConnection connection, @Nonnull List setups) { try { - checkResultInternal(currentQuery, actual, queryDescription); + checkResultInternal(currentQuery, actual, queryDescription, setups); } catch (AssertionFailedError e) { throw executionContext.wrapContext(e, () -> "‼️Check result failed in config at line " + getLineNumber() + " against connection for versions " + connection.getVersions(), @@ -163,7 +163,7 @@ final void checkError(@Nonnull SQLException actual, @Nonnull String queryDescrip } abstract void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, - @Nonnull String queryDescription) throws SQLException; + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException; void checkErrorInternal(@Nonnull SQLException e, @Nonnull String queryDescription) throws SQLException { final var diffMessage = String.format(Locale.ROOT, "‼️ statement failed with the following error at line %s:%n" + @@ -181,7 +181,8 @@ private static QueryConfig getCheckResultConfig(boolean isExpectedOrdered, @Null return new QueryConfig(configName, value, lineNumber, executionContext) { @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { logger.debug("⛳️ Matching results of query '{}'", queryDescription); try (RelationalResultSet resultSet = (RelationalResultSet)actual) { final var matchResult = Matchers.matchResultSet(getVal(), resultSet, isExpectedOrdered); @@ -220,7 +221,8 @@ String decorateQuery(@Nonnull String query) { @SuppressWarnings({"PMD.CloseResource", "PMD.EmptyWhileStmt"}) // lifetime of autocloseable resource persists beyond method @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { logger.debug("⛳️ Matching plan for query '{}'", queryDescription); final var resultSet = (RelationalResultSet) actual; resultSet.next(); @@ -231,6 +233,7 @@ void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @ final var identifier = PlannerMetricsProto.Identifier.newBuilder() .setBlockName(blockName) .setQuery(currentQuery) + .addAllSetups(setups) .build(); final var expectedPlannerMetricsInfo = metricsMap.get(identifier); @@ -302,7 +305,7 @@ void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @ .setInsertReusedCount(actualPlannerMetrics.getLong(8))) .build(); if (expectedPlannerMetricsInfo == null) { - executionContext.putMetrics(blockName, currentQuery, lineNumber, actualInfo, true); + executionContext.putMetrics(blockName, currentQuery, lineNumber, actualInfo, setups); executionContext.markDirty(); logger.debug("⭐️ Successfully inserted new planner metrics at line {}", getLineNumber()); } else { @@ -331,7 +334,7 @@ void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @ actualCountersAndTimers, metricsDescriptor.findFieldByName("insert_reused_count"), lineNumber); - executionContext.putMetrics(blockName, currentQuery, lineNumber, actualInfo, isDifferent); + executionContext.putMetrics(blockName, currentQuery, lineNumber, actualInfo, setups); if (isDifferent) { if (executionContext.shouldCorrectMetrics()) { executionContext.markDirty(); @@ -364,7 +367,8 @@ private static QueryConfig getCheckErrorConfig(@Nullable Object value, int lineN return new QueryConfig(QUERY_CONFIG_ERROR, value, lineNumber, executionContext) { @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { Matchers.ResultSetPrettyPrinter resultSetPrettyPrinter = new Matchers.ResultSetPrettyPrinter(); if (actual instanceof ErrorCapturingResultSet) { Matchers.printRemaining((ErrorCapturingResultSet) actual, resultSetPrettyPrinter); @@ -406,7 +410,8 @@ private static QueryConfig getCheckCountConfig(@Nullable Object value, int lineN return new QueryConfig(QUERY_CONFIG_COUNT, value, lineNumber, executionContext) { @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) { logger.debug("⛳️ Matching count of update query '{}'", queryDescription); if (!Matchers.matches(getVal(), actual)) { reportTestFailure(String.format(Locale.ROOT, "‼️ Expected count value %d, but got %d at line %d", @@ -428,7 +433,8 @@ String decorateQuery(@Nonnull String query) { @SuppressWarnings("PMD.CloseResource") // lifetime of autocloseable persists beyond method @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { logger.debug("⛳️ Matching plan hash of query '{}'", queryDescription); final var resultSet = (RelationalResultSet) actual; resultSet.next(); @@ -445,7 +451,8 @@ public static QueryConfig getNoCheckConfig(int lineNumber, @Nonnull YamlExecutio return new QueryConfig(QUERY_CONFIG_NO_CHECKS, null, lineNumber, executionContext) { @SuppressWarnings("PMD.CloseResource") // lifetime of autocloseable persists beyond method @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { if (actual instanceof RelationalResultSet) { final var resultSet = (RelationalResultSet) actual; // slurp @@ -462,7 +469,8 @@ void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @ private static QueryConfig getMaxRowConfig(@Nonnull Object value, int lineNumber, @Nonnull YamlExecutionContext executionContext) { return new QueryConfig(QUERY_CONFIG_MAX_ROWS, value, lineNumber, executionContext) { @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { Assert.failUnchecked("No results to check on a maxRow config"); } }; @@ -472,7 +480,7 @@ private static QueryConfig getSetupConfig(final Object value, final int lineNumb return new QueryConfig(QUERY_CONFIG_SETUP, value, lineNumber, executionContext) { @Override void checkResultInternal(@Nonnull final String currentQuery, @Nonnull final Object actual, - @Nonnull final String queryDescription) throws SQLException { + @Nonnull final String queryDescription, @Nonnull List setups) throws SQLException { Assert.failUnchecked("No results to check on a setup config"); } }; @@ -482,7 +490,8 @@ private static QueryConfig getDebuggerConfig(@Nonnull Object value, int lineNumb return new QueryConfig(QUERY_CONFIG_DEBUGGER, DebuggerImplementation.valueOf(((String)value).toUpperCase(Locale.ROOT)), lineNumber, executionContext) { @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { Assert.failUnchecked("No results to check on a debugger config"); } }; @@ -496,7 +505,8 @@ public static QueryConfig getSupportedVersionConfig(Object rawVersion, final int } return new QueryConfig(QUERY_CONFIG_SUPPORTED_VERSION, rawVersion, lineNumber, executionContext) { @Override - void checkResultInternal(@Nonnull final String currentQuery, @Nonnull final Object actual, @Nonnull final String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull final String currentQuery, @Nonnull final Object actual, + @Nonnull final String queryDescription, @Nonnull final List setups) throws SQLException { // Nothing to do, this query is supported // SupportedVersion configs are not executed Assertions.fail("Supported version configs are not meant to be executed."); @@ -516,7 +526,8 @@ public static QueryConfig getNoOpConfig(int lineNumber, @Nonnull YamlExecutionCo return new QueryConfig(QUERY_CONFIG_NO_OP, null, lineNumber, executionContext) { @SuppressWarnings("PMD.CloseResource") // lifetime of autocloseable persists beyond method @Override - void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, @Nonnull String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull String currentQuery, @Nonnull Object actual, + @Nonnull String queryDescription, @Nonnull List setups) throws SQLException { // This should not be executed Assertions.fail("NoOp Config should not be executed"); } @@ -647,7 +658,7 @@ public SkipConfig(final String configMap, final Object value, final int lineNumb @Override void checkResultInternal(@Nonnull final String currentQuery, @Nonnull final Object actual, - @Nonnull final String queryDescription) throws SQLException { + @Nonnull final String queryDescription, @Nonnull final List setups) throws SQLException { Assertions.fail("Skipped config should not be executed: Line: " + getLineNumber() + " " + message); } @@ -673,7 +684,8 @@ public boolean shouldExecute(YamlConnection connection) { } @Override - void checkResultInternal(@Nonnull final String currentQuery, @Nonnull final Object actual, @Nonnull final String queryDescription) throws SQLException { + void checkResultInternal(@Nonnull final String currentQuery, @Nonnull final Object actual, + @Nonnull final String queryDescription, @Nonnull final List setups) throws SQLException { Assertions.fail("Check version config should not be executed: Line: " + getLineNumber()); } diff --git a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryExecutor.java b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryExecutor.java index 88174ba9af..42d82a7665 100644 --- a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryExecutor.java +++ b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/command/QueryExecutor.java @@ -169,7 +169,7 @@ private Continuation executeQuery(@Nonnull YamlConnection connection, @Nonnull Q continuationAfter = executeWithSetup(connection, singleConnection -> { try (var s = singleConnection.createStatement()) { final var queryResult = executeStatementAndCheckCacheIfNeeded(s, false, singleConnection, currentQuery, checkCache, maxRows); - config.checkResult(currentQuery, queryResult, this.toString(), singleConnection); + config.checkResult(currentQuery, queryResult, this.toString(), singleConnection, setup); if (queryResult instanceof RelationalResultSet) { return ((RelationalResultSet) queryResult).getContinuation(); } @@ -182,7 +182,7 @@ private Continuation executeQuery(@Nonnull YamlConnection connection, @Nonnull Q try (var s = singleConnection.prepareStatement(currentQuery)) { setParametersInPreparedStatement(s); final var queryResult = executeStatementAndCheckCacheIfNeeded(s, true, singleConnection, currentQuery, checkCache, maxRows); - config.checkResult(currentQuery, queryResult, this.toString(), singleConnection); + config.checkResult(currentQuery, queryResult, this.toString(), singleConnection, setup); if (queryResult instanceof RelationalResultSet) { return ((RelationalResultSet)queryResult).getContinuation(); } @@ -224,7 +224,7 @@ private Continuation executeContinuation(@Nonnull YamlConnection connection, @No // We bypass checking for cache since the "EXECUTE CONTINUATION ..." statement does not need to be checked // for caching. final var queryResult = executeStatement(s, true, currentQuery); - config.checkResult(executeContinuationQuery, queryResult, this.toString(), connection); + config.checkResult(executeContinuationQuery, queryResult, this.toString(), connection, setup); if (queryResult instanceof RelationalResultSet) { continuationAfter = ((RelationalResultSet) queryResult).getContinuation(); } diff --git a/yaml-tests/src/main/proto/planner_metrics.proto b/yaml-tests/src/main/proto/planner_metrics.proto index 84f5f639fc..7e61d4aa95 100644 --- a/yaml-tests/src/main/proto/planner_metrics.proto +++ b/yaml-tests/src/main/proto/planner_metrics.proto @@ -32,6 +32,7 @@ message Entry { message Identifier { optional string blockName = 1; optional string query = 2; + repeated string setups = 3; } message Info { diff --git a/yaml-tests/src/test/java/TransactionSetupTest.java b/yaml-tests/src/test/java/TransactionSetupTest.java index 47eeae28ab..2aa57b8425 100644 --- a/yaml-tests/src/test/java/TransactionSetupTest.java +++ b/yaml-tests/src/test/java/TransactionSetupTest.java @@ -24,6 +24,7 @@ import com.apple.foundationdb.relational.yamltests.YamlExecutionContext; import com.apple.foundationdb.relational.yamltests.YamlRunner; import com.apple.foundationdb.relational.yamltests.configs.EmbeddedConfig; +import com.apple.foundationdb.relational.yamltests.configs.YamlTestConfig; import com.apple.foundationdb.relational.yamltests.server.SemanticVersion; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -45,7 +46,8 @@ public class TransactionSetupTest { private static final SemanticVersion VERSION = SemanticVersion.parse("4.4.8.0"); - private static final EmbeddedConfig config = new EmbeddedConfig(null); + private static final YamlTestConfig config = new EmbeddedConfig(null); + private static final boolean CORRECT_METRICS = false; @BeforeAll static void beforeAll() throws Exception { @@ -58,7 +60,13 @@ static void afterAll() throws Exception { } private void doRun(String fileName) throws Exception { - new YamlRunner(fileName, createConnectionFactory(), YamlExecutionContext.ContextOptions.EMPTY_OPTIONS).run(); + final YamlExecutionContext.ContextOptions options; + if (CORRECT_METRICS) { + options = YamlExecutionContext.ContextOptions.of(YamlExecutionContext.OPTION_CORRECT_METRICS, true); + } else { + options = YamlExecutionContext.ContextOptions.EMPTY_OPTIONS; + } + new YamlRunner(fileName, createConnectionFactory(), options).run(); } YamlConnectionFactory createConnectionFactory() { @@ -100,6 +108,7 @@ void shouldFail(String filename) { static Stream shouldPass() { return Stream.of( + "double-query-metrics", "double-reference", "double-setup", "duplicate-setup-reference-name", diff --git a/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.metrics.binpb b/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.metrics.binpb new file mode 100644 index 0000000000..7947de4854 --- /dev/null +++ b/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.metrics.binpb @@ -0,0 +1,25 @@ + +{ +transactions-testsEXPLAIN select * from t2Kcreate temporary function t2() on commit drop function AS SELECT * FROM t1; +-* Ϻ!(08@ SCAN(<,>)digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, )" ]; + 2 [ label=<
Primary Storage
record types: [T1]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, )" ]; + 2 -> 1 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} + +transactions-testsEXPLAIN select * from t2Ycreate temporary function t2() on commit drop function AS SELECT * FROM t1 where id < 50; + +ܧ:. ɵ/(08@9SCAN(<,>) | FILTER _.ID LESS_THAN promote(@cT218 AS LONG) +digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Predicate Filter
WHERE q14.ID LESS_THAN promote(@cT218 AS LONG)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, )" ]; + 2 [ label=<
Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, )" ]; + 3 [ label=<
Primary Storage
record types: [T1]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS ID, )" ]; + 3 -> 2 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q14> label="q14" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} \ No newline at end of file diff --git a/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.metrics.yaml b/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.metrics.yaml new file mode 100644 index 0000000000..23aca40dd6 --- /dev/null +++ b/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.metrics.yaml @@ -0,0 +1,26 @@ +transactions-tests: +- query: EXPLAIN select * from t2 + setup: + - create temporary function t2() on commit drop function AS SELECT * FROM t1; + explain: SCAN(<,>) + task_count: 166 + task_total_time_ms: 95 + transform_count: 42 + transform_time_ms: 70 + transform_yield_count: 15 + insert_time_ms: 6 + insert_new_count: 14 + insert_reused_count: 2 +- query: EXPLAIN select * from t2 + setup: + - create temporary function t2() on commit drop function AS SELECT * FROM t1 where + id < 50; + explain: SCAN(<,>) | FILTER _.ID LESS_THAN promote(@cT218 AS LONG) + task_count: 189 + task_total_time_ms: 122 + transform_count: 46 + transform_time_ms: 100 + transform_yield_count: 16 + insert_time_ms: 2 + insert_new_count: 18 + insert_reused_count: 2 diff --git a/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.yamsql b/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.yamsql new file mode 100644 index 0000000000..d694972124 --- /dev/null +++ b/yaml-tests/src/test/resources/transaction-setup/shouldPass/double-query-metrics.yamsql @@ -0,0 +1,48 @@ +# +# double-query-metrics.yamsql +# +# This source file is part of the FoundationDB open source project +# +# Copyright 2021-2025 Apple Inc. and the FoundationDB project authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This test should pass +--- +schema_template: + create table t1(id bigint, col1 bigint, primary key(id)) +--- +setup: + connect: 1 + steps: + - query: INSERT INTO t1 VALUES (10, 20), (30, 40), (50, 60), (70, 80) +--- +test_block: + name: transactions-tests + tests: + - + - query: select * from t2 + - setup: create temporary function t2() on commit drop function AS + SELECT * FROM t1; + - explain: "SCAN(<,>)" + - result: [ + {id: 10, col1: 20}, + {id: 30, col1: 40}, + {id: 50, col1: 60}, + {id: 70, col1: 80}] + - + - query: select * from t2 + - setup: create temporary function t2() on commit drop function AS + SELECT * FROM t1 where id < 50; + - explain: "SCAN(<,>) | FILTER _.ID LESS_THAN promote(@cT218 AS LONG)" +...