From cde0c44dd7f0587324abfa1d7dcdfb7af5e82739 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 5 Dec 2000 22:03:57 +0000 Subject: [PATCH] In SELECT FOR UPDATE, silently ignore null CTIDs, rather than generating an error as we used to. In an OUTER JOIN scenario, retrieving a null CTID from one of the input relations is entirely expected. We still want to lock the input rows from the other relations, so just ignore the null and keep going. --- src/backend/executor/execMain.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index d5102efefb..febd4c41d5 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -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)); -- 2.39.5