]> granicus.if.org Git - postgresql/commitdiff
Fix ts_stat's failure on empty tsvector.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Oct 2009 14:33:14 +0000 (14:33 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Oct 2009 14:33:14 +0000 (14:33 +0000)
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.

src/backend/utils/adt/tsvector_op.c

index 6886ee4bcdbae4c22a5d98bdbbe0fb5970e6e632..a2848db449a92d18a346a0a4a5ae067e0e02e515 100644 (file)
@@ -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
        {