diff options
| author | Neil Conway | 2008-03-25 19:26:54 +0000 |
|---|---|---|
| committer | Neil Conway | 2008-03-25 19:26:54 +0000 |
| commit | 1d812a98b47da94ad274dcac682c5d2c014aae16 (patch) | |
| tree | 6d4b51db76796e3dd7a59e7b18432bf179fe89ad /src/pl | |
| parent | 76cf067ae40d5f8c4bf95954726e0067131da84b (diff) | |
Add a new tuplestore API function, tuplestore_putvalues(). This is
identical to tuplestore_puttuple(), except it operates on arrays of
Datums + nulls rather than a fully-formed HeapTuple. In several places
that use the tuplestore API, this means we can avoid creating a
HeapTuple altogether, saving a copy.
Diffstat (limited to 'src/pl')
| -rw-r--r-- | src/pl/plperl/plperl.c | 22 | ||||
| -rw-r--r-- | src/pl/plpgsql/src/pl_exec.c | 29 |
2 files changed, 28 insertions, 23 deletions
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 452c69cec73..3ce8f60c262 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1,7 +1,7 @@ /********************************************************************** * plperl.c - perl as a procedural language for PostgreSQL * - * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.136 2008/01/23 00:55:47 adunstan Exp $ + * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.137 2008/03/25 19:26:53 neilc Exp $ * **********************************************************************/ @@ -1869,7 +1869,6 @@ plperl_return_next(SV *sv) FunctionCallInfo fcinfo; ReturnSetInfo *rsi; MemoryContext old_cxt; - HeapTuple tuple; if (!sv) return; @@ -1944,8 +1943,15 @@ plperl_return_next(SV *sv) if (prodesc->fn_retistuple) { + HeapTuple tuple; + tuple = plperl_build_tuple_result((HV *) SvRV(sv), current_call_data->attinmeta); + + /* Make sure to store the tuple in a long-lived memory context */ + MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); + tuplestore_puttuple(current_call_data->tuple_store, tuple); + MemoryContextSwitchTo(old_cxt); } else { @@ -1967,14 +1973,14 @@ plperl_return_next(SV *sv) isNull = true; } - tuple = heap_form_tuple(current_call_data->ret_tdesc, &ret, &isNull); + /* Make sure to store the tuple in a long-lived memory context */ + MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); + tuplestore_putvalues(current_call_data->tuple_store, + current_call_data->ret_tdesc, + &ret, &isNull); + MemoryContextSwitchTo(old_cxt); } - /* Make sure to store the tuple in a long-lived memory context */ - MemoryContextSwitchTo(rsi->econtext->ecxt_per_query_memory); - tuplestore_puttuple(current_call_data->tuple_store, tuple); - MemoryContextSwitchTo(old_cxt); - MemoryContextReset(current_call_data->tmp_cxt); } diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 976246f6748..25702f2a878 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.202 2008/01/01 19:46:00 momjian Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.203 2008/03/25 19:26:54 neilc Exp $ * *------------------------------------------------------------------------- */ @@ -2007,10 +2007,11 @@ static int exec_stmt_return_next(PLpgSQL_execstate *estate, PLpgSQL_stmt_return_next *stmt) { - TupleDesc tupdesc; - int natts; - HeapTuple tuple; - bool free_tuple = false; + TupleDesc tupdesc; + int natts; + MemoryContext oldcxt; + HeapTuple tuple = NULL; + bool free_tuple = false; if (!estate->retisset) ereport(ERROR, @@ -2048,9 +2049,10 @@ exec_stmt_return_next(PLpgSQL_execstate *estate, tupdesc->attrs[0]->atttypmod, isNull); - tuple = heap_form_tuple(tupdesc, &retval, &isNull); - - free_tuple = true; + oldcxt = MemoryContextSwitchTo(estate->tuple_store_cxt); + tuplestore_putvalues(estate->tuple_store, tupdesc, + &retval, &isNull); + MemoryContextSwitchTo(oldcxt); } break; @@ -2087,7 +2089,6 @@ exec_stmt_return_next(PLpgSQL_execstate *estate, default: elog(ERROR, "unrecognized dtype: %d", retvar->dtype); - tuple = NULL; /* keep compiler quiet */ break; } } @@ -2114,9 +2115,10 @@ exec_stmt_return_next(PLpgSQL_execstate *estate, tupdesc->attrs[0]->atttypmod, isNull); - tuple = heap_form_tuple(tupdesc, &retval, &isNull); - - free_tuple = true; + oldcxt = MemoryContextSwitchTo(estate->tuple_store_cxt); + tuplestore_putvalues(estate->tuple_store, tupdesc, + &retval, &isNull); + MemoryContextSwitchTo(oldcxt); exec_eval_cleanup(estate); } @@ -2125,13 +2127,10 @@ exec_stmt_return_next(PLpgSQL_execstate *estate, ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("RETURN NEXT must have a parameter"))); - tuple = NULL; /* keep compiler quiet */ } if (HeapTupleIsValid(tuple)) { - MemoryContext oldcxt; - oldcxt = MemoryContextSwitchTo(estate->tuple_store_cxt); tuplestore_puttuple(estate->tuple_store, tuple); MemoryContextSwitchTo(oldcxt); |
