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.96) (envelope-from ) id 1w2rrO-000gMG-2g for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Mar 2026 14:26:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w2rrN-00BTZD-2Z for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Mar 2026 14:26:57 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w2rrN-00BTZ3-0V for pgsql-hackers@lists.postgresql.org; Wed, 18 Mar 2026 14:26:57 +0000 Received: from forward500b.mail.yandex.net ([178.154.239.144]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w2rrJ-00000000wfg-3OvJ for pgsql-hackers@lists.postgresql.org; Wed, 18 Mar 2026 14:26:56 +0000 Received: from mail-nwsmtp-smtp-production-main-74.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-74.sas.yp-c.yandex.net [IPv6:2a02:6b8:c24:1698:0:640:befc:0]) by forward500b.mail.yandex.net (Yandex) with ESMTPS id 5644BC14C5; Wed, 18 Mar 2026 17:26:52 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-74.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id pQOBSJ1G38c0-E1Af6Kks; Wed, 18 Mar 2026 17:26:51 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1773844012; bh=Iezv4Qd0NuiqdibPK+FKzUK6Lgm0TrcGJND9w2Ux6GM=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=PYyzhw2wB2NRcGpDQiPN7GHQZfATlSjSMMjM9YZKlJ+YNa6iEsRXI79pNk2aQkuhx ofgDQi2+FoctQZaro4QZ4cYZSBnF2iv1RpahyEDwBVdA006eX5yiUI1htyjkOGx9xf bTXl6c/R8MvqaY3lgusA4BmEG1cin1qDQi2iZEKA= Authentication-Results: mail-nwsmtp-smtp-production-main-74.sas.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------H3kYmtJBaDN7Qm4rf6ikTPj0" Message-ID: <83464ae9-a79a-43c8-a425-4b0773f9e759@tantorlabs.com> Date: Wed, 18 Mar 2026 17:26:51 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Reduce planning time for large NOT IN lists containing NULL To: David Rowley Cc: Zsolt Parragi , David Geier , PostgreSQL Developers References: <52596e08-0902-475b-ad0f-265ec6918f19@gmail.com> <7791ec74-369d-48c7-969c-cf4ad18024f2@tantorlabs.com> <6b3aebb5-f26c-4f50-abd6-e733d452af26@gmail.com> <52f3c637-465d-4f0e-9546-732ecf61ab87@tantorlabs.com> <3fc74079-f429-48c8-ad8c-688b21d4d1c1@gmail.com> <4c761b02-5a60-4076-aa0c-9c6fef06e2c1@tantorlabs.com> <2bdf4a7e-f5b9-4e75-b5a3-1e2608fd3297@tantorlabs.com> <390a46f3-dbc4-4dc1-b49d-5cc61dd36026@tantorlabs.com> <977365f2-2ab7-4008-8d9c-f62ef5271cea@tantorlabs.com> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------H3kYmtJBaDN7Qm4rf6ikTPj0 Content-Type: multipart/alternative; boundary="------------SH8mH5n2O0HqKWK4QOXsY0SY" --------------SH8mH5n2O0HqKWK4QOXsY0SY Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 3/18/26 07:32, David Rowley wrote: > Thanks. I've pushed 0001. > > I ended up renaming the new file to planner_est.sql as the function > handles width estimate masking too, so I thought just calling it > selectivity_est was a bit too restrictive. I went with planner_est. +1. Thank you. > That means 0002 needed rebased. I've done that in the attached. After the new test was committed, I realized that v8 tests relies on selectivity calculation, which are not guaranteed to remain stable over time and way vary depending on planner heuristics or platform differences. Therefore, it seems better to remove tests from v8. Instead, we can test the invariant behavior: when NULL is present in a <> ALL clause, the selectivity is always 0.0. The v9-patch adds three test cases: a degenerate case with only NULL, NULL combined with constants, NULL combined with both constants and non-constant expression. Thoughts? -- Best regards, Ilia Evdokimov, Tantor Labs LLC, https://tantorlabs.com/ --------------SH8mH5n2O0HqKWK4QOXsY0SY Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

On 3/18/26 07:32, David Rowley wrote:

Thanks. I've pushed 0001.

I ended up renaming the new file to planner_est.sql as the function
handles width estimate masking too, so I thought just calling it
selectivity_est was a bit too restrictive. I went with planner_est.

