Skip to content

Commit 92e46ac

Browse files
committed
introduce fixed function drop_partitions()
1 parent 32d7514 commit 92e46ac

File tree

4 files changed

+62
-95
lines changed

4 files changed

+62
-95
lines changed

hash.sql

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -66,48 +66,6 @@ BEGIN
6666
END
6767
$$ LANGUAGE plpgsql;
6868

69-
/*
70-
* Drops all partitions for specified relation
71-
*/
72-
CREATE OR REPLACE FUNCTION @extschema@.drop_hash_partitions(
73-
IN relation REGCLASS
74-
, delete_data BOOLEAN DEFAULT FALSE)
75-
RETURNS INTEGER AS
76-
$$
77-
DECLARE
78-
v_relname TEXT;
79-
v_rec RECORD;
80-
v_rows INTEGER;
81-
v_part_count INTEGER := 0;
82-
BEGIN
83-
v_relname := @extschema@.validate_relname(relation);
84-
85-
/* Drop trigger first */
86-
PERFORM @extschema@.drop_triggers(relation);
87-
DELETE FROM @extschema@.pathman_config WHERE relname::regclass = relation;
88-
89-
FOR v_rec in (SELECT inhrelid::regclass::text AS tbl
90-
FROM pg_inherits WHERE inhparent = relation::oid)
91-
LOOP
92-
IF NOT delete_data THEN
93-
EXECUTE format('WITH part_data AS (DELETE FROM %s RETURNING *)
94-
INSERT INTO %s SELECT * FROM part_data'
95-
, v_rec.tbl
96-
, relation::text);
97-
GET DIAGNOSTICS v_rows = ROW_COUNT;
98-
RAISE NOTICE '% rows copied from %', v_rows, v_rec.tbl;
99-
END IF;
100-
EXECUTE format('DROP TABLE %s', v_rec.tbl);
101-
v_part_count := v_part_count + 1;
102-
END LOOP;
103-
104-
/* Notify backend about changes */
105-
PERFORM @extschema@.on_remove_partitions(relation::oid);
106-
107-
RETURN v_part_count;
108-
END
109-
$$ LANGUAGE plpgsql;
110-
11169
/*
11270
* Creates an update trigger
11371
*/

init.sql

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,57 @@ BEGIN
352352
EXECUTE format('DROP FUNCTION IF EXISTS %s() CASCADE', funcname);
353353
END
354354
$$ LANGUAGE plpgsql;
355+
356+
/*
357+
* Drop partitions
358+
* If delete_data set to TRUE then partitions will be dropped with all the data
359+
*/
360+
CREATE OR REPLACE FUNCTION @extschema@.drop_partitions(
361+
relation REGCLASS
362+
, delete_data BOOLEAN DEFAULT FALSE)
363+
RETURNS INTEGER AS
364+
$$
365+
DECLARE
366+
v_rec RECORD;
367+
v_rows INTEGER;
368+
v_part_count INTEGER := 0;
369+
v_relname TEXT;
370+
conf_num_del INTEGER;
371+
BEGIN
372+
v_relname := @extschema@.validate_relname(relation);
373+
374+
/* Drop trigger first */
375+
PERFORM @extschema@.drop_triggers(relation);
376+
377+
WITH config_num_deleted AS (DELETE FROM @extschema@.pathman_config
378+
WHERE relname::regclass = relation
379+
RETURNING *)
380+
SELECT count(*) from config_num_deleted INTO conf_num_del;
381+
382+
IF conf_num_del = 0 THEN
383+
RAISE EXCEPTION 'table % has no partitions', relation::text;
384+
END IF;
385+
386+
FOR v_rec IN (SELECT inhrelid::regclass::text AS tbl
387+
FROM pg_inherits WHERE inhparent::regclass = relation)
388+
LOOP
389+
IF NOT delete_data THEN
390+
EXECUTE format('WITH part_data AS (DELETE FROM %s RETURNING *)
391+
INSERT INTO %s SELECT * FROM part_data'
392+
, v_rec.tbl
393+
, relation::text);
394+
GET DIAGNOSTICS v_rows = ROW_COUNT;
395+
RAISE NOTICE '% rows copied from %', v_rows, v_rec.tbl;
396+
END IF;
397+
EXECUTE format('DROP TABLE %s', v_rec.tbl);
398+
v_part_count := v_part_count + 1;
399+
END LOOP;
400+
401+
/* Notify backend about changes */
402+
PERFORM @extschema@.on_remove_partitions(relation::oid);
403+
404+
RETURN v_part_count;
405+
END
406+
$$ LANGUAGE plpgsql
407+
SET pg_pathman.enable_partitionfilter = off;
408+

range.sql

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,51 +1075,6 @@ BEGIN
10751075
END
10761076
$$ LANGUAGE plpgsql;
10771077

