summaryrefslogtreecommitdiff
path: root/src/backend/tsearch
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-01-21 02:46:11 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-01-21 02:46:11 +0000
commit716e8b8374d7acd8831767918258727ecb099428 (patch)
tree583ec41d15bf8bbf4b573bdc5d3a221061d34825 /src/backend/tsearch
parentf7108ce06bb526ba336c194956b4ed924b317b7a (diff)
downloadpostgresql-716e8b8374d7acd8831767918258727ecb099428.tar.gz
Fix RS_isRegis() to agree exactly with RS_compile()'s idea of what's a valid
regis. Correct the latter's oversight that a bracket-expression needs to be terminated. Reduce the ereports to elogs, since they are now not expected to ever be hit (thus addressing Alvaro's original complaint). In passing, const-ify the string argument to RS_compile.
Diffstat (limited to 'src/backend/tsearch')
-rw-r--r--src/backend/tsearch/regis.c88
-rw-r--r--src/backend/tsearch/spell.c4
2 files changed, 59 insertions, 33 deletions
diff --git a/src/backend/tsearch/regis.c b/src/backend/tsearch/regis.c
index 4c35afd18d..0fe0064fd1 100644
--- a/src/backend/tsearch/regis.c
+++ b/src/backend/tsearch/regis.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tsearch/regis.c,v 1.3 2008/01/01 19:45:52 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/tsearch/regis.c,v 1.4 2008/01/21 02:46:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -17,26 +17,58 @@
#include "tsearch/dicts/regis.h"
#include "tsearch/ts_locale.h"
+#define RS_IN_ONEOF 1
+#define RS_IN_ONEOF_IN 2
+#define RS_IN_NONEOF 3
+#define RS_IN_WAIT 4
+
+
+/*
+ * Test whether a regex is of the subset supported here.
+ * Keep this in sync with RS_compile!
+ */
bool
RS_isRegis(const char *str)
{
- while (str && *str)
+ int state = RS_IN_WAIT;
+ const char *c = str;
+
+ while (*c)
{
- if (t_isalpha(str) ||
- t_iseq(str, '[') ||
- t_iseq(str, ']') ||
- t_iseq(str, '^'))
- str += pg_mblen(str);
+ if (state == RS_IN_WAIT)
+ {
+ if (t_isalpha(c))
+ /* okay */ ;
+ else if (t_iseq(c, '['))
+ state = RS_IN_ONEOF;
+ else
+ return false;
+ }
+ else if (state == RS_IN_ONEOF)
+ {
+ if (t_iseq(c, '^'))
+ state = RS_IN_NONEOF;
+ else if (t_isalpha(c))
+ state = RS_IN_ONEOF_IN;
+ else
+ return false;
+ }
+ else if (state == RS_IN_ONEOF_IN || state == RS_IN_NONEOF)
+ {
+ if (t_isalpha(c))
+ /* okay */ ;
+ else if (t_iseq(c, ']'))
+ state = RS_IN_WAIT;
+ else
+ return false;
+ }
else
- return false;
+ elog(ERROR, "internal error in RS_isRegis: state %d", state);
+ c += pg_mblen(c);
}
- return true;
-}
-#define RS_IN_ONEOF 1
-#define RS_IN_ONEOF_IN 2
-#define RS_IN_NONEOF 3
-#define RS_IN_WAIT 4
+ return (state == RS_IN_WAIT);
+}
static RegisNode *
newRegisNode(RegisNode *prev, int len)
@@ -50,11 +82,11 @@ newRegisNode(RegisNode *prev, int len)
}
void
-RS_compile(Regis *r, bool issuffix, char *str)
+RS_compile(Regis *r, bool issuffix, const char *str)
{
int len = strlen(str);
int state = RS_IN_WAIT;
- char *c = (char *) str;
+ const char *c = str;
RegisNode *ptr = NULL;
memset(r, 0, sizeof(Regis));
@@ -83,11 +115,8 @@ RS_compile(Regis *r, bool issuffix, char *str)
ptr->type = RSF_ONEOF;
state = RS_IN_ONEOF;
}
- else
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
- errmsg("invalid regis pattern: \"%s\"",
- str)));
+ else /* shouldn't get here */
+ elog(ERROR, "invalid regis pattern: \"%s\"", str);
}
else if (state == RS_IN_ONEOF)
{
@@ -102,11 +131,8 @@ RS_compile(Regis *r, bool issuffix, char *str)
ptr->len = pg_mblen(c);
state = RS_IN_ONEOF_IN;
}
- else
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
- errmsg("invalid regis pattern: \"%s\"",
- str)));
+ else /* shouldn't get here */
+ elog(ERROR, "invalid regis pattern: \"%s\"", str);
}
else if (state == RS_IN_ONEOF_IN || state == RS_IN_NONEOF)
{
@@ -117,17 +143,17 @@ RS_compile(Regis *r, bool issuffix, char *str)
}
else if (t_iseq(c, ']'))
state = RS_IN_WAIT;
- else
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
- errmsg("invalid regis pattern: \"%s\"",
- str)));
+ else /* shouldn't get here */
+ elog(ERROR, "invalid regis pattern: \"%s\"", str);
}
else
elog(ERROR, "internal error in RS_compile: state %d", state);
c += pg_mblen(c);
}
+ if (state != RS_IN_WAIT) /* shouldn't get here */
+ elog(ERROR, "invalid regis pattern: \"%s\"", str);
+
ptr = r->node;
while (ptr)
{
diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c
index 00f9d3c477..a2837d1683 100644
--- a/src/backend/tsearch/spell.c
+++ b/src/backend/tsearch/spell.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tsearch/spell.c,v 1.10 2008/01/16 13:01:03 teodor Exp $
+ * $PostgreSQL: pgsql/src/backend/tsearch/spell.c,v 1.11 2008/01/21 02:46:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -333,7 +333,7 @@ NIAddAffix(IspellDict *Conf, int flag, char flagflags, const char *mask, const c
Affix->issimple = 0;
Affix->isregis = 1;
RS_compile(&(Affix->reg.regis), (type == FF_SUFFIX) ? true : false,
- (char *) ((mask && *mask) ? mask : VoidString));
+ (mask && *mask) ? mask : VoidString);
}
else
{