Make plancache store cursor options so it can pass them to planner during
authorTom Lane
Mon, 16 Apr 2007 18:21:07 +0000 (18:21 +0000)
committerTom Lane
Mon, 16 Apr 2007 18:21:07 +0000 (18:21 +0000)
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.

src/backend/commands/prepare.c
src/backend/executor/spi.c
src/backend/tcop/postgres.c
src/backend/utils/cache/plancache.c
src/include/commands/prepare.h
src/include/utils/plancache.h

index 9a4f88d1a0b1f1e3c966e3ce0217d595c00d743f..e7976ebb6e1280749f1055f8bb8153a3a5cd6493 100644 (file)
@@ -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);
index e0c11b7b13bd57cc5b7fed8871df707decccc1eb..0a5625a0c583b60fdfad1ba4ef9edeb11be5c7e1 100644 (file)
@@ -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);
index 7722eddf3474e6dd8637279782944f06e4a87135..acf12dae6f11492b0f7b505d2668f9c0f6ea23b0 100644 (file)
@@ -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,
index 28838eba09a88d7002fee9808b634309970a5ff1..a47fa3375f78b35aed0d024957cc614ceeb49ad5 100644 (file)
@@ -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);
        }
 
        /*
index c12d248971e0c797468d3db56ba854c971e90c04..4fa215ecf2d51b8a8b609a5894755ab53d0abb9c 100644 (file)
@@ -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,
index 562b369044f0008e84d0603fbb198c73239f4556..aebbbadaf51169b1536f9fdcdd94e1365047d861 100644 (file)
@@ -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,