8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -699,7 +699,8 @@ ExecMakeFunctionResult(FuncExprState *fcache,
699
699
List * arguments = fcache -> args ;
700
700
Datum result ;
701
701
FunctionCallInfoData 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 );
703
704
ExprDoneCond argDone ;
704
705
bool hasSetArg ;
705
706
int i ;
@@ -746,15 +747,15 @@ ExecMakeFunctionResult(FuncExprState *fcache,
746
747
*/
747
748
if (fcache -> func .fn_retset )
748
749
{
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 ;
755
756
/* isDone is filled below */
756
- rsinfo . setResult = NULL ;
757
- rsinfo . setDesc = NULL ;
757
+ rsinfo -> setResult = NULL ;
758
+ rsinfo -> setDesc = NULL ;
758
759
}
759
760
760
761
/*
@@ -803,10 +804,10 @@ ExecMakeFunctionResult(FuncExprState *fcache,
803
804
if (callit )
804
805
{
805
806
fcinfo .isnull = false;
806
- rsinfo . isDone = ExprSingleResult ;
807
+ rsinfo -> isDone = ExprSingleResult ;
807
808
result = FunctionCallInvoke (& fcinfo );
808
809
* isNull = fcinfo .isnull ;
809
- * isDone = rsinfo . isDone ;
810
+ * isDone = rsinfo -> isDone ;
810
811
}
811
812
else
812
813
{
@@ -903,7 +904,7 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
903
904
TupleDesc tupdesc = NULL ;
904
905
Oid funcrettype ;
905
906
FunctionCallInfoData fcinfo ;
906
- ReturnSetInfo rsinfo ;
907
+ ReturnSetInfo * rsinfo = makeNode ( ReturnSetInfo ); /* must be Node aligned */
907
908
MemoryContext callerContext ;
908
909
MemoryContext oldcontext ;
909
910
TupleTableSlot * slot ;
@@ -992,15 +993,15 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
992
993
* doesn't actually get to see the resultinfo, but set it up anyway
993
994
* because we use some of the fields as our own state variables.
994
995
*/
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 ;
1001
1002
/* isDone is filled below */
1002
- rsinfo . setResult = NULL ;
1003
- rsinfo . setDesc = NULL ;
1003
+ rsinfo -> setResult = NULL ;
1004
+ rsinfo -> setDesc = NULL ;
1004
1005
1005
1006
/*
1006
1007
* Switch to short-lived context for calling the function or
@@ -1028,17 +1029,17 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
1028
1029
if (direct_function_call )
1029
1030
{
1030
1031
fcinfo .isnull = false;
1031
- rsinfo . isDone = ExprSingleResult ;
1032
+ rsinfo -> isDone = ExprSingleResult ;
1032
1033
result = FunctionCallInvoke (& fcinfo );
1033
1034
}
1034
1035
else
1035
1036
{
1036
1037
result = ExecEvalExpr (funcexpr , econtext ,
1037
- & fcinfo .isnull , & rsinfo . isDone );
1038
+ & fcinfo .isnull , & rsinfo -> isDone );
1038
1039
}
1039
1040
1040
1041
/* Which protocol does function want to use? */
1041
- if (rsinfo . returnMode == SFRM_ValuePerCall )
1042
+ if (rsinfo -> returnMode == SFRM_ValuePerCall )
1042
1043
{
1043
1044
/*
1044
1045
* Check for end of result set.
@@ -1047,7 +1048,7 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
1047
1048
* tupdesc or tuplestore (since we can't get a tupdesc in the
1048
1049
* function-returning-tuple case)
1049
1050
*/
1050
- if (rsinfo . isDone == ExprEndResult )
1051
+ if (rsinfo -> isDone == ExprEndResult )
1051
1052
break ;
1052
1053
1053
1054
/*
@@ -1093,8 +1094,8 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
1093
1094
}
1094
1095
tupstore = tuplestore_begin_heap (true, false, SortMem );
1095
1096
MemoryContextSwitchTo (oldcontext );
1096
- rsinfo . setResult = tupstore ;
1097
- rsinfo . setDesc = tupdesc ;
1097
+ rsinfo -> setResult = tupstore ;
1098
+ rsinfo -> setDesc = tupdesc ;
1098
1099
}
1099
1100
1100
1101
/*
@@ -1127,13 +1128,13 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
1127
1128
/*
1128
1129
* Are we done?
1129
1130
*/
1130
- if (rsinfo . isDone != ExprMultipleResult )
1131
+ if (rsinfo -> isDone != ExprMultipleResult )
1131
1132
break ;
1132
1133
}
1133
- else if (rsinfo . returnMode == SFRM_Materialize )
1134
+ else if (rsinfo -> returnMode == SFRM_Materialize )
1134
1135
{
1135
1136
/* 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 )
1137
1138
ereport (ERROR ,
1138
1139
(errcode (ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED ),
1139
1140
errmsg ("table-function protocol for materialize mode was not followed" )));
@@ -1144,16 +1145,16 @@ ExecMakeTableFunctionResult(ExprState *funcexpr,
1144
1145
ereport (ERROR ,
1145
1146
(errcode (ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED ),
1146
1147
errmsg ("unrecognized table-function returnMode: %d" ,
1147
- (int ) rsinfo . returnMode )));
1148
+ (int ) rsinfo -> returnMode )));
1148
1149
1149
1150
first_time = false;
1150
1151
}
1151
1152
1152
1153
MemoryContextSwitchTo (callerContext );
1153
1154
1154
1155
/* The returned pointers are those in rsinfo */
1155
- * returnDesc = rsinfo . setDesc ;
1156
- return rsinfo . setResult ;
1156
+ * returnDesc = rsinfo -> setDesc ;
1157
+ return rsinfo -> setResult ;
1157
1158
}
1158
1159
1159
1160
0 commit comments