diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2007-10-23 01:44:40 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2007-10-23 01:44:40 +0000 |
commit | 12f25e70a6feb40b7fba1dcc17deabcffcdfcc3d (patch) | |
tree | c90064d7f7a870365267683adf6ddc911dd4bd14 /src/backend/utils/adt | |
parent | bb36c51fcdca16ad4dfd4c03e2673f2471c7e341 (diff) | |
download | postgresql-12f25e70a6feb40b7fba1dcc17deabcffcdfcc3d.tar.gz postgresql-12f25e70a6feb40b7fba1dcc17deabcffcdfcc3d.zip |
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.
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/tsquery_rewrite.c | 9 | ||||
-rw-r--r-- | src/backend/utils/adt/tsquery_util.c | 19 |
2 files changed, 26 insertions, 2 deletions
diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c index 77e3a8b173b..109904a5943 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 a4fd0937c4e..07561920024 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); + } +} |