88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.148 2003/10/11 18:04:25 momjian Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.149 2003/10/12 23:19:21 momjian Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
@@ -699,7 +699,8 @@ ExecMakeFunctionResult(FuncExprState *fcache,
699699List * arguments = fcache -> args ;
700700Datum result ;
701701FunctionCallInfoData fcinfo ;
702- ReturnSetInfo rsinfo ;/* for functions returning sets */
702+ /* for functions returning sets, must be aligned as Node, so use makeNode */
703+ ReturnSetInfo * rsinfo = makeNode (ReturnSetInfo );
703704ExprDoneCond argDone ;
704705bool hasSetArg ;
705706int i ;
@@ -746,15 +747,15 @@ ExecMakeFunctionResult(FuncExprState *fcache,
746747 */
747748if (fcache -> func .fn_retset )
748749{
749- fcinfo .resultinfo = (Node * )& rsinfo ;
750- rsinfo . type = T_ReturnSetInfo ;
751- rsinfo . econtext = econtext ;
752- rsinfo . expectedDesc = NULL ;
753- rsinfo . allowedModes = (int )SFRM_ValuePerCall ;
754- rsinfo . returnMode = SFRM_ValuePerCall ;
750+ fcinfo .resultinfo = (Node * )rsinfo ;
751+ rsinfo -> type = T_ReturnSetInfo ;
752+ rsinfo -> econtext = econtext ;
753+ rsinfo -> expectedDesc = NULL ;
754+ rsinfo -> allowedModes = (int )SFRM_ValuePerCall ;
755+ rsinfo -> returnMode = SFRM_ValuePerCall ;
755756/* isDone is filled below */
756- rsinfo . setResult = NULL ;
757- rsinfo . setDesc = NULL ;
757+ rsinfo -> setResult = NULL ;
758+ rsinfo -> setDesc = NULL ;
758759}
759760
760761/*
@@ -803,10 +804,10 @@ ExecMakeFunctionResult(FuncExprState *fcache,
803804if (callit )
804805{
805806fcinfo .isnull = false;
806- rsinfo . isDone = ExprSingleResult ;
807+ rsinfo -> isDone = ExprSingleResult ;
807808result = FunctionCallInvoke (& fcinfo );
808809* isNull = fcinfo .isnull ;
809- * isDone = rsinfo . isDone ;
810+ * isDone = rsinfo -> isDone ;
810811}
811812else
812813{
@@ -903,7 +904,7 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
903904TupleDesc tupdesc = NULL ;
904905Oid funcrettype ;
905906FunctionCallInfoData fcinfo ;
906- ReturnSetInfo rsinfo ;
907+ ReturnSetInfo * rsinfo = makeNode ( ReturnSetInfo ); /* must be Node aligned */
907908MemoryContext callerContext ;
908909MemoryContext oldcontext ;
909910TupleTableSlot * slot ;
@@ -992,15 +993,15 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
992993 * doesn't actually get to see the resultinfo, but set it up anyway
993994 * because we use some of the fields as our own state variables.
994995 */
995- fcinfo .resultinfo = (Node * )& rsinfo ;
996- rsinfo . type = T_ReturnSetInfo ;
997- rsinfo . econtext = econtext ;
998- rsinfo . expectedDesc = expectedDesc ;
999- rsinfo . allowedModes = (int ) (SFRM_ValuePerCall |SFRM_Materialize );
1000- rsinfo . returnMode = SFRM_ValuePerCall ;
996+ fcinfo .resultinfo = (Node * )rsinfo ;
997+ rsinfo -> type = T_ReturnSetInfo ;
998+ rsinfo -> econtext = econtext ;
999+ rsinfo -> expectedDesc = expectedDesc ;
1000+ rsinfo -> allowedModes = (int ) (SFRM_ValuePerCall |SFRM_Materialize );
1001+ rsinfo -> returnMode = SFRM_ValuePerCall ;
10011002/* isDone is filled below */
1002- rsinfo . setResult = NULL ;
1003- rsinfo . setDesc = NULL ;
1003+ rsinfo -> setResult = NULL ;
1004+ rsinfo -> setDesc = NULL ;
10041005
10051006/*
10061007 * Switch to short-lived context for calling the function or
@@ -1028,17 +1029,17 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
10281029if (direct_function_call )
10291030{
10301031fcinfo .isnull = false;
1031- rsinfo . isDone = ExprSingleResult ;
1032+ rsinfo -> isDone = ExprSingleResult ;
10321033result = FunctionCallInvoke (& fcinfo );
10331034}
10341035else
10351036{
10361037result = ExecEvalExpr (funcexpr ,econtext ,
1037- & fcinfo .isnull ,& rsinfo . isDone );
1038+ & fcinfo .isnull ,& rsinfo -> isDone );
10381039}
10391040
10401041/* Which protocol does function want to use? */
1041- if (rsinfo . returnMode == SFRM_ValuePerCall )
1042+ if (rsinfo -> returnMode == SFRM_ValuePerCall )
10421043{
10431044/*
10441045 * Check for end of result set.
@@ -1047,7 +1048,7 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
10471048 * tupdesc or tuplestore (since we can't get a tupdesc in the
10481049 * function-returning-tuple case)
10491050 */
1050- if (rsinfo . isDone == ExprEndResult )
1051+ if (rsinfo -> isDone == ExprEndResult )
10511052break ;
10521053
10531054/*
@@ -1093,8 +1094,8 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
10931094}
10941095tupstore = tuplestore_begin_heap (true, false,SortMem );
10951096MemoryContextSwitchTo (oldcontext );
1096- rsinfo . setResult = tupstore ;
1097- rsinfo . setDesc = tupdesc ;
1097+ rsinfo -> setResult = tupstore ;
1098+ rsinfo -> setDesc = tupdesc ;
10981099}
10991100
11001101/*
@@ -1127,13 +1128,13 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
11271128/*
11281129 * Are we done?
11291130 */
1130- if (rsinfo . isDone != ExprMultipleResult )
1131+ if (rsinfo -> isDone != ExprMultipleResult )
11311132break ;
11321133}
1133- else if (rsinfo . returnMode == SFRM_Materialize )
1134+ else if (rsinfo -> returnMode == SFRM_Materialize )
11341135{
11351136/* check we're on the same page as the function author */
1136- if (!first_time || rsinfo . isDone != ExprSingleResult )
1137+ if (!first_time || rsinfo -> isDone != ExprSingleResult )
11371138ereport (ERROR ,
11381139(errcode (ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED ),
11391140errmsg ("table-function protocol for materialize mode was not followed" )));
@@ -1144,16 +1145,16 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
11441145ereport (ERROR ,
11451146(errcode (ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED ),
11461147errmsg ("unrecognized table-function returnMode: %d" ,
1147- (int )rsinfo . returnMode )));
1148+ (int )rsinfo -> returnMode )));
11481149
11491150first_time = false;
11501151}
11511152
11521153MemoryContextSwitchTo (callerContext );
11531154
11541155/* The returned pointers are those in rsinfo */
1155- * returnDesc = rsinfo . setDesc ;
1156- return rsinfo . setResult ;
1156+ * returnDesc = rsinfo -> setDesc ;
1157+ return rsinfo -> setResult ;
11571158}
11581159
11591160