+1. Thank you.

That means 0002 needed rebased. I've done that in the attached.

After the new test was committed, I realized that v8 tests relies on selectivity calculation, which are not guaranteed to remain stable over time and way vary depending on planner heuristics or platform differences. Therefore, it seems better to remove tests from v8.

Instead, we can test the invariant behavior: when NULL is present in a <> ALL clause, the selectivity is always 0.0.

The v9-patch adds three test cases: a degenerate case with only NULL, NULL combined with constants, NULL combined with both constants and non-constant expression.

Thoughts?


-- 
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com/

--------------SH8mH5n2O0HqKWK4QOXsY0SY-- --------------H3kYmtJBaDN7Qm4rf6ikTPj0 Content-Type: text/x-patch; charset=UTF-8; name="v9-0001-Reduce-planning-time-for-large-NOT-IN-lists-conta.patch" Content-Disposition: attachment; filename*0="v9-0001-Reduce-planning-time-for-large-NOT-IN-lists-conta.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBjMGJhOTgxNDFjMTgzMDkwNzgzNjUzZDg4MmQyMDZhY2I3YzM4YTI5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogV2VkLCAxOCBNYXIgMjAyNiAxNzoyMzo1MCArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjldIFJlZHVjZSBwbGFubmluZyB0aW1lIGZvciBsYXJnZSBOT1Qg SU4gbGlzdHMgY29udGFpbmluZwogTlVMTAoKRm9yIHggPD4gQUxMICguLi4pLCB0aGUgcHJl c2VuY2Ugb2YgYSBOVUxMIG1ha2VzIHRoZSBzZWxlY3Rpdml0eSAwLjAuCgpUaGUgcGxhbm5l ciBjdXJyZW50bHkgc3RpbGwgaXRlcmF0ZXMgb3ZlciBhbGwgZWxlbWVudHMgYW5kIGNvbXB1 dGVzCnBlci1lbGVtZW50IHNlbGVjdGl2aXR5LCBldmVuIHRob3VnaCB0aGUgZmluYWwgcmVz dWx0IGlzIGtub3duLgoKQWRkIGFuIGVhcmx5IE5VTEwgY2hlY2sgZm9yIGNvbnN0YW50IGFy cmF5cyBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuCjAuMCB1bmRlciBBTEwgc2VtYW50aWNzLgoK VGhpcyByZWR1Y2VzIHBsYW5uaW5nIHRpbWUgZm9yIGxhcmdlIDw+IEFMTCBsaXN0cyB3aXRo b3V0CmNoYW5naW5nIHNlbWFudGljcy4KLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvc2Vs ZnVuY3MuYyAgICAgICAgICB8IDE3ICsrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3BsYW5uZXJfZXN0Lm91dCB8IDM1ICsrKysrKysrKysrKysrKysrKysrKysrCiBz cmMvdGVzdC9yZWdyZXNzL3NxbC9wbGFubmVyX2VzdC5zcWwgICAgICB8IDE2ICsrKysrKysr KysrCiAzIGZpbGVzIGNoYW5nZWQsIDY4IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9zZWxmdW5jcy5jCmluZGV4IGQ0ZGEwZThkZWE5Li4wNzNkOTNmNGYzZCAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTIwMTgsNiArMjAxOCwxNSBAQCBzY2FsYXJhcnJh eXNlbChQbGFubmVySW5mbyAqcm9vdCwKIAkJaWYgKGFycmF5aXNudWxsKQkJLyogcXVhbCBj YW4ndCBzdWNjZWVkIGlmIG51bGwgYXJyYXkgKi8KIAkJCXJldHVybiAoU2VsZWN0aXZpdHkp IDAuMDsKIAkJYXJyYXl2YWwgPSBEYXR1bUdldEFycmF5VHlwZVAoYXJyYXlkYXR1bSk7CisK KwkJLyoKKwkJICogRm9yIEFMTCBzZW1hbnRpY3MsIGlmIHRoZSBhcnJheSBjb250YWlucyBO VUxMLCBhc3N1bWUgb3BlcmF0b3IgaXMKKwkJICogc3RyaWN0LiBUaGUgU2NhbGFyQXJyYXlP cEV4cHIgY2Fubm90IGV2YWx1YXRlIHRvIFRSVUUsIHNvIHJldHVybgorCQkgKiB6ZXJvLgor CQkgKi8KKwkJaWYgKCF1c2VPciAmJiBhcnJheV9jb250YWluc19udWxscyhhcnJheXZhbCkp CisJCQlyZXR1cm4gKFNlbGVjdGl2aXR5KSAwLjA7CisKIAkJZ2V0X3R5cGxlbmJ5dmFsYWxp Z24oQVJSX0VMRU1UWVBFKGFycmF5dmFsKSwKIAkJCQkJCQkgJmVsbWxlbiwgJmVsbWJ5dmFs LCAmZWxtYWxpZ24pOwogCQlkZWNvbnN0cnVjdF9hcnJheShhcnJheXZhbCwKQEAgLTIxMTUs NiArMjEyNCwxNCBAQCBzY2FsYXJhcnJheXNlbChQbGFubmVySW5mbyAqcm9vdCwKIAkJCUxp c3QJICAgKmFyZ3M7CiAJCQlTZWxlY3Rpdml0eSBzMjsKIAorCQkJLyoKKwkJCSAqIEZvciBB TEwgc2VtYW50aWNzLCBpZiB0aGUgYXJyYXkgY29udGFpbnMgTlVMTCwgYXNzdW1lIG9wZXJh dG9yCisJCQkgKiBpcyBzdHJpY3QuIFRoZSBTY2FsYXJBcnJheU9wRXhwciBjYW5ub3QgZXZh bHVhdGUgdG8gVFJVRSwgc28KKwkJCSAqIHJldHVybiB6ZXJvLgorCQkJICovCisJCQlpZiAo IXVzZU9yICYmIElzQShlbGVtLCBDb25zdCkgJiYgKChDb25zdCAqKSBlbGVtKS0+Y29uc3Rp c251bGwpCisJCQkJcmV0dXJuIChTZWxlY3Rpdml0eSkgMC4wOworCiAJCQkvKgogCQkJICog VGhlb3JldGljYWxseSwgaWYgZWxlbSBpc24ndCBvZiBub21pbmFsX2VsZW1lbnRfdHlwZSB3 ZSBzaG91bGQKIAkJCSAqIGluc2VydCBhIFJlbGFiZWxUeXBlLCBidXQgaXQgc2VlbXMgdW5s aWtlbHkgdGhhdCBhbnkgb3BlcmF0b3IKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvcGxhbm5lcl9lc3Qub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9w bGFubmVyX2VzdC5vdXQKaW5kZXggM2E0NzA2MTgwMGEuLjYyNGQ1ODU4Njg3IDEwMDY0NAot LS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BsYW5uZXJfZXN0Lm91dAorKysgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BsYW5uZXJfZXN0Lm91dApAQCAtMTgzLDQgKzE4 MywzOSBAQCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwogIEZ1bmN0aW9uIFNjYW4gb24g Z2VuZXJhdGVfc2VyaWVzIGcgIChjb3N0PU4uLk4gcm93cz0xMDAwIHdpZHRoPU4pCiAoMSBy b3cpCiAKKy0tCistLSBUZXN0IDw+IEFMTCBiZWhhdmlvciB3aGVuIE5VTEwgYXBwZWFycyBp biB0aGUgYXJyYXkKKy0tCitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1Qg KiBGUk9NIHRlbmsxIFdIRVJFIHVuaXF1ZTEgPD4gQUxMIChBUlJBWVtOVUxMXTo6aW50ZWdl cltdKTskJCwKK3RydWUsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICBleHBsYWluX21hc2tfY29zdHMgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHRlbmsxICAoY29zdD1O Li5OIHJvd3M9MSB3aWR0aD1OKSAoYWN0dWFsIHJvd3M9MC4wMCBsb29wcz0xKQorICAgRmls dGVyOiAodW5pcXVlMSA8PiBBTEwgKCd7TlVMTH0nOjppbnRlZ2VyW10pKQorICAgUm93cyBS ZW1vdmVkIGJ5IEZpbHRlcjogMTAwMDAKKygzIHJvd3MpCisKK1NFTEVDVCBleHBsYWluX21h c2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdGVuazEgV0hFUkUgdW5pcXVlMSA8PiBBTEwg KEFSUkFZWzEsIDIsIDk5LCBOVUxMXSk7JCQsCit0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2Nh biBvbiB0ZW5rMSAgKGNvc3Q9Ti4uTiByb3dzPTEgd2lkdGg9TikgKGFjdHVhbCByb3dzPTAu MDAgbG9vcHM9MSkKKyAgIEZpbHRlcjogKHVuaXF1ZTEgPD4gQUxMICgnezEsMiw5OSxOVUxM fSc6OmludGVnZXJbXSkpCisgICBSb3dzIFJlbW92ZWQgYnkgRmlsdGVyOiAxMDAwMAorKDMg cm93cykKKworU0VMRUNUIGV4cGxhaW5fbWFza19jb3N0cygkJAorU0VMRUNUICogRlJPTSB0 ZW5rMSBXSEVSRSB1bmlxdWUxIDw+IEFMTCAoQVJSQVlbMSwgMiwgOTgsIChTRUxFQ1QgOTkp LCBOVUxMXSk7JCQsCit0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBleHBsYWluX21hc2tfY29zdHMgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg U2VxIFNjYW4gb24gdGVuazEgIChjb3N0PU4uLk4gcm93cz0xIHdpZHRoPU4pIChhY3R1YWwg cm93cz0wLjAwIGxvb3BzPTEpCisgICBGaWx0ZXI6ICh1bmlxdWUxIDw+IEFMTCAoQVJSQVlb MSwgMiwgOTgsIChJbml0UGxhbiBleHByXzEpLmNvbDEsIE5VTEw6OmludGVnZXJdKSkKKyAg IFJvd3MgUmVtb3ZlZCBieSBGaWx0ZXI6IDEwMDAwCisgICBJbml0UGxhbiBleHByXzEKKyAg ICAgLT4gIFJlc3VsdCAgKGNvc3Q9Ti4uTiByb3dzPTEgd2lkdGg9TikgKGFjdHVhbCByb3dz PTEuMDAgbG9vcHM9MSkKKyg1IHJvd3MpCisKIERST1AgRlVOQ1RJT04gZXhwbGFpbl9tYXNr X2Nvc3RzKHRleHQsIGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOwpkaWZmIC0tZ2l0IGEvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcGxhbm5lcl9lc3Quc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9z cWwvcGxhbm5lcl9lc3Quc3FsCmluZGV4IDQ3ZDVhZTY3OWM3Li42MWM5ZjY0MDc2MSAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGxhbm5lcl9lc3Quc3FsCisrKyBiL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL3BsYW5uZXJfZXN0LnNxbApAQCAtMTMxLDUgKzEzMSwyMSBA QCBTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCiBTRUxFQ1QgKiBGUk9NIGdlbmVyYXRl X3NlcmllcygyNS4wLCAyLjAsIDAuMCkgZyhzKTskJCwKIGZhbHNlLCB0cnVlLCBmYWxzZSwg dHJ1ZSk7CiAKKy0tCistLSBUZXN0IDw+IEFMTCBiZWhhdmlvciB3aGVuIE5VTEwgYXBwZWFy cyBpbiB0aGUgYXJyYXkKKy0tCisKK1NFTEVDVCBleHBsYWluX21hc2tfY29zdHMoJCQKK1NF TEVDVCAqIEZST00gdGVuazEgV0hFUkUgdW5pcXVlMSA8PiBBTEwgKEFSUkFZW05VTExdOjpp bnRlZ2VyW10pOyQkLAordHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCitTRUxFQ1QgZXhw bGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRlbmsxIFdIRVJFIHVuaXF1ZTEg PD4gQUxMIChBUlJBWVsxLCAyLCA5OSwgTlVMTF0pOyQkLAordHJ1ZSwgdHJ1ZSwgZmFsc2Us IHRydWUpOworCitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9N IHRlbmsxIFdIRVJFIHVuaXF1ZTEgPD4gQUxMIChBUlJBWVsxLCAyLCA5OCwgKFNFTEVDVCA5 OSksIE5VTExdKTskJCwKK3RydWUsIHRydWUsIGZhbHNlLCB0cnVlKTsKKwogCiBEUk9QIEZV TkNUSU9OIGV4cGxhaW5fbWFza19jb3N0cyh0ZXh0LCBib29sLCBib29sLCBib29sLCBib29s KTsKLS0gCjIuMzQuMQoK --------------H3kYmtJBaDN7Qm4rf6ikTPj0--