summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavan Deolasee2017-06-14 06:12:23 +0000
committerPavan Deolasee2017-06-14 06:12:23 +0000
commit18b853db9450c1418ddb3f356424ed65d1ac98a6 (patch)
tree7c0f620aa254f4cdb9f1fbe81136d7623a3a6fe6
parent15dd5274c323fb93e4e3ea9ad2185aaaec10f79c (diff)
Revert "Collect and return query substrings corresponding to each SQL statement"
This reverts commit 455ff923454e78d80b77639a381db9b05c776577. Core Postgres has now added support for extracting query string for each command in a multi-command SQL. So we can use that facility instead of cooking up something on our own.
-rw-r--r--src/backend/commands/tablecmds.c2
-rw-r--r--src/backend/parser/gram.y95
-rw-r--r--src/backend/parser/parse_type.c2
-rw-r--r--src/backend/parser/parser.c5
-rw-r--r--src/backend/parser/scan.l34
-rw-r--r--src/backend/tcop/postgres.c40
-rw-r--r--src/include/parser/gramparse.h1
-rw-r--r--src/include/parser/parser.h2
-rw-r--r--src/include/parser/scanner.h8
-rw-r--r--src/include/tcop/tcopprot.h1
-rw-r--r--src/pl/plpgsql/src/pl_gram.y2
11 files changed, 14 insertions, 178 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 5be449648c..78ab65f600 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -9813,7 +9813,7 @@ ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd,
* parse_analyze() or the rewriter, but instead we need to pass them
* through parse_utilcmd.c to make them ready for execution.
*/
- raw_parsetree_list = raw_parser(cmd, NULL);
+ raw_parsetree_list = raw_parser(cmd);
querytree_list = NIL;
foreach(list_item, raw_parsetree_list)
{
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7fa2f21e3f..739ff10b07 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -130,14 +130,6 @@ typedef struct ImportQual
List *table_names;
} ImportQual;
-typedef struct StmtMulti
-{
- List *parsetrees;
- List *queries;
- int offset;
- char *lastQuery;
-} StmtMulti;
-
/* ConstraintAttributeSpec yields an integer bitmask of these flags: */
#define CAS_NOT_DEFERRABLE 0x01
#define CAS_DEFERRABLE 0x02
@@ -250,7 +242,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
InsertStmt *istmt;
VariableSetStmt *vsetstmt;
/* PGXC_BEGIN */
- struct StmtMulti *stmtmulti;
DistributeBy *distby;
PGXCSubCluster *subclus;
/* PGXC_END */
@@ -388,8 +379,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <ival> import_qualification_type
%type <importqual> import_qualification
-%type <stmtmulti> stmtmulti
-%type <list> stmtblock
+%type <list> stmtblock stmtmulti
OptTableElementList TableElementList OptInherit definition
OptTypedTableElementList TypedTableElementList
reloptions opt_reloptions
@@ -806,8 +796,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
*/
stmtblock: stmtmulti
{
- pg_yyget_extra(yyscanner)->parsetree = $1 ? $1->parsetrees : NIL;
- pg_yyget_extra(yyscanner)->queries = $1 ? $1->queries : NIL;
+ pg_yyget_extra(yyscanner)->parsetree = $1;
}
;
@@ -823,63 +812,12 @@ stmtblock: stmtmulti
*/
stmtmulti: stmtmulti ';' stmt
{
- /*
- * XXX PG10MERGE: Looks like support for obtaining raw
- * query string for individual commands is added in PG10.
- * If so, we can make use of the same infrastructure.
- *
- * XXX The following gives a compilation WARNING because
- * stmtmulti is defined as a List in PG10, but we have our
- * own definition.
- */
if ($1 != NIL)
{
/* update length of previous stmt */
updateRawStmtEnd(llast_node(RawStmt, $1), @2);
}
if ($3 != NULL)
- {
- char *query;
- ListCell *last;
- /*
- * Because of the way multi-commands are parsed by the
- * parser, when the earlier command was parsed and
- * reduced to a 'stmtmulti', we did not have the
- * end-of-the-query marker. But now that we have seen
- * the ';' token, add '\0' at the corresponding offset
- * to get a separated command.
- */
- if ($1 != NULL)
- {
- last = list_tail($1->queries);
- query = palloc(@2 - $1->offset + 1);
- memcpy(query, lfirst(last), @2 - $1->offset);
- query[@2 - $1->offset] = '\0';
- lfirst(last) = query;
-
- query = scanner_get_query(@3, -1, yyscanner);
- $1->offset = @2;
- $1->parsetrees = lappend($1->parsetrees, $3);
- $1->queries = lappend($1->queries, query);
- $$ = $1;
- }
- /*
- *
- * If the earlier statements were all null, then we
- * must initialise the StmtMulti structure and make
- * singleton lists
- */
- else
- {
- StmtMulti *n = (StmtMulti *) palloc0(sizeof (StmtMulti));
- query = scanner_get_query(@3, -1, yyscanner);
- n->offset = @2;
- n->parsetrees = list_make1($3);
- n->queries = list_make1(query);
- $$ = n;
- }
- }
- if ($3 != NULL)
$$ = lappend($1, makeRawStmt($3, @2 + 1));
else
$$ = $1;
@@ -887,36 +825,9 @@ stmtmulti: stmtmulti ';' stmt
| stmt
{
if ($1 != NULL)
- {
- StmtMulti *n = (StmtMulti *) palloc0(sizeof (StmtMulti));
- char *query = scanner_get_query(@1, -1, yyscanner);
-
- /*
- * Keep track of the offset where $1 started. We don't
- * have the offset where it ends so we copy the entire
- * query to the end. If later, we find a ';' followed
- * by another command, we'll add the '\0' at the
- * appropriate offset
- *
- * XXX May be there is a better way to get the matching
- * portion of the query string, but this does the trick
- * for regression as well as the problem we are trying
- * to solve with multi-command queries
- */
- n->offset = @1;
-
- /*
- * Collect both parsetree as well as the original query
- * that resulted in the parsetree
- */
- n->parsetrees = list_make1($1);
- n->queries = list_make1(query);
- $$ = n;
- }
- if ($1 != NULL)
$$ = list_make1(makeRawStmt($1, 0));
else
- $$ = NULL;
+ $$ = NIL;
}
;
diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c
index a723ea15ad..b71b17bd2a 100644
--- a/src/backend/parser/parse_type.c
+++ b/src/backend/parser/parse_type.c
@@ -709,7 +709,7 @@ typeStringToTypeName(const char *str)
ptserrcontext.previous = error_context_stack;
error_context_stack = &ptserrcontext;
- raw_parsetree_list = raw_parser(buf.data, NULL);
+ raw_parsetree_list = raw_parser(buf.data);
error_context_stack = ptserrcontext.previous;
diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c
index 522d7ec203..245b4cda3b 100644
--- a/src/backend/parser/parser.c
+++ b/src/backend/parser/parser.c
@@ -33,7 +33,7 @@
* of the list are always RawStmt nodes.
*/
List *
-raw_parser(const char *str, List **queries)
+raw_parser(const char *str)
{
core_yyscan_t yyscanner;
base_yy_extra_type yyextra;
@@ -58,9 +58,6 @@ raw_parser(const char *str, List **queries)
if (yyresult) /* error */
return NIL;
- if (queries)
- *queries = yyextra.queries;
-
return yyextra.parsetree;
}
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 83a73410b8..634bfa512f 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -1108,10 +1108,6 @@ scanner_init(const char *str,
yyext->keywords = keywords;
yyext->num_keywords = num_keywords;
-#ifdef XCP
- yyext->query = pstrdup(str);
-#endif
-
yyext->backslash_quote = backslash_quote;
yyext->escape_string_warning = escape_string_warning;
yyext->standard_conforming_strings = standard_conforming_strings;
@@ -1546,33 +1542,3 @@ core_yyfree(void *ptr, core_yyscan_t yyscanner)
if (ptr)
pfree(ptr);
}
-
-/*
- * Return a copy of a substring of the original query string, starting at
- * 'start' offset and 'len' bytes long, Be mindful of the invalid arguments
- * being passed by the caller
- */
-char *
-scanner_get_query(int start, int len, core_yyscan_t yyscanner)
-{
- char *query;
-
- /*
- * If the caller passes a wrong offset, just assume 0
- */
- if (start == -1)
- start = 0;
- if (start > strlen(yyextra->query))
- return NULL;
- /*
- * Similarly, if the passed-in length is more than remaining
- * bytes in the string, just return whatever is available
- */
- if (len == -1)
- len = strlen(yyextra->query) - start;
- else if (len + start > strlen(yyextra->query))
- return NULL;
-
- query = yyextra->query + start;
- return query;
-}
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index a4f4884372..b10e0e44d9 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -742,8 +742,8 @@ ProcessClientWriteInterrupt(bool blocked)
* we've seen a COMMIT or ABORT command; when we are in abort state, other
* commands are not processed any further than the raw parse stage.
*/
-static List *
-pg_parse_query_internal(const char *query_string, List **querysource_list)
+List *
+pg_parse_query(const char *query_string)
{
List *raw_parsetree_list;
@@ -752,7 +752,7 @@ pg_parse_query_internal(const char *query_string, List **querysource_list)
if (log_parser_stats)
ResetUsage();
- raw_parsetree_list = raw_parser(query_string, querysource_list);
+ raw_parsetree_list = raw_parser(query_string);
if (log_parser_stats)
ShowUsage("PARSER STATISTICS");
@@ -775,18 +775,6 @@ pg_parse_query_internal(const char *query_string, List **querysource_list)
return raw_parsetree_list;
}
-List *
-pg_parse_query(const char *query_string)
-{
- return pg_parse_query_internal(query_string, NULL);
-}
-
-List *
-pg_parse_query_get_source(const char *query_string, List **querysource_list)
-{
- return pg_parse_query_internal(query_string, querysource_list);
-}
-
/*
* Given a raw parsetree (gram.y output), and optionally information about
* types of parameter symbols ($n), perform parse analysis and rule rewriting.
@@ -1056,8 +1044,6 @@ exec_simple_query(const char *query_string)
MemoryContext oldcontext;
List *parsetree_list;
ListCell *parsetree_item;
- List *querysource_list;
- ListCell *querysource_item;
bool save_log_statement_stats = log_statement_stats;
bool was_logged = false;
bool isTopLevel;
@@ -1106,7 +1092,7 @@ exec_simple_query(const char *query_string)
* Do basic parsing of the query or queries (this should be safe even if
* we are in aborted transaction state!)
*/
- parsetree_list = pg_parse_query_get_source(query_string, &querysource_list);
+ parsetree_list = pg_parse_query(query_string);
#ifdef XCP
if (IS_PGXC_LOCAL_COORDINATOR && list_length(parsetree_list) > 1)
@@ -1173,10 +1159,9 @@ exec_simple_query(const char *query_string)
/*
* Run through the raw parsetree(s) and process each one.
*/
- forboth(parsetree_item, parsetree_list, querysource_item, querysource_list)
+ foreach(parsetree_item, parsetree_list)
{
RawStmt *parsetree = lfirst_node(RawStmt, parsetree_item);
- char *querysource = (char *) lfirst(querysource_item);
bool snapshot_set = false;
const char *commandTag;
char completionTag[COMPLETION_TAG_BUFSIZE];
@@ -1290,23 +1275,10 @@ exec_simple_query(const char *query_string)
* We don't have to copy anything into the portal, because everything
* we are passing here is in MessageContext, which will outlive the
* portal anyway.
- *
- * The query_string may contain multiple commands separated by ';' and
- * we have a separate parsetree corresponding to each such command.
- * Since we later may send down the query to the remote nodes
- * (especially for utility queries), using the query_string is a
- * problem because the same query will be sent out multiple times, one
- * for each command processed. So we taught the parser to return the
- * portion of the query_string along with the parsetree and use that
- * while defining a portal below.
- *
- * XXX Since the portal expects to see a valid query_string, if the
- * substring is available, use the original query_string. Not elegant,
- * but far better than what we were doing earlier
*/
PortalDefineQuery(portal,
NULL,
- querysource ? querysource : query_string,
+ query_string,
commandTag,
plantree_list,
NULL);
diff --git a/src/include/parser/gramparse.h b/src/include/parser/gramparse.h
index a8c267a28c..2da98f67f3 100644
--- a/src/include/parser/gramparse.h
+++ b/src/include/parser/gramparse.h
@@ -53,7 +53,6 @@ typedef struct base_yy_extra_type
* State variables that belong to the grammar.
*/
List *parsetree; /* final parse result is delivered here */
- List *queries;
} base_yy_extra_type;
/*
diff --git a/src/include/parser/parser.h b/src/include/parser/parser.h
index cce7844457..c8ad710dac 100644
--- a/src/include/parser/parser.h
+++ b/src/include/parser/parser.h
@@ -32,7 +32,7 @@ extern PGDLLIMPORT bool standard_conforming_strings;
/* Primary entry point for the raw parsing functions */
-extern List *raw_parser(const char *str, List **queries);
+extern List *raw_parser(const char *str);
/* Utility functions exported by gram.y (perhaps these should be elsewhere) */
extern List *SystemFuncName(char *name);
diff --git a/src/include/parser/scanner.h b/src/include/parser/scanner.h
index 597ff17078..74f1cc897f 100644
--- a/src/include/parser/scanner.h
+++ b/src/include/parser/scanner.h
@@ -72,13 +72,6 @@ typedef struct core_yy_extra_type
char *scanbuf;
Size scanbuflen;
-#ifdef XCP
- /*
- * Pointer to the original query string
- */
- char *query;
-#endif
-
/*
* The keyword list to use.
*/
@@ -133,6 +126,5 @@ extern int core_yylex(core_YYSTYPE *lvalp, YYLTYPE *llocp,
core_yyscan_t yyscanner);
extern int scanner_errposition(int location, core_yyscan_t yyscanner);
extern void scanner_yyerror(const char *message, core_yyscan_t yyscanner) pg_attribute_noreturn();
-extern char *scanner_get_query(int start, int len, core_yyscan_t yyscanner);
#endif /* SCANNER_H */
diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h
index a32735bd3f..8700e5d88e 100644
--- a/src/include/tcop/tcopprot.h
+++ b/src/include/tcop/tcopprot.h
@@ -51,7 +51,6 @@ typedef enum
extern int log_statement;
extern List *pg_parse_query(const char *query_string);
-extern List *pg_parse_query_get_source(const char *query_string, List **queries);
extern List *pg_analyze_and_rewrite(RawStmt *parsetree,
const char *query_string,
Oid *paramTypes, int numParams,
diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y
index c2e64957a5..94f1f58593 100644
--- a/src/pl/plpgsql/src/pl_gram.y
+++ b/src/pl/plpgsql/src/pl_gram.y
@@ -3557,7 +3557,7 @@ check_sql_expr(const char *stmt, int location, int leaderlen)
error_context_stack = &syntax_errcontext;
oldCxt = MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
- (void) raw_parser(stmt, NULL);
+ (void) raw_parser(stmt);
MemoryContextSwitchTo(oldCxt);
/* Restore former ereport callback */