diff options
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r-- | src/backend/tcop/postgres.c | 95 |
1 files changed, 64 insertions, 31 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index c087db44456..d7e39aed64b 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -637,9 +637,11 @@ pg_parse_query(const char *query_string) * NOTE: for reasons mentioned above, this must be separate from raw parsing. */ List * -pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, - const Oid *paramTypes, int numParams, - QueryEnvironment *queryEnv) +pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, + const char *query_string, + const Oid *paramTypes, + int numParams, + QueryEnvironment *queryEnv) { Query *query; List *querytree_list; @@ -670,6 +672,59 @@ pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, const char *query_string, /* * Do parse analysis and rewriting. This is the same as + * pg_analyze_and_rewrite_fixedparams except that it's okay to deduce + * information about $n symbol datatypes from context. + */ +List * +pg_analyze_and_rewrite_varparams(RawStmt *parsetree, + const char *query_string, + Oid **paramTypes, + int *numParams, + QueryEnvironment *queryEnv) +{ + Query *query; + List *querytree_list; + + TRACE_POSTGRESQL_QUERY_REWRITE_START(query_string); + + /* + * (1) Perform parse analysis. + */ + if (log_parser_stats) + ResetUsage(); + + query = parse_analyze_varparams(parsetree, query_string, paramTypes, numParams, + queryEnv); + + /* + * Check all parameter types got determined. + */ + for (int i = 0; i < *numParams; i++) + { + Oid ptype = (*paramTypes)[i]; + + if (ptype == InvalidOid || ptype == UNKNOWNOID) + ereport(ERROR, + (errcode(ERRCODE_INDETERMINATE_DATATYPE), + errmsg("could not determine data type of parameter $%d", + i + 1))); + } + + if (log_parser_stats) + ShowUsage("PARSE ANALYSIS STATISTICS"); + + /* + * (2) Rewrite the queries, as necessary + */ + querytree_list = pg_rewrite_query(query); + + TRACE_POSTGRESQL_QUERY_REWRITE_DONE(query_string); + + return querytree_list; +} + +/* + * Do parse analysis and rewriting. This is the same as * pg_analyze_and_rewrite_fixedparams except that, instead of a fixed list of * parameter datatypes, a parser callback is supplied that can do * external-parameter resolution and possibly other things. @@ -1409,7 +1464,6 @@ exec_parse_message(const char *query_string, /* string to execute */ if (parsetree_list != NIL) { - Query *query; bool snapshot_set = false; raw_parse_tree = linitial_node(RawStmt, parsetree_list); @@ -1449,34 +1503,13 @@ exec_parse_message(const char *query_string, /* string to execute */ /* * Analyze and rewrite the query. Note that the originally specified * parameter set is not required to be complete, so we have to use - * parse_analyze_varparams(). - */ - if (log_parser_stats) - ResetUsage(); - - query = parse_analyze_varparams(raw_parse_tree, - query_string, - ¶mTypes, - &numParams); - - /* - * Check all parameter types got determined. + * pg_analyze_and_rewrite_varparams(). */ - for (int i = 0; i < numParams; i++) - { - Oid ptype = paramTypes[i]; - - if (ptype == InvalidOid || ptype == UNKNOWNOID) - ereport(ERROR, - (errcode(ERRCODE_INDETERMINATE_DATATYPE), - errmsg("could not determine data type of parameter $%d", - i + 1))); - } - - if (log_parser_stats) - ShowUsage("PARSE ANALYSIS STATISTICS"); - - querytree_list = pg_rewrite_query(query); + querytree_list = pg_analyze_and_rewrite_varparams(raw_parse_tree, + query_string, + ¶mTypes, + &numParams, + NULL); /* Done with the snapshot used for parsing */ if (snapshot_set) |