* Rebase patches to Buildroot 2021.02-rc3 * Update Buildroot to 2021.02-rc3 * Declare Kernel headers to be Linux version 5.10 (since they are, and new Buildroot knows about 5.10)
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
|
|
|