Changeset: e659665a8b8e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e659665a8b8e
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: default
Log Message:

Merged with Jan2022


diffs (truncated from 628 to 300 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2413,7 +2413,7 @@ string_writer(logger *lg, BAT *b, lng of
                }
                char *dst = buf;
                for(; p < end && sz < bufsz; p++) {
-                       char *s = BUNtail(bi, p);
+                       char *s = BUNtvar(bi, p);
                        size_t len = strlen(s)+1;
                        if ((sz+len) > bufsz) {
                                if (len > bufsz)
@@ -2641,6 +2641,10 @@ log_delta(logger *lg, BAT *uid, BAT *uva
        if (uval->ttype == TYPE_msk) {
                if (!mnstr_writeIntArray(lg->output_log, vi.base, 
(BUNlast(uval) + 31) / 32))
                        ok = GDK_FAIL;
+       } else if (uval->ttype < TYPE_str && !isVIEW(uval)) {
+               const void *t = BUNtail(vi, 0);
+
+               ok = wt(t, lg->output_log, (size_t)nr);
        } else if (uval->ttype == TYPE_str) {
                /* efficient string writes */
                ok = string_writer(lg, uval, 0, nr);
diff --git a/sql/backends/monet5/dict.c b/sql/backends/monet5/dict.c
--- a/sql/backends/monet5/dict.c
+++ b/sql/backends/monet5/dict.c
@@ -33,8 +33,8 @@ static void
 BATmaxminpos_bte(BAT *o, bte m)
 {
        BUN minpos = BUN_NONE, maxpos = BUN_NONE, p, q;
-       bte minval = m<0?-128:0;
-       bte maxval = m<0?127:m;
+       bte minval = m<0?GDK_bte_min:0; /* Later once nils use a bitmask we can 
include -128 in the range */
+       bte maxval = m<0?GDK_bte_max:m;
 
        assert(o->ttype == TYPE_bte);
        o->tnil = m<0?true:false;
@@ -60,8 +60,8 @@ static void
 BATmaxminpos_sht(BAT *o, sht m)
 {
        BUN minpos = BUN_NONE, maxpos = BUN_NONE, p, q;
-       sht minval = m<0?-32768:0;
-       sht maxval = m<0?32767:m;
+       sht minval = m<0?GDK_sht_min:0; /* Later once nils use a bitmask we can 
include -32768 in the range */
+       sht maxval = m<0?GDK_sht_max:m;
 
        assert(o->ttype == TYPE_sht);
        o->tnil = m<0?true:false;
@@ -279,7 +279,21 @@ DICTcompress_col(Client cntxt, MalBlkPtr
        return msg;
 }
 
-/* improve decompress of hge types */
+#define decompress_loop(TPE) \
+       do { \
+               TPE *up = Tloc(u, 0); \
+               TPE *restrict bp = Tloc(b, 0); \
+               BATloop(o, p, q) { \
+                       TPE v = up[op[p]]; \
+                       nils |= is_##TPE##_nil(v); \
+                       bp[p] = v; \
+               } \
+               BATsetcount(b, BATcount(o)); \
+               BATnegateprops(b); \
+               b->tnil = nils; \
+               b->tnonil = !nils; \
+       } while (0)
+
 BAT *
 DICTdecompress_(BAT *o, BAT *u, role_t role)
 {
@@ -294,33 +308,19 @@ DICTdecompress_(BAT *o, BAT *u, role_t r
        if (o->ttype == TYPE_bte) {
                unsigned char *op = Tloc(o, 0);
 
-               if (ATOMbasetype(u->ttype) == TYPE_int) {
-                       int *up = Tloc(u, 0);
-                       int *bp = Tloc(b, 0);
-
-                       BATloop(o, p, q) {
-                               int v = up[op[p]];
-                               nils |= is_int_nil(v);
-                               bp[p] = v;
-                       }
-                       BATsetcount(b, BATcount(o));
-                       BATnegateprops(b);
-                       b->tnil = nils;
-                       b->tnonil = !nils;
-               } else if (ATOMbasetype(u->ttype) == TYPE_lng) {
-                       lng *up = Tloc(u, 0);
-                       lng *bp = Tloc(b, 0);
-
-                       BATloop(o, p, q) {
-                               lng v = up[op[p]];
-                               nils |= is_lng_nil(v);
-                               bp[p] = v;
-                       }
-                       BATsetcount(b, BATcount(o));
-                       BATnegateprops(b);
-                       b->tnil = nils;
-                       b->tnonil = !nils;
-               } else {
+               switch (ATOMbasetype(u->ttype)) {
+               case TYPE_int:
+                       decompress_loop(int);
+                       break;
+               case TYPE_lng:
+                       decompress_loop(lng);
+                       break;
+#ifdef HAVE_HGE
+               case TYPE_hge:
+                       decompress_loop(hge);
+                       break;
+#endif
+               default:
                        BATloop(o, p, q) {
                                BUN up = op[p];
                                if (BUNappend(b, BUNtail(ui, up), false) != 
GDK_SUCCEED) {
@@ -334,33 +334,19 @@ DICTdecompress_(BAT *o, BAT *u, role_t r
                assert(o->ttype == TYPE_sht);
                unsigned short *op = Tloc(o, 0);
 
-               if (ATOMbasetype(u->ttype) == TYPE_int) {
-                       int *up = Tloc(u, 0);
-                       int *bp = Tloc(b, 0);
-
-                       BATloop(o, p, q) {
-                               int v = up[op[p]];
-                               nils |= is_int_nil(v);
-                               bp[p] = v;
-                       }
-                       BATsetcount(b, BATcount(o));
-                       BATnegateprops(b);
-                       b->tnil = nils;
-                       b->tnonil = !nils;
-               } else if (ATOMbasetype(u->ttype) == TYPE_lng) {
-                       lng *up = Tloc(u, 0);
-                       lng *bp = Tloc(b, 0);
-
-                       BATloop(o, p, q) {
-                               lng v = up[op[p]];
-                               nils |= is_lng_nil(v);
-                               bp[p] = v;
-                       }
-                       BATsetcount(b, BATcount(o));
-                       BATnegateprops(b);
-                       b->tnil = nils;
-                       b->tnonil = !nils;
-               } else {
+               switch (ATOMbasetype(u->ttype)) {
+               case TYPE_int:
+                       decompress_loop(int);
+                       break;
+               case TYPE_lng:
+                       decompress_loop(lng);
+                       break;
+#ifdef HAVE_HGE
+               case TYPE_hge:
+                       decompress_loop(hge);
+                       break;
+#endif
+               default:
                        BATloop(o, p, q) {
                                BUN up = op[p];
                                if (BUNappend(b, BUNtail(ui, up), false) != 
GDK_SUCCEED) {
@@ -998,7 +984,7 @@ DICTprepare4append(BAT **noffsets, BAT *
                        }
                        if (!f) {
                                if (BATcount(dict) >= (64*1024)-1) {
-                                               assert(0);
+                                       assert(0);
                                        bat_destroy(n);
                                        bat_iterator_end(&bi);
                                        return -2;
diff --git a/sql/jdbc/tests/Tests/OnClientDownloadData.sql 
b/sql/jdbc/tests/Tests/OnClientDownloadData.sql
new file mode 100644
--- /dev/null
+++ b/sql/jdbc/tests/Tests/OnClientDownloadData.sql
@@ -0,0 +1,36 @@
+-- test ON CLIENT data exports with different delimiters
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.dsv' ON 
CLIENT;
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.csv' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.tsv' ON 
CLIENT USING DELIMITERS E'\t' , E'\n' , '"' NULL AS '';
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.psv' ON 
CLIENT USING DELIMITERS '|' , E'\n' , '"' NULL AS '';
+
+-- and compressed exports (only .gz is supported)
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.csv.gz' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+
+
+-- test error handling
+COPY SELECT * FROM sys.tables ORDER BY id INTO '' ON CLIENT USING DELIMITERS 
',' , E'\n' , '"' NULL AS '';
+-- Error [22000] Missing file name
+COPY SELECT * FROM sys.tables ORDER BY id INTO '.' ON CLIENT USING DELIMITERS 
',' , E'\n' , '"' NULL AS '';
+-- Error [22000] File already exists: /home/dinther/csvfiles
+COPY SELECT * FROM sys.tables ORDER BY id INTO '..' ON CLIENT USING DELIMITERS 
',' , E'\n' , '"' NULL AS '';
+-- Error [22000] File is not in download directory: /home/dinther/csvfiles
+COPY SELECT * FROM sys.tables ORDER BY id INTO '../b' ON CLIENT USING 
DELIMITERS ',' , E'\n' , '"' NULL AS '';
+-- Error [22000] File is not in download directory: /home/dinther/csvfiles
+COPY SELECT * FROM sys.tables ORDER BY id INTO 
'/home/Doesnotexist/sys_tables_by_id.dsv' ON CLIENT;
+-- Error [22000] File is not in download directory: /home/dinther/csvfiles
+
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.dsv' ON 
CLIENT;
+-- Error [22000] File already exists: 
/home/dinther/csvfiles/sys_tables_by_id.dsv
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.csv.gz' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+-- Error [22000] File already exists: 
/home/dinther/csvfiles/sys_tables_by_id.csv.gz
+
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.csv.bz2' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+-- Error [22000] Requested compression .bz2 is not supported. Use .gz instead.
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.csv.lz4' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+-- Error [22000] Requested compression .lz4 is not supported. Use .gz instead.
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.csv.xz' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+-- Error [22000] Requested compression .xz is not supported. Use .gz instead.
+COPY SELECT * FROM sys.tables ORDER BY id INTO 'sys_tables_by_id.csv.zip' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+-- Error [22000] Requested compression .zip is not supported. Use .gz instead.
+
diff --git a/sql/jdbc/tests/Tests/OnClientUploadData.sql 
b/sql/jdbc/tests/Tests/OnClientUploadData.sql
new file mode 100644
--- /dev/null
+++ b/sql/jdbc/tests/Tests/OnClientUploadData.sql
@@ -0,0 +1,41 @@
+DROP TABLE IF EXISTS importedFileData;
+CREATE TABLE importedFileData AS SELECT * FROM sys.tables WITH NO DATA;
+
+COPY INTO importedFileData FROM 'sys_tables_by_id.dsv' ON CLIENT USING 
DELIMITERS '|' , E'\n' , '"' NULL AS '';
+SELECT COUNT(*) > 0 FROM importedFileData;
+TRUNCATE importedFileData;
+
+COPY INTO importedFileData FROM 'sys_tables_by_id.csv' ON CLIENT USING 
DELIMITERS ',' , E'\n' , '"' NULL AS '';
+SELECT COUNT(*) > 0 FROM importedFileData;
+TRUNCATE importedFileData;
+
+COPY 20 OFFSET 5 RECORDS INTO importedFileData FROM 'sys_tables_by_id.csv' ON 
CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+SELECT COUNT(*) > 0 FROM importedFileData;
+TRUNCATE importedFileData;
+
+COPY INTO importedFileData FROM 'sys_tables_by_id.tsv' ON CLIENT USING 
DELIMITERS E'\t' , E'\n' , '"' NULL AS '';
+SELECT COUNT(*) > 0 FROM importedFileData;
+TRUNCATE importedFileData;
+
+COPY INTO importedFileData FROM 'sys_tables_by_id.psv' ON CLIENT USING 
DELIMITERS '|' , E'\n' , '"' NULL AS '';
+SELECT COUNT(*) > 0 FROM importedFileData;
+TRUNCATE importedFileData;
+
+-- compressed .gz imports
+COPY INTO importedFileData FROM 'sys_tables_by_id.csv.gz' ON CLIENT USING 
DELIMITERS ',' , E'\n' , '"' NULL AS '';
+SELECT COUNT(*) > 0 FROM importedFileData;
+TRUNCATE importedFileData;
+
+COPY 80 OFFSET 5 RECORDS INTO importedFileData FROM 'sys_tables_by_id.csv.gz' 
ON CLIENT USING DELIMITERS ',' , E'\n' , '"' NULL AS '';
+SELECT COUNT(*) > 0 FROM importedFileData;
+TRUNCATE importedFileData;
+
+
+-- other compression formats are NOT supported
+COPY INTO importedFileData FROM 'sys_tables_by_id.csv.bz2' ON CLIENT USING 
DELIMITERS ',' , E'\n' , '"' NULL AS '';
+COPY INTO importedFileData FROM 'sys_tables_by_id.csv.lz4' ON CLIENT USING 
DELIMITERS ',' , E'\n' , '"' NULL AS '';
+COPY INTO importedFileData FROM 'sys_tables_by_id.csv.xz' ON CLIENT USING 
DELIMITERS ',' , E'\n' , '"' NULL AS '';
+COPY INTO importedFileData FROM 'sys_tables_by_id.csv.zip' ON CLIENT USING 
DELIMITERS ',' , E'\n' , '"' NULL AS '';
+
+DROP TABLE IF EXISTS importedFileData;
+
diff --git a/sql/jdbc/tests/Tests/Test_JdbcClient.SQL.py 
b/sql/jdbc/tests/Tests/Test_JdbcClient.SQL.py
--- a/sql/jdbc/tests/Tests/Test_JdbcClient.SQL.py
+++ b/sql/jdbc/tests/Tests/Test_JdbcClient.SQL.py
@@ -1,5 +1,4 @@
-import os
-import sys
+import os, sys
 from subprocess import run, PIPE, CalledProcessError
 
 HOST=os.getenv('HOST')
@@ -15,34 +14,60 @@ PASSWORD='monetdb'
 if __name__ == '__main__':
     with open(os.path.join('.monetdb'), 'w') as f:
         f.write('\n'.join(['user=monetdb', 'password=monetdb']))
+
     cmd = ['java', CLIENT, '-h', HOST, '-p', MAPIPORT, '-d', TSTDB, '--help']
     try:
         p = run(cmd, stdout=PIPE, stderr=PIPE, check=True, encoding='utf-8')
     except CalledProcessError as e:
         raise SystemExit(e.stderr)
+
     cmd = ['java', CLIENT, '-h', HOST, '-p', MAPIPORT, '-d', TSTDB, '-f', 
os.path.join(TSTSRCBASE, TSTDIR, 'Tests/JdbcClient_create_tables.sql')]
     try:
         p = run(cmd, stdout=PIPE, stderr=PIPE, check=True, encoding='utf-8')
     except CalledProcessError as e:
         print(e.stderr, file=sys.stderr)
         raise SystemExit('ERROR: failed to create tables!')
+
     cmd = ['java', CLIENT, '-h', HOST, '-p', MAPIPORT, '-d', TSTDB, '-f', 
os.path.join(TSTSRCBASE, TSTDIR, 'Tests/JdbcClient_inserts_selects.sql')]
     try:
         p = run(cmd, stdout=PIPE, stderr=PIPE, check=True, encoding='utf-8')
     except CalledProcessError as e:
         print(e.stderr, file=sys.stderr)
         raise SystemExit('ERROR: failed to insert!')
+
     cmd = ['java', CLIENT, '-h', HOST, '-p', MAPIPORT, '-d', TSTDB, '-D']
     try:
         p = run(cmd, stdout=PIPE, stderr=PIPE, check=True, encoding='utf-8')
     except CalledProcessError as e:
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to