Index: src/backend/commands/tablecmds.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/commands/tablecmds.c,v
retrieving revision 1.88
diff -c -c -r1.88 tablecmds.c
*** src/backend/commands/tablecmds.c	11 Oct 2003 18:04:25 -0000	1.88
--- src/backend/commands/tablecmds.c	12 Oct 2003 23:10:21 -0000
***************
*** 3449,3454 ****
--- 3449,3455 ----
  							 Relation pkrel)
  {
  	HeapScanDesc scan;
+ 	TriggerData *trigdata = makeNode(TriggerData); /* must be Node aligned */
  	HeapTuple	tuple;
  	Trigger		trig;
  	List	   *list;
***************
*** 3506,3512 ****
  	while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
  	{
  		FunctionCallInfoData fcinfo;
- 		TriggerData trigdata;
  
  		/*
  		 * Make a call to the trigger function
--- 3507,3512 ----
***************
*** 3518,3537 ****
  		/*
  		 * We assume RI_FKey_check_ins won't look at flinfo...
  		 */
! 		trigdata.type = T_TriggerData;
! 		trigdata.tg_event = TRIGGER_EVENT_INSERT | TRIGGER_EVENT_ROW;
! 		trigdata.tg_relation = rel;
! 		trigdata.tg_trigtuple = tuple;
! 		trigdata.tg_newtuple = NULL;
! 		trigdata.tg_trigger = &trig;
  
! 		fcinfo.context = (Node *) &trigdata;
  
  		RI_FKey_check_ins(&fcinfo);
  	}
  
  	heap_endscan(scan);
  
  	pfree(trig.tgargs);
  }
  
--- 3518,3538 ----
  		/*
  		 * We assume RI_FKey_check_ins won't look at flinfo...
  		 */
! 		trigdata->type = T_TriggerData;
! 		trigdata->tg_event = TRIGGER_EVENT_INSERT | TRIGGER_EVENT_ROW;
! 		trigdata->tg_relation = rel;
! 		trigdata->tg_trigtuple = tuple;
! 		trigdata->tg_newtuple = NULL;
! 		trigdata->tg_trigger = &trig;
  
! 		fcinfo.context = (Node *) trigdata;
  
  		RI_FKey_check_ins(&fcinfo);
  	}
  
  	heap_endscan(scan);
  
+ 	pfree(trigdata);
  	pfree(trig.tgargs);
  }
  
Index: src/backend/executor/execQual.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/executor/execQual.c,v
retrieving revision 1.148
diff -c -c -r1.148 execQual.c
*** src/backend/executor/execQual.c	11 Oct 2003 18:04:25 -0000	1.148
--- src/backend/executor/execQual.c	12 Oct 2003 23:10:23 -0000
***************
*** 699,705 ****
  	List	   *arguments = fcache->args;
  	Datum		result;
  	FunctionCallInfoData fcinfo;
! 	ReturnSetInfo rsinfo;		/* for functions returning sets */
  	ExprDoneCond argDone;
  	bool		hasSetArg;
  	int			i;
--- 699,706 ----
  	List	   *arguments = fcache->args;
  	Datum		result;
  	FunctionCallInfoData fcinfo;
! 	/* for functions returning sets, must be aligned as Node, so use makeNode */
! 	ReturnSetInfo *rsinfo = makeNode(ReturnSetInfo);
  	ExprDoneCond argDone;
  	bool		hasSetArg;
  	int			i;
