Changeset: cfe944b8521f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cfe944b8521f
Added Files:
        sql/test/miscellaneous/Tests/create_func_temp.sql
        sql/test/miscellaneous/Tests/create_func_temp.stable.err
        sql/test/miscellaneous/Tests/create_func_temp.stable.out
Modified Files:
        clients/examples/perl/sqlsample.pl
        clients/odbc/driver/ODBCConvert.c
        clients/odbc/driver/ODBCUtil.c
        clients/odbc/driver/SQLPrepare.c
        common/utils/mstring.h
        gdk/gdk.h
        gdk/gdk_analytic.h
        gdk/gdk_utils.c
        geom/lib/libgeom.c
        geom/monetdb5/geom.c
        monetdb5/modules/kernel/status.c
        monetdb5/modules/mal/mal_io.c
        sql/backends/monet5/rel_bin.c
        sql/server/rel_psm.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/server/rel_unnest.h
        sql/server/sql_mvc.c
        sql/server/sql_scan.c
        sql/server/sql_scan.h
        sql/storage/store.c
        sql/test/BugTracker-2009/Tests/assert_in_update.SF-2807336.stable.err
        sql/test/BugTracker-2009/Tests/assert_in_update.SF-2807336.stable.out
        sql/test/BugTracker-2014/Tests/copy-into.Bug-3481.SQL.py
        sql/test/BugTracker-2014/Tests/current_timestamp.Bug-3427.sql
        sql/test/BugTracker-2014/Tests/current_timestamp.Bug-3427.stable.err
        sql/test/BugTracker-2014/Tests/utf8bom.Bug-3436.SQL.py
        sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.sql
        sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out
        
sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out.int128
        sql/test/BugTracker-2017/Tests/error-clean-cache.Bug-6351.sql
        sql/test/BugTracker-2017/Tests/error-clean-cache.Bug-6351.stable.err
        sql/test/BugTracker-2017/Tests/error-clean-cache.Bug-6351.stable.out
        
sql/test/BugTracker-2019/Tests/copy-into-from-stdin-empty-line.Bug-6669.sql
        sql/test/BugTracker-2019/Tests/insert-into-select.Bug-6718.sql
        sql/test/BugTracker-2019/Tests/python-loader-string.Bug-6759.py
        sql/test/Tests/hot-snapshot.py
        sql/test/Tests/session_vars.sql
        sql/test/Tests/session_vars.stable.err
        sql/test/Tests/session_vars.stable.out
        sql/test/Tests/unicode.sql
        sql/test/Tests/unicode.stable.out
        sql/test/Users/Tests/copyinto.SQL.py
        sql/test/Users/Tests/copyinto.stable.err
        sql/test/mapi/Tests/perl_dbi.stable.out
        sql/test/miscellaneous/Tests/All
        sql/test/miscellaneous/Tests/declared_tables.sql
        sql/test/miscellaneous/Tests/declared_tables.stable.err
        sql/test/pg_regress/Tests/timestamp.sql
        sql/test/pg_regress/Tests/timestamptz.sql
        sql/test/ssqq/Tests/insert_query.stable.err
        sql/test/ssqq/Tests/insert_query.stable.out
        sql/test/ssqq/Tests/insert_queue.stable.err
        sql/test/ssqq/Tests/insert_queue.stable.out
        sql/test/ssqq/Tests/insert_quser.stable.err
        sql/test/ssqq/Tests/insert_quser.stable.out
        sql/test/subquery/Tests/subquery3.stable.err
        sql/test/subquery/Tests/subquery5.sql
        sql/test/subquery/Tests/subquery5.stable.err
        sql/test/subquery/Tests/subquery5.stable.out
        testing/difflib.c
        tools/merovingian/utils/utils.c
Branch: unlock
Log Message:

merged with default


diffs (truncated from 2683 to 300 lines):

