MonetDB: default - Use ATOMIC_VAR_INIT and ATOMIC_PTR_VAR_INIT w...

2024-04-23 Thread Sjoerd Mullender via checkin-list
Changeset: fef11c1d442c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fef11c1d442c
Modified Files:
gdk/gdk_align.c
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_cand.c
gdk/gdk_heap.c
gdk/gdk_logger.c
gdk/gdk_orderidx.c
gdk/gdk_rtree.c
gdk/gdk_system.c
monetdb5/mal/mal_dataflow.c
monetdb5/mal/mal_instruction.c
sql/common/sql_types.c
sql/storage/bat/bat_storage.c
Branch: default
Log Message:

Use ATOMIC_VAR_INIT and ATOMIC_PTR_VAR_INIT where it makes sense.


diffs (truncated from 524 to 300 lines):

diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -258,6 +258,7 @@ BATmaterialize(BAT *b, BUN cap)
.farmid = BBPselectfarm(b->batRole, TYPE_oid, offheap),
.parentid = b->batCacheid,
.dirty = true,
+   .refs = ATOMIC_VAR_INIT(1),
};
settailname(tail, BBP_physical(b->batCacheid), TYPE_oid, 0);
if (HEAPalloc(tail, cap, sizeof(oid)) != GDK_SUCCEED) {
@@ -273,7 +274,6 @@ BATmaterialize(BAT *b, BUN cap)
for (p = 0; p < q; p++)
x[p] = t++;
}
-   ATOMIC_INIT(>refs, 1);
/* point of no return */
MT_lock_set(>theaplock);
assert((ATOMIC_GET(>theap->refs) & HEAPREFS) > 0);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -74,6 +74,7 @@ BATcreatedesc(oid hseq, int tt, bool hea
*h = (Heap) {
.farmid = BBPselectfarm(role, tt, offheap),
.dirty = true,
+   .refs = ATOMIC_VAR_INIT(1),
};
 
if (ATOMneedheap(tt)) {
@@ -84,6 +85,7 @@ BATcreatedesc(oid hseq, int tt, bool hea
*vh = (Heap) {
.farmid = BBPselectfarm(role, tt, varheap),
.dirty = true,
+   .refs = ATOMIC_VAR_INIT(1),
};
}
}
@@ -124,13 +126,11 @@ BATcreatedesc(oid hseq, int tt, bool hea
 
if (bn->theap) {
bn->theap->parentid = bn->batCacheid;
-   ATOMIC_INIT(>theap->refs, 1);
const char *nme = BBP_physical(bn->batCacheid);
settailname(bn->theap, nme, tt, width);
 
if (bn->tvheap) {
bn->tvheap->parentid = bn->batCacheid;
-   ATOMIC_INIT(>tvheap->refs, 1);
strconcat_len(bn->tvheap->filename,
  sizeof(bn->tvheap->filename),
  nme, ".theap", NULL);
@@ -603,6 +603,7 @@ BATclear(BAT *b, bool force)
.parentid = b->tvheap->parentid,
.dirty = true,
.hasfile = b->tvheap->hasfile,
+   .refs = ATOMIC_VAR_INIT(1),
};
strcpy_len(th->filename, b->tvheap->filename, 
sizeof(th->filename));
if (ATOMheap(b->ttype, th, 0) != GDK_SUCCEED) {
@@ -610,7 +611,6 @@ BATclear(BAT *b, bool force)
return GDK_FAIL;
}
tvp = b->tvheap->parentid;
-   ATOMIC_INIT(>refs, 1);
HEAPdecref(b->tvheap, false);
b->tvheap = th;
}
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -34,6 +34,7 @@ unshare_varsized_heap(BAT *b)
*h = (Heap) {
.parentid = b->batCacheid,
.farmid = BBPselectfarm(b->batRole, TYPE_str, varheap),
+   .refs = ATOMIC_VAR_INIT(1),
};
strconcat_len(h->filename, sizeof(h->filename),
  BBP_physical(b->batCacheid), ".theap", NULL);
@@ -42,7 +43,6 @@ unshare_varsized_heap(BAT *b)
GDKfree(h);
return GDK_FAIL;
}
-   ATOMIC_INIT(>refs, 1);
MT_lock_set(>theaplock);
Heap *oh = b->tvheap;
b->tvheap = h;
@@ -415,6 +415,7 @@ append_varsized_bat(BAT *b, BATiter *ni,
*h = (Heap) {
.parentid = b->batCacheid,
.farmid = BBPselectfarm(b->batRole, b->ttype, varheap),
+   .refs = ATOMIC_VAR_INIT(1),
};
strconcat_len(h->filename, sizeof(h->filename),
  BBP_physical(b->batCacheid), ".theap", NULL);
@@ -423,7 +424,6 @@ append_varsized_bat(BAT *b, BATiter *ni,
GDKfree(h);
return GDK_FAIL;
}
-   ATOMIC_INIT(>refs, 

MonetDB: default - Get rid of ATOMIC_DESTROY. All versions were...

2024-04-23 Thread Sjoerd Mullender via checkin-list
Changeset: a860e78c6ec8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a860e78c6ec8
Modified Files:
common/utils/matomic.h
gdk/gdk_bat.c
gdk/gdk_heap.c
gdk/gdk_imprints.c
gdk/gdk_logger.c
gdk/gdk_rtree.c
gdk/gdk_strimps.c
gdk/gdk_system.c
gdk/gdk_system.h
monetdb5/mal/mal_client.c
monetdb5/mal/mal_instruction.c
sql/storage/bat/bat_storage.c
sql/storage/objectset.c
sql/storage/store.c
Branch: default
Log Message:

Get rid of ATOMIC_DESTROY.  All versions were just ((void)0).


diffs (232 lines):

diff --git a/common/utils/matomic.h b/common/utils/matomic.h
--- a/common/utils/matomic.h
+++ b/common/utils/matomic.h
@@ -18,7 +18,6 @@
  * The following operations are defined:
  * ATOMIC_VAR_INIT -- initializer for the variable (not necessarily atomic!);
  * ATOMIC_INIT -- initialize the variable (not necessarily atomic!);
- * ATOMIC_DESTROY -- destroy the variable
  * ATOMIC_GET -- return the value of a variable;
  * ATOMIC_SET -- set the value of a variable;
  * ATOMIC_XCG -- set the value of a variable, return original value;
@@ -114,7 +113,6 @@ typedef unsigned long ATOMIC_BASE_TYPE;
 #endif
 
 #define ATOMIC_INIT(var, val)  atomic_init(var, (ATOMIC_BASE_TYPE) (val))
-#define ATOMIC_DESTROY(var)((void) 0)
 #define ATOMIC_GET(var)((ATOMIC_BASE_TYPE) *(var))
 #define ATOMIC_SET(var, val)   (*(var) = (ATOMIC_BASE_TYPE) (val))
 #define ATOMIC_XCG(var, val)   atomic_exchange(var, (ATOMIC_BASE_TYPE) (val))
@@ -173,7 +171,6 @@ typedef __declspec(align(8)) volatile AT
 
 #define ATOMIC_VAR_INIT(val)   (val)
 #define ATOMIC_INIT(var, val)  (*(var) = (val))
-#define ATOMIC_DESTROY(var)((void) 0)
 
 #if SIZEOF_SIZE_T == 8
 
@@ -276,7 +273,6 @@ typedef volatile ATOMIC_BASE_TYPE ATOMIC
 
 #define ATOMIC_VAR_INIT(val)   (val)
 #define ATOMIC_INIT(var, val)  (*(var) = (val))
-#define ATOMIC_DESTROY(var)((void) 0)
 
 #define ATOMIC_GET(var)((ATOMIC_BASE_TYPE) 
__atomic_load_n(var, __ATOMIC_SEQ_CST))
 #define ATOMIC_SET(var, val)   __atomic_store_n(var, (ATOMIC_BASE_TYPE) (val), 
__ATOMIC_SEQ_CST)
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -708,7 +708,6 @@ void
 BATdestroy(BAT *b)
 {
if (b->tvheap) {
-   ATOMIC_DESTROY(>tvheap->refs);
GDKfree(b->tvheap);
}
PROPdestroy_nolock(b);
@@ -716,7 +715,6 @@ BATdestroy(BAT *b)
MT_lock_destroy(>batIdxLock);
MT_rwlock_destroy(>thashlock);
if (b->theap) {
-   ATOMIC_DESTROY(>theap->refs);
GDKfree(b->theap);
}
if (b->oldtail) {
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -697,7 +697,6 @@ HEAPdecref(Heap *h, bool remove)
//printf("dec ref(%d) %p %d\n", (int)h->refs, h, h->parentid);
switch (refs & HEAPREFS) {
case 0:
-   ATOMIC_DESTROY(>refs);
HEAPfree(h, (bool) (refs & HEAPREMOVE));
GDKfree(h);
break;
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -837,7 +837,6 @@ IMPSdecref(Imprints *imprints, bool remo
ATOMIC_OR(>imprints.refs, HEAPREMOVE);
ATOMIC_BASE_TYPE refs = ATOMIC_DEC(>imprints.refs);
if ((refs & HEAPREFS) == 0) {
-   ATOMIC_DESTROY(>imprints.refs);
HEAPfree(>imprints, (bool) (refs & HEAPREMOVE));
GDKfree(imprints);
}
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2319,8 +2319,6 @@ log_load(const char *fn, const char *log
logbat_destroy(lg->seqs_id);
logbat_destroy(lg->seqs_val);
logbat_destroy(lg->dseqs);
-   ATOMIC_DESTROY(>current->refcount);
-   ATOMIC_DESTROY(>nr_flushers);
MT_lock_destroy(>lock);
MT_lock_destroy(>rotation_lock);
GDKfree(lg->fn);
@@ -2462,10 +2460,6 @@ log_destroy(logger *lg)
log_close_output(lg);
for (logged_range * p = lg->pending; p; p = lg->pending) {
lg->pending = p->next;
-   ATOMIC_DESTROY(>refcount);
-   ATOMIC_DESTROY(>last_ts);
-   ATOMIC_DESTROY(>flushed_ts);
-   ATOMIC_DESTROY(>drops);
GDKfree(p);
}
if (LOG_DISABLED(lg)) {
@@ -2500,7 +2494,6 @@ log_destroy(logger *lg)
MT_lock_destroy(>lock);
MT_lock_destroy(>rotation_lock);
MT_lock_destroy(>flush_lock);
-   ATOMIC_DESTROY(>nr_flushers);
GDKfree(lg->fn);
GDKfree(lg->dir);
GDKfree(lg->rbuf);
diff --git a/gdk/gdk_rtree.c b/gdk/gdk_rtree.c
--- a/gdk/gdk_rtree.c
+++ b/gdk/gdk_rtree.c
@@ -61,7 +61,6 @@ RTREEdecref(BAT *b)
ATOMIC_BASE_TYPE refs = ATOMIC_DEC(>trtree->refs);
//If RTree is marked for 

MonetDB: Dec2023 - Use simple counter for internal thread id, pr...

2024-04-23 Thread Sjoerd Mullender via checkin-list
Changeset: e68cf8d63398 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e68cf8d63398
Modified Files:
cmake/monetdb-defines.cmake
gdk/gdk_system.c
monetdb5/mal/mal_dataflow.c
monetdb_config.h.in
Branch: Dec2023
Log Message:

Use simple counter for internal thread id, print pthread/LWP values in dump.


diffs (193 lines):

diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -85,6 +85,7 @@ function(monetdb_configure_defines)
 check_symbol_exists("getopt_long" "getopt.h" HAVE_GETOPT_LONG)
   cmake_pop_check_state()
   check_function_exists("getrlimit" HAVE_GETRLIMIT)
+  check_function_exists("gettid" HAVE_GETTID)
   check_function_exists("gettimeofday" HAVE_GETTIMEOFDAY)
   check_function_exists("getuid" HAVE_GETUID)
   check_symbol_exists("gmtime_r" "time.h" HAVE_GMTIME_R)
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -52,6 +52,8 @@
 
 #include "mutils.h"
 
+static ATOMIC_TYPE GDKthreadid = ATOMIC_VAR_INIT(1);
+
 #ifdef LOCK_STATS
 
 ATOMIC_TYPE GDKlockcnt = ATOMIC_VAR_INIT(0);
@@ -218,6 +220,9 @@ static struct mtthread {
HANDLE hdl;
DWORD wtid;
 #endif
+#ifdef HAVE_GETTID
+   pid_t lwptid;
+#endif
MT_Id tid;
uintptr_t sp;
char *errbuf;
@@ -227,6 +232,7 @@ struct mtthread mainthread = {
.threadname = "main thread",
.exited = ATOMIC_VAR_INIT(0),
.refs = 1,
+   .tid = 1,
 };
 #ifdef HAVE_PTHREAD_H
 static pthread_mutex_t posthread_lock = PTHREAD_MUTEX_INITIALIZER;
@@ -285,9 +291,22 @@ dump_threads(void)
MT_Cond *cn = t->condwait;
struct mtthread *jn = t->joinwait;
int pos = snprintf(buf, sizeof(buf),
-  "%s, tid %zu, %"PRIu32" free bats, waiting 
for %s%s, working on %.200s",
+  "%s, tid %zu, "
+#ifdef HAVE_PTHREAD_H
+  "Thread 0x%lx, "
+#endif
+#ifdef HAVE_GETTID
+  "LWP %ld, "
+#endif
+  "%"PRIu32" free bats, waiting for %s%s, 
working on %.200s",
   t->threadname,
   t->tid,
+#ifdef HAVE_PTHREAD_H
+  (long) t->hdl,
+#endif
+#ifdef HAVE_GETTID
+  (long) t->lwptid,
+#endif
   t->freebats.nfreebats,
   lk ? "lock " : sm ? "semaphore " : cn ? 
"condvar " : jn ? "thread " : "",
   lk ? lk->name : sm ? sm->name : cn ? 
cn->name : jn ? jn->threadname : "nothing",
@@ -330,6 +349,9 @@ MT_thread_init(void)
 {
if (thread_initialized)
return true;
+#ifdef HAVE_GETTID
+   mainthread.lwptid = gettid();
+#endif
 #ifdef HAVE_PTHREAD_H
int ret;
 
@@ -357,7 +379,6 @@ MT_thread_init(void)
}
InitializeCriticalSection(_cs);
 #endif
-   mainthread.tid = (MT_Id) 
mainthread.next = NULL;
mtthreads = 
thread_initialized = true;
@@ -366,8 +387,6 @@ MT_thread_init(void)
 bool
 MT_thread_register(void)
 {
-   MT_Id mtid;
-
assert(thread_initialized);
if (!thread_initialized)
return false;
@@ -387,7 +406,6 @@ MT_thread_register(void)
if (self == NULL)
return false;
 
-   mtid = (MT_Id) self;
*self = (struct mtthread) {
.detached = false,
 #ifdef HAVE_PTHREAD_H
@@ -396,7 +414,7 @@ MT_thread_register(void)
.wtid = GetCurrentThreadId(),
 #endif
.refs = 1,
-   .tid = mtid,
+   .tid = ATOMIC_INC(),
};
snprintf(self->threadname, sizeof(self->threadname), "foreign %zu", 
self->tid);
ATOMIC_INIT(>exited, 0);
@@ -736,6 +754,9 @@ thread_starter(void *arg)
struct mtthread *self = (struct mtthread *) arg;
void *data = self->data;
 
+#ifdef HAVE_GETTID
+   self->lwptid = gettid();
+#endif
 #ifdef HAVE_PTHREAD_H
 #ifdef HAVE_PTHREAD_SETNAME_NP
/* name can be at most 16 chars including \0 */
@@ -849,7 +870,6 @@ int
 MT_create_thread(MT_Id *t, void (*f) (void *), void *arg, enum MT_thr_detach 
d, const char *threadname)
 {
struct mtthread *self;
-   MT_Id mtid;
 
assert(thread_initialized);
join_threads();
@@ -883,7 +903,6 @@ MT_create_thread(MT_Id *t, void (*f) (vo
 #endif
return -1;
}
-   mtid = (MT_Id) self;
 
*self = (struct mtthread) {
.func = f,
@@ -891,7 +910,7 @@ MT_create_thread(MT_Id *t, void (*f) (vo
.waiting = false,
.detached = (d == MT_THR_DETACHED),
.refs = 1,
-   .tid = mtid,
+   .tid = ATOMIC_INC(),
};

MonetDB: default - Merge with Dec2023 branch.

2024-04-23 Thread Sjoerd Mullender via checkin-list
Changeset: d03ca7aa07a0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d03ca7aa07a0
Modified Files:
gdk/gdk_bbp.c
Branch: default
Log Message:

Merge with Dec2023 branch.


diffs (163 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -4875,9 +4875,14 @@ BBPprintinfo(void)
ATOMIC_BASE_TYPE status = BBP_status(i);
struct counters *bt = [r > 0][BATdirty(b)][(status 
& BBPPERSISTENT) != 0][(status & BBPLOADED) != 0][(status & BBPHOT) != 0];
bt->nr++;
-   bt->sz += HEAPmemsize(b->theap) + 
HEAPmemsize(b->tvheap);
-   bt->vmsz += HEAPvmsize(b->theap) + 
HEAPvmsize(b->tvheap);
-   MT_lock_unset(>theaplock);
+   if (b->theap && b->batCacheid == b->theap->parentid) {
+   bt->sz += HEAPmemsize(b->theap);
+   bt->vmsz += HEAPvmsize(b->theap);
+   }
+   if (b->tvheap && b->batCacheid == b->tvheap->parentid) {
+   bt->sz += HEAPmemsize(b->tvheap);
+   bt->vmsz += HEAPvmsize(b->tvheap);
+   }
MT_lock_unset(>theaplock);
}
MT_lock_unset((i));
diff --git a/misc/python/fixlicense.py b/misc/python/fixlicense.py
--- a/misc/python/fixlicense.py
+++ b/misc/python/fixlicense.py
@@ -141,7 +141,7 @@ def getcomments(file, pre=None, post=Non
 f = open(file)  # can raise IOError
 line = f.readline()
 f.close()
-if line[:2] == '#!':
+if line.startswith('#!'):
 if 'bash' in line or '/sh' in line:
 ext = '.sh'
 elif 'python' in line or 'PYTHON' in line:
@@ -236,7 +236,7 @@ def addlicense(file, pre=None, post=None
 if pre:
 g.write(pre + '\n')
 for l in license:
-if l[:1] == '\t' or (not l and (not end or end[:1] == '\t')):
+if l.startswith('\t') or (not l and (not end or 
end.startswith('\t'))):
 # if text after start begins with tab, remove spaces from start
 g.write(start.rstrip() + l + end + '\n')
 else:
diff --git 
a/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py 
b/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
--- a/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
+++ b/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
@@ -36,7 +36,8 @@ class Client(threading.Thread):
 
 def output(self):
 if self.error == 0 and self.result != [(1,), (2,), (3,), (4,), (5,), 
(6,), (7,), (8,), (9,), (0,)]:
-sys.stderr.write('[(1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), 
(9,), (0,)] expected')
+print(f'received: {self.result}', file=sys.stderr)
+print('expected: [(1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), 
(9,), (0,)]', file=sys.stderr)
 
 def main():
 C = []
diff --git a/sql/test/mapi/Tests/python3_dec38.SQL.bat 
b/sql/test/mapi/Tests/python3_dec38.SQL.bat
deleted file mode 100755
--- a/sql/test/mapi/Tests/python3_dec38.SQL.bat
+++ /dev/null
@@ -1,9 +0,0 @@
-@echo off
-
-rem must be aligned with the installation directory chosen in
-rem clients/python/test/Makefile.ag
-set testpath=%TSTSRCDIR%
-
-prompt # $t $g  
-
-"%PYTHON%" "%testpath%/python_dec38.py %MAPIPORT% %TSTDB% %MAPIHOST%"
diff --git a/sql/test/mapi/Tests/python_dec38.py 
b/sql/test/mapi/Tests/python3_dec38.SQL.py
rename from sql/test/mapi/Tests/python_dec38.py
rename to sql/test/mapi/Tests/python3_dec38.SQL.py
--- a/sql/test/mapi/Tests/python_dec38.py
+++ b/sql/test/mapi/Tests/python3_dec38.SQL.py
@@ -11,10 +11,10 @@
 # Copyright 1997 - July 2008 CWI.
 
 import pymonetdb
-import sys
+import sys, os
 from decimal import Decimal
 
-dbh = 
pymonetdb.connect(port=int(sys.argv[1]),database=sys.argv[2],hostname=sys.argv[3],autocommit=True)
+dbh = 
pymonetdb.connect(port=int(os.getenv('MAPIPORT')),database=os.getenv('TSTDB'),hostname=os.getenv('MAPIHOST'),autocommit=True)
 
 cursor = dbh.cursor()
 
diff --git a/sql/test/mapi/Tests/python3_dec38.SQL.sh 
b/sql/test/mapi/Tests/python3_dec38.SQL.sh
deleted file mode 100755
--- a/sql/test/mapi/Tests/python3_dec38.SQL.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# must be aligned with the installation directory chosen in
-# clients/python/test/Makefile.ag
-testpath="$TSTSRCDIR"
-
-${PYTHON} $testpath/python_dec38.py $MAPIPORT $TSTDB $MAPIHOST
diff --git a/sql/test/mapi/Tests/python3_int128.SQL.bat 
b/sql/test/mapi/Tests/python3_int128.SQL.bat
deleted file mode 100755
--- a/sql/test/mapi/Tests/python3_int128.SQL.bat
+++ /dev/null
@@ -1,9 +0,0 @@
-@echo off
-
-rem must be aligned with the installation directory chosen in
-rem 

MonetDB: Dec2023 - Use startswith method.

2024-04-23 Thread Sjoerd Mullender via checkin-list
Changeset: 88b675fa0430 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/88b675fa0430
Modified Files:
misc/python/fixlicense.py
testing/malmapi.py
Branch: Dec2023
Log Message:

Use startswith method.


diffs (42 lines):

diff --git a/misc/python/fixlicense.py b/misc/python/fixlicense.py
--- a/misc/python/fixlicense.py
+++ b/misc/python/fixlicense.py
@@ -141,7 +141,7 @@ def getcomments(file, pre=None, post=Non
 f = open(file)  # can raise IOError
 line = f.readline()
 f.close()
-if line[:2] == '#!':
+if line.startswith('#!'):
 if 'bash' in line or '/sh' in line:
 ext = '.sh'
 elif 'python' in line or 'PYTHON' in line:
@@ -236,7 +236,7 @@ def addlicense(file, pre=None, post=None
 if pre:
 g.write(pre + '\n')
 for l in license:
-if l[:1] == '\t' or (not l and (not end or end[:1] == '\t')):
+if l.startswith('\t') or (not l and (not end or 
end.startswith('\t'))):
 # if text after start begins with tab, remove spaces from start
 g.write(start.rstrip() + l + end + '\n')
 else:
diff --git a/testing/malmapi.py b/testing/malmapi.py
--- a/testing/malmapi.py
+++ b/testing/malmapi.py
@@ -69,7 +69,7 @@ def handle_error(error):
 
 """
 
-if error[:13] == 'SQLException:':
+if error.startswith('SQLException:'):
 idx = str.index(error, ':', 14)
 error = error[idx + 10:]
 if len(error) > 5 and error[:5] in errors:
@@ -104,7 +104,7 @@ class Connection(object):
 unix_socket is used if hostname is not defined.
 """
 
-if hostname and hostname[:1] == '/' and not unix_socket:
+if hostname and hostname.startswith('/') and not unix_socket:
 unix_socket = '%s/.s.monetdb.%d' % (hostname, port)
 hostname = None
 if not unix_socket and os.path.exists("/tmp/.s.monetdb.%i" % port):
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Dec2023 - Tests should never just tell you what was exp...

2024-04-23 Thread Sjoerd Mullender via checkin-list
Changeset: 86e1e0413567 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/86e1e0413567
Modified Files:
sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
Branch: Dec2023
Log Message:

Tests should never just tell you what was expected.  Give actual results too!


diffs (13 lines):

diff --git 
a/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py 
b/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
--- a/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
+++ b/sql/test/concurrent/Tests/crash_on_concurrent_use.SF-1411926.SQL.py
@@ -36,7 +36,8 @@ class Client(threading.Thread):
 
 def output(self):
 if self.error == 0 and self.result != [(1,), (2,), (3,), (4,), (5,), 
(6,), (7,), (8,), (9,), (0,)]:
-sys.stderr.write('[(1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), 
(9,), (0,)] expected')
+print(f'received: {self.result}', file=sys.stderr)
+print('expected: [(1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), 
(9,), (0,)]', file=sys.stderr)
 
 def main():
 C = []
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: check - merge with default

2024-04-23 Thread Yunus Koning via checkin-list
Changeset: b9e1b9936232 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b9e1b9936232
Modified Files:
sql/server/sql_mvc.c
sql/storage/store.c
Branch: check
Log Message:

merge with default


diffs (truncated from 1294 to 300 lines):

diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -824,3 +824,4 @@ 95d8feaa1167b5ba87bd99253c3f4e62ebf528a1
 dcc8c702e685a4faf21ccf663028d1bc3d1165d1 Dec2023_5
 dcc8c702e685a4faf21ccf663028d1bc3d1165d1 Dec2023_SP1_release
 d656785f49ee62c19705722aa6b7c171904c64d5 Dec2023_7
+d656785f49ee62c19705722aa6b7c171904c64d5 Dec2023_SP2_release
diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -151,7 +151,6 @@ BuildRequires: pkgconfig(libR)
 # BuildRequires: pkgconfig(gdal)# -DSHP=ON
 # BuildRequires: pkgconfig(netcdf)  # -DNETCDF=ON
 # BuildRequires: pkgconfig(proj)# -DWITH_PROJ=ON
-# BuildRequires: pkgconfig(snappy)  # -DWITH_SNAPPY=ON
 # BuildRequires: pkgconfig(valgrind)# -DWITH_VALGRIND=ON
 
 %if (0%{?fedora} >= 22)
@@ -868,7 +867,6 @@ sed -i 's/1\.2/1.1/' misc/selinux/monetd
 -DWITH_PCRE=ON \
 -DWITH_PROJ=OFF \
 -DWITH_READLINE=ON \
--DWITH_SNAPPY=OFF \
 -DWITH_VALGRIND=OFF \
 -DWITH_XML2=ON \
 -DWITH_ZLIB=ON
@@ -895,9 +893,6 @@ install -d -m 0775 %{buildroot}%{_locals
 install -d -m 0775 %{buildroot}%{_rundir}/monetdb
 
 # remove unwanted stuff
-# .la files
-rm -f %{buildroot}%{_libdir}/*.la
-rm -f %{buildroot}%{_libdir}/monetdb5/*.la
 rm -f %{buildroot}%{_libdir}/monetdb5/lib_opt_sql_append.so
 rm -f %{buildroot}%{_libdir}/monetdb5/lib_microbenchmark*.so
 rm -f %{buildroot}%{_libdir}/monetdb5/lib_udf*.so
diff --git a/README.rst b/README.rst
--- a/README.rst
+++ b/README.rst
@@ -69,8 +69,8 @@ CINTEGRATIONEnable support for C
 CMAKE_SUMMARY   Show a summary of the cmake configuration (for debug 
purposes, default=OFF)
 CMAKE_UNITTESTS Build and run the unittest for the build system 
(default=OFF)
 FITSEnable support for FITS
-GEOMEnable support for geom module
-INT128  Enable support for 128-bit integers
+GEOMEnable support for geom module (using libgeos library)
+INT128  Enable support for 128-bit integers (if compiler supports 
them)
 NETCDF  Enable support for netcdf
 ODBCCompile the MonetDB ODBC driver
 PY3INTEGRATION  Enable support for Python 3 integration into MonetDB
@@ -82,7 +82,9 @@ TESTING Enable support for t
 WITH_BZ2Include bz2 support
 WITH_CMOCKA Include cmocka support (default=OFF)
 WITH_CURL   Include curl support
+WITH_LZ4Include lz4 support
 WITH_LZMA   Include lzma support
+WITH_OPENSSLInclude TLS support (secure client/server connection)
 WITH_PCRE   Include pcre support
 WITH_PROJ   Include proj support
 WITH_READLINE   Include readline support
@@ -98,27 +100,27 @@ On Fedora, the following packages are re
 ``bison``, ``cmake``, ``gcc``, ``pkgconf``, ``python3``.
 
 The following packages are optional but recommended:
-``bzip2-devel``, ``pcre-devel``, ``readline-devel``,
-``xz-devel``, ``zlib-devel``.
+``bzip2-devel``, ``lz4-devel``, ``openssl-devel``, ``pcre-devel``,
+``readline-devel``, ``xz-devel``, ``zlib-devel``.
 
 The following packages are optional:
 ``cfitsio-devel``, ``gdal-devel``, ``geos-devel``, ``libasan``,
-``libcurl-devel``, ``libxml2-devel``, ``netcdf-devel``, ``proj-devel``,
-``python3-devel``, ``python3-numpy``, ``R-core-devel``,
-``unixODBC-devel``, ``valgrind-devel``.
+``libcmocka-devel``, ``libcurl-devel``, ``libxml2-devel``,
+``netcdf-devel``, ``proj-devel``, ``python3-devel``, ``python3-numpy``,
+``R-core-devel``, ``unixODBC-devel``, ``valgrind-devel``.
 
 On Ubuntu and Debian the following packages are required:
 ``bison``, ``cmake``, ``gcc``, ``pkg-config``, ``python3``.
 
 The following packages are optional but recommended:
-``libbz2-dev``, ``libpcre3-dev``, ``libreadline-dev``,
-``liblzma-dev``, ``zlib1g-dev``.
+``libbz2-dev``, ``liblz4-dev``, ``libpcre3-dev``, ``libreadline-dev``,
+``liblzma-dev``, ``libssl-dev``, ``zlib1g-dev``.
 
 The following packages are optional:
-``libasan5``, ``libcfitsio-dev``, ``libcurl4-gnutls-dev``,
-``libgdal-dev``, ``libgeos-dev``, ``libnetcdf-dev``, ``libproj-dev``,
-``libxml2-dev``, ``python3-dev``, ``python3-numpy``, ``r-base-dev``,
-``unixodbc-dev``, ``valgrind``.
+``libasan5``, ``libcfitsio-dev``, ``libcmocka-dev``,
+``libcurl4-gnutls-dev``, ``libgdal-dev``, ``libgeos-dev``,
+``libnetcdf-dev``, ``libproj-dev``, ``libxml2-dev``, ``python3-dev``,
+``python3-numpy``, ``r-base-dev``, ``unixodbc-dev``, ``valgrind``.
 
 ``cmake`` must be at least version 3.12, ``python`` must be at least
 version 3.5.
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ 

MonetDB: check - extend key_types table.

2024-04-23 Thread Yunus Koning via checkin-list
Changeset: 809397ccd000 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/809397ccd000
Modified Files:
sql/scripts/10_sys_schema_extension.sql
Branch: check
Log Message:

extend key_types table.


diffs (22 lines):

diff --git a/sql/scripts/10_sys_schema_extension.sql 
b/sql/scripts/10_sys_schema_extension.sql
--- a/sql/scripts/10_sys_schema_extension.sql
+++ b/sql/scripts/10_sys_schema_extension.sql
@@ -396,14 +396,16 @@ GRANT SELECT ON sys.function_languages T
 
 CREATE TABLE sys.key_types (
 key_type_id   SMALLINT NOT NULL PRIMARY KEY,
-key_type_name VARCHAR(15) NOT NULL UNIQUE);
+key_type_name VARCHAR(35) NOT NULL UNIQUE);
 
 -- Values taken from sql/include/sql_catalog.h see typedef enum
 -- key_type: pkey, ukey, fkey.
 INSERT INTO sys.key_types (key_type_id, key_type_name) VALUES
   (0, 'Primary Key'),
   (1, 'Unique Key'),
-  (2, 'Foreign Key');
+  (2, 'Foreign Key'),
+  (3, 'Unique Key With Nulls Not Distinct'),
+  (4, 'Check Constraint');
 
 ALTER TABLE sys.key_types SET READ ONLY;
 GRANT SELECT ON sys.key_types TO PUBLIC;
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: check - implement CHECK constraint as a key type instea...

2024-04-23 Thread Yunus Koning via checkin-list
Changeset: 49dcdaff8bf0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/49dcdaff8bf0
Modified Files:
sql/backends/monet5/rel_bin.c
sql/include/sql_catalog.h
sql/server/rel_schema.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/server/sql_parser.y
sql/server/sql_partition.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: check
Log Message:

implement CHECK constraint as a key type instead of as a column property


diffs (truncated from 695 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -4923,7 +4923,7 @@ sql_insert_triggers(backend *be, sql_tab
 }
 
 static void
-sql_insert_check(backend *be, sql_table *t, sql_rel *inserts, list *refs)
+sql_insert_check(backend *be, sql_key *key, sql_rel *inserts, list *refs)
 {
mvc *sql = be->mvc;
node *m, *n;
@@ -4933,25 +4933,23 @@ sql_insert_check(backend *be, sql_table 
 
sql_subtype *bt = sql_bind_localtype("bit");
 
-   for (n = ol_first_node(t->columns), m = exps->h; n && m;
+   for (n = key->columns->h, m = exps->h; n && m;
n = n->next, m = m->next) {
sql_exp *i = m->data;
-   sql_column *c = n->data;
-   if (c->check) {
-   i->alias.rname= sa_strdup(sql->sa, t->base.name);
-   i->alias.name= sa_strdup(sql->sa, c->base.name);
-
-   int pos = 0;
-   sql_rel* rel = rel_read(sql, sa_strdup(sql->sa, 
c->check), , sa_list(sql->sa));
-   rel->l = inserts;
-   stmt* s = subrel_bin(be, rel, refs);
-   s = stmt_uselect(be, column(be, s), stmt_atom(be, 
atom_zero_value(sql->sa, bt)), cmp_equal, NULL, 0, 1);
-   sql_subfunc *cnt = sql_bind_func(sql, "sys", "count", 
sql_bind_localtype("void"), NULL, F_AGGR, true, true);
-   s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
-   char *msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT 
INTO: CHECK constraint violated for column %s.%s", c->t->base.name, 
c->base.name);
-   (void)stmt_exception(be, s, msg, 1);
-   }
-   }
+   sql_column *c = ((sql_kc*) n->data)->c;
+   i->alias.rname= sa_strdup(sql->sa, c->t->base.name);
+   i->alias.name= sa_strdup(sql->sa, c->base.name);
+   }
+
+   int pos = 0;
+   sql_rel* rel = rel_read(sql, sa_strdup(sql->sa, key->check), , 
sa_list(sql->sa));
+   rel->l = inserts;
+   stmt* s = subrel_bin(be, rel, refs);
+   s = stmt_uselect(be, column(be, s), stmt_atom(be, 
atom_zero_value(sql->sa, bt)), cmp_equal, NULL, 0, 1);
+   sql_subfunc *cnt = sql_bind_func(sql, "sys", "count", 
sql_bind_localtype("void"), NULL, F_AGGR, true, true);
+   s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
+   char *msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: CHECK 
constraint violated: %s", key->base.name);
+   (void)stmt_exception(be, s, msg, 1);
 }
 
 static sql_table *
@@ -5032,7 +5030,11 @@ rel2bin_insert(backend *be, sql_rel *rel
if (idx_ins)
pin = refs_find_rel(refs, prel);
 
-   sql_insert_check(be, t, rel->r, refs);
+   for (n = ol_first_node(t->keys); n; n = n->next) {
+   sql_key * key = n->data;
+   if (key->type == ckey)
+   sql_insert_check(be, key, rel->r, refs);
+   }
 
if (!sql_insert_check_null(be, t, inserts->op4.lval))
return NULL;
@@ -5916,28 +5918,22 @@ sql_update_triggers(backend *be, sql_tab
 }
 
 static void
-sql_update_check(backend *be, sql_table *t, sql_rel *rupdates, stmt **updates, 
list *refs)
+sql_update_check(backend *be, sql_key * key, sql_rel *rupdates, list *refs)
 {
+   /*  TODO: this won't work for general table check constraints involving 
updates to a strict subset of check columns*/
mvc *sql = be->mvc;
-   node *n;
sql_subfunc *cnt = sql_bind_func(sql, "sys", "count", 
sql_bind_localtype("void"), NULL, F_AGGR, true, true);
sql_subtype *bt = sql_bind_localtype("bit");
 
-   for (n = ol_first_node(t->columns); n; n = n->next) {
-   sql_column *c = n->data;
-
-   if (updates[c->colnr] && c->check) {
-
-   int pos = 0;
-   sql_rel* rel = rel_read(sql, sa_strdup(sql->sa, 
c->check), , sa_list(sql->sa));
-   rel->l = rupdates;
-   stmt* s = subrel_bin(be, rel, refs);
-   s = stmt_uselect(be, column(be, s), stmt_atom(be, 
atom_zero_value(sql->sa, bt)), cmp_equal, NULL, 0, 1);
-   s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1);
-   char *msg = sa_message(sql->sa, SQLSTATE(40002) 

MonetDB: check - add tests for check constraint

2024-04-23 Thread Yunus Koning via checkin-list
Changeset: 7b5630309f11 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7b5630309f11
Added Files:
sql/test/2024/Tests/check.test
Modified Files:
sql/test/2024/Tests/All
Branch: check
Log Message:

add tests for check constraint


diffs (32 lines):

diff --git a/sql/test/2024/Tests/All b/sql/test/2024/Tests/All
--- a/sql/test/2024/Tests/All
+++ b/sql/test/2024/Tests/All
@@ -1,2 +1,3 @@
 groupby_primary_key_project_unique_key
 distinct_from
+check
diff --git a/sql/test/2024/Tests/check.test b/sql/test/2024/Tests/check.test
new file mode 100644
--- /dev/null
+++ b/sql/test/2024/Tests/check.test
@@ -0,0 +1,20 @@
+statement ok
+create table bar (i int, j int CHECK (j > 0));
+
+statement ok
+insert into bar values (1,10), (2, 20), (3, 30);
+
+statement error
+update bar set j = -30 where i = 3;
+
+statement error
+update bar set j = -j;
+
+statement error
+insert into bar values (4, -40);
+
+statement ok
+insert into bar select * from bar
+
+statement error
+insert into bar select 4, -40;
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org