Skip to content

Commit fda1b36

Browse files
committed
rename auto naming constraint if parent is renamed, take AccessShareLock on naming sequence when choosing a name for partition
1 parent 55e6dfd commit fda1b36

10 files changed

+216
-49
lines changed

expected/pathman_utility_stmt.out

+56-2
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,58 @@ NOTICE: drop cascades to 797 other objects
285285
* Test auto check constraint renaming
286286
*/
287287
CREATE SCHEMA rename;
288+
/*
289+
* Check that auto naming sequence is renamed
290+
*/
291+
CREATE TABLE rename.parent(id int not null);
292+
SELECT create_range_partitions('rename.parent', 'id', 1, 2, 2);
293+
create_range_partitions
294+
-------------------------
295+
2
296+
(1 row)
297+
298+
SELECT 'rename.parent'::regclass; /* parent is OK */
299+
regclass
300+
---------------
301+
rename.parent
302+
(1 row)
303+
304+
SELECT 'rename.parent_seq'::regclass; /* sequence is OK */
305+
regclass
306+
-------------------
307+
rename.parent_seq
308+
(1 row)
309+
310+
ALTER TABLE rename.parent RENAME TO parent_renamed;
311+
SELECT 'rename.parent_renamed'::regclass; /* parent is OK */
312+
regclass
313+
-----------------------
314+
rename.parent_renamed
315+
(1 row)
316+
317+
SELECT 'rename.parent_renamed_seq'::regclass; /* sequence is OK */
318+
regclass
319+
---------------------------
320+
rename.parent_renamed_seq
321+
(1 row)
322+
323+
SELECT append_range_partition('rename.parent_renamed'); /* can append */
324+
append_range_partition
325+
-------------------------
326+
rename.parent_renamed_3
327+
(1 row)
328+
329+
DROP SEQUENCE rename.parent_renamed_seq;
330+
ALTER TABLE rename.parent_renamed RENAME TO parent;
331+
SELECT 'rename.parent'::regclass; /* parent is OK */
332+
regclass
333+
---------------
334+
rename.parent
335+
(1 row)
336+
337+
/*
338+
* Check that partitioning constraints are renamed
339+
*/
288340
CREATE TABLE rename.test(a serial, b int);
289341
SELECT create_hash_partitions('rename.test', 'a', 3);
290342
create_hash_partitions
@@ -336,7 +388,9 @@ WHERE r.conrelid = 'rename.test_inh_one'::regclass AND r.contype = 'c';
336388
pathman_test_inh_1_check | CHECK (a < 100)
337389
(1 row)
338390

339-
/* Check that plain tables are not affected too */
391+
/*
392+
* Check that plain tables are not affected too
393+
*/
340394
CREATE TABLE rename.plain_test(a serial, b int);
341395
ALTER TABLE rename.plain_test RENAME TO plain_test_renamed;
342396
SELECT add_constraint('rename.plain_test_renamed');
@@ -365,7 +419,7 @@ WHERE r.conrelid = 'rename.plain_test'::regclass AND r.contype = 'c';
365419
(1 row)
366420

367421
DROP SCHEMA rename CASCADE;
368-
NOTICE: drop cascades to 7 other objects
422+
NOTICE: drop cascades to 11 other objects
369423
/*
370424
* Test DROP INDEX CONCURRENTLY (test snapshots)
371425
*/

sql/pathman_utility_stmt.sql

+23-1
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,25 @@ DROP SCHEMA copy_stmt_hooking CASCADE;
167167
*/
168168
CREATE SCHEMA rename;
169169

170+
171+
/*
172+
* Check that auto naming sequence is renamed
173+
*/
174+
CREATE TABLE rename.parent(id int not null);
175+
SELECT create_range_partitions('rename.parent', 'id', 1, 2, 2);
176+
SELECT 'rename.parent'::regclass; /* parent is OK */
177+
SELECT 'rename.parent_seq'::regclass; /* sequence is OK */
178+
ALTER TABLE rename.parent RENAME TO parent_renamed;
179+
SELECT 'rename.parent_renamed'::regclass; /* parent is OK */
180+
SELECT 'rename.parent_renamed_seq'::regclass; /* sequence is OK */
181+
SELECT append_range_partition('rename.parent_renamed'); /* can append */
182+
DROP SEQUENCE rename.parent_renamed_seq;
183+
ALTER TABLE rename.parent_renamed RENAME TO parent;
184+
SELECT 'rename.parent'::regclass; /* parent is OK */
185+
186+
/*
187+
* Check that partitioning constraints are renamed
188+
*/
170189
CREATE TABLE rename.test(a serial, b int);
171190
SELECT create_hash_partitions('rename.test', 'a', 3);
172191
ALTER TABLE rename.test_0 RENAME TO test_one;
@@ -201,7 +220,9 @@ SELECT r.conname, pg_get_constraintdef(r.oid, true)
201220
FROM pg_constraint r
202221
WHERE r.conrelid = 'rename.test_inh_one'::regclass AND r.contype = 'c';
203222

