rowexpr-column-names.patch
text/x-patch
Filename: rowexpr-column-names.patch
Type: text/x-patch
Part: 0
Message:
Re: When do we lose column names?
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/executor/execQual.c | 0 | 0 |
| src/backend/executor/execTuples.c | 0 | 0 |
| src/backend/executor/nodeValuesscan.c | 0 | 0 |
| src/include/executor/executor.h | 0 | 0 |
diff --git a/src/backend/executor/execQual.c b/src/backend/executor/execQual.c
index 887e5ce82a0b9011627450fdd1046d5529beb110..8f0b5979ba589a1e3aa10405671d4c0793361c5e 100644
*** a/src/backend/executor/execQual.c
--- b/src/backend/executor/execQual.c
*************** ExecInitExpr(Expr *node, PlanState *pare
*** 4627,4633 ****
if (rowexpr->row_typeid == RECORDOID)
{
/* generic record, use runtime type assignment */
! rstate->tupdesc = ExecTypeFromExprList(rowexpr->args);
BlessTupleDesc(rstate->tupdesc);
/* we won't need to redo this at runtime */
}
--- 4627,4634 ----
if (rowexpr->row_typeid == RECORDOID)
{
/* generic record, use runtime type assignment */
! rstate->tupdesc = ExecTypeFromExprList(rowexpr->args,
! rowexpr->colnames);
BlessTupleDesc(rstate->tupdesc);
/* we won't need to redo this at runtime */
}
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 3f44ef0186ace8434ceaaf2ef37c14ca0fec632d..3ed90da7a52e2d0e982cfe0ef29022ac1ce1a4a5 100644
*** a/src/backend/executor/execTuples.c
--- b/src/backend/executor/execTuples.c
*************** ExecTypeFromTLInternal(List *targetList,
*** 954,980 ****
/*
* ExecTypeFromExprList - build a tuple descriptor from a list of Exprs
*
! * Here we must make up an arbitrary set of field names.
*/
TupleDesc
! ExecTypeFromExprList(List *exprList)
{
TupleDesc typeInfo;
! ListCell *l;
int cur_resno = 1;
! char fldname[NAMEDATALEN];
typeInfo = CreateTemplateTupleDesc(list_length(exprList), false);
! foreach(l, exprList)
{
! Node *e = lfirst(l);
!
! sprintf(fldname, "f%d", cur_resno);
TupleDescInitEntry(typeInfo,
cur_resno,
! fldname,
exprType(e),
exprTypmod(e),
0);
--- 954,981 ----
/*
* ExecTypeFromExprList - build a tuple descriptor from a list of Exprs
*
! * Caller must also supply a list of field names (String nodes).
*/
TupleDesc
! ExecTypeFromExprList(List *exprList, List *namesList)
{
TupleDesc typeInfo;
! ListCell *le;
! ListCell *ln;
int cur_resno = 1;
!
! Assert(list_length(exprList) == list_length(namesList));
typeInfo = CreateTemplateTupleDesc(list_length(exprList), false);
! forboth(le, exprList, ln, namesList)
{
! Node *e = lfirst(le);
! char *n = strVal(lfirst(ln));
TupleDescInitEntry(typeInfo,
cur_resno,
! n,
exprType(e),
exprTypmod(e),
0);
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index d5260e40b32abe5dc5ff437cda8e037f6cdbe12a..0089e501fa2e43c10a1d530110d1fa5f38144cd9 100644
*** a/src/backend/executor/nodeValuesscan.c
--- b/src/backend/executor/nodeValuesscan.c
***************
*** 25,30 ****
--- 25,31 ----
#include "executor/executor.h"
#include "executor/nodeValuesscan.h"
+ #include "parser/parsetree.h"
static TupleTableSlot *ValuesNext(ValuesScanState *node);
*************** ValuesScanState *
*** 188,193 ****
--- 189,196 ----
ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
{
ValuesScanState *scanstate;
+ RangeTblEntry *rte = rt_fetch(node->scan.scanrelid,
+ estate->es_range_table);
TupleDesc tupdesc;
ListCell *vtl;
int i;
*************** ExecInitValuesScan(ValuesScan *node, ESt
*** 239,245 ****
/*
* get info about values list
*/
! tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists));
ExecAssignScanType(&scanstate->ss, tupdesc);
--- 242,249 ----
/*
* get info about values list
*/
! tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists),
! rte->eref->colnames);
ExecAssignScanType(&scanstate->ss, tupdesc);
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index bdd499bea662d405fc6522c036c53955c0a2e3f9..0d69a34e12bd224396019c37b20cdcac85d73339 100644
*** a/src/include/executor/executor.h
--- b/src/include/executor/executor.h
*************** extern TupleTableSlot *ExecInitNullTuple
*** 256,262 ****
TupleDesc tupType);
extern TupleDesc ExecTypeFromTL(List *targetList, bool hasoid);
extern TupleDesc ExecCleanTypeFromTL(List *targetList, bool hasoid);
! extern TupleDesc ExecTypeFromExprList(List *exprList);
extern void UpdateChangedParamSet(PlanState *node, Bitmapset *newchg);
typedef struct TupOutputState
--- 256,262 ----
TupleDesc tupType);
extern TupleDesc ExecTypeFromTL(List *targetList, bool hasoid);
extern TupleDesc ExecCleanTypeFromTL(List *targetList, bool hasoid);
! extern TupleDesc ExecTypeFromExprList(List *exprList, List *namesList);
extern void UpdateChangedParamSet(PlanState *node, Bitmapset *newchg);
typedef struct TupOutputState