Files
greptimedb/tests/cases/standalone/common/partition.sql
T
dennis zhuang da88ff8653 fix(partition): route NULLs like row inserts and accept signed-minimum bounds (#9697)
* fix(partition): route NULLs like row inserts and accept signed-minimum bounds

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* fix(partition): keep equality two-valued for NULL rows and accept unsigned -0

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* fix(partition): treat NULL masks as false in batch routing and keep comparisons bare

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

* test(compat): update partition filter in analyze verbose expected output

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>

---------

Signed-off-by: Dennis Zhuang <killme2008@gmail.com>
2026-10-19 15:22:13 +00:00

223 lines
5.5 KiB
SQL

CREATE TABLE my_table (
a INT PRIMARY KEY,
b STRING,
ts TIMESTAMP TIME INDEX,
)
PARTITION ON COLUMNS (a) (
a < 1000,
a >= 1000 AND a < 2000,
a >= 2000
);
-- SQLNESS REPLACE (\d{13}) ID
SELECT table_catalog, table_schema, table_name, partition_name, partition_expression, partition_description, greptime_partition_id from information_schema.partitions WHERE table_name = 'my_table' ORDER BY table_catalog, table_schema, table_name, partition_name;
-- SQLNESS REPLACE (\d{13}) REGION_ID
-- SQLNESS REPLACE (\d{1}) PEER_ID
SELECT region_id, peer_id, is_leader, status FROM information_schema.region_peers ORDER BY peer_id;
INSERT INTO my_table VALUES
(100, 'a', 1),
(200, 'b', 2),
(1100, 'c', 3),
(1200, 'd', 4),
(2000, 'e', 5),
(2100, 'f', 6),
(2200, 'g', 7),
(2400, 'h', 8);
-- SQLNESS SORT_RESULT 3 1
SELECT * FROM my_table;
DELETE FROM my_table WHERE a < 150;
-- SQLNESS SORT_RESULT 3 1
SELECT * FROM my_table;
DELETE FROM my_table WHERE a < 2200 AND a > 1500;
-- SQLNESS SORT_RESULT 3 1
SELECT * FROM my_table;
DELETE FROM my_table WHERE a < 2500;
SELECT * FROM my_table;
DROP TABLE my_table;
CREATE TABLE my_table (
a INT PRIMARY KEY,
b STRING,
ts TIMESTAMP TIME INDEX,
)
PARTITION ON COLUMNS (a) ();
-- SQLNESS REPLACE (\d{13}) ID
SELECT table_catalog, table_schema, table_name, partition_name, partition_expression, greptime_partition_id from information_schema.partitions WHERE table_name = 'my_table' ORDER BY table_catalog, table_schema, table_name, partition_name;
-- SQLNESS REPLACE (\d{13}) REGION_ID
-- SQLNESS REPLACE (\d{1}) PEER_ID
SELECT region_id, peer_id, is_leader, status FROM information_schema.region_peers ORDER BY peer_id;
INSERT INTO my_table VALUES
(100, 'a', 1),
(200, 'b', 2),
(1100, 'c', 3),
(1200, 'd', 4),
(2000, 'e', 5),
(2100, 'f', 6),
(2200, 'g', 7),
(2400, 'h', 8);
-- SQLNESS SORT_RESULT 3 1
SELECT * FROM my_table;
DROP TABLE my_table;
-- incorrect partition rules
CREATE TABLE invalid_rule (
a INT PRIMARY KEY,
b STRING,
ts TIMESTAMP TIME INDEX,
)
PARTITION ON COLUMNS (a) (
a < 10,
a > 10 AND a < 20,
a >= 20
);
CREATE TABLE invalid_rule2 (
a INT,
b STRING PRIMARY KEY,
ts TIMESTAMP TIME INDEX,
)
PARTITION ON COLUMNS (b) (
b < 'abc',
b >= 'abca' AND b < 'o',
b >= 'o',
);
CREATE TABLE invalid_rule3 (
a INT,
b STRING PRIMARY KEY,
ts TIMESTAMP TIME INDEX,
)
PARTITION ON COLUMNS (b) (
b >= 'a',
b <= 'o',
);
CREATE TABLE valid_rule (
a INT,
b STRING,
ts TIMESTAMP TIME INDEX,
PRIMARY KEY (a, b)
)
PARTITION ON COLUMNS (a, b) (
a < 10,
a = 10 AND b < 'a',
a = 10 AND b >= 'a' AND b < 'o',
a = 10 AND b >= 'o',
a > 10,
);
-- SQLNESS REPLACE (metrics.*) REDACTED
-- SQLNESS REPLACE (RoundRobinBatch.*) REDACTED
-- SQLNESS REPLACE (Hash.*) REDACTED
-- SQLNESS REPLACE (-+) -
-- SQLNESS REPLACE (\s\s+) _
-- SQLNESS REPLACE (peers.*) REDACTED
-- SQLNESS REPLACE region=\d+\(\d+,\s+\d+\) region=REDACTED
EXPLAIN ANALYZE SELECT * FROM valid_rule;
-- SQLNESS REPLACE (metrics.*) REDACTED
-- SQLNESS REPLACE (RoundRobinBatch.*) REDACTED
-- SQLNESS REPLACE (Hash.*) REDACTED
-- SQLNESS REPLACE (-+) -
-- SQLNESS REPLACE (\s\s+) _
-- SQLNESS REPLACE (peers.*) REDACTED
-- SQLNESS REPLACE region=\d+\(\d+,\s+\d+\) region=REDACTED
EXPLAIN ANALYZE SELECT * FROM valid_rule
WHERE a < 10;
-- SQLNESS REPLACE (metrics.*) REDACTED
-- SQLNESS REPLACE (RoundRobinBatch.*) REDACTED
-- SQLNESS REPLACE (Hash.*) REDACTED
-- SQLNESS REPLACE (-+) -
-- SQLNESS REPLACE (\s\s+) _
-- SQLNESS REPLACE (peers.*) REDACTED
-- SQLNESS REPLACE region=\d+\(\d+,\s+\d+\) region=REDACTED
EXPLAIN ANALYZE SELECT * FROM valid_rule
WHERE a = 10 AND b= 'z';
-- SQLNESS REPLACE (metrics.*) REDACTED
-- SQLNESS REPLACE (RoundRobinBatch.*) REDACTED
-- SQLNESS REPLACE (Hash.*) REDACTED
-- SQLNESS REPLACE (-+) -
-- SQLNESS REPLACE (\s\s+) _
-- SQLNESS REPLACE (peers.*) REDACTED
-- SQLNESS REPLACE region=\d+\(\d+,\s+\d+\) region=REDACTED
EXPLAIN ANALYZE SELECT * FROM valid_rule
WHERE a = 10 OR b= 'z';
-- SQLNESS REPLACE (metrics.*) REDACTED
-- SQLNESS REPLACE (RoundRobinBatch.*) REDACTED
-- SQLNESS REPLACE (Hash.*) REDACTED
-- SQLNESS REPLACE (-+) -
-- SQLNESS REPLACE (\s\s+) _
-- SQLNESS REPLACE (peers.*) REDACTED
-- SQLNESS REPLACE region=\d+\(\d+,\s+\d+\) region=REDACTED
EXPLAIN ANALYZE SELECT * FROM valid_rule
WHERE a = 10 OR ts > 1;
-- SQLNESS REPLACE (metrics.*) REDACTED
-- SQLNESS REPLACE (RoundRobinBatch.*) REDACTED
-- SQLNESS REPLACE (Hash.*) REDACTED
-- SQLNESS REPLACE (-+) -
-- SQLNESS REPLACE (\s\s+) _
-- SQLNESS REPLACE (peers.*) REDACTED
-- SQLNESS REPLACE region=\d+\(\d+,\s+\d+\) region=REDACTED
EXPLAIN ANALYZE SELECT * FROM valid_rule
WHERE a = 10 OR (ts > 1 AND b ='h');
DROP TABLE valid_rule;
-- Issue https://github.com/GreptimeTeam/greptimedb/issues/4247
-- Partition rule with unary operator
CREATE TABLE `molestiAe` (
`sImiLiQUE` FLOAT NOT NULL,
`amEt` TIMESTAMP(6) TIME INDEX,
`EXpLICaBo` DOUBLE,
PRIMARY KEY (`sImiLiQUE`)
) PARTITION ON COLUMNS (`sImiLiQUE`) (
`sImiLiQUE` < -1,
`sImiLiQUE` >= -1 AND `sImiLiQUE` < -0,
`sImiLiQUE` >= 0
);
INSERT INTO `molestiAe` VALUES
(-2, 0, 0),
(-0.9, 0, 0),
(1, 0, 0);
-- SQLNESS SORT_RESULT 3 1
SELECT * FROM `molestiAe`;
DROP TABLE `molestiAe`;
-- The minimum of a signed type is a valid bound.
CREATE TABLE int_min_bound (
a INT PRIMARY KEY,
ts TIMESTAMP TIME INDEX,
) PARTITION ON COLUMNS (a) (
a < -2147483648,
a >= -2147483648 AND a < 0,
a >= 0
);
INSERT INTO int_min_bound VALUES (-2147483648, 1), (NULL, 2), (0, 3);
SELECT * FROM int_min_bound ORDER BY ts;
DROP TABLE int_min_bound;