From 2f203642f817e596bdfab2158cf32ce2e5c0eca5 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 3 Aug 2010 00:10:44 +0000
Subject: [PATCH] Fix core dump in QTNodeCompare when tsquery_cmp() is applied
 to two empty tsqueries.  CompareTSQ has to have a guard for the case rather
 than blindly applying QTNodeCompare to random data past the end of the
 datums.  Also, change QTNodeCompare to be a little less trusting: use an
 actual test rather than just Assert'ing that the input is sane.  Problem
 encountered while investigating another issue (I saw a core dump in
 autoanalyze on a table containing multiple empty tsquery values).

Back-patch to all branches with tsquery support.

In HEAD, also fix some bizarre (though not outright wrong) coding in
tsq_mcontains().
---
 src/backend/utils/adt/tsquery_op.c   |  4 ++--
 src/backend/utils/adt/tsquery_util.c | 11 +++++++----
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/adt/tsquery_op.c b/src/backend/utils/adt/tsquery_op.c
index 2b453e0286..81874fb812 100644
--- a/src/backend/utils/adt/tsquery_op.c
+++ b/src/backend/utils/adt/tsquery_op.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_op.c,v 1.8 2010/01/02 16:57:55 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_op.c,v 1.8.6.1 2010/08/03 00:10:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -149,7 +149,7 @@ CompareTSQ(TSQuery a, TSQuery b)
 	{
 		return (VARSIZE(a) < VARSIZE(b)) ? -1 : 1;
 	}
-	else
+	else if (a->size != 0)
 	{
 		QTNode	   *an = QT2QTN(GETQUERY(a), GETOPERAND(a));
 		QTNode	   *bn = QT2QTN(GETQUERY(b), GETOPERAND(b));
diff --git a/src/backend/utils/adt/tsquery_util.c b/src/backend/utils/adt/tsquery_util.c
index ce8a892639..522dd8d62f 100644
--- a/src/backend/utils/adt/tsquery_util.c
+++ b/src/backend/utils/adt/tsquery_util.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_util.c,v 1.13 2010/01/02 16:57:55 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_util.c,v 1.13.6.1 2010/08/03 00:10:44 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -113,13 +113,11 @@ QTNodeCompare(QTNode *an, QTNode *bn)
 		}
 		return 0;
 	}
-	else
+	else if (an->valnode->type == QI_VAL)
 	{
 		QueryOperand *ao = &an->valnode->qoperand;
 		QueryOperand *bo = &bn->valnode->qoperand;
 
-		Assert(an->valnode->type == QI_VAL);
-
 		if (ao->valcrc != bo->valcrc)
 		{
 			return (ao->valcrc > bo->valcrc) ? -1 : 1;
@@ -127,6 +125,11 @@ QTNodeCompare(QTNode *an, QTNode *bn)
 
 		return tsCompareString(an->word, ao->length, bn->word, bo->length, false);
 	}
+	else
+	{
+		elog(ERROR, "unrecognized QueryItem type: %d", an->valnode->type);
+		return 0;				/* keep compiler quiet */
+	}
 }
 
 static int
-- 
2.49.0