mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-17 19:30:00 +08:00
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.
This commit is contained in:
parent
bb36c51fcd
commit
12f25e70a6
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 );
|
||||
|
Loading…
Reference in New Issue
Block a user