aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-04-08 18:20:29 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-04-08 18:20:29 +0000
commit635aaab278afc1af972a4b6a55ff632ab763505d (patch)
treec70ad842fd8c90d527217ccf43d8abf2163628ee /src
parentdb5f60cb1837d9d62d149f6f814d7069bdff9009 (diff)
downloadpostgresql-635aaab278afc1af972a4b6a55ff632ab763505d.tar.gz
postgresql-635aaab278afc1af972a4b6a55ff632ab763505d.zip
Fix tsvector_update_trigger() to be domain-friendly: it needs to allow all
the columns it works with to be domains over the expected type, not just exactly the expected type. In passing, fix ts_stat() the same way. Per report from Markus Wollny.
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/tsvector_op.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
index 0624c00ea91..539a9be9789 100644
--- a/src/backend/utils/adt/tsvector_op.c
+++ b/src/backend/utils/adt/tsvector_op.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.14 2008/03/25 22:42:44 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.15 2008/04/08 18:20:29 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -67,6 +67,39 @@ static Datum tsvector_update_trigger(PG_FUNCTION_ARGS, bool config_column);
/*
+ * Check if datatype is the specified type or equivalent to it.
+ *
+ * Note: we could just do getBaseType() unconditionally, but since that's
+ * a relatively expensive catalog lookup that most users won't need, we
+ * try the straight comparison first.
+ */
+static bool
+is_expected_type(Oid typid, Oid expected_type)
+{
+ if (typid == expected_type)
+ return true;
+ typid = getBaseType(typid);
+ if (typid == expected_type)
+ return true;
+ return false;
+}
+
+/* Check if datatype is TEXT or binary-equivalent to it */
+static bool
+is_text_type(Oid typid)
+{
+ /* varchar(n) and char(n) are binary-compatible with text */
+ if (typid == TEXTOID || typid == VARCHAROID || typid == BPCHAROID)
+ return true;
+ /* Allow domains over these types, too */
+ typid = getBaseType(typid);
+ if (typid == TEXTOID || typid == VARCHAROID || typid == BPCHAROID)
+ return true;
+ return false;
+}
+
+
+/*
* Order: haspos, len, word, for all positions (pos, weight)
*/
static int
@@ -1102,7 +1135,8 @@ ts_stat_sql(text *txt, text *ws)
if (SPI_tuptable == NULL ||
SPI_tuptable->tupdesc->natts != 1 ||
- SPI_gettypeid(SPI_tuptable->tupdesc, 1) != TSVECTOROID)
+ !is_expected_type(SPI_gettypeid(SPI_tuptable->tupdesc, 1),
+ TSVECTOROID))
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("ts_stat query must return one tsvector column")));
@@ -1227,21 +1261,6 @@ ts_stat2(PG_FUNCTION_ARGS)
}
-/* Check if datatype is TEXT or binary-equivalent to it */
-static bool
-istexttype(Oid typid)
-{
- /* varchar(n) and char(n) are binary-compatible with text */
- if (typid == TEXTOID || typid == VARCHAROID || typid == BPCHAROID)
- return true;
- /* Allow domains over these types, too */
- typid = getBaseType(typid);
- if (typid == TEXTOID || typid == VARCHAROID || typid == BPCHAROID)
- return true;
- return false;
-}
-
-
/*
* Triggers for automatic update of a tsvector column from text column(s)
*
@@ -1309,7 +1328,8 @@ tsvector_update_trigger(PG_FUNCTION_ARGS, bool config_column)
(errcode(ERRCODE_UNDEFINED_COLUMN),
errmsg("tsvector column \"%s\" does not exist",
trigger->tgargs[0])));
- if (SPI_gettypeid(rel->rd_att, tsvector_attr_num) != TSVECTOROID)
+ if (!is_expected_type(SPI_gettypeid(rel->rd_att, tsvector_attr_num),
+ TSVECTOROID))
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("column \"%s\" is not of tsvector type",
@@ -1326,7 +1346,8 @@ tsvector_update_trigger(PG_FUNCTION_ARGS, bool config_column)
(errcode(ERRCODE_UNDEFINED_COLUMN),
errmsg("configuration column \"%s\" does not exist",
trigger->tgargs[1])));
- if (SPI_gettypeid(rel->rd_att, config_attr_num) != REGCONFIGOID)
+ if (!is_expected_type(SPI_gettypeid(rel->rd_att, config_attr_num),
+ REGCONFIGOID))
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("column \"%s\" is not of regconfig type",
@@ -1371,7 +1392,7 @@ tsvector_update_trigger(PG_FUNCTION_ARGS, bool config_column)
(errcode(ERRCODE_UNDEFINED_COLUMN),
errmsg("column \"%s\" does not exist",
trigger->tgargs[i])));
- if (!istexttype(SPI_gettypeid(rel->rd_att, numattr)))
+ if (!is_text_type(SPI_gettypeid(rel->rd_att, numattr)))
ereport(ERROR,
(errcode(ERRCODE_DATATYPE_MISMATCH),
errmsg("column \"%s\" is not of character type",