diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index d9d0265497..2c22f251e3 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -27,7 +27,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.132 2000/11/12 00:36:57 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.133 2000/12/05 22:03:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -994,6 +994,7 @@ lnext: ; &isNull)) elog(ERROR, "ExecutePlan: NO (junk) `ctid' was found!"); + /* shouldn't ever get a null result... */ if (isNull) elog(ERROR, "ExecutePlan: (junk) `ctid' is NULL!"); @@ -1023,9 +1024,13 @@ lnext: ; elog(ERROR, "ExecutePlan: NO (junk) `%s' was found!", erm->resname); + /* + * Unlike the UPDATE/DELETE case, a null result is + * possible here, when the referenced table is on the + * nullable side of an outer join. Ignore nulls. + */ if (isNull) - elog(ERROR, "ExecutePlan: (junk) `%s' is NULL!", - erm->resname); + continue; tuple.t_self = *((ItemPointer) DatumGetPointer(datum)); test = heap_mark4update(erm->relation, &tuple, &buffer); @@ -1038,11 +1043,8 @@ lnext: ; case HeapTupleUpdated: if (XactIsoLevel == XACT_SERIALIZABLE) - { elog(ERROR, "Can't serialize access due to concurrent update"); - return (NULL); - } - else if (!(ItemPointerEquals(&(tuple.t_self), + if (!(ItemPointerEquals(&(tuple.t_self), (ItemPointer) DatumGetPointer(datum)))) { newSlot = EvalPlanQual(estate, erm->rti, &(tuple.t_self));