Thanks to visit codestin.com
Credit goes to github.com

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)