mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
GUC variable pg_trgm.similarity_threshold insead of set_limit()
Use GUC variable pg_trgm.similarity_threshold insead of set_limit()/show_limit() which was introduced when defining GUC varuables by modules was absent. Author: Artur Zakirov
This commit is contained in:
@ -3,11 +3,13 @@
|
||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||
\echo Use "CREATE EXTENSION pg_trgm" to load this file. \quit
|
||||
|
||||
-- Deprecated function
|
||||
CREATE FUNCTION set_limit(float4)
|
||||
RETURNS float4
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C STRICT VOLATILE;
|
||||
|
||||
-- Deprecated function
|
||||
CREATE FUNCTION show_limit()
|
||||
RETURNS float4
|
||||
AS 'MODULE_PATHNAME'
|
||||
@ -26,7 +28,7 @@ LANGUAGE C STRICT IMMUTABLE;
|
||||
CREATE FUNCTION similarity_op(text,text)
|
||||
RETURNS bool
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C STRICT STABLE; -- stable because depends on trgm_limit
|
||||
LANGUAGE C STRICT STABLE; -- stable because depends on pg_trgm.similarity_threshold
|
||||
|
||||
CREATE OPERATOR % (
|
||||
LEFTARG = text,
|
||||
|
@ -105,7 +105,7 @@ typedef char *BITVECP;
|
||||
|
||||
typedef struct TrgmPackedGraph TrgmPackedGraph;
|
||||
|
||||
extern float4 trgm_limit;
|
||||
extern double similarity_threshold;
|
||||
|
||||
extern uint32 trgm2int(trgm *ptr);
|
||||
extern void compact_trigram(trgm *tptr, char *str, int bytelen);
|
||||
|
@ -206,7 +206,9 @@ gin_trgm_consistent(PG_FUNCTION_ARGS)
|
||||
* similarity is just c / len1.
|
||||
* So, independly on DIVUNION the upper bound formula is the same.
|
||||
*/
|
||||
res = (nkeys == 0) ? false : ((((((float4) ntrue) / ((float4) nkeys))) >= trgm_limit) ? true : false);
|
||||
res = (nkeys == 0) ? false :
|
||||
((((((float4) ntrue) / ((float4) nkeys))) >= similarity_threshold)
|
||||
? true : false);
|
||||
break;
|
||||
case ILikeStrategyNumber:
|
||||
#ifndef IGNORECASE
|
||||
@ -283,7 +285,9 @@ gin_trgm_triconsistent(PG_FUNCTION_ARGS)
|
||||
/*
|
||||
* See comment in gin_trgm_consistent() about * upper bound formula
|
||||
*/
|
||||
res = (nkeys == 0) ? GIN_FALSE : (((((float4) ntrue) / ((float4) nkeys)) >= trgm_limit) ? GIN_MAYBE : GIN_FALSE);
|
||||
res = (nkeys == 0) ? GIN_FALSE :
|
||||
(((((float4) ntrue) / ((float4) nkeys)) >= similarity_threshold)
|
||||
? GIN_MAYBE : GIN_FALSE);
|
||||
break;
|
||||
case ILikeStrategyNumber:
|
||||
#ifndef IGNORECASE
|
||||
|
@ -294,7 +294,8 @@ gtrgm_consistent(PG_FUNCTION_ARGS)
|
||||
float4 tmpsml = cnt_sml(key, qtrg);
|
||||
|
||||
/* strange bug at freebsd 5.2.1 and gcc 3.3.3 */
|
||||
res = (*(int *) &tmpsml == *(int *) &trgm_limit || tmpsml > trgm_limit) ? true : false;
|
||||
res = (*(int *) &tmpsml == *(int *) &similarity_threshold
|
||||
|| tmpsml > similarity_threshold) ? true : false;
|
||||
}
|
||||
else if (ISALLTRUE(key))
|
||||
{ /* non-leaf contains signature */
|
||||
@ -308,7 +309,8 @@ gtrgm_consistent(PG_FUNCTION_ARGS)
|
||||
if (len == 0)
|
||||
res = false;
|
||||
else
|
||||
res = (((((float8) count) / ((float8) len))) >= trgm_limit) ? true : false;
|
||||
res = (((((float8) count) / ((float8) len))) >= similarity_threshold)
|
||||
? true : false;
|
||||
}
|
||||
break;
|
||||
case ILikeStrategyNumber:
|
||||
|
@ -14,7 +14,10 @@
|
||||
|
||||
PG_MODULE_MAGIC;
|
||||
|
||||
float4 trgm_limit = 0.3f;
|
||||
/* GUC variables */
|
||||
double similarity_threshold = 0.3f;
|
||||
|
||||
void _PG_init(void);
|
||||
|
||||
PG_FUNCTION_INFO_V1(set_limit);
|
||||
PG_FUNCTION_INFO_V1(show_limit);
|
||||
@ -23,22 +26,52 @@ PG_FUNCTION_INFO_V1(similarity);
|
||||
PG_FUNCTION_INFO_V1(similarity_dist);
|
||||
PG_FUNCTION_INFO_V1(similarity_op);
|
||||
|
||||
/*
|
||||
* Module load callback
|
||||
*/
|
||||
void
|
||||
_PG_init(void)
|
||||
{
|
||||
/* Define custom GUC variables. */
|
||||
DefineCustomRealVariable("pg_trgm.similarity_threshold",
|
||||
"Sets the threshold used by the %% operator.",
|
||||
"Valid range is 0.0 .. 1.0.",
|
||||
&similarity_threshold,
|
||||
0.3,
|
||||
0.0,
|
||||
1.0,
|
||||
PGC_USERSET,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Deprecated function.
|
||||
* Use "pg_trgm.similarity_threshold" GUC variable instead of this function
|
||||
*/
|
||||
Datum
|
||||
set_limit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
float4 nlimit = PG_GETARG_FLOAT4(0);
|
||||
|
||||
if (nlimit < 0 || nlimit > 1.0)
|
||||
elog(ERROR, "wrong limit, should be between 0 and 1");
|
||||
trgm_limit = nlimit;
|
||||
PG_RETURN_FLOAT4(trgm_limit);
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||
errmsg("wrong limit, should be between 0 and 1")));
|
||||
similarity_threshold = nlimit;
|
||||
PG_RETURN_FLOAT4(similarity_threshold);
|
||||
}
|
||||
|
||||
/*
|
||||
* Deprecated function.
|
||||
* Use "pg_trgm.similarity_threshold" GUC variable instead of this function
|
||||
*/
|
||||
Datum
|
||||
show_limit(PG_FUNCTION_ARGS)
|
||||
{
|
||||
PG_RETURN_FLOAT4(trgm_limit);
|
||||
PG_RETURN_FLOAT4(similarity_threshold);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -720,5 +753,5 @@ similarity_op(PG_FUNCTION_ARGS)
|
||||
PG_GETARG_DATUM(0),
|
||||
PG_GETARG_DATUM(1)));
|
||||
|
||||
PG_RETURN_BOOL(res >= trgm_limit);
|
||||
PG_RETURN_BOOL(res >= similarity_threshold);
|
||||
}
|
||||
|
Reference in New Issue
Block a user