Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tGiLR-000FR1-Tp for pgsql-general@arkaria.postgresql.org; Thu, 28 Nov 2024 17:30:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tGiKR-000B24-1w for pgsql-general@arkaria.postgresql.org; Thu, 28 Nov 2024 17:29:24 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tGiKQ-000B0U-I5 for pgsql-general@lists.postgresql.org; Thu, 28 Nov 2024 17:29:23 +0000 Received: from mail-lj1-x231.google.com ([2a00:1450:4864:20::231]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tGiKK-0001sy-Nz for pgsql-general@postgresql.org; Thu, 28 Nov 2024 17:29:22 +0000 Received: by mail-lj1-x231.google.com with SMTP id 38308e7fff4ca-2ffd711274dso17413541fa.0 for ; Thu, 28 Nov 2024 09:29:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1732814953; x=1733419753; darn=postgresql.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=q1cVHZZxJmDr63lLcSo8N3FgR/ay1nYRmo00Kdoh9yw=; b=StkuRkc3GY2kpwnWV/3T/CXGXLIKznt41V/2mJ/ePHca3sOAPdfmpps07DznALjzE4 gWaZ2SgYBujz+8eN4uMhPp3us/7b7cA++rZnFZA0c1Cs3ARo369CwSWDpV/Yk5eULaEj soaEreqZwhaGm4Bf3WzxPkfg+fGtFszarEjGjEYKiBXzRbR0ZoE95VCGkrapHHIbfToa /bV/4i+vFgikpkCpykHk4BlKzGPiMmXTYa5WbarR7S6WgE3n+1DaDF7+5YBnhcveYOxv 3PbO10ZTc+10EOwY7tCRwGmNA06opuNtG8I9eFn++aZsddWom+DW0rcSuSJpYy9Qq70a yh4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732814953; x=1733419753; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=q1cVHZZxJmDr63lLcSo8N3FgR/ay1nYRmo00Kdoh9yw=; b=SCWPnGwAEglhYSvPZeVWKwH8QZUBiAxLomrC6wCUQXBJAENQeoz20dI0kYDduelt9V zBfCtVmXIZK3olDpaL4glnzxoDnsdAFNKYQwvBRmFhGhxJEn8LjXYnC+KOxAPdxTx5ZB 5cKCI6kq819pbcD4dQ1wOqF+pb8IDG7bSrFFOPYFYduEhtFz0N73JaoYHMYHpCz5LnyR GRVRvpMvDbnSt0ARFXXIWI7HEov5o1hvbA40gE/nAMz3YGchax6MNdn/JnY06gVN3P8U 5MqE01BTC/Mkk4HWcI04sUUKS0T/ZuKvTrO/qYRm3QJOafCRDm11OJ7S+iRavWoeXh+X oHTA== X-Gm-Message-State: AOJu0Ywyi4YgvCtbXHtT1rp1jdWm94rVOkn+lqVr4HQ1BUAxOQfo2QDl ntqJ0eAJ7rSTsqxhZXddBWuozWg3sSFn8dZG+D7gpBp2zEMMqN011G5CX5KM5IF0KN0xu6pC/MN xdYxs/g9g0IhXcOZTPdCICDSOM6LF9iVk X-Gm-Gg: ASbGnctisYATXGOOW3OgQc8L0BEM8vBU86MtTc4oaTIcAs9LYqh6Gd3Uun2xkwtF6oe zSu/UhDlBQ9RI3+QHQJJns3MNMLU0h6T2 X-Google-Smtp-Source: AGHT+IEDh8hF7lCrcnX9GQnIgUba1tel45ZiQbWiovQgEVD8tY7wXy8XA1PmZDGLDmpw28MHob+tWfjQxgsBimZ4td0= X-Received: by 2002:a05:6512:39d5:b0:53d:f814:d7da with SMTP id 2adb3069b0e04-53df814d822mr862821e87.6.1732814953191; Thu, 28 Nov 2024 09:29:13 -0800 (PST) MIME-Version: 1.0 References: <2090950.1732810550@sss.pgh.pa.us> In-Reply-To: <2090950.1732810550@sss.pgh.pa.us> From: Bertrand Mamasam Date: Thu, 28 Nov 2024 18:29:01 +0100 Message-ID: Subject: Re: ERROR wrong varnullingrels (b 3) (expected (b)) with LEFT JOIN LATERAL and CTE To: pgsql-general@postgresql.org Content-Type: multipart/alternative; boundary="000000000000bf250a0627fc6bfd" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000bf250a0627fc6bfd Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Nov 28, 2024 at 5:15=E2=80=AFPM Tom Lane wrote: > Bertrand Mamasam writes: > > I get this error in PG16.5, 16.6 and 17 : > > wrong varnullingrels (b 3) (expected (b)) for Var 1/19 > > Please provide a self-contained test case. A fragmentary query > with no underlying tables is useless for investigation. > > https://wiki.postgresql.org/wiki/Guide_to_reporting_problems > Ok thank you, here is a short version of the query that works before 16.5 but not in 16.5+ anymore. ```sql CREATE TABLE testrules ( id text PRIMARY KEY, rate_percent numeric(10,3) NOT NULL DEFAULT 0.000 ); INSERT INTO "testrules"("id","rate_percent") VALUES ('EU-FR-20', 20); CREATE TABLE products_testrules ( products_id bigint, testrules_id text REFERENCES testrules(id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT products_testrules_pkey PRIMARY KEY (products_id, testrules_id) ); INSERT INTO "public"."products_testrules"("products_id","testrules_id") VALUES (52, 'EU-FR-20'); CREATE TABLE testvariants ( id BIGSERIAL PRIMARY KEY, products_id bigint ); INSERT INTO "public"."testvariants"("id","products_id") VALUES (20, 52); CREATE TABLE testprices ( id BIGSERIAL PRIMARY KEY, variants_id bigint NOT NULL, price numeric(10,4) NOT NULL ); INSERT INTO "public"."testprices"("id","variants_id","price") VALUES (645046,20,120.833); WITH tr AS ( SELECT t.id, (1 + t.rate_percent / 100) AS rate_percent FROM testrules t ) , vd AS ( SELECT v.id AS variants_id, v.products_id, p.price FROM testvariants v JOIN testprices p ON p.variants_id =3D v.id WHERE v.id =3D 20 ) SELECT vd.variants_id, vd.products_id, vd.price + (sum(COALESCE(taxes.tax_price, 0) )) as price_tax, min(COALESCE(taxes.tax_price, 0)) FROM vd LEFT JOIN LATERAL ( SELECT pt.products_id, tr.id, round(vd.price * tr.rate_percent, 4) - vd.price AS tax_price FROM tr INNER JOIN products_testrules pt ON tr.id =3D pt.testrules_id ) AS taxes ON taxes.products_id =3D vd.products_id GROUP BY vd.variants_id, vd.products_id, vd.price ; ``` In 16.4, it returns : | 20 | 52 | 144,9996 | 24,1666 | In 16.6, it throws : ERROR: wrong varnullingrels (b 3) (expected (b)) for Var 5/3 Thanks for your help. Bertrand --000000000000bf250a0627fc6bfd Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Thu, Nov 28, 2024 at 5:15=E2=80=AFPM T= om Lane <tgl@sss.pgh.pa.us> = wrote:
Bertrand Mamasam <golgote@gmail.com> writes:
> I get this error in PG16.5, 16.6 and 17 :
> wrong varnullingrels (b 3) (expected (b)) for Var 1/19

Please provide a self-contained test case.=C2=A0 A fragmentary query
with no underlying tables is useless for investigation.

https://wiki.postgresql.org/wiki/Guide_t= o_reporting_problems

Ok thank you, = here is a short version of the query that works before 16.5 but not in 16.5= + anymore.

```sql
CREATE TABLE testr= ules (
=C2=A0 =C2=A0 id text PRIMARY KEY,
=C2=A0 =C2=A0 rate_percent = numeric(10,3) NOT NULL DEFAULT 0.000
);
INSERT INTO "testrules&q= uot;("id","rate_percent") VALUES ('EU-FR-20', 2= 0);

CREATE TABLE products_testrules (
=C2=A0 =C2=A0 products_id b= igint,
=C2=A0 =C2=A0 testrules_id text REFERENCES testrules(id) ON DELET= E CASCADE ON UPDATE CASCADE,
=C2=A0 =C2=A0 CONSTRAINT products_testrules= _pkey PRIMARY KEY (products_id, testrules_id)
);
INSERT INTO "pu= blic"."products_testrules"("products_id","tes= trules_id") VALUES (52, 'EU-FR-20');

CREATE TABLE testv= ariants (
=C2=A0 =C2=A0 id BIGSERIAL PRIMARY KEY,
=C2=A0 =C2=A0 produ= cts_id bigint
);
INSERT INTO "public"."testvariants&qu= ot;("id","products_id") VALUES (20, 52);

CREATE = TABLE testprices (
=C2=A0 =C2=A0 id BIGSERIAL PRIMARY KEY,
=C2=A0 =C2= =A0 variants_id bigint NOT NULL,
=C2=A0 =C2=A0 price numeric(10,4) NOT N= ULL
);
INSERT INTO "public"."testprices"("id= ","variants_id","price")
VALUES
(645046,20,1= 20.833);

WITH tr AS (
SELECT
t.id<= /a>,
(1 + t.rate_percent / 100) AS rate_percent
FROM testrules t)
, vd AS (

=C2=A0 =C2=A0 SELECT
=C2=A0 =C2=A0
v.id AS variants_id,
=C2=A0 =C2=A0 v.products_id,
=C2= =A0 =C2=A0 p.price
=C2=A0 =C2=A0 FROM testvariants v
=C2=A0 =C2=A0 JO= IN testprices p ON p.variants_id =3D v.id
= =C2=A0 =C2=A0 WHERE
v.id =3D 20

)SELECT
vd.variants_id,
vd.products_id,
vd.price + (sum(COALE= SCE(taxes.tax_price, 0) )) as price_tax,
min(COALESCE(taxes.tax_price,= 0))
FROM
vd
LEFT =C2=A0JOIN LATERAL (

SELECT
pt= .products_id,
tr.id,
round(vd.price= * tr.rate_percent, 4) - vd.price AS tax_price
FROM tr
INNER JOIN= products_testrules pt ON tr.id =3D pt.testrul= es_id

) AS taxes ON taxes.products_id =3D vd.products_id

GRO= UP BY
vd.variants_id,
vd.products_id,
vd.price
;
`= ``

In 16.4, it returns :
| 20 | 52 = | 144,9996 | 24,1666 |

In 16.6, it throws :
ERROR: =C2=A0wrong varnullingrels (b 3) (expected (b)) for Var 5/3<= /div>

Thanks for your help.

Ber= trand
--000000000000bf250a0627fc6bfd--