Changeset: 490381163ff4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/490381163ff4
Branch: Jun2023
Log Message:
merged
diffs (276 lines):
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/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 <[email protected]>
+- 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 <[email protected]>
- 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_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3600,34 +3600,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 +3637,7 @@ BBPcheckHeap(bool subcommit, Heap *h)
}
static void
-BBPcheckBBPdir(bool subcommit)
+BBPcheckBBPdir(void)
{
FILE *fp;
int lineno = 0;
@@ -3658,10 +3645,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 +3707,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 +3744,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 +3867,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
@@ -603,7 +603,8 @@ GDKupgradevarheap(BAT *b, var_t v, BUN c
b->oldtail = old;
ATOMIC_OR(&old->refs, DELAYEDREMOVE);
} 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/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1169,7 +1169,6 @@ backend_dumpproc(backend *be, Client c,
if (c->curprg->def->errors) {
sql_error(m, 10, SQLSTATE(42000) "Internal error while
compiling statement: %s", c->curprg->def->errors);
res = -1;
- goto cleanup;
}
// restore the context for the wrapper code
diff --git a/sql/test/BugTracker-2015/Tests/schema-trigger.Bug-3710.test
b/sql/test/BugTracker-2015/Tests/schema-trigger.Bug-3710.test
--- a/sql/test/BugTracker-2015/Tests/schema-trigger.Bug-3710.test
+++ b/sql/test/BugTracker-2015/Tests/schema-trigger.Bug-3710.test
@@ -8,9 +8,7 @@ statement error
CREATE TRIGGER marketdata.calc_sdate BEFORE INSERT ON marketdata.quotes
FOR EACH ROW
BEGIN ATOMIC
- update marketdata.quotes set i = quotes.i +2 where quotes.i < 2
-
-statement error
+ update marketdata.quotes set i = quotes.i +2 where quotes.i < 2;
END
statement ok
diff --git a/sql/test/odbc-escape-sequences/Tests/system-functions.test
b/sql/test/odbc-escape-sequences/Tests/system-functions.test
--- a/sql/test/odbc-escape-sequences/Tests/system-functions.test
+++ b/sql/test/odbc-escape-sequences/Tests/system-functions.test
@@ -1,14 +1,39 @@
-query T rowsort
-select { fn user() }
-----
-monetdb
+# ref:
https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/system-functions
query I rowsort
-select length((select { fn database() })) > 0
+select { fn LENGTH( { fn DATABASE ( ) })} > 0
----
1
query I rowsort
-select { fn ifnull(NULL, 1) }
+select length(DATABASE()) > 0
+----
+1
+
+
+query I rowsort
+select { fn IFNULL(NULL, 1) }
----
1
+
+query T rowsort
+select { fn IFNULL('abc', 'def') }
+----
+abc
+
+query R rowsort
+select { fn IFNULL(NULLIF(3,3), -9.0/+4) }
+----
+-2.250
+
+statement error
+select IFNULL('abc', 'def')
+
+
+query T rowsort
+select { fn USER() }
+----
+monetdb
+
+statement error
+select USER()
diff --git
a/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
b/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
--- a/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
+++ b/sql/test/odbc-escape-sequences/Tests/time-date-interval-functions.test
@@ -314,7 +314,7 @@ select { fn timestampadd(SQL_TSI_DAY, 14
2022-12-12 14:13:12
query T rowsort
-select { fn timestampadd(SQL_TSI_DAY, 28, timestamp'2022-11-14 14:13:12') }
+select { fn timestampadd(SQL_TSI_DAY, 4*7, timestamp'2022-11-14 14:13:12') }
----
2022-12-12 14:13:12
@@ -344,6 +344,11 @@ 2027-11-14 14:13:12
# interval has the same value as TIMESTAMPADD.
# Fractional seconds are expressed in billionths of a second.
+query T rowsort
+select cast ({ fn timestampdiff(SQL_TSI_FRAC_SECOND, { ts '2022-12-12
12:00:00.123456'}, {ts'2022-12-12 12:00:30.654321' }) } as varchar(20))
+----
+30.531
+
query I rowsort
select { fn timestampdiff(SQL_TSI_SECOND, timestamp'2022-12-12 12:00:00',
timestamp'2022-12-12 12:00:30') }
----
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]