Avoid repeated palloc for query strings while handling multi-statement SQLs
authorPavan Deolasee <[email protected]>
Thu, 3 Mar 2016 09:31:06 +0000 (15:01 +0530)
committerPavan Deolasee <[email protected]>
Thu, 3 Mar 2016 09:31:06 +0000 (15:01 +0530)
We now only pass pointers until we have the complete query string. At that
point, we only required bytes and copy the query string

src/backend/parser/gram.y
src/backend/parser/scan.l
src/backend/tcop/postgres.c

index 4593316fb93582f2347327b5ddbfdcab1018880c..c42e59a437d7fe0c694f44b9549f00cad7314760 100644 (file)
@@ -778,7 +778,8 @@ stmtmulti:  stmtmulti ';' stmt
                                {
                                        if ($3 != NULL)
                                        {
-                                               char *query = scanner_get_query(@3, -1, yyscanner);
+                                               char *query;
+                                               ListCell *last;
                                                /*
                                                 * Because of the way multi-commands are parsed by the
                                                 * parser, when the earlier command was parsed and
@@ -787,12 +788,16 @@ stmtmulti:        stmtmulti ';' stmt
                                                 * the ';' token, add '\0' at the corresponding offset
                                                 * to get a separated command.
                                                 */
-                                               if ($1->lastQuery)
-                                                       $1->lastQuery[@2 - $1->offset] = '\0';
+                                               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, makeString(query));
-                                               $1->lastQuery = query;
+                                               $1->queries = lappend($1->queries, query);
                                                $$ = $1;
                                        }
                                        else
@@ -804,7 +809,6 @@ stmtmulti:  stmtmulti ';' stmt
                                        {
                                                StmtMulti *n = (StmtMulti *) palloc0(sizeof (StmtMulti));
                                                char *query = scanner_get_query(@1, -1, yyscanner);
-                                               n->lastQuery = query;
 
                                                /*
                                                 * Keep track of the offset where $1 started. We don't
@@ -825,7 +829,7 @@ stmtmulti:  stmtmulti ';' stmt
                                                 * that resulted in the parsetree
                                                 */
                                                n->parsetrees = list_make1($1);
-                                               n->queries = list_make1(makeString(query));
+                                               n->queries = list_make1(query);
                                                $$ = n;
                                        }
                                        else
index 0d36717f4e05877acc513ff40a9c972b1c7aa1d8..359ec9ca898568a3509ad1ebee37b59b7c5b72e4 100644 (file)
@@ -1557,8 +1557,6 @@ scanner_get_query(int start, int len, core_yyscan_t yyscanner)
        else if (len + start > strlen(yyextra->query))
                return NULL;
 
-       query = palloc0(len + 1);
-       memcpy(query, yyextra->query + start, len);
-       query[len] = '\0';
+       query = yyextra->query + start;
        return query; 
 }
index 52dd180877e00be44da3b2ca9be4447dc78e6bec..a7ee658a5d5aa4df44cf44f64d5481f6af1647e9 100644 (file)
@@ -1176,7 +1176,7 @@ exec_simple_query(const char *query_string)
        forboth(parsetree_item, parsetree_list, querysource_item, querysource_list)
        {
                Node       *parsetree = (Node *) lfirst(parsetree_item);
-               char       *querysource = ((Value *) lfirst(querysource_item))->val.str;
+               char       *querysource = (char *) lfirst(querysource_item);
                bool            snapshot_set = false;
                const char *commandTag;
                char            completionTag[COMPLETION_TAG_BUFSIZE];