Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitecec006

Browse files
committed
auto trigger creation for partitions
1 parente0d3fe0 commitecec006

File tree

7 files changed

+175
-96
lines changed

7 files changed

+175
-96
lines changed

‎expected/pathman_basic.out

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,7 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.range_rel WHERE dt BETWEEN '2014-11-15' A
13211321
(6 rows)
13221322

13231323
SELECT pathman.detach_range_partition('test.range_rel_archive');
1324+
NOTICE: trigger "range_rel_upd_trig" for relation "test.range_rel_archive" does not exist, skipping
13241325
detach_range_partition
13251326
------------------------
13261327
test.range_rel_archive
@@ -1734,6 +1735,7 @@ SELECT * FROM test."TeSt";
17341735
1 | 1
17351736
(3 rows)
17361737

1738+
DROP TABLE test."TeSt" CASCADE;
17371739
CREATE TABLE test."RangeRel" (
17381740
idSERIAL PRIMARY KEY,
17391741
dtTIMESTAMP NOT NULL,
@@ -2189,6 +2191,6 @@ ORDER BY partition;
21892191
DROP TABLE test.provided_part_names CASCADE;
21902192
NOTICE: drop cascades to 2 other objects
21912193
DROP SCHEMA test CASCADE;
2192-
NOTICE: drop cascades to49 other objects
2194+
NOTICE: drop cascades to48 other objects
21932195
DROP EXTENSION pg_pathman CASCADE;
21942196
DROP SCHEMA pathman CASCADE;

‎init.sql

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,17 @@ LANGUAGE C;
562562
*/
563563
CREATEOR REPLACE FUNCTION @extschema@.create_update_triggers(parent_relid REGCLASS)
564564
RETURNS VOIDAS'pg_pathman','create_update_triggers'
565-
LANGUAGE C;
565+
LANGUAGE C STRICT;
566+
567+
CREATEOR REPLACE FUNCTION @extschema@.create_single_update_trigger(
568+
parent_relidREGCLASS,
569+
partition_relidREGCLASS)
570+
RETURNS VOIDAS'pg_pathman','create_single_update_trigger'
571+
LANGUAGE C STRICT;
572+
573+
CREATEOR REPLACE FUNCTION @extschema@.is_update_trigger_enabled(parent_relid REGCLASS)
574+
RETURNS BOOLAS'pg_pathman','is_update_trigger_enabled'
575+
LANGUAGE C STRICT;
566576

567577
/*
568578
* Drop triggers
@@ -580,13 +590,22 @@ BEGIN
580590

581591
/* Drop trigger for each partition if exists*/
582592
FOR recIN (SELECTpg_catalog.pg_inherits.*FROMpg_catalog.pg_inherits
583-
JOINpg_catalog.pg_triggeron inhrelid= tgrelid
593+
JOINpg_catalog.pg_triggerON inhrelid= tgrelid
584594
WHERE inhparent= parent_relidAND tgname= triggername)
585595
LOOP
586596
EXECUTE format('DROP TRIGGER IF EXISTS %s ON %s',
587597
triggername,
588598
rec.inhrelid::REGCLASS::TEXT);
589599
END LOOP;
600+
601+
/* Drop trigger on parent*/
602+
IF EXISTS (SELECT*FROMpg_catalog.pg_trigger
603+
WHERE tgname= triggernameAND tgrelid= parent_relid)
604+
THEN
605+
EXECUTE format('DROP TRIGGER IF EXISTS %s ON %s',
606+
triggername,
607+
parent_relid::TEXT);
608+
END IF;
590609
END
591610
$$ LANGUAGE plpgsql STRICT;
592611

‎range.sql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,12 @@ BEGIN
935935
ONparams.partrel= parent_relid
936936
INTO v_init_callback;
937937

938+
/* If update trigger is enabled then create one for this partition*/
939+
if @extschema@.is_update_trigger_enabled(parent_relid) THEN
940+
PERFORM @extschema@.create_single_update_trigger(parent_relid, partition_relid);
941+
END IF;
942+
943+
/* Invoke an initialization callback*/
938944
PERFORM @extschema@.invoke_on_partition_created_callback(parent_relid,
939945
partition_relid,
940946
v_init_callback,
@@ -984,6 +990,11 @@ BEGIN
984990
partition_relid::TEXT,
985991
@extschema@.build_check_constraint_name(partition_relid, v_attname));
986992

993+
/* Remove update trigger*/
994+
EXECUTE format('DROP TRIGGER IF EXISTS %s ON %s',
995+
@extschema@.build_update_trigger_name(parent_relid),
996+
partition_relid::TEXT);
997+
987998
/* Invalidate cache*/
988999
PERFORM @extschema@.on_update_partitions(parent_relid);
9891000

‎sql/pathman_basic.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ SELECT * FROM test."TeSt" WHERE a = 1;
471471
EXPLAIN (COSTS OFF)SELECT*FROM test."TeSt"WHERE a=1;
472472
SELECTpathman.drop_partitions('test."TeSt"');
473473
SELECT*FROM test."TeSt";
474+
DROPTABLE test."TeSt" CASCADE;
474475

475476
CREATETABLEtest."RangeRel" (
476477
idSERIALPRIMARY KEY,

‎src/partition_creation.c

Lines changed: 114 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
#include"catalog/heap.h"
2323
#include"catalog/pg_authid.h"
2424
#include"catalog/pg_proc.h"
25+
#include"catalog/pg_trigger.h"
2526
#include"catalog/pg_type.h"
2627
#include"catalog/toasting.h"
2728
#include"commands/event_trigger.h"
2829
#include"commands/sequence.h"
2930
#include"commands/tablecmds.h"
3031
#include"commands/tablespace.h"
32+
#include"commands/trigger.h"
3133
#include"miscadmin.h"
3234
#include"parser/parse_func.h"
3335
#include"parser/parse_relation.h"
@@ -52,9 +54,11 @@ static Oid spawn_partitions_val(Oid parent_relid,
5254
Datumvalue,
5355
Oidvalue_type);
5456

55-
staticvoidcreate_single_partition_common(Oidpartition_relid,
57+
staticvoidcreate_single_partition_common(Oidparent_relid,
58+
Oidpartition_relid,
5659
Constraint*check_constraint,
57-
init_callback_params*callback_params);
60+
init_callback_params*callback_params,
61+
constchar*attname);
5862

5963
staticOidcreate_single_partition_internal(Oidparent_relid,
6064
RangeVar*partition_rv,
@@ -77,6 +81,8 @@ static Constraint *make_constraint_common(char *name, Node *raw_expr);
7781
staticValuemake_string_value_struct(char*str);
7882
staticValuemake_int_value_struct(intint_val);
7983

84+
staticboolupdate_trigger_exists(Oidrelid,char*trigname);
85+
8086

8187
/*
8288
* ---------------------------------------
@@ -130,9 +136,11 @@ create_single_range_partition_internal(Oid parent_relid,
130136
*start_value,*end_value,value_type);
131137

132138
/* Add constraint & execute init_callback */
133-
create_single_partition_common(partition_relid,
139+
create_single_partition_common(parent_relid,
140+
partition_relid,
134141
check_constr,
135-
&callback_params);
142+
&callback_params,
143+
partitioned_column);
136144

137145
/* Return the Oid */
138146
returnpartition_relid;
@@ -183,21 +191,25 @@ create_single_hash_partition_internal(Oid parent_relid,
183191
parent_relid,partition_relid);
184192

185193
/* Add constraint & execute init_callback */
186-
create_single_partition_common(partition_relid,
194+
create_single_partition_common(parent_relid,
195+
partition_relid,
187196
check_constr,
188-
&callback_params);
197+
&callback_params,
198+
partitioned_column);
189199

190200
/* Return the Oid */
191201
returnpartition_relid;
192202
}
193203

194204
/* Add constraint & execute init_callback */
195205
void
196-
create_single_partition_common(Oidpartition_relid,
206+
create_single_partition_common(Oidparent_relid,
207+
Oidpartition_relid,
197208
Constraint*check_constraint,
198-
init_callback_params*callback_params)
209+
init_callback_params*callback_params,
210+
constchar*attname)
199211
{
200-
Relationchild_relation;
212+
Relationchild_relation;
201213

202214
/* Open the relation and add new check constraint & fkeys */
203215
child_relation=heap_open(partition_relid,AccessExclusiveLock);
@@ -209,6 +221,20 @@ create_single_partition_common(Oid partition_relid,
209221
/* Make constraint visible */
210222
CommandCounterIncrement();
211223

224+
/* Create trigger */
225+
if (is_update_trigger_enabled_internal(parent_relid))
226+
{
227+
char*trigname;
228+
229+
trigname=build_update_trigger_name_internal(parent_relid);
230+
create_single_update_trigger_internal(partition_relid,
231+
trigname,
232+
attname);
233+
}
234+
235+
/* Make trigger visible */
236+
CommandCounterIncrement();
237+
212238
/* Finally invoke 'init_callback' */
213239
invoke_part_callback(callback_params);
214240

@@ -1649,3 +1675,82 @@ text_to_regprocedure(text *proc_signature)
16491675

16501676
returnDatumGetObjectId(result);
16511677
}
1678+
1679+
/*
1680+
* Create trigger for partition
1681+
*/
1682+
void
1683+
create_single_update_trigger_internal(Oidrelid,
1684+
constchar*trigname,
1685+
constchar*attname)
1686+
{
1687+
CreateTrigStmt*stmt;
1688+
List*func;
1689+
1690+
func=list_make2(makeString(get_namespace_name(get_pathman_schema())),
1691+
makeString("update_trigger_func"));
1692+
1693+
stmt=makeNode(CreateTrigStmt);
1694+
stmt->trigname= (char*)trigname;
1695+
stmt->relation=makeRangeVarFromRelid(relid);
1696+
stmt->funcname=func;
1697+
stmt->args=NIL;
1698+
stmt->row= true;
1699+
stmt->timing=TRIGGER_TYPE_BEFORE;
1700+
stmt->events=TRIGGER_TYPE_UPDATE;
1701+
stmt->columns=list_make1(makeString((char*)attname));
1702+
stmt->whenClause=NULL;
1703+
stmt->isconstraint= false;
1704+
stmt->deferrable= false;
1705+
stmt->initdeferred= false;
1706+
stmt->constrrel=NULL;
1707+
1708+
(void)CreateTrigger(stmt,NULL,InvalidOid,InvalidOid,
1709+
InvalidOid,InvalidOid, false);
1710+
}
1711+
1712+
/*
1713+
* Check if update trigger is enabled. Basicly it returns true if update
1714+
* trigger exists for parent table
1715+
*/
1716+
bool
1717+
is_update_trigger_enabled_internal(Oidparent)
1718+
{
1719+
char*trigname;
1720+
1721+
trigname=build_update_trigger_name_internal(parent);
1722+
returnupdate_trigger_exists(parent,trigname);
1723+
}
1724+
1725+
staticbool
1726+
update_trigger_exists(Oidrelid,char*trigname)
1727+
{
1728+
boolres= false;
1729+
Relationtgrel;
1730+
SysScanDesctgscan;
1731+
ScanKeyDatakey;
1732+
HeapTupletuple;
1733+
1734+
tgrel=heap_open(TriggerRelationId,RowExclusiveLock);
1735+
1736+
ScanKeyInit(&key,
1737+
Anum_pg_trigger_tgrelid,
1738+
BTEqualStrategyNumber,F_OIDEQ,
1739+
ObjectIdGetDatum(relid));
1740+
tgscan=systable_beginscan(tgrel,TriggerRelidNameIndexId, true,
1741+
NULL,1,&key);
1742+
while (HeapTupleIsValid(tuple=systable_getnext(tgscan)))
1743+
{
1744+
Form_pg_triggerpg_trigger= (Form_pg_trigger)GETSTRUCT(tuple);
1745+
1746+
if (namestrcmp(&(pg_trigger->tgname),trigname)==0)
1747+
{
1748+
res= true;
1749+
break;
1750+
}
1751+
}
1752+
systable_endscan(tgscan);
1753+
heap_close(tgrel,RowExclusiveLock);
1754+
1755+
returnres;
1756+
}

‎src/partition_creation.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ Node * build_raw_hash_check_tree(char *attname,
7777

7878
voiddrop_check_constraint(Oidrelid,AttrNumberattnum);
7979

80+
/* Update triggers */
81+
voidcreate_single_update_trigger_internal(Oidrelid,
82+
constchar*trigname,
83+
constchar*attname);
84+
boolis_update_trigger_enabled_internal(Oidparent);
85+
8086

8187
/* Partitioning callback type */
8288
typedefenum

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp