diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-10-13 14:33:21 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-10-13 14:33:21 +0000 |
commit | 3d70b5d01a604cf6a4af372b4abc500cd3c2cf12 (patch) | |
tree | 56dce04e2af20c35471c15ef30dad4627780211a | |
parent | 09a12ef929909851f31794dcd361e469ad467599 (diff) | |
download | postgresql-3d70b5d01a604cf6a4af372b4abc500cd3c2cf12.tar.gz postgresql-3d70b5d01a604cf6a4af372b4abc500cd3c2cf12.zip |
Fix ts_stat's failure on empty tsvector.
Also insert a couple of Asserts that check for stack overflow.
Bogus coding appears to be new in 8.4 --- older releases had a much
simpler algorithm here. Per bug #5111.
-rw-r--r-- | src/backend/utils/adt/tsvector_op.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index 093f2a348ad..09fbbc05097 100644 --- a/src/backend/utils/adt/tsvector_op.c +++ b/src/backend/utils/adt/tsvector_op.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.23 2009/06/11 14:49:04 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.23.2.1 2009/10/13 14:33:21 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -959,17 +959,21 @@ ts_setup_firstcall(FunctionCallInfo fcinfo, FuncCallContext *funcctx, node = stat->root; /* find leftmost value */ - for (;;) - { - stat->stack[stat->stackpos] = node; - if (node->left) + if (node == NULL) + stat->stack[stat->stackpos] = NULL; + else + for (;;) { - stat->stackpos++; - node = node->left; + stat->stack[stat->stackpos] = node; + if (node->left) + { + stat->stackpos++; + node = node->left; + } + else + break; } - else - break; - } + Assert(stat->stackpos <= stat->maxdepth); tupdesc = CreateTemplateTupleDesc(3, false); TupleDescInitEntry(tupdesc, (AttrNumber) 1, "word", @@ -1015,6 +1019,7 @@ walkStatEntryTree(TSVectorStat *stat) else break; } + Assert(stat->stackpos <= stat->maxdepth); } else { |