Changeset: 95b48fecbe2c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/95b48fecbe2c
Modified Files:
        MonetDB.spec
Branch: default
Log Message:

Merge with Jun2023 branch.


diffs (truncated from 762 to 300 lines):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -366,6 +366,7 @@ developer.
 %{_bindir}/ODBCStmtAttr
 %{_bindir}/ODBCgetInfo
 %{_bindir}/ODBCmetadata
+%{_bindir}/ODBCtester
 %{_bindir}/arraytest
 %{_bindir}/bincopydata
 %{_bindir}/odbcsample1
diff --git a/clients/odbc/driver/SQLGetInfo.c b/clients/odbc/driver/SQLGetInfo.c
--- a/clients/odbc/driver/SQLGetInfo.c
+++ b/clients/odbc/driver/SQLGetInfo.c
@@ -1038,7 +1038,8 @@ MNDBGetInfo(ODBCDbc *dbc,
        case SQL_TIMEDATE_ADD_INTERVALS:
        case SQL_TIMEDATE_DIFF_INTERVALS:
                /* when server is 11.46 or higher */
-               nValue = SQL_FN_TSI_SECOND |
+               nValue = SQL_FN_TSI_FRAC_SECOND |
+                       SQL_FN_TSI_SECOND |
                        SQL_FN_TSI_MINUTE |
                        SQL_FN_TSI_HOUR |
                        SQL_FN_TSI_DAY |
@@ -1046,7 +1047,6 @@ MNDBGetInfo(ODBCDbc *dbc,
                        SQL_FN_TSI_MONTH |
                        SQL_FN_TSI_QUARTER |
                        SQL_FN_TSI_YEAR;
-               /* SQL_FN_TSI_FRAC_SECOND | */
                break;
        case SQL_TIMEDATE_FUNCTIONS:
                nValue = SQL_FN_TD_CURRENT_DATE |
diff --git a/clients/odbc/tests/ODBCgetInfo.c b/clients/odbc/tests/ODBCgetInfo.c
--- a/clients/odbc/tests/ODBCgetInfo.c
+++ b/clients/odbc/tests/ODBCgetInfo.c
@@ -1080,13 +1080,13 @@ const struct {
                .info = SQL_TIMEDATE_ADD_INTERVALS,
                .name = "SQL_TIMEDATE_ADD_INTERVALS",
                .type = INTEGER,
-               .i = SQL_FN_TSI_SECOND | SQL_FN_TSI_MINUTE | SQL_FN_TSI_HOUR | 
SQL_FN_TSI_DAY | SQL_FN_TSI_WEEK | SQL_FN_TSI_MONTH | SQL_FN_TSI_QUARTER | 
SQL_FN_TSI_YEAR,
+               .i = SQL_FN_TSI_FRAC_SECOND | SQL_FN_TSI_SECOND | 
SQL_FN_TSI_MINUTE | SQL_FN_TSI_HOUR | SQL_FN_TSI_DAY | SQL_FN_TSI_WEEK | 
SQL_FN_TSI_MONTH | SQL_FN_TSI_QUARTER | SQL_FN_TSI_YEAR,
        },
        {
                .info = SQL_TIMEDATE_DIFF_INTERVALS,
                .name = "SQL_TIMEDATE_DIFF_INTERVALS",
                .type = INTEGER,
-               .i = SQL_FN_TSI_SECOND | SQL_FN_TSI_MINUTE | SQL_FN_TSI_HOUR | 
SQL_FN_TSI_DAY | SQL_FN_TSI_WEEK | SQL_FN_TSI_MONTH | SQL_FN_TSI_QUARTER | 
SQL_FN_TSI_YEAR,
+               .i = SQL_FN_TSI_FRAC_SECOND | SQL_FN_TSI_SECOND | 
SQL_FN_TSI_MINUTE | SQL_FN_TSI_HOUR | SQL_FN_TSI_DAY | SQL_FN_TSI_WEEK | 
SQL_FN_TSI_MONTH | SQL_FN_TSI_QUARTER | SQL_FN_TSI_YEAR,
        },
        {
                .info = SQL_TIMEDATE_FUNCTIONS,
diff --git a/debian/monetdb-client-testing.install 
b/debian/monetdb-client-testing.install
--- a/debian/monetdb-client-testing.install
+++ b/debian/monetdb-client-testing.install
@@ -1,6 +1,7 @@
 debian/tmp/usr/bin/ODBCStmtAttr usr/bin
 debian/tmp/usr/bin/ODBCgetInfo usr/bin
 debian/tmp/usr/bin/ODBCmetadata usr/bin
+debian/tmp/usr/bin/ODBCtester usr/bin
 debian/tmp/usr/bin/arraytest usr/bin
 debian/tmp/usr/bin/bincopydata usr/bin
 debian/tmp/usr/bin/odbcsample1 usr/bin
diff --git a/gdk/ChangeLog.Sep2022 b/gdk/ChangeLog.Sep2022
--- a/gdk/ChangeLog.Sep2022
+++ b/gdk/ChangeLog.Sep2022
@@ -1,6 +1,13 @@
 # ChangeLog file for GDK
 # This file is updated with Maddlog
 
+* Thu Apr 20 2023 Sjoerd Mullender <sjo...@acm.org>
+- Fixed yet another occurrence of a missing .tailN file.  This one could
+  happen if a string bat was appended to in stages so that between appends
+  the column was committed.  If an append caused both a realloc of the
+  tail heap because it was getting longer and a realloc because it got
+  wider, the file might get removed before the GDK level commit happened.
+
 * Fri Mar 24 2023 Sjoerd Mullender <sjo...@acm.org>
 - When processing the WAL, if a to-be-destroyed object cannot be found,
   don't stop, but keep processing the rest of the WAL.
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2891,6 +2891,7 @@ PROPdestroy_nolock(BAT *b)
        b->tprops = NULL;
        while (p) {
                n = p->next;
+               assert(p->id != (enum prop_t) 20);
                VALclear(&p->v);
                GDKfree(p);
                p = n;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1913,6 +1913,12 @@ BBPexit(void)
                                                HEAPdecref(b->tvheap, false);
                                                b->tvheap = NULL;
                                        }
+                                       if (b->oldtail) {
+                                               Heap *h = b->oldtail;
+                                               b->oldtail = NULL;
+                                               ATOMIC_AND(&h->refs, 
~DELAYEDREMOVE);
+                                               HEAPdecref(h, false);
+                                       }
                                        PROPdestroy_nolock(b);
                                        MT_lock_unset(&b->theaplock);
                                        BATfree(b);
@@ -3600,34 +3606,21 @@ BBPbackup(BAT *b, bool subcommit)
 }
 
 static inline void
-BBPcheckHeap(bool subcommit, Heap *h)
+BBPcheckHeap(Heap *h)
 {
        struct stat statb;
        char *path;
 
-       if (subcommit) {
-               char *s = strrchr(h->filename, DIR_SEP);
-               if (s)
-                       s++;
-               else
-                       s = h->filename;
-               path = GDKfilepath(0, BAKDIR, s, NULL);
-               if (path == NULL)
-                       return;
-               if (MT_stat(path, &statb) < 0) {
-                       GDKfree(path);
-                       path = GDKfilepath(0, BATDIR, h->filename, NULL);
-                       if (path == NULL)
-                               return;
-                       if (MT_stat(path, &statb) < 0) {
-                               GDKsyserror("cannot stat file %s (expected size 
%zu)\n",
-                                           path, h->free);
-                               assert(0);
-                               GDKfree(path);
-                               return;
-                       }
-               }
-       } else {
+       char *s = strrchr(h->filename, DIR_SEP);
+       if (s)
+               s++;
+       else
+               s = h->filename;
+       path = GDKfilepath(0, BAKDIR, s, NULL);
+       if (path == NULL)
+               return;
+       if (MT_stat(path, &statb) < 0) {
+               GDKfree(path);
                path = GDKfilepath(0, BATDIR, h->filename, NULL);
                if (path == NULL)
                        return;
@@ -3650,7 +3643,7 @@ BBPcheckHeap(bool subcommit, Heap *h)
 }
 
 static void
-BBPcheckBBPdir(bool subcommit)
+BBPcheckBBPdir(void)
 {
        FILE *fp;
        int lineno = 0;
@@ -3658,10 +3651,14 @@ BBPcheckBBPdir(bool subcommit)
        unsigned bbpversion;
        lng logno, transid;
 
-       fp = GDKfileopen(0, BATDIR, "BBP", "dir", "r");
+       fp = GDKfileopen(0, BAKDIR, "BBP", "dir", "r");
        assert(fp != NULL);
-       if (fp == NULL)
-               return;
+       if (fp == NULL) {
+               fp = GDKfileopen(0, BATDIR, "BBP", "dir", "r");
+               assert(fp != NULL);
+               if (fp == NULL)
+                       return;
+       }
        bbpversion = BBPheader(fp, &lineno, &bbpsize, &logno, &transid);
        if (bbpversion == 0) {
                fclose(fp);
@@ -3716,9 +3713,9 @@ BBPcheckBBPdir(bool subcommit)
                        continue;
                }
                if (b.theap->free > 0)
-                       BBPcheckHeap(subcommit, b.theap);
+                       BBPcheckHeap(b.theap);
                if (b.tvheap != NULL && b.tvheap->free > 0)
-                       BBPcheckHeap(subcommit, b.tvheap);
+                       BBPcheckHeap(b.tvheap);
        }
 }
 
@@ -3753,6 +3750,9 @@ BBPsync(int cnt, bat *restrict subcommit
 
        TRC_DEBUG_IF(PERF) t0 = t1 = GDKusec();
 
+       if ((GDKdebug & TAILCHKMASK) && !GDKinmemory(0))
+               BBPcheckBBPdir();
+
        ret = BBPprepare(subcommit != NULL);
 
        /* PHASE 1: safeguard everything in a backup-dir */
@@ -3873,9 +3873,6 @@ BBPsync(int cnt, bat *restrict subcommit
                 * succeeded, so no changing of ret after this
                 * call anymore */
 
-               if ((GDKdebug & TAILCHKMASK) && !GDKinmemory(0))
-                       BBPcheckBBPdir(subcommit != NULL);
-
                if (MT_rename(bakdir, deldir) < 0 &&
                    /* maybe there was an old deldir, so remove and try again */
                    (GDKremovedir(0, DELDIR) != GDK_SUCCEED ||
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -601,9 +601,14 @@ GDKupgradevarheap(BAT *b, var_t v, BUN c
        b->theap = new;
        if (BBP_status(bid) & (BBPEXISTING|BBPDELETED) && b->oldtail == NULL) {
                b->oldtail = old;
-               ATOMIC_OR(&old->refs, DELAYEDREMOVE);
+               if ((ATOMIC_OR(&old->refs, DELAYEDREMOVE) & HEAPREFS) == 1) {
+                       /* we have the only reference, we can free the
+                        * memory */
+                       HEAPfree(old, false);
+               }
        } else {
-               HEAPdecref(old, true);
+               ValPtr p = BATgetprop_nolock(b, (enum prop_t) 20);
+               HEAPdecref(old, p == NULL || strcmp(((Heap*) 
p->val.pval)->filename, old->filename) != 0);
        }
        MT_lock_unset(&b->theaplock);
        return GDK_SUCCEED;
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -4997,22 +4997,21 @@ STRasciify(str *r, const str *s)
        iconv_t cd;
        const str f = "UTF8", t = "ASCII//TRANSLIT";
        str in = *s, out;
-       /* Output string length LEN+1 when converting from UTF-8 TO ASCII
-          should be enough. If for some reason LEN is needed is totality,
-          +1 safeguards the \0.*/
-       size_t in_len = strlen(in), out_len = in_len + 1;
+       size_t in_len = strlen(in), out_len = in_len * 4; /* oversized as a 
single utf8 char could change into multiple
+                                                                               
                                 ascii char */
        /* man iconv; /TRANSLIT */
        if ((cd = iconv_open(t, f)) == (iconv_t)(-1))
                throw(MAL, "str.asciify", "ICONV: cannot convert from (%s) to 
(%s).", f, t);
        if ((*r = out = GDKmalloc(out_len)) == NULL)
                throw(MAL, "str.asciify", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       if (iconv(cd, &in, &in_len, &out, &out_len) == (size_t) - 1) {
+       str o = out;
+       if (iconv(cd, &in, &in_len, &o, &out_len) == (size_t) - 1) {
                GDKfree(out);
                *r = NULL;
                iconv_close(cd);
                throw(MAL, "str.asciify", "ICONV: string conversion failed from 
(%s) to (%s)", f, t);
        }
-       *out = '\0';
+       *o = '\0';
        iconv_close(cd);
        return MAL_SUCCEED;
 #else
diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c
--- a/monetdb5/modules/kernel/batstr.c
+++ b/monetdb5/modules/kernel/batstr.c
@@ -5063,7 +5063,7 @@ BATSTRasciify(bat *ret, bat *bid)
 #ifdef HAVE_ICONV
        BAT *b = NULL, *bn = NULL;
        BATiter bi;
-       BUN p, q;
+       BUN p, q = 0;
        bool nils = false;
        size_t prev_out_len = 0, in_len = 0, out_len = 0;
        str s = NULL, out = NULL, in = NULL, msg = MAL_SUCCEED;
@@ -5080,6 +5080,11 @@ BATSTRasciify(bat *ret, bat *bid)
                throw(MAL, "batstr.asciify", GDK_EXCEPTION);
        }
        bi = bat_iterator(b);
+       if ((s = out = GDKmalloc(64*1024)) == NULL) {
+               msg = createException(MAL,"batstr.asciify", MAL_MALLOC_FAIL);
+               goto exit;
+       }
+       prev_out_len = 64*1024;
        BATloop(b, p, q) {
                in = (str) BUNtail(bi, p);
                if (strNil(in)) {
@@ -5090,25 +5095,17 @@ BATSTRasciify(bat *ret, bat *bid)
                        nils = true;
                        continue;
                }
-               in_len = strlen(in), out_len = in_len + 1;
-               if (out == NULL) {
-                       if ((out = GDKmalloc(out_len)) == NULL) {
-                               msg = createException(MAL,"batstr.asciify", 
MAL_MALLOC_FAIL);
-                               goto exit;
-                       }
-                       prev_out_len = out_len;
-               }
-               else if (out_len > prev_out_len) {
+               in_len = strlen(in), out_len = in_len*4; /* over sized as 
single utf8 symbols change into multiple ascii characters */
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to