pg_trgm's set_limit() now uses SetConfigOption()
authorTeodor Sigaev
Fri, 18 Mar 2016 09:26:27 +0000 (12:26 +0300)
committerTeodor Sigaev
Fri, 18 Mar 2016 09:26:27 +0000 (12:26 +0300)
Deprecated set_limit() is modified to use SetConfigOption() to set
similarity_threshold which is actually an instance of
pg_trgm.similarity_threshold GUC variable. Previous coding directly sets
similarity_threshold what could cause an inconsistency between states of
actual variable and GUC representation.

Per gripe from Tom Lane

contrib/pg_trgm/trgm_op.c

index eaf20e4515971dc4e610e97130f8fcbb8cde683f..3ca6e5e951ee7b0ea9e0a8b649904d6e6bc15cb7 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "catalog/pg_type.h"
 #include "tsearch/ts_locale.h"
+#include "utils/lsyscache.h"
 #include "utils/memutils.h"
 #include "utils/pg_crc.h"
 
@@ -80,12 +81,17 @@ Datum
 set_limit(PG_FUNCTION_ARGS)
 {
    float4      nlimit = PG_GETARG_FLOAT4(0);
+   char       *nlimit_str;
+   Oid         func_out_oid;
+   bool        is_varlena;
+
+   getTypeOutputInfo(FLOAT4OID, &func_out_oid, &is_varlena);
+
+   nlimit_str = OidOutputFunctionCall(func_out_oid, Float4GetDatum(nlimit));
+
+   SetConfigOption("pg_trgm.similarity_threshold", nlimit_str,
+                   PGC_USERSET, PGC_S_SESSION);
 
-   if (nlimit < 0 || nlimit > 1.0)
-       ereport(ERROR,
-               (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-                errmsg("wrong threshold, should be between 0 and 1")));
-   similarity_threshold = nlimit;
    PG_RETURN_FLOAT4(similarity_threshold);
 }