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

Skip to content

Commit d362034

Browse files
committed
Merge branch 'master' into rel_future_beta
2 parents c9e46e8 + fda1b36 commit d362034

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
@@ -882,6 +882,7 @@ pathman_process_utility_hook(Node *first_arg,
882882
Oid relation_oid;
883883
PartType part_type;
884884
AttrNumber attr_number;
885+
bool is_parent;
885886

886887
/* Override standard COPY statement if needed */
887888
if (is_pathman_related_copy(parsetree))
@@ -900,10 +901,15 @@ pathman_process_utility_hook(Node *first_arg,
900901

901902
/* Override standard RENAME statement if needed */
902903
else if (is_pathman_related_table_rename(parsetree,
903-
&relation_oid))
904+
&relation_oid,
905+
&is_parent))
904906
{
905-
PathmanRenameConstraint(relation_oid,
906-
(const RenameStmt *) parsetree);
907+
const RenameStmt *rename_stmt = (const RenameStmt *) parsetree;
908+
909+
if (is_parent)
910+
PathmanRenameSequence(relation_oid, rename_stmt);
911+
else
912+
PathmanRenameConstraint(relation_oid, rename_stmt);
907913
}
908914

909915
/* 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
@@ -569,6 +569,7 @@ build_check_constraint_name_relid_internal(Oid relid)
569569
char *
570570
build_check_constraint_name_relname_internal(const char *relname)
571571
{
572+
AssertArg(relname != NULL);
572573
return psprintf("pathman_%s_check", relname);
573574
}
574575

@@ -577,10 +578,21 @@ build_check_constraint_name_relname_internal(const char *relname)
577578
* NOTE: this function does not perform sanity checks at all.
578579
*/
579580
char *
580-
build_sequence_name_internal(Oid relid)
581+
build_sequence_name_relid_internal(Oid relid)
581582
{
582583
AssertArg(OidIsValid(relid));
583-
return psprintf("%s_seq", get_rel_name(relid));
584+
return build_sequence_name_relname_internal(get_rel_name(relid));
585+
}
586+
587+
/*
588+
* Generate part sequence name for a parent.
589+
* NOTE: this function does not perform sanity checks at all.
590+
*/
591+
char *
592+
build_sequence_name_relname_internal(const char *relname)
593+
{
594+
AssertArg(relname != NULL);
595+
return psprintf("%s_seq", relname);
584596
}
585597

586598
/*

src/partition_creation.c

+20-11
Original file line numberDiff line numberDiff line change
@@ -594,22 +594,31 @@ spawn_partitions_val(Oid parent_relid, /* parent's Oid */
594594
static char *
595595
choose_range_partition_name(Oid parent_relid, Oid parent_nsp)
596596
{
597-
Datum part_num;
598-
Oid part_seq_relid;
599-
char *part_seq_relname;
600-
Oid save_userid;
601-
int save_sec_context;
602-
bool need_priv_escalation = !superuser(); /* we might be a SU */
603-
char *relname;
604-
int attempts_cnt = 1000;
605-
606-
part_seq_relname = build_sequence_name_internal(parent_relid);
607-
part_seq_relid = get_relname_relid(part_seq_relname, parent_nsp);
597+
Datum part_num;
598+
Oid part_seq_relid;
599+
char *part_seq_nspname,
600+
*part_seq_relname;
601+
RangeVar *part_seq_rv;
602+
Oid save_userid;
603+
int save_sec_context;
604+
bool need_priv_escalation = !superuser(); /* we might be a SU */
605+
char *relname;
606+
int attempts_cnt = 1000;
607+
608+
/* Dispatch sequence and lock it using AccessShareLock */
609+
part_seq_nspname = get_namespace_name(get_rel_namespace(parent_relid));
610+
part_seq_relname = build_sequence_name_relid_internal(parent_relid);
611+
part_seq_rv = makeRangeVar(part_seq_nspname, part_seq_relname, -1);
612+
part_seq_relid = RangeVarGetRelid(part_seq_rv, AccessShareLock, true);
608613

609614
/* Could not find part number generating sequence */
610615
if (!OidIsValid(part_seq_relid))
611616
elog(ERROR, "auto naming sequence \"%s\" does not exist", part_seq_relname);
612617

618+
pfree(part_seq_nspname);
619+
pfree(part_seq_relname);
620+
pfree(part_seq_rv);
621+
613622
/* Do we have to escalate privileges? */
614623
if (need_priv_escalation)
615624
{

src/pl_funcs.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -886,7 +886,7 @@ add_to_pathman_config(PG_FUNCTION_ARGS)
886886
Oid naming_seq;
887887

888888
naming_seq_rv = makeRangeVar(get_namespace_name(get_rel_namespace(relid)),
889-
build_sequence_name_internal(relid),
889+
build_sequence_name_relid_internal(relid),
890890
-1);
891891

892892
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)