Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdb22b90

Browse files
committed
Fix arrays comparison in CompareOpclassOptions()
The current code calls array_eq() and does not provide FmgrInfo. This commitprovides initialization of FmgrInfo and uses C collation as the safe optionfor text comparison because we don't know anything about the semantics ofopclass options.Backpatch to 13, where opclass options were introduced.Reported-by: Nicolas MausDiscussion:https://postgr.es/m/18692-72ea398df3ec6712%40postgresql.orgBackpatch-through: 13
1 parent73c9f91 commitdb22b90

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
createindextrgm_idxon 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+
altertable test_trgm alter column t typevarchar(768);
57+
altertable test_trgm alter column t typetext;
58+
5559
select t,similarity(t,'qwertyu0988')as smlfrom test_trgmwhere t %'qwertyu0988'order by smldesc, t;
5660
select t,similarity(t,'gwertyu0988')as smlfrom test_trgmwhere t %'gwertyu0988'order by smldesc, t;
5761
select t,similarity(t,'gwertyu1988')as smlfrom test_trgmwhere t %'gwertyu1988'order by smldesc, t;

‎src/backend/commands/indexcmds.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include"catalog/namespace.h"
3030
#include"catalog/pg_am.h"
3131
#include"catalog/pg_authid.h"
32+
#include"catalog/pg_collation.h"
3233
#include"catalog/pg_constraint.h"
3334
#include"catalog/pg_database.h"
3435
#include"catalog/pg_inherits.h"
@@ -362,10 +363,12 @@ static bool
362363
CompareOpclassOptions(constDatum*opts1,constDatum*opts2,intnatts)
363364
{
364365
inti;
366+
FmgrInfofm;
365367

366368
if (!opts1&& !opts2)
367369
return true;
368370

371+
fmgr_info(F_ARRAY_EQ,&fm);
369372
for (i=0;i<natts;i++)
370373
{
371374
Datumopt1=opts1 ?opts1[i] : (Datum)0;
@@ -381,8 +384,12 @@ CompareOpclassOptions(const Datum *opts1, const Datum *opts2, int natts)
381384
elseif (opt2== (Datum)0)
382385
return false;
383386

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp