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