From 5871b88487cfd07966e2ce08609a4d6d5ee9718e Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Wed, 16 Mar 2016 17:44:58 +0300 Subject: [PATCH] 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 --- contrib/pg_trgm/pg_trgm--1.2.sql | 4 ++- contrib/pg_trgm/trgm.h | 2 +- contrib/pg_trgm/trgm_gin.c | 8 ++++-- contrib/pg_trgm/trgm_gist.c | 6 +++-- contrib/pg_trgm/trgm_op.c | 45 +++++++++++++++++++++++++++----- doc/src/sgml/pgtrgm.sgml | 28 +++++++++++++++++--- 6 files changed, 78 insertions(+), 15 deletions(-) diff --git a/contrib/pg_trgm/pg_trgm--1.2.sql b/contrib/pg_trgm/pg_trgm--1.2.sql index 49d7395d47..5ee115ecdc 100644 --- a/contrib/pg_trgm/pg_trgm--1.2.sql +++ b/contrib/pg_trgm/pg_trgm--1.2.sql @@ -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, diff --git a/contrib/pg_trgm/trgm.h b/contrib/pg_trgm/trgm.h index f030558088..046cf58e13 100644 --- a/contrib/pg_trgm/trgm.h +++ b/contrib/pg_trgm/trgm.h @@ -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); diff --git a/contrib/pg_trgm/trgm_gin.c b/contrib/pg_trgm/trgm_gin.c index baa4cc70a2..ea8edef67a 100644 --- a/contrib/pg_trgm/trgm_gin.c +++ b/contrib/pg_trgm/trgm_gin.c @@ -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 diff --git a/contrib/pg_trgm/trgm_gist.c b/contrib/pg_trgm/trgm_gist.c index 07d1dc308b..cbd89586cd 100644 --- a/contrib/pg_trgm/trgm_gist.c +++ b/contrib/pg_trgm/trgm_gist.c @@ -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: diff --git a/contrib/pg_trgm/trgm_op.c b/contrib/pg_trgm/trgm_op.c index 1a71a2bef3..b2c1f6b061 100644 --- a/contrib/pg_trgm/trgm_op.c +++ b/contrib/pg_trgm/trgm_op.c @@ -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); } diff --git a/doc/src/sgml/pgtrgm.sgml b/doc/src/sgml/pgtrgm.sgml index 9eb2a6742e..1a9b5a796f 100644 --- a/doc/src/sgml/pgtrgm.sgml +++ b/doc/src/sgml/pgtrgm.sgml @@ -99,7 +99,8 @@ Returns the current similarity threshold used by the % 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 + (deprecated). @@ -108,7 +109,7 @@ Sets the current similarity threshold that is used by the % 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 (deprecated). @@ -133,7 +134,7 @@ Returns true if its arguments have a similarity that is greater than the current similarity threshold set by - set_limit. + pg_trgm.similarity_threshold. @@ -149,6 +150,27 @@ + + GUC Parameters + + + + + pg_trgm.similarity_threshold (real) + + pg_trgm.similarity_threshold configuration parameter + + + + + Sets the current similarity threshold that is used by the % + operator. The threshold must be between 0 and 1 (default is 0.3). + + + + + + Index Support