]> granicus.if.org Git - postgresql/commitdiff
GUC variable pg_trgm.similarity_threshold insead of set_limit()
authorTeodor Sigaev <teodor@sigaev.ru>
Wed, 16 Mar 2016 14:44:58 +0000 (17:44 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Wed, 16 Mar 2016 14:44:58 +0000 (17:44 +0300)
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
contrib/pg_trgm/trgm.h
contrib/pg_trgm/trgm_gin.c
contrib/pg_trgm/trgm_gist.c
contrib/pg_trgm/trgm_op.c
doc/src/sgml/pgtrgm.sgml

index 49d7395d477158472fafbc75b3f9a34825bd5bc4..5ee115ecdc12a80e228078c9537285539cb53636 100644 (file)
@@ -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,
index f030558088c456b90c95af6d8a13304f648508d4..046cf58e1346d536e336c047606375eff28064f6 100644 (file)
@@ -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);
index baa4cc70a23fd7ec4424ca989173cbd54099d3de..ea8edef67ac86a0ab837e8cfafd170e0c7d2b3aa 100644 (file)
@@ -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
index 07d1dc308bb506b7285edfb749e871a67b6d10e1..cbd89586cda1b7a7f2a0ffc3907d7841422b7c51 100644 (file)
@@ -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:
index 1a71a2bef3ea8c187a3b68af9f5c7148729565d8..b2c1f6b0612991a61716ece6277e82dc05a500bc 100644 (file)
 
 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);
 }
index 9eb2a6742e48ec00c96de5eac8feb36f891ae40f..1a9b5a796f1ef5906c13d56d07ef5cfe8ea0b851 100644 (file)
@@ -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>
       <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>