diff options
| author | Bruce Momjian | 2002-07-18 04:40:30 +0000 |
|---|---|---|
| committer | Bruce Momjian | 2002-07-18 04:40:30 +0000 |
| commit | 7ea5f1d7f16e9771e90c020db93d7e8a9a3b22f5 (patch) | |
| tree | 60a8061dfd55853f9366d5b4aba93fc9acb84bf1 /src/backend | |
| parent | a5a8110a861285e1ae4381c17e565f446635d4c2 (diff) | |
Here is a patch for the Table Function API. It fixes a bug found by Neil
Conway (BuildTupleFromCStrings sets NULL for pass-by-value types when
intended value is 0). It also implements some other improvements
suggested by Neil.
Joe Conway
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/executor/execTuples.c | 15 | ||||
| -rw-r--r-- | src/backend/utils/fmgr/funcapi.c | 19 |
2 files changed, 24 insertions, 10 deletions
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 86a16ddb04f..4f234f62b94 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.53 2002/06/20 20:29:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.54 2002/07/18 04:40:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -759,6 +759,7 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values) natts = tupdesc->natts; dvalues = (Datum *) palloc(natts * sizeof(Datum)); + nulls = (char *) palloc(natts * sizeof(char)); /* Call the "in" function for each attribute */ for (i = 0; i < natts; i++) @@ -772,22 +773,18 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values) dvalues[i] = FunctionCall3(&attinfuncinfo, CStringGetDatum(values[i]), ObjectIdGetDatum(attelem), Int32GetDatum(atttypmod)); + nulls[i] = ' '; } else + { dvalues[i] = PointerGetDatum(NULL); + nulls[i] = 'n'; + } } /* * Form a tuple */ - nulls = (char *) palloc(natts * sizeof(char)); - for (i = 0; i < natts; i++) - { - if (DatumGetPointer(dvalues[i]) != NULL) - nulls[i] = ' '; - else - nulls[i] = 'n'; - } tuple = heap_formtuple(tupdesc, dvalues, nulls); return tuple; diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index bd65c3911c7..a8d4e4fb5f5 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -52,7 +52,7 @@ init_MultiFuncCall(PG_FUNCTION_ARGS) retval->call_cntr = 0; retval->max_calls = 0; retval->slot = NULL; - retval->fctx = NULL; + retval->user_fctx = NULL; retval->attinmeta = NULL; retval->fmctx = fcinfo->flinfo->fn_mcxt; @@ -76,6 +76,23 @@ init_MultiFuncCall(PG_FUNCTION_ARGS) } /* + * per_MultiFuncCall + * + * Do Multi-function per-call setup + */ +FuncCallContext * +per_MultiFuncCall(PG_FUNCTION_ARGS) +{ + FuncCallContext *retval = (FuncCallContext *) fcinfo->flinfo->fn_extra; + + /* make sure we start with a fresh slot */ + if(retval->slot != NULL) + ExecClearTuple(retval->slot); + + return retval; +} + +/* * end_MultiFuncCall * Clean up after init_MultiFuncCall */ |
