From 62e5b84e77e093b18630539655bf652a50fafaf7 Mon Sep 17 00:00:00 2001 From: Alec Grieser Date: Mon, 10 Nov 2025 10:47:06 +0000 Subject: [PATCH 1/3] Create test showcasing bug with enums and index scans This adds a test case to showcase the problem with #3734. It modifies `enum.yamsql` with a new test case analogous to the one in the issue. There are two new queries that are planned with an index scan over an index on an enum valued field, and both of them fail with the same `NullPointerException` that is alluded to in the bug report. --- .../src/test/resources/enum.metrics.binpb | 101 ++++++++++++++++++ .../src/test/resources/enum.metrics.yaml | 80 ++++++++++++++ yaml-tests/src/test/resources/enum.yamsql | 55 ++++++++++ 3 files changed, 236 insertions(+) create mode 100644 yaml-tests/src/test/resources/enum.metrics.binpb create mode 100644 yaml-tests/src/test/resources/enum.metrics.yaml diff --git a/yaml-tests/src/test/resources/enum.metrics.binpb b/yaml-tests/src/test/resources/enum.metrics.binpb new file mode 100644 index 0000000000..3b5bac65b0 --- /dev/null +++ b/yaml-tests/src/test/resources/enum.metrics.binpb @@ -0,0 +1,101 @@ + +E + +enum-tests7EXPLAIN SELECT * From TABLE_A where "mood" = 'CONFUSED' +0 (088@SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood EQUALS promote(@c8 AS ENUM)digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Predicate Filter
WHERE q2.mood EQUALS promote(@c8 AS ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)>)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 [ label=<
Type Filter
WHERE record IS [TABLE_A]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 3 [ label=<
Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 4 [ label=<
Primary Storage
record types: [TABLE_A, TABLE_B]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 3 -> 2 [ label=< q19> label="q19" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} +H + +enum-tests:EXPLAIN SELECT * From TABLE_A where "mood" > 'INDIFFERENT' +Ҩ0 (08@SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood GREATER_THAN promote(@c8 AS ENUM)digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Predicate Filter
WHERE q2.mood GREATER_THAN promote(@c8 AS ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)>)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 [ label=<
Type Filter
WHERE record IS [TABLE_A]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 3 [ label=<
Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 4 [ label=<
Primary Storage
record types: [TABLE_A, TABLE_B]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 3 -> 2 [ label=< q19> label="q19" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} +I + +enum-tests;EXPLAIN SELECT * From TABLE_A where "mood" >= 'INDIFFERENT' +90 ,(08@SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood GREATER_THAN_OR_EQUALS promote(@c9 AS ENUM)digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Predicate Filter
WHERE q2.mood GREATER_THAN_OR_EQUALS promote(@c9 AS ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)>)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 [ label=<
Type Filter
WHERE record IS [TABLE_A]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 3 [ label=<
Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 4 [ label=<
Primary Storage
record types: [TABLE_A, TABLE_B]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 3 -> 2 [ label=< q19> label="q19" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} +A + +enum-tests3EXPLAIN SELECT * From TABLE_A where "mood" < "mood" +Տ90 ,(0ȯ8@) | TFILTER TABLE_A | FILTER _.mood LESS_THAN _.mooddigraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Predicate Filter
WHERE q2.mood LESS_THAN q2.mood
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 [ label=<
Type Filter
WHERE record IS [TABLE_A]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 3 [ label=<
Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 4 [ label=<
Primary Storage
record types: [TABLE_A, TABLE_B]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 3 -> 2 [ label=< q19> label="q19" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} + +E + +enum-tests7EXPLAIN SELECT * From TABLE_B where "mood" = 'CONFUSED' + +֤FM ͕7(08"@ISCAN(B$MOOD [EQUALS promote(@c8 AS ENUM)]) digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Index Scan
comparisons: [EQUALS promote(@c8 AS ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)>)]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 [ label=<
Index
B$MOOD
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 -> 1 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} +H + +enum-tests:EXPLAIN SELECT * From TABLE_B where "mood" > 'INDIFFERENT' + +ٲ N (0Q8"@ISCAN(B$MOOD [[GREATER_THAN promote(@c8 AS ENUM)]]) digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Index Scan
comparisons: [[GREATER_THAN promote(@c8 AS ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)>)]]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 [ label=<
Index
B$MOOD
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 -> 1 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; +} +I + +enum-tests;EXPLAIN SELECT * From TABLE_A where "mood" != 'INDIFFERENT' +>0 ֖2(0̻8@SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood NOT_EQUALS promote(@c9 AS ENUM)digraph G { + fontname=courier; + rankdir=BT; + splines=polyline; + 1 [ label=<
Predicate Filter
WHERE q2.mood NOT_EQUALS promote(@c9 AS ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)>)
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 2 [ label=<
Type Filter
WHERE record IS [TABLE_A]
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(LONG AS id, STRING AS name, ENUM<JOYFUL(0), HAPPY(1), RELAXED(2), INDIFFERENT(3), CONFUSED(4), SAD(5), ANXIOUS(6), ANGRY(7)> AS mood)" ]; + 3 [ label=<
Scan
range: <-∞, ∞>
> color="black" shape="plain" style="solid" fillcolor="black" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 4 [ label=<
Primary Storage
record types: [TABLE_A, TABLE_B]
> color="black" shape="plain" style="filled" fillcolor="lightblue" fontname="courier" fontsize="8" tooltip="RELATION(RECORD)" ]; + 3 -> 2 [ label=< q19> label="q19" color="gray20" style="bold" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 4 -> 3 [ color="gray20" style="solid" fontname="courier" fontsize="8" arrowhead="normal" arrowtail="none" dir="both" ]; + 2 -> 1 [ label=< q2> label="q2" 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/enum.metrics.yaml b/yaml-tests/src/test/resources/enum.metrics.yaml new file mode 100644 index 0000000000..888637eb1f --- /dev/null +++ b/yaml-tests/src/test/resources/enum.metrics.yaml @@ -0,0 +1,80 @@ +enum-tests: +- query: EXPLAIN SELECT * From TABLE_A where "mood" = 'CONFUSED' + explain: SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood EQUALS promote(@c8 AS ENUM) + task_count: 187 + task_total_time_ms: 12 + transform_count: 48 + transform_time_ms: 7 + transform_yield_count: 14 + insert_time_ms: 0 + insert_new_count: 17 + insert_reused_count: 2 +- query: EXPLAIN SELECT * From TABLE_A where "mood" > 'INDIFFERENT' + explain: SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood GREATER_THAN promote(@c8 + AS ENUM) + task_count: 187 + task_total_time_ms: 14 + transform_count: 48 + transform_time_ms: 6 + transform_yield_count: 14 + insert_time_ms: 0 + insert_new_count: 17 + insert_reused_count: 2 +- query: EXPLAIN SELECT * From TABLE_A where "mood" >= 'INDIFFERENT' + explain: SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood GREATER_THAN_OR_EQUALS promote(@c9 + AS ENUM) + task_count: 187 + task_total_time_ms: 119 + transform_count: 48 + transform_time_ms: 93 + transform_yield_count: 14 + insert_time_ms: 2 + insert_new_count: 17 + insert_reused_count: 2 +- query: EXPLAIN SELECT * From TABLE_A where "mood" < "mood" + explain: SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood LESS_THAN _.mood + task_count: 187 + task_total_time_ms: 119 + transform_count: 48 + transform_time_ms: 94 + transform_yield_count: 14 + insert_time_ms: 2 + insert_new_count: 17 + insert_reused_count: 2 +- query: EXPLAIN SELECT * From TABLE_B where "mood" = 'CONFUSED' + explain: ISCAN(B$MOOD [EQUALS promote(@c8 AS ENUM)]) + task_count: 335 + task_total_time_ms: 147 + transform_count: 77 + transform_time_ms: 115 + transform_yield_count: 30 + insert_time_ms: 2 + insert_new_count: 34 + insert_reused_count: 4 +- query: EXPLAIN SELECT * From TABLE_B where "mood" > 'INDIFFERENT' + explain: ISCAN(B$MOOD [[GREATER_THAN promote(@c8 AS ENUM)]]) + task_count: 335 + task_total_time_ms: 28 + transform_count: 78 + transform_time_ms: 10 + transform_yield_count: 30 + insert_time_ms: 1 + insert_new_count: 34 + insert_reused_count: 4 +- query: EXPLAIN SELECT * From TABLE_A where "mood" != 'INDIFFERENT' + explain: SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood NOT_EQUALS promote(@c9 AS + ENUM) + task_count: 187 + task_total_time_ms: 130 + transform_count: 48 + transform_time_ms: 105 + transform_yield_count: 14 + insert_time_ms: 3 + insert_new_count: 17 + insert_reused_count: 2 diff --git a/yaml-tests/src/test/resources/enum.yamsql b/yaml-tests/src/test/resources/enum.yamsql index 5f341b88d0..86e5ddae09 100644 --- a/yaml-tests/src/test/resources/enum.yamsql +++ b/yaml-tests/src/test/resources/enum.yamsql @@ -25,6 +25,10 @@ options: schema_template: CREATE TYPE AS ENUM MOOD ( 'JOYFUL', 'HAPPY', 'RELAXED', 'INDIFFERENT', 'CONFUSED', 'SAD', 'ANXIOUS', 'ANGRY' ) CREATE TABLE TABLE_A ("id" BIGINT, "name" STRING, "mood" MOOD, PRIMARY KEY("id") ) + + CREATE TABLE TABLE_B ("id" BIGINT, "name" STRING, "mood" MOOD, PRIMARY KEY("id") ) + CREATE INDEX "B$MOOD" AS SELECT "mood" FROM TABLE_B + WITH OPTIONS(ENABLE_LONG_ROWS=true) --- setup: @@ -46,16 +50,32 @@ setup: - query: INSERT INTO TABLE_A("id", "name") VALUES (14, 'alice'), (15, 'bob') + - query: INSERT INTO TABLE_B + VALUES (1, 'foo', 'HAPPY'), + (2, 'bar', 'CONFUSED'), + (3, 'baz', 'JOYFUL'), + (4, 'qux', 'ANGRY'), + (5, 'quux', 'RELAXED'), + (6, 'corge', 'JOYFUL'), + (7, 'grault', 'ANXIOUS'), + (8, 'garply', 'SAD'), + (9, 'waldo', 'JOYFUL'), + (10, 'fred', 'INDIFFERENT'), + (11, 'plugh', 'CONFUSED'), + (12, 'xyzzy', 'INDIFFERENT'), + (13, 'thud', 'SAD') --- test_block: name: enum-tests tests: - - query: SELECT * From TABLE_A where "mood" = 'CONFUSED' + - explain: "SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood EQUALS promote(@c8 AS ENUM)" - unorderedResult: [{2, 'bar', 'CONFUSED'}, {11, 'plugh', 'CONFUSED'}] - - query: SELECT * From TABLE_A where "mood" > 'INDIFFERENT' + - explain: "SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood GREATER_THAN promote(@c8 AS ENUM)" - unorderedResult: [{2, 'bar', 'CONFUSED'}, {4, 'qux', 'ANGRY'}, {7, 'grault', 'ANXIOUS'}, @@ -64,6 +84,7 @@ test_block: {13, 'thud', 'SAD'}] - - query: SELECT * From TABLE_A where "mood" >= 'INDIFFERENT' + - explain: "SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood GREATER_THAN_OR_EQUALS promote(@c9 AS ENUM)" - unorderedResult: [{2, 'bar', 'CONFUSED'}, {4, 'qux', 'ANGRY'}, {7, 'grault', 'ANXIOUS'}, @@ -106,6 +127,7 @@ test_block: - unorderedResult: [] - - query: SELECT * From TABLE_A where "mood" < "mood" + - explain: "SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood LESS_THAN _.mood" - unorderedResult: [] - - query: SELECT * From TABLE_A where "mood" IS NOT NULL AND "id" < 5 @@ -129,4 +151,37 @@ test_block: - error: "XX000" - initialVersionLessThan: 4.7.3.0 - error: "XXXXX" + + - + - query: SELECT * From TABLE_B where "mood" = 'CONFUSED' + - explain: "ISCAN(B$MOOD [EQUALS promote(@c8 AS ENUM)])" + # Disable force_continuations on this plan until we resolve: https://github.com/FoundationDB/fdb-record-layer/issues/3734 + - maxRows: 0 + - unorderedResult: [{2, 'bar', 'CONFUSED'}, + {11, 'plugh', 'CONFUSED'}] + - + - query: SELECT * From TABLE_B where "mood" > 'INDIFFERENT' + - explain: "ISCAN(B$MOOD [[GREATER_THAN promote(@c8 AS ENUM)]])" + # Disable force_continuations on this plan until we resolve: https://github.com/FoundationDB/fdb-record-layer/issues/3734 + - maxRows: 0 + - unorderedResult: [{2, 'bar', 'CONFUSED'}, + {4, 'qux', 'ANGRY'}, + {7, 'grault', 'ANXIOUS'}, + {8, 'garply', 'SAD'}, + {11, 'plugh', 'CONFUSED'}, + {13, 'thud', 'SAD'}] + - + - query: SELECT * From TABLE_A where "mood" != 'INDIFFERENT' + - explain: "SCAN(<,>) | TFILTER TABLE_A | FILTER _.mood NOT_EQUALS promote(@c9 AS ENUM)" + - unorderedResult: [{1, 'foo', 'HAPPY'}, + {2, 'bar', 'CONFUSED'}, + {3, 'baz', 'JOYFUL'}, + {4, 'qux', 'ANGRY'}, + {5, 'quux', 'RELAXED'}, + {6, 'corge', 'JOYFUL'}, + {7, 'grault', 'ANXIOUS'}, + {8, 'garply', 'SAD'}, + {9, 'waldo', 'JOYFUL'}, + {11, 'plugh', 'CONFUSED'}, + {13, 'thud', 'SAD'}] ... From c8dfdd9b1b88736b06fdbf18e2533d1e2f33fd37 Mon Sep 17 00:00:00 2001 From: Alec Grieser Date: Mon, 10 Nov 2025 10:49:41 +0000 Subject: [PATCH 2/3] Enable force continuations on two test cases to demonstrate that they fail --- .../relational/yamltests/YamlTestExtension.java | 2 +- .../yamltests/command/QueryExecutor.java | 16 +++++++++------- yaml-tests/src/test/resources/enum.yamsql | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java index 974db4ccba..7d581b9792 100644 --- a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java +++ b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java @@ -134,7 +134,7 @@ private Stream localConfigs(final boolean mixedModeOnly, final b if (mixedModeOnly || singleExternalVersionOnly) { return Stream.of(); } else { - return Stream.of(new EmbeddedConfig(clusterFile), new JDBCInProcessConfig(clusterFile)); + return Stream.of(new EmbeddedConfig(clusterFile), new ForceContinuations(new EmbeddedConfig(clusterFile)), new JDBCInProcessConfig(clusterFile)); } } 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 0babee8e5f..36c7cdd668 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 @@ -148,13 +148,15 @@ private Object executeStatementAndCheckCacheIfNeeded(@Nonnull Statement s, final preMetricCollector.getCountsForCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) : 0; final var toReturn = executeStatementAndCheckForceContinuations(s, statementHasQuery, queryString, connection, maxRows); final var postMetricCollector = connection.getMetricCollector(); - final var postValue = postMetricCollector.hasCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) ? - postMetricCollector.getCountsForCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) : 0; - final var planFound = preMetricCollector != postMetricCollector ? postValue == 1 : postValue == preValue + 1; - if (!planFound) { - reportTestFailure("‼️ Expected to retrieve the plan from the cache at line " + lineNumber); - } else { - logger.debug("🎁 Retrieved the plan from the cache!"); + if (postMetricCollector != null) { + final var postValue = postMetricCollector.hasCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) ? + postMetricCollector.getCountsForCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) : 0; + final var planFound = preMetricCollector != postMetricCollector ? postValue == 1 : postValue == preValue + 1; + if (!planFound) { + reportTestFailure("‼️ Expected to retrieve the plan from the cache at line " + lineNumber); + } else { + logger.debug("🎁 Retrieved the plan from the cache!"); + } } return toReturn; } diff --git a/yaml-tests/src/test/resources/enum.yamsql b/yaml-tests/src/test/resources/enum.yamsql index 86e5ddae09..916f9040e5 100644 --- a/yaml-tests/src/test/resources/enum.yamsql +++ b/yaml-tests/src/test/resources/enum.yamsql @@ -156,14 +156,14 @@ test_block: - query: SELECT * From TABLE_B where "mood" = 'CONFUSED' - explain: "ISCAN(B$MOOD [EQUALS promote(@c8 AS ENUM)])" # Disable force_continuations on this plan until we resolve: https://github.com/FoundationDB/fdb-record-layer/issues/3734 - - maxRows: 0 + # - maxRows: 0 - unorderedResult: [{2, 'bar', 'CONFUSED'}, {11, 'plugh', 'CONFUSED'}] - - query: SELECT * From TABLE_B where "mood" > 'INDIFFERENT' - explain: "ISCAN(B$MOOD [[GREATER_THAN promote(@c8 AS ENUM)]])" # Disable force_continuations on this plan until we resolve: https://github.com/FoundationDB/fdb-record-layer/issues/3734 - - maxRows: 0 + # - maxRows: 0 - unorderedResult: [{2, 'bar', 'CONFUSED'}, {4, 'qux', 'ANGRY'}, {7, 'grault', 'ANXIOUS'}, From 72fce249f0795b570c502661f97122a14282be4a Mon Sep 17 00:00:00 2001 From: Alec Grieser Date: Mon, 10 Nov 2025 16:57:39 +0000 Subject: [PATCH 3/3] Revert "Enable force continuations on two test cases to demonstrate that they fail" This reverts commit c8dfdd9b1b88736b06fdbf18e2533d1e2f33fd37. --- .../relational/yamltests/YamlTestExtension.java | 2 +- .../yamltests/command/QueryExecutor.java | 16 +++++++--------- yaml-tests/src/test/resources/enum.yamsql | 4 ++-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java index 7d581b9792..974db4ccba 100644 --- a/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java +++ b/yaml-tests/src/main/java/com/apple/foundationdb/relational/yamltests/YamlTestExtension.java @@ -134,7 +134,7 @@ private Stream localConfigs(final boolean mixedModeOnly, final b if (mixedModeOnly || singleExternalVersionOnly) { return Stream.of(); } else { - return Stream.of(new EmbeddedConfig(clusterFile), new ForceContinuations(new EmbeddedConfig(clusterFile)), new JDBCInProcessConfig(clusterFile)); + return Stream.of(new EmbeddedConfig(clusterFile), new JDBCInProcessConfig(clusterFile)); } } 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 36c7cdd668..0babee8e5f 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 @@ -148,15 +148,13 @@ private Object executeStatementAndCheckCacheIfNeeded(@Nonnull Statement s, final preMetricCollector.getCountsForCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) : 0; final var toReturn = executeStatementAndCheckForceContinuations(s, statementHasQuery, queryString, connection, maxRows); final var postMetricCollector = connection.getMetricCollector(); - if (postMetricCollector != null) { - final var postValue = postMetricCollector.hasCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) ? - postMetricCollector.getCountsForCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) : 0; - final var planFound = preMetricCollector != postMetricCollector ? postValue == 1 : postValue == preValue + 1; - if (!planFound) { - reportTestFailure("‼️ Expected to retrieve the plan from the cache at line " + lineNumber); - } else { - logger.debug("🎁 Retrieved the plan from the cache!"); - } + final var postValue = postMetricCollector.hasCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) ? + postMetricCollector.getCountsForCounter(RelationalMetric.RelationalCount.PLAN_CACHE_TERTIARY_HIT) : 0; + final var planFound = preMetricCollector != postMetricCollector ? postValue == 1 : postValue == preValue + 1; + if (!planFound) { + reportTestFailure("‼️ Expected to retrieve the plan from the cache at line " + lineNumber); + } else { + logger.debug("🎁 Retrieved the plan from the cache!"); } return toReturn; } diff --git a/yaml-tests/src/test/resources/enum.yamsql b/yaml-tests/src/test/resources/enum.yamsql index 916f9040e5..86e5ddae09 100644 --- a/yaml-tests/src/test/resources/enum.yamsql +++ b/yaml-tests/src/test/resources/enum.yamsql @@ -156,14 +156,14 @@ test_block: - query: SELECT * From TABLE_B where "mood" = 'CONFUSED' - explain: "ISCAN(B$MOOD [EQUALS promote(@c8 AS ENUM)])" # Disable force_continuations on this plan until we resolve: https://github.com/FoundationDB/fdb-record-layer/issues/3734 - # - maxRows: 0 + - maxRows: 0 - unorderedResult: [{2, 'bar', 'CONFUSED'}, {11, 'plugh', 'CONFUSED'}] - - query: SELECT * From TABLE_B where "mood" > 'INDIFFERENT' - explain: "ISCAN(B$MOOD [[GREATER_THAN promote(@c8 AS ENUM)]])" # Disable force_continuations on this plan until we resolve: https://github.com/FoundationDB/fdb-record-layer/issues/3734 - # - maxRows: 0 + - maxRows: 0 - unorderedResult: [{2, 'bar', 'CONFUSED'}, {4, 'qux', 'ANGRY'}, {7, 'grault', 'ANXIOUS'},