0002-required-fixups.patch
text/x-diff
Filename: 0002-required-fixups.patch
Type: text/x-diff
Part: 1
Patch
Format: unified
Series: patch 0002
| File | + | − |
|---|---|---|
| src/backend/nodes/outfuncs.c | 1 | 1 |
| src/backend/nodes/readfuncs.c | 25 | 1 |
| src/backend/optimizer/prep/prepjointree.c | 4 | 1 |
| src/backend/parser/analyze.c | 1 | 1 |
| src/backend/rewrite/rewriteHandler.c | 7 | 4 |
| src/include/nodes/parsenodes.h | 6 | 5 |
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 69fd5b2..93f1e2c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -3003,7 +3003,7 @@ _outQuery(StringInfo str, const Query *node)
WRITE_NODE_FIELD(rowMarks);
WRITE_NODE_FIELD(setOperations);
WRITE_NODE_FIELD(constraintDeps);
- /* withCheckOptions intentionally omitted, see comment in parsenodes.h */
+ WRITE_NODE_FIELD(withCheckOptions);
WRITE_LOCATION_FIELD(stmt_location);
WRITE_LOCATION_FIELD(stmt_len);
}
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 3254524..b2db5a7 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -269,7 +269,7 @@ _readQuery(void)
READ_NODE_FIELD(rowMarks);
READ_NODE_FIELD(setOperations);
READ_NODE_FIELD(constraintDeps);
- /* withCheckOptions intentionally omitted, see comment in parsenodes.h */
+ READ_NODE_FIELD(withCheckOptions);
READ_LOCATION_FIELD(stmt_location);
READ_LOCATION_FIELD(stmt_len);
@@ -1366,6 +1366,13 @@ _readRangeTblEntry(void)
break;
case RTE_TABLEFUNC:
READ_NODE_FIELD(tablefunc);
+ /* The RTE must have a copy of the column type info, if any */
+ if (local_node->tablefunc)
+ {
+ local_node->coltypes = local_node->tablefunc->coltypes;
+ local_node->coltypmods = local_node->tablefunc->coltypmods;
+ local_node->colcollations = local_node->tablefunc->colcollations;
+ }
break;
case RTE_VALUES:
READ_NODE_FIELD(values_lists);
@@ -1910,6 +1918,21 @@ _readCteScan(void)
}
/*
+ * _readNamedTuplestoreScan
+ */
+static NamedTuplestoreScan *
+_readNamedTuplestoreScan(void)
+{
+ READ_LOCALS(NamedTuplestoreScan);
+
+ ReadCommonScan(&local_node->scan);
+
+ READ_STRING_FIELD(enrname);
+
+ READ_DONE();
+}
+
+/*
* _readWorkTableScan
*/
static WorkTableScan *
@@ -2693,6 +2716,8 @@ parseNodeString(void)
return_value = _readTableFuncScan();
else if (MATCH("CTESCAN", 7))
return_value = _readCteScan();
+ else if (MATCH("NAMEDTUPLESTORESCAN", 19))
+ return_value = _readNamedTuplestoreScan();
else if (MATCH("WORKTABLESCAN", 13))
return_value = _readWorkTableScan();
else if (MATCH("FOREIGNSCAN", 11))
diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c
index c3f46a2..688b3a1 100644
--- a/src/backend/optimizer/prep/prepjointree.c
+++ b/src/backend/optimizer/prep/prepjointree.c
@@ -586,10 +586,13 @@ inline_set_returning_functions(PlannerInfo *root)
funcquery = inline_set_returning_function(root, rte);
if (funcquery)
{
- /* Successful expansion, replace the rtable entry */
+ /* Successful expansion, convert the RTE to a subquery */
rte->rtekind = RTE_SUBQUERY;
rte->subquery = funcquery;
+ rte->security_barrier = false;
+ /* Clear fields that should not be set in a subquery RTE */
rte->functions = NIL;
+ rte->funcordinality = false;
}
}
}
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index c601b6d..c020600 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -1116,7 +1116,7 @@ BuildOnConflictExcludedTargetlist(Relation targetrel,
* the Const claims to be.
*/
var = (Var *) makeNullConst(INT4OID, -1, InvalidOid);
- name = "";
+ name = NULL;
}
else
{
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index d830569..327e5c3 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -1582,15 +1582,18 @@ ApplyRetrieveRule(Query *parsetree,
rule_action = fireRIRrules(rule_action, activeRIRs);
/*
- * Now, plug the view query in as a subselect, replacing the relation's
- * original RTE.
+ * Now, plug the view query in as a subselect, converting the relation's
+ * original RTE to a subquery RTE.
*/
rte = rt_fetch(rt_index, parsetree->rtable);
rte->rtekind = RTE_SUBQUERY;
- rte->relid = InvalidOid;
- rte->security_barrier = RelationIsSecurityView(relation);
rte->subquery = rule_action;
+ rte->security_barrier = RelationIsSecurityView(relation);
+ /* Clear fields that should not be set in a subquery RTE */
+ rte->relid = InvalidOid;
+ rte->relkind = 0;
+ rte->tablesample = NULL;
rte->inh = false; /* must not be set for a subquery */
/*
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 07ab1a3..62209a8 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -168,9 +168,8 @@ typedef struct Query
List *constraintDeps; /* a list of pg_constraint OIDs that the query
* depends on to be semantically valid */
- List *withCheckOptions; /* a list of WithCheckOption's, which are
- * only added during rewrite and therefore
- * are not written out as part of Query. */
+ List *withCheckOptions; /* a list of WithCheckOption's (added
+ * during rewrite) */
/*
* The following two fields identify the portion of the source text string
@@ -1034,7 +1033,7 @@ typedef struct RangeTblEntry
bool self_reference; /* is this a recursive self-reference? */
/*
- * Fields valid for table functions, values, CTE and ENR RTEs (else NIL):
+ * Fields valid for CTE, VALUES, ENR, and TableFunc RTEs (else NIL):
*
* We need these for CTE RTEs so that the types of self-referential
* columns are well-defined. For VALUES RTEs, storing these explicitly
@@ -1042,7 +1041,9 @@ typedef struct RangeTblEntry
* ENRs, we store the types explicitly here (we could get the information
* from the catalogs if 'relid' was supplied, but we'd still need these
* for TupleDesc-based ENRs, so we might as well always store the type
- * info here).
+ * info here). For TableFuncs, these fields are redundant with data in
+ * the TableFunc node, but keeping them here allows some code sharing with
+ * the other cases.
*
* For ENRs only, we have to consider the possibility of dropped columns.
* A dropped column is included in these lists, but it will have zeroes in