Skip to content

Commit d362034

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

File tree

10 files changed

+216
-49
lines changed

10 files changed

+216
-49
lines changed

expected/pathman_utility_stmt.out

Lines changed: 56 additions & 2 deletions
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

Lines changed: 23 additions & 1 deletion
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

Lines changed: 9 additions & 3 deletions
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 5 additions & 3 deletions
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

Lines changed: 14 additions & 2 deletions
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

Lines changed: 20 additions & 11 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 3 additions & 1 deletion
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)
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