Handling of quantity in recursive query example

Started by PG Bug reporting formover 3 years ago3 messagesdocs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/14/queries-with.html
Description:

I believe that the second query in section 7.8.2 (Recursive Queries) should
be modified to properly account for quantities. In the recursive term,
p.quantity should be multiplied by pr.quantity:

WITH RECURSIVE included_parts(sub_part, part, quantity) AS (
SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product'
UNION ALL
SELECT p.sub_part, p.part, p.quantity * pr.quantity
FROM included_parts pr, parts p
WHERE p.part = pr.sub_part
)
SELECT sub_part, SUM(quantity) as total_quantity
FROM included_parts
GROUP BY sub_part

As currently written, if a car has four wheels, and each wheel has five
bolts, the whole example returns five bolts for the parts of a car. With the
proposed change, it will return 20 bolts.

#2Simon Riggs
simon@2ndQuadrant.com
In reply to: PG Bug reporting form (#1)
Re: Handling of quantity in recursive query example

On Sat, 27 Aug 2022 at 18:04, PG Doc comments form
<noreply@postgresql.org> wrote:

The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/14/queries-with.html
Description:

I believe that the second query in section 7.8.2 (Recursive Queries) should
be modified to properly account for quantities. In the recursive term,
p.quantity should be multiplied by pr.quantity:

WITH RECURSIVE included_parts(sub_part, part, quantity) AS (
SELECT sub_part, part, quantity FROM parts WHERE part = 'our_product'
UNION ALL
SELECT p.sub_part, p.part, p.quantity * pr.quantity
FROM included_parts pr, parts p
WHERE p.part = pr.sub_part
)
SELECT sub_part, SUM(quantity) as total_quantity
FROM included_parts
GROUP BY sub_part

As currently written, if a car has four wheels, and each wheel has five
bolts, the whole example returns five bolts for the parts of a car. With the
proposed change, it will return 20 bolts.

I agree, based on the attached test.

psql -f parts.sql

Existing
sub_part | total_quantity
----------+----------------
wheel | 4
bolt | 5
(2 rows)

Proposed change
sub_part | total_quantity
----------+----------------
wheel | 4
bolt | 20

Doc patch attached.

--
Simon Riggs http://www.EnterpriseDB.com/

Attachments:

parts.sqlapplication/octet-stream; name=parts.sqlDownload
recursive_correction.v1.patchapplication/octet-stream; name=recursive_correction.v1.patchDownload+1-1
#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Simon Riggs (#2)
Re: Handling of quantity in recursive query example

Simon Riggs <simon.riggs@enterprisedb.com> writes:

On Sat, 27 Aug 2022 at 18:04, PG Doc comments form
<noreply@postgresql.org> wrote:

As currently written, if a car has four wheels, and each wheel has five
bolts, the whole example returns five bolts for the parts of a car. With the
proposed change, it will return 20 bolts.

I agree, based on the attached test.
...
Doc patch attached.

Pushed, thanks.

regards, tom lane