diff --git a/tests/cases/standalone/common/join/merge_scan_semi_join.result b/tests/cases/standalone/common/join/merge_scan_semi_join.result index 5eb70b1241b..598e2099662 100644 --- a/tests/cases/standalone/common/join/merge_scan_semi_join.result +++ b/tests/cases/standalone/common/join/merge_scan_semi_join.result @@ -98,6 +98,337 @@ GROUP BY key_id ORDER BY key_id; | 33 | 2026-10-09T00:00:00 | +--------+---------------------+ +-- Reproduce issue 9492 at parallelism 2 with remote dynamic filters enabled. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 2; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 2 | ++-------------------+ + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| true | ++---------------------------------------------+ + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ +| logical_plan | Sort: merge_semi_data.key_id ASC NULLS LAST | +| | Projection: merge_semi_data.key_id, min(merge_semi_data.ts) AS first_ts | +| | Aggregate: groupBy=[[merge_semi_data.key_id]], aggr=[[min(merge_semi_data.ts)]] | +| | LeftSemi Join: merge_semi_data.key_id = __correlated_sq_1.key_id | +| | Projection: merge_semi_data.ts, merge_semi_data.key_id | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | Filter: merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | SubqueryAlias: __correlated_sq_1 | +| | Projection: merge_semi_data.key_id | +| | Filter: merge_semi_data.is_match AND merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.is_match, merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| physical_plan | SortPreservingMergeExec: [key_id@0 ASC NULLS LAST] | +| | ProjectionExec: expr=[key_id@0 as key_id, min(merge_semi_data.ts)@1 as first_ts] | +| | SortExec: expr=[key_id@0 ASC NULLS LAST], preserve_partitioning=[true] | +| | AggregateExec: mode=SinglePartitioned, gby=[key_id@1 as key_id], aggr=[min(merge_semi_data.ts)] | +| | HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(key_id@1, key_id@0)] | +| | RepartitionExec: partitioning=Hash([key_id@1], 2), input_partitions=2 | +| | ProjectionExec: expr=[ts@0 as ts, key_id@1 as key_id] | +| | MergeScanExec: peers=REDACTED +| | RepartitionExec: partitioning=Hash([key_id@0], 2), input_partitions=2 | +| | MergeScanExec: peers=REDACTED +| | | ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ + +-- SQLNESS PROTOCOL MYSQL +SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + ++--------+---------------------+ +| key_id | first_ts | ++--------+---------------------+ +| 1 | 2026-10-09 00:00:00 | +| 2 | 2026-10-09 00:00:00 | +| 3 | 2026-10-09 00:00:00 | +| 11 | 2026-10-09 00:00:00 | +| 12 | 2026-10-09 00:00:00 | +| 13 | 2026-10-09 00:00:00 | +| 21 | 2026-10-09 00:00:00 | +| 22 | 2026-10-09 00:00:00 | +| 23 | 2026-10-09 00:00:00 | +| 31 | 2026-10-09 00:00:00 | +| 32 | 2026-10-09 00:00:00 | +| 33 | 2026-10-09 00:00:00 | ++--------+---------------------+ + +-- Use one partition as the result control. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 1; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 1 | ++-------------------+ + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| true | ++---------------------------------------------+ + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + ++---------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| logical_plan | Sort: merge_semi_data.key_id ASC NULLS LAST | +| | Projection: merge_semi_data.key_id, min(merge_semi_data.ts) AS first_ts | +| | Aggregate: groupBy=[[merge_semi_data.key_id]], aggr=[[min(merge_semi_data.ts)]] | +| | LeftSemi Join: merge_semi_data.key_id = __correlated_sq_1.key_id | +| | Projection: merge_semi_data.ts, merge_semi_data.key_id | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | Filter: merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | SubqueryAlias: __correlated_sq_1 | +| | Projection: merge_semi_data.key_id | +| | Filter: merge_semi_data.is_match AND merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.is_match, merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| physical_plan | ProjectionExec: expr=[key_id@0 as key_id, min(merge_semi_data.ts)@1 as first_ts] | +| | SortExec: expr=[key_id@0 ASC NULLS LAST], preserve_partitioning=[false] | +| | AggregateExec: mode=Single, gby=[key_id@1 as key_id], aggr=[min(merge_semi_data.ts)] | +| | HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(key_id@1, key_id@0)] | +| | ProjectionExec: expr=[ts@0 as ts, key_id@1 as key_id] | +| | CooperativeExec | +| | MergeScanExec: peers=REDACTED +| | CooperativeExec | +| | MergeScanExec: peers=REDACTED +| | | ++---------------+-------------------------------------------------------------------------------------------------------------------------------------+ + +-- SQLNESS PROTOCOL MYSQL +SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + ++--------+---------------------+ +| key_id | first_ts | ++--------+---------------------+ +| 1 | 2026-10-09 00:00:00 | +| 2 | 2026-10-09 00:00:00 | +| 3 | 2026-10-09 00:00:00 | +| 11 | 2026-10-09 00:00:00 | +| 12 | 2026-10-09 00:00:00 | +| 13 | 2026-10-09 00:00:00 | +| 21 | 2026-10-09 00:00:00 | +| 22 | 2026-10-09 00:00:00 | +| 23 | 2026-10-09 00:00:00 | +| 31 | 2026-10-09 00:00:00 | +| 32 | 2026-10-09 00:00:00 | +| 33 | 2026-10-09 00:00:00 | ++--------+---------------------+ + +-- Keep two partitions and disable remote dynamic filters as the second control. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 2; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = false; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 2 | ++-------------------+ + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| false | ++---------------------------------------------+ + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ +| logical_plan | Sort: merge_semi_data.key_id ASC NULLS LAST | +| | Projection: merge_semi_data.key_id, min(merge_semi_data.ts) AS first_ts | +| | Aggregate: groupBy=[[merge_semi_data.key_id]], aggr=[[min(merge_semi_data.ts)]] | +| | LeftSemi Join: merge_semi_data.key_id = __correlated_sq_1.key_id | +| | Projection: merge_semi_data.ts, merge_semi_data.key_id | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | Filter: merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | SubqueryAlias: __correlated_sq_1 | +| | Projection: merge_semi_data.key_id | +| | Filter: merge_semi_data.is_match AND merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.is_match, merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| physical_plan | SortPreservingMergeExec: [key_id@0 ASC NULLS LAST] | +| | ProjectionExec: expr=[key_id@0 as key_id, min(merge_semi_data.ts)@1 as first_ts] | +| | SortExec: expr=[key_id@0 ASC NULLS LAST], preserve_partitioning=[true] | +| | AggregateExec: mode=SinglePartitioned, gby=[key_id@1 as key_id], aggr=[min(merge_semi_data.ts)] | +| | HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(key_id@1, key_id@0)] | +| | RepartitionExec: partitioning=Hash([key_id@1], 2), input_partitions=2 | +| | ProjectionExec: expr=[ts@0 as ts, key_id@1 as key_id] | +| | MergeScanExec: peers=REDACTED +| | RepartitionExec: partitioning=Hash([key_id@0], 2), input_partitions=2 | +| | MergeScanExec: peers=REDACTED +| | | ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ + +-- SQLNESS PROTOCOL MYSQL +SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + ++--------+---------------------+ +| key_id | first_ts | ++--------+---------------------+ +| 1 | 2026-10-09 00:00:00 | +| 2 | 2026-10-09 00:00:00 | +| 3 | 2026-10-09 00:00:00 | +| 11 | 2026-10-09 00:00:00 | +| 12 | 2026-10-09 00:00:00 | +| 13 | 2026-10-09 00:00:00 | +| 21 | 2026-10-09 00:00:00 | +| 22 | 2026-10-09 00:00:00 | +| 23 | 2026-10-09 00:00:00 | +| 31 | 2026-10-09 00:00:00 | +| 32 | 2026-10-09 00:00:00 | +| 33 | 2026-10-09 00:00:00 | ++--------+---------------------+ + +-- Restore SQLness defaults on the shared session and check its next plan. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 4; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = true; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| true | ++---------------------------------------------+ + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ +| logical_plan | Sort: merge_semi_data.key_id ASC NULLS LAST | +| | Projection: merge_semi_data.key_id, min(merge_semi_data.ts) AS first_ts | +| | Aggregate: groupBy=[[merge_semi_data.key_id]], aggr=[[min(merge_semi_data.ts)]] | +| | LeftSemi Join: merge_semi_data.key_id = __correlated_sq_1.key_id | +| | Projection: merge_semi_data.ts, merge_semi_data.key_id | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | Filter: merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | SubqueryAlias: __correlated_sq_1 | +| | Projection: merge_semi_data.key_id | +| | Filter: merge_semi_data.is_match AND merge_semi_data.key_id IS NOT NULL | +| | TableScan: merge_semi_data, partial_filters=[merge_semi_data.is_match, merge_semi_data.key_id IS NOT NULL] | +| | ]] | +| physical_plan | SortPreservingMergeExec: [key_id@0 ASC NULLS LAST] | +| | ProjectionExec: expr=[key_id@0 as key_id, min(merge_semi_data.ts)@1 as first_ts] | +| | SortExec: expr=[key_id@0 ASC NULLS LAST], preserve_partitioning=[true] | +| | AggregateExec: mode=SinglePartitioned, gby=[key_id@1 as key_id], aggr=[min(merge_semi_data.ts)] | +| | HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(key_id@1, key_id@0)] | +| | RepartitionExec: partitioning=Hash([key_id@1], 4), input_partitions=4 | +| | ProjectionExec: expr=[ts@0 as ts, key_id@1 as key_id] | +| | MergeScanExec: peers=REDACTED +| | RepartitionExec: partitioning=Hash([key_id@0], 4), input_partitions=4 | +| | MergeScanExec: peers=REDACTED +| | | ++---------------+---------------------------------------------------------------------------------------------------------------------------------------+ + DROP TABLE merge_semi_data; Affected Rows: 0 diff --git a/tests/cases/standalone/common/join/merge_scan_semi_join.sql b/tests/cases/standalone/common/join/merge_scan_semi_join.sql index 34e7b226592..6c3ad12baa1 100644 --- a/tests/cases/standalone/common/join/merge_scan_semi_join.sql +++ b/tests/cases/standalone/common/join/merge_scan_semi_join.sql @@ -46,4 +46,107 @@ WHERE key_id IN ( ) GROUP BY key_id ORDER BY key_id; +-- Reproduce issue 9492 at parallelism 2 with remote dynamic filters enabled. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 2; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + +-- SQLNESS PROTOCOL MYSQL +SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + +-- Use one partition as the result control. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 1; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + +-- SQLNESS PROTOCOL MYSQL +SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + +-- Keep two partitions and disable remote dynamic filters as the second control. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 2; + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = false; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + +-- SQLNESS PROTOCOL MYSQL +SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + +-- Restore SQLness defaults on the shared session and check its next plan. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 4; + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = true; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + +-- SQLNESS REPLACE (peers.*) peers=REDACTED +-- SQLNESS PROTOCOL MYSQL +EXPLAIN SELECT key_id, MIN(ts) AS first_ts +FROM merge_semi_data +WHERE key_id IN ( + SELECT key_id FROM merge_semi_data WHERE is_match = true +) +GROUP BY key_id ORDER BY key_id; + DROP TABLE merge_semi_data; diff --git a/tests/cases/standalone/common/query_options.result b/tests/cases/standalone/common/query_options.result new file mode 100644 index 00000000000..7fe377944a1 --- /dev/null +++ b/tests/cases/standalone/common/query_options.result @@ -0,0 +1,164 @@ +-- Query options persist on each protocol's connection. SQLness pins N=4. +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 4 | ++-------------------+ + +-- SQLNESS PROTOCOL MYSQL +SET query_parallelism = 2; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 2 | ++-------------------+ + +-- Invalid SET preserves the preceding value. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 0; + +Failed to execute query, err: MySqlError { ERROR 1210 (HY000): (InvalidArguments): Invalid value for parameter "query.parallelism": 0 +Hint: query.parallelism must be between 1 and 1024 } + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 2 | ++-------------------+ + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = false; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| false | ++---------------------------------------------+ + +-- Restore the shared MySQL connection before another case uses it. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 4; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = true; + +affected_rows: 0 + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 4 | ++-------------------+ + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| true | ++---------------------------------------------+ + +-- PostgreSQL owns a separate session and accepts the same query options. +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 4 | ++-------------------+ + +-- SQLNESS PROTOCOL POSTGRES +SET query.parallelism TO 2; + +Affected Rows: 0 + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 2 | ++-------------------+ + +-- SQLNESS PROTOCOL POSTGRES +SET query.parallelism = 0; + +Failed to execute query, encountered: Error { kind: Db, cause: Some(DbError { severity: "ERROR", parsed_severity: None, code: SqlState(E22023), message: "Invalid value for parameter \"query.parallelism\": 0\nHint: query.parallelism must be between 1 and 1024", detail: None, hint: None, position: None, where_: None, schema: None, table: None, column: None, datatype: None, constraint: None, file: None, line: None, routine: None }) } + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 2 | ++-------------------+ + +-- SQLNESS PROTOCOL POSTGRES +SET query.enable_remote_dynamic_filter_pushdown = false; + +Affected Rows: 0 + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| false | ++---------------------------------------------+ + +-- Restore the shared PostgreSQL connection as well. +-- SQLNESS PROTOCOL POSTGRES +SET query.parallelism = 4; + +Affected Rows: 0 + +-- SQLNESS PROTOCOL POSTGRES +SET query.enable_remote_dynamic_filter_pushdown = true; + +Affected Rows: 0 + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + ++-------------------+ +| query.parallelism | ++-------------------+ +| 4 | ++-------------------+ + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + ++---------------------------------------------+ +| query.enable_remote_dynamic_filter_pushdown | ++---------------------------------------------+ +| true | ++---------------------------------------------+ + diff --git a/tests/cases/standalone/common/query_options.sql b/tests/cases/standalone/common/query_options.sql new file mode 100644 index 00000000000..b2578072632 --- /dev/null +++ b/tests/cases/standalone/common/query_options.sql @@ -0,0 +1,70 @@ +-- Query options persist on each protocol's connection. SQLness pins N=4. +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL MYSQL +SET query_parallelism = 2; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + +-- Invalid SET preserves the preceding value. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 0; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = false; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + +-- Restore the shared MySQL connection before another case uses it. +-- SQLNESS PROTOCOL MYSQL +SET query.parallelism = 4; + +-- SQLNESS PROTOCOL MYSQL +SET query.enable_remote_dynamic_filter_pushdown = true; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL MYSQL +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + +-- PostgreSQL owns a separate session and accepts the same query options. +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL POSTGRES +SET query.parallelism TO 2; + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL POSTGRES +SET query.parallelism = 0; + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL POSTGRES +SET query.enable_remote_dynamic_filter_pushdown = false; + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown; + +-- Restore the shared PostgreSQL connection as well. +-- SQLNESS PROTOCOL POSTGRES +SET query.parallelism = 4; + +-- SQLNESS PROTOCOL POSTGRES +SET query.enable_remote_dynamic_filter_pushdown = true; + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.parallelism; + +-- SQLNESS PROTOCOL POSTGRES +SHOW VARIABLES query.enable_remote_dynamic_filter_pushdown;