diff --git a/src/include/pathman.h b/src/include/pathman.h index 28f6ef30..a4439f47 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 1907d9dc..cb26000b 100644 --- a/src/init.c +++ b/src/init.c @@ -649,6 +649,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, @@ -657,13 +658,15 @@ pathman_config_contains_relation(Oid relid, Datum *values, bool *isnull, /* Open PATHMAN_CONFIG with latest snapshot available */ rel = heap_open_compat(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 @@ -680,7 +683,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 d6080c85..0f28a884 100644 --- a/src/partition_creation.c +++ b/src/partition_creation.c @@ -124,8 +124,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]; /* @@ -361,8 +361,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)) @@ -2024,8 +2024,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 10538bea..029c4f75 100644 --- a/src/pl_funcs.c +++ b/src/pl_funcs.c @@ -794,8 +794,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; @@ -895,6 +895,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 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; + isnull[Natts_pathman_config_historic - 1] = true; + /* Insert new row into PATHMAN_CONFIG */ pathman_config = heap_open_compat(get_pathman_config_relid(false), RowExclusiveLock); diff --git a/src/pl_range_funcs.c b/src/pl_range_funcs.c index 19292a0a..90787434 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 db75646f..842a1625 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; /*
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: