From 94db74f37071984c11ce5cc33a40285a5bfeec4c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 22 Jan 2004 02:23:35 +0000 Subject: Fix oversight in optimization that avoids an unnecessary projection step when scanning a table that we need all the columns from. In case of SELECT INTO, we have to check that the hasoids flag matches the desired output type, too. Per report from Mike Mascari. --- src/backend/executor/execScan.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/backend/executor/execScan.c') diff --git a/src/backend/executor/execScan.c b/src/backend/executor/execScan.c index 07a08f3f669..b24994c8ded 100644 --- a/src/backend/executor/execScan.c +++ b/src/backend/executor/execScan.c @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.28 2003/09/25 19:41:49 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execScan.c,v 1.28.2.1 2004/01/22 02:23:35 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -23,7 +23,7 @@ #include "utils/memutils.h" -static bool tlist_matches_tupdesc(List *tlist, Index varno, TupleDesc tupdesc); +static bool tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc); /* ---------------------------------------------------------------- @@ -180,7 +180,8 @@ ExecAssignScanProjectionInfo(ScanState *node) { Scan *scan = (Scan *) node->ps.plan; - if (tlist_matches_tupdesc(scan->plan.targetlist, + if (tlist_matches_tupdesc(&node->ps, + scan->plan.targetlist, scan->scanrelid, node->ss_ScanTupleSlot->ttc_tupleDescriptor)) node->ps.ps_ProjInfo = NULL; @@ -189,11 +190,13 @@ ExecAssignScanProjectionInfo(ScanState *node) } static bool -tlist_matches_tupdesc(List *tlist, Index varno, TupleDesc tupdesc) +tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc) { int numattrs = tupdesc->natts; int attrno; + bool hasoid; + /* Check the tlist attributes */ for (attrno = 1; attrno <= numattrs; attrno++) { Form_pg_attribute att_tup = tupdesc->attrs[attrno - 1]; @@ -219,5 +222,13 @@ tlist_matches_tupdesc(List *tlist, Index varno, TupleDesc tupdesc) if (tlist) return false; /* tlist too long */ + /* + * If the plan context requires a particular hasoid setting, then + * that has to match, too. + */ + if (ExecContextForcesOids(ps, &hasoid) && + hasoid != tupdesc->tdhasoid) + return false; + return true; } -- cgit v1.2.3