mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-30 19:00:29 +08: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:
parent
f9e5ed61ed
commit
5871b88487
@ -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);
|
||||
}
|
||||
|
@ -99,7 +99,8 @@
|
||||
Returns the current similarity threshold used by the <literal>%</>
|
||||
operator. This sets the minimum similarity between
|
||||
two words for them to be considered similar enough to
|
||||
be misspellings of each other, for example.
|
||||
be misspellings of each other, for example
|
||||
(<emphasis>deprecated</emphasis>).
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
@ -108,7 +109,7 @@
|
||||
<entry>
|
||||
Sets the current similarity threshold that is used by the <literal>%</>
|
||||
operator. The threshold must be between 0 and 1 (default is 0.3).
|
||||
Returns the same value passed in.
|
||||
Returns the same value passed in (<emphasis>deprecated</emphasis>).
|
||||
</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
@ -133,7 +134,7 @@
|
||||
<entry>
|
||||
Returns <literal>true</> if its arguments have a similarity that is
|
||||
greater than the current similarity threshold set by
|
||||
<function>set_limit</>.
|
||||
<varname>pg_trgm.similarity_threshold</>.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
@ -149,6 +150,27 @@
|
||||
</table>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>GUC Parameters</title>
|
||||
|
||||
<variablelist>
|
||||
<varlistentry id="guc-pgtrgm-similarity-threshold" xreflabel="pg_trgm.similarity_threshold">
|
||||
<term>
|
||||
<varname>pg_trgm.similarity_threshold</> (<type>real</type>)
|
||||
<indexterm>
|
||||
<primary><varname>pg_trgm.similarity_threshold</> configuration parameter</primary>
|
||||
</indexterm>
|
||||
</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Sets the current similarity threshold that is used by the <literal>%</>
|
||||
operator. The threshold must be between 0 and 1 (default is 0.3).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</sect2>
|
||||
|
||||
<sect2>
|
||||
<title>Index Support</title>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user