Skip to content

Commit e8a47aa

Browse files
committed
resolve conflicts caused by a merge of 'callbacks'
2 parents 68bac64 + b84a0a5 commit e8a47aa

File tree

13 files changed

+837
-334
lines changed

13 files changed

+837
-334
lines changed

expected/pg_pathman.out

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ SELECT * FROM test.hash_rel;
3535
3 | 3
3636
(3 rows)
3737

38-
SELECT pathman.disable_parent('test.hash_rel');
39-
disable_parent
40-
----------------
38+
SELECT pathman.set_enable_parent('test.hash_rel', false);
39+
set_enable_parent
40+
-------------------
4141

4242
(1 row)
4343

@@ -55,9 +55,9 @@ SELECT * FROM test.hash_rel;
5555
----+-------
5656
(0 rows)
5757

58-
SELECT pathman.enable_parent('test.hash_rel');
59-
enable_parent
60-
---------------
58+
SELECT pathman.set_enable_parent('test.hash_rel', true);
59+
set_enable_parent
60+
-------------------
6161

6262
(1 row)
6363

@@ -1260,17 +1260,17 @@ SELECT * FROM test.range_rel WHERE dt = '2015-03-15';
12601260
74 | Sun Mar 15 00:00:00 2015
12611261
(1 row)
12621262

1263-
SELECT pathman.disable_auto('test.range_rel');
1264-
disable_auto
1265-
--------------
1263+
SELECT pathman.set_auto('test.range_rel', false);
1264+
set_auto
1265+
----------
12661266

12671267
(1 row)
12681268

12691269
INSERT INTO test.range_rel (dt) VALUES ('2015-06-01');
12701270
ERROR: no suitable partition for key 'Mon Jun 01 00:00:00 2015'
1271-
SELECT pathman.enable_auto('test.range_rel');
1272-
enable_auto
1273-
-------------
1271+
SELECT pathman.set_auto('test.range_rel', true);
1272+
set_auto
1273+
----------
12741274

12751275
(1 row)
12761276

@@ -1768,3 +1768,58 @@ NOTICE: 100 rows copied from test_fkey_0
17681768
10
17691769
(1 row)
17701770

1771+
/* Check callbacks */
1772+
CREATE TABLE log(id serial, message text);
1773+
CREATE OR REPLACE FUNCTION abc_on_partition_created_callback(args JSONB)
1774+
RETURNS VOID AS $$
1775+
DECLARE
1776+
start_value TEXT := args->>'start';
1777+
end_value TEXT := args->'end';
1778+
BEGIN
1779+
INSERT INTO log(message)
1780+
VALUES (start_value || '-' || end_value);
1781+
END
1782+
$$ language plpgsql;
1783+
CREATE TABLE abc(a serial, b int);
1784+
SELECT create_range_partitions('abc', 'a', 1, 100, 2);
1785+
NOTICE: sequence "abc_seq" does not exist, skipping
1786+
create_range_partitions
1787+
-------------------------
1788+
2
1789+
(1 row)
1790+
1791+
SELECT set_part_init_callback('abc', 'abc_on_partition_created_callback');
1792+
set_part_init_callback
1793+
------------------------
1794+
1795+
(1 row)
1796+
1797+
INSERT INTO abc VALUES (123, 1);
1798+
INSERT INTO abc VALUES (223, 1);
1799+
SELECT append_range_partition('abc');
1800+
append_range_partition
1801+
------------------------
1802+
public.abc_4
1803+
(1 row)
1804+
1805+
SELECT prepend_range_partition('abc');
1806+
prepend_range_partition
1807+
-------------------------
1808+
public.abc_5
1809+
(1 row)
1810+
1811+
SELECT add_range_partition('abc', 401, 501);
1812+
add_range_partition
1813+
---------------------
1814+
public.abc_6
1815+
(1 row)
1816+
1817+
SELECT message FROM log ORDER BY id;
1818+
message
1819+
-----------
1820+
201-"301"
1821+
301-"401"
1822+
-99-"1"
1823+
401-"501"
1824+
(4 rows)
1825+