1078-
1079-
/*
1080-
* Drop partitions
1081-
* If delete_data set to TRUE then partitions will be dropped with all the data
1082-
*/
1083-
CREATE OR REPLACE FUNCTION @extschema@.drop_range_partitions(
1084-
relation REGCLASS
1085-
, delete_data BOOLEAN DEFAULT FALSE)
1086-
RETURNS INTEGER AS
1087-
$$
1088-
DECLARE
1089-
v_rec RECORD;
1090-
v_rows INTEGER;
1091-
v_part_count INTEGER := 0;
1092-
v_relname TEXT;
1093-
BEGIN
1094-
v_relname := @extschema@.validate_relname(relation);
1095-
1096-
/* Drop trigger first */
1097-
PERFORM @extschema@.drop_triggers(relation);
1098-
1099-
FOR v_rec IN (SELECT inhrelid::regclass::text AS tbl
1100-
FROM pg_inherits WHERE inhparent::regclass = relation)
1101-
LOOP
1102-
IF NOT delete_data THEN
1103-
EXECUTE format('WITH part_data AS (DELETE FROM %s RETURNING *)
1104-
INSERT INTO %s SELECT * FROM part_data'
1105-
, v_rec.tbl
1106-
, relation::text);
1107-
GET DIAGNOSTICS v_rows = ROW_COUNT;
1108-
RAISE NOTICE '% rows copied from %', v_rows, v_rec.tbl;
1109-
END IF;
1110-
EXECUTE format('DROP TABLE %s', v_rec.tbl);
1111-
v_part_count := v_part_count + 1;
1112-
END LOOP;
1113-
1114-
DELETE FROM @extschema@.pathman_config WHERE relname::regclass = relation;
1115-
1116-
/* Notify backend about changes */
1117-
PERFORM @extschema@.on_remove_partitions(relation::oid);
1118-
1119-
RETURN v_part_count;
1120-
END
1121-
$$ LANGUAGE plpgsql;
1122-
11231078
/*
11241079
* Internal function used to create new partitions on insert or update trigger.
11251080
* Invoked from C-function find_or_create_range_partition().

sql/pg_pathman.sql

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -396,14 +396,14 @@ SELECT * FROM test.hash_rel WHERE id = 123;
396396
/*
397397
* Clean up
398398
*/
399-
SELECT pathman.drop_hash_partitions('test.hash_rel');
399+
SELECT pathman.drop_partitions('test.hash_rel');
400400
SELECT COUNT(*) FROM ONLY test.hash_rel;
401401
SELECT pathman.create_hash_partitions('test.hash_rel', 'value', 3);
402-
SELECT pathman.drop_hash_partitions('test.hash_rel', TRUE);
402+
SELECT pathman.drop_partitions('test.hash_rel', TRUE);
403403
SELECT COUNT(*) FROM ONLY test.hash_rel;
404404
DROP TABLE test.hash_rel CASCADE;
405405

406-
SELECT pathman.drop_range_partitions('test.num_range_rel');
406+
SELECT pathman.drop_partitions('test.num_range_rel');
407407
DROP TABLE test.num_range_rel CASCADE;
408408

409409
DROP TABLE test.range_rel CASCADE;
@@ -453,7 +453,7 @@ UPDATE test."TeSt" SET a = 1;
453453
SELECT * FROM test."TeSt";
454454
SELECT * FROM test."TeSt" WHERE a = 1;
455455
EXPLAIN (COSTS OFF) SELECT * FROM test."TeSt" WHERE a = 1;
456-
SELECT pathman.drop_hash_partitions('test."TeSt"');
456+
SELECT pathman.drop_partitions('test."TeSt"');
457457
SELECT * FROM test."TeSt";
458458

459459
CREATE TABLE test."RangeRel" (
@@ -467,7 +467,7 @@ SELECT pathman.append_range_partition('test."RangeRel"');
467467
SELECT pathman.prepend_range_partition('test."RangeRel"');
468468
SELECT pathman.merge_range_partitions('test."RangeRel_1"', 'test."RangeRel_' || currval('test."RangeRel_seq"') || '"');
469469
SELECT pathman.split_range_partition('test."RangeRel_1"', '2015-01-01'::DATE);
470-
SELECT pathman.drop_range_partitions('test."RangeRel"');
470+
SELECT pathman.drop_partitions('test."RangeRel"');
471471
SELECT pathman.create_partitions_from_range('test."RangeRel"', 'dt', '2015-01-01'::DATE, '2015-01-05'::DATE, '1 day'::INTERVAL);
472472
DROP TABLE test."RangeRel" CASCADE;
473473
SELECT * FROM pathman.pathman_config;
@@ -476,7 +476,7 @@ CREATE TABLE test."RangeRel" (
476476
dt TIMESTAMP NOT NULL,
477477
txt TEXT);
478478
SELECT pathman.create_range_partitions('test."RangeRel"', 'id', 1, 100, 3);
479-
SELECT pathman.drop_range_partitions('test."RangeRel"');
479+
SELECT pathman.drop_partitions('test."RangeRel"');
480480
SELECT pathman.create_partitions_from_range('test."RangeRel"', 'id', 1, 300, 100);
481481
DROP TABLE test."RangeRel" CASCADE;
482482

@@ -524,9 +524,9 @@ EXPLAIN (COSTS OFF) DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02
524524
DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
525525

526526
/* Create range partitions from whole range */
527-
SELECT drop_range_partitions('range_rel');
527+
SELECT drop_partitions('range_rel');
528528
SELECT create_partitions_from_range('range_rel', 'id', 1, 1000, 100);
529-
SELECT drop_range_partitions('range_rel', TRUE);
529+
SELECT drop_partitions('range_rel', TRUE);
530530
SELECT create_partitions_from_range('range_rel', 'dt', '2015-01-01'::date, '2015-12-01'::date, '1 month'::interval);
531531
EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt = '2015-12-15';
532532

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy