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