hash.sql

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ DECLARE
2424
v_plain_relname TEXT;
2525
v_atttype REGTYPE;
2626
v_hashfunc REGPROC;
27+
v_init_callback REGPROCEDURE;
2728

2829
BEGIN
2930
IF partition_data = true THEN
@@ -56,9 +57,11 @@ BEGIN
5657
quote_ident(v_plain_schema),
5758
quote_ident(v_plain_relname || '_' || partnum));
5859

59-
EXECUTE format('CREATE TABLE %1$s (LIKE %2$s INCLUDING ALL) INHERITS (%2$s)',
60-
v_child_relname,
61-
parent_relid::TEXT);
60+
EXECUTE format(
61+
'CREATE TABLE %1$s (LIKE %2$s INCLUDING ALL) INHERITS (%2$s) TABLESPACE %s',
62+
v_child_relname,
63+
parent_relid::TEXT,
64+
@extschema@.get_rel_tablespace_name(parent_relid));
6265

6366
EXECUTE format('ALTER TABLE %s ADD CONSTRAINT %s
6467
CHECK (@extschema@.get_hash_part_idx(%s(%s), %s) = %s)',
@@ -71,17 +74,29 @@ BEGIN
7174
partnum);
7275

7376
PERFORM @extschema@.copy_foreign_keys(parent_relid, v_child_relname::REGCLASS);
77+
78+
/* Fetch init_callback from 'params' table */
79+
WITH stub_callback(stub) as (values (0))
80+
SELECT coalesce(init_callback, 0::REGPROCEDURE)
81+
FROM stub_callback
82+
LEFT JOIN @extschema@.pathman_config_params AS params
83+
ON params.partrel = parent_relid
84+
INTO v_init_callback;
85+
86+
PERFORM @extschema@.invoke_on_partition_created_callback(parent_relid,
87+
v_child_relname::REGCLASS,
88+
v_init_callback);
7489
END LOOP;
7590

7691
/* Notify backend about changes */
7792
PERFORM @extschema@.on_create_partitions(parent_relid);
7893

7994
/* Copy data */
8095
IF partition_data = true THEN
81-
PERFORM @extschema@.disable_parent(parent_relid);
96+
PERFORM @extschema@.set_enable_parent(parent_relid, false);
8297
PERFORM @extschema@.partition_data(parent_relid);
8398
ELSE
84-
PERFORM @extschema@.enable_parent(parent_relid);
99+
PERFORM @extschema@.set_enable_parent(parent_relid, true);
85100
END IF;
86101

87102
RETURN partitions_count;
@@ -138,7 +153,6 @@ DECLARE
138153
funcname TEXT;
139154
triggername TEXT;
140155
atttype REGTYPE;
141-
hashfunc TEXT;
142156
partitions_count INTEGER;
143157

144158
BEGIN

init.sql

Lines changed: 68 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ CREATE TABLE IF NOT EXISTS @extschema@.pathman_config (
3131
* partrel - regclass (relation type, stored as Oid)
3232
* enable_parent - add parent table to plan
3333
* auto - enable automatic partition creation
34+
* init_callback - cb to be executed on partition creation
3435
*/
3536
CREATE TABLE IF NOT EXISTS @extschema@.pathman_config_params (
3637
partrel REGCLASS NOT NULL PRIMARY KEY,
3738
enable_parent BOOLEAN NOT NULL DEFAULT TRUE,
38-
auto BOOLEAN NOT NULL DEFAULT TRUE
39+
auto BOOLEAN NOT NULL DEFAULT TRUE,
40+
init_callback REGPROCEDURE NOT NULL DEFAULT 0
3941
);
4042
CREATE UNIQUE INDEX i_pathman_config_params
4143
ON @extschema@.pathman_config_params(partrel);
@@ -85,15 +87,15 @@ BEGIN
8587
RETURN count(*) FROM pg_inherits WHERE inhparent = relation;
8688
END
8789
$$
88-
LANGUAGE plpgsql;
90+
LANGUAGE plpgsql STRICT;
8991

9092
/*
9193
* Add a row describing the optional parameter to pathman_config_params.
9294
*/
9395
CREATE OR REPLACE FUNCTION @extschema@.pathman_set_param(
9496
relation REGCLASS,
9597
param TEXT,
96-
value BOOLEAN)
98+
value ANYELEMENT)
9799
RETURNS VOID AS
98100
$$
99101
BEGIN
@@ -106,49 +108,44 @@ $$
106108
LANGUAGE plpgsql;
107109

