Changeset: eae571141118 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=eae571141118
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/mapiclient/dotmonetdb.c
        clients/mapiclient/mclient.c
        clients/odbc/driver/ODBCConvert.c
        clients/odbc/driver/ODBCUtil.c
        clients/odbc/driver/SQLPrepare.c
        common/utils/msabaoth.c
        common/utils/mstring.h
        gdk/gdk.h
        gdk/gdk_aggr.c
        gdk/gdk_analytic.h
        gdk/gdk_bbp.c
        gdk/gdk_logger.c
        gdk/gdk_string.c
        gdk/gdk_time.c
        gdk/gdk_tracer.c
        gdk/gdk_utils.c
        geom/lib/libgeom.c
        geom/monetdb5/geom.c
        monetdb5/mal/mal_runtime.c
        monetdb5/modules/kernel/status.c
        monetdb5/modules/mal/mal_io.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_upgrades.c
        sql/server/rel_prop.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/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/subquery4.sql
        sql/test/subquery/Tests/subquery4.stable.err
        sql/test/subquery/Tests/subquery4.stable.out
        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/daemon/controlrunner.c
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/utils/utils.c
Branch: mbedded
Log Message:

merged with default


diffs (truncated from 3652 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/mapiclient/dotmonetdb.c b/clients/mapiclient/dotmonetdb.c
--- a/clients/mapiclient/dotmonetdb.c
+++ b/clients/mapiclient/dotmonetdb.c
@@ -17,6 +17,8 @@ parse_dotmonetdb(DotMonetdb *dotfile)
        FILE *config = NULL;
        char buf[FILENAME_MAX];
 
+       if (dotfile == NULL)
+               return;
        if ((cfile = getenv("DOTMONETDBFILE")) == NULL) {
                /* no environment variable: use a default */
                if ((config = fopen(".monetdb", "r")) == NULL) {
@@ -46,9 +48,7 @@ parse_dotmonetdb(DotMonetdb *dotfile)
                cfile = strdup(cfile);
        }
 
-        if (dotfile) {
-               *dotfile = (DotMonetdb) {0};
-        }
+       *dotfile = (DotMonetdb) {0};
 
        if (config) {
                int line = 0;
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -3252,7 +3252,6 @@ main(int argc, char **argv)
        }
 
        /* parse config file first, command line options override */
-       // parse_dotmonetdb(&user, &passwd, &dbname, &language, &save_history, 
&output, &pagewidth);
        parse_dotmonetdb(&dotfile);
         user = dotfile.user;
         passwd = dotfile.passwd;
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/msabaoth.c b/common/utils/msabaoth.c
--- a/common/utils/msabaoth.c
+++ b/common/utils/msabaoth.c
@@ -750,6 +750,11 @@ msab_getStatus(sabdb** ret, char *dbname
        sabdb *sdb;
        sdb = *ret = NULL;
 
+       if (dbname && strpbrk(dbname, "/\\") != NULL) {
+               snprintf(data, sizeof(data),
+                                "database name contains disallowed 
characters");
+               return strdup(data);
+       }
        /* scan the parent for directories */
        if ((p = getFarmPath(pathbuf, sizeof(pathbuf), NULL)) != NULL)
                return(p);
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
@@ -1709,10 +1709,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);
@@ -1928,10 +1928,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_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3759,7 +3759,7 @@ BATgroupcorrelation(BAT *b1, BAT *b2, BA
             (BATcount(e) == BATcount(b1) && (e->hseqbase == b1->hseqbase || 
e->hseqbase == b2->hseqbase))) &&
            (BATtdense(g) || (g->tkey && g->tnonil))) {
                dbl v = dbl_nil;
-               return BATconstant(ngrp == 0 ? 0 : min, TYPE_dbl, &v, ngrp, 
TRANSIENT);
+               return BATconstant(min, TYPE_dbl, &v, ngrp, TRANSIENT);
        }
 
        delta1 = GDKmalloc(ngrp * sizeof(dbl));
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_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -491,8 +491,9 @@ fixdateheap(BAT *b, const char *anme)
                TRC_CRITICAL(GDK, "GDKfilepath failed\n");
                return GDK_FAIL;
        }
-       /* coverity[null_returns] */
-       *strrchr(srcdir, DIR_SEP) = 0;
+       char *s;
+       if ((s = strrchr(srcdir, DIR_SEP)) != NULL)
+               *s = 0;
 
        if ((bnme = strrchr(nme, DIR_SEP)) != NULL)
                bnme++;
@@ -943,6 +944,7 @@ BBPreadEntries(FILE *fp, unsigned bbpver
                if ((s = strchr(headname, '~')) != NULL && s == headname) {
                        int len = snprintf(logical, sizeof(logical), "tmp_%o", 
(unsigned) bid);
                        if (len == -1 || len >= (int) sizeof(logical)) {
+                               BATdestroy(bn);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to