aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/pg_trgm/pg_trgm--1.2.sql4
-rw-r--r--contrib/pg_trgm/trgm.h2
-rw-r--r--contrib/pg_trgm/trgm_gin.c8
-rw-r--r--contrib/pg_trgm/trgm_gist.c6
-rw-r--r--contrib/pg_trgm/trgm_op.c45
-rw-r--r--doc/src/sgml/pgtrgm.sgml28
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 49d7395d477..5ee115ecdc1 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 f030558088c..046cf58e134 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 baa4cc70a23..ea8edef67ac 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 07d1dc308bb..cbd89586cda 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 1a71a2bef3e..b2c1f6b0612 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 9eb2a6742e4..1a9b5a796f1 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 <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>
@@ -150,6 +151,27 @@
</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>
<para>