Re: BUG #19412: Wrong query result with not null constraint - Mailing list pgsql-bugs

From Richard Guo
Subject Re: BUG #19412: Wrong query result with not null constraint
Date
Msg-id CAMbWs49kVgb_wS4VFuQpfZ+Re4tWVn7vmheR6HqKppnNuEaH-g@mail.gmail.com
Whole thread Raw
In response to Re: BUG #19412: Wrong query result with not null constraint  (David Rowley <dgrowleyml@gmail.com>)
Responses Re: BUG #19412: Wrong query result with not null constraint
List pgsql-bugs
On Wed, Feb 18, 2026 at 7:54 AM David Rowley <dgrowleyml@gmail.com> wrote:
> On Wed, 18 Feb 2026 at 00:31, PG Bug reporting form
> <noreply@postgresql.org> wrote:
> > create table a (id int, x_id int, y_id int);
> > insert into a values (1, 1, 1), (1, 2, 2), (1, 3, 3);
> > create table x (id int, nm text, constraint pk_x_id primary key (id));
> > insert into x values (1, 'x1'), (2, 'x2'), (3, 'x3');
> > create table y (id int, nm text, constraint pk_y_id primary key (id));
> > insert into y values (1, 'y1'), (3, 'y3'), (4, 'y4');
> >
> > select a.id, z.id
> > from a
> > join x on x.id = a.x_id
> > left join y on y.id = a.y_id
> > join lateral(select x.id
> >              union all
> >              select y.id) z on z.id is not null;

> Thanks for the reproducer.
>
> I'd say that y.id Var in the lateral join should be getting marked as
> nullable by the left join, but it's not being marked as nullable by
> anything.

Exactly.  I think this is because when adjust_appendrel_attrs_mutator
propagates the nullingrel bits from the parent rel's Var into the
translated Var, it loses the translated Var's original bits.  Instead
of overwriting the translated Var's nullingrels, I think we should
merge them.

--- a/src/backend/optimizer/util/appendinfo.c
+++ b/src/backend/optimizer/util/appendinfo.c
@@ -291,8 +291,11 @@ adjust_appendrel_attrs_mutator(Node *node,
                 var->varattno, get_rel_name(appinfo->parent_reloid));
        if (IsA(newnode, Var))
        {
-           ((Var *) newnode)->varreturningtype = var->varreturningtype;
-           ((Var *) newnode)->varnullingrels = var->varnullingrels;
+           Var    *newvar = (Var *) newnode;
+
+           newvar->varreturningtype = var->varreturningtype;
+           newvar->varnullingrels = bms_add_members(newvar->varnullingrels,
+                                                    var->varnullingrels);
        }

- Richard



pgsql-bugs by date:

Previous
From: Matt Carter
Date:
Subject: RE: BUG #19411: libpq 16.x exhibits a memory leak when connections are repeatedly created and destroyed
Next
From: VASUKI M
Date:
Subject: Re: BUG #19095: Test if function exit() is used fail when linked static