From b14071164366e7efee9dc3a017eb7cb4cfac3428 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 13 Oct 2009 14:33:14 +0000
Subject: [PATCH] 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.

---
 src/backend/utils/adt/tsvector_op.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
index 6886ee4bcdb..a2848db449a 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
 	{
-- 
GitLab