From 1c92724985faf15a2cce29e7d95157fc74718d9d Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 24 Oct 2007 03:30:03 +0000
Subject: [PATCH] Set read_only = TRUE while evaluating input queries for
 ts_rewrite() and ts_stat(), per my recent suggestion.  Also add a
 possibly-not-needed- but-can't-hurt check for NULL SPI_tuptable, before we
 try to dereference same.

---
 src/backend/utils/adt/tsquery_rewrite.c | 9 +++++----
 src/backend/utils/adt/tsvector_op.c     | 9 +++++----
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c
index ccf5e67debf..f7a335b337e 100644
--- a/src/backend/utils/adt/tsquery_rewrite.c
+++ b/src/backend/utils/adt/tsquery_rewrite.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_rewrite.c,v 1.6 2007/10/24 02:24:47 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_rewrite.c,v 1.7 2007/10/24 03:30:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -259,7 +259,7 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS)
 	MemoryContext oldcontext;
 	QTNode	   *tree;
 	char	   *buf;
-	void	   *plan;
+	SPIPlanPtr	plan;
 	Portal		portal;
 	bool		isnull;
 	int			i;
@@ -281,12 +281,13 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS)
 	if ((plan = SPI_prepare(buf, 0, NULL)) == NULL)
 		elog(ERROR, "SPI_prepare(\"%s\") failed", buf);
 
-	if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, false)) == NULL)
+	if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, true)) == NULL)
 		elog(ERROR, "SPI_cursor_open(\"%s\") failed", buf);
 
 	SPI_cursor_fetch(portal, true, 100);
 
-	if (SPI_tuptable->tupdesc->natts != 2 ||
+	if (SPI_tuptable == NULL ||
+		SPI_tuptable->tupdesc->natts != 2 ||
 		SPI_gettypeid(SPI_tuptable->tupdesc, 1) != TSQUERYOID ||
 		SPI_gettypeid(SPI_tuptable->tupdesc, 2) != TSQUERYOID)
 		ereport(ERROR,
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
index 44b69ac76e3..f67b53407a6 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.6 2007/10/23 00:51:23 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/tsvector_op.c,v 1.7 2007/10/24 03:30:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1088,19 +1088,20 @@ ts_stat_sql(text *txt, text *ws)
 			   *stat;
 	bool		isnull;
 	Portal		portal;
-	void	   *plan;
+	SPIPlanPtr	plan;
 
 	if ((plan = SPI_prepare(query, 0, NULL)) == NULL)
 		/* internal error */
 		elog(ERROR, "SPI_prepare(\"%s\") failed", query);
 
-	if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, false)) == NULL)
+	if ((portal = SPI_cursor_open(NULL, plan, NULL, NULL, true)) == NULL)
 		/* internal error */
 		elog(ERROR, "SPI_cursor_open(\"%s\") failed", query);
 
 	SPI_cursor_fetch(portal, true, 100);
 
-	if (SPI_tuptable->tupdesc->natts != 1 ||
+	if (SPI_tuptable == NULL ||
+		SPI_tuptable->tupdesc->natts != 1 ||
 		SPI_gettypeid(SPI_tuptable->tupdesc, 1) != TSVECTOROID)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-- 
GitLab