diff options
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execAmi.c | 11 | ||||
-rw-r--r-- | src/backend/executor/nodeFunctionscan.c | 21 | ||||
-rw-r--r-- | src/backend/executor/nodeValuesscan.c | 11 |
3 files changed, 18 insertions, 25 deletions
diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c index 68d0d54a53..3b48a5cf18 100644 --- a/src/backend/executor/execAmi.c +++ b/src/backend/executor/execAmi.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.91 2007/02/15 03:07:13 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execAmi.c,v 1.92 2007/02/19 02:23:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -444,13 +444,16 @@ ExecMayReturnRawTuples(PlanState *node) case T_IndexScanState: case T_BitmapHeapScanState: case T_TidScanState: - case T_SubqueryScanState: - case T_FunctionScanState: - case T_ValuesScanState: if (node->ps_ProjInfo == NULL) return true; break; + case T_SubqueryScanState: + /* If not projecting, look at input plan */ + if (node->ps_ProjInfo == NULL) + return ExecMayReturnRawTuples(((SubqueryScanState *) node)->subplan); + break; + /* Non-projecting nodes */ case T_HashState: case T_MaterialState: diff --git a/src/backend/executor/nodeFunctionscan.c b/src/backend/executor/nodeFunctionscan.c index f7ca022f1c..d3d9886e3c 100644 --- a/src/backend/executor/nodeFunctionscan.c +++ b/src/backend/executor/nodeFunctionscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeFunctionscan.c,v 1.42 2007/01/05 22:19:28 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeFunctionscan.c,v 1.43 2007/02/19 02:23:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -118,7 +118,6 @@ FunctionScanState * ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) { FunctionScanState *scanstate; - RangeTblEntry *rte; Oid funcrettype; TypeFuncClass functypclass; TupleDesc tupdesc = NULL; @@ -162,16 +161,10 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) (PlanState *) scanstate); /* - * get info about function - */ - rte = rt_fetch(node->scan.scanrelid, estate->es_range_table); - Assert(rte->rtekind == RTE_FUNCTION); - - /* * Now determine if the function returns a simple or composite type, and * build an appropriate tupdesc. */ - functypclass = get_expr_result_type(rte->funcexpr, + functypclass = get_expr_result_type(node->funcexpr, &funcrettype, &tupdesc); @@ -185,7 +178,7 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) else if (functypclass == TYPEFUNC_SCALAR) { /* Base data type, i.e. scalar */ - char *attname = strVal(linitial(rte->eref->colnames)); + char *attname = strVal(linitial(node->funccolnames)); tupdesc = CreateTemplateTupleDesc(1, false); TupleDescInitEntry(tupdesc, @@ -197,9 +190,9 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) } else if (functypclass == TYPEFUNC_RECORD) { - tupdesc = BuildDescFromLists(rte->eref->colnames, - rte->funccoltypes, - rte->funccoltypmods); + tupdesc = BuildDescFromLists(node->funccolnames, + node->funccoltypes, + node->funccoltypmods); } else { @@ -221,7 +214,7 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) * Other node-specific setup */ scanstate->tuplestorestate = NULL; - scanstate->funcexpr = ExecInitExpr((Expr *) rte->funcexpr, + scanstate->funcexpr = ExecInitExpr((Expr *) node->funcexpr, (PlanState *) scanstate); scanstate->ss.ps.ps_TupFromTlist = false; diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c index d055b0160c..96e4b98a4e 100644 --- a/src/backend/executor/nodeValuesscan.c +++ b/src/backend/executor/nodeValuesscan.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeValuesscan.c,v 1.5 2007/01/05 22:19:28 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeValuesscan.c,v 1.6 2007/02/19 02:23:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -182,7 +182,6 @@ ValuesScanState * ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags) { ValuesScanState *scanstate; - RangeTblEntry *rte; TupleDesc tupdesc; ListCell *vtl; int i; @@ -236,9 +235,7 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags) /* * get info about values list */ - rte = rt_fetch(node->scan.scanrelid, estate->es_range_table); - Assert(rte->rtekind == RTE_VALUES); - tupdesc = ExecTypeFromExprList((List *) linitial(rte->values_lists)); + tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists)); ExecAssignScanType(&scanstate->ss, tupdesc); @@ -247,13 +244,13 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags) */ scanstate->marked_idx = -1; scanstate->curr_idx = -1; - scanstate->array_len = list_length(rte->values_lists); + scanstate->array_len = list_length(node->values_lists); /* convert list of sublists into array of sublists for easy addressing */ scanstate->exprlists = (List **) palloc(scanstate->array_len * sizeof(List *)); i = 0; - foreach(vtl, rte->values_lists) + foreach(vtl, node->values_lists) { scanstate->exprlists[i++] = (List *) lfirst(vtl); } |