mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04: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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user