0001-fix-var_is_nonnullable-returning-old-new.patch

application/octet-stream

Filename: 0001-fix-var_is_nonnullable-returning-old-new.patch
Type: application/octet-stream
Part: 1
Message: Bug: var_is_nonnullable() gives wrong results for old/new in RETURNING

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
Series: patch 0001
File+
src/backend/optimizer/util/clauses.c 9 0
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 9fb266d0..f290a439 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -4631,6 +4631,15 @@ var_is_nonnullable(PlannerInfo *root, Var *var, NotNullSource source)
 	if (var->varlevelsup != 0)
 		return false;
 
+	/*
+	 * A Var with VAR_RETURNING_OLD or VAR_RETURNING_NEW refers to the OLD or
+	 * NEW tuple in a RETURNING list.  Such a Var can be NULL even if the
+	 * underlying column is defined NOT NULL, because the OLD tuple doesn't
+	 * exist for INSERT and the NEW tuple doesn't exist for DELETE.
+	 */
+	if (var->varreturningtype != VAR_RETURNING_DEFAULT)
+		return false;
+
 	/* could the Var be nulled by any outer joins or grouping sets? */
 	if (!bms_is_empty(var->varnullingrels))
 		return false;