aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execExprInterp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execExprInterp.c')
-rw-r--r--src/backend/executor/execExprInterp.c72
1 files changed, 33 insertions, 39 deletions
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index dac514548ca..0999bba4217 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -3917,12 +3917,8 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
* generates an INT4 NULL regardless of the dropped column type).
* If we find a dropped column and cannot verify that case (1)
* holds, we have to use the slow path to check (2) for each row.
- *
- * If vartype is a domain over composite, just look through that
- * to the base composite type.
*/
- var_tupdesc = lookup_rowtype_tupdesc_domain(variable->vartype,
- -1, false);
+ var_tupdesc = lookup_rowtype_tupdesc(variable->vartype, -1);
slot_tupdesc = slot->tts_tupleDescriptor;
@@ -3959,9 +3955,8 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
/*
* Use the variable's declared rowtype as the descriptor for the
- * output values, modulo possibly assigning new column names
- * below. In particular, we *must* absorb any attisdropped
- * markings.
+ * output values. In particular, we *must* absorb any
+ * attisdropped markings.
*/
oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_query_memory);
output_tupdesc = CreateTupleDescCopy(var_tupdesc);
@@ -3979,39 +3974,38 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_query_memory);
output_tupdesc = CreateTupleDescCopy(slot->tts_tupleDescriptor);
MemoryContextSwitchTo(oldcontext);
- }
- /*
- * Construct a tuple descriptor for the composite values we'll
- * produce, and make sure its record type is "blessed". The main
- * reason to do this is to be sure that operations such as
- * row_to_json() will see the desired column names when they look up
- * the descriptor from the type information embedded in the composite
- * values.
- *
- * We already got the correct physical datatype info above, but now we
- * should try to find the source RTE and adopt its column aliases, in
- * case they are different from the original rowtype's names. For
- * example, in "SELECT foo(t) FROM tab t(x,y)", the first two columns
- * in the composite output should be named "x" and "y" regardless of
- * tab's column names.
- *
- * If we can't locate the RTE, assume the column names we've got are
- * OK. (As of this writing, the only cases where we can't locate the
- * RTE are in execution of trigger WHEN clauses, and then the Var will
- * have the trigger's relation's rowtype, so its names are fine.)
- * Also, if the creator of the RTE didn't bother to fill in an eref
- * field, assume our column names are OK. (This happens in COPY, and
- * perhaps other places.)
- */
- if (econtext->ecxt_estate &&
- variable->varno <= econtext->ecxt_estate->es_range_table_size)
- {
- RangeTblEntry *rte = exec_rt_fetch(variable->varno,
- econtext->ecxt_estate);
+ /*
+ * It's possible that the input slot is a relation scan slot and
+ * so is marked with that relation's rowtype. But we're supposed
+ * to be returning RECORD, so reset to that.
+ */
+ output_tupdesc->tdtypeid = RECORDOID;
+ output_tupdesc->tdtypmod = -1;
- if (rte->eref)
- ExecTypeSetColNames(output_tupdesc, rte->eref->colnames);
+ /*
+ * We already got the correct physical datatype info above, but
+ * now we should try to find the source RTE and adopt its column
+ * aliases, since it's unlikely that the input slot has the
+ * desired names.
+ *
+ * If we can't locate the RTE, assume the column names we've got
+ * are OK. (As of this writing, the only cases where we can't
+ * locate the RTE are in execution of trigger WHEN clauses, and
+ * then the Var will have the trigger's relation's rowtype, so its
+ * names are fine.) Also, if the creator of the RTE didn't bother
+ * to fill in an eref field, assume our column names are OK. (This
+ * happens in COPY, and perhaps other places.)
+ */
+ if (econtext->ecxt_estate &&
+ variable->varno <= econtext->ecxt_estate->es_range_table_size)
+ {
+ RangeTblEntry *rte = exec_rt_fetch(variable->varno,
+ econtext->ecxt_estate);
+
+ if (rte->eref)
+ ExecTypeSetColNames(output_tupdesc, rte->eref->colnames);
+ }
}
/* Bless the tupdesc if needed, and save it in the execution state */