Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid segfaults on 1.5-upgraded installations before 10e6c71 [WiP] #212

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/include/pathman.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) */
Expand Down
9 changes: 6 additions & 3 deletions src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -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]);
Expand Down
12 changes: 6 additions & 6 deletions src/partition_creation.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];


/*
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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;

Expand Down
12 changes: 10 additions & 2 deletions src/pl_funcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
4 changes: 2 additions & 2 deletions src/pl_range_funcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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' */
Expand Down
4 changes: 2 additions & 2 deletions src/relation_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/*
Expand Down