108110
/*
109-
* Include parent relation into query plan's for specified relation.
110-
*/
111-
CREATE OR REPLACE FUNCTION @extschema@.enable_parent(relation REGCLASS)
112-
RETURNS VOID AS
113-
$$
114-
BEGIN
115-
PERFORM @extschema@.pathman_set_param(relation, 'enable_parent', True);
116-
END
117-
$$
118-
LANGUAGE plpgsql;
119-
120-
/*
121-
* Do not include parent relation into query plan's for specified relation.
111+
* Include\exclude parent relation in query plan.
122112
*/
123-
CREATE OR REPLACE FUNCTION @extschema@.disable_parent(relation REGCLASS)
113+
CREATE OR REPLACE FUNCTION @extschema@.set_enable_parent(
114+
relation REGCLASS,
115+
value BOOLEAN)
124116
RETURNS VOID AS
125117
$$
126118
BEGIN
127-
PERFORM @extschema@.pathman_set_param(relation, 'enable_parent', False);
119+
PERFORM @extschema@.pathman_set_param(relation, 'enable_parent', value);
128120
END
129121
$$
130-
LANGUAGE plpgsql;
122+
LANGUAGE plpgsql STRICT;
131123

132124
/*
133-
* Enable automatic partition creation.
125+
* Enable\disable automatic partition creation.
134126
*/
135-
CREATE OR REPLACE FUNCTION @extschema@.enable_auto(relation REGCLASS)
127+
CREATE OR REPLACE FUNCTION @extschema@.set_auto(
128+
relation REGCLASS,
129+
value BOOLEAN)
136130
RETURNS VOID AS
137131
$$
138132
BEGIN
139-
PERFORM @extschema@.pathman_set_param(relation, 'auto', True);
133+
PERFORM @extschema@.pathman_set_param(relation, 'auto', value);
140134
END
141135
$$
142-
LANGUAGE plpgsql;
136+
LANGUAGE plpgsql STRICT;
143137

144138
/*
145-
* Disable automatic partition creation.
139+
* Set partition creation callback
146140
*/
147-
CREATE OR REPLACE FUNCTION @extschema@.disable_auto(relation REGCLASS)
141+
CREATE OR REPLACE FUNCTION @extschema@.set_part_init_callback(
142+
relation REGCLASS,
143+
callback REGPROC)
148144
RETURNS VOID AS
149145
$$
150146
BEGIN
151-
PERFORM @extschema@.pathman_set_param(relation, 'auto', False);
147+
PERFORM @extschema@.validate_on_partition_created_callback(callback);
148+
PERFORM @extschema@.pathman_set_param(relation, 'init_callback', callback);
152149
END
153150
$$
154151
LANGUAGE plpgsql;
@@ -201,6 +198,7 @@ DECLARE
201198
v_limit_clause TEXT := '';
202199
v_where_clause TEXT := '';
203200
ctids TID[];
201+
204202
BEGIN
205203
SELECT attname INTO v_attr
206204
FROM @extschema@.pathman_config WHERE partrel = p_relation;
@@ -276,7 +274,7 @@ BEGIN
276274
RETURN;
277275
END
278276
$$
279-
LANGUAGE plpgsql
277+
LANGUAGE plpgsql STRICT
280278
SET pg_pathman.enable_partitionfilter = on; /* ensures that PartitionFilter is ON */
281279

