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
    {