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; /*