Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Allow the planner-related functions and hook to accept the query string.
authorFujii Masao <fujii@postgresql.org>
Mon, 30 Mar 2020 04:51:05 +0000 (13:51 +0900)
committerFujii Masao <fujii@postgresql.org>
Mon, 30 Mar 2020 04:51:05 +0000 (13:51 +0900)
This commit adds query_string argument into the planner-related functions
and hook and allows us to pass the query string to them.

Currently there is no user of the query string passed. But the upcoming patch
for the planning counters will add the planning hook function into
pg_stat_statements and the function will need the query string. So this change
will be necessary for that patch.

Also this change is useful for some extensions that want to use the query
string in their planner hook function.

Author: Pascal Legrand, Julien Rouhaud
Reviewed-by: Yoshikazu Imai, Tom Lane, Fujii Masao
Discussion: https://postgr.es/m/CAOBaU_bU1m3_XF5qKYtSj1ua4dxd=FWDyh2SH4rSJAUUfsGmAQ@mail.gmail.com
Discussion: https://postgr.es/m/1583789487074-0.post@n3.nabble.com

13 files changed:
src/backend/commands/copy.c
src/backend/commands/createas.c
src/backend/commands/explain.c
src/backend/commands/extension.c
src/backend/commands/matview.c
src/backend/commands/portalcmds.c
src/backend/executor/functions.c
src/backend/optimizer/plan/planner.c
src/backend/tcop/postgres.c
src/backend/utils/cache/plancache.c
src/include/optimizer/optimizer.h
src/include/optimizer/planner.h
src/include/tcop/tcopprot.h

index fbde9f88e74a5fa4d660166b1b5c2b26dce164b1..efb1e0d03e0431e051375dc2ef395cd6c1c77853 100644 (file)
@@ -1580,7 +1580,8 @@ BeginCopy(ParseState *pstate,
        }
 
        /* plan the query */
-       plan = pg_plan_query(query, CURSOR_OPT_PARALLEL_OK, NULL);
+       plan = pg_plan_query(query, pstate->p_sourcetext,
+                            CURSOR_OPT_PARALLEL_OK, NULL);
 
        /*
         * With row level security and a user using "COPY relation TO", we
index 3a5676fb39e0051a649a8592cb1e843658703fec..9febdc51653acf5189d7aab961a84c7336bcce0e 100644 (file)
@@ -329,7 +329,8 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
        Assert(query->commandType == CMD_SELECT);
 
        /* plan the query */
-       plan = pg_plan_query(query, CURSOR_OPT_PARALLEL_OK, params);
+       plan = pg_plan_query(query, pstate->p_sourcetext,
+                            CURSOR_OPT_PARALLEL_OK, params);
 
        /*
         * Use a snapshot with an updated command ID to ensure this query sees
index ff2f45cfb2583e751c48954d8c104c6891ec0789..ee0e638f33d4e8819c62792b75d10fbf6340b1d3 100644 (file)
@@ -376,7 +376,7 @@ ExplainOneQuery(Query *query, int cursorOptions,
        INSTR_TIME_SET_CURRENT(planstart);
 
        /* plan the query */
-       plan = pg_plan_query(query, cursorOptions, params);
+       plan = pg_plan_query(query, queryString, cursorOptions, params);
 
        INSTR_TIME_SET_CURRENT(planduration);
        INSTR_TIME_SUBTRACT(planduration, planstart);
index 00cf4ef268035d8085b6229f8599e8de98e99b5a..38cbea385aed7e5090d39c7dac65e30d1de5fb33 100644 (file)
@@ -751,7 +751,7 @@ execute_sql_string(const char *sql)
                                           NULL,
                                           0,
                                           NULL);
