aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/executor/execMain.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index d9d02654970..2c22f251e33 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));