Add a hypopg_drop_table(oid) wrapper.

The underlying C function was already existing, I just forgot to add the
SQL wrapper.

The C function is modified to add an error if the function is called on
a non hypothetically partitioned table instead of silently doing
nothing, and add regression tests.
This commit is contained in:
Julien Rouhaud 2018-11-04 13:42:07 +01:00
parent efb1ac04f3
commit e9cbdb0645
4 changed files with 113 additions and 2 deletions

View file

@ -1411,7 +1411,7 @@ SELECT * FROM hypopg_reset();
(1 row)
DROP TABLE part_multi CASCADE;
DROP TABLE part_multi;
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
SELECT * FROM hypopg_partition_table('hypo_part_multi', 'PARTITION BY LIST (dpt)');
hypopg_partition_table
@ -1475,3 +1475,79 @@ EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
-> Seq Scan on hypo_part_multi hypo_part_multi_2_q1
(2 rows)
-- removing hypothetical partitions
-- ================================
CREATE TABLE part_multi_1_q1_b PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-02-01$$) TO ($$2015-04-01$$);
CREATE TABLE part_multi_1_q1_a PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$);
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_b', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-02-01$$) TO ($$2015-04-01$$)');
tablename
------------------------
hypo_part_multi_1_q1_b
(1 row)
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_a', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$)');
tablename
------------------------
hypo_part_multi_1_q1_a
(1 row)
DROP TABLE part_multi_1_q1_a;
SELECT hypopg_drop_table(relid) FROM hypopg_table() WHERE tablename = 'hypo_part_multi_1_q1_a';
hypopg_drop_table
-------------------
(1 row)
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
QUERY PLAN
-------------------------------------
Append
-> Seq Scan on part_multi_1_q1_b
-> Seq Scan on part_multi_2_q1
(3 rows)
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
QUERY PLAN
----------------------------------------------------------
Append
-> Seq Scan on hypo_part_multi hypo_part_multi_1_q1_b
-> Seq Scan on hypo_part_multi hypo_part_multi_2_q1
(3 rows)
DROP TABLE part_multi_1;
SELECT hypopg_drop_table(relid) FROM hypopg_table() WHERE tablename = 'hypo_part_multi_1';
hypopg_drop_table
-------------------
(1 row)
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
QUERY PLAN
-----------------------------------
Append
-> Seq Scan on part_multi_2_q1
(2 rows)
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
QUERY PLAN
--------------------------------------------------------
Append
-> Seq Scan on hypo_part_multi hypo_part_multi_2_q1
(2 rows)
SELECT hypopg_drop_table(relid) FROM hypopg_table() WHERE tablename = 'hypo_part_multi';
hypopg_drop_table
-------------------
(1 row)
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
QUERY PLAN
-----------------------------
Seq Scan on hypo_part_multi
(1 row)
SELECT hypopg_drop_table(oid) FROM pg_class WHERE relname = 'pg_class';
ERROR: hypopg: Oid 1259 is not a hypothetically partitioned table
SELECT hypopg_drop_table(1);
ERROR: hypopg: Oid 1 is not a hypothetically partitioned table

View file

@ -92,6 +92,11 @@ CREATE FUNCTION hypopg_reset_table()
LANGUAGE C VOLATILE COST 100
AS '$libdir/hypopg', 'hypopg_reset_table';
CREATE FUNCTION hypopg_drop_table(IN relid oid)
RETURNS void
LANGUAGE C VOLATILE COST 100
AS '$libdir/hypopg', 'hypopg_drop_table';
CREATE FUNCTION hypopg_table(OUT relid oid, OUT tablename text,
OUT parentid oid, OUT rootid oid,
OUT partition_by_clause text, OUT partition_bounds text)

View file

@ -3210,6 +3210,10 @@ HYPO_PARTITION_NOT_SUPPORTED();
/* Process any pending invalidation */
hypo_process_inval();
if (!hypo_table_oid_is_hypothetical(tableid))
elog(ERROR, "hypopg: Oid %d is not a hypothetically partitioned table",
tableid);
PG_RETURN_BOOL(hypo_table_remove(tableid, true));
#endif
}

View file

@ -266,7 +266,7 @@ EXPLAIN (COSTS OFF) WITH s AS (DELETE FROM foo USING part_range WHERE foo.id = p
-- childless partitioning
-- ======================
SELECT * FROM hypopg_reset();
DROP TABLE part_multi CASCADE;
DROP TABLE part_multi;
CREATE TABLE part_multi(dpt smallint, dt date, val text) PARTITION BY LIST (dpt);
SELECT * FROM hypopg_partition_table('hypo_part_multi', 'PARTITION BY LIST (dpt)');
@ -285,3 +285,29 @@ SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1', 'PARTITION OF
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
-- removing hypothetical partitions
-- ================================
CREATE TABLE part_multi_1_q1_b PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-02-01$$) TO ($$2015-04-01$$);
CREATE TABLE part_multi_1_q1_a PARTITION OF part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$);
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_b', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-02-01$$) TO ($$2015-04-01$$)');
SELECT tablename FROM hypopg_add_partition('hypo_part_multi_1_q1_a', 'PARTITION OF hypo_part_multi_1_q1 FOR VALUES FROM ($$2015-01-01$$) TO ($$2015-02-01$$)');
DROP TABLE part_multi_1_q1_a;
SELECT hypopg_drop_table(relid) FROM hypopg_table() WHERE tablename = 'hypo_part_multi_1_q1_a';
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
DROP TABLE part_multi_1;
SELECT hypopg_drop_table(relid) FROM hypopg_table() WHERE tablename = 'hypo_part_multi_1';
EXPLAIN (COSTS OFF) SELECT * FROM part_multi;
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
SELECT hypopg_drop_table(relid) FROM hypopg_table() WHERE tablename = 'hypo_part_multi';
EXPLAIN (COSTS OFF) SELECT * FROM hypo_part_multi;
SELECT hypopg_drop_table(oid) FROM pg_class WHERE relname = 'pg_class';
SELECT hypopg_drop_table(1);