-       stmt_list = pg_plan_queries(stmt_list, CURSOR_OPT_PARALLEL_OK, NULL);
+       stmt_list = pg_plan_queries(stmt_list, sql, CURSOR_OPT_PARALLEL_OK, NULL);
 
        foreach(lc2, stmt_list)
        {
index c3954f3e242c28acb6b7d0e3f4a396555d19f124..e5a5eef10213d1886b2382e658217f68fb7591c4 100644 (file)
@@ -391,7 +391,7 @@ refresh_matview_datafill(DestReceiver *dest, Query *query,
    CHECK_FOR_INTERRUPTS();
 
    /* Plan the query which will generate data for the refresh. */
-   plan = pg_plan_query(query, 0, NULL);
+   plan = pg_plan_query(query, queryString, 0, NULL);
 
    /*
     * Use a snapshot with an updated command ID to ensure this query sees
index 40be5069fefa10f99b123f1a1c351f3c0c68b322..6a2c233615795dfd6b9c9cdb3f9d9e296540cc17 100644 (file)
@@ -90,7 +90,7 @@ PerformCursorOpen(ParseState *pstate, DeclareCursorStmt *cstmt, ParamListInfo pa
        elog(ERROR, "non-SELECT statement in DECLARE CURSOR");
 
    /* Plan the query, applying the specified options */
-   plan = pg_plan_query(query, cstmt->options, params);
+   plan = pg_plan_query(query, pstate->p_sourcetext, cstmt->options, params);
 
    /*
     * Create a portal and copy the plan and query string into its memory.
index c53aaaca61254146b6662e0d0896d68fbdf714d3..1c387a952e32b5f23a248a208e672a74a4826e08 100644 (file)
@@ -510,6 +510,7 @@ init_execution_state(List *queryTree_list,
            }
            else
                stmt = pg_plan_query(queryTree,
+                                    fcache->src,
                                     CURSOR_OPT_PARALLEL_OK,
                                     NULL);
 
index b65abf6046d419f37043d0e3de7ca9111834238e..f52226cceccc3a14b43176fe633ab1283ccb4f3b 100644 (file)
@@ -264,19 +264,21 @@ static int    common_prefix_cmp(const void *a, const void *b);
  *
  *****************************************************************************/
 PlannedStmt *
-planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
+planner(Query *parse, const char *query_string, int cursorOptions,
+       ParamListInfo boundParams)
 {
    PlannedStmt *result;
 
    if (planner_hook)
-       result = (*planner_hook) (parse, cursorOptions, boundParams);
+       result = (*planner_hook) (parse, query_string, cursorOptions, boundParams);
    else
-       result = standard_planner(parse, cursorOptions, boundParams);
+       result = standard_planner(parse, query_string, cursorOptions, boundParams);
    return result;
 }
 
 PlannedStmt *
-standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
+standard_planner(Query *parse, const char *query_string, int cursorOptions,
+                ParamListInfo boundParams)
 {
    PlannedStmt *result;
    PlannerGlobal *glob;
index cb8c23e4b764b89ca2db3ffdc27fc242b643413c..21214317a79578e45836ae8a05259b80c0fafb87 100644 (file)
@@ -854,7 +854,8 @@ pg_rewrite_query(Query *query)
  * This is a thin wrapper around planner() and takes the same parameters.
  */
 PlannedStmt *
-pg_plan_query(Query *querytree, int cursorOptions, ParamListInfo boundParams)
+pg_plan_query(Query *querytree, const char *query_string, int cursorOptions,
+             ParamListInfo boundParams)
 {
    PlannedStmt *plan;
 
@@ -871,7 +872,7 @@ pg_plan_query(Query *querytree, int cursorOptions, ParamListInfo boundParams)
        ResetUsage();
 
    /* call the optimizer */
-   plan = planner(querytree, cursorOptions, boundParams);
+   plan = planner(querytree, query_string, cursorOptions, boundParams);
 
    if (log_planner_stats)
        ShowUsage("PLANNER STATISTICS");
@@ -939,7 +940,8 @@ pg_plan_query(Query *querytree, int cursorOptions, ParamListInfo boundParams)
  * The result is a list of PlannedStmt nodes.
  */
 List *
-pg_plan_queries(List *querytrees, int cursorOptions, ParamListInfo boundParams)
+pg_plan_queries(List *querytrees, const char *query_string, int cursorOptions,
+               ParamListInfo boundParams)
 {
    List       *stmt_list = NIL;
    ListCell   *query_list;
@@ -961,7 +963,8 @@ pg_plan_queries(List *querytrees, int cursorOptions, ParamListInfo boundParams)
        }
        else
        {
-           stmt = pg_plan_query(query, cursorOptions, boundParams);
+           stmt = pg_plan_query(query, query_string, cursorOptions,
+                                boundParams);
        }
 
        stmt_list = lappend(stmt_list, stmt);
@@ -1152,7 +1155,7 @@ exec_simple_query(const char *query_string)
        querytree_list = pg_analyze_and_rewrite(parsetree, query_string,
                                                NULL, 0, NULL);
 
-       plantree_list = pg_plan_queries(querytree_list,
+       plantree_list = pg_plan_queries(querytree_list, query_string,
                                        CURSOR_OPT_PARALLEL_OK, NULL);
 
        /*
index 5011d3eb861cc01b0426e60e03c05a95cb8305d1..75b475c179b9cb27e29a0497343d50c662afede4 100644 (file)
@@ -930,7 +930,8 @@ BuildCachedPlan(CachedPlanSource *plansource, List *qlist,
    /*
     * Generate the plan.
     */
-   plist = pg_plan_queries(qlist, plansource->cursor_options, boundParams);
+   plist = pg_plan_queries(qlist, plansource->query_string,
+                           plansource->cursor_options, boundParams);
 
    /* Release snapshot if we got one */
    if (snapshot_set)
index 5283995df8f0449f52a2f2cdfcf0919ffd197cb6..3e4171056e8a66a3bf96c34552aef68576b88899 100644 (file)
@@ -102,7 +102,8 @@ typedef enum
 extern int force_parallel_mode;
 extern bool parallel_leader_participation;
 
-extern struct PlannedStmt *planner(Query *parse, int cursorOptions,
+extern struct PlannedStmt *planner(Query *parse, const char *query_string,
+                                  int cursorOptions,
                                   struct ParamListInfoData *boundParams);
 
 extern Expr *expression_planner(Expr *expr);
index 93df62d1361faac13882558e444a9e883438ab01..beb7dbbcbe83682b7fe5b4866d15b4dc4f1a3fac 100644 (file)
@@ -24,6 +24,7 @@
 
 /* Hook for plugins to get control in planner() */
 typedef PlannedStmt *(*planner_hook_type) (Query *parse,
+                                          const char *query_string,
                                           int cursorOptions,
                                           ParamListInfo boundParams);
 extern PGDLLIMPORT planner_hook_type planner_hook;
@@ -37,7 +38,8 @@ typedef void (*create_upper_paths_hook_type) (PlannerInfo *root,
 extern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;
 
 
-extern PlannedStmt *standard_planner(Query *parse, int cursorOptions,
+extern PlannedStmt *standard_planner(Query *parse, const char *query_string,
+                                    int cursorOptions,
                                     ParamListInfo boundParams);
 
 extern PlannerInfo *subquery_planner(PlannerGlobal *glob, Query *parse,
index 750ba4a3e25cfd319fa4e4d98c4ddcade4558bc3..bd30607b070f485af95456efefdb13b1a302d80f 100644 (file)
@@ -52,9 +52,11 @@ extern List *pg_analyze_and_rewrite_params(RawStmt *parsetree,
                                           ParserSetupHook parserSetup,
                                           void *parserSetupArg,
                                           QueryEnvironment *queryEnv);
-extern PlannedStmt *pg_plan_query(Query *querytree, int cursorOptions,
+extern PlannedStmt *pg_plan_query(Query *querytree, const char *query_string,
+                                 int cursorOptions,
                                  ParamListInfo boundParams);
-extern List *pg_plan_queries(List *querytrees, int cursorOptions,
+extern List *pg_plan_queries(List *querytrees, const char *query_string,
+                            int cursorOptions,
                             ParamListInfo boundParams);
 
 extern bool check_max_stack_depth(int *newval, void **extra, GucSource source);