Hi all,

Attached are more fixes.

Thanks,

Gavin, with Feng Tian
Index: src/backend/access/common/heaptuple.c
===================================================================
RCS file: /Users/swm/pgsql-cvs/pgsql/src/backend/access/common/heaptuple.c,v
retrieving revision 1.120
diff -c -p -r1.120 heaptuple.c
*** src/backend/access/common/heaptuple.c	1 Jan 2008 19:45:45 -0000	1.120
--- src/backend/access/common/heaptuple.c	13 Apr 2008 13:06:53 -0000
*************** heap_form_tuple(TupleDesc tupleDescripto
*** 890,896 ****
  		else if (att[i]->attlen == -1 &&
  				 att[i]->attalign == 'd' &&
  				 att[i]->attndims == 0 &&
! 				 !VARATT_IS_EXTENDED(values[i]))
  		{
  			values[i] = toast_flatten_tuple_attribute(values[i],
  													  att[i]->atttypid,
--- 890,896 ----
  		else if (att[i]->attlen == -1 &&
  				 att[i]->attalign == 'd' &&
  				 att[i]->attndims == 0 &&
! 				 !VARATT_IS_EXTENDED(DatumGetPointer(values[i])))
  		{
  			values[i] = toast_flatten_tuple_attribute(values[i],
  													  att[i]->atttypid,
*************** heap_formtuple(TupleDesc tupleDescriptor
*** 1001,1007 ****
  		else if (att[i]->attlen == -1 &&
  				 att[i]->attalign == 'd' &&
  				 att[i]->attndims == 0 &&
! 				 !VARATT_IS_EXTENDED(values[i]))
  		{
  			values[i] = toast_flatten_tuple_attribute(values[i],
  													  att[i]->atttypid,
--- 1001,1007 ----
  		else if (att[i]->attlen == -1 &&
  				 att[i]->attalign == 'd' &&
  				 att[i]->attndims == 0 &&
! 				 !VARATT_IS_EXTENDED(DatumGetPointer(values[i])))
  		{
  			values[i] = toast_flatten_tuple_attribute(values[i],
  													  att[i]->atttypid,
Index: src/backend/access/common/indextuple.c
===================================================================
RCS file: /Users/swm/pgsql-cvs/pgsql/src/backend/access/common/indextuple.c,v
retrieving revision 1.85
diff -c -p -r1.85 indextuple.c
*** src/backend/access/common/indextuple.c	1 Jan 2008 19:45:45 -0000	1.85
--- src/backend/access/common/indextuple.c	13 Apr 2008 18:16:44 -0000
*************** index_form_tuple(TupleDesc tupleDescript
*** 73,79 ****
  		 * If value is stored EXTERNAL, must fetch it so we are not depending
  		 * on outside storage.	This should be improved someday.
  		 */
! 		if (VARATT_IS_EXTERNAL(values[i]))
  		{
  			untoasted_values[i] =
  				PointerGetDatum(heap_tuple_fetch_attr((struct varlena *)
--- 73,79 ----
  		 * If value is stored EXTERNAL, must fetch it so we are not depending
  		 * on outside storage.	This should be improved someday.
  		 */
! 		if (VARATT_IS_EXTERNAL(DatumGetPointer(values[i])))
  		{
  			untoasted_values[i] =
  				PointerGetDatum(heap_tuple_fetch_attr((struct varlena *)
*************** index_form_tuple(TupleDesc tupleDescript
*** 85,92 ****
  		 * If value is above size target, and is of a compressible datatype,
  		 * try to compress it in-line.
  		 */
! 		if (!VARATT_IS_EXTENDED(untoasted_values[i]) &&
! 			VARSIZE(untoasted_values[i]) > TOAST_INDEX_TARGET &&
  			(att->attstorage == 'x' || att->attstorage == 'm'))
  		{
  			Datum		cvalue = toast_compress_datum(untoasted_values[i]);
--- 85,92 ----
  		 * If value is above size target, and is of a compressible datatype,
  		 * try to compress it in-line.
  		 */
! 		if (!VARATT_IS_EXTENDED(DatumGetPointer(untoasted_values[i])) &&
! 			VARSIZE(DatumGetPointer(untoasted_values[i])) > TOAST_INDEX_TARGET &&
  			(att->attstorage == 'x' || att->attstorage == 'm'))
  		{
  			Datum		cvalue = toast_compress_datum(untoasted_values[i]);
Index: src/backend/access/common/printtup.c
===================================================================
RCS file: /Users/swm/pgsql-cvs/pgsql/src/backend/access/common/printtup.c,v
retrieving revision 1.101
diff -c -p -r1.101 printtup.c
*** src/backend/access/common/printtup.c	1 Jan 2008 19:45:45 -0000	1.101
--- src/backend/access/common/printtup.c	13 Apr 2008 13:14:52 -0000
*************** printtup(TupleTableSlot *slot, DestRecei
*** 340,346 ****
  		}
  
  		/* Clean up detoasted copy, if any */
! 		if (attr != origattr)
  			pfree(DatumGetPointer(attr));
  	}
  
--- 340,346 ----
  		}
  
  		/* Clean up detoasted copy, if any */
! 		if (DatumGetPointer(attr) != DatumGetPointer(origattr))
  			pfree(DatumGetPointer(attr));
  	}
  
*************** printtup_20(TupleTableSlot *slot, DestRe
*** 423,429 ****
  		pfree(outputstr);
  
  		/* Clean up detoasted copy, if any */
! 		if (attr != origattr)
  			pfree(DatumGetPointer(attr));
  	}
  
--- 423,429 ----
  		pfree(outputstr);
  
  		/* Clean up detoasted copy, if any */
! 		if (DatumGetPointer(attr) != DatumGetPointer(origattr))
  			pfree(DatumGetPointer(attr));
  	}
  
*************** debugtup(TupleTableSlot *slot, DestRecei
*** 537,543 ****
  		pfree(value);
  
  		/* Clean up detoasted copy, if any */
! 		if (attr != origattr)
  			pfree(DatumGetPointer(attr));
  	}
  	printf("\t----\n");
--- 537,543 ----
  		pfree(value);
  
  		/* Clean up detoasted copy, if any */
! 		if (DatumGetPointer(attr) != DatumGetPointer(origattr))
  			pfree(DatumGetPointer(attr));
  	}
  	printf("\t----\n");
*************** printtup_internal_20(TupleTableSlot *slo
*** 627,633 ****
  		pfree(outputbytes);
  
  		/* Clean up detoasted copy, if any */
! 		if (attr != origattr)
  			pfree(DatumGetPointer(attr));
  	}
  
--- 627,633 ----
  		pfree(outputbytes);
  
  		/* Clean up detoasted copy, if any */
! 		if (DatumGetPointer(attr) != DatumGetPointer(origattr))
  			pfree(DatumGetPointer(attr));
  	}
  
Index: src/backend/access/common/reloptions.c
===================================================================
RCS file: /Users/swm/pgsql-cvs/pgsql/src/backend/access/common/reloptions.c,v
retrieving revision 1.9
diff -c -p -r1.9 reloptions.c
*** src/backend/access/common/reloptions.c	25 Mar 2008 22:42:42 -0000	1.9
--- src/backend/access/common/reloptions.c	13 Apr 2008 18:17:11 -0000
*************** transformRelOptions(Datum oldOptions, Li
*** 58,64 ****
  	astate = NULL;
  
  	/* Copy any oldOptions that aren't to be replaced */
! 	if (oldOptions != (Datum) 0)
  	{
  		ArrayType  *array = DatumGetArrayTypeP(oldOptions);
  		Datum	   *oldoptions;
--- 58,64 ----
  	astate = NULL;
  
  	/* Copy any oldOptions that aren't to be replaced */
! 	if (PointerIsValid(DatumGetPointer(oldOptions)))
  	{
  		ArrayType  *array = DatumGetArrayTypeP(oldOptions);
  		Datum	   *oldoptions;
*************** untransformRelOptions(Datum options)
*** 164,170 ****
  	int			i;
  
  	/* Nothing to do if no options */
! 	if (options == (Datum) 0)
  		return result;
  
  	array = DatumGetArrayTypeP(options);
--- 164,170 ----
  	int			i;
  
  	/* Nothing to do if no options */
! 	if (!PointerIsValid(DatumGetPointer(options)))
  		return result;
  
  	array = DatumGetArrayTypeP(options);
*************** parseRelOptions(Datum options, int numke
*** 220,226 ****
  	MemSet(values, 0, numkeywords * sizeof(char *));
  
  	/* Done if no options */
! 	if (options == (Datum) 0)
  		return;
  
  	array = DatumGetArrayTypeP(options);
--- 220,226 ----
  	MemSet(values, 0, numkeywords * sizeof(char *));
  
  	/* Done if no options */
! 	if (!PointerIsValid(DatumGetPointer(options)))
  		return;
  
  	array = DatumGetArrayTypeP(options);
*************** index_reloptions(RegProcedure amoptions,
*** 349,355 ****
  	Assert(RegProcedureIsValid(amoptions));
  
  	/* Assume function is strict */
! 	if (reloptions == (Datum) 0)
  		return NULL;
  
  	/* Can't use OidFunctionCallN because we might get a NULL result */
--- 349,355 ----
  	Assert(RegProcedureIsValid(amoptions));
  
  	/* Assume function is strict */
! 	if (!PointerIsValid(DatumGetPointer(reloptions)))
  		return NULL;
  
  	/* Can't use OidFunctionCallN because we might get a NULL result */
Index: src/backend/access/heap/tuptoaster.c
===================================================================
RCS file: /Users/swm/pgsql-cvs/pgsql/src/backend/access/heap/tuptoaster.c,v
retrieving revision 1.86
diff -c -p -r1.86 tuptoaster.c
*** src/backend/access/heap/tuptoaster.c	12 Apr 2008 23:14:21 -0000	1.86
--- src/backend/access/heap/tuptoaster.c	13 Apr 2008 17:44:30 -0000
*************** toast_delete(Relation rel, HeapTuple old
*** 383,389 ****
  		{
  			Datum		value = toast_values[i];
  
! 			if (!toast_isnull[i] && VARATT_IS_EXTERNAL(value))
  				toast_delete_datum(rel, value);
  		}
  	}
--- 383,389 ----
  		{
  			Datum		value = toast_values[i];
  
! 			if (!toast_isnull[i] && VARATT_IS_EXTERNAL(PointerGetDatum(value)))
  				toast_delete_datum(rel, value);
  		}
  	}
*************** toast_insert_or_update(Relation rel, Hea
*** 615,623 ****
  		{
  			if (toast_action[i] != ' ')
  				continue;
! 			if (VARATT_IS_EXTERNAL(toast_values[i]))
  				continue;		/* can't happen, toast_action would be 'p' */
! 			if (VARATT_IS_COMPRESSED(toast_values[i]))
  				continue;
  			if (att[i]->attstorage != 'x' && att[i]->attstorage != 'e')
  				continue;
--- 615,623 ----
  		{
  			if (toast_action[i] != ' ')
  				continue;
! 			if (VARATT_IS_EXTERNAL(DatumGetPointer(toast_values[i])))
  				continue;		/* can't happen, toast_action would be 'p' */
! 			if (VARATT_IS_COMPRESSED(DatumGetPointer(toast_values[i])))
  				continue;
  			if (att[i]->attstorage != 'x' && att[i]->attstorage != 'e')
  				continue;
*************** toast_insert_or_update(Relation rel, Hea
*** 647,653 ****
  					pfree(DatumGetPointer(old_value));
  				toast_values[i] = new_value;
  				toast_free[i] = true;
! 				toast_sizes[i] = VARSIZE(toast_values[i]);
  				need_change = true;
  				need_free = true;
  			}
--- 647,653 ----
  					pfree(DatumGetPointer(old_value));
  				toast_values[i] = new_value;
  				toast_free[i] = true;
! 				toast_sizes[i] = VARSIZE(DatumGetPointer(toast_values[i]));
  				need_change = true;
  				need_free = true;
  			}
*************** toast_insert_or_update(Relation rel, Hea
*** 707,713 ****
  		{
  			if (toast_action[i] == 'p')
  				continue;
! 			if (VARATT_IS_EXTERNAL(toast_values[i]))
  				continue;		/* can't happen, toast_action would be 'p' */
  			if (att[i]->attstorage != 'x' && att[i]->attstorage != 'e')
  				continue;
--- 707,713 ----
  		{
  			if (toast_action[i] == 'p')
  				continue;
! 			if (VARATT_IS_EXTERNAL(DatumGetPointer(toast_values[i])))
  				continue;		/* can't happen, toast_action would be 'p' */
  			if (att[i]->attstorage != 'x' && att[i]->attstorage != 'e')
  				continue;
*************** toast_insert_or_update(Relation rel, Hea
*** 756,764 ****
  		{
  			if (toast_action[i] != ' ')
  				continue;
! 			if (VARATT_IS_EXTERNAL(toast_values[i]))
  				continue;		/* can't happen, toast_action would be 'p' */
! 			if (VARATT_IS_COMPRESSED(toast_values[i]))
  				continue;
  			if (att[i]->attstorage != 'm')
  				continue;
--- 756,764 ----
  		{
  			if (toast_action[i] != ' ')
  				continue;
! 			if (VARATT_IS_EXTERNAL(DatumGetPointer(toast_values[i])))
  				continue;		/* can't happen, toast_action would be 'p' */
! 			if (VARATT_IS_COMPRESSED(DatumGetPointer(toast_values[i])))
  				continue;
  			if (att[i]->attstorage != 'm')
  				continue;
*************** toast_insert_or_update(Relation rel, Hea
*** 786,792 ****
  				pfree(DatumGetPointer(old_value));
  			toast_values[i] = new_value;
  			toast_free[i] = true;
! 			toast_sizes[i] = VARSIZE(toast_values[i]);
  			need_change = true;
  			need_free = true;
  		}
--- 786,792 ----
  				pfree(DatumGetPointer(old_value));
  			toast_values[i] = new_value;
  			toast_free[i] = true;
! 			toast_sizes[i] = VARSIZE(DatumGetPointer(toast_values[i]));
  			need_change = true;
  			need_free = true;
  		}
*************** toast_insert_or_update(Relation rel, Hea
*** 817,823 ****
  		{
  			if (toast_action[i] == 'p')
  				continue;
! 			if (VARATT_IS_EXTERNAL(toast_values[i]))
  				continue;		/* can't happen, toast_action would be 'p' */
  			if (att[i]->attstorage != 'm')
  				continue;
--- 817,823 ----
  		{
  			if (toast_action[i] == 'p')
  				continue;
! 			if (VARATT_IS_EXTERNAL(DatumGetPointer(toast_values[i])))
  				continue;		/* can't happen, toast_action would be 'p' */
  			if (att[i]->attstorage != 'm')
  				continue;
*************** Datum
*** 1070,1079 ****
  toast_compress_datum(Datum value)
  {
  	struct varlena *tmp;
! 	int32		valsize = VARSIZE_ANY_EXHDR(value);
  
! 	Assert(!VARATT_IS_EXTERNAL(value));
! 	Assert(!VARATT_IS_COMPRESSED(value));
  
  	/*
  	 * No point in wasting a palloc cycle if value size is out of the
--- 1070,1079 ----
  toast_compress_datum(Datum value)
  {
  	struct varlena *tmp;
! 	int32		valsize = VARSIZE_ANY_EXHDR(DatumGetPointer(value));
  
! 	Assert(!VARATT_IS_EXTERNAL(DatumGetPointer(value)));
! 	Assert(!VARATT_IS_COMPRESSED(DatumGetPointer(value)));
  
  	/*
  	 * No point in wasting a palloc cycle if value size is out of the
*************** toast_compress_datum(Datum value)
*** 1095,1101 ****
  	 * header byte and no padding if the value is short enough.  So we insist
  	 * on a savings of more than 2 bytes to ensure we have a gain.
  	 */
! 	if (pglz_compress(VARDATA_ANY(value), valsize,
  					  (PGLZ_Header *) tmp, PGLZ_strategy_default) &&
  		VARSIZE(tmp) < valsize - 2)
  	{
--- 1095,1101 ----
  	 * header byte and no padding if the value is short enough.  So we insist
  	 * on a savings of more than 2 bytes to ensure we have a gain.
  	 */
! 	if (pglz_compress(VARDATA_ANY(DatumGetPointer(value)), valsize,
  					  (PGLZ_Header *) tmp, PGLZ_strategy_default) &&
  		VARSIZE(tmp) < valsize - 2)
  	{
*************** toast_save_datum(Relation rel, Datum val
*** 1141,1146 ****
--- 1141,1147 ----
  	int32		chunk_seq = 0;
  	char	   *data_p;
  	int32		data_todo;
+ 	Pointer		dval = DatumGetPointer(value);
  
  	/*
  	 * Open the toast relation and its index.  We can use the index to check
*************** toast_save_datum(Relation rel, Datum val
*** 1159,1186 ****
  	 *
  	 * va_extsize is the actual size of the data payload in the toast records.
  	 */
! 	if (VARATT_IS_SHORT(value))
  	{
! 		data_p = VARDATA_SHORT(value);
! 		data_todo = VARSIZE_SHORT(value) - VARHDRSZ_SHORT;
  		toast_pointer.va_rawsize = data_todo + VARHDRSZ;		/* as if not short */
  		toast_pointer.va_extsize = data_todo;
  	}
! 	else if (VARATT_IS_COMPRESSED(value))
  	{
! 		data_p = VARDATA(value);
! 		data_todo = VARSIZE(value) - VARHDRSZ;
  		/* rawsize in a compressed datum is just the size of the payload */
! 		toast_pointer.va_rawsize = VARRAWSIZE_4B_C(value) + VARHDRSZ;
  		toast_pointer.va_extsize = data_todo;
  		/* Assert that the numbers look like it's compressed */
  		Assert(VARATT_EXTERNAL_IS_COMPRESSED(toast_pointer));
  	}
  	else
  	{
! 		data_p = VARDATA(value);
! 		data_todo = VARSIZE(value) - VARHDRSZ;
! 		toast_pointer.va_rawsize = VARSIZE(value);
  		toast_pointer.va_extsize = data_todo;
  	}
  
--- 1160,1187 ----
  	 *
  	 * va_extsize is the actual size of the data payload in the toast records.
  	 */
! 	if (VARATT_IS_SHORT(dval))
  	{
! 		data_p = VARDATA_SHORT(dval);
! 		data_todo = VARSIZE_SHORT(dval) - VARHDRSZ_SHORT;
  		toast_pointer.va_rawsize = data_todo + VARHDRSZ;		/* as if not short */
  		toast_pointer.va_extsize = data_todo;
  	}
! 	else if (VARATT_IS_COMPRESSED(dval))
  	{
! 		data_p = VARDATA(dval);
! 		data_todo = VARSIZE(dval) - VARHDRSZ;
  		/* rawsize in a compressed datum is just the size of the payload */
! 		toast_pointer.va_rawsize = VARRAWSIZE_4B_C(dval) + VARHDRSZ;
  		toast_pointer.va_extsize = data_todo;
  		/* Assert that the numbers look like it's compressed */
  		Assert(VARATT_EXTERNAL_IS_COMPRESSED(toast_pointer));
  	}
  	else
  	{
! 		data_p = VARDATA(dval);
! 		data_todo = VARSIZE(dval) - VARHDRSZ;
! 		toast_pointer.va_rawsize = VARSIZE(dval);
  		toast_pointer.va_extsize = data_todo;
  	}
  
Index: src/backend/utils/fmgr/fmgr.c
===================================================================
RCS file: /Users/swm/pgsql-cvs/pgsql/src/backend/utils/fmgr/fmgr.c,v
retrieving revision 1.114
diff -c -p -r1.114 fmgr.c
*** src/backend/utils/fmgr/fmgr.c	25 Mar 2008 22:42:45 -0000	1.114
--- src/backend/utils/fmgr/fmgr.c	13 Apr 2008 17:55:33 -0000
*************** fmgr_oldstyle(PG_FUNCTION_ARGS)
*** 827,833 ****
  			break;
  	}
  
! 	return (Datum) returnValue;
  }
  
  
--- 827,833 ----
  			break;
  	}
  
! 	return PointerGetDatum(returnValue);
  }
  
  
*************** fmgr(Oid procedureId,...)
*** 2008,2014 ****
  					flinfo.fn_oid, n_arguments, FUNC_MAX_ARGS)));
  		va_start(pvar, procedureId);
  		for (i = 0; i < n_arguments; i++)
! 			fcinfo.arg[i] = (Datum) va_arg(pvar, char *);
  		va_end(pvar);
  	}
  
--- 2008,2014 ----
  					flinfo.fn_oid, n_arguments, FUNC_MAX_ARGS)));
  		va_start(pvar, procedureId);
  		for (i = 0; i < n_arguments; i++)
! 			fcinfo.arg[i] = PointerGetDatum(va_arg(pvar, char *));
  		va_end(pvar);
  	}
  
*************** fmgr(Oid procedureId,...)
*** 2018,2024 ****
  	if (fcinfo.isnull)
  		elog(ERROR, "function %u returned NULL", flinfo.fn_oid);
  
! 	return (char *) result;
  }
  
  
--- 2018,2024 ----
  	if (fcinfo.isnull)
  		elog(ERROR, "function %u returned NULL", flinfo.fn_oid);
  
! 	return DatumGetPointer(result);
  }
  
  
Index: src/pl/plpgsql/src/pl_exec.c
===================================================================
RCS file: /Users/swm/pgsql-cvs/pgsql/src/pl/plpgsql/src/pl_exec.c,v
retrieving revision 1.209
diff -c -p -r1.209 pl_exec.c
*** src/pl/plpgsql/src/pl_exec.c	6 Apr 2008 23:43:29 -0000	1.209
--- src/pl/plpgsql/src/pl_exec.c	13 Apr 2008 18:12:39 -0000
*************** plpgsql_exec_function(PLpgSQL_function *
*** 409,415 ****
  			 * sure it is labeled with the caller-supplied tuple type.
  			 */
  			estate.retval =
! 				PointerGetDatum(SPI_returntuple((HeapTuple) (estate.retval),
  												tupdesc));
  		}
  		else
--- 409,415 ----
  			 * sure it is labeled with the caller-supplied tuple type.
  			 */
  			estate.retval =
! 				PointerGetDatum(SPI_returntuple((HeapTuple)DatumGetPointer(estate.retval),
  												tupdesc));
  		}
  		else
*************** plpgsql_exec_trigger(PLpgSQL_function *f
*** 702,708 ****
  					(errcode(ERRCODE_DATATYPE_MISMATCH),
  					 errmsg("returned tuple structure does not match table of trigger event")));
  		/* Copy tuple to upper executor memory */
! 		rettup = SPI_copytuple((HeapTuple) (estate.retval));
  	}
  
  	/*
--- 702,708 ----
  					(errcode(ERRCODE_DATATYPE_MISMATCH),
  					 errmsg("returned tuple structure does not match table of trigger event")));
  		/* Copy tuple to upper executor memory */
! 		rettup = SPI_copytuple((HeapTuple) DatumGetPointer(estate.retval));
  	}
  
  	/*
*************** exec_stmt_return(PLpgSQL_execstate *esta
*** 1956,1962 ****
  
  					if (HeapTupleIsValid(rec->tup))
  					{
! 						estate->retval = (Datum) rec->tup;
  						estate->rettupdesc = rec->tupdesc;
  						estate->retisnull = false;
  					}
--- 1956,1962 ----
  
  					if (HeapTupleIsValid(rec->tup))
  					{
! 						estate->retval = PointerGetDatum(rec->tup);
  						estate->rettupdesc = rec->tupdesc;
  						estate->retisnull = false;
  					}
*************** exec_stmt_return(PLpgSQL_execstate *esta
*** 1968,1976 ****
  					PLpgSQL_row *row = (PLpgSQL_row *) retvar;
  
  					Assert(row->rowtupdesc);
! 					estate->retval = (Datum) make_tuple_from_row(estate, row,
! 															row->rowtupdesc);
! 					if (estate->retval == (Datum) NULL) /* should not happen */
  						elog(ERROR, "row not compatible with its own tupdesc");
  					estate->rettupdesc = row->rowtupdesc;
  					estate->retisnull = false;
--- 1968,1977 ----
  					PLpgSQL_row *row = (PLpgSQL_row *) retvar;
  
  					Assert(row->rowtupdesc);
! 					estate->retval = 
! 						PointerGetDatum(make_tuple_from_row(estate, row,
! 															row->rowtupdesc));
! 					if (DatumGetPointer(estate->retval) == NULL) /* should not happen */
  						elog(ERROR, "row not compatible with its own tupdesc");
  					estate->rettupdesc = row->rowtupdesc;
  					estate->retisnull = false;
*************** exec_stmt_return(PLpgSQL_execstate *esta
*** 1991,1997 ****
  			exec_run_select(estate, stmt->expr, 1, NULL);
  			if (estate->eval_processed > 0)
  			{
! 				estate->retval = (Datum) estate->eval_tuptable->vals[0];
  				estate->rettupdesc = estate->eval_tuptable->tupdesc;
  				estate->retisnull = false;
  			}
--- 1992,1998 ----
  			exec_run_select(estate, stmt->expr, 1, NULL);
  			if (estate->eval_processed > 0)
  			{
! 				estate->retval = PointerGetDatum(estate->eval_tuptable->vals[0]);
  				estate->rettupdesc = estate->eval_tuptable->tupdesc;
  				estate->retisnull = false;
  			}
*************** exec_set_found(PLpgSQL_execstate *estate
*** 4998,5004 ****
  	PLpgSQL_var *var;
  
  	var = (PLpgSQL_var *) (estate->datums[estate->found_varno]);
! 	var->value = (Datum) state;
  	var->isnull = false;
  }
  
--- 4999,5005 ----
  	PLpgSQL_var *var;
  
  	var = (PLpgSQL_var *) (estate->datums[estate->found_varno]);
! 	var->value = PointerGetDatum(state);
  	var->isnull = false;
  }
  
-- 
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

Reply via email to