282280
/*
@@ -296,7 +294,7 @@ BEGIN
296294
PERFORM @extschema@.on_remove_partitions(parent_relid);
297295
END
298296
$$
299-
LANGUAGE plpgsql;
297+
LANGUAGE plpgsql STRICT;
300298

301299
/*
302300
* Aggregates several common relation checks before partitioning.
@@ -365,7 +363,7 @@ BEGIN
365363
INTO schema, relname;
366364
END
367365
$$
368-
LANGUAGE plpgsql;
366+
LANGUAGE plpgsql STRICT;
369367

370368
/*
371369
* Returns schema-qualified name for table
@@ -384,7 +382,7 @@ BEGIN
384382
WHERE oid = cls::oid);
385383
END
386384
$$
387-
LANGUAGE plpgsql;
385+
LANGUAGE plpgsql STRICT;
388386

389387
/*
390388
* Validates relation name. It must be schema qualified
@@ -484,7 +482,7 @@ BEGIN
484482
EXECUTE format('DROP FUNCTION IF EXISTS %s() CASCADE',
485483
@extschema@.build_update_trigger_func_name(parent_relid));
486484
END
487-
$$ LANGUAGE plpgsql;
485+
$$ LANGUAGE plpgsql STRICT;
488486

489487
/*
490488
* Drop partitions
@@ -569,7 +567,7 @@ BEGIN
569567
pg_get_constraintdef(rec.conid));
570568
END LOOP;
571569
END
572-
$$ LANGUAGE plpgsql;
570+
$$ LANGUAGE plpgsql STRICT;
573571

574572

575573
/*
@@ -703,3 +701,41 @@ LANGUAGE C STRICT;
703701
CREATE OR REPLACE FUNCTION @extschema@.debug_capture()
704702
RETURNS VOID AS 'pg_pathman', 'debug_capture'
705703
LANGUAGE C STRICT;
704+
705+
/*
706+
* Return tablespace name for specified relation.
707+
*/
708+
CREATE OR REPLACE FUNCTION @extschema@.get_rel_tablespace_name(relation REGCLASS)
709+
RETURNS TEXT AS 'pg_pathman', 'get_rel_tablespace_name'
710+
LANGUAGE C STRICT;
711+
712+
/*
713+
* Checks that callback function meets specific requirements. Particularly it
714+
* must have the only JSONB argument and VOID return type.
715+
*/
716+
CREATE OR REPLACE FUNCTION @extschema@.validate_on_partition_created_callback(callback REGPROC)
717+
RETURNS VOID AS 'pg_pathman', 'validate_on_part_init_callback_pl'
718+
LANGUAGE C STRICT;
719+
720+
721+
/*
722+
* Invoke init_callback on RANGE partition.
723+
*/
724+
CREATE OR REPLACE FUNCTION @extschema@.invoke_on_partition_created_callback(
725+
parent_relid REGCLASS,
726+
partition REGCLASS,
727+
init_callback REGPROCEDURE,
728+
start_value ANYELEMENT,
729+
end_value ANYELEMENT)
730+
RETURNS VOID AS 'pg_pathman', 'invoke_on_partition_created_callback'
731+
LANGUAGE C;
732+
733+
/*
734+
* Invoke init_callback on HASH partition.
735+
*/
736+
CREATE OR REPLACE FUNCTION @extschema@.invoke_on_partition_created_callback(
737+
parent_relid REGCLASS,
738+
partition REGCLASS,
739+
init_callback REGPROCEDURE)
740+
RETURNS VOID AS 'pg_pathman', 'invoke_on_partition_created_callback'
741+
LANGUAGE C;

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