204-
/* Check that plain tables are not affected too */
223+
/*
224+
* Check that plain tables are not affected too
225+
*/
205226
CREATE TABLE rename.plain_test(a serial, b int);
206227
ALTER TABLE rename.plain_test RENAME TO plain_test_renamed;
207228
SELECT add_constraint('rename.plain_test_renamed');
@@ -216,6 +237,7 @@ SELECT r.conname, pg_get_constraintdef(r.oid, true)
216237
FROM pg_constraint r
217238
WHERE r.conrelid = 'rename.plain_test'::regclass AND r.contype = 'c';
218239

240+
219241
DROP SCHEMA rename CASCADE;
220242

221243

src/hooks.c

+9-3
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,7 @@ pathman_process_utility_hook(Node *first_arg,
874874
Oid relation_oid;
875875
PartType part_type;
876876
AttrNumber attr_number;
877+
bool is_parent;
877878

878879
/* Override standard COPY statement if needed */
879880
if (is_pathman_related_copy(parsetree))
@@ -892,10 +893,15 @@ pathman_process_utility_hook(Node *first_arg,
892893

893894
/* Override standard RENAME statement if needed */
894895
else if (is_pathman_related_table_rename(parsetree,
895-
&relation_oid))
896+
&relation_oid,
897+
&is_parent))
896898
{
897-
PathmanRenameConstraint(relation_oid,
898-
(const RenameStmt *) parsetree);
899+
const RenameStmt *rename_stmt = (const RenameStmt *) parsetree;
900+
901+
if (is_parent)
902+
PathmanRenameSequence(relation_oid, rename_stmt);
903+
else
904+
PathmanRenameConstraint(relation_oid, rename_stmt);
899905
}
900906

901907
/* Override standard ALTER COLUMN TYPE statement if needed */