diff --git a/clients/examples/perl/sqlsample.pl 
b/clients/examples/perl/sqlsample.pl
--- a/clients/examples/perl/sqlsample.pl
+++ b/clients/examples/perl/sqlsample.pl
@@ -48,6 +48,9 @@ my $dbh = DBI->connect( $dsn,
   $sth->bind_param( 1,     7 , DBI::SQL_INTEGER() );
   $sth->bind_param( 2,'seven' );
   $sth->execute;
+  $sth->bind_param( 1,    42 , DBI::SQL_INTEGER() );
+  $sth->bind_param( 2,  '\\n' );
+  $sth->execute;
 }
 {
   my $sth = $dbh->prepare('select * from perl_table;');
diff --git a/clients/odbc/driver/ODBCConvert.c 
b/clients/odbc/driver/ODBCConvert.c
--- a/clients/odbc/driver/ODBCConvert.c
+++ b/clients/odbc/driver/ODBCConvert.c
@@ -3197,6 +3197,7 @@ ODBCStore(ODBCStmt *stmt,
        case SQL_WCHAR:
        case SQL_WVARCHAR:
        case SQL_WLONGVARCHAR:
+               assign(buf, bufpos, buflen, 'r', stmt); /* RAW string */
                assign(buf, bufpos, buflen, '\'', stmt);
                switch (ctype) {
                case SQL_C_CHAR:
@@ -3205,22 +3206,11 @@ ODBCStore(ODBCStmt *stmt,
                        for (i = 0; i < slen; i++) {
                                unsigned char c = (unsigned char) sval[i];
 
-                               if (c == 0) {
+                               if (c == 0)
                                        break;
-                               } else if (c < 0x20 /* || c >= 0x7F */) {
-                                       assign(buf, bufpos, buflen, '\\', stmt);
-                                       assign(buf, bufpos, buflen, '0' + (c >> 
6), stmt);
-                                       assign(buf, bufpos, buflen, '0' + ((c 
>> 3) & 0x7), stmt);
-                                       assign(buf, bufpos, buflen, '0' + (c & 
0x7), stmt);
-                               } else if (c == '\\') {
-                                       assign(buf, bufpos, buflen, '\\', stmt);
-                                       assign(buf, bufpos, buflen, '\\', stmt);
-                               } else if (c == '\'') {
-                                       assign(buf, bufpos, buflen, '\\', stmt);
+                               if (c == '\'')
                                        assign(buf, bufpos, buflen, '\'', stmt);
-                               } else {
-                                       assign(buf, bufpos, buflen, c, stmt);
-                               }
+                               assign(buf, bufpos, buflen, c, stmt);
                        }
                        break;
                case SQL_C_BIT:
diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c
--- a/clients/odbc/driver/ODBCUtil.c
+++ b/clients/odbc/driver/ODBCUtil.c
@@ -679,7 +679,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                length = (size_t) sprintf(q, "%.*s ESCAPE '''' 
%s", n, nquery, p);
                                break;
                        case '\\':
-                               length = (size_t) sprintf(q, "%.*s ESCAPE 
'\\\\' %s", n, nquery, p);
+                               length = (size_t) sprintf(q, "%.*s ESCAPE r'\\' 
%s", n, nquery, p);
                                break;
                        default:
                                length = (size_t) sprintf(q, "%.*s ESCAPE '%c' 
%s", n, nquery, esc, p);
@@ -784,9 +784,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                                        p++;
                                        } else if (*p == '\'') {
                                                while (*++p && *p != '\'')
-                                                       if (*p == '\\' &&
-                                                           *++p == 0)
-                                                               break;
+                                                       ;
                                                if (*p)
                                                        p++;
                                        } else {
@@ -820,7 +818,7 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                if (strncasecmp(func->name, scalarfunc, 
scalarfunclen) == 0 && func->name[scalarfunclen] == 0 && func->nargs == nargs) {
                                        if (func->repl) {
                                                const char *r;
-                                               q = malloc(length - pr + 
strlen(func->repl) - nargs + (nargs > 0 ? args[0].arglen : 0) + (nargs > 1 ? 
args[1].arglen : 0) + (nargs > 2 ? args[2].arglen : 0) + 1);
+                                               q = malloc(length - pr + 
strlen(func->repl) - nargs + (nargs > 0 ? args[0].arglen + 1 : 0) + (nargs > 1 
? args[1].arglen + 1 : 0) + (nargs > 2 ? args[2].arglen + 1 : 0) + 1);
                                                if (q == NULL) {
                                                        free(nquery);
                                                        return NULL;
@@ -829,6 +827,8 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                                strncpy(q, nquery, pr);
                                                for (r = func->repl; *r; r++) {
                                                        if (*r == '\1' || *r == 
'\2' || *r == '\3' || *r == '\4') {
+                                                               if (args[*r - 
1].argstart[0] == '\'')
+                                                                       q[pr++] 
= 'r';
                                                                strncpy(q + pr, 
args[*r - 1].argstart, args[*r - 1].arglen);
                                                                pr += (int) 
args[*r - 1].arglen;
                                                        } else {
@@ -865,12 +865,17 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL
                                                for (c = convert; c->odbc; c++) 
{
                                                        if 
(strncasecmp(c->odbc, args[1].argstart, args[1].arglen) == 0 &&
                                                            
c->odbc[args[1].arglen] == 0) {
-                                                               q = 
malloc(length - pr + 11 + args[0].arglen + strlen(c->server));
+                                                               const char *raw;
+                                                               q = 
malloc(length - pr + 11 + args[0].arglen + 1 + strlen(c->server));
                                                                if (q == NULL) {
                                                                        
free(nquery);
                                                                        return 
NULL;
                                                                }
-                                                               length = 
(size_t) sprintf(q, "%.*scast(%.*s as %s)%s", n, nquery, (int) args[0].arglen, 
args[0].argstart, c->server, p);
+                                                               if 
(args[0].argstart[0] == '\'')
+                                                                       raw = 
"r";
+                                                               else
+                                                                       raw = 
"";
+                                                               length = 
(size_t) sprintf(q, "%.*scast(%s%.*s as %s)%s", n, nquery, raw, (int) 
args[0].arglen, args[0].argstart, c->server, p);
                                                                free(nquery);
                                                                nquery = q;
                                                                break;
@@ -924,7 +929,7 @@ ODBCParsePV(const char *tab, const char 
                if (*s == '\'' || *s == '\\')
                        i++;
        }
-       i += strlen(tab) + strlen(col) + 25; /* ""."" like '' escape '\\' */
+       i += strlen(tab) + strlen(col) + 25; /* ""."" like '' escape r'\' */
        res = malloc(i + 1);
        if (res == NULL)
                return NULL;
@@ -934,7 +939,7 @@ ODBCParsePV(const char *tab, const char 
                        res[i++] = *s;
                res[i++] = *s;
        }
-       for (s = "' escape '\\\\'"; *s; s++)
+       for (s = "' escape r'\\'"; *s; s++)
                res[i++] = *s;
        res[i] = 0;
        return res;
diff --git a/clients/odbc/driver/SQLPrepare.c b/clients/odbc/driver/SQLPrepare.c
--- a/clients/odbc/driver/SQLPrepare.c
+++ b/clients/odbc/driver/SQLPrepare.c
@@ -74,10 +74,6 @@ MNDBPrepare(ODBCStmt *stmt,
        }
 
        fixODBCstring(StatementText, TextLength, SQLINTEGER, addStmtError, 
stmt, return SQL_ERROR);
-       /* TODO: convert ODBC escape sequences ( {d 'value'} or {t
-        * 'value'} or {ts 'value'} or {escape 'e-char'} or {oj
-        * outer-join} or {fn scalar-function} etc. ) to MonetDB SQL
-        * syntax */
        query = ODBCTranslateSQL(stmt->Dbc, StatementText, (size_t) TextLength,
                                 stmt->noScan);
        if (query == NULL) {
diff --git a/common/utils/mstring.h b/common/utils/mstring.h
--- a/common/utils/mstring.h
+++ b/common/utils/mstring.h
@@ -12,6 +12,12 @@
 #include <stdarg.h>            /* va_list etc. */
 #include <string.h>            /* strlen */
 
+#ifdef __GNUC__
+#define GCC_Pragma(pragma)     _Pragma(pragma)
+#else
+#define GCC_Pragma(pragma)
+#endif
+
 /* copy at most (n-1) bytes from src to dst and add a terminating NULL
  * byte; return length of src (i.e. can be more than what is copied) */
 static inline size_t
@@ -23,6 +29,20 @@ strcpy_len(char *restrict dst, const cha
                                return i;
                }
                dst[n - 1] = 0;
+/* This code is correct, but GCC gives a warning in certain
+ * conditions, so we disable the warning temporarily.
+ * The warning happens e.g. in
+ *   strcpy_len(buf, "fixed string", sizeof(buf))
+ * where buf is larger than the string. In that case we never get here
+ * since return is executed in the loop above, but the compiler
+ * complains anyway about reading out-of-bounds.
+ * For GCC we use _Pragma to disable the warning (and hence error).
+ * Since other compilers may warn (and hence error out) on
+ * unrecognized pragmas, we use some preprocessor trickery. */
+GCC_Pragma("GCC diagnostic push")
+GCC_Pragma("GCC diagnostic ignored \"-Warray-bounds\"")
+               return n + strlen(src + n);
+GCC_Pragma("GCC diagnostic pop")
        }
        return strlen(src);
 }
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1710,10 +1710,10 @@ typedef struct threadStruct {
                                 * into this array + 1 (0 is
                                 * invalid) */
        ATOMIC_TYPE pid;        /* thread id, 0 = unallocated */
-       str name;
+       char name[16];
        void *data[THREADDATA];
        uintptr_t sp;
-} ThreadRec, *Thread;
+} *Thread;
 
 
 gdk_export int THRgettid(void);
@@ -1929,10 +1929,6 @@ gdk_export int ALIGNsynced(BAT *b1, BAT 
 
 gdk_export void BATassertProps(BAT *b);
 
-#define BATPROPS_QUICK  0      /* only derive easy (non-resource consuming) 
properties */
-#define BATPROPS_ALL   1       /* derive all possible properties; no matter 
what cost (key=hash) */
-#define BATPROPS_CHECK  3      /* BATPROPS_ALL, but start from scratch and 
report illegally set properties */
-
 gdk_export BAT *VIEWcreate(oid seq, BAT *b);
 gdk_export void VIEWbounds(BAT *b, BAT *view, BUN l, BUN h);
 
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -14,8 +14,6 @@
 #ifndef _GDK_ANALYTIC_H_
 #define _GDK_ANALYTIC_H_
 
-#include "gdk.h"
-
 gdk_export gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, int tpe);
 
 gdk_export gdk_return GDKanalyticalntile(BAT *r, BAT *b, BAT *p, BAT *n, int 
tpe, const void *restrict ntile);
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -573,8 +573,8 @@ MT_init(void)
        struct rlimit l;
        /* address space (virtual memory) limit */
        if (getrlimit(RLIMIT_AS, &l) == 0
-           && l.rlim_cur != RLIM_INFINITY
-           && l.rlim_cur < GDK_vm_maxsize) {
+           && (size_t)l.rlim_cur != RLIM_INFINITY
+           && (size_t)l.rlim_cur < GDK_vm_maxsize) {
                GDK_vm_maxsize = l.rlim_cur;
        }
 #endif
@@ -931,7 +931,7 @@ GDKinit(opt *set, int setlen)
 
 int GDKnr_threads = 0;
 static ATOMIC_TYPE GDKnrofthreads = ATOMIC_VAR_INIT(0);
-static ThreadRec GDKthreads[THREADS];
+static struct threadStruct GDKthreads[THREADS];
 
 bool
 GDKexiting(void)
@@ -983,8 +983,6 @@ GDKreset(int status)
                                        TRC_INFO(GDK, "Killing thread: %d\n", 
e);
                                        (void) ATOMIC_DEC(&GDKnrofthreads);
                                }
-                               GDKfree(t->name);
-                               t->name = NULL;
                                ATOMIC_SET(&t->pid, 0);
                        }
                }
@@ -1349,13 +1347,6 @@ GDK_find_self(void)
 static Thread
 THRnew(const char *name, MT_Id pid)
 {
-       char *nme = GDKstrdup(name);
-
-       if (nme == NULL) {
-               TRC_DEBUG(IO_, "Malloc failure\n");
-               GDKerror("malloc failure\n");
-               return NULL;
-       }
        for (Thread s = GDKthreads; s < GDKthreads + THREADS; s++) {
                ATOMIC_BASE_TYPE npid = 0;
                if (ATOMIC_CAS(&s->pid, &npid, pid)) {
@@ -1363,7 +1354,7 @@ THRnew(const char *name, MT_Id pid)
                        s->data[0] = THRdata[0];
                        s->data[1] = THRdata[1];
                        s->sp = THRsp();
-                       s->name = nme;
+                       strcpy_len(s->name, name, sizeof(s->name));
                        TRC_DEBUG(PAR, "%x %zu sp = %zu\n",
                                  (unsigned) s->tid,
                                  (size_t) ATOMIC_GET(&s->pid),
@@ -1373,7 +1364,6 @@ THRnew(const char *name, MT_Id pid)
                        return s;
                }
        }
-       GDKfree(nme);
        TRC_DEBUG(IO_, "Too many threads\n");
        GDKerror("too many threads\n");
        return NULL;
@@ -1428,8 +1418,6 @@ THRcreate(void (*f) (void *), void *arg,
                TRC_DEBUG(IO_, "Semaphore name is too large\n");
                GDKerror("semaphore name is too large\n");
                GDKfree(t);
-               GDKfree(s->name);
-               s->name = NULL;
                ATOMIC_SET(&s->pid, 0); /* deallocate */
                return 0;
        }
@@ -1438,8 +1426,6 @@ THRcreate(void (*f) (void *), void *arg,
                GDKerror("could not start thread\n");
                MT_sema_destroy(&t->sem);
                GDKfree(t);
-               GDKfree(s->name);
-               s->name = NULL;
                ATOMIC_SET(&s->pid, 0); /* deallocate */
                return 0;
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to