***************
*** 746,760 ****
  	 */
  	if (fcache->func.fn_retset)
  	{
! 		fcinfo.resultinfo = (Node *) &rsinfo;
! 		rsinfo.type = T_ReturnSetInfo;
! 		rsinfo.econtext = econtext;
! 		rsinfo.expectedDesc = NULL;
! 		rsinfo.allowedModes = (int) SFRM_ValuePerCall;
! 		rsinfo.returnMode = SFRM_ValuePerCall;
  		/* isDone is filled below */
! 		rsinfo.setResult = NULL;
! 		rsinfo.setDesc = NULL;
  	}
  
  	/*
--- 747,761 ----
  	 */
  	if (fcache->func.fn_retset)
  	{
! 		fcinfo.resultinfo = (Node *) rsinfo;
! 		rsinfo->type = T_ReturnSetInfo;
! 		rsinfo->econtext = econtext;
! 		rsinfo->expectedDesc = NULL;
! 		rsinfo->allowedModes = (int) SFRM_ValuePerCall;
! 		rsinfo->returnMode = SFRM_ValuePerCall;
  		/* isDone is filled below */
! 		rsinfo->setResult = NULL;
! 		rsinfo->setDesc = NULL;
  	}
  
  	/*
***************
*** 803,812 ****
  			if (callit)
  			{
  				fcinfo.isnull = false;
! 				rsinfo.isDone = ExprSingleResult;
  				result = FunctionCallInvoke(&fcinfo);
  				*isNull = fcinfo.isnull;
! 				*isDone = rsinfo.isDone;
  			}
  			else
  			{
--- 804,813 ----
  			if (callit)
  			{
  				fcinfo.isnull = false;
! 				rsinfo->isDone = ExprSingleResult;
  				result = FunctionCallInvoke(&fcinfo);
  				*isNull = fcinfo.isnull;
! 				*isDone = rsinfo->isDone;
  			}
  			else
  			{
***************
*** 903,909 ****
  	TupleDesc	tupdesc = NULL;
  	Oid			funcrettype;
  	FunctionCallInfoData fcinfo;
! 	ReturnSetInfo rsinfo;
  	MemoryContext callerContext;
  	MemoryContext oldcontext;
  	TupleTableSlot *slot;
--- 904,910 ----
  	TupleDesc	tupdesc = NULL;
  	Oid			funcrettype;
  	FunctionCallInfoData fcinfo;
! 	ReturnSetInfo *rsinfo = makeNode(ReturnSetInfo); /* must be Node aligned */
  	MemoryContext callerContext;
  	MemoryContext oldcontext;
  	TupleTableSlot *slot;
***************
*** 992,1006 ****
  	 * doesn't actually get to see the resultinfo, but set it up anyway
  	 * because we use some of the fields as our own state variables.
  	 */
! 	fcinfo.resultinfo = (Node *) &rsinfo;
! 	rsinfo.type = T_ReturnSetInfo;
! 	rsinfo.econtext = econtext;
! 	rsinfo.expectedDesc = expectedDesc;
! 	rsinfo.allowedModes = (int) (SFRM_ValuePerCall | SFRM_Materialize);
! 	rsinfo.returnMode = SFRM_ValuePerCall;
  	/* isDone is filled below */
! 	rsinfo.setResult = NULL;
! 	rsinfo.setDesc = NULL;
  
  	/*
  	 * Switch to short-lived context for calling the function or
--- 993,1007 ----
  	 * doesn't actually get to see the resultinfo, but set it up anyway
  	 * because we use some of the fields as our own state variables.
  	 */
! 	fcinfo.resultinfo = (Node *) rsinfo;
! 	rsinfo->type = T_ReturnSetInfo;
! 	rsinfo->econtext = econtext;
! 	rsinfo->expectedDesc = expectedDesc;
! 	rsinfo->allowedModes = (int) (SFRM_ValuePerCall | SFRM_Materialize);
! 	rsinfo->returnMode = SFRM_ValuePerCall;
  	/* isDone is filled below */
! 	rsinfo->setResult = NULL;
! 	rsinfo->setDesc = NULL;
  
  	/*
  	 * Switch to short-lived context for calling the function or
***************
*** 1028,1044 ****
  		if (direct_function_call)
  		{
  			fcinfo.isnull = false;
! 			rsinfo.isDone = ExprSingleResult;
  			result = FunctionCallInvoke(&fcinfo);
  		}
  		else
  		{
  			result = ExecEvalExpr(funcexpr, econtext,
! 								  &fcinfo.isnull, &rsinfo.isDone);
  		}
  
  		/* Which protocol does function want to use? */
