aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-10-23 01:44:40 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-10-23 01:44:40 +0000
commit12f25e70a6feb40b7fba1dcc17deabcffcdfcc3d (patch)
treec90064d7f7a870365267683adf6ddc911dd4bd14
parentbb36c51fcdca16ad4dfd4c03e2673f2471c7e341 (diff)
downloadpostgresql-12f25e70a6feb40b7fba1dcc17deabcffcdfcc3d.tar.gz
postgresql-12f25e70a6feb40b7fba1dcc17deabcffcdfcc3d.zip
Fix two-argument form of ts_rewrite() so it actually works for cases where
a later rewrite rule should change a subtree modified by an earlier one. Per my gripe of a few days ago.
-rw-r--r--src/backend/utils/adt/tsquery_rewrite.c9
-rw-r--r--src/backend/utils/adt/tsquery_util.c19
-rw-r--r--src/include/tsearch/ts_utils.h4
-rw-r--r--src/test/regress/expected/tsearch.out2
4 files changed, 30 insertions, 4 deletions
diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c
index 77e3a8b173b..109904a5943 100644
--- a/src/backend/utils/adt/tsquery_rewrite.c
+++ b/src/backend/utils/adt/tsquery_rewrite.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_rewrite.c,v 1.4 2007/09/07 16:03:40 teodor Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_rewrite.c,v 1.5 2007/10/23 01:44:39 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -467,6 +467,13 @@ tsquery_rewrite(PG_FUNCTION_ARGS)
QTNFree(qsubs);
if (qtsubs != (TSQuery) DatumGetPointer(sdata))
pfree(qtsubs);
+
+ if (tree)
+ {
+ /* ready the tree for another pass */
+ QTNClearFlags(tree, QTN_NOCHANGE);
+ QTNSort(tree);
+ }
}
}
diff --git a/src/backend/utils/adt/tsquery_util.c b/src/backend/utils/adt/tsquery_util.c
index a4fd0937c4e..07561920024 100644
--- a/src/backend/utils/adt/tsquery_util.c
+++ b/src/backend/utils/adt/tsquery_util.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_util.c,v 1.4 2007/09/07 16:03:40 teodor Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_util.c,v 1.5 2007/10/23 01:44:39 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -381,3 +381,20 @@ QTNCopy(QTNode *in)
return out;
}
+
+void
+QTNClearFlags(QTNode *in, uint32 flags)
+{
+ /* since this function recurses, it could be driven to stack overflow. */
+ check_stack_depth();
+
+ in->flags &= ~flags;
+
+ if (in->valnode->type != QI_VAL)
+ {
+ int i;
+
+ for (i = 0; i < in->nchild; i++)
+ QTNClearFlags(in->child[i], flags);
+ }
+}
diff --git a/src/include/tsearch/ts_utils.h b/src/include/tsearch/ts_utils.h
index ed9137b074d..48dc90eaee8 100644
--- a/src/include/tsearch/ts_utils.h
+++ b/src/include/tsearch/ts_utils.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 1998-2007, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/include/tsearch/ts_utils.h,v 1.6 2007/10/21 22:29:56 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/tsearch/ts_utils.h,v 1.7 2007/10/23 01:44:39 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -172,6 +172,7 @@ typedef struct QTNode
struct QTNode **child;
} QTNode;
+/* bits in QTNode.flags */
#define QTN_NEEDFREE 0x01
#define QTN_NOCHANGE 0x02
#define QTN_WORDFREE 0x04
@@ -189,6 +190,7 @@ extern void QTNTernary(QTNode * in);
extern void QTNBinary(QTNode * in);
extern int QTNodeCompare(QTNode * an, QTNode * bn);
extern QTNode *QTNCopy(QTNode *in);
+extern void QTNClearFlags(QTNode *in, uint32 flags);
extern bool QTNEq(QTNode * a, QTNode * b);
extern TSQuerySign makeTSQuerySign(TSQuery a);
diff --git a/src/test/regress/expected/tsearch.out b/src/test/regress/expected/tsearch.out
index 2985e157c68..6eb453194da 100644
--- a/src/test/regress/expected/tsearch.out
+++ b/src/test/regress/expected/tsearch.out
@@ -673,7 +673,7 @@ SELECT ts_rewrite('moscow', 'SELECT keyword, sample FROM test_tsquery'::text );
SELECT ts_rewrite('moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'::text );
ts_rewrite
-----------------------------------
- ( 'moskva' | 'moscow' ) & 'hotel'
+ 'hotel' & ( 'moskva' | 'moscow' )
(1 row)
SELECT ts_rewrite('bar & new & qq & foo & york', 'SELECT keyword, sample FROM test_tsquery'::text );