Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oSGhg-000155-OX for pgsql-docs@arkaria.postgresql.org; Sun, 28 Aug 2022 11:43:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oSGhe-0007aw-AT for pgsql-docs@arkaria.postgresql.org; Sun, 28 Aug 2022 11:43:46 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oSGhd-0007am-Ia for pgsql-docs@lists.postgresql.org; Sun, 28 Aug 2022 11:43:46 +0000 Received: from mail-oa1-x29.google.com ([2001:4860:4864:20::29]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1oSGhU-0008I6-Jr for pgsql-docs@lists.postgresql.org; Sun, 28 Aug 2022 11:43:45 +0000 Received: by mail-oa1-x29.google.com with SMTP id 586e51a60fabf-11d2dcc31dbso7513594fac.7 for ; Sun, 28 Aug 2022 04:43:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc; bh=DThk9GVAypHR9022e5C0UYESX0m0zMXr+zIGTGCFFjc=; b=enNwmZSKQWAOFp7hocr3ZXQYSXzMe91MHnj6hP+8vrmI8KhskKZYeV3eoImVD3pczm jHXR2wzOkV6tVoFR5tbP3Nfqhw/HonQjIIaVi1C5khmapPchaciA70iFr6mMGRdnW+D2 GKD0NyahUvj3zDQ4kIgENxQt0H9m7nP55SDU919Nm3QMkKffu44+uHfPsOiDtpi+KXRE iAlT0ygs4o4f4rcK4MoT0hv5bTzaTkBLuHD0h/5WJGgrbAFNCIqoAOsSMJuTD70BQ/5R rUdfB/s57Wl7Y46ZeOBdnJbs6zoeDLQSFXhwbvQJG2iXBsPi4psETWmHb0WeIWI9GCvf 3Tnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc; bh=DThk9GVAypHR9022e5C0UYESX0m0zMXr+zIGTGCFFjc=; b=2eLbff60s9VdxNeedPoc31J5rvmEkZqaIO+pb/+wcInfVoKzEwnvjPkB1Kl5F0H5Nq WvMvLapmGUZUzDVi07AZKqnl8N8WOZjHMxJIcWWWwRzLAJhiqMz7V4TJ8IRIaA5YMN1r BB40/j7RT3QtaJtz9RyvaEh1dIyXbAHYMN2JvJBb4ERKKOS+y9vz9Nddag1Qps6tTqmZ VV7bnMSh5vq3a8qikqLC+FgBZZljJbeECU9doSNze4cdFx8HJnwbtTEL0rE4Mmtp4/rd lHCP52/fcpyahgU9DT24VkZm8GMLlXSq5SShSr78n5+nydfwR3HARMelPYs4SWRZ1EGj HD7w== X-Gm-Message-State: ACgBeo1i6RdYopRfHMOX38eIE8JRWvTJd6wE04r4L2LkCIrSdsSRH972 wHS0Cc96nhA7B6BrFp6YLrM7gUiDchExozTuhLx5P4OXBMSCQ7WwMVZhyopEddOH//yFzRo8DiE eAF/QcsIEyhYdZjUJm2vRIKlsSKyasV7gb+sGBU/ackyRJBo57GtUaxNatHmUdDBwrwCVFw7Qjo /z//ln9Rs5DlpaIJXzPuqjGyGYlVIa2QVFb/3BkzxwXsIJgFAMAPCoL4dtZwoV X-Google-Smtp-Source: AA6agR4Y5IX7z76qg9g5rPsY+phFO3O4FxSRh/mgIltMF+Cj1aC/0LNJVHMQInKxZ6R/spUkADJWlXuXa1gZrd1wSg0= X-Received: by 2002:a05:6870:348d:b0:10d:f499:93cb with SMTP id n13-20020a056870348d00b0010df49993cbmr5710848oah.224.1661687013906; Sun, 28 Aug 2022 04:43:33 -0700 (PDT) MIME-Version: 1.0 References: <166161184718.1235920.6304070286124217754@wrigleys.postgresql.org> In-Reply-To: <166161184718.1235920.6304070286124217754@wrigleys.postgresql.org> From: Simon Riggs Date: Sun, 28 Aug 2022 12:43:22 +0100 Message-ID: Subject: Re: Handling of quantity in recursive query example To: jason@banfelder.net, pgsql-docs@lists.postgresql.org Content-Type: multipart/mixed; boundary="00000000000031ae1c05e74ba8b2" X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000031ae1c05e74ba8b2 Content-Type: text/plain; charset="UTF-8" On Sat, 27 Aug 2022 at 18:04, PG Doc comments form 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/ --00000000000031ae1c05e74ba8b2 Content-Type: application/octet-stream; name="parts.sql" Content-Disposition: attachment; filename="parts.sql" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l7d9inz10 ZHJvcCB0YWJsZSBpZiBleGlzdHMgcGFydHM7CmNyZWF0ZSB0YWJsZSBwYXJ0cwoocGFydAkJdGV4 dAosc3ViX3BhcnQJdGV4dAoscXVhbnRpdHkJaW50ZWdlcgopOwppbnNlcnQgaW50byBwYXJ0cyB2 YWx1ZXMgKCdvdXJfcHJvZHVjdCcsICd3aGVlbCcsIDQpOwppbnNlcnQgaW50byBwYXJ0cyB2YWx1 ZXMgKCd3aGVlbCcsICdib2x0JywgNSk7CgotLSBFeGlzdGluZyBxdWVyeQpXSVRIIFJFQ1VSU0lW RSBpbmNsdWRlZF9wYXJ0cyhzdWJfcGFydCwgcGFydCwgcXVhbnRpdHkpIEFTICgKICAgIFNFTEVD VCBzdWJfcGFydCwgcGFydCwgcXVhbnRpdHkgRlJPTSBwYXJ0cyBXSEVSRSBwYXJ0ID0gJ291cl9w cm9kdWN0JwogIFVOSU9OIEFMTAogICAgU0VMRUNUIHAuc3ViX3BhcnQsIHAucGFydCwgcC5xdWFu dGl0eQogICAgRlJPTSBpbmNsdWRlZF9wYXJ0cyBwciwgcGFydHMgcAogICAgV0hFUkUgcC5wYXJ0 ID0gcHIuc3ViX3BhcnQKKQpTRUxFQ1Qgc3ViX3BhcnQsIFNVTShxdWFudGl0eSkgYXMgdG90YWxf cXVhbnRpdHkKRlJPTSBpbmNsdWRlZF9wYXJ0cwpHUk9VUCBCWSBzdWJfcGFydDsKCi0tIFByb3Bv c2VkIHF1ZXJ5IGNoYW5nZQpXSVRIIFJFQ1VSU0lWRSBpbmNsdWRlZF9wYXJ0cyhzdWJfcGFydCwg cGFydCwgcXVhbnRpdHkpIEFTICgKICAgIFNFTEVDVCBzdWJfcGFydCwgcGFydCwgcXVhbnRpdHkg RlJPTSBwYXJ0cyBXSEVSRSBwYXJ0ID0gJ291cl9wcm9kdWN0JwogIFVOSU9OIEFMTAogICAgU0VM RUNUIHAuc3ViX3BhcnQsIHAucGFydCwgcC5xdWFudGl0eSAqIHByLnF1YW50aXR5CiAgICBGUk9N IGluY2x1ZGVkX3BhcnRzIHByLCBwYXJ0cyBwCiAgICBXSEVSRSBwLnBhcnQgPSBwci5zdWJfcGFy dAopClNFTEVDVCBzdWJfcGFydCwgU1VNKHF1YW50aXR5KSBhcyB0b3RhbF9xdWFudGl0eQpGUk9N IGluY2x1ZGVkX3BhcnRzCkdST1VQIEJZIHN1Yl9wYXJ0Owo= --00000000000031ae1c05e74ba8b2 Content-Type: application/octet-stream; name="recursive_correction.v1.patch" Content-Disposition: attachment; filename="recursive_correction.v1.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l7d9iv6p1 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9xdWVyaWVzLnNnbWwgYi9kb2Mvc3JjL3NnbWwvcXVl cmllcy5zZ21sCmluZGV4IDUxNmZiY2JmMzcuLjE0MjhkOTlkMGYgMTAwNjQ0Ci0tLSBhL2RvYy9z cmMvc2dtbC9xdWVyaWVzLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL3F1ZXJpZXMuc2dtbApAQCAt MjE5NSw3ICsyMTk1LDcgQEAgU0VMRUNUIHN1bShuKSBGUk9NIHQ7CiBXSVRIIFJFQ1VSU0lWRSBp bmNsdWRlZF9wYXJ0cyhzdWJfcGFydCwgcGFydCwgcXVhbnRpdHkpIEFTICgKICAgICBTRUxFQ1Qg c3ViX3BhcnQsIHBhcnQsIHF1YW50aXR5IEZST00gcGFydHMgV0hFUkUgcGFydCA9ICdvdXJfcHJv ZHVjdCcKICAgVU5JT04gQUxMCi0gICAgU0VMRUNUIHAuc3ViX3BhcnQsIHAucGFydCwgcC5xdWFu dGl0eQorICAgIFNFTEVDVCBwLnN1Yl9wYXJ0LCBwLnBhcnQsIHAucXVhbnRpdHkgKiBwci5xdWFu dGl0eQogICAgIEZST00gaW5jbHVkZWRfcGFydHMgcHIsIHBhcnRzIHAKICAgICBXSEVSRSBwLnBh cnQgPSBwci5zdWJfcGFydAogKQo= --00000000000031ae1c05e74ba8b2--