Commit 12f25e70 authored by Tom Lane's avatar Tom Lane

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.
parent bb36c51f
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -467,6 +467,13 @@ tsquery_rewrite(PG_FUNCTION_ARGS)
QTNFree(qsubs); QTNFree(qsubs);
if (qtsubs != (TSQuery) DatumGetPointer(sdata)) if (qtsubs != (TSQuery) DatumGetPointer(sdata))
pfree(qtsubs); pfree(qtsubs);
if (tree)
{
/* ready the tree for another pass */
QTNClearFlags(tree, QTN_NOCHANGE);
QTNSort(tree);
}
} }
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -381,3 +381,20 @@ QTNCopy(QTNode *in)
return out; 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);
}
}
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Copyright (c) 1998-2007, PostgreSQL Global Development Group * 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 ...@@ -172,6 +172,7 @@ typedef struct QTNode
struct QTNode **child; struct QTNode **child;
} QTNode; } QTNode;
/* bits in QTNode.flags */
#define QTN_NEEDFREE 0x01 #define QTN_NEEDFREE 0x01
#define QTN_NOCHANGE 0x02 #define QTN_NOCHANGE 0x02
#define QTN_WORDFREE 0x04 #define QTN_WORDFREE 0x04
...@@ -189,6 +190,7 @@ extern void QTNTernary(QTNode * in); ...@@ -189,6 +190,7 @@ extern void QTNTernary(QTNode * in);
extern void QTNBinary(QTNode * in); extern void QTNBinary(QTNode * in);
extern int QTNodeCompare(QTNode * an, QTNode * bn); extern int QTNodeCompare(QTNode * an, QTNode * bn);
extern QTNode *QTNCopy(QTNode *in); extern QTNode *QTNCopy(QTNode *in);
extern void QTNClearFlags(QTNode *in, uint32 flags);
extern bool QTNEq(QTNode * a, QTNode * b); extern bool QTNEq(QTNode * a, QTNode * b);
extern TSQuerySign makeTSQuerySign(TSQuery a); extern TSQuerySign makeTSQuerySign(TSQuery a);
......
...@@ -673,7 +673,7 @@ SELECT ts_rewrite('moscow', 'SELECT keyword, sample FROM test_tsquery'::text ); ...@@ -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 ); SELECT ts_rewrite('moscow & hotel', 'SELECT keyword, sample FROM test_tsquery'::text );
ts_rewrite ts_rewrite
----------------------------------- -----------------------------------
( 'moskva' | 'moscow' ) & 'hotel' 'hotel' & ( 'moskva' | 'moscow' )
(1 row) (1 row)
SELECT ts_rewrite('bar & new & qq & foo & york', 'SELECT keyword, sample FROM test_tsquery'::text ); SELECT ts_rewrite('bar & new & qq & foo & york', 'SELECT keyword, sample FROM test_tsquery'::text );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment