From: Tom Lane Date: Tue, 13 Oct 2009 14:33:14 +0000 (+0000) Subject: Fix ts_stat's failure on empty tsvector. X-Git-Tag: REL8_5_ALPHA2~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b14071164366e7efee9dc3a017eb7cb4cfac3428;p=postgresql 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. --- diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index 6886ee4bcd..a2848db449 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.24 2009/07/16 06:33:44 petere Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.25 2009/10/13 14:33:14 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 {