260 lines
9.8 KiB
Diff
260 lines
9.8 KiB
Diff
|
From 5c17cb0aa7f06bb3ac15d4ca72a37f59a10fa59e Mon Sep 17 00:00:00 2001
|
||
|
From: Sven Klemm <sven@timescale.com>
|
||
|
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
|
||
|
|
||
|
Signed-off-by: Maxim Kochetkov <fido_max@inbox.ru>
|
||
|
Fetch from: https://github.com/timescale/timescaledb/commit/2cb7c41276c8f8112bd225a020fef709a8e776ff.patch
|
||
|
---
|
||
|
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 5dc294df..f8200dd8 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 51c1c181..1b2ed8e5 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 38d0e0c6..5307079d 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;
|
||
|
--
|
||
|
2.29.2
|
||
|
|