Changeset: 13d1e98e03f4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/13d1e98e03f4
Modified Files:
        gdk/gdk_string.c
        sql/server/sql_scan.c
Branch: Oct2020
Log Message:

Merge with Jun2020 branch.


diffs (159 lines):

diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -108,11 +108,14 @@ strCleanHash(Heap *h, bool rebuild)
         * started. */
        memset(newhash, 0, sizeof(newhash));
        pos = GDK_STRHASHSIZE;
-       while (pos < h->free &&
-              pos + (pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1))) < 
GDK_ELIMLIMIT) {
+       while (pos < h->free) {
+               pad = GDK_VARALIGN - (pos & (GDK_VARALIGN - 1));
                if (pad < sizeof(stridx_t))
                        pad += GDK_VARALIGN;
-               pos += pad + extralen;
+               pos += pad;
+               if (pos >= GDK_ELIMLIMIT)
+                       break;
+               pos += extralen;
                s = h->base + pos;
                if (h->hashash)
                        strhash = ((const BUN *) s)[-1];
@@ -276,9 +279,11 @@ strPut(Heap *h, var_t *dst, const char *
                pad = 0;
        }
 
+       pad += extralen;
+
        /* check heap for space (limited to a certain maximum after
         * which nils are inserted) */
-       if (h->free + pad + len + extralen >= h->size) {
+       if (h->free + pad + len >= h->size) {
                size_t newsize = MAX(h->size, 4096);
 
                /* double the heap size until we have enough space */
@@ -287,11 +292,11 @@ strPut(Heap *h, var_t *dst, const char *
                                newsize <<= 1;
                        else
                                newsize += 4 * 1024 * 1024;
-               } while (newsize <= h->free + pad + len + extralen);
+               } while (newsize <= h->free + pad + len);
 
                assert(newsize);
 
-               if (h->free + pad + len + extralen >= (size_t) VAR_MAX) {
+               if (h->free + pad + len >= (size_t) VAR_MAX) {
                        GDKerror("string heaps gets larger than %zuGiB.\n", 
(size_t) VAR_MAX >> 30);
                        return 0;
                }
@@ -299,19 +304,16 @@ strPut(Heap *h, var_t *dst, const char *
                if (HEAPextend(h, newsize, true) != GDK_SUCCEED) {
                        return 0;
                }
-#ifndef NDEBUG
-               /* fill should solve initialization problems within
-                * valgrind */
-               memset(h->base + h->free, 0, h->size - h->free);
-#endif
 
                /* make bucket point into the new heap */
                bucket = ((stridx_t *) h->base) + off;
        }
 
        /* insert string */
-       pos = h->free + pad + extralen;
+       pos = h->free + pad;
        *dst = (var_t) pos;
+       if (pad > 0)
+               memset(h->base + h->free, 0, pad);
        memcpy(h->base + pos, v, len);
        if (h->hashash) {
                ((BUN *) (h->base + pos))[-1] = strhash;
@@ -319,7 +321,7 @@ strPut(Heap *h, var_t *dst, const char *
                ((BUN *) (h->base + pos))[-2] = (BUN) len;
 #endif
        }
-       h->free += pad + len + extralen;
+       h->free += pad + len;
        h->dirty = true;
 
        /* maintain hash table */
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -24,30 +24,50 @@
 #include <ctype.h>
 #include "sql_keyword.h"
 
+/**
+ * Removes all comments before the query. In query comments are kept.
+ */
 char *
 query_cleaned(sql_allocator *sa, const char *query)
 {
-       char *q, *r;
+       char *q, *r, *c;
+       int lines = 0;
        int quote = 0;          /* inside quotes ('..', "..", {..}) */
        bool bs = false;                /* seen a backslash in a quoted string 
*/
        bool incomment1 = false;        /* inside traditional C style comment */
        bool incomment2 = false;        /* inside comment starting with --  */
+       bool inline_comment = false;
+
        r = SA_NEW_ARRAY(sa, char, strlen(query) + 1);
        if(!r)
                return NULL;
 
+       (void) c;
+
        for (q = r; *query; query++) {
                if (incomment1) {
                        if (*query == '/' && query[-1] == '*') {
                                incomment1 = false;
+                               if (c == r && lines > 0) {
+                                       q = r; // reset to beginning
+                                       lines = 0;
+                                       continue;
+                               }
                        }
+                       if (*query == '\n') lines++;
+                       *q++ = *query;
                } else if (incomment2) {
                        if (*query == '\n') {
                                incomment2 = false;
+                               inline_comment = false;
                                /* add newline only if comment doesn't
                                 * occupy whole line */
-                               if (q > r && q[-1] != '\n')
+                               if (q > r && q[-1] != '\n'){
                                        *q++ = '\n';
+                                       lines++;
+                               }
+                       } else if (inline_comment){
+                               *q++ = *query; // preserve in line query 
comments
                        }
                } else if (quote) {
                        if (bs) {
@@ -65,13 +85,21 @@ query_cleaned(sql_allocator *sa, const c
                        quote = '}';
                        *q++ = *query;
                } else if (*query == '-' && query[1] == '-') {
+                       if (q > r && q[-1] != '\n') {
+                               inline_comment = true;
+                               *q++ = *query; // preserve in line query 
comments
+                       }
                        incomment2 = true;
                } else if (*query == '/' && query[1] == '*') {
                        incomment1 = true;
+                       c = q;
+                       *q++ = *query;
                } else if (*query == '\n') {
                        /* collapse newlines */
-                       if (q > r && q[-1] != '\n')
+                       if (q > r && q[-1] != '\n') {
                                *q++ = '\n';
+                               lines++;
+                       }
                } else if (*query == ' ' || *query == '\t') {
                        /* collapse white space */
                        if (q > r && q[-1] != ' ')
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to