Changeset: 5a7a63e0a28a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5a7a63e0a28a
Added Files:
sql/test/miscellaneous/Tests/view-mul-digits.sql
sql/test/miscellaneous/Tests/view-mul-digits.stable.err
sql/test/miscellaneous/Tests/view-mul-digits.stable.out
Modified Files:
clients/mapiclient/dump.c
sql/backends/monet5/sql_upgrades.c
sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.sql
sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.out
sql/test/miscellaneous/Tests/All
sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit
sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit
Branch: default
Log Message:
Merge with Nov2019
diffs (truncated from 348 to 300 lines):
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -1167,11 +1167,8 @@ describe_table(Mapi mid, const char *sch
t = sescape(tname);
maxquerylen = 5120 + strlen(t) + strlen(s);
query = malloc(maxquerylen);
- if (query == NULL) {
- if (sname != NULL)
- free(sname);
+ if (query == NULL)
goto bailout;
- }
snprintf(query, maxquerylen,
"%s "
@@ -1485,7 +1482,7 @@ int
describe_sequence(Mapi mid, const char *schema, const char *tname, stream
*toConsole)
{
MapiHdl hdl = NULL;
- char *query;
+ char *query = NULL;
size_t maxquerylen;
char *sname = NULL;
const char *comments_clause = get_comments_clause(mid);
@@ -1509,11 +1506,8 @@ describe_sequence(Mapi mid, const char *
maxquerylen = 5120 + strlen(tname) + strlen(schema);
query = malloc(maxquerylen);
- if (query == NULL) {
- if (sname != NULL)
- free(sname);
+ if (query == NULL)
goto bailout;
- }
snprintf(query, maxquerylen,
"%s "
@@ -1959,8 +1953,12 @@ dump_function(Mapi mid, stream *toConsol
if (flkey) {
char* nflkey = flkey ? strdup(flkey) : NULL;
if (!nflkey) {
- if (remark)
+ if (remark) {
free(remark);
+ free(sname);
+ free(fname);
+ free(ftkey);
+ }
goto bailout;
} else
flkey = nflkey;
@@ -1976,8 +1974,12 @@ dump_function(Mapi mid, stream *toConsol
if (!ffunc || query_len < 0 || query_len >= (int) query_size) {
free(ffunc);
free(flkey);
- if (remark)
+ if (remark) {
free(remark);
+ free(sname);
+ free(fname);
+ free(ftkey);
+ }
free(query);
goto bailout;
}
@@ -1987,8 +1989,12 @@ dump_function(Mapi mid, stream *toConsol
if (hdl == NULL || mapi_error(mid)) {
free(ffunc);
free(flkey);
- if (remark)
+ if (remark) {
free(remark);
+ free(sname);
+ free(fname);
+ free(ftkey);
+ }
goto bailout;
}
if (flang != 1 && flang != 2) {
@@ -2006,8 +2012,12 @@ dump_function(Mapi mid, stream *toConsol
free(ascal);
free(ffunc);
free(flkey);
- if (remark)
+ if (remark) {
free(remark);
+ free(sname);
+ free(fname);
+ free(ftkey);
+ }
goto bailout;
}
if (strcmp(ainou, "0") == 0) {
@@ -2043,8 +2053,12 @@ dump_function(Mapi mid, stream *toConsol
free(ascal);
free(ffunc);
free(flkey);
- if (remark)
+ if (remark) {
free(remark);
+ free(sname);
+ free(fname);
+ free(ftkey);
+ }
goto bailout;
}
@@ -2139,7 +2153,7 @@ int
dump_functions(Mapi mid, stream *toConsole, char set_schema, const char
*sname, const char *fname, const char *id)
{
MapiHdl hdl = NULL;
- char *query;
+ char *query = NULL;
size_t query_size;
int query_len;
bool hashge;
@@ -2204,8 +2218,10 @@ dump_functions(Mapi mid, stream *toConso
}
query_len += snprintf(query + query_len, query_size - query_len, "ORDER
BY f.func, f.id");
assert(query_len < (int) query_size);
- if (query_len >= (int) query_size)
+ if (query_len >= (int) query_size) {
+ free(query);
goto bailout;
+ }
hdl = mapi_query(mid, query);
free(query);
diff --git a/sql/backends/monet5/sql_upgrades.c
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -1939,7 +1939,8 @@ sql_update_apr2019_sp2(Client c)
#define FLUSH_INSERTS_IF_BUFFERFILLED /* Each new value should add about 20
bytes to the buffer, "flush" when is 200 bytes from being full */ \
if (pos > 7900) { \
- pos += snprintf(buf + pos, bufsize - pos, ") as t1(c1,c2,c3)
where t1.c1 not in (select \"id\" from dependencies where depend_id =
t1.c2);\n"); \
+ pos += snprintf(buf + pos, bufsize - pos, \
+ ") as t1(c1,c2,c3) where t1.c1
not in (select \"id\" from sys.dependencies where depend_id = t1.c2);\n"); \
assert(pos < bufsize); \
printf("Running database upgrade commands:\n%s\n", buf); \
err = SQLstatementIntern(c, &buf, "update", true, false, NULL);
\
@@ -1997,7 +1998,8 @@ sql_update_nov2019_missing_dependencies(
for (node *o = id_l->h ; o ; o
= o->next) {
sqlid next = *(sqlid*)
o->data;
if (next != f->base.id)
{
- pos +=
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
f->base.id, (int)(!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY));
+ pos +=
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
+
f->base.id, (int)(!IS_PROC(f) ? FUNC_DEPENDENCY :
PROC_DEPENDENCY));
first = false;
FLUSH_INSERTS_IF_BUFFERFILLED
}
@@ -2029,7 +2031,8 @@ sql_update_nov2019_missing_dependencies(
for (node *o = id_l->h ; o ; o
= o->next) {
sqlid next = *(sqlid*)
o->data;
if (next != t->base.id)
{
- pos +=
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
t->base.id, (int) VIEW_DEPENDENCY);
+ pos +=
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",",
+
next, t->base.id, (int) VIEW_DEPENDENCY);
first = false;
FLUSH_INSERTS_IF_BUFFERFILLED
}
@@ -2058,7 +2061,8 @@ sql_update_nov2019_missing_dependencies(
for (node *o = id_l->h
; o ; o = o->next) {
sqlid next =
*(sqlid*) o->data;
if (next !=
tr->base.id) {
- pos +=
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
tr->base.id, (int) TRIGGER_DEPENDENCY);
+ pos +=
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",",
+
next, tr->base.id, (int) TRIGGER_DEPENDENCY);
first =
false;
FLUSH_INSERTS_IF_BUFFERFILLED
}
@@ -2069,7 +2073,8 @@ sql_update_nov2019_missing_dependencies(
}
if (ppos != pos) { /* found updatable functions */
- pos += snprintf(buf + pos, bufsize - pos, ") as t1(c1,c2,c3)
where t1.c1 not in (select \"id\" from dependencies where depend_id =
t1.c2);\n");
+ pos += snprintf(buf + pos, bufsize - pos,
+ ") as t1(c1,c2,c3) where t1.c1
not in (select \"id\" from sys.dependencies where depend_id = t1.c2);\n");
assert(pos < bufsize);
printf("Running database upgrade commands:\n%s\n", buf);
diff --git
a/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.sql
b/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.sql
--- a/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.sql
+++ b/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.sql
@@ -56,3 +56,5 @@ create view s0_mix_source_string_result_
-- The INSERT INTO fails
insert into resultbuffer_int_str (q, i1,s1, prob) select cast(0 as int) as
q,a1, a2, prob from s0_mix_source_string_result_result as r;
+ROLLBACK;
+
diff --git
a/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.out
b/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.out
---
a/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.out
+++
b/sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.out
@@ -70,6 +70,7 @@ stdout of test 'crash-in-rel_dependencie
#create view s0_mix_source_string_result_result as with q0_x0 as (select a1,
prob from (select cachedrel_44.a1 as a1, cachedrel_44.a2 as a2, cachedrel_44.a3
as a3, t__x2.a1 as a4, cachedrel_44.prob * t__x2.prob as prob from
cachedrel_44,(select a2 as a1, prob from (select paramname as a1, value as a2,
prob from paramsint where paramname = 's0_userid') as t__x1) as t__x2 where
cachedrel_44.a3 = t__x2.a1) as t__x3),q0_x1 as (select a1, prob from (select
cachedrel_6.a1 as a1, q0_x0.a1 as a2, cachedrel_6.prob * q0_x0.prob as prob
from cachedrel_6,q0_x0 where cachedrel_6.a1 = q0_x0.a1) as t__x5),q0_x2 as
(select a1, prob from (select cachedrel_647.a1 as a1, cachedrel_647.a2 as a2,
q0_x1.a1 as a3, cachedrel_647.prob * q0_x1.prob as prob from
cachedrel_647,q0_x1 where cachedrel_647.a2 = q0_x1.a1) as t__x7),q0_x3 as
(select a1, 1 as prob from q0_x2),q0_x4 as (select a1, a4 as a2, prob from
(select q0_x3.a1 as a1, cachedrel_33.a1 as a2, cachedrel_33.a2 as a3,
cachedrel_33.a3 as a4, q0_x3.pro
b * cachedrel_33.prob as prob from q0_x3,cachedrel_33 where q0_x3.a1 =
cachedrel_33.a1) as t__x9),q0_x5 as (select a2 as a1, max(prob) as prob from
q0_x4 group by a2),q0_x8 as (select a1, prob from (select q0_x5.a1 as a1,
q0_x5.prob / t__x11.prob as prob from q0_x5,(select max(prob) as prob from
q0_x5) as t__x11) as t__x12),q0_x9 as (select a1, a4 as a2, prob from (select
q0_x8.a1 as a1, cachedrel_84.a1 as a2, cachedrel_84.a2 as a3, cachedrel_84.a3
as a4, q0_x8.prob * cachedrel_84.prob as prob from q0_x8,cachedrel_84 where
q0_x8.a1 = cachedrel_84.a1) as t__x14),q0_x10 as (select a2 as a1, max(prob) as
prob from q0_x9 group by a2),q0_x12 as (select a1, a4 as a2, prob from (select
q0_x10.a1 as a1, cachedrel_84.a1 as a2, cachedrel_84.a2 as a3, cachedrel_84.a3
as a4, q0_x10.prob * cachedrel_84.prob as prob from q0_x10,cachedrel_84 where
q0_x10.a1 = cachedrel_84.a1) as t__x16),q0_x13 as (select a2 as a1, max(prob)
as prob from q0_x12 group by a2),q0_x15 as (select a1, a4 as a2, prob from
(select q0_x13.a1 as a1, cachedrel_84.a1 as a2, cachedrel_84.a2 as a3,
cachedrel_84.a3 as a4, q0_x13.prob * cachedrel_84.prob as prob from
q0_x13,cachedrel_84 where q0_x13.a1 = cachedrel_84.a1) as t__x18),q0_x16 as
(select a2 as a1, max(prob) as prob from q0_x15 group by a2),q0_x18 as (select
a1, a4 as a2, prob from (select q0_x16.a1 as a1, cachedrel_104.a1 as a2,
cachedrel_104.a2 as a3, cachedrel_104.a3 as a4, q0_x16.prob *
cachedrel_104.prob as prob from q0_x16,cachedrel_104 where q0_x16.a1 =
cachedrel_104.a1) as t__x20),q0_x19 as (select a2 as a1, max(prob) as prob from
q0_x18 group by a2),q0_x20 as (select a1, a4 as a2, prob from (select q0_x19.a1
as a1, cachedrel_104.a1 as a2, cachedrel_104.a2 as a3, cachedrel_104.a3 as a4,
q0_x19.prob * cachedrel_104.prob as prob from q0_x19,cachedrel_104 where
q0_x19.a1 = cachedrel_104.a1) as t__x22),q0_x21 as (select a2 as a1, max(prob)
as prob from q0_x20 group by a2),q0_x22 as (select a1, a4 as a2, prob from
(select q0_x21.a1 as a1, cache
drel_104.a1 as a2, cachedrel_104.a2 as a3, cachedrel_104.a3 as a4, q0_x21.prob
* cachedrel_104.prob as prob from q0_x21,cachedrel_104 where q0_x21.a1 =
cachedrel_104.a1) as t__x24),q0_x23 as (select a2 as a1, max(prob) as prob from
q0_x22 group by a2),q0_x24 as (select a1, a4 as a2, prob from (select q0_x23.a1
as a1, cachedrel_421.a1 as a2, cachedrel_421.a2 as a3, cachedrel_421.a3 as a4,
q0_x23.prob * cachedrel_421.prob as prob from q0_x23,cachedrel_421 where
q0_x23.a1 = cachedrel_421.a1) as t__x26),q0_x25 as (select a2 as a1, prob from
q0_x24),q0_x26 as (select a1, a3 as a2, max(prob) as prob from (select
cachedrel_91.a1 as a1, cachedrel_91.a2 as a2, cachedrel_91.a3 as a3,
cachedrel_91.a4 as a4, q0_x25.a1 as a5, cachedrel_91.prob * q0_x25.prob as prob
from cachedrel_91,q0_x25 where cachedrel_91.a1 = q0_x25.a1) as t__x28 group by
a1, a3),q0_x33 as (select a1, a2, prob from (select q0_x26.a1 as a1, q0_x26.a2
as a2, cachedrel_606.a1 as a3, q0_x26.prob * cachedrel_606.prob as prob from
q0_x26,cachedrel_606) as t__x30),q0_x6 as (select a1, a2, max(prob) as prob
from q0_x4 group by a1, a2),q0_x7 as (select a1, a2, prob from (select q0_x6.a1
as a1, q0_x6.a2 as a2, t__x32.a1 as a3, q0_x6.prob / t__x32.prob as prob from
q0_x6,(select a1, max(prob) as prob from q0_x6 group by a1) as t__x32 where
q0_x6.a1 = t__x32.a1) as t__x33),q0_x11 as (select a1, a2, max(prob) as prob
from q0_x9 group by a1, a2),q0_x27 as (select a1, a4 as a2, prob from (select
q0_x7.a1 as a1, q0_x7.a2 as a2, q0_x11.a1 as a3, q0_x11.a2 as a4, q0_x7.prob *
q0_x11.prob as prob from q0_x7,q0_x11 where q0_x7.a2 = q0_x11.a1) as
t__x35),q0_x14 as (select a1, a2, max(prob) as prob from q0_x12 group by a1,
a2),q0_x28 as (select a1, a4 as a2, prob from (select q0_x27.a1 as a1,
q0_x27.a2 as a2, q0_x14.a1 as a3, q0_x14.a2 as a4, q0_x27.prob * q0_x14.prob as
prob from q0_x27,q0_x14 where q0_x27.a2 = q0_x14.a1) as t__x37),q0_x17 as
(select a1, a2, max(prob) as prob from q0_x15 group by a1, a2),q0_x29 as
(select
a1, a4 as a2, prob from (select q0_x28.a1 as a1, q0_x28.a2 as a2, q0_x17.a1 as
a3, q0_x17.a2 as a4, q0_x28.prob * q0_x17.prob as prob from q0_x28,q0_x17 where
q0_x28.a2 = q0_x17.a1) as t__x39),q0_x30 as (select a2 as a1, a1 as a2, prob
from q0_x29),q0_x31 as (select a1, a3 as a2, cast(count(prob) as double) as
prob from (select cachedrel_91.a1 as a1, cachedrel_91.a2 as a2, cachedrel_91.a3
as a3, cachedrel_91.a4 as a4, q0_x2.a1 as a5, cachedrel_91.prob * q0_x2.prob as
prob from cachedrel_91,q0_x2 where cachedrel_91.a1 = q0_x2.a1) as t__x40 group
by a1, a3),q0_x32 as (select a1, a4 as a2, sum(prob) as prob from (select
q0_x30.a1 as a1, q0_x30.a2 as a2, q0_x31.a1 as a3, q0_x31.a2 as a4, q0_x30.prob
* q0_x31.prob as prob from q0_x30,q0_x31 where q0_x30.a2 = q0_x31.a1) as t__x42
group by a1, a4),q0_x34 as (select a1, a2, prob from (select q0_x32.a1 as a1,
q0_x32.a2 as a2, t__x44.a1 as a3, q0_x32.prob * t__x44.prob as prob from
q0_x32,(values ('2',1.0)) as t__x44(a1,prob)) as t__x45),q0_x
35 as (select a1, a2, prob from q0_x33 union all select a1, a2, prob from
q0_x34) select a1, a2, prob from q0_x35;
#insert into resultbuffer_int_str (q, i1,s1, prob) select cast(0 as int) as
q,a1, a2, prob from s0_mix_source_string_result_result as r;
[ 0 ]
+#ROLLBACK;
# 12:49:43 >
# 12:49:43 > "Done."
diff --git a/sql/test/miscellaneous/Tests/All b/sql/test/miscellaneous/Tests/All
--- a/sql/test/miscellaneous/Tests/All
+++ b/sql/test/miscellaneous/Tests/All
@@ -9,3 +9,4 @@ values
with_update_stmts
groupby_error
alter_table_add_column
+view-mul-digits
diff --git a/sql/test/miscellaneous/Tests/view-mul-digits.sql
b/sql/test/miscellaneous/Tests/view-mul-digits.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/miscellaneous/Tests/view-mul-digits.sql
@@ -0,0 +1,11 @@
+START TRANSACTION;
+
+create temp table mytable(b bigint);
+insert into mytable values (1), (2), (3);
+
+create view sys.myview as select cast(2 * "b" as bigint) as mycol from mytable;
+
+select t.name, c.name, c.type, c.type_digits, c.type_scale
+from sys.tables t join sys.columns c on c.table_id = t.id where t.name =
'myview';
+
+ROLLBACK;
diff --git a/sql/test/miscellaneous/Tests/view-mul-digits.stable.err
b/sql/test/miscellaneous/Tests/view-mul-digits.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/miscellaneous/Tests/view-mul-digits.stable.err
@@ -0,0 +1,32 @@
+stderr of test 'view-mul-digits` in directory 'sql/test/miscellaneous` itself:
+
+
+# 09:17:14 >
+# 09:17:14 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=38624" "--set"
"mapi_usock=/var/tmp/mtest-19962/.s.monetdb.38624" "--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/MonetDB/mTests_sql_test_miscellaneous"
"--set" "embedded_r=yes" "--set" "embedded_py=2" "--set" "embedded_c=true"
+# 09:17:14 >
+
+# builtin opt gdk_dbpath =
/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_ipv6 = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 38624
+# cmdline opt mapi_usock = /var/tmp/mtest-19962/.s.monetdb.38624
+# cmdline opt gdk_dbpath =
/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/MonetDB/mTests_sql_test_miscellaneous
+# cmdline opt embedded_r = yes
+# cmdline opt embedded_py = 2
+# cmdline opt embedded_c = true
+
+# 09:17:15 >
+# 09:17:15 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-19962" "--port=38624"
+# 09:17:15 >
+
+
+# 09:17:15 >
+# 09:17:15 > "Done."
+# 09:17:15 >
+
diff --git a/sql/test/miscellaneous/Tests/view-mul-digits.stable.out
b/sql/test/miscellaneous/Tests/view-mul-digits.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/miscellaneous/Tests/view-mul-digits.stable.out
@@ -0,0 +1,80 @@
+stdout of test 'view-mul-digits` in directory 'sql/test/miscellaneous` itself:
+
+
+# 09:17:14 >
+# 09:17:14 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=38624" "--set"
"mapi_usock=/var/tmp/mtest-19962/.s.monetdb.38624" "--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-Nov2019/BUILD/var/MonetDB/mTests_sql_test_miscellaneous"
"--set" "embedded_r=yes" "--set" "embedded_py=2" "--set" "embedded_c=true"
+# 09:17:14 >
+
+# MonetDB 5 server v11.35.0 (hg id: 0fdb2a149864)
+# This is an unreleased version
+# Serving database 'mTests_sql_test_miscellaneous', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit
+# Found 15.504 GiB available main-memory.
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2019 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on
mapi:monetdb://localhost.localdomain:38624/
+# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-19962/.s.monetdb.38624
+# MonetDB/GIS module loaded
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list