From 2cb7c41276c8f8112bd225a020fef709a8e776ff Mon Sep 17 00:00:00 2001 From: Sven Klemm Date: Thu, 24 Sep 2020 15:21:04 +0200 Subject: [PATCH] Adjust code to PG13 tuple conversion changes PG13 changes the way attribute mappings are done and uses AttrMap instead of AttrNumber[] in the new function signatures. This patch changes ChunkInsertState to use TupleConversionMap which abstracts this change. https://github.com/postgres/postgres/commit/e1551f96e6 --- src/chunk_insert_state.c | 92 +++++++++++++++++++++------------------ src/compat.h | 15 +++++++ tsl/src/fdw/modify_exec.c | 4 ++ 3 files changed, 69 insertions(+), 42 deletions(-) diff --git a/src/chunk_insert_state.c b/src/chunk_insert_state.c index 5dc294df8f0..f8200dd8fe2 100644 --- a/src/chunk_insert_state.c +++ b/src/chunk_insert_state.c @@ -120,7 +120,7 @@ create_chunk_result_relation_info(ChunkDispatch *dispatch, Relation rel) static ProjectionInfo * get_adjusted_projection_info_returning(ProjectionInfo *orig, List *returning_clauses, - AttrNumber *map, int map_size, Index varno, Oid rowtype, + TupleConversionMap *map, Index varno, Oid rowtype, TupleDesc chunk_desc) { bool found_whole_row; @@ -128,14 +128,15 @@ get_adjusted_projection_info_returning(ProjectionInfo *orig, List *returning_cla Assert(returning_clauses != NIL); /* map hypertable attnos -> chunk attnos */ - returning_clauses = castNode(List, - map_variable_attnos((Node *) returning_clauses, - varno, - 0, - map, - map_size, - rowtype, - &found_whole_row)); + if (map != NULL) + returning_clauses = castNode(List, + map_variable_attnos_compat((Node *) returning_clauses, + varno, + 0, + map->attrMap, + map->outdesc->natts, + rowtype, + &found_whole_row)); return ExecBuildProjectionInfo(returning_clauses, orig->pi_exprContext, @@ -145,7 +146,7 @@ get_adjusted_projection_info_returning(ProjectionInfo *orig, List *returning_cla } static List * -translate_clause(List *inclause, AttrNumber *chunk_attnos, Index varno, Relation hyper_rel, +translate_clause(List *inclause, TupleConversionMap *chunk_map, Index varno, Relation hyper_rel, Relation chunk_rel) { List *clause = copyObject(inclause); @@ -153,23 +154,23 @@ translate_clause(List *inclause, AttrNumber *chunk_attnos, Index varno, Relation /* map hypertable attnos -> chunk attnos for the "excluded" table */ clause = castNode(List, - map_variable_attnos((Node *) clause, - INNER_VAR, - 0, - chunk_attnos, - RelationGetDescr(hyper_rel)->natts, - RelationGetForm(chunk_rel)->reltype, - &found_whole_row)); + map_variable_attnos_compat((Node *) clause, + INNER_VAR, + 0, + chunk_map->attrMap, + RelationGetDescr(hyper_rel)->natts, + RelationGetForm(chunk_rel)->reltype, + &found_whole_row)); /* map hypertable attnos -> chunk attnos for the hypertable */ clause = castNode(List, - map_variable_attnos((Node *) clause, - varno, - 0, - chunk_attnos, - RelationGetDescr(hyper_rel)->natts, - RelationGetForm(chunk_rel)->reltype, - &found_whole_row)); + map_variable_attnos_compat((Node *) clause, + varno, + 0, + chunk_map->attrMap, + RelationGetDescr(hyper_rel)->natts, + RelationGetForm(chunk_rel)->reltype, + &found_whole_row)); return clause; } @@ -193,7 +194,11 @@ adjust_hypertable_tlist(List *tlist, TupleConversionMap *map) { List *new_tlist = NIL; TupleDesc chunk_tupdesc = map->outdesc; +#if PG13_GE + AttrNumber *attrMap = map->attrMap->attnums; +#else AttrNumber *attrMap = map->attrMap; +#endif AttrNumber chunk_attrno; for (chunk_attrno = 1; chunk_attrno <= chunk_tupdesc->natts; chunk_attrno++) @@ -351,7 +356,8 @@ get_default_existing_slot(ChunkInsertState *state, ChunkDispatch *dispatch) * columns, etc. */ static void -setup_on_conflict_state(ChunkInsertState *state, ChunkDispatch *dispatch, AttrNumber *chunk_attnos) +setup_on_conflict_state(ChunkInsertState *state, ChunkDispatch *dispatch, + TupleConversionMap *chunk_map) { TupleConversionMap *map = state->hyper_to_chunk_map; ResultRelInfo *chunk_rri = get_chunk_rri(state); @@ -377,16 +383,17 @@ setup_on_conflict_state(ChunkInsertState *state, ChunkDispatch *dispatch, AttrNu Assert(map->outdesc == RelationGetDescr(chunk_rel)); - if (NULL == chunk_attnos) - chunk_attnos = convert_tuples_by_name_map(RelationGetDescr(chunk_rel), - RelationGetDescr(first_rel) + if (NULL == chunk_map) + chunk_map = convert_tuples_by_name(RelationGetDescr(chunk_rel), + RelationGetDescr(first_rel) #if PG13_LT - , gettext_noop("could not convert row type") + , + gettext_noop("could not convert row type") #endif - ); + ); onconflset = translate_clause(ts_chunk_dispatch_get_on_conflict_set(dispatch), - chunk_attnos, + chunk_map, hyper_rri->ri_RangeTableIndex, hyper_rel, chunk_rel); @@ -412,7 +419,7 @@ setup_on_conflict_state(ChunkInsertState *state, ChunkDispatch *dispatch, AttrNu if (NULL != onconflict_where) { List *clause = translate_clause(castNode(List, onconflict_where), - chunk_attnos, + chunk_map, hyper_rri->ri_RangeTableIndex, hyper_rel, chunk_rel); @@ -476,7 +483,7 @@ adjust_projections(ChunkInsertState *cis, ChunkDispatch *dispatch, Oid rowtype) ResultRelInfo *chunk_rri = cis->result_relation_info; Relation hyper_rel = dispatch->hypertable_result_rel_info->ri_RelationDesc; Relation chunk_rel = cis->rel; - AttrNumber *chunk_attnos = NULL; + TupleConversionMap *chunk_map = NULL; OnConflictAction onconflict_action = ts_chunk_dispatch_get_on_conflict_action(dispatch); if (ts_chunk_dispatch_has_returning(dispatch)) @@ -486,19 +493,19 @@ adjust_projections(ChunkInsertState *cis, ChunkDispatch *dispatch, Oid rowtype) * to have the hypertable_desc in the out spot for map_variable_attnos * to work correctly in mapping hypertable attnos->chunk attnos. */ - chunk_attnos = convert_tuples_by_name_map(RelationGetDescr(chunk_rel), - RelationGetDescr(hyper_rel) + chunk_map = convert_tuples_by_name(RelationGetDescr(chunk_rel), + RelationGetDescr(hyper_rel) #if PG13_LT - ,gettext_noop("could not convert row type") + , + gettext_noop("could not convert row type") #endif - ); + ); chunk_rri->ri_projectReturning = get_adjusted_projection_info_returning(chunk_rri->ri_projectReturning, ts_chunk_dispatch_get_returning_clauses( dispatch), - chunk_attnos, - RelationGetDescr(hyper_rel)->natts, + chunk_map, dispatch->hypertable_result_rel_info ->ri_RangeTableIndex, rowtype, @@ -511,7 +518,7 @@ adjust_projections(ChunkInsertState *cis, ChunkDispatch *dispatch, Oid rowtype) set_arbiter_indexes(cis, dispatch); if (onconflict_action == ONCONFLICT_UPDATE) - setup_on_conflict_state(cis, dispatch, chunk_attnos); + setup_on_conflict_state(cis, dispatch, chunk_map); } } @@ -598,9 +605,10 @@ ts_chunk_insert_state_create(Chunk *chunk, ChunkDispatch *dispatch) convert_tuples_by_name(RelationGetDescr(parent_rel), RelationGetDescr(rel) #if PG13_LT - ,gettext_noop("could not convert row type") + , + gettext_noop("could not convert row type") #endif - ); + ); adjust_projections(state, dispatch, RelationGetForm(rel)->reltype); diff --git a/src/compat.h b/src/compat.h index 51c1c1818ea..1b2ed8e5dad 100644 --- a/src/compat.h +++ b/src/compat.h @@ -374,4 +374,19 @@ get_vacuum_options(const VacuumStmt *stmt) #define for_each_cell_compat(cell, list, initcell) for_each_cell ((cell), (list), (initcell)) #endif +/* PG13 removes the natts parameter from map_variable_attnos */ +#if PG13_LT +#define map_variable_attnos_compat(node, varno, sublevels_up, map, natts, rowtype, found_wholerow) \ + map_variable_attnos((node), \ + (varno), \ + (sublevels_up), \ + (map), \ + (natts), \ + (rowtype), \ + (found_wholerow)) +#else +#define map_variable_attnos_compat(node, varno, sublevels_up, map, natts, rowtype, found_wholerow) \ + map_variable_attnos((node), (varno), (sublevels_up), (map), (rowtype), (found_wholerow)) +#endif + #endif /* TIMESCALEDB_COMPAT_H */ diff --git a/tsl/src/fdw/modify_exec.c b/tsl/src/fdw/modify_exec.c index 38d0e0c6f17..5307079d096 100644 --- a/tsl/src/fdw/modify_exec.c +++ b/tsl/src/fdw/modify_exec.c @@ -202,7 +202,11 @@ convert_attrs(TupleConversionMap *map, List *attrs) for (i = 0; i < map->outdesc->natts; i++) { +#if PG13_GE + if (map->attrMap->attnums[i] == attnum) +#else if (map->attrMap[i] == attnum) +#endif { new_attrs = lappend_int(new_attrs, AttrOffsetGetAttrNumber(i)); break;