From 3301383f15731e71b23597be910cadce7b64abed Mon Sep 17 00:00:00 2001 From: Andrey Borodin Date: Thu, 25 Jun 2020 14:31:22 +0500 Subject: [PATCH] Avoid segfaults on 1.5-upgraded installations before 10e6c71 --- src/include/pathman.h | 1 + src/init.c | 9 ++++++--- src/partition_creation.c | 8 ++++---- src/pl_funcs.c | 12 ++++++++++-- src/pl_range_funcs.c | 4 ++-- src/relation_info.c | 4 ++-- 6 files changed, 25 insertions(+), 13 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 f6ddbdae..cd18850c 100644 --- a/src/init.c +++ b/src/init.c @@ -620,6 +620,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, @@ -628,13 +629,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()); scan = heap_beginscan(rel, snapshot, 1, key); @@ -647,7 +650,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 fc950c4f..bf341920 100644 --- a/src/partition_creation.c +++ b/src/partition_creation.c @@ -338,8 +338,8 @@ create_partitions_for_value_internal(Oid relid, Datum value, Oid value_type, PG_TRY(); { - 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)) @@ -1842,8 +1842,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 44a5f93f..c73e32be 100644 --- a/src/pl_funcs.c +++ b/src/pl_funcs.c @@ -700,8 +700,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; @@ -797,6 +797,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 351926f7..942ff5a1 100644 --- a/src/pl_range_funcs.c +++ b/src/pl_range_funcs.c @@ -103,8 +103,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 8ee74217..1b612fd9 100644 --- a/src/relation_info.c +++ b/src/relation_info.c @@ -336,8 +336,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; /*