mirror of https://github.com/postgres/postgres
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
This commit is contained in:
parent
8c9d34cdc4
commit
b242aba026
|
@ -2372,6 +2372,9 @@ ERROR: value 2025 out of bounds for option "siglen"
|
|||
DETAIL: Valid values are between "1" and "2024".
|
||||
create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2024));
|
||||
set enable_seqscan=off;
|
||||
-- check index compatibility handling when opclass option is specified
|
||||
alter table test_trgm alter column t type varchar(768);
|
||||
alter table test_trgm alter column t type text;
|
||||
select t,similarity(t,'qwertyu0988') as sml from test_trgm where t % 'qwertyu0988' order by sml desc, t;
|
||||
t | sml
|
||||
-------------+----------
|
||||
|
|
|
@ -52,6 +52,10 @@ create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2025));
|
|||
create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2024));
|
||||
set enable_seqscan=off;
|
||||
|
||||
-- check index compatibility handling when opclass option is specified
|
||||
alter table test_trgm alter column t type varchar(768);
|
||||
alter table test_trgm alter column t type text;
|
||||
|
||||
select t,similarity(t,'qwertyu0988') as sml from test_trgm where t % 'qwertyu0988' order by sml desc, t;
|
||||
select t,similarity(t,'gwertyu0988') as sml from test_trgm where t % 'gwertyu0988' order by sml desc, t;
|
||||
select t,similarity(t,'gwertyu1988') as sml from test_trgm where t % 'gwertyu1988' order by sml desc, t;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "catalog/index.h"
|
||||
#include "catalog/indexing.h"
|
||||
#include "catalog/pg_am.h"
|
||||
#include "catalog/pg_collation.h"
|
||||
#include "catalog/pg_constraint.h"
|
||||
#include "catalog/pg_database.h"
|
||||
#include "catalog/pg_inherits.h"
|
||||
|
@ -352,10 +353,12 @@ static bool
|
|||
CompareOpclassOptions(Datum *opts1, Datum *opts2, int natts)
|
||||
{
|
||||
int i;
|
||||
FmgrInfo fm;
|
||||
|
||||
if (!opts1 && !opts2)
|
||||
return true;
|
||||
|
||||
fmgr_info(F_ARRAY_EQ, &fm);
|
||||
for (i = 0; i < natts; i++)
|
||||
{
|
||||
Datum opt1 = opts1 ? opts1[i] : (Datum) 0;
|
||||
|
@ -371,8 +374,12 @@ CompareOpclassOptions(Datum *opts1, Datum *opts2, int natts)
|
|||
else if (opt2 == (Datum) 0)
|
||||
return false;
|
||||
|
||||
/* Compare non-NULL text[] datums. */
|
||||
if (!DatumGetBool(DirectFunctionCall2(array_eq, opt1, opt2)))
|
||||
/*
|
||||
* Compare non-NULL text[] datums. Use C collation to enforce binary
|
||||
* equivalence of texts, because we don't know anything about the
|
||||
* semantics of opclass options.
|
||||
*/
|
||||
if (!DatumGetBool(FunctionCall2Coll(&fm, C_COLLATION_OID, opt1, opt2)))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue