Re: BUG #18692: Segmentation fault when extending a varchar column with a gist index with custom signal length
Alexander Korotkov <aekorotkov@gmail.com>
From: Alexander Korotkov <aekorotkov@gmail.com>
To: Tender Wang <tndrwang@gmail.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, nicolas.maus@bertelsmann.de, pgsql-bugs@lists.postgresql.org
Date: 2024-11-07T23:28:06Z
Lists: pgsql-bugs
Attachments
- v1-0001-Fix-arrays-comparison-in-CompareOpclassOptions.patch (application/octet-stream) patch v1-0001
On Thu, Nov 7, 2024 at 8:47 AM Tender Wang <tndrwang@gmail.com> wrote: > Alexander Korotkov <aekorotkov@gmail.com> 于2024年11月7日周四 01:15写道: >> On Wed, Nov 6, 2024 at 7:08 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: >> > PG Bug reporting form <noreply@postgresql.org> writes: >> > > When extending a varchar column with a gist index with a custom signal >> > > length the Postgres server crashes with a segmentation fault. >> > >> > What this shows is that CompareOpclassOptions has never been tested >> > at all except with null inputs. It's trying to call array_eq >> > without providing an FmgrInfo. >> > > Based on Tom's analysis, I provide a POC patch. I'm not sure if it is right > to use DEFAULT_COLLATION_OID in the patch. Thank you. But I'm not sure about DEFAULT_COLLATION_OID. The default collation could threaten binary different text'es as the same. However, they could still be different from opclass point of view. So, I think it would be safer to do binary comparison of text'es. Also, array_eq already assumes the order of elements to be the same. Therefore, we can compare two text[] just with datumIsEqual(). Attached patch implements this. I've added the check similar what is reported to pg_trgm regression test. I also tried to produce the situation when CompareOpclassOptions() returns false. However, I didn't manage to do so. Currently, the only usage scenario writes oplcass options to a query string using get_reloptions(), then parses this query and reconstructs text[] using transformRelOptions(). AFAICS, CompareOpclassOptions() should always return true in the current usage scenario is our quoting/dequoting of strings works correctly. ------ Regards, Alexander Korotkov Supabase
Commits
-
Fix arrays comparison in CompareOpclassOptions()
- 5411e821386c 13.18 landed
- 247e7647f598 14.15 landed
- 713b8546aba6 15.10 landed
- b242aba02666 16.6 landed
- a6fa869cfa4e 17.2 landed
- db22b900244d 18.0 landed