From 2cdb2bda31bca10c8f643e36cc6d76f3dd64163e Mon Sep 17 00:00:00 2001 From: Andrey Borodin Date: Thu, 25 Jun 2020 14:31:22 +0500 Subject: [PATCH 1/2] Avoid segfaults on 1.5-upgraded installations before 10e6c71 --- src/include/pathman.h | 1 + src/init.c | 9 ++++++--- src/partition_creation.c | 12 ++++++------ src/pl_funcs.c | 12 ++++++++++-- src/pl_range_funcs.c | 4 ++-- src/relation_info.c | 4 ++-- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/include/pathman.h b/src/include/pathman.h index b9acfe59..dd6a789b 100644 --- a/src/include/pathman.h +++ b/src/include/pathman.h @@ -46,6 +46,7 @@ */ #define PATHMAN_CONFIG "pathman_config" #define Natts_pathman_config 4 +#define Natts_pathman_config_historic 5 #define Anum_pathman_config_partrel 1 /* partitioned relation (regclass) */ #define Anum_pathman_config_expr 2 /* partition expression (original) */ #define Anum_pathman_config_parttype 3 /* partitioning type (1|2) */ diff --git a/src/init.c b/src/init.c index bd85c593..2df08474 100644 --- a/src/init.c +++ b/src/init.c @@ -648,6 +648,7 @@ pathman_config_contains_relation(Oid relid, Datum *values, bool *isnull, Snapshot snapshot; HeapTuple htup; bool contains_rel = false; + TupleDesc tupleDescr; ScanKeyInit(&key[0], Anum_pathman_config_partrel, @@ -656,13 +657,15 @@ pathman_config_contains_relation(Oid relid, Datum *values, bool *isnull, /* Open PATHMAN_CONFIG with latest snapshot available */ rel = heap_open(get_pathman_config_relid(false), AccessShareLock); + tupleDescr = RelationGetDescr(rel); /* Check that 'partrel' column is of regclass type */ - Assert(TupleDescAttr(RelationGetDescr(rel), + Assert(TupleDescAttr(tupleDescr, Anum_pathman_config_partrel - 1)->atttypid == REGCLASSOID); /* Check that number of columns == Natts_pathman_config */ - Assert(RelationGetDescr(rel)->natts == Natts_pathman_config); + Assert(tupleDescr->natts == Natts_pathman_config + || tupleDescr->natts == Natts_pathman_config_historic); snapshot = RegisterSnapshot(GetLatestSnapshot()); #if PG_VERSION_NUM >= 120000 @@ -679,7 +682,7 @@ pathman_config_contains_relation(Oid relid, Datum *values, bool *isnull, if (values && isnull) { htup = heap_copytuple(htup); - heap_deform_tuple(htup, RelationGetDescr(rel), values, isnull); + heap_deform_tuple(htup, tupleDescr, values, isnull); /* Perform checks for non-NULL columns */ Assert(!isnull[Anum_pathman_config_partrel - 1]); diff --git a/src/partition_creation.c b/src/partition_creation.c index 3e578e70..1dddbd49 100644 --- a/src/partition_creation.c +++ b/src/partition_creation.c @@ -116,8 +116,8 @@ create_single_range_partition_internal(Oid parent_relid, init_callback_params callback_params; List *trigger_columns = NIL; Node *expr; - Datum values[Natts_pathman_config]; - bool isnull[Natts_pathman_config]; + Datum values[Natts_pathman_config_historic]; + bool isnull[Natts_pathman_config_historic]; /* @@ -353,8 +353,8 @@ Oid create_partitions_for_value_internal(Oid relid, Datum value, Oid value_type) { Oid partid = InvalidOid; /* last created partition (or InvalidOid) */ - Datum values[Natts_pathman_config]; - bool isnull[Natts_pathman_config]; + Datum values[Natts_pathman_config_historic]; + bool isnull[Natts_pathman_config_historic]; /* Get both PartRelationInfo & PATHMAN_CONFIG contents for this relation */ if (pathman_config_contains_relation(relid, values, isnull, NULL, NULL)) @@ -1914,8 +1914,8 @@ build_partitioning_expression(Oid parent_relid, List **columns) /* ret val #2 */ { /* Values extracted from PATHMAN_CONFIG */ - Datum values[Natts_pathman_config]; - bool isnull[Natts_pathman_config]; + Datum values[Natts_pathman_config_historic]; + bool isnull[Natts_pathman_config_historic]; char *expr_cstr; Node *expr; diff --git a/src/pl_funcs.c b/src/pl_funcs.c index ebf80861..068a4ac6 100644 --- a/src/pl_funcs.c +++ b/src/pl_funcs.c @@ -751,8 +751,8 @@ add_to_pathman_config(PG_FUNCTION_ARGS) uint32 children_count; Relation pathman_config; - Datum values[Natts_pathman_config]; - bool isnull[Natts_pathman_config]; + Datum values[Natts_pathman_config_historic]; + bool isnull[Natts_pathman_config_historic]; HeapTuple htup; Oid expr_type; @@ -851,6 +851,14 @@ add_to_pathman_config(PG_FUNCTION_ARGS) values[Anum_pathman_config_expr - 1] = CStringGetTextDatum(expression); isnull[Anum_pathman_config_expr - 1] = false; + /* + * In case of 1.5 update before 10e6c71 there is acutlly 5 attributes in + * pathman_config description (inclusing cooked expression). To avoid + * potential problems we allocate 5th attribute and initialize it with null. + */ + values[Natts_pathman_config_historic - 1] = (Datum) 0; + isnull[Natts_pathman_config_historic - 1] = true; + /* Insert new row into PATHMAN_CONFIG */ pathman_config = heap_open(get_pathman_config_relid(false), RowExclusiveLock); diff --git a/src/pl_range_funcs.c b/src/pl_range_funcs.c index 27361dd3..3c6e65a7 100644 --- a/src/pl_range_funcs.c +++ b/src/pl_range_funcs.c @@ -110,8 +110,8 @@ create_single_range_partition_pl(PG_FUNCTION_ARGS) RangeVar *partition_name_rv; char *tablespace; - Datum values[Natts_pathman_config]; - bool isnull[Natts_pathman_config]; + Datum values[Natts_pathman_config_historic]; + bool isnull[Natts_pathman_config_historic]; /* Handle 'parent_relid' */ diff --git a/src/relation_info.c b/src/relation_info.c index 0c79b504..d630563f 100644 --- a/src/relation_info.c +++ b/src/relation_info.c @@ -350,8 +350,8 @@ get_pathman_relation_info(Oid relid) { PartRelationInfo *prel = NULL; ItemPointerData iptr; - Datum values[Natts_pathman_config]; - bool isnull[Natts_pathman_config]; + Datum values[Natts_pathman_config_historic]; + bool isnull[Natts_pathman_config_historic]; bool found; /* From 0660836e1a112e3aaef003d9f834ca7cb5b3e61f Mon Sep 17 00:00:00 2001 From: Ekaterina Sokolova Date: Mon, 1 Jul 2024 16:34:04 +0300 Subject: [PATCH 2/2] Correct typos in comments. --- src/pl_funcs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pl_funcs.c b/src/pl_funcs.c index 1db57ae9..029c4f75 100644 --- a/src/pl_funcs.c +++ b/src/pl_funcs.c @@ -896,8 +896,8 @@ add_to_pathman_config(PG_FUNCTION_ARGS) isnull[Anum_pathman_config_expr - 1] = false; /* - * In case of 1.5 update before 10e6c71 there is acutlly 5 attributes in - * pathman_config description (inclusing cooked expression). To avoid + * In case of 1.5 update before 10e6c71 there are actually 5 attributes in + * pathman_config description (including cooked expression). To avoid * potential problems we allocate 5th attribute and initialize it with null. */ values[Natts_pathman_config_historic - 1] = (Datum) 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