src/include/init.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ find_children_status find_inheritance_children_array(Oid parentrelId,
201201
char *build_check_constraint_name_relid_internal(Oid relid);
202202
char *build_check_constraint_name_relname_internal(const char *relname);
203203

204-
char *build_sequence_name_internal(Oid relid);
204+
char *build_sequence_name_relid_internal(Oid relid);
205+
char *build_sequence_name_relname_internal(const char *relname);
205206

206207
char *build_update_trigger_name_internal(Oid relid);
207208
char *build_update_trigger_func_name_internal(Oid relid);

src/include/utility_stmt_hooking.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
/* Various traits */
2424
bool is_pathman_related_copy(Node *parsetree);
2525
bool is_pathman_related_table_rename(Node *parsetree,
26-
Oid *partition_relid_out);
26+
Oid *relation_oid_out,
27+
bool *is_parent_out);
2728
bool is_pathman_related_alter_column_type(Node *parsetree,
2829
Oid *parent_relid_out,
2930
AttrNumber *attr_number,
@@ -32,8 +33,9 @@ bool is_pathman_related_alter_column_type(Node *parsetree,
3233
/* Statement handlers */
3334
void PathmanDoCopy(const CopyStmt *stmt, const char *queryString,
3435
int stmt_location, int stmt_len, uint64 *processed);
35-
void PathmanRenameConstraint(Oid partition_relid,
36-
const RenameStmt *partition_rename_stmt);
36+
37+
void PathmanRenameConstraint(Oid partition_relid, const RenameStmt *rename_stmt);
38+
void PathmanRenameSequence(Oid parent_relid, const RenameStmt *rename_stmt);
3739

3840

3941
#endif /* COPY_STMT_HOOKING_H */

src/init.c

+14-2
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ build_check_constraint_name_relid_internal(Oid relid)
565565
char *
566566
build_check_constraint_name_relname_internal(const char *relname)
567567
{
568+
AssertArg(relname != NULL);
568569
return psprintf("pathman_%s_check", relname);
569570
}
570571

@@ -573,10 +574,21 @@ build_check_constraint_name_relname_internal(const char *relname)
573574
* NOTE: this function does not perform sanity checks at all.
574575
*/
575576
char *
576-
build_sequence_name_internal(Oid relid)
577+
build_sequence_name_relid_internal(Oid relid)
577578
{
578579
AssertArg(OidIsValid(relid));
579-
return psprintf("%s_seq", get_rel_name(relid));
580+
return build_sequence_name_relname_internal(get_rel_name(relid));
581+
}
582+
583+
/*
584+
* Generate part sequence name for a parent.
585+
* NOTE: this function does not perform sanity checks at all.
586+
*/
587+
char *
588+
build_sequence_name_relname_internal(const char *relname)
589+
{
590+
AssertArg(relname != NULL);
591+
return psprintf("%s_seq", relname);
580592
}
581593

582594
/*

src/partition_creation.c

+20-11
Original file line numberDiff line numberDiff line change
@@ -600,22 +600,31 @@ spawn_partitions_val(Oid parent_relid, /* parent's Oid */
600600
static char *
601601
choose_range_partition_name(Oid parent_relid, Oid parent_nsp)
602602
{
603-
Datum part_num;
604-
Oid part_seq_relid;
605-
char *part_seq_relname;
606-
Oid save_userid;
607-
int save_sec_context;
608-
bool need_priv_escalation = !superuser(); /* we might be a SU */
609-
char *relname;
610-
int attempts_cnt = 1000;
611-
612-
part_seq_relname = build_sequence_name_internal(parent_relid);
613-
part_seq_relid = get_relname_relid(part_seq_relname, parent_nsp);
603+
Datum part_num;
604+
Oid part_seq_relid;
605+
char *part_seq_nspname,
606+
*part_seq_relname;
607+
RangeVar *part_seq_rv;
608+
Oid save_userid;
609+
int save_sec_context;
610+
bool need_priv_escalation = !superuser(); /* we might be a SU */
611+
char *relname;
612+
int attempts_cnt = 1000;
613+
614+
/* Dispatch sequence and lock it using AccessShareLock */
615+
part_seq_nspname = get_namespace_name(get_rel_namespace(parent_relid));
616+
part_seq_relname = build_sequence_name_relid_internal(parent_relid);
617+
part_seq_rv = makeRangeVar(part_seq_nspname, part_seq_relname, -1);
618+
part_seq_relid = RangeVarGetRelid(part_seq_rv, AccessShareLock, true);
614619

615620
/* Could not find part number generating sequence */
616621
if (!OidIsValid(part_seq_relid))
617622
elog(ERROR, "auto naming sequence \"%s\" does not exist", part_seq_relname);
618623

624+
pfree(part_seq_nspname);
625+
pfree(part_seq_relname);
626+
pfree(part_seq_rv);
627+
619628
/* Do we have to escalate privileges? */
620629
if (need_priv_escalation)
621630
{

src/pl_funcs.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ add_to_pathman_config(PG_FUNCTION_ARGS)
901901
Oid naming_seq;
902902

903903
naming_seq_rv = makeRangeVar(get_namespace_name(get_rel_namespace(relid)),
904-
build_sequence_name_internal(relid),
904+
build_sequence_name_relid_internal(relid),
905905
-1);
906906

907907
naming_seq = RangeVarGetRelid(naming_seq_rv, AccessShareLock, true);

src/pl_range_funcs.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -589,16 +589,18 @@ build_sequence_name(PG_FUNCTION_ARGS)
589589
{
590590
Oid parent_relid = PG_GETARG_OID(0);
591591
Oid parent_nsp;
592+
char *seq_name;
592593
char *result;
593594

594595
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(parent_relid)))
595596
ereport(ERROR, (errmsg("relation \"%u\" does not exist", parent_relid)));
596597

597598
parent_nsp = get_rel_namespace(parent_relid);
599+
seq_name = build_sequence_name_relid_internal(parent_relid);
598600

599601
result = psprintf("%s.%s",
600602
quote_identifier(get_namespace_name(parent_nsp)),
601-
quote_identifier(build_sequence_name_internal(parent_relid)));
603+
quote_identifier(seq_name));
602604

603605
PG_RETURN_TEXT_P(cstring_to_text(result));
604606
}

0 commit comments

Comments
 (0)