summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorBruce Momjian2002-07-18 04:40:30 +0000
committerBruce Momjian2002-07-18 04:40:30 +0000
commit7ea5f1d7f16e9771e90c020db93d7e8a9a3b22f5 (patch)
tree60a8061dfd55853f9366d5b4aba93fc9acb84bf1 /src/backend
parenta5a8110a861285e1ae4381c17e565f446635d4c2 (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.c15
-rw-r--r--src/backend/utils/fmgr/funcapi.c19
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
*/