From c5ae07a90a0f3594e5053a26f3c99b041df427d3 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Sun, 14 Dec 2025 16:10:25 +0200 Subject: [PATCH] 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 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