From 2e9900ea24a15807e74ca606db972e04235ac368 Mon Sep 17 00:00:00 2001 From: Leonid Fedorov Date: Mon, 1 Sep 2025 14:22:48 +0000 Subject: [PATCH] test(rbo): initial test --- .../columnstore/future/rbo_parallel_ces.test | 71 +++++++++++++++++++ .../columnstore/include/cross_engine.inc | 17 +++++ 2 files changed, 88 insertions(+) create mode 100644 mysql-test/columnstore/future/rbo_parallel_ces.test create mode 100644 mysql-test/columnstore/include/cross_engine.inc diff --git a/mysql-test/columnstore/future/rbo_parallel_ces.test b/mysql-test/columnstore/future/rbo_parallel_ces.test new file mode 100644 index 000000000..80cada4a1 --- /dev/null +++ b/mysql-test/columnstore/future/rbo_parallel_ces.test @@ -0,0 +1,71 @@ +--source ../include/have_columnstore.inc +--source ../include/functions.inc +--source ../include/cross_engine.inc + + +--disable_warnings +DROP DATABASE IF EXISTS rbo_parallel_ces; +--enable_warnings + +CREATE DATABASE rbo_parallel_ces; +USE rbo_parallel_ces; + +# Turn on plan logging to capture CSEP strings +SELECT calsettrace(1); + +# Test table in InnoDB (routed to ColumnStore via CES) +CREATE TABLE Ti (col1 INT, col2 INT, col3 INT) ENGINE=InnoDB; + +# Populate with 100 rows +INSERT INTO Ti (col1, col2, col3) +SELECT seq, seq+1, seq+2 FROM (SELECT seq FROM seq_1_to_100) AS numbers; + +# Generate statistics, limit histogram size +SET @@histogram_size=10; +ANALYZE TABLE Ti PERSISTENT FOR ALL; + +# Index to make basic stats available +CREATE INDEX excellent_index ON Ti(col1); + +# Enable RBO +SET @@columnstore_unstable_optimizer=ON; +SET @@optimizer_switch='derived_merge=off'; + +# First run with parallel factor 5 +SET @@columnstore_ces_optimization_parallel_factor=5; + +# Execute a query to build and store plans +SELECT SUM(col1) FROM Ti; + +# Snapshot plans into variables for readability +SET @orig_plan := mcsgetplan('original'); +SET @opt_plan := mcsgetplan('optimized'); +SET @rbo_rules := mcsgetplan('rules'); + +# Validate plan contents using stored plans +# Count Union Units by looking for opening unit blocks after the marker '--- Union Unit ---' +SET @uu_tail := SUBSTRING_INDEX(@orig_plan, '--- Union Unit ---', -1); +SET @unit_open := CONCAT(CHAR(10),' {',CHAR(10)); +SELECT (CHAR_LENGTH(@uu_tail) - CHAR_LENGTH(REPLACE(@uu_tail, @unit_open, '')))/CHAR_LENGTH(@unit_open) AS unions_original; + +SET @uu_tail := SUBSTRING_INDEX(@opt_plan, '--- Union Unit ---', -1); +SELECT (CHAR_LENGTH(@uu_tail) - CHAR_LENGTH(REPLACE(@uu_tail, @unit_open, '')))/CHAR_LENGTH(@unit_open) AS unions_optimized_5; + +# Ensure rule was applied +SELECT @rbo_rules LIKE '%parallel_ces%' AS rule_parallel_ces_applied; + +# Increase factor to 15 but expect 10 unions due to histogram_size cap +SET @@columnstore_ces_optimization_parallel_factor=15; + +# Re-execute to rebuild plan with new factor +SELECT SUM(col1) FROM Ti; + +SET @opt_plan := mcsgetplan('optimized'); +SET @uu_tail := SUBSTRING_INDEX(@opt_plan, '--- Union Unit ---', -1); +SELECT (CHAR_LENGTH(@uu_tail) - CHAR_LENGTH(REPLACE(@uu_tail, @unit_open, '')))/CHAR_LENGTH(@unit_open) AS unions_optimized_15; + +# Cleanup +SELECT calsettrace(0); +DROP DATABASE rbo_parallel_ces; + +--source ../include/drop_functions.inc diff --git a/mysql-test/columnstore/include/cross_engine.inc b/mysql-test/columnstore/include/cross_engine.inc new file mode 100644 index 000000000..5eca6141a --- /dev/null +++ b/mysql-test/columnstore/include/cross_engine.inc @@ -0,0 +1,17 @@ +# -------------------------------------------------------------- # +# Enable cross engine join +# Configure user and password in Columnstore.xml file +# -------------------------------------------------------------- # +--exec /usr/bin/mcsSetConfig CrossEngineSupport User 'cejuser' +--exec /usr/bin/mcsSetConfig CrossEngineSupport Password 'Vagrant1|0000001' +# -------------------------------------------------------------- # +# Create corresponding in the server +# -------------------------------------------------------------- # + +--disable_warnings +CREATE USER IF NOT EXISTS'cejuser'@'localhost' IDENTIFIED BY 'Vagrant1|0000001'; +--enable_warnings + +GRANT ALL PRIVILEGES ON *.* TO 'cejuser'@'localhost'; +FLUSH PRIVILEGES; +