From 2c78f310dd00535060f11015fd2db568621cd93e Mon Sep 17 00:00:00 2001 From: yuzupy Date: Fri, 12 Oct 2018 11:23:42 +0900 Subject: [PATCH] Add test for hypothetical indexes on hypothetical partitioning --- Makefile | 3 +- expected/hypo_index_table.out | 111 ++++++++++++++++++++++++++++++++++ test/sql/hypo_index_table.sql | 53 ++++++++++++++++ 3 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 expected/hypo_index_table.out create mode 100644 test/sql/hypo_index_table.sql diff --git a/Makefile b/Makefile index bdf96be..2f629d6 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,8 @@ EXTVERSION = $(shell grep default_version $(EXTENSION).control | sed -e "s/def TESTS = $(wildcard test/sql/*.sql) REGRESS = hypo_setup \ hypo_index \ - hypo_table + hypo_table \ + hypo_index_table REGRESS_OPTS = --inputdir=test diff --git a/expected/hypo_index_table.out b/expected/hypo_index_table.out new file mode 100644 index 0000000..fca8f6a --- /dev/null +++ b/expected/hypo_index_table.out @@ -0,0 +1,111 @@ +-- Creating real and hypothetical tables +-- ===================================== +-- Real tables +-- ------------ +-- 1. Range partitioning for hypothetical index +DROP TABLE IF EXISTS part_range; +CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id); +CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000); +CREATE TABLE part_range_10000_20000 PARTITION OF part_range FOR VALUES FROM (10000) TO (20000); +CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (20000) TO (30000); +INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i; +-- Hypothetical tables +-- ------------------- +-- 0. Dropping any hypothetical object +SELECT * FROM hypopg_reset_index(); + hypopg_reset_index +-------------------- + +(1 row) + +SELECT * FROM hypopg_reset_table(); + hypopg_reset_table +-------------------- + +(1 row) + +-- 1. Range partitioning for hypothetical index +DROP TABLE IF EXISTS hypo_part_range; +CREATE TABLE hypo_part_range (id integer, val text); +INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i; +SELECT * FROM hypopg_partition_table('hypo_part_range', 'PARTITION BY RANGE (id)'); + hypopg_partition_table +------------------------ + t +(1 row) + +SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)'); + tablename +------------------------- + hypo_part_range_1_10000 +(1 row) + +SELECT tablename FROM hypopg_add_partition('hypo_part_range_10000_20000', 'PARTITION OF hypo_part_range FOR VALUES FROM (10000) TO (20000)'); + tablename +----------------------------- + hypo_part_range_10000_20000 +(1 row) + +SELECT tablename FROM hypopg_add_partition('hypo_part_range_20000_30000', 'PARTITION OF hypo_part_range FOR VALUES FROM (20000) TO (30000)'); + tablename +----------------------------- + hypo_part_range_20000_30000 +(1 row) + +-- Maintenance +-- ----------- +VACUUM ANALYZE; +SELECT * FROM hypopg_analyze('hypo_part_range',100); + hypopg_analyze +---------------- + +(1 row) + +-- Test hypothetical indexes on hypothetical partitioning behavior +-- =============================================================== +-- Create Indexes +-- -------------- +SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range (id)'); + nb +---- + 1 +(1 row) + +SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range(id)'); + nb +---- + 1 +(1 row) + +-- Test on real tables +-- ------------------- +SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e +WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000'; + count +------- + 1 +(1 row) + +SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id > 28000') e +WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000'; + count +------- + 1 +(1 row) + +-- Test on hypothetical tables +-- --------------------------- +SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e +WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000'; + count +------- + 1 +(1 row) + +SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id > 28000') e +WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000'; + count +------- + 1 +(1 row) + diff --git a/test/sql/hypo_index_table.sql b/test/sql/hypo_index_table.sql new file mode 100644 index 0000000..49cb5e5 --- /dev/null +++ b/test/sql/hypo_index_table.sql @@ -0,0 +1,53 @@ +-- Creating real and hypothetical tables +-- ===================================== +-- Real tables +-- ------------ +-- 1. Range partitioning for hypothetical index +DROP TABLE IF EXISTS part_range; +CREATE TABLE part_range (id integer, val text) PARTITION BY RANGE (id); +CREATE TABLE part_range_1_10000 PARTITION OF part_range FOR VALUES FROM (1) TO (10000); +CREATE TABLE part_range_10000_20000 PARTITION OF part_range FOR VALUES FROM (10000) TO (20000); +CREATE TABLE part_range_20000_30000 PARTITION OF part_range FOR VALUES FROM (20000) TO (30000); +INSERT INTO part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i; + +-- Hypothetical tables +-- ------------------- +-- 0. Dropping any hypothetical object +SELECT * FROM hypopg_reset_index(); +SELECT * FROM hypopg_reset_table(); +-- 1. Range partitioning for hypothetical index +DROP TABLE IF EXISTS hypo_part_range; +CREATE TABLE hypo_part_range (id integer, val text); +INSERT INTO hypo_part_range SELECT i, 'line ' || i FROM generate_series(1, 29999) i; +SELECT * FROM hypopg_partition_table('hypo_part_range', 'PARTITION BY RANGE (id)'); +SELECT tablename FROM hypopg_add_partition('hypo_part_range_1_10000', 'PARTITION OF hypo_part_range FOR VALUES FROM (1) TO (10000)'); +SELECT tablename FROM hypopg_add_partition('hypo_part_range_10000_20000', 'PARTITION OF hypo_part_range FOR VALUES FROM (10000) TO (20000)'); +SELECT tablename FROM hypopg_add_partition('hypo_part_range_20000_30000', 'PARTITION OF hypo_part_range FOR VALUES FROM (20000) TO (30000)'); + +-- Maintenance +-- ----------- +VACUUM ANALYZE; +SELECT * FROM hypopg_analyze('hypo_part_range',100); + + +-- Test hypothetical indexes on hypothetical partitioning behavior +-- =============================================================== + +-- Create Indexes +-- -------------- +SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON part_range (id)'); +SELECT COUNT(*) AS nb FROM hypopg_create_index('CREATE INDEX ON hypo_part_range(id)'); + +-- Test on real tables +-- ------------------- +SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id = 42') e +WHERE e ~ 'Index.*<\d+>btree.*part_range_1_10000'; +SELECT COUNT(*) FROM do_explain ('SELECT * FROM part_range WHERE id > 28000') e +WHERE e ~ 'Index.*<\d+>btree.*part_range_20000_30000'; + +-- Test on hypothetical tables +-- --------------------------- +SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id = 42') e +WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_1_10000'; +SELECT COUNT(*) FROM do_explain ('SELECT * FROM hypo_part_range WHERE id > 28000') e +WHERE e ~ 'Index.*<\d+>btree.*hypo_part_range_20000_30000';