-- 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'
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,
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);
* 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
/*
* 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
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 */
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:
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);
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
PG_GETARG_DATUM(0),
PG_GETARG_DATUM(1)));
- PG_RETURN_BOOL(res >= trgm_limit);
+ PG_RETURN_BOOL(res >= similarity_threshold);
}
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>
<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>
<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>
</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>