From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 16 Apr 2007 18:21:07 +0000 (+0000)
Subject: Make plancache store cursor options so it can pass them to planner during
X-Git-Tag: REL8_3_BETA1~828
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=42dc4b66e61cde4beb466561f12fd490b6621ee3;p=postgresql

Make plancache store cursor options so it can pass them to planner during
a replan.  I had originally thought this was not necessary, but the new
SPI facilities create a path whereby queries planned with non-default
options can get into the cache, so it is necessary.
---

diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c
index 9a4f88d1a0..e7976ebb6e 100644
--- a/src/backend/commands/prepare.c
+++ b/src/backend/commands/prepare.c
@@ -10,7 +10,7 @@
  * Copyright (c) 2002-2007, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.72 2007/04/16 01:14:55 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.73 2007/04/16 18:21:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -171,6 +171,7 @@ PrepareQuery(PrepareStmt *stmt, const char *queryString)
 						   commandTag,
 						   argtypes,
 						   nargs,
+						   0,				/* default cursor options */
 						   plan_list,
 						   true);
 }
@@ -435,6 +436,7 @@ StorePreparedStatement(const char *stmt_name,
 					   const char *commandTag,
 					   Oid *param_types,
 					   int num_params,
+					   int cursor_options,
 					   List *stmt_list,
 					   bool from_sql)
 {
@@ -461,6 +463,7 @@ StorePreparedStatement(const char *stmt_name,
 								  commandTag,
 								  param_types,
 								  num_params,
+								  cursor_options,
 								  stmt_list,
 								  true,
 								  true);
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index e0c11b7b13..0a5625a0c5 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.177 2007/04/16 17:21:23 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.178 2007/04/16 18:21:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2032,6 +2032,7 @@ _SPI_save_plan(SPIPlanPtr plan)
 									 plansource->commandTag,
 									 newplan->argtypes,
 									 newplan->nargs,
+									 newplan->cursor_options,
 									 cplan->stmt_list,
 									 true,
 									 false);
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 7722eddf34..acf12dae6f 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.531 2007/04/16 01:14:57 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.532 2007/04/16 18:21:07 tgl Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -1237,6 +1237,7 @@ exec_parse_message(const char *query_string,	/* string to execute */
 							   commandTag,
 							   paramTypes,
 							   numParams,
+							   0,				/* default cursor options */
 							   stmt_list,
 							   false);
 	}