! 		if (rsinfo.returnMode == SFRM_ValuePerCall)
  		{
  			/*
  			 * Check for end of result set.
--- 1029,1045 ----
  		if (direct_function_call)
  		{
  			fcinfo.isnull = false;
! 			rsinfo->isDone = ExprSingleResult;
  			result = FunctionCallInvoke(&fcinfo);
  		}
  		else
  		{
  			result = ExecEvalExpr(funcexpr, econtext,
! 								  &fcinfo.isnull, &rsinfo->isDone);
  		}
  
  		/* Which protocol does function want to use? */
! 		if (rsinfo->returnMode == SFRM_ValuePerCall)
  		{
  			/*
  			 * Check for end of result set.
***************
*** 1047,1053 ****
  			 * tupdesc or tuplestore (since we can't get a tupdesc in the
  			 * function-returning-tuple case)
  			 */
! 			if (rsinfo.isDone == ExprEndResult)
  				break;
  
  			/*
--- 1048,1054 ----
  			 * tupdesc or tuplestore (since we can't get a tupdesc in the
  			 * function-returning-tuple case)
  			 */
! 			if (rsinfo->isDone == ExprEndResult)
  				break;
  
  			/*
***************
*** 1093,1100 ****
  				}
  				tupstore = tuplestore_begin_heap(true, false, SortMem);
  				MemoryContextSwitchTo(oldcontext);
! 				rsinfo.setResult = tupstore;
! 				rsinfo.setDesc = tupdesc;
  			}
  
  			/*
--- 1094,1101 ----
  				}
  				tupstore = tuplestore_begin_heap(true, false, SortMem);
  				MemoryContextSwitchTo(oldcontext);
! 				rsinfo->setResult = tupstore;
! 				rsinfo->setDesc = tupdesc;
  			}
  
  			/*
***************
*** 1127,1139 ****
  			/*
  			 * Are we done?
  			 */
! 			if (rsinfo.isDone != ExprMultipleResult)
  				break;
  		}
! 		else if (rsinfo.returnMode == SFRM_Materialize)
  		{
  			/* check we're on the same page as the function author */
! 			if (!first_time || rsinfo.isDone != ExprSingleResult)
  				ereport(ERROR,
  						(errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
  						 errmsg("table-function protocol for materialize mode was not followed")));
--- 1128,1140 ----
  			/*
  			 * Are we done?
  			 */
! 			if (rsinfo->isDone != ExprMultipleResult)
  				break;
  		}
! 		else if (rsinfo->returnMode == SFRM_Materialize)
  		{
  			/* check we're on the same page as the function author */
! 			if (!first_time || rsinfo->isDone != ExprSingleResult)
  				ereport(ERROR,
  						(errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
  						 errmsg("table-function protocol for materialize mode was not followed")));
***************
*** 1144,1150 ****
  			ereport(ERROR,
  					(errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
  					 errmsg("unrecognized table-function returnMode: %d",
! 							(int) rsinfo.returnMode)));
  
  		first_time = false;
  	}
--- 1145,1151 ----
  			ereport(ERROR,
  					(errcode(ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED),
  					 errmsg("unrecognized table-function returnMode: %d",
! 							(int) rsinfo->returnMode)));
  
  		first_time = false;
  	}
***************
*** 1152,1159 ****
  	MemoryContextSwitchTo(callerContext);
  
  	/* The returned pointers are those in rsinfo */
! 	*returnDesc = rsinfo.setDesc;
! 	return rsinfo.setResult;
  }
  
  
--- 1153,1160 ----
  	MemoryContextSwitchTo(callerContext);
  
  	/* The returned pointers are those in rsinfo */
! 	*returnDesc = rsinfo->setDesc;
! 	return rsinfo->setResult;
  }
  
  
Index: src/backend/port/sysv_shmem.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/port/sysv_shmem.c,v
retrieving revision 1.19
diff -c -c -r1.19 sysv_shmem.c
*** src/backend/port/sysv_shmem.c	11 Oct 2003 18:04:25 -0000	1.19
--- src/backend/port/sysv_shmem.c	12 Oct 2003 23:10:24 -0000
***************
*** 365,371 ****
  
  	if (hdr->magic != PGShmemMagic)
  	{
! 		shmdt(hdr);
  		return NULL;			/* segment belongs to a non-Postgres app */
  	}
  
--- 365,371 ----
  
  	if (hdr->magic != PGShmemMagic)
  	{
! 		shmdt((void *)hdr);
  		return NULL;			/* segment belongs to a non-Postgres app */
  	}
  
