v1-0001-Fix-usage-of-palloc-in-MERGE-SPLIT-PARTITION-s-co.patch
application/octet-stream
Filename: v1-0001-Fix-usage-of-palloc-in-MERGE-SPLIT-PARTITION-s-co.patch
Type: application/octet-stream
Part: 0
From b964df0852b32c046cf2f298bbd0d528be85f48a Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sun, 14 Dec 2025 15:40:45 +0200
Subject: [PATCH v1] Fix usage of palloc() in MERGE/SPLIT PARTITION(s) code
f2e4cc427951 and 4b3d173629f4 implement ALTER TABLE ... MERGE/SPLIT
PARTITION(s) commands. In several places, these commits use palloc(),
where we should use palloc_object() and palloc_array(). This commit
provides appropriate usage of palloc_object() and palloc_array().
Reported-by: Man Zeng <zengman@halodbtech.com>
Discussion: https://postgr.es/m/tencent_3661BB522D5466B33EA33666%40qq.com
---
src/backend/commands/tablecmds.c | 6 +++---
src/backend/partitioning/partbounds.c | 12 ++++--------
2 files changed, 7 insertions(+), 11 deletions(-)
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 953fadb9c6b..7550ee7c164 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -22317,7 +22317,7 @@ createTableConstraints(List **wqueue, AlteredTableInfo *tab,
*/
if (attribute->attgenerated == ATTRIBUTE_GENERATED_STORED)
{
- newval = (NewColumnValue *) palloc0(sizeof(NewColumnValue));
+ newval = palloc0_object(NewColumnValue);
newval->attnum = num;
newval->expr = expression_planner((Expr *) def);
newval->is_generated = (attribute->attgenerated != '\0');
@@ -22406,7 +22406,7 @@ createTableConstraints(List **wqueue, AlteredTableInfo *tab,
{
NewConstraint *newcon;
- newcon = (NewConstraint *) palloc0(sizeof(NewConstraint));
+ newcon = palloc0_object(NewConstraint);
newcon->name = ccon->name;
newcon->contype = CONSTR_CHECK;
newcon->qual = qual;
@@ -22944,7 +22944,7 @@ createSplitPartitionContext(Relation partRel)
{
SplitPartitionContext *pc;
- pc = (SplitPartitionContext *) palloc0(sizeof(SplitPartitionContext));
+ pc = palloc0_object(SplitPartitionContext);
pc->partRel = partRel;
/*
diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c
index b7f90ae109d..16b0adc172c 100644
--- a/src/backend/partitioning/partbounds.c
+++ b/src/backend/partitioning/partbounds.c
@@ -5115,8 +5115,7 @@ calculate_partition_bound_for_merge(Relation parent,
int nparts = list_length(partOids);
List *bounds = NIL;
- lower_bounds = (PartitionRangeBound **)
- palloc0(nparts * sizeof(PartitionRangeBound *));
+ lower_bounds = palloc0_array(PartitionRangeBound *, nparts);
/*
* Create an array of lower bounds and a list of
@@ -5755,8 +5754,7 @@ check_partitions_for_split(Relation parent,
* Make an array new_parts with new partitions except the DEFAULT
* partition.
*/
- new_parts = (SinglePartitionSpec **)
- palloc0(list_length(partlist) * sizeof(SinglePartitionSpec *));
+ new_parts = palloc0_array(SinglePartitionSpec *, list_length(partlist));
/* isSplitPartDefault flag: is split partition a DEFAULT partition? */
isSplitPartDefault = (defaultPartOid == splitPartOid);
@@ -5786,8 +5784,7 @@ check_partitions_for_split(Relation parent,
* all partitions in ascending order of their bounds (we compare the
* lower bound only).
*/
- lower_bounds = (PartitionRangeBound **)
- palloc0(nparts * sizeof(PartitionRangeBound *));
+ lower_bounds = palloc0_array(PartitionRangeBound *, nparts);
/* Create an array of lower bounds. */
for (i = 0; i < nparts; i++)
@@ -5802,8 +5799,7 @@ check_partitions_for_split(Relation parent,
/* Reorder the array of partitions. */
tmp_new_parts = new_parts;
- new_parts = (SinglePartitionSpec **)
- palloc0(nparts * sizeof(SinglePartitionSpec *));
+ new_parts = palloc0_array(SinglePartitionSpec *, nparts);
for (i = 0; i < nparts; i++)
new_parts[i] = tmp_new_parts[lower_bounds[i]->index];
--
2.39.5 (Apple Git-154)