@@ -1261,6 +1262,7 @@ exec_parse_message(const char *query_string,	/* string to execute */
 												 commandTag,
 												 newParamTypes,
 												 numParams,
+												 0,	/* cursor options */
 												 stmt_list,
 												 fully_planned,
 												 true,
diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c
index 28838eba09..a47fa3375f 100644
--- a/src/backend/utils/cache/plancache.c
+++ b/src/backend/utils/cache/plancache.c
@@ -33,7 +33,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.7 2007/04/16 01:14:57 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/cache/plancache.c,v 1.8 2007/04/16 18:21:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -106,6 +106,7 @@ InitPlanCache(void)
  * commandTag: compile-time-constant tag for query, or NULL if empty query
  * param_types: array of parameter type OIDs, or NULL if none
  * num_params: number of parameters
+ * cursor_options: options bitmask that was/will be passed to planner
  * stmt_list: list of PlannedStmts/utility stmts, or list of Query trees
  * fully_planned: are we caching planner or rewriter output?
  * fixed_result: TRUE to disallow changes in result tupdesc
@@ -116,6 +117,7 @@ CreateCachedPlan(Node *raw_parse_tree,
 				 const char *commandTag,
 				 Oid *param_types,
 				 int num_params,
+				 int cursor_options,
 				 List *stmt_list,
 				 bool fully_planned,
 				 bool fixed_result)
@@ -157,6 +159,7 @@ CreateCachedPlan(Node *raw_parse_tree,
 	else
 		plansource->param_types = NULL;
 	plansource->num_params = num_params;
+	plansource->cursor_options = cursor_options;
 	plansource->fully_planned = fully_planned;
 	plansource->fixed_result = fixed_result;
 	plansource->search_path = search_path;
@@ -212,6 +215,7 @@ FastCreateCachedPlan(Node *raw_parse_tree,
 					 const char *commandTag,
 					 Oid *param_types,
 					 int num_params,
+					 int cursor_options,
 					 List *stmt_list,
 					 bool fully_planned,
 					 bool fixed_result,
@@ -237,6 +241,7 @@ FastCreateCachedPlan(Node *raw_parse_tree,
 	plansource->commandTag = commandTag;			/* no copying needed */
 	plansource->param_types = param_types;
 	plansource->num_params = num_params;
+	plansource->cursor_options = cursor_options;
 	plansource->fully_planned = fully_planned;
 	plansource->fixed_result = fixed_result;
 	plansource->search_path = search_path;
@@ -458,13 +463,11 @@ RevalidateCachedPlan(CachedPlanSource *plansource, bool useResOwner)
 		if (plansource->fully_planned)
 		{
 			/*
-			 * Generate plans for queries.  We don't need any boundParams, and
-			 * currently we don't need to worry about cursor options because
-			 * cursor plans are never saved in the plancache (that might have
-			 * to change someday).  Also, assume snapshot is not set yet
+			 * Generate plans for queries.	Assume snapshot is not set yet
 			 * (XXX this may be wasteful, won't all callers have done that?)
 			 */
-			slist = pg_plan_queries(slist, 0, NULL, true);
+			slist = pg_plan_queries(slist, plansource->cursor_options, NULL,
+									true);
 		}
 
 		/*
diff --git a/src/include/commands/prepare.h b/src/include/commands/prepare.h
index c12d248971..4fa215ecf2 100644
--- a/src/include/commands/prepare.h
+++ b/src/include/commands/prepare.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 2002-2007, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/commands/prepare.h,v 1.26 2007/04/12 06:53:48 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/commands/prepare.h,v 1.27 2007/04/16 18:21:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -51,6 +51,7 @@ extern void StorePreparedStatement(const char *stmt_name,
 					   const char *commandTag,
 					   Oid *param_types,
 					   int num_params,
+					   int cursor_options,
 					   List *stmt_list,
 					   bool from_sql);
 extern PreparedStatement *FetchPreparedStatement(const char *stmt_name,
diff --git a/src/include/utils/plancache.h b/src/include/utils/plancache.h
index 562b369044..aebbbadaf5 100644
--- a/src/include/utils/plancache.h
+++ b/src/include/utils/plancache.h
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/plancache.h,v 1.5 2007/04/12 06:53:48 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/utils/plancache.h,v 1.6 2007/04/16 18:21:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -51,6 +51,7 @@ typedef struct CachedPlanSource
 	const char *commandTag;		/* command tag (a constant!), or NULL */
 	Oid		   *param_types;	/* array of parameter type OIDs, or NULL */
 	int			num_params;		/* length of param_types array */
+	int			cursor_options;	/* cursor options used for planning */
 	bool		fully_planned;	/* do we cache planner or rewriter output? */
 	bool		fixed_result;	/* disallow change in result tupdesc? */
 	struct OverrideSearchPath *search_path;		/* saved search_path */
@@ -86,6 +87,7 @@ extern CachedPlanSource *CreateCachedPlan(Node *raw_parse_tree,
 										  const char *commandTag,
 										  Oid *param_types,
 										  int num_params,
+										  int cursor_options,
 										  List *stmt_list,
 										  bool fully_planned,
 										  bool fixed_result);
@@ -94,6 +96,7 @@ extern CachedPlanSource *FastCreateCachedPlan(Node *raw_parse_tree,
 											  const char *commandTag,
 											  Oid *param_types,
 											  int num_params,
+											  int cursor_options,
 											  List *stmt_list,
 											  bool fully_planned,
 											  bool fixed_result,