Re: BUG #19524: In `contrib/btree_gist` float4/float8 GiST index operations, handling NaN values with raw C operator

From: Ayush Tiwari <ayushtiwari(dot)slg01(at)gmail(dot)com>
To: 3020001251(at)tju(dot)edu(dot)cn, pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Re: BUG #19524: In `contrib/btree_gist` float4/float8 GiST index operations, handling NaN values with raw C operator
Date: 2026-06-18 13:36:52
Message-ID: CAJTYsWXZYpz872NHTaWjAvQ2C-nFTDibzpHx9EBhPzq8Rgftmw@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hi,

On Thu, 18 Jun 2026 at 18:54, PG Bug reporting form <noreply(at)postgresql(dot)org>
wrote:

> The following bug has been logged on the website:
>
> Bug reference: 19524
> Logged by: Yuelin Wang
> Email address: 3020001251(at)tju(dot)edu(dot)cn
> PostgreSQL version: 19beta1
> Operating system: Linux (Ubuntu 24.04, x86_64)
> Description:
>
> **Component**: `contrib/btree_gist/btree_float4.c`, `btree_float8.c`,
> `btree_utils_num.c`
>
> ```sql
> CREATE EXTENSION btree_gist;
>
> -- Effect 1: EXCLUDE constraint bypass (float4)
> CREATE TABLE reservations (
> room float4,
> during tsrange,
> EXCLUDE USING gist (room WITH =, during WITH &&)
> );
> INSERT INTO reservations VALUES ('NaN'::float4, '[2025-01-01,2025-01-02)');
> INSERT INTO reservations VALUES ('NaN'::float4, '[2025-01-01,2025-01-02)');
> SELECT COUNT(*) FROM reservations;
>
> -- Effect 2: RLS bypass (float8)
> CREATE TABLE measurements (id int, val float8);
> CREATE INDEX ON measurements USING gist (val);
> INSERT INTO measurements VALUES (1, 'NaN'), (2, 1.5);
> ALTER TABLE measurements ENABLE ROW LEVEL SECURITY;
> ALTER TABLE measurements FORCE ROW LEVEL SECURITY;
> CREATE POLICY hide_nan ON measurements FOR SELECT USING (val !=
> 'NaN'::float8);
> CREATE ROLE lowpriv LOGIN;
> GRANT SELECT ON measurements TO lowpriv;
> SET ROLE lowpriv;
> SET enable_seqscan = off;
> SET enable_bitmapscan = off;
> SELECT * FROM measurements ORDER BY id;
> RESET ROLE;
>
> -- Effect 3: index corruption after page split (float8)
> CREATE TABLE t (val float8);
> CREATE INDEX ON t USING gist (val);
> INSERT INTO t SELECT 'NaN'::float8 FROM generate_series(1, 2000);
> SET enable_indexscan = off; SET enable_bitmapscan = off;
> SELECT COUNT(*) AS seqscan_count FROM t WHERE val = 'NaN';
> RESET ALL;
> SET enable_seqscan = off; SET enable_bitmapscan = off;
> SELECT COUNT(*) AS indexscan_count FROM t WHERE val = 'NaN';
> RESET ALL;
> ```
>
> Expected vs actual output:
>
> | Query | Expected | Actual |
> |---|---|---|
> | `SELECT COUNT(*) FROM reservations` | `1` (second insert blocked by
> EXCLUDE) | `2` |
> | `SELECT * FROM measurements ORDER BY id` (lowpriv, index scan) | `(2,
> 1.5)` only | `(1, NaN)` and `(2, 1.5)` |
> | `seqscan_count` (Effect 3, seq scan forced) | `2000` | `2000` |
> | `indexscan_count` (Effect 3, index scan forced) | `2000` | `0` |
>
>
This looks the same as:
https://www.postgresql.org/message-id/19501-3bff3bbc97f1e7c9%40postgresql.org
Could you please check.

Regards,
Ayush

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Ayush Tiwari 2026-06-18 13:48:03 Re: BUG #19524: In `contrib/btree_gist` float4/float8 GiST index operations, handling NaN values with raw C operator
Previous Message Matheus Alcantara 2026-06-18 12:13:57 Re: BUG #19480: PL/Python SRF crashes (SIGSEGV) when function is replaced mid-iteration: use-after-free in PLy_funct