Skip to content

Commit a6fa869

Browse files
committed
Fix arrays comparison in CompareOpclassOptions()
The current code calls array_eq() and does not provide FmgrInfo. This commit provides initialization of FmgrInfo and uses C collation as the safe option for text comparison because we don't know anything about the semantics of opclass options. Backpatch to 13, where opclass options were introduced. Reported-by: Nicolas Maus Discussion: https://postgr.es/m/18692-72ea398df3ec6712%40postgresql.org Backpatch-through: 13
1 parent 91f20bc commit a6fa869

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

contrib/pg_trgm/expected/pg_trgm.out

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2372,6 +2372,9 @@ ERROR: value 2025 out of bounds for option "siglen"
23722372
DETAIL: Valid values are between "1" and "2024".
23732373
create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2024));
23742374
set enable_seqscan=off;
2375+
-- check index compatibility handling when opclass option is specified
2376+
alter table test_trgm alter column t type varchar(768);
2377+
alter table test_trgm alter column t type text;
23752378
select t,similarity(t,'qwertyu0988') as sml from test_trgm where t % 'qwertyu0988' order by sml desc, t;
23762379
t | sml
23772380
-------------+----------

contrib/pg_trgm/sql/pg_trgm.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2025));
5252
create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2024));
5353
set enable_seqscan=off;
5454

55+
-- check index compatibility handling when opclass option is specified
56+
alter table test_trgm alter column t type varchar(768);
57+
alter table test_trgm alter column t type text;
58+
5559
select t,similarity(t,'qwertyu0988') as sml from test_trgm where t % 'qwertyu0988' order by sml desc, t;
5660
select t,similarity(t,'gwertyu0988') as sml from test_trgm where t % 'gwertyu0988' order by sml desc, t;
5761
select t,similarity(t,'gwertyu1988') as sml from test_trgm where t % 'gwertyu1988' order by sml desc, t;

src/backend/commands/indexcmds.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "catalog/namespace.h"
2929
#include "catalog/pg_am.h"
3030
#include "catalog/pg_authid.h"
31+
#include "catalog/pg_collation.h"
3132
#include "catalog/pg_constraint.h"
3233
#include "catalog/pg_database.h"
3334
#include "catalog/pg_inherits.h"
@@ -359,10 +360,12 @@ static bool
359360
CompareOpclassOptions(const Datum *opts1, const Datum *opts2, int natts)
360361
{
361362
int i;
363+
FmgrInfo fm;
362364

363365
if (!opts1 && !opts2)
364366
return true;
365367

368+
fmgr_info(F_ARRAY_EQ, &fm);
366369
for (i = 0; i < natts; i++)
367370
{
368371
Datum opt1 = opts1 ? opts1[i] : (Datum) 0;
@@ -378,8 +381,12 @@ CompareOpclassOptions(const Datum *opts1, const Datum *opts2, int natts)
378381
else if (opt2 == (Datum) 0)
379382
return false;
380383

381-
/* Compare non-NULL text[] datums. */
382-
if (!DatumGetBool(DirectFunctionCall2(array_eq, opt1, opt2)))
384+
/*
385+
* Compare non-NULL text[] datums. Use C collation to enforce binary
386+
* equivalence of texts, because we don't know anything about the
387+
* semantics of opclass options.
388+
*/
389+
if (!DatumGetBool(FunctionCall2Coll(&fm, C_COLLATION_OID, opt1, opt2)))
383390
return false;
384391
}
385392

0 commit comments

Comments
 (0)