diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c
index 77e3a8b173b71fc8a184393235eb950944c9f7c6..109904a594343a7697e7de4031d46eb1821c72ef 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 a4fd0937c4eb04104ef2d5a04c7043529e0be6ed..07561920024dd824abcebe5d63da349d6bd15646 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 ed9137b074ddd7c39fba53b64b745f8073d44828..48dc90eaee8ee0b285ad9d683bc5cbb566ba09ca 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 2985e157c6811651dc3cbebe35ef906aa8b27459..6eb453194daab4a7b652cfb118ab99ab8410aacc 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 );