diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c index 77e3a8b173..109904a594 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 a4fd0937c4..0756192002 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 ed9137b074..48dc90eaee 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 2985e157c6..6eb453194d 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 );