MonetDB: Oct2020 - On union relations, the expression's properti...

2021-01-21 Thread Pedro Ferreira
Changeset: 8002219d9426 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8002219d9426
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_unnest.c
sql/test/SQLancer/Tests/sqlancer02.stable.out
sql/test/merge-partitions/Tests/mergepart31.stable.out
Branch: Oct2020
Log Message:

On union relations, the expression's properties cannot be propagated. Also make 
sure to call rel_setop_set_exps on set relations when setting exressions


diffs (truncated from 375 to 300 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -2077,6 +2077,7 @@ rel_push_topn_and_sample_down(visitor *v
ur = func(v->sql->sa, ur, sum_limit_offset(v->sql, 
rel));
 
u = rel_setop(v->sql->sa, ul, ur, op_union);
+   /* TODO the list of expressions of u don't match ul and 
ur */
u->exps = exps_alias(v->sql, r->exps);
u->nrcols = list_length(u->exps);
set_processed(u);
@@ -4159,7 +4160,7 @@ rel_push_aggr_down(visitor *v, sql_rel *
sql_table *mt = (bt)?bt->r:NULL;
if (c && mt && 
list_find(c->t->pkey->k.columns, c, cmp) != NULL) {
v->changes++;
-   return rel_inplace_setop(rel, 
ul, ur, op_union,
+   return 
rel_inplace_setop(v->sql, rel, ul, ur, op_union,
   rel_projections(v->sql, 
rel, NULL, 1, 1));
}
}
@@ -5117,7 +5118,7 @@ rel_push_join_down_union(visitor *v, sql
nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
nr = rel_project(v->sql->sa, nr, 
rel_projections(v->sql, nr, NULL, 1, 1));
v->changes++;
-   return rel_inplace_setop(rel, nl, nr, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
+   return rel_inplace_setop(v->sql, rel, nl, nr, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
} else if (is_union(l->op) && !need_distinct(l) &&
   is_union(r->op) && !need_distinct(r)) {
sql_rel *nl, *nr;
@@ -5160,7 +5161,7 @@ rel_push_join_down_union(visitor *v, sql
nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
nr = rel_project(v->sql->sa, nr, 
rel_projections(v->sql, nr, NULL, 1, 1));
v->changes++;
-   return rel_inplace_setop(rel, nl, nr, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
+   return rel_inplace_setop(v->sql, rel, nl, nr, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
} else if (!is_union(l->op) &&
   is_union(r->op) && !need_distinct(r) &&
   !is_semi(rel->op)) {
@@ -5189,7 +5190,7 @@ rel_push_join_down_union(visitor *v, sql
nl = rel_project(v->sql->sa, nl, 
rel_projections(v->sql, nl, NULL, 1, 1));
nr = rel_project(v->sql->sa, nr, 
rel_projections(v->sql, nr, NULL, 1, 1));
v->changes++;
-   return rel_inplace_setop(rel, nl, nr, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
+   return rel_inplace_setop(v->sql, rel, nl, nr, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
/* {semi}join ( A1, union (A2, B)) [A1.partkey = A2.partkey] ->
 * {semi}join ( A1, A2 )
 * and
@@ -5519,7 +5520,7 @@ rel_push_select_down_union(visitor *v, s
ul->exps = exps_copy(v->sql, s->exps);
ur->exps = exps_copy(v->sql, s->exps);
 
-   rel = rel_inplace_setop(rel, ul, ur, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
+   rel = rel_inplace_setop(v->sql, rel, ul, ur, op_union, 
rel_projections(v->sql, rel, NULL, 1, 1));
v->changes++;
return rel;
}
@@ -5648,7 +5649,7 @@ rel_push_project_down_union(visitor *v, 
ul->exps = exps_copy(v->sql, p->exps);
ur->exps = exps_copy(v->sql, p->exps);
 
-   rel = rel_inplace_setop(rel, ul, ur, op_union,
+   rel = rel_inplace_setop(v->sql, rel, ul, ur, op_union,
rel_projections(v->sql, rel, NULL, 1, 1));
if (need_distinct)
set_distinct(rel);
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ 

MonetDB: nospare - merged with default

2021-01-21 Thread Niels Nes
Changeset: ee1369de5b83 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ee1369de5b83
Branch: nospare
Log Message:

merged with default


diffs (truncated from 1296255 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.sql b/clients/Tests/MAL-signatures.sql
deleted file mode 100644
--- a/clients/Tests/MAL-signatures.sql
+++ /dev/null
@@ -1,1 +0,0 @@
-select * from sys.malfunctions() order by module, "function", address, 
signature, comment;
diff --git a/clients/Tests/MAL-signatures.stable.err 
b/clients/Tests/MAL-signatures.stable.err
deleted file mode 100644
--- a/clients/Tests/MAL-signatures.stable.err
+++ /dev/null
@@ -1,36 +0,0 @@
-stderr of test 'MAL-signatures` in directory 'clients` itself:
-
-
-# 21:33:47 >  
-# 21:33:47 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=35607" "--set" 
"mapi_usock=/var/tmp/mtest-19610/.s.monetdb.35607" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/home/sjoerd/Monet-stable/var/MonetDB/mTests_clients" "--set" 
"mal_listing=2"
-# 21:33:47 >  
-
-# builtin opt  gdk_dbpath = /home/sjoerd/Monet-stable/var/monetdb5/dbfarm/demo
-# builtin opt  gdk_debug = 0
-# builtin opt  gdk_vmtrim = no
-# builtin opt  monet_prompt = >
-# builtin opt  monet_daemon = no
-# builtin opt  mapi_port = 5
-# builtin opt  mapi_open = 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 = 35607
-# cmdline opt  mapi_usock = /var/tmp/mtest-19610/.s.monetdb.35607
-# cmdline opt  monet_prompt = 
-# cmdline opt  mal_listing = 2
-# cmdline opt  gdk_dbpath = 
/home/sjoerd/Monet-stable/var/MonetDB/mTests_clients
-# cmdline opt  mal_listing = 2
-
-# 21:33:48 >  
-# 21:33:48 >  "mclient" "-lmal" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-19610" "--port=35607"
-# 21:33:48 >  
-
-
-
-# 21:33:51 >  
-# 21:33:51 >  "Done."
-# 21:33:51 >  
-
diff --git a/clients/Tests/exports.stable.err b/clients/Tests/exports.stable.err
deleted file mode 100644
--- a/clients/Tests/exports.stable.err
+++ /dev/null
@@ -1,9 +0,0 @@
-stderr of test 'exports` in directory 'clients` itself:
-
-
-# 15:10:42 >  
-# 15:10:42 >  "/usr/bin/python" "exports.py" "exports"
-# 15:10:42 >  
-
-
-
diff --git a/clients/Tests/exports.stable.err-noapprove 
b/clients/Tests/exports.stable.err-noapprove
deleted file mode 100644
diff --git a/clients/Tests/malcheck.stable.err 
b/clients/Tests/malcheck.stable.err
deleted file mode 100644
--- a/clients/Tests/malcheck.stable.err
+++ /dev/null
@@ -1,12 +0,0 @@
-stderr of test 'malcheck` in directory 'clients` itself:
-
-
-# 15:15:51 >  
-# 15:15:51 >  "./malcheck.sh" "malcheck"
-# 15:15:51 >  
-
-
-# 15:16:26 >  
-# 15:16:26 >  "Done."
-# 15:16:26 >  
-
diff --git a/clients/Tests/malcheck.stable.err-noapprove 
b/clients/Tests/malcheck.stable.err-noapprove
deleted file mode 100644
diff --git a/clients/Tests/malcheck.stable.out 
b/clients/Tests/malcheck.stable.out
deleted file mode 100644
--- a/clients/Tests/malcheck.stable.out
+++ /dev/null
@@ -1,12 +0,0 @@
-stdout of test 'malcheck` in directory 'clients` itself:
-
-
-# 15:15:51 >  
-# 15:15:51 >  "./malcheck.sh" "malcheck"
-# 15:15:51 >  
-
-
-# 15:16:26 >  
-# 15:16:26 >  "Done."
-# 15:16:26 >  
-
diff --git a/clients/Tests/malcheck.stable.out-noapprove 
b/clients/Tests/malcheck.stable.out-noapprove
deleted file mode 100644
diff --git a/clients/ruby/Tests/gemtest.stable.err 
b/clients/ruby/Tests/gemtest.stable.err
deleted file mode 100644
--- a/clients/ruby/Tests/gemtest.stable.err
+++ /dev/null
@@ -1,37 +0,0 @@
-stderr of test 'gemtest` in directory 'clients/ruby` itself:
-
-
-# 11:01:32 >  
-# 11:01:32 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=31445" "--set" 
"mapi_usock=/var/tmp/mtest-29264/.s.monetdb.31445" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/Users/rkoopmanschap/projects/MonetDB-installation/var/MonetDB/mTests_."
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
-# 11:01:32 >  
-
-# builtin opt  gdk_dbpath = 
/Users/rkoopmanschap/projects/MonetDB-installation/var/monetdb5/dbfarm/demo
-# builtin opt  gdk_debug = 0
-# builtin opt  gdk_vmtrim = no
-# builtin opt  monet_prompt = >
-# builtin opt  monet_daemon = no
-# builtin opt  mapi_port = 5
-# builtin opt  mapi_open = 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 = 31445
-# cmdline opt  mapi_usock = /var/tmp/mtest-29264/.s.monetdb.31445
-# cmdline opt  monet_prompt = 
-# cmdline opt  mal_listing = 2
-# cmdline opt  gdk_dbpath = 
/Users/rkoopmanschap/projects/MonetDB-installation/var/MonetDB/mTests_.
-# cmdline opt  mal_listing = 0
-# cmdline opt  embedded_r = 

MonetDB: nospare - make sure we use the correct version also for...

2021-01-21 Thread Niels Nes
Changeset: 581be5e45b8a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=581be5e45b8a
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_storage.h
sql/storage/bat/bat_table.c
sql/storage/store.c
Branch: nospare
Log Message:

make sure we use the correct version also for the system (internal) tables


diffs (104 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -126,7 +126,7 @@ get_dbat(sql_dbat *d, ulng tid, int is_t
return d;
 }
 
-static sql_delta *
+sql_delta *
 timestamp_delta( sql_trans *tr, sql_delta *d, int type, int is_temp)
 {
if (is_temp)
@@ -343,7 +343,7 @@ bind_idx(sql_trans *tr, sql_idx * i, int
return bind_uidx(tr, i, access);
int type = oid_index(i->type)?TYPE_oid:TYPE_lng;
sql_delta *d = timestamp_delta(tr, i->data, type, isTempTable(i->t));
-   return delta_bind_bat( d, access, isTempTable(i->t) || isNew(i->t));
+   return delta_bind_bat( d, access, isNew(i->t));
 }
 
 static int
diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h
--- a/sql/storage/bat/bat_storage.h
+++ b/sql/storage/bat/bat_storage.h
@@ -41,6 +41,7 @@ typedef struct sql_dbat {
 
 /* initialize bat storage call back functions interface */
 extern void bat_storage_init( store_functions *sf );
+extern sql_delta * timestamp_delta( sql_trans *tr, sql_delta *d, int type, int 
is_temp);
 
 #endif /*BATSTORAGE_H */
 
diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -54,7 +54,7 @@ delta_cands(sql_trans *tr, sql_table *t)
 }
 
 static BAT *
-delta_full_bat_( sql_trans *tr, sql_column *c, sql_delta *bat, int temp)
+delta_full_bat_( sql_trans *tr, sql_column *c, sql_delta *bat, int is_new)
 {
/* return full normalized column bat
 *  b := b.copy()
@@ -68,7 +68,7 @@ delta_full_bat_( sql_trans *tr, sql_colu
if (!i)
return NULL;
r = i;
-   if (temp)
+   if (is_new)
return r;
b = temp_descriptor(bat->bid);
if (!b) {
@@ -122,19 +122,19 @@ delta_full_bat_( sql_trans *tr, sql_colu
 }
 
 static BAT *
-delta_full_bat( sql_trans *tr, sql_column *c, sql_delta *bat, int temp)
+delta_full_bat( sql_trans *tr, sql_column *c, sql_delta *bat, int is_new)
 {
sqlstore *store = tr->store;
if (!store->initialized && bat->cached)
return bat->cached;
-   return delta_full_bat_( tr, c, bat, temp);
+   return delta_full_bat_( tr, c, bat, is_new);
 }
 
 static BAT *
 full_column(sql_trans *tr, sql_column *c)
 {
assert(c->data);
-   return delta_full_bat(tr, c, c->data, isTempTable(c->t));
+   return delta_full_bat(tr, c, timestamp_delta(tr, c->data, 
c->type.type->localtype, isTempTable(c->t)), isNew(c->t));
 }
 
 static void
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4487,14 +4487,21 @@ sql_trans_rename_table(sql_trans *tr, sq
 {
sqlstore *store = tr->store;
sql_table *systable = find_sql_table(tr, find_sql_schema(tr, 
isTempSchema(s) ? "tmp":"sys"), "_tables");
-   sql_base *b = os_find_id(s->tables, tr, id);
-   sql_table *t = (sql_table*)b;
+   sql_table *t = find_sql_table_id(tr, s, id);
oid rid;
 
assert(!strNil(new_name));
 
-   os_del(s->tables, tr, t->base.name, >base);
+   if (isGlobal(t))
+   os_del(s->tables, tr, t->base.name, >base);
+   else {
+   node *n = cs_find_id(>localtmps, t->base.id);
+   if (n)
+   cs_del(>localtmps, tr->store, n, t->base.flags);
+   }
t = table_dup(tr, t, t->s, new_name);
+   if (!isGlobal(t))
+   cs_add(>localtmps, t, TR_NEW);
 
rid = store->table_api.column_find_row(tr, find_sql_column(systable, 
"id"), >base.id, NULL);
assert(!is_oid_nil(rid));
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Oct2020 - SQLancer query with wrong results. Looking in...

2021-01-21 Thread Pedro Ferreira
Changeset: 533522f0ebfe for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=533522f0ebfe
Modified Files:
sql/test/SQLancer/Tests/sqlancer02.sql
Branch: Oct2020
Log Message:

SQLancer query with wrong results. Looking into it


diffs (27 lines):

diff --git a/sql/test/SQLancer/Tests/sqlancer02.sql 
b/sql/test/SQLancer/Tests/sqlancer02.sql
--- a/sql/test/SQLancer/Tests/sqlancer02.sql
+++ b/sql/test/SQLancer/Tests/sqlancer02.sql
@@ -360,3 +360,23 @@ from v54 as l1v54, v1 as l1v1 where l1v5
 
 select 1 from v20 as l0v20, v27 as l0v27, v1 as l0v1 where (l0v20.vc0) in (-3, 
l0v20.vc0, l0v27.vc1);
 ROLLBACK;
+
+START TRANSACTION;
+CREATE TABLE "t1" ("c0" BOOLEAN NOT NULL,CONSTRAINT "t1_c0_pkey" PRIMARY KEY 
("c0"),CONSTRAINT "t1_c0_unique" UNIQUE ("c0"));
+INSERT INTO "t1" VALUES (false), (true);
+
+create view v5(vc0) as (values (1), (4));
+
+create view v8(vc1) as ((select l0t1.c0 from t1 as l0t1) union distinct 
(select false));
+
+SELECT v5.vc0 FROM v5, v8 JOIN (VALUES (0.3, 10.0),(0.5, 8.0)) AS sub0 ON 
+true WHERE least(CASE v5.vc0 WHEN v5.vc0 THEN v8.vc1 END, true);
+   -- 1
+   -- 1
+   -- 4
+   -- 4
+
+SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT CAST(least(CASE v5.vc0 WHEN 
v5.vc0 THEN v8.vc1 END, true) AS INT) as count
+FROM v5, v8 JOIN (VALUES (0.3, 10.0),(0.5, 8.0)) AS sub0 ON true) as res;
+   -- 4
+ROLLBACK;
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - fixed partition by value list/range partitions

2021-01-21 Thread Niels Nes
Changeset: 3bb206122ef5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3bb206122ef5
Modified Files:
sql/storage/store.c
Branch: nospare
Log Message:

fixed partition by value list/range partitions


diffs (45 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4261,6 +4261,7 @@ sql_trans_add_table(sql_trans *tr, sql_t
/* merge table depends on part table */
sql_trans_create_dependency(tr, pt->base.id, mt->base.id, 
TABLE_DEPENDENCY);
assert(isMergeTable(mt) || isReplicaTable(mt));
+   mt = new_table(tr, mt);
p->t = mt;
p->member = pt;
/* TODO parts should have a unique name - id ? */
@@ -4291,6 +4292,7 @@ sql_trans_add_range_partition(sql_trans 
 
vmin = vmax = (ValRecord) {.vtype = TYPE_void,};
 
+   mt = new_table(tr, mt);
if (min) {
ok = VALinit(, localtype, min);
if (ok && localtype != TYPE_str)
@@ -4381,7 +4383,7 @@ sql_trans_add_range_partition(sql_trans 
}
 
if (!update)
-   cs_add(>members, p, TR_NEW);
+   os_add(mt->s->parts, tr, p->base.name, dup_base(>base));
 finish:
VALclear();
VALclear();
@@ -4402,6 +4404,7 @@ sql_trans_add_value_partition(sql_trans 
int localtype = tpe.type->localtype, i = 0;
sqlid *v;
 
+   mt = new_table(tr, mt);
if (!update) {
p = SA_ZNEW(tr->sa, sql_part);
base_init(tr->sa, >base, pt->base.id, TR_NEW, pt->base.name);
@@ -4474,7 +4477,7 @@ sql_trans_add_value_partition(sql_trans 
/* add merge table dependency */
sql_trans_create_dependency(tr, pt->base.id, mt->base.id, 
TABLE_DEPENDENCY);
store->table_api.table_insert(tr, sysobj, >base.id, 
p->base.name, >base.id);
-   cs_add(>members, p, TR_NEW);
+   os_add(mt->s->parts, tr, p->base.name, dup_base(>base));
}
return 0;
 }
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Oct2020 - Fixing SQLancer crash and other bugs.

2021-01-21 Thread Pedro Ferreira
Changeset: ab0a0b3be4f4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ab0a0b3be4f4
Modified Files:
sql/include/sql_relation.h
sql/server/rel_rel.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/test/SQLancer/Tests/sqlancer02.stable.out
Branch: Oct2020
Log Message:

Fixing SQLancer crash and other bugs.

As a projection, if an expression cannot be found on a set relation don't look 
further.
Make sure a set relation is always processed.
Don't look for expressions on ordering columns.


diffs (209 lines):

diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -197,7 +197,6 @@ typedef enum operator_type {
 #define is_simple_project(op)  (op == op_project)
 #define is_project(op) (op == op_project || op == op_groupby 
|| is_set(op))
 #define is_groupby(op) (op == op_groupby)
-#define is_sort(rel)   (((rel)->op == op_project && (rel)->r) || 
(rel)->op == op_topn)
 #define is_topn(op)(op == op_topn)
 #define is_modify(op)  (op == op_insert || op == op_update || op == 
op_delete || op == op_truncate)
 #define is_sample(op)  (op == op_sample)
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -378,6 +378,9 @@ rel_bind_column2( mvc *sql, sql_rel *rel
if ((is_simple_project(rel->op) || is_groupby(rel->op)) && rel->l) {
if (!is_processed(rel))
return rel_bind_column2(sql, rel->l, tname, cname, f);
+   } else if (is_set(rel->op)) {
+   assert(is_processed(rel));
+   return NULL;
} else if (is_join(rel->op)) {
sql_exp *e = rel_bind_column2(sql, rel->l, tname, cname, f);
 
@@ -389,9 +392,7 @@ rel_bind_column2( mvc *sql, sql_rel *rel
set_has_nil(e);
}
return e;
-   } else if (is_set(rel->op) ||
-  is_sort(rel) ||
-  is_semi(rel->op) ||
+   } else if (is_semi(rel->op) ||
   is_select(rel->op) ||
   is_topn(rel->op) ||
   is_sample(rel->op)) {
@@ -1564,17 +1565,27 @@ rel_find_column( sql_allocator *sa, sql_
if (e && !ambiguous && !multi)
return exp_alias(sa, exp_relname(e), exp_name(e), 
exp_relname(e), cname, exp_subtype(e), e->card, has_nil(e), is_intern(e));
}
-   if (is_project(rel->op) && rel->l && !is_processed(rel)) {
-   return rel_find_column(sa, rel->l, tname, cname);
+   if ((is_simple_project(rel->op) || is_groupby(rel->op)) && rel->l) {
+   if (!is_processed(rel))
+   return rel_find_column(sa, rel->l, tname, cname);
+   } else if (is_set(rel->op)) {
+   assert(is_processed(rel));
+   return NULL;
} else if (is_join(rel->op)) {
sql_exp *e = rel_find_column(sa, rel->l, tname, cname);
-   if (!e)
+
+   if (e && (is_right(rel->op) || is_full(rel->op)))
+   set_has_nil(e);
+   if (!e) {
e = rel_find_column(sa, rel->r, tname, cname);
+   if (e && (is_left(rel->op) || is_full(rel->op)))
+   set_has_nil(e);
+   }
return e;
-   } else if (is_set(rel->op) ||
-  is_sort(rel) ||
-  is_semi(rel->op) ||
-  is_select(rel->op)) {
+   } else if (is_semi(rel->op) ||
+  is_select(rel->op) ||
+  is_topn(rel->op) ||
+  is_sample(rel->op)) {
if (rel->l)
return rel_find_column(sa, rel->l, tname, cname);
}
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5718,8 +5718,11 @@ rel_setquery(sql_query *query, symbol *q
res = rel_setquery_(query, t1, t2, corresponding, op_except );
else if ( q->token == SQL_INTERSECT)
res = rel_setquery_(query, t1, t2, corresponding, op_inter );
-   if (res && distinct)
-   res = rel_distinct(res);
+   if (res) {
+   set_processed(res);
+   if (distinct)
+   res = rel_distinct(res);
+   }
return res;
 }
 
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2007,6 +2007,7 @@ rewrite_or_exp(visitor *v, sql_rel *rel)
list *rs = rel_projections(v->sql, rel, 
NULL, 1, 1);
if (!(rel = 
rel_setop_check_types(v->sql, l, r, ls, rs, op_union)))
   

MonetDB: nospare - Merge 'deleted' flag into 'state' flag holder.

2021-01-21 Thread Aris Koning
Changeset: 990d6dc5c9c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=990d6dc5c9c1
Modified Files:
sql/storage/objectset.c
Branch: nospare
Log Message:

Merge 'deleted' flag into 'state' flag holder.


diffs (231 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -25,15 +25,15 @@ struct versionhead ;// TODO: rename to o
 #define name_based_rollbacked  (1<<1)
 #define under_destruction  (id_based_rollbacked | 
name_based_rollbacked)
 #define under_resurrection (1<<3)
+#define deleted(1<<4)
 
 typedef struct objectversion {
-   bool deleted;
ulng ts;
bte state;
sql_base *b; // base of underlying sql object
struct objectset* os;
struct objectversion*name_based_older;
-   struct objectversion*name_based_newer; // TODO: must become atomic 
pointer
+   struct objectversion*name_based_newer;
struct versionhead  *name_based_head;
 
struct objectversion*id_based_older;
@@ -481,7 +481,8 @@ os_cleanup(sqlstore* store, objectversio
return LOG_OK;
}
 
-   if (ov->deleted) {
+   // TODO ATOMIC GET
+   if (ov->state == deleted) {
if (ov->ts < oldest) {
// the oldest relevant state is deleted so lets try to 
mark it as destroyed
put_under_destruction(store, ov, oldest);
@@ -696,7 +697,7 @@ static objectversion*
 get_valid_object_name(sql_trans *tr, objectversion *ov)
 {
while(ov) {
-   if (ov->ts == tr->tid || (tr->parent && 
tr_version_of_parent(tr, ov->ts)) || (!ov->state && ov->ts < tr->ts))
+   if (ov->ts == tr->tid || (tr->parent && 
tr_version_of_parent(tr, ov->ts)) || ov->ts < tr->ts)
return ov;
else
ov = ov->name_based_older;
@@ -708,7 +709,7 @@ static objectversion*
 get_valid_object_id(sql_trans *tr, objectversion *ov)
 {
while(ov) {
-   if (ov->ts == tr->tid || (tr->parent && 
tr_version_of_parent(tr, ov->ts))  || (!ov->state && ov->ts < tr->ts))
+   if (ov->ts == tr->tid || (tr->parent && 
tr_version_of_parent(tr, ov->ts))  || ov->ts < tr->ts)
return ov;
else
ov = ov->id_based_older;
@@ -734,17 +735,22 @@ os_add_name_based(objectset *os, struct 
 
assert(ov != oo); // Time loops are not allowed
 
-   if (oo->deleted) {
-   // Since our parent oo is comitted deleted 
objectversion, we might have a conflict with
-   // another transaction that tries to clean up oo.
+   //TODO ATOMIC GET
+   bte state = oo->state;
+   if (state != active) {
+   // This can only happen if the parent oo was a comitted 
deleted at some point.
+   assert(state == deleted || state == under_destruction);
+   /* Since our parent oo is comitted deleted 
objectversion, we might have a conflict with
+   * another transaction that tries to clean up oo.
+   */
//TODO ATOMIC CAS
-   if (oo->state == 0) {
+   if (oo->state == deleted) {
oo->state = under_resurrection;
}
else {
return -1; /*conflict with cleaner*/
}
-   //END ATOMIC CAS
+   // END ATOMIC CAS
}
 
MT_lock_set(>ht_lock);
@@ -756,7 +762,7 @@ os_add_name_based(objectset *os, struct 
if (oo) {
oo->name_based_newer = ov;
 // TODO ATOMIC SET
-   oo->state = 0;
+   oo->state = state; // if the parent was originally 
deleted, we restore it to that state.
}
MT_lock_unset(>ht_lock);
return 0;
@@ -784,28 +790,34 @@ os_add_id_based(objectset *os, struct sq
 
assert(ov != oo); // Time loops are not allowed
 
-   if (oo->deleted) {
-   // Since our parent oo is comitted deleted 
objectversion, we might have a conflict with
-   // another transaction that tries to clean up oo.
+   //TODO ATOMIC GET
+   bte state = oo->state;
+   if (state != active) {
+   // This can only happen if the parent oo was a comitted 
deleted at some point.
+   assert(state == deleted || state == under_destruction);
+   /* Since our parent oo is comitted deleted 
objectversion, we 

MonetDB: nospare - Remove some comments.

2021-01-21 Thread Aris Koning
Changeset: feaec2ce06de for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=feaec2ce06de
Modified Files:
sql/storage/objectset.c
Branch: nospare
Log Message:

Remove some comments.


diffs (143 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -317,15 +317,13 @@ static void
 os_rollback_os_id_based_cascading(objectversion *ov, sqlstore *store) {
// TODO ATOMIC GET
bte state = ov->state;
-   // END ATOMIC GET
assert(state & id_based_rollbacked);
 
if (ov->id_based_older) {
if (ov->id_based_older->ts < TRANSACTION_ID_BASE) {
// older is last committed state. Restore versionhead  
pointer to that.
-   // TODO START ATOMIC()
+   // TODO START ATOMIC SET
ov->id_based_head->ov = ov->id_based_older;
-   // END ATOMIC()
}
else {

os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, store);
@@ -335,7 +333,6 @@ os_rollback_os_id_based_cascading(object
state |= id_based_rollbacked;
//TODO ATOMIC SET
ov->id_based_older->state = state;
-   // END ATOMIC SET
 
// id based cascaded rollback along the parents
os_rollback_os_id_based_cascading(ov->id_based_older, 
store);
@@ -351,15 +348,13 @@ static void
 os_rollback_os_name_based_cascading(objectversion *ov, sqlstore *store) {
// TODO ATOMIC GET
bte state = ov->state;
-   // END ATOMIC GET
assert(state & name_based_rollbacked);
 
if (ov->name_based_older) {
if (ov->name_based_older->ts < TRANSACTION_ID_BASE) {
// older is last committed state. Restore versionhead  
pointer to that.
-   // TODO START ATOMIC()
+   // TODO START ATOMIC SET
ov->name_based_head->ov = ov->name_based_older;
-   // END ATOMIC()
}
else {

os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store);
@@ -369,7 +364,6 @@ os_rollback_os_name_based_cascading(obje
state |= name_based_rollbacked;
//TODO ATOMIC SET
ov->name_based_older->state = state;
-   // END ATOMIC SET
 
// name based cascaded rollback along the parents

os_rollback_os_name_based_cascading(ov->name_based_older, store);
@@ -385,7 +379,6 @@ static void
 os_rollback_name_based_terminal_decendant(objectversion *ov, sqlstore *store) {
// TODO ATOMIC GET
bte state = ov->state;
-   // END ATOMIC GET
 
if (state & name_based_rollbacked) {
return;
@@ -395,7 +388,6 @@ os_rollback_name_based_terminal_decendan
 
//TODO ATOMIC SET
ov->state = state;
-   // END ATOMIC SET
 
os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store);
os_rollback_os_name_based_cascading(ov, store);
@@ -405,7 +397,6 @@ static void
 os_rollback_id_based_terminal_decendant(objectversion *ov, sqlstore *store) {
// TODO ATOMIC GET
bte state = ov->state;
-   // END ATOMIC GET
 
if (state & id_based_rollbacked) {
return;
@@ -415,7 +406,6 @@ os_rollback_id_based_terminal_decendant(
 
//TODO ATOMIC SET
ov->state = state;
-   // END ATOMIC SET
 
os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, 
store);
os_rollback_os_id_based_cascading(ov, store);
@@ -454,7 +444,6 @@ put_under_destruction(sqlstore* store, o
 
// TODO ATOMIC GET
ov->ts = store->timestamp+1;
-   // END ATOMIC GET
 
if (ov->id_based_older) {
put_under_destruction(store, ov->id_based_older, 
oldest);
@@ -486,7 +475,6 @@ os_cleanup(sqlstore* store, objectversio
 */
// TODO ATOMIC GET
ov->ts = store->timestamp+2;
-   // END ATOMIC GET
}
 
// not yet old enough to be safely removed. Try later.
@@ -506,7 +494,6 @@ os_cleanup(sqlstore* store, objectversio
 
// TODO ATOMIC GET
objectversion* newer = ov->name_based_newer;
-   // END ATOMIC GET
 
if (ov->ts < oldest && newer && (newer->ts < oldest && !newer->state)) {
assert(newer == ov->id_based_newer);
@@ -757,7 +744,7 @@ os_add_name_based(objectset *os, struct 
else {
return -1; /*conflict with cleaner*/
}
-  

MonetDB: nospare - merged with default

2021-01-21 Thread Niels Nes
Changeset: 6e3074fdb92a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6e3074fdb92a
Branch: nospare
Log Message:

merged with default


diffs (11 lines):

diff --git a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh 
b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh
--- a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh
+++ b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh
@@ -5,6 +5,6 @@ user=monetdb
 password=monetdb
 EOF
 
-java nl.cwi.monetdb.client.JdbcClient -h $HOST -p $MAPIPORT -d ${TSTDB} -e -f 
\"$TSTSRCBASE/$TSTDIR/Tests/bogus-auto-generated-keys.sql\"
+java nl.cwi.monetdb.client.JdbcClient -h $HOST -p $MAPIPORT -d ${TSTDB} -e -f 
$TSTSRCBASE/$TSTDIR/Tests/bogus-auto-generated-keys.sql
 
 rm -f .monetdb
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - check for key dependencies again

2021-01-21 Thread Niels Nes
Changeset: cb5eda62 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cb5eda62
Modified Files:
sql/backends/monet5/sql_cat.c
Branch: nospare
Log Message:

check for key dependencies again


diffs (45 lines):

diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -548,29 +548,28 @@ drop_table(mvc *sql, char *sname, char *
throw(SQL,"sql.drop_table", SQLSTATE(42000) "DROP TABLE: cannot 
drop system table '%s'", tname);
if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && t->persistence == 
SQL_LOCAL_TEMP))
throw(SQL,"sql.drop_table", SQLSTATE(42000) "DROP TABLE: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
s->base.name);
-   /* to be checked via dependencies */
-#if 0
+
if (!drop_action && t->keys.set) {
for (node *n = t->keys.set->h; n; n = n->next) {
sql_key *k = n->data;
 
if (k->type == ukey || k->type == pkey) {
-   sql_ukey *uk = (sql_ukey *) k;
-
-   if (uk->keys && list_length(uk->keys)) {
-   node *l = uk->keys->h;
+   struct os_iter oi;
+   os_iterator(, k->t->s->keys, 
sql->session->tr, NULL);
+   for (sql_base *b = oi_next(); b; 
b=oi_next()) {
+   sql_key *fk = (sql_key*)b;
+   sql_fkey *rk = (sql_fkey*)b;
 
-   for (; l; l = l->next) {
-   k = l->data;
-   /* make sure it is not a self 
referencing key */
-   if (k->t != t)
-   
throw(SQL,"sql.drop_table", SQLSTATE(4) "DROP TABLE: FOREIGN KEY %s.%s 
depends on %s", k->t->base.name, k->base.name, tname);
-   }
+   if (fk->type != fkey || rk->rkey != 
k->base.id)
+   continue;
+
+   /* make sure it is not a self 
referencing key */
+   if (fk->t != t)
+   throw(SQL,"sql.drop_table", 
SQLSTATE(4) "DROP TABLE: FOREIGN KEY %s.%s depends on %s", k->t->base.name, 
k->base.name, tname);
}
}
}
}
-#endif
 
if (!drop_action && mvc_check_dependency(sql, t->base.id, 
TABLE_DEPENDENCY, NULL))
throw (SQL,"sql.drop_table",SQLSTATE(42000) "DROP TABLE: unable 
to drop table %s (there are database objects which depend on it)\n", 
t->base.name);
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: default - Remove quotes.

2021-01-21 Thread Sjoerd Mullender
Changeset: e2218d24ec5a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e2218d24ec5a
Modified Files:
sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh
Branch: default
Log Message:

Remove quotes.


diffs (11 lines):

diff --git a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh 
b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh
--- a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh
+++ b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh
@@ -5,6 +5,6 @@ user=monetdb
 password=monetdb
 EOF
 
-java nl.cwi.monetdb.client.JdbcClient -h $HOST -p $MAPIPORT -d ${TSTDB} -e -f 
\"$TSTSRCBASE/$TSTDIR/Tests/bogus-auto-generated-keys.sql\"
+java nl.cwi.monetdb.client.JdbcClient -h $HOST -p $MAPIPORT -d ${TSTDB} -e -f 
$TSTSRCBASE/$TSTDIR/Tests/bogus-auto-generated-keys.sql
 
 rm -f .monetdb
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - merged

2021-01-21 Thread Niels Nes
Changeset: f585fa27f65e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f585fa27f65e
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/server/rel_dump.c
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
Branch: nospare
Log Message:

merged


diffs (truncated from 776 to 300 lines):

diff --git a/monetdb5/modules/atoms/xml.c b/monetdb5/modules/atoms/xml.c
--- a/monetdb5/modules/atoms/xml.c
+++ b/monetdb5/modules/atoms/xml.c
@@ -376,7 +376,7 @@ XMLparse(xml *x, str *doccont, str *val,
 }
 
 str
-XMLpi(str *ret, str *target, str *value)
+XMLpi(xml *ret, str *target, str *value)
 {
size_t len;
str buf;
diff --git a/monetdb5/modules/mal/mdb.c b/monetdb5/modules/mal/mdb.c
--- a/monetdb5/modules/mal/mdb.c
+++ b/monetdb5/modules/mal/mdb.c
@@ -735,7 +735,7 @@ static str MDBdump(Client cntxt, MalBlkP
 }
 
 static str
-MDBdummy(int *ret)
+MDBdummy(void *ret)
 {
(void) ret;
throw(MAL, "mdb.dummy", OPERATION_FAILED);
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
@@ -2563,10 +2563,8 @@ rel2bin_semijoin(backend *be, sql_rel *r
int idx = 0, equality_only = 1;
 
jexps = get_equi_joins_first(sql, jexps, 
_only);
-   if (!equality_only || list_length(jexps) > 1) {
+   if (!equality_only || list_length(jexps) > 1 || 
exp_has_func((sql_exp*)jexps->h->data))
left = subrel_project(be, left, refs, rel->l);
-   equality_only = 0;
-   }
right = subrel_project(be, right, refs, rel->r);
 
for( en = jexps->h; en; en = en->next ) {
@@ -2575,8 +2573,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
stmt *s = NULL;
 
/* only handle simple joins here */
-   if ((exp_has_func(e) && e->flag != cmp_filter) 
||
-   e->flag == cmp_or || (e->f && e->anti)) 
{
+   if ((exp_has_func(e) && e->flag != cmp_filter) 
|| e->flag == cmp_or || (e->f && e->anti)) {
if (!join && !list_length(lje)) {
stmt *l = bin_first_column(be, 
left);
stmt *r = bin_first_column(be, 
right);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1358,16 +1358,16 @@ can_push_func(sql_exp *e, sql_rel *rel, 
 {
switch(e->type) {
case e_cmp: {
+   int mustl = 0, mustr = 0, mustf = 0;
sql_exp *l = e->l, *r = e->r, *f = e->f;
-   int res = 1, lmust = 0;
-
-   if (e->flag == cmp_or || e->flag == cmp_in || e->flag == 
cmp_notin || e->flag == cmp_filter)
+
+   if (is_project(rel->op) || e->flag == cmp_or || e->flag == 
cmp_in || e->flag == cmp_notin || e->flag == cmp_filter)
return 0;
-   res = can_push_func(l, rel, ) && can_push_func(r, rel, 
) && (!f || can_push_func(f, rel, ));
-   if (res && !lmust)
-   return 1;
-   (*must) |= lmust;
-   return res;
+   return ((l->type == e_column || can_push_func(l, rel, )) 
&& (*must = mustl)) ||
+   (!f && (r->type == e_column || can_push_func(r, 
rel, )) && (*must = mustr)) ||
+   (f &&
+   (r->type == e_column || can_push_func(r, rel, 
)) &&
+   (f->type == e_column || can_push_func(f, rel, )) 
&& (*must = (mustr || mustf)));
}
case e_convert:
return can_push_func(e->l, rel, must);
@@ -1386,8 +1386,7 @@ can_push_func(sql_exp *e, sql_rel *rel, 
return res;
}
case e_column:
-/* aliases cannot be bound on the same level, ie same 
projection */
-   if ((exp_name(e) && !has_label(e)) || (rel && 
!rel_find_exp(rel, e)))
+   if (rel && !rel_find_exp(rel, e))
return 0;
(*must) = 1;
/* fall through */
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5719,22 +5719,22 @@ rel_joinquery_(sql_query *query, sql_rel
}
 
lateral = check_is_lateral(tab2);
-   t1 = table_ref(query, NULL, tab1, 0, NULL);
+   t1 = table_ref(query, NULL, tab1, 0, refs);
if (rel && !t1 && sql->session->status != -ERR_AMBIGUOUS) {

MonetDB: nospare - merged

2021-01-21 Thread Niels Nes
Changeset: 066e5323f660 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=066e5323f660
Branch: nospare
Log Message:

merged


diffs (233 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -20,16 +20,16 @@
 
 struct versionhead ;// TODO: rename to object_version_chain
 
+#define active (0)
 #define id_based_rollbacked(1)
 #define name_based_rollbacked  (1<<1)
-#define under_destruction  (1<<2)
-#define under_construction (1<<3)
+#define under_destruction  (id_based_rollbacked | 
name_based_rollbacked)
+#define under_resurrection (1<<3)
 
 typedef struct objectversion {
bool deleted;
ulng ts;
-   bte rollbacked;
-   bte life_cycle;
+   bte state;
sql_base *b; // base of underlying sql object
struct objectset* os;
struct objectversion*name_based_older;
@@ -315,7 +315,10 @@ static void os_rollback_name_based_termi
 
 static void
 os_rollback_os_id_based_cascading(objectversion *ov, sqlstore *store) {
-   assert(ov->rollbacked & id_based_rollbacked);
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+   assert(state & id_based_rollbacked);
 
if (ov->id_based_older) {
if (ov->id_based_older->ts < TRANSACTION_ID_BASE) {
@@ -326,9 +329,15 @@ os_rollback_os_id_based_cascading(object
}
else {

os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, store);
+   // TODO ATOMIC GET
+   state = ov->id_based_older->state;
+
+   state |= id_based_rollbacked;
+   //TODO ATOMIC SET
+   ov->id_based_older->state = state;
+   // END ATOMIC SET
 
// id based cascaded rollback along the parents
-   ov->id_based_older->rollbacked |= id_based_rollbacked;
os_rollback_os_id_based_cascading(ov->id_based_older, 
store);
}
}
@@ -340,7 +349,10 @@ os_rollback_os_id_based_cascading(object
 
 static void
 os_rollback_os_name_based_cascading(objectversion *ov, sqlstore *store) {
-   assert(ov->rollbacked & name_based_rollbacked);
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+   assert(state & name_based_rollbacked);
 
if (ov->name_based_older) {
if (ov->name_based_older->ts < TRANSACTION_ID_BASE) {
@@ -351,9 +363,15 @@ os_rollback_os_name_based_cascading(obje
}
else {

os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store);
+   // TODO ATOMIC GET
+   state = ov->name_based_older->state;
+
+   state |= name_based_rollbacked;
+   //TODO ATOMIC SET
+   ov->name_based_older->state = state;
+   // END ATOMIC SET
 
// name based cascaded rollback along the parents
-   ov->name_based_older->rollbacked |= 
name_based_rollbacked;

os_rollback_os_name_based_cascading(ov->name_based_older, store);
}
}
@@ -365,24 +383,39 @@ os_rollback_os_name_based_cascading(obje
 
 static void
 os_rollback_name_based_terminal_decendant(objectversion *ov, sqlstore *store) {
-   if (ov->rollbacked & name_based_rollbacked) {
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+
+   if (state & name_based_rollbacked) {
return;
}
 
-   ov->rollbacked |= name_based_rollbacked;
+   state |= name_based_rollbacked;
+
+   //TODO ATOMIC SET
+   ov->state = state;
+   // END ATOMIC SET
 
os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store);
os_rollback_os_name_based_cascading(ov, store);
-
 }
 
 static void
 os_rollback_id_based_terminal_decendant(objectversion *ov, sqlstore *store) {
-   if (ov->rollbacked & id_based_rollbacked) {
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+
+   if (state & id_based_rollbacked) {
return;
}
 
-   ov->rollbacked |= id_based_rollbacked;
+   state |= id_based_rollbacked;
+
+   //TODO ATOMIC SET
+   ov->state = state;
+   // END ATOMIC SET
 
os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, 
store);
os_rollback_os_id_based_cascading(ov, store);
@@ -402,8 +435,8 @@ static void
 put_under_destruction(sqlstore* store, objectversion *ov, ulng oldest)
 {
//TODO ATOMIC CAS
-   if (ov->life_cycle == 0) {
-   ov->life_cycle = under_destruction;
+   if 

MonetDB: nospare - make sure we don't log indices without storage

2021-01-21 Thread Niels Nes
Changeset: 3ccb783f1632 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3ccb783f1632
Modified Files:
sql/storage/bat/bat_storage.c
Branch: nospare
Log Message:

make sure we don't log indices without storage


diffs (13 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1863,7 +1863,8 @@ log_create_del(sql_trans *tr, sql_change
for(node *n = t->idxs.set->h; n && ok == LOG_OK; n = 
n->next) {
sql_idx *i = n->data;
 
-   ok = log_create_idx_(tr, i);
+   if (i->data)
+   ok = log_create_idx_(tr, i);
}
}
}
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - make sure we handle more modules when rewriti...

2021-01-21 Thread Niels Nes
Changeset: f23931a92851 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f23931a92851
Modified Files:
monetdb5/optimizer/opt_inline.c
monetdb5/optimizer/opt_remap.c
Branch: nospare
Log Message:

make sure we handle more modules when rewriting multiplex functions


diffs (52 lines):

diff --git a/monetdb5/optimizer/opt_inline.c b/monetdb5/optimizer/opt_inline.c
--- a/monetdb5/optimizer/opt_inline.c
+++ b/monetdb5/optimizer/opt_inline.c
@@ -29,9 +29,10 @@ static bool OPTinlineMultiplex(Client cn
Symbol s;
str mod,fcn;
 
-   mod = VALget((mb, getArg(p, 1))->value);
-   fcn = VALget((mb, getArg(p, 2))->value);
-   if( (s= findSymbol(cntxt->usermodule, mod,fcn)) ==0 )
+   mod = VALget((mb, getArg(p, p->retc+0))->value);
+   fcn = VALget((mb, getArg(p, p->retc+1))->value);
+   //if( (s= findSymbol(cntxt->usermodule, mod,fcn)) ==0 )
+   if( (s= findSymbolInModule(getModule(putName(mod)), putName(fcn))) ==0 )
return false;
if (s->def == mb)   /* avoid infinite recursion */
return false;
diff --git a/monetdb5/optimizer/opt_remap.c b/monetdb5/optimizer/opt_remap.c
--- a/monetdb5/optimizer/opt_remap.c
+++ b/monetdb5/optimizer/opt_remap.c
@@ -115,13 +115,13 @@ OPTmultiplexInline(Client cntxt, MalBlkP
int i,j,k,m, actions=0;
int refbat=0, retc = p->retc;
bit *upgrade;
-   Symbol s;
str msg;
 
 
-   s= findSymbol(cntxt->usermodule,
-   VALget((mb, getArg(p, retc+0))->value),
-   VALget((mb, getArg(p, retc+1))->value));
+   str mod = VALget((mb, getArg(p, retc+0))->value);
+   str fcn = VALget((mb, getArg(p, retc+1))->value);
+   //Symbol s = findSymbol(cntxt->usermodule, mod,fcn);
+   Symbol s = findSymbolInModule(getModule(putName(mod)), putName(fcn));
 
if( s== NULL || !isSideEffectFree(s->def) ||
getInstrPtr(s->def,0)->retc != p->retc ) {
@@ -396,9 +396,10 @@ OPTremapImplementation(Client cntxt, Mal
 * such as the calculator functions. It is particularly
 * geared at handling the PSM code.
 */
-   str mod = VALget((mb, getArg(p, 1))->value);
-   str fcn = VALget((mb, getArg(p, 2))->value);
-   Symbol s = findSymbol(cntxt->usermodule, mod,fcn);
+   str mod = VALget((mb, getArg(p, 
p->retc+0))->value);
+   str fcn = VALget((mb, getArg(p, 
p->retc+1))->value);
+   //Symbol s = findSymbol(cntxt->usermodule, mod,fcn);
+   Symbol s = 
findSymbolInModule(getModule(putName(mod)),putName(fcn));
 
if (s && s->def->inlineProp ){
pushInstruction(mb, p);
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: default - Merged with Oct2020 and converted tests

2021-01-21 Thread Pedro Ferreira
Changeset: 43ad3ab454ad for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=43ad3ab454ad
Added Files:
sql/test/bugs/Tests/rtrim_bug.test
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_optimizer.c
sql/test/miscellaneous/Tests/simple_plans.stable.out
sql/test/miscellaneous/Tests/simple_selects.test
Branch: default
Log Message:

Merged with Oct2020 and converted tests


diffs (294 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
@@ -2519,8 +2519,6 @@ rel2bin_antijoin(backend *be, sql_rel *r
return stmt_list(be, l);
 }
 
-#define complex_join_expression(e) (exp_has_func(e) && (e)->flag != 
cmp_filter) || (e)->flag == cmp_or || ((e)->f && (e)->anti)
-
 static stmt *
 rel2bin_semijoin(backend *be, sql_rel *rel, list *refs)
 {
@@ -2565,7 +2563,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
int idx = 0, equality_only = 1;
 
jexps = get_equi_joins_first(sql, jexps, 
_only);
-   if (!equality_only || list_length(jexps) > 1 || 
complex_join_expression((sql_exp*)jexps->h->data))
+   if (!equality_only || list_length(jexps) > 1 || 
exp_has_func((sql_exp*)jexps->h->data))
left = subrel_project(be, left, refs, rel->l);
right = subrel_project(be, right, refs, rel->r);
 
@@ -2575,7 +2573,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
stmt *s = NULL;
 
/* only handle simple joins here */
-   if (complex_join_expression(e)) {
+   if ((exp_has_func(e) && e->flag != cmp_filter) 
|| e->flag == cmp_or || (e->f && e->anti)) {
if (!join && !list_length(lje)) {
stmt *l = bin_first_column(be, 
left);
stmt *r = bin_first_column(be, 
right);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1350,16 +1350,16 @@ can_push_func(sql_exp *e, sql_rel *rel, 
 {
switch(e->type) {
case e_cmp: {
+   int mustl = 0, mustr = 0, mustf = 0;
sql_exp *l = e->l, *r = e->r, *f = e->f;
-   int res = 1, lmust = 0;
-
-   if (e->flag == cmp_or || e->flag == cmp_in || e->flag == 
cmp_notin || e->flag == cmp_filter)
+
+   if (is_project(rel->op) || e->flag == cmp_or || e->flag == 
cmp_in || e->flag == cmp_notin || e->flag == cmp_filter)
return 0;
-   res = can_push_func(l, rel, ) && can_push_func(r, rel, 
) && (!f || can_push_func(f, rel, ));
-   if (res && !lmust)
-   return 1;
-   (*must) |= lmust;
-   return res;
+   return ((l->type == e_column || can_push_func(l, rel, )) 
&& (*must = mustl)) ||
+   (!f && (r->type == e_column || can_push_func(r, 
rel, )) && (*must = mustr)) ||
+   (f &&
+   (r->type == e_column || can_push_func(r, rel, 
)) &&
+   (f->type == e_column || can_push_func(f, rel, )) 
&& (*must = (mustr || mustf)));
}
case e_convert:
return can_push_func(e->l, rel, must);
@@ -1378,8 +1378,7 @@ can_push_func(sql_exp *e, sql_rel *rel, 
return res;
}
case e_column:
-/* aliases cannot be bound on the same level, ie same 
projection */
-   if ((exp_name(e) && !has_label(e)) || (rel && 
!rel_find_exp(rel, e)))
+   if (rel && !rel_find_exp(rel, e))
return 0;
(*must) = 1;
/* fall through */
diff --git a/sql/test/bugs/Tests/rtrim_bug.sql 
b/sql/test/bugs/Tests/rtrim_bug.sql
--- a/sql/test/bugs/Tests/rtrim_bug.sql
+++ b/sql/test/bugs/Tests/rtrim_bug.sql
@@ -12,6 +12,24 @@ SELECT length("m") as data_length, "m" a
 
 CREATE VIEW v2 as select "m" from t1 where rtrim(m) in (select rtrim(m) from 
sys.t1);
 SELECT * FROM v2;
+
+PLAN SELECT length("m") as data_length, "m" as data_value FROM "sys"."v2" 
WHERE "m" IS NOT NULL AND length("m") > 1;
+
+set optimizer = 'sequential_pipe';
+create procedure profiler.starttrace() external name profiler."starttrace";
+create procedure profiler.stoptrace() external name profiler.stoptrace;
+
+call profiler."starttrace"();
+SELECT length("m") as data_length, "m" as data_value FROM "sys"."v2" WHERE "m" 
IS NOT NULL AND length("m") > 1;
+call profiler.stoptrace();
+
+select count(*) from sys.tracelog() where stmt like '% algebra.crossproduct%'; 
-- don't do crossjoin
+select count(*) from sys.tracelog() where stmt like '% 

MonetDB: Oct2020 - Undo my previous sqlancer fixes. Fixed regres...

2021-01-21 Thread Pedro Ferreira
Changeset: 08124a306ac1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=08124a306ac1
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_optimizer.c
sql/test/bugs/Tests/rtrim_bug.sql
sql/test/bugs/Tests/rtrim_bug.stable.out
sql/test/miscellaneous/Tests/simple_plans.stable.out
Branch: Oct2020
Log Message:

Undo my previous sqlancer fixes. Fixed regression for semijoin by disabling 
can_push_func on projections for now


diffs (187 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
@@ -2516,8 +2516,6 @@ rel2bin_antijoin(backend *be, sql_rel *r
return stmt_list(be, l);
 }
 
-#define complex_join_expression(e) (exp_has_func(e) && (e)->flag != 
cmp_filter) || (e)->flag == cmp_or || ((e)->f && (e)->anti)
-
 static stmt *
 rel2bin_semijoin(backend *be, sql_rel *rel, list *refs)
 {
@@ -2562,7 +2560,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
int idx = 0, equality_only = 1;
 
jexps = get_equi_joins_first(sql, jexps, 
_only);
-   if (!equality_only || list_length(jexps) > 1 || 
complex_join_expression((sql_exp*)jexps->h->data))
+   if (!equality_only || list_length(jexps) > 1 || 
exp_has_func((sql_exp*)jexps->h->data))
left = subrel_project(be, left, refs, rel->l);
right = subrel_project(be, right, refs, rel->r);
 
@@ -2572,7 +2570,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
stmt *s = NULL;
 
/* only handle simple joins here */
-   if (complex_join_expression(e)) {
+   if ((exp_has_func(e) && e->flag != cmp_filter) 
|| e->flag == cmp_or || (e->f && e->anti)) {
if (!join && !list_length(lje)) {
stmt *l = bin_first_column(be, 
left);
stmt *r = bin_first_column(be, 
right);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1350,16 +1350,16 @@ can_push_func(sql_exp *e, sql_rel *rel, 
 {
switch(e->type) {
case e_cmp: {
+   int mustl = 0, mustr = 0, mustf = 0;
sql_exp *l = e->l, *r = e->r, *f = e->f;
-   int res = 1, lmust = 0;
-
-   if (e->flag == cmp_or || e->flag == cmp_in || e->flag == 
cmp_notin || e->flag == cmp_filter)
+
+   if (is_project(rel->op) || e->flag == cmp_or || e->flag == 
cmp_in || e->flag == cmp_notin || e->flag == cmp_filter)
return 0;
-   res = can_push_func(l, rel, ) && can_push_func(r, rel, 
) && (!f || can_push_func(f, rel, ));
-   if (res && !lmust)
-   return 1;
-   (*must) |= lmust;
-   return res;
+   return ((l->type == e_column || can_push_func(l, rel, )) 
&& (*must = mustl)) ||
+   (!f && (r->type == e_column || can_push_func(r, 
rel, )) && (*must = mustr)) ||
+   (f &&
+   (r->type == e_column || can_push_func(r, rel, 
)) &&
+   (f->type == e_column || can_push_func(f, rel, )) 
&& (*must = (mustr || mustf)));
}
case e_convert:
return can_push_func(e->l, rel, must);
@@ -1378,8 +1378,7 @@ can_push_func(sql_exp *e, sql_rel *rel, 
return res;
}
case e_column:
-/* aliases cannot be bound on the same level, ie same 
projection */
-   if ((exp_name(e) && !has_label(e)) || (rel && 
!rel_find_exp(rel, e)))
+   if (rel && !rel_find_exp(rel, e))
return 0;
(*must) = 1;
/* fall through */
diff --git a/sql/test/bugs/Tests/rtrim_bug.sql 
b/sql/test/bugs/Tests/rtrim_bug.sql
--- a/sql/test/bugs/Tests/rtrim_bug.sql
+++ b/sql/test/bugs/Tests/rtrim_bug.sql
@@ -12,6 +12,24 @@ SELECT length("m") as data_length, "m" a
 
 CREATE VIEW v2 as select "m" from t1 where rtrim(m) in (select rtrim(m) from 
sys.t1);
 SELECT * FROM v2;
+
+PLAN SELECT length("m") as data_length, "m" as data_value FROM "sys"."v2" 
WHERE "m" IS NOT NULL AND length("m") > 1;
+
+set optimizer = 'sequential_pipe';
+create procedure profiler.starttrace() external name profiler."starttrace";
+create procedure profiler.stoptrace() external name profiler.stoptrace;
+
+call profiler."starttrace"();
+SELECT length("m") as data_length, "m" as data_value FROM "sys"."v2" WHERE "m" 
IS NOT NULL AND length("m") > 1;
+call profiler.stoptrace();
+
+select count(*) from sys.tracelog() where stmt like '% algebra.crossproduct%'; 
-- don't do crossjoin
+select 

MonetDB: nospare - Merge rollbacked and life_cycle into single '...

2021-01-21 Thread Aris Koning
Changeset: 3413fd39af2b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3413fd39af2b
Modified Files:
sql/storage/objectset.c
Branch: nospare
Log Message:

Merge rollbacked and life_cycle into single 'state' flag holder.


diffs (233 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -20,16 +20,16 @@
 
 struct versionhead ;// TODO: rename to object_version_chain
 
+#define active (0)
 #define id_based_rollbacked(1)
 #define name_based_rollbacked  (1<<1)
-#define under_destruction  (1<<2)
-#define under_construction (1<<3)
+#define under_destruction  (id_based_rollbacked | 
name_based_rollbacked)
+#define under_resurrection (1<<3)
 
 typedef struct objectversion {
bool deleted;
ulng ts;
-   bte rollbacked;
-   bte life_cycle;
+   bte state;
sql_base *b; // base of underlying sql object
struct objectset* os;
struct objectversion*name_based_older;
@@ -315,7 +315,10 @@ static void os_rollback_name_based_termi
 
 static void
 os_rollback_os_id_based_cascading(objectversion *ov, sqlstore *store) {
-   assert(ov->rollbacked & id_based_rollbacked);
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+   assert(state & id_based_rollbacked);
 
if (ov->id_based_older) {
if (ov->id_based_older->ts < TRANSACTION_ID_BASE) {
@@ -326,9 +329,15 @@ os_rollback_os_id_based_cascading(object
}
else {

os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, store);
+   // TODO ATOMIC GET
+   state = ov->id_based_older->state;
+
+   state |= id_based_rollbacked;
+   //TODO ATOMIC SET
+   ov->id_based_older->state = state;
+   // END ATOMIC SET
 
// id based cascaded rollback along the parents
-   ov->id_based_older->rollbacked |= id_based_rollbacked;
os_rollback_os_id_based_cascading(ov->id_based_older, 
store);
}
}
@@ -340,7 +349,10 @@ os_rollback_os_id_based_cascading(object
 
 static void
 os_rollback_os_name_based_cascading(objectversion *ov, sqlstore *store) {
-   assert(ov->rollbacked & name_based_rollbacked);
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+   assert(state & name_based_rollbacked);
 
if (ov->name_based_older) {
if (ov->name_based_older->ts < TRANSACTION_ID_BASE) {
@@ -351,9 +363,15 @@ os_rollback_os_name_based_cascading(obje
}
else {

os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store);
+   // TODO ATOMIC GET
+   state = ov->name_based_older->state;
+
+   state |= name_based_rollbacked;
+   //TODO ATOMIC SET
+   ov->name_based_older->state = state;
+   // END ATOMIC SET
 
// name based cascaded rollback along the parents
-   ov->name_based_older->rollbacked |= 
name_based_rollbacked;

os_rollback_os_name_based_cascading(ov->name_based_older, store);
}
}
@@ -365,24 +383,39 @@ os_rollback_os_name_based_cascading(obje
 
 static void
 os_rollback_name_based_terminal_decendant(objectversion *ov, sqlstore *store) {
-   if (ov->rollbacked & name_based_rollbacked) {
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+
+   if (state & name_based_rollbacked) {
return;
}
 
-   ov->rollbacked |= name_based_rollbacked;
+   state |= name_based_rollbacked;
+
+   //TODO ATOMIC SET
+   ov->state = state;
+   // END ATOMIC SET
 
os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store);
os_rollback_os_name_based_cascading(ov, store);
-
 }
 
 static void
 os_rollback_id_based_terminal_decendant(objectversion *ov, sqlstore *store) {
-   if (ov->rollbacked & id_based_rollbacked) {
+   // TODO ATOMIC GET
+   bte state = ov->state;
+   // END ATOMIC GET
+
+   if (state & id_based_rollbacked) {
return;
}
 
-   ov->rollbacked |= id_based_rollbacked;
+   state |= id_based_rollbacked;
+
+   //TODO ATOMIC SET
+   ov->state = state;
+   // END ATOMIC SET
 
os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, 
store);
os_rollback_os_id_based_cascading(ov, store);
@@ -402,8 +435,8 @@ static void
 put_under_destruction(sqlstore* store, objectversion *ov, ulng oldest)
 {
//TODO ATOMIC 

MonetDB: default - Merge with Oct2020 branch.

2021-01-21 Thread Sjoerd Mullender
Changeset: bbf76460ea5d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bbf76460ea5d
Modified Files:
clients/Tests/MAL-signatures.stable.out.int128
sql/backends/monet5/rel_bin.c
testing/listexports.py.in
Branch: default
Log Message:

Merge with Oct2020 branch.


diffs (156 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
@@ -2519,6 +2519,8 @@ rel2bin_antijoin(backend *be, sql_rel *r
return stmt_list(be, l);
 }
 
+#define complex_join_expression(e) (exp_has_func(e) && (e)->flag != 
cmp_filter) || (e)->flag == cmp_or || ((e)->f && (e)->anti)
+
 static stmt *
 rel2bin_semijoin(backend *be, sql_rel *rel, list *refs)
 {
@@ -2563,10 +2565,8 @@ rel2bin_semijoin(backend *be, sql_rel *r
int idx = 0, equality_only = 1;
 
jexps = get_equi_joins_first(sql, jexps, 
_only);
-   if (!equality_only || list_length(jexps) > 1) {
+   if (!equality_only || list_length(jexps) > 1 || 
complex_join_expression((sql_exp*)jexps->h->data))
left = subrel_project(be, left, refs, rel->l);
-   equality_only = 0;
-   }
right = subrel_project(be, right, refs, rel->r);
 
for( en = jexps->h; en; en = en->next ) {
@@ -2575,8 +2575,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
stmt *s = NULL;
 
/* only handle simple joins here */
-   if ((exp_has_func(e) && e->flag != cmp_filter) 
||
-   e->flag == cmp_or || (e->f && e->anti)) 
{
+   if (complex_join_expression(e)) {
if (!join && !list_length(lje)) {
stmt *l = bin_first_column(be, 
left);
stmt *r = bin_first_column(be, 
right);
diff --git a/sql/test/bugs/Tests/rtrim_bug.stable.out 
b/sql/test/bugs/Tests/rtrim_bug.stable.out
--- a/sql/test/bugs/Tests/rtrim_bug.stable.out
+++ b/sql/test/bugs/Tests/rtrim_bug.stable.out
@@ -47,7 +47,7 @@ stdout of test 'rtrim_bug` in directory 
 % sys.,sys. # table_name
 % data_length, data_value # name
 % int, varchar # type
-% 1,   1 # length
+% 1,   0 # length
 #DROP VIEW v1;
 #DROP VIEW v2;
 #DROP TABLE t1;
diff --git a/testing/exportutils.py b/testing/exportutils.py
--- a/testing/exportutils.py
+++ b/testing/exportutils.py
@@ -17,7 +17,7 @@ inclre = re.compile(r'\s*#\s*include\s+"
 # comments (/* ... */ where ... is as short as possible)
 cmtre = re.compile(r'/\*[^*]*(\*(?=[^/])[^*]*)*\*/|//.*')
 # horizontal white space
-spcre = re.compile(r'[ \t]+')
+horspcre = re.compile(r'[ \t]+')
 # identifier
 identre = re.compile(r'\b(?P[a-zA-Z_]\w*)\b')
 # undef
@@ -79,12 +79,12 @@ def process(line, funmac, macros, infunm
 nline += line[pos:]
 return nline
 
-def readfile(f, funmac=None, macros=None, files=None, printdef=False):
+def readfile(f, funmac=None, macros=None, files=None, printdef=False, 
include=False):
 data = open(f).read()
 dirname, f = os.path.split(f)
 data = cmtre.sub(' ', data)
 data = data.replace('\\\n', '')
-data = spcre.sub(' ', data)
+data = horspcre.sub(' ', data)
 data = data.splitlines()
 if funmac is None:
 funmac = {}
@@ -110,7 +110,7 @@ def readfile(f, funmac=None, macros=None
 if elifre.match(line) or elsere.match(line):
 if printdef:
 ndata.append(line)
-if skip:
+if include and skip:
 skip[-1] = True
 continue
 if skip and skip[-1]:
@@ -130,13 +130,14 @@ def readfile(f, funmac=None, macros=None
 args = ()   # empty argument list
 funmac[name] = (args, repl)
 continue
-macros[name] = repl
+if include:
+macros[name] = repl
 continue
 res = inclre.match(line)
 if res is not None:
 fn = res.group('file')
-if '/' not in fn and os.path.exists(os.path.join(dirname, fn)) and 
fn not in files:
-incdata = readfile(os.path.join(dirname, fn), funmac, macros, 
files, printdef)
+if include and '/' not in fn and 
os.path.exists(os.path.join(dirname, fn)) and fn not in files:
+incdata = readfile(os.path.join(dirname, fn), funmac, macros, 
files, printdef, include)
 ndata.extend(incdata)
 continue
 ndata.append(line)
@@ -154,8 +155,13 @@ def readfile(f, funmac=None, macros=None
 files.remove(f)
 return ndata
 
-def preprocess(f, printdef=False):
-return '\n'.join(readfile(f, printdef=printdef))
+def 

MonetDB: nospare - approved output

2021-01-21 Thread Niels Nes
Changeset: 07ede2490e4e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=07ede2490e4e
Modified Files:
sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
Branch: nospare
Log Message:

approved output


diffs (19 lines):

diff --git a/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test 
b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
--- a/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
+++ b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
@@ -26,12 +26,12 @@ user.main
 1
 querylog.define
 1
-bat.pack
-5
-user.my_generate_series
+sql.my_generate_series
 2
 aggr.count
 2
+bat.pack
+5
 bat.single
 2
 algebra.crossproduct
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - approved output

2021-01-21 Thread Niels Nes
Changeset: 8aa5a6885aa6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8aa5a6885aa6
Modified Files:
sql/test/BugTracker-2017/Tests/parsererror.Bug-6381.test
Branch: nospare
Log Message:

approved output


diffs (21 lines):

diff --git a/sql/test/BugTracker-2017/Tests/parsererror.Bug-6381.test 
b/sql/test/BugTracker-2017/Tests/parsererror.Bug-6381.test
--- a/sql/test/BugTracker-2017/Tests/parsererror.Bug-6381.test
+++ b/sql/test/BugTracker-2017/Tests/parsererror.Bug-6381.test
@@ -15,7 +15,7 @@ select name, func, "mod", language, "typ
 
 mycounter1
 create function mycounter1()@returns integer@begin@ declare s int;@ while 
(true)@ do@ set s =1;@ end while;@ return s;@end@;
-user
+sql
 2
 1
 False
@@ -37,7 +37,7 @@ select name, func, "mod", language, "typ
 
 mycounter2
 create function mycounter2()@returns integer@begin@ declare s int;@ while 
(select true)@ do@ set s =1;@ end while;@ return s;@end@;
-user
+sql
 2
 1
 False
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Oct2020 - Fixes so that new code can be run for old (ex...

2021-01-21 Thread Sjoerd Mullender
Changeset: 4970ce7b1c1d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4970ce7b1c1d
Modified Files:
testing/exportutils.py
testing/listexports.py.in
testing/melcheck.py
Branch: Oct2020
Log Message:

Fixes so that new code can be run for old (exports) test.


diffs (110 lines):

diff --git a/testing/exportutils.py b/testing/exportutils.py
--- a/testing/exportutils.py
+++ b/testing/exportutils.py
@@ -17,7 +17,7 @@ inclre = re.compile(r'\s*#\s*include\s+"
 # comments (/* ... */ where ... is as short as possible)
 cmtre = re.compile(r'/\*[^*]*(\*(?=[^/])[^*]*)*\*/|//.*')
 # horizontal white space
-spcre = re.compile(r'[ \t]+')
+horspcre = re.compile(r'[ \t]+')
 # identifier
 identre = re.compile(r'\b(?P[a-zA-Z_]\w*)\b')
 # undef
@@ -79,12 +79,12 @@ def process(line, funmac, macros, infunm
 nline += line[pos:]
 return nline
 
-def readfile(f, funmac=None, macros=None, files=None, printdef=False):
+def readfile(f, funmac=None, macros=None, files=None, printdef=False, 
include=False):
 data = open(f).read()
 dirname, f = os.path.split(f)
 data = cmtre.sub(' ', data)
 data = data.replace('\\\n', '')
-data = spcre.sub(' ', data)
+data = horspcre.sub(' ', data)
 data = data.splitlines()
 if funmac is None:
 funmac = {}
@@ -110,7 +110,7 @@ def readfile(f, funmac=None, macros=None
 if elifre.match(line) or elsere.match(line):
 if printdef:
 ndata.append(line)
-if skip:
+if include and skip:
 skip[-1] = True
 continue
 if skip and skip[-1]:
@@ -130,13 +130,14 @@ def readfile(f, funmac=None, macros=None
 args = ()   # empty argument list
 funmac[name] = (args, repl)
 continue
-macros[name] = repl
+if include:
+macros[name] = repl
 continue
 res = inclre.match(line)
 if res is not None:
 fn = res.group('file')
-if '/' not in fn and os.path.exists(os.path.join(dirname, fn)) and 
fn not in files:
-incdata = readfile(os.path.join(dirname, fn), funmac, macros, 
files, printdef)
+if include and '/' not in fn and 
os.path.exists(os.path.join(dirname, fn)) and fn not in files:
+incdata = readfile(os.path.join(dirname, fn), funmac, macros, 
files, printdef, include)
 ndata.extend(incdata)
 continue
 ndata.append(line)
@@ -154,8 +155,13 @@ def readfile(f, funmac=None, macros=None
 files.remove(f)
 return ndata
 
-def preprocess(f, printdef=False):
-return '\n'.join(readfile(f, printdef=printdef))
+def preprocess(f, printdef=False, include=True):
+return '\n'.join(readfile(f, printdef=printdef, include=include))
+
+# some regexps helping to normalize a declaration
+spcre = re.compile(r'\s+')
+strre = re.compile(r'([^ *])\*')
+comre = re.compile(r',\s*')
 
 def normalize(decl):
 decl = spcre.sub(' ', decl) \
@@ -175,4 +181,4 @@ def normalize(decl):
 if __name__ == '__main__':
 import sys
 for f in sys.argv[1:]:
-print(preprocess(f, printdef=True))
+print(preprocess(f, printdef=False))
diff --git a/testing/listexports.py.in b/testing/listexports.py.in
--- a/testing/listexports.py.in
+++ b/testing/listexports.py.in
@@ -38,7 +38,7 @@ nmere = re.compile(r'\b(?P[a-zA-Z_
 def extract(f):
 decls = []
 
-data = exportutils.preprocess(f)
+data = exportutils.preprocess(f, include=False)
 
 res = expre.search(data)
 while res is not None:
@@ -81,8 +81,7 @@ def findfiles(dirlist, skipfiles = [], s
 decls.extend(extract(os.path.join(root, f)))
 done[f] = True
 decls.sort()
-names, decls = list(zip(*decls))
-return decls
+return [decl for name, decl in decls]
 
 def main():
 for lib in libs:
diff --git a/testing/melcheck.py b/testing/melcheck.py
--- a/testing/melcheck.py
+++ b/testing/melcheck.py
@@ -76,7 +76,7 @@ def checkcommand(imp, mod, fcn, decl, re
 cpos = cres.end(0)
 
 def process1(f):
-data = exportutils.preprocess(f)
+data = exportutils.preprocess(f, include=True)
 pats = {}
 cmds = {}
 res = fcnre.search(data)
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Oct2020 - Approve.

2021-01-21 Thread Sjoerd Mullender
Changeset: 222fe5c89560 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=222fe5c89560
Modified Files:
clients/Tests/MAL-signatures.stable.out.int128
Branch: Oct2020
Log Message:

Approve.


diffs (13 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -8150,8 +8150,8 @@ stdout of test 'MAL-signatures` in direc
 [ "batcalc",   "rsh_noerror",  "pattern batcalc.rsh_noerror(X_1:sht, 
X_2:bat[:sht], X_3:bat[:oid]):bat[:sht] ","CMDbatRSH;",   ""  ]
 [ "batcalc",   "second_interval",  "pattern 
batcalc.second_interval(X_1:int, X_2:bat[:bte], X_3:bat[:oid], X_4:int, 
X_5:int):bat[:lng] ",  "bte_batdec2second_interval;",  ""  ]
 [ "batcalc",   "second_interval",  "pattern 
batcalc.second_interval(X_1:int, X_2:bat[:bte], X_3:int, X_4:int):bat[:lng] ", 
"bte_batdec2second_interval;",  ""  ]
-[ "batcalc",   "second_interval",  "command 
batcalc.second_interval(X_1:int, X_2:bat[:hge], X_3:int, X_4:int):bat[:lng] ", 
"hge_batdec2second_interval;",  ""  ]
 [ "batcalc",   "second_interval",  "pattern 
batcalc.second_interval(X_1:int, X_2:bat[:hge], X_3:bat[:oid], X_4:int, 
X_5:int):bat[:lng] ",  "hge_batdec2second_interval;",  ""  ]
+[ "batcalc",   "second_interval",  "pattern 
batcalc.second_interval(X_1:int, X_2:bat[:hge], X_3:int, X_4:int):bat[:lng] ", 
"hge_batdec2second_interval;",  ""  ]
 [ "batcalc",   "second_interval",  "pattern 
batcalc.second_interval(X_1:int, X_2:bat[:int], X_3:bat[:oid], X_4:int, 
X_5:int):bat[:lng] ",  "int_batdec2second_interval;",  ""  ]
 [ "batcalc",   "second_interval",  "pattern 
batcalc.second_interval(X_1:int, X_2:bat[:int], X_3:int, X_4:int):bat[:lng] ", 
"int_batdec2second_interval;",  ""  ]
 [ "batcalc",   "second_interval",  "pattern 
batcalc.second_interval(X_1:int, X_2:bat[:lng], X_3:bat[:oid], X_4:int, 
X_5:int):bat[:lng] ",  "lng_batdec2second_interval;",  ""  ]
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Oct2020 - Fix for rtrim bug. At rel2bin_semijoin, equal...

2021-01-21 Thread Pedro Ferreira
Changeset: bae3c5ac6652 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bae3c5ac6652
Modified Files:
sql/backends/monet5/rel_bin.c
sql/test/bugs/Tests/rtrim_bug.stable.out
Branch: Oct2020
Log Message:

Fix for rtrim bug. At rel2bin_semijoin, equality expressions with function 
calls require materialization of the left relation


diffs (46 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
@@ -2516,6 +2516,8 @@ rel2bin_antijoin(backend *be, sql_rel *r
return stmt_list(be, l);
 }
 
+#define complex_join_expression(e) (exp_has_func(e) && (e)->flag != 
cmp_filter) || (e)->flag == cmp_or || ((e)->f && (e)->anti)
+
 static stmt *
 rel2bin_semijoin(backend *be, sql_rel *rel, list *refs)
 {
@@ -2560,10 +2562,8 @@ rel2bin_semijoin(backend *be, sql_rel *r
int idx = 0, equality_only = 1;
 
jexps = get_equi_joins_first(sql, jexps, 
_only);
-   if (!equality_only || list_length(jexps) > 1) {
+   if (!equality_only || list_length(jexps) > 1 || 
complex_join_expression((sql_exp*)jexps->h->data))
left = subrel_project(be, left, refs, rel->l);
-   equality_only = 0;
-   }
right = subrel_project(be, right, refs, rel->r);
 
for( en = jexps->h; en; en = en->next ) {
@@ -2572,8 +2572,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
stmt *s = NULL;
 
/* only handle simple joins here */
-   if ((exp_has_func(e) && e->flag != cmp_filter) 
||
-   e->flag == cmp_or || (e->f && e->anti)) 
{
+   if (complex_join_expression(e)) {
if (!join && !list_length(lje)) {
stmt *l = bin_first_column(be, 
left);
stmt *r = bin_first_column(be, 
right);
diff --git a/sql/test/bugs/Tests/rtrim_bug.stable.out 
b/sql/test/bugs/Tests/rtrim_bug.stable.out
--- a/sql/test/bugs/Tests/rtrim_bug.stable.out
+++ b/sql/test/bugs/Tests/rtrim_bug.stable.out
@@ -47,7 +47,7 @@ stdout of test 'rtrim_bug` in directory 
 % sys.,sys. # table_name
 % data_length, data_value # name
 % int, varchar # type
-% 1,   1 # length
+% 1,   0 # length
 #DROP VIEW v1;
 #DROP VIEW v2;
 #DROP TABLE t1;
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - Restore 2017 All file.

2021-01-21 Thread Aris Koning
Changeset: 335dc267be90 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=335dc267be90
Modified Files:
sql/test/BugTracker-2017/Tests/All
Branch: nospare
Log Message:

Restore 2017 All file.


diffs (130 lines):

diff --git a/sql/test/BugTracker-2017/Tests/All 
b/sql/test/BugTracker-2017/Tests/All
--- a/sql/test/BugTracker-2017/Tests/All
+++ b/sql/test/BugTracker-2017/Tests/All
@@ -1,4 +1,125 @@
-
+# keep drop_system_schema.Bug-6437 as first test as it appears that the 
behavior is different (wrong) when it is the first test or not
+drop_system_schema.Bug-6437
+check_system_schema.Bug-6437
+unknown_col_in_order_by.Bug-3535
+extract_quarter_week_from_date.Bug-3831
+KNOWNFAIL?insert_self_ref_FK.Bug-6131
+shutdown.Bug-6182
+avggroupbysq.Bug-6178
+semijoinunion.Bug-6150
+HAVE_LIBZ?heapextend.Bug-6134
+incorrect_error.Bug-6141
+empty-interval.Bug-6184
+crash_in_null_cast.Bug-6186
+drop_not_null_on_pkey.Bug-6189
+too-large-decimals.Bug-6192
+splitpart.Bug-6194
+HAVE_HGE?cast-with-many-decimals.Bug-6195
+union_func_crash.Bug-6196
+complicated_logic.Bug-105
+crash_on_count_div_count.Bug-6201
+oidx-on-strings.Bug-6202
+group-by-on-constant.Bug-6082
+rel2bin_project-assert.Bug-6080
+str2decimal.Bug-6206
+integer_addition_overflow.Bug-6205
+dce_bug-6177
+default-insert-update.Bug-6249
+crash_on_NULL_ptr.Bug-6130
+sqlsmith01
+HAVE_GEOM_NETCDF?sqlsmith02
+HAVE_GEOM?sqlsmith03
+sqlsmith04
+nested_with.Bug-6187
+prepare.Bug-6133
+null-quantile.Bug-6218
+sqlsmith.Bug-6216
+sqlsmith.Bug-6217
+real-power.Bug-6228
+sqlsmith.Bug-6219
+create_view_order_by.Bug-3465
+cast_boolean_to_string.Bug-6110
+modulo.Bug-6225
+one-plus-nil.Bug-6243
+with-alias-bug.6246
+crash_after_oidx_on_sys_statistics.Bug-6251
+crash_correlated_subqueries_in_select.Bug-6254
+fullouterjoinfilter.Bug-6256
+wrong_aggregation_count.Bug-6257
+select.Bug-6259
+function_and_mergetable.Bug-6288
+crash_in_in_handling.Bug-6260
+crash_correlated_subqueries_not_in_select.Bug-6290
+crash_function_returning_sample.Bug-6291
+nestedoperators.Bug-6292
+not_plus.Bug-6294
 distinct_minus_count_distinct.Bug-6296
+all_minus_count_star.Bug-6297
 lateral.Bug-6310
 limit_clause.Bug-6312
+type-resolution-error.Bugs-6313
+lateral02.Bug-6314
+exist-bigint-missing.Bug-6315
+coalesc-limit.Bug-6316
+limit.Bug-6322
+simplify_math.Bug-6324
+push_subslice.Bug-6322
+create_table_as-missing_not_null.Bug-6329
+crash-dce.Bug-6330
+delete_from_merge_table.Bug-3743
+statistics_nils_not_eq_zero.Bug-6331
+crash-select_after_MAL_error.Bug-6332
+handle-values-subqueries.Bug-6336
+groupby_assertion.Bug-6338
+spurious_error.Bug-6344
+caching_stats_bug.6374
+name-interference.Bug-6348
+parsererror.Bug-6381
+HAVE_LIBPY3?aggr_udf_with_more_than_2params.Bug-6385
+exists.Bug-6392
+case.Bug-6386
+sqllitelogistest_case.Bug-6335
+udf_crash_subquery_scalar_paramters.Bug-6399
+side-effect.Bug-6397
+copy_into_crash.Bug-6404
+null_matches_in_outer.Bug-6398
+corr_coersion.Bug-6287
+sqlitelogictest-having-with-not-in.Bug-6409
+sqlitelogictest-having-with-in.Bug-6410
+sqlitelogictest-aggregation-distinct.Bug-6411
+sqlitelogictest-aggregation-not-in.Bug-6416
+sqlsmith-semijoin-constant.bug-6417
+sqlsmith.Bug-6418
+sqlsmith.Bug-6423
+sqlsmith.Bug-6424
+sqlsmith.Bug-6425
+double-groupby-column.Bug-6207
+sqlitelogictest-aggregation-having-avg.Bug-6428
+sqlitelogictest-aggregation-distinct-coalesce.Bug-6431
+sqlsmith.Bug-6432
+sqlitelogictest-select-in.Bug-6433
+sqlitelogictest-select-not-in.Bug-6435
+drop_schema_restrict.Bug-6438
+date-arithmetic.Bug-6415
+sqlitelogictest-cast-decimal.Bug-6445
+HAVE_LIBPY3?table_returning_with.Bug-6444
+insert_into_multiple_subqueries.Bug-6448
+sqlsmith.Bug-6449
+HAVE_LIBPY3?python_loader_clobbers_default_with_null.Bug-6464
+skip_problem_best_effort.Bug-6442
+date_to_str.Bug-6467
+cleanup_statistics.Bug-6439
+update_on_procedure.Bug-6479
+sqlsmith.Bug-6477
+crash-in-topn.Bug-6478
+function-resolution.Bug-6436
+generate-resolution.Bug-6471
+sqlitelogictest-select-in-column.Bug-6490
+select-in-returns-null.Bug-6491
+sqlitelogictest-min-distinct-empty-table.Bug-6493
+sqlitelogictest-algebra-operators.Bug-6494
+sqlitelogictest-hidden-alias.Bug-6495
+sqlitelogictest-comparisons-between-floating-points-and-NULL.Bug-6496
+sqlitelogictest-not-between.Bug-6497
+createorreplace-system-func.Bug-6499
+crash-on-limit-rename.Bug-6502
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - Rename some struct fields.

2021-01-21 Thread Aris Koning
Changeset: c7b97bee8c2a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c7b97bee8c2a
Modified Files:
sql/include/sql_catalog.h
sql/storage/objectset.c
Branch: nospare
Log Message:

Rename some struct fields.


diffs (truncated from 711 to 300 lines):

diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -223,11 +223,11 @@ typedef void *sql_store;
 struct sql_trans;
 struct sql_change;
 struct objectset;
-struct object_node;
+struct versionhead;
 struct os_iter {
struct objectset *os;
struct sql_trans *tr;
-   struct object_node *n;
+   struct versionhead *n;
struct sql_hash_e *e;
const char *name;
 };
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -18,7 +18,7 @@
  * keep hash/map of names -> objectversion
  */
 
-struct object_node;// TODO: rename to object_version_chain
+struct versionhead ;// TODO: rename to object_version_chain
 
 #define id_based_rollbacked(1)
 #define name_based_rollbacked  (1<<1)
@@ -30,32 +30,32 @@ typedef struct objectversion {
ulng ts;
bte rollbacked;
bte life_cycle;
-   sql_base *obj;
+   sql_base *b; // base of underlying sql object
struct objectset* os;
struct objectversion*name_based_older;
struct objectversion*name_based_newer; // TODO: must become atomic 
pointer
-   struct object_node  *name_based_chain;
+   struct versionhead  *name_based_head;
 
struct objectversion*id_based_older;
struct objectversion*id_based_newer;
-   struct object_node  *id_based_chain;
+   struct versionhead  *id_based_head;
 } objectversion;
 
-typedef struct object_node {
-struct object_node* prev;
-struct object_node* next;
-objectversion* data;
-} object_node;
+typedef struct versionhead  {
+struct versionhead * prev;
+struct versionhead * next;
+objectversion* ov;
+} versionhead ;
 
 typedef struct objectset {
int refcnt;
sql_allocator *sa;
destroy_fptr destroy;
MT_Lock ht_lock;/* latch protecting ht */
-   object_node *name_based_h;
-   object_node *name_based_t;
-   object_node *id_based_h;
-   object_node *id_based_t;
+   versionhead  *name_based_h;
+   versionhead  *name_based_t;
+   versionhead  *id_based_h;
+   versionhead  *id_based_t;
int name_based_cnt;
int id_based_cnt;
struct sql_hash *name_map;
@@ -65,12 +65,12 @@ typedef struct objectset {
 } objectset;
 
 static int
-os_id_key(object_node *n)
+os_id_key(versionhead  *n)
 {
-   return BATatoms[TYPE_int].atomHash(>data->obj->id);
+   return BATatoms[TYPE_int].atomHash(>ov->b->id);
 }
 
-static object_node *
+static versionhead  *
 find_id(objectset *os, sqlid id)
 {
if (os) {
@@ -83,7 +83,7 @@ find_id(objectset *os, sqlid id)
return NULL;
}
 
-   for (object_node *n = os->id_based_h; n; n = n->next ) {
+   for (versionhead  *n = os->id_based_h; n; n = n->next ) 
{
int key = os_id_key(n);
 
if (hash_add(os->id_map, key, n) == NULL) {
@@ -97,9 +97,9 @@ find_id(objectset *os, sqlid id)
sql_hash_e *he = 
os->id_map->buckets[key&(os->id_map->size-1)];
 
for (; he; he = he->chain) {
-   object_node *n = he->value;
+   versionhead  *n = he->value;
 
-   if (n && n->data->obj->id == id) {
+   if (n && n->ov->b->id == id) {
MT_lock_unset(>ht_lock);
return n;
}
@@ -109,11 +109,11 @@ find_id(objectset *os, sqlid id)
}
MT_lock_unset(>ht_lock);
// TODO: can we actually reach this point?
-   for (object_node *n = os->id_based_h; n; n = n->next) {
-   objectversion *ov = n->data;
+   for (versionhead  *n = os->id_based_h; n; n = n->next) {
+   objectversion *ov = n->ov;
 
/* check if ids match */
-   if (id == ov->obj->id) {
+   if (id == ov->b->id) {
return n;
}
}
@@ -140,18 +140,18 @@ hash_delete(sql_hash *h, void *data)
 }
 
 static void
-node_destroy(objectset *os, sqlstore *store, object_node *n)
+node_destroy(objectset *os, sqlstore *store, versionhead  *n)
 {
if (!os->sa)
_DELETE(n);
-   (void)store; /* todo destroy 

MonetDB: nospare - merged

2021-01-21 Thread Niels Nes
Changeset: 5d78ec199c33 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5d78ec199c33
Branch: nospare
Log Message:

merged


diffs (truncated from 516 to 300 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -20,14 +20,18 @@
 
 struct object_node;// TODO: rename to object_version_chain
 
-#define id_based_rollbacked 1
-#define name_based_rollbacked (1<<1)
+#define id_based_rollbacked(1)
+#define name_based_rollbacked  (1<<1)
+#define under_destruction  (1<<2)
+#define under_construction (1<<3)
 
 typedef struct objectversion {
bool deleted;
ulng ts;
bte rollbacked;
+   bte life_cycle;
sql_base *obj;
+   struct objectset* os;
struct objectversion*name_based_older;
struct objectversion*name_based_newer; // TODO: must become atomic 
pointer
struct object_node  *name_based_chain;
@@ -41,7 +45,6 @@ typedef struct object_node {
 struct object_node* prev;
 struct object_node* next;
 objectversion* data;
-   struct objectset* os;
 } object_node;
 
 typedef struct objectset {
@@ -229,7 +232,6 @@ os_append_node_name(objectset *os, objec
} else {
os->name_based_h = n;
}
-   n->os = os;
n->prev = os->name_based_t; // aka the double linked list.
os->name_based_t = n;
if (n->data) {
@@ -268,7 +270,6 @@ os_append_node_id(objectset *os, object_
} else {
os->id_based_h = n;
}
-   n->os = os;
n->prev = os->id_based_t; // aka the double linked list.
os->id_based_t = n;
if (n->data) {
@@ -301,42 +302,12 @@ os_append_id(objectset *os, objectversio
 static object_node* find_name(objectset *os, const char *name);
 
 static void
-objectversion_destroy(sqlstore *store, objectversion *ov, ulng commit_ts, ulng 
oldest)
+objectversion_destroy(sqlstore *store, objectset* os, objectversion *ov)
 {
-   // TODO: clean this up once the add and del functions are working
-   // TODO: handle name_based_cnt s and id_based_cnt s
-   objectversion *name_based_older = ov->name_based_older;
-   objectversion *name_based_newer = ov->name_based_newer;
-
-   if (name_based_older && commit_ts) {
-   objectversion_destroy(store, name_based_older, commit_ts, 
oldest);
-   name_based_older = NULL;
-   } else if (name_based_older) {
-   name_based_older->name_based_newer = name_based_newer;
-   }
-   ov->name_based_older = NULL;
+   if (os->destroy)
+   os->destroy(store, ov->obj);
 
-   if (name_based_newer && commit_ts)
-   name_based_newer->name_based_older = NULL;
-   else if (name_based_newer && name_based_older)
-   name_based_newer->name_based_older = name_based_older;
-
-   objectset* os = ov->name_based_chain->os;
-   if (!name_based_newer) {
-   object_node *on = NULL;
-   if (os->unique)
-   on = find_name(os, ov->obj->name);
-   else
-   on = find_id(os, ov->obj->id);
-   assert(on->data == ov);
-   if (on)
-   os_remove_name_based_chain(os, store, on);
-   if (name_based_older)
-   os_append_name(os, name_based_older);
-   }
-   if (ov && os && os->destroy)
-   os->destroy(store, ov->obj);
-   /* free ov */
+   _DELETE(ov);
 }
 
 static void os_rollback_id_based_terminal_decendant(objectversion *ov, 
sqlstore *store);
@@ -363,7 +334,7 @@ os_rollback_os_id_based_cascading(object
}
else {
// this is a terminal node. i.e. this objectversion does not 
have id based committed history
-   os_remove_id_based_chain(ov->id_based_chain->os, store, 
ov->id_based_chain);
+   os_remove_id_based_chain(ov->os, store, ov->id_based_chain);
}
 }
 
@@ -388,7 +359,7 @@ os_rollback_os_name_based_cascading(obje
}
else {
// this is a terminal node. i.e. this objectversion does not 
have name based committed history
-   os_remove_name_based_chain(ov->name_based_chain->os, store, 
ov->name_based_chain);
+   os_remove_name_based_chain(ov->os, store, ov->name_based_chain);
}
 }
 
@@ -427,46 +398,99 @@ os_rollback(objectversion *ov, sqlstore 
return LOG_OK;
 }
 
+static void
+put_under_destruction(sqlstore* store, objectversion *ov, ulng oldest)
+{
+   //TODO ATOMIC CAS
+   if (ov->life_cycle == 0) {
+   ov->life_cycle = under_destruction;
+
+   if (!ov->name_based_newer) {
+   os_remove_name_based_chain(ov->os, store, 
ov->name_based_chain);
+   }
+   else {
+   

MonetDB: nospare - also for triggers, first create a new table (...

2021-01-21 Thread Niels Nes
Changeset: 2001897e1b1b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2001897e1b1b
Modified Files:
sql/backends/monet5/rel_bin.c
sql/storage/store.c
Branch: nospare
Log Message:

also for triggers, first create a new table (version).

(some more cleanup)


diffs (67 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
@@ -1324,11 +1324,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l
 static stmt *
 stmt_col( backend *be, sql_column *c, stmt *del, int part)
 {
-   //sql_trans *tr = be->mvc->session->tr;
stmt *sc = stmt_bat(be, c, RDONLY, part);
 
if (isTable(c->t) && c->t->access != TABLE_READONLY &&
-  (!isNew(c) /*|| (c->t->s && !inTransaction(tr, c->t))*/ || 
!isNew(c->t) /* alter */) &&
+  (!isNew(c) || !isNew(c->t) /* alter */) &&
   (c->t->persistence == SQL_PERSIST || c->t->s) /*&& 
!c->t->commit_action*/) {
stmt *i = stmt_bat(be, c, RD_INS, 0);
stmt *u = stmt_bat(be, c, RD_UPD_ID, part);
@@ -1344,11 +1343,10 @@ stmt_col( backend *be, sql_column *c, st
 static stmt *
 stmt_idx( backend *be, sql_idx *i, stmt *del, int part)
 {
-   //sql_trans *tr = be->mvc->session->tr;
stmt *sc = stmt_idxbat(be, i, RDONLY, part);
 
if (isTable(i->t) && i->t->access != TABLE_READONLY &&
-  (!isNew(i) /*|| (i->t->s && !inTransaction(tr, i->t))*/ || 
!isNew(i->t)/* alter */) &&
+  (!isNew(i) || !isNew(i->t) /* alter */) &&
   (i->t->persistence == SQL_PERSIST || i->t->s) /*&& 
!i->t->commit_action*/) {
stmt *ic = stmt_idxbat(be, i, RD_INS, 0);
stmt *u = stmt_idxbat(be, i, RD_UPD_ID, part);
@@ -4052,7 +4050,6 @@ static stmt *
 update_check_ukey(backend *be, stmt **updates, sql_key *k, stmt *tids, stmt 
*idx_updates, int updcol)
 {
mvc *sql = be->mvc;
-   //sql_trans *tr = sql->session->tr;
char *msg = NULL;
stmt *res = NULL;
 
@@ -4073,7 +4070,7 @@ update_check_ukey(backend *be, stmt **up
This is done using a relation join and a count (which
should be zero)
*/
-   if (!isNew(k) /*|| !inTransaction(tr, k)*/) {
+   if (!isNew(k)) {
stmt *nu_tids = stmt_tdiff(be, dels, tids, NULL); /* 
not updated ids */
list *lje = sa_list(sql->sa);
list *rje = sa_list(sql->sa);
@@ -4186,7 +4183,7 @@ update_check_ukey(backend *be, stmt **up
stmt *s = NULL, *h = NULL, *o;
 
/* s should be empty */
-   if (!isNew(k) /*|| !inTransaction(tr, k)*/) {
+   if (!isNew(k)) {
stmt *nu_tids = stmt_tdiff(be, dels, tids, NULL); /* 
not updated ids */
assert (updates);
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -5519,6 +5519,8 @@ sql_trans_create_trigger(sql_trans *tr, 
const char *nilptr = ATOMnilptr(TYPE_str);
 
assert(name);
+
+   t = new_table(tr, t);
base_init(tr->sa, >base, next_oid(tr->store), TR_NEW, name);
nt->columns = list_new(tr->sa, (fdestroy) NULL);
nt->t = t;
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - Remove disabled code.

2021-01-21 Thread Aris Koning
Changeset: 936353be4fce for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=936353be4fce
Modified Files:
sql/storage/objectset.c
Branch: nospare
Log Message:

Remove disabled code.


diffs (33 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -685,29 +685,6 @@ get_valid_object_id(sql_trans *tr, objec
return ov;
 }
 
-#if 0
-static void
-os_update_hash(objectset *os, object_node *n, /*new*/ objectversion *ov)
-{
-   MT_lock_set(>ht_lock);
-   if (os->name_map) {
-   hash_delete(os->name_map, n);
-   int nkey = os->name_map->key(ov);
-   hash_add(os->name_map, nkey, ov);
-   }
-
-   if (os->id_map) {
-   hash_delete(os->id_map, n);
-   int nkey = os->id_map->key(ov);
-   hash_add(os->id_map, nkey, ov);
-   }
-
-   n->data = ov;
-
-   MT_lock_unset(>ht_lock);
-}
-#endif
-
 static int
 os_add_name_based(objectset *os, struct sql_trans *tr, const char *name, 
objectversion *ov) {
object_node *name_based_node = NULL;
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: nospare - Get os_cleanup working correctly.

2021-01-21 Thread Aris Koning
Changeset: a04beab3594a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a04beab3594a
Modified Files:
sql/storage/objectset.c
sql/test/BugTracker-2017/Tests/All
Branch: nospare
Log Message:

Get os_cleanup working correctly.


diffs (truncated from 486 to 300 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -20,14 +20,18 @@
 
 struct object_node;// TODO: rename to object_version_chain
 
-#define id_based_rollbacked 1
-#define name_based_rollbacked (1<<1)
+#define id_based_rollbacked(1)
+#define name_based_rollbacked  (1<<1)
+#define under_destruction  (1<<2)
+#define under_construction (1<<3)
 
 typedef struct objectversion {
bool deleted;
ulng ts;
bte rollbacked;
+   bte life_cycle;
sql_base *obj;
+   struct objectset* os;
struct objectversion*name_based_older;
struct objectversion*name_based_newer; // TODO: must become atomic 
pointer
struct object_node  *name_based_chain;
@@ -41,7 +45,6 @@ typedef struct object_node {
 struct object_node* prev;
 struct object_node* next;
 objectversion* data;
-   struct objectset* os;
 } object_node;
 
 typedef struct objectset {
@@ -229,7 +232,6 @@ os_append_node_name(objectset *os, objec
} else {
os->name_based_h = n;
}
-   n->os = os;
n->prev = os->name_based_t; // aka the double linked list.
os->name_based_t = n;
if (n->data) {
@@ -268,7 +270,6 @@ os_append_node_id(objectset *os, object_
} else {
os->id_based_h = n;
}
-   n->os = os;
n->prev = os->id_based_t; // aka the double linked list.
os->id_based_t = n;
if (n->data) {
@@ -301,42 +302,12 @@ os_append_id(objectset *os, objectversio
 static object_node* find_name(objectset *os, const char *name);
 
 static void
-objectversion_destroy(sqlstore *store, objectversion *ov, ulng commit_ts, ulng 
oldest)
+objectversion_destroy(sqlstore *store, objectset* os, objectversion *ov)
 {
-   // TODO: clean this up once the add and del functions are working
-   // TODO: handle name_based_cnt s and id_based_cnt s
-   objectversion *name_based_older = ov->name_based_older;
-   objectversion *name_based_newer = ov->name_based_newer;
-
-   if (name_based_older && commit_ts) {
-   objectversion_destroy(store, name_based_older, commit_ts, 
oldest);
-   name_based_older = NULL;
-   } else if (name_based_older) {
-   name_based_older->name_based_newer = name_based_newer;
-   }
-   ov->name_based_older = NULL;
+   if (os->destroy)
+   os->destroy(store, ov->obj);
 
-   if (name_based_newer && commit_ts)
-   name_based_newer->name_based_older = NULL;
-   else if (name_based_newer && name_based_older)
-   name_based_newer->name_based_older = name_based_older;
-
-   objectset* os = ov->name_based_chain->os;
-   if (!name_based_newer) {
-   object_node *on = NULL;
-   if (os->unique)
-   on = find_name(os, ov->obj->name);
-   else
-   on = find_id(os, ov->obj->id);
-   assert(on->data == ov);
-   if (on)
-   os_remove_name_based_chain(os, store, on);
-   if (name_based_older)
-   os_append_name(os, name_based_older);
-   }
-   if (ov && os && os->destroy)
-   os->destroy(store, ov->obj);
-   /* free ov */
+   _DELETE(ov);
 }
 
 static void os_rollback_id_based_terminal_decendant(objectversion *ov, 
sqlstore *store);
@@ -363,7 +334,7 @@ os_rollback_os_id_based_cascading(object
}
else {
// this is a terminal node. i.e. this objectversion does not 
have id based committed history
-   os_remove_id_based_chain(ov->id_based_chain->os, store, 
ov->id_based_chain);
+   os_remove_id_based_chain(ov->os, store, ov->id_based_chain);
}
 }
 
@@ -388,7 +359,7 @@ os_rollback_os_name_based_cascading(obje
}
else {
// this is a terminal node. i.e. this objectversion does not 
have name based committed history
-   os_remove_name_based_chain(ov->name_based_chain->os, store, 
ov->name_based_chain);
+   os_remove_name_based_chain(ov->os, store, ov->name_based_chain);
}
 }
 
@@ -427,46 +398,99 @@ os_rollback(objectversion *ov, sqlstore 
return LOG_OK;
 }
 
+static void
+put_under_destruction(sqlstore* store, objectversion *ov, ulng oldest)
+{
+   //TODO ATOMIC CAS
+   if (ov->life_cycle == 0) {
+   ov->life_cycle = under_destruction;
+
+   if (!ov->name_based_newer) {
+   os_remove_name_based_chain(ov->os, 

MonetDB: default - Merge with Oct2020 branch.

2021-01-21 Thread Sjoerd Mullender
Changeset: 75ff603ffaba for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=75ff603ffaba
Modified Files:
sql/backends/monet5/sql.c
sql/server/rel_dump.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/test/SQLancer/Tests/sqlancer02.sql
sql/test/SQLancer/Tests/sqlancer02.test
sql/test/bugs/Tests/All
sql/test/miscellaneous/Tests/simple_selects.sql
sql/test/miscellaneous/Tests/simple_selects.stable.err
testing/listexports.py.in
Branch: default
Log Message:

Merge with Oct2020 branch.


diffs (truncated from 400 to 300 lines):

diff --git a/monetdb5/modules/atoms/xml.c b/monetdb5/modules/atoms/xml.c
--- a/monetdb5/modules/atoms/xml.c
+++ b/monetdb5/modules/atoms/xml.c
@@ -376,7 +376,7 @@ XMLparse(xml *x, str *doccont, str *val,
 }
 
 str
-XMLpi(str *ret, str *target, str *value)
+XMLpi(xml *ret, str *target, str *value)
 {
size_t len;
str buf;
diff --git a/monetdb5/modules/mal/mdb.c b/monetdb5/modules/mal/mdb.c
--- a/monetdb5/modules/mal/mdb.c
+++ b/monetdb5/modules/mal/mdb.c
@@ -735,7 +735,7 @@ static str MDBdump(Client cntxt, MalBlkP
 }
 
 static str
-MDBdummy(int *ret)
+MDBdummy(void *ret)
 {
(void) ret;
throw(MAL, "mdb.dummy", OPERATION_FAILED);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5719,22 +5719,22 @@ rel_joinquery_(sql_query *query, sql_rel
}
 
lateral = check_is_lateral(tab2);
-   t1 = table_ref(query, NULL, tab1, 0, NULL);
+   t1 = table_ref(query, NULL, tab1, 0, refs);
if (rel && !t1 && sql->session->status != -ERR_AMBIGUOUS) {
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
-   t1 = table_ref(query, NULL, tab1, 0, NULL);
+   t1 = table_ref(query, NULL, tab1, 0, refs);
}
if (t1) {
-   t2 = table_ref(query, NULL, tab2, 0, NULL);
+   t2 = table_ref(query, NULL, tab2, 0, refs);
if (lateral && !t2 && sql->session->status != -ERR_AMBIGUOUS) {
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
 
query_push_outer(query, t1, sql_from);
-   t2 = table_ref(query, NULL, tab2, 0, NULL);
+   t2 = table_ref(query, NULL, tab2, 0, refs);
t1 = query_pop_outer(query);
}
}
@@ -5743,9 +5743,6 @@ rel_joinquery_(sql_query *query, sql_rel
if (!t1 || !t2)
return NULL;
 
-   if (!lateral && rel_name(t1) && rel_name(t2) && strcmp(rel_name(t1), 
rel_name(t2)) == 0)
-   return sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s' on both 
sides of the JOIN expression", rel_name(t1));
-
inner = rel = rel_crossproduct(sql->sa, t1, t2, op_join);
inner->op = op;
if (lateral)
@@ -5833,17 +5830,6 @@ rel_joinquery_(sql_query *query, sql_rel
}
if (!rel)
return NULL;
-   if (!lateral) { /* if this relation is under a FROM clause, check for 
duplicate names */
-   const char *rname1 = rel_name(t1), *rname2 = rel_name(t2);
-   if (refs) {
-   if (list_find(refs, (char *)rname1, (fcmp) ))
-   return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: relation name \"%s\" specified more than once", rname1);
-   if (list_find(refs, (char *)rname2, (fcmp) ))
-   return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: relation name \"%s\" specified more than once", rname2);
-   list_append(refs, (char *)rname1);
-   list_append(refs, (char *)rname2);
-   }
-   }
if (inner && is_outerjoin(inner->op))
set_processed(inner);
set_processed(rel);
@@ -5871,28 +5857,12 @@ rel_crossquery(sql_query *query, sql_rel
mvc *sql = query->sql;
dnode *n = q->data.lval->h;
symbol *tab1 = n->data.sym, *tab2 = n->next->data.sym;
-   sql_rel *t1 = table_ref(query, rel, tab1, 0, NULL), *t2 = NULL;
-   const char *rname1, *rname2;
+   sql_rel *t1 = table_ref(query, rel, tab1, 0, refs), *t2 = NULL;
 
if (t1)
-   t2 = table_ref(query, rel, tab2, 0, NULL);
+   t2 = table_ref(query, rel, tab2, 0, refs);
if (!t1 || !t2)
return NULL;
-
-   rname1 = rel_name(t1);
-   rname2 = rel_name(t2);
-   if (rname1 && rname2 && strcmp(rname1, rname2) == 0)
-   return sql_error(sql, 02, SQLSTATE(42000) "SELECT: '%s' on both 
sides of the CROSS JOIN 

MonetDB: nospare - merged with default

2021-01-21 Thread Niels Nes
Changeset: 3c163505cee4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3c163505cee4
Branch: nospare
Log Message:

merged with default


diffs (107 lines):

diff --git a/testing/melcheck.py b/testing/melcheck.py
--- a/testing/melcheck.py
+++ b/testing/melcheck.py
@@ -12,21 +12,69 @@ except ImportError:
 from MonetDBtesting import exportutils
 
 # MEL pattern
-argreg = 
r'\s*,\s*(?:bat)?(?:var)?arg(?:any)?\s*\(\s*(?P"[^"]*")\s*,\s*(?P\w*)\s*\)'
+argreg = 
r'\s*,\s*(?Pbat)?(?Pvar)?arg(?Pany)?\s*\(\s*(?P"[^"]*")\s*,\s*(?P\w*)\s*\)'
 patreg = 
r'^\s*(?Ppattern|command)\s*\(\s*"(?P[^"]*)"\s*,\s*"(?P[^"]*)"\s*,\s*(?P\w+)\s*,[^,]*,\s*"[^\"]*(?:\\.[^\"]*)*"\s*,\s*args\s*\(\s*(?P\d+)\s*,\s*(?P\d+)(?P(?:'+argreg+')*)\s*\)\s*\)'
 
 argre = re.compile(argreg)
 patre = re.compile(patreg, re.MULTILINE)
 
-fcnreg = 
r'(?:static\s+)?(?:str|char\s*\*)\s+(?P\w+)\s*\(\s*(?:(?PClient\s+\w+\s*,\s*MalBlkPtr\s+\w+\s*,\s*MalStkPtr\s+\w+\s*,\s*InstrPtr\s+\w+)|(?P(?:\w+\s*\*+|ptr\s)\s*\w+(?:\s*,\s*(?:const\s+)?(?:\w+\s*\*(?:\s*(?:const\s*)?\*)*|ptr\s)\s*\w+)*))\s*\)\s*{'
+fcnargreg = 
r'\s*,\s*(?:const\s+)?(?:(?P\w+)\s*\*(?:\s*(?:const\s*)?\*)*|ptr\s)\s*(?P\w+)'
+fcnreg = 
r'(?:static\s+)?(?:str|char\s*\*)\s+(?P\w+)\s*\(\s*(?:(?PClient\s+\w+\s*,\s*MalBlkPtr\s+\w+\s*,\s*MalStkPtr\s+\w+\s*,\s*InstrPtr\s+\w+)|(?P(?:\w+\s*\*+|ptr\s)\s*\w+(?:'+
 fcnargreg + r')*))\s*\)\s*{'
 
 fcnre = re.compile(fcnreg)
+fcnargre = re.compile(fcnargreg)
 
 gpats = {}
 gcmds = {}
 
 mel = []
 
+mappings = {
+'streams': 'Stream',
+'bstream': 'Bstream',
+}
+
+def checkcommand(imp, mod, fcn, decl, retc, argc, args):
+if argc < retc:
+print('bad argc < retc for command {}.{} with implementation 
{}'.format(mod, fcn, imp))
+return
+decl = ',' + decl   # makes processing easier
+pos = 0
+cpos = 0
+if retc == 0:
+retc = 1
+argc += 1
+args = ',arg("",void)' + args
+for i in range(argc):
+res = argre.match(args, pos)
+if res is None:
+print('not enough arguments in command {}.{} with implementation 
{}'.format(mod, fcn, imp))
+return
+if res.group('var'):
+print('cannot have variable number of arguments in command {}.{} 
with implementation {}'.format(mod, fcn, imp))
+return
+if res.group('bat'):
+cmaltype = 'bat'
+elif res.group('any'):
+cmaltype = 'void'
+else:
+cmaltype = res.group('argval')
+cmaltype = mappings.get(cmaltype, cmaltype)
+cres = fcnargre.match(decl, cpos)
+if cres is None:
+print('not enough arguments in implementation {} for command 
{}.{}'.format(imp, mod, fcn))
+return
+ctype = cres.group('type')
+if not ctype:
+ctype = 'void'  # declared as "ptr val", so type is void *
+if i < retc and 'const' in cres.group(0):
+print('const return pointer in implementation {} for command {}.{} 
(arg {})'.format(imp, mod, fcn, i))
+if ctype != cmaltype:
+if cmaltype != 'str' or ctype != 'char' or 
cres.group(0).count('*') != 2:
+print('type mismatch for arg {} in implementation {} for 
command {}.{}'.format(i, imp, mod, fcn))
+pos = res.end(0)
+cpos = cres.end(0)
+
 def process1(f):
 data = exportutils.preprocess(f)
 pats = {}
@@ -51,17 +99,19 @@ def process1(f):
 if imp in cmds or imp in gcmds:
 print('command implementation {} for pattern 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
 else:
-mel.append(('pattern', imp, res.group('mod'), 
res.group('fcn')))
+mel.append(('pattern', imp, res.group('mod'), 
res.group('fcn'), res.group('retc'), res.group('argc'), res.group('args')))
 else:
 if imp not in cmds and imp not in gcmds:
 if imp in pats or imp in gpats:
 print('pattern implementation {} for command 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
 else:
-mel.append(('command ', imp, res.group('mod'), 
res.group('fcn')))
+mel.append(('command', imp, res.group('mod'), 
res.group('fcn'), res.group('retc'), res.group('argc'), res.group('args')))
+else:
+checkcommand(imp, res.group('mod'), res.group('fcn'), 
cmds.get(imp, gcmds.get(imp)), int(res.group('retc')), int(res.group('argc')), 
res.group('args'))
 res = patre.search(data, pos=res.end(0))
 
 def process2():
-for (cmdpat, imp, mod, fcn) in mel:
+for (cmdpat, imp, mod, fcn, retc, argc, args) in mel:
 if cmdpat == 'pattern':
 if imp not in gpats:
 if imp in gcmds:
@@ -74,6 +124,8 @@ def process2():
 print('pattern implementation {} for command 
{}.{}'.format(imp, res.group('mod'), 

MonetDB: Oct2020 - Fixing problems found with melcheck.py.

2021-01-21 Thread Sjoerd Mullender
Changeset: 005ce1ec7b37 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=005ce1ec7b37
Modified Files:
monetdb5/modules/atoms/xml.c
monetdb5/modules/mal/mdb.c
sql/backends/monet5/sql.c
Branch: Oct2020
Log Message:

Fixing problems found with melcheck.py.


diffs (36 lines):

diff --git a/monetdb5/modules/atoms/xml.c b/monetdb5/modules/atoms/xml.c
--- a/monetdb5/modules/atoms/xml.c
+++ b/monetdb5/modules/atoms/xml.c
@@ -376,7 +376,7 @@ XMLparse(xml *x, str *doccont, str *val,
 }
 
 str
-XMLpi(str *ret, str *target, str *value)
+XMLpi(xml *ret, str *target, str *value)
 {
size_t len;
str buf;
diff --git a/monetdb5/modules/mal/mdb.c b/monetdb5/modules/mal/mdb.c
--- a/monetdb5/modules/mal/mdb.c
+++ b/monetdb5/modules/mal/mdb.c
@@ -735,7 +735,7 @@ static str MDBdump(Client cntxt, MalBlkP
 }
 
 static str
-MDBdummy(int *ret)
+MDBdummy(void *ret)
 {
(void) ret;
throw(MAL, "mdb.dummy", OPERATION_FAILED);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -6485,7 +6485,7 @@ static mel_func sql_init_funcs[] = {
  command("sql", "round", hge_round_wrap, false, "round off the decimal v(d,s) 
to r digits behind the dot (if r < 0, before the dot)", args(1,5, 
arg("",hge),arg("v",hge),arg("d",int),arg("s",int),arg("r",bte))),
  command("batsql", "round", hge_bat_round_wrap, false, "round off the decimal 
v(d,s) to r digits behind the dot (if r < 0, before the dot)", args(1,5, 
batarg("",hge),batarg("v",hge),arg("d",int),arg("s",int),arg("r",bte))),
  command("calc", "second_interval", hge_dec2second_interval, false, "cast hge 
decimal to a second_interval", args(1,5, 
arg("",lng),arg("sc",int),arg("v",hge),arg("ek",int),arg("sk",int))),
- command("batcalc", "second_interval", hge_batdec2second_interval, false, 
"cast hge decimal to a second_interval", args(1,5, 
batarg("",lng),arg("sc",int),batarg("v",hge),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", hge_batdec2second_interval, false, 
"cast hge decimal to a second_interval", args(1,5, 
batarg("",lng),arg("sc",int),batarg("v",hge),arg("ek",int),arg("sk",int))),
  pattern("batcalc", "second_interval", hge_batdec2second_interval, false, 
"cast hge decimal to a second_interval", args(1,6, 
batarg("",lng),arg("sc",int),batarg("v",hge),batarg("s",oid),arg("ek",int),arg("sk",int))),
  command("calc", "hge", nil_2dec_hge, false, "cast to dec(hge) and check for 
overflow", args(1,4, 
arg("",hge),arg("v",void),arg("digits",int),arg("scale",int))),
  command("batcalc", "hge", batnil_2dec_hge, false, "cast to dec(hge) and check 
for overflow", args(1,4, 
batarg("",hge),batarg("v",void),arg("digits",int),arg("scale",int))),
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Oct2020 - Deal with restrict, plus some fixes.

2021-01-21 Thread Sjoerd Mullender
Changeset: 46659a7de18f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=46659a7de18f
Modified Files:
testing/melcheck.py
Branch: Oct2020
Log Message:

Deal with restrict, plus some fixes.


diffs (28 lines):

diff --git a/testing/melcheck.py b/testing/melcheck.py
--- a/testing/melcheck.py
+++ b/testing/melcheck.py
@@ -18,7 +18,7 @@ patreg = r'^\s*(?Ppattern|comman
 argre = re.compile(argreg)
 patre = re.compile(patreg, re.MULTILINE)
 
-fcnargreg = 
r'\s*,\s*(?:const\s+)?(?:(?P\w+)\s*\*(?:\s*(?:const\s*)?\*)*|ptr\s)\s*(?P\w+)'
+fcnargreg = 
r'\s*,\s*(?:const\s+)?(?:(?P\w+)\s*\*(?:\s*(?:const\s*)?\*)*(?:\s*restrict\s)?|ptr\s)\s*(?P\w+)'
 fcnreg = 
r'(?:static\s+)?(?:str|char\s*\*)\s+(?P\w+)\s*\(\s*(?:(?PClient\s+\w+\s*,\s*MalBlkPtr\s+\w+\s*,\s*MalStkPtr\s+\w+\s*,\s*InstrPtr\s+\w+)|(?P(?:\w+\s*\*+|ptr\s)\s*\w+(?:'+
 fcnargreg + r')*))\s*\)\s*{'
 
 fcnre = re.compile(fcnreg)
@@ -115,13 +115,13 @@ def process2():
 if cmdpat == 'pattern':
 if imp not in gpats:
 if imp in gcmds:
-print('command implementation {} for pattern 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
+print('command implementation {} for pattern 
{}.{}'.format(imp, mod, fcn))
 else:
 print('pattern implementation {} for {}.{} is 
missing'.format(imp, mod, fcn))
 else:
 if imp not in gcmds:
 if imp in gpats:
-print('pattern implementation {} for command 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
+print('pattern implementation {} for command 
{}.{}'.format(imp, mod, fcn))
 else:
 print('command implementation {} for {}.{} is 
missing'.format(imp, mod, fcn))
 else:
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Oct2020 - Initial version of a melcheck.py program to c...

2021-01-21 Thread Sjoerd Mullender
Changeset: bdafff4d9886 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bdafff4d9886
Added Files:
testing/melcheck.py
Modified Files:
testing/exportutils.py
testing/listexports.py.in
testing/malcheck.py
Branch: Oct2020
Log Message:

Initial version of a melcheck.py program to check mel_func array contents.


diffs (truncated from 395 to 300 lines):

diff --git a/testing/exportutils.py b/testing/exportutils.py
--- a/testing/exportutils.py
+++ b/testing/exportutils.py
@@ -5,119 +5,157 @@
 # Copyright 1997 - July 2008 CWI, August 2008 - 2021 MonetDB B.V.
 
 import re
-
-# a function-like #define that we expand to also find exports hidden
-# in preprocessor macros
-defre = re.compile(r'^[ \t]*#[ \t]*define[ \t]+'# #define
-   r'(?P[a-zA-Z_][a-zA-Z0-9_]*)'  # name being 
defined
-   r'\((?P[a-zA-Z0-9_, \t]*)\)[ \t]*' # arguments
-   r'(?P.*)$', # macro replacement
-   re.MULTILINE)
-# line starting with a "#"
-cldef = re.compile(r'^[ \t]*#', re.MULTILINE)
+import os
 
-# white space
-spcre = re.compile(r'\s+')
+# macro definition
+macrore = re.compile(r'\s*#\s*define\s+'# #define
+ r'(?P\w+)'   # name being defined
+ r'(?:\((?P[^)]*)\))?\s*' # optional arguments
+ r'(?P.*)')   # replacement
+# include file
+inclre = re.compile(r'\s*#\s*include\s+"(?P[^"]*)"')
+# comments (/* ... */ where ... is as short as possible)
+cmtre = re.compile(r'/\*[^*]*(\*(?=[^/])[^*]*)*\*/|//.*')
+# horizontal white space
+spcre = re.compile(r'[ \t]+')
+# identifier
+identre = re.compile(r'\b(?P[a-zA-Z_]\w*)\b')
+# undef
+undefre = re.compile(r'\s*#\s*undef\s+(?P\w+)')
+ifre = re.compile(r'\s*#\s*if') # #if or #ifdef
+elifre = re.compile(r'\s*#\s*elif')
+elsere = re.compile(r'\s*#\s*else')
+endifre = re.compile(r'\s*#\s*endif')
 
-# some regexps helping to normalize a declaration
-strre = re.compile(r'([^ *])\*')
-comre = re.compile(r',\s*')
-
-# comments (/* ... */ where ... is as short as possible)
-cmtre = re.compile(r'/\*.*?\*/|//[^\n]*', re.DOTALL)
-
-deepnesting = False
+nested = r'' # 
r'(?:\([^()]*(?:\([^()]*(?:\([^()]*(?:\([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*\)[^()]*)*\)[^()]*)*\)[^()]*)*\)[^()]*)*'
 
-# do something a bit like the C preprocessor
-#
-# we expand function-like macros and remove all ## sequences from the
-# replacement (even when there are no adjacent parameters that were
-# replaced), but this is good enough for our purpose of finding
-# exports that are hidden away in several levels of macro definitions
-#
-# we assume that there are no continuation lines in the input
-def preprocess(data, printdef=False):
-# remove C comments
-res = cmtre.search(data)
+def process(line, funmac, macros, infunmac=False):
+nline = ''
+pos = 0
+res = identre.search(line)
 while res is not None:
-data = data[:res.start(0)] + ' ' + data[res.end(0):]
-res = cmtre.search(data, res.start(0))
-# remove \  combo's
+name = res.group('ident')
+if name in macros:
+macros2 = macros.copy()
+del macros2[name]
+repl = process(macros[name], funmac, macros2)
+if line[res.start(0)-1:res.start(0)] == '#' and \
+   line[res.start(0)-2:res.start(0)] != '##':
+nline += line[pos:res.start(0)-1]
+nline += '"' + repl.replace('\\', r'\\').replace('"', r'\"') + 
'"'
+else:
+nline += line[pos:res.start(0)] + repl
+pos = res.end(0)
+elif name in funmac:
+args, repl = funmac[name]
+pat = r'\s*\('
+sep = r''
+for arg in args:
+pat += sep + r'([^,()]*(?:\([^()]*'+nested+r'\)[^,()]*)*)'
+sep = r','
+pat += r'\s*\)'
+r = re.compile(pat)
+res2 = r.match(line, pos=res.end(0))
+if res2 is not None:
+macros2 = {}
+i = 1
+for arg in args:
+macros2[arg] = res2.group(i).strip()
+i += 1
+repl = process(repl, {}, macros2, True)
+funmac2 = funmac.copy()
+del funmac2[name]
+repl = process(repl, funmac2, macros)
+repl = repl.replace('##', '')
+nline += line[pos:res.start(0)] + repl
+pos = res2.end(0)
+else:
+nline += line[pos:res.end(0)]
+pos = res.end(0)
+else:
+nline += line[pos:res.end(0)]
+pos = res.end(0)
+res = identre.search(line, pos=pos)
+nline += line[pos:]
+return nline
+
+def readfile(f, funmac=None, macros=None, files=None, printdef=False):
+data = open(f).read()
+dirname, f = 

MonetDB: Oct2020 - Check arguments of MEL commands.

2021-01-21 Thread Sjoerd Mullender
Changeset: 0d3c319ac98a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0d3c319ac98a
Modified Files:
testing/melcheck.py
Branch: Oct2020
Log Message:

Check arguments of MEL commands.


diffs (107 lines):

diff --git a/testing/melcheck.py b/testing/melcheck.py
--- a/testing/melcheck.py
+++ b/testing/melcheck.py
@@ -12,21 +12,69 @@ except ImportError:
 from MonetDBtesting import exportutils
 
 # MEL pattern
-argreg = 
r'\s*,\s*(?:bat)?(?:var)?arg(?:any)?\s*\(\s*(?P"[^"]*")\s*,\s*(?P\w*)\s*\)'
+argreg = 
r'\s*,\s*(?Pbat)?(?Pvar)?arg(?Pany)?\s*\(\s*(?P"[^"]*")\s*,\s*(?P\w*)\s*\)'
 patreg = 
r'^\s*(?Ppattern|command)\s*\(\s*"(?P[^"]*)"\s*,\s*"(?P[^"]*)"\s*,\s*(?P\w+)\s*,[^,]*,\s*"[^\"]*(?:\\.[^\"]*)*"\s*,\s*args\s*\(\s*(?P\d+)\s*,\s*(?P\d+)(?P(?:'+argreg+')*)\s*\)\s*\)'
 
 argre = re.compile(argreg)
 patre = re.compile(patreg, re.MULTILINE)
 
-fcnreg = 
r'(?:static\s+)?(?:str|char\s*\*)\s+(?P\w+)\s*\(\s*(?:(?PClient\s+\w+\s*,\s*MalBlkPtr\s+\w+\s*,\s*MalStkPtr\s+\w+\s*,\s*InstrPtr\s+\w+)|(?P(?:\w+\s*\*+|ptr\s)\s*\w+(?:\s*,\s*(?:const\s+)?(?:\w+\s*\*(?:\s*(?:const\s*)?\*)*|ptr\s)\s*\w+)*))\s*\)\s*{'
+fcnargreg = 
r'\s*,\s*(?:const\s+)?(?:(?P\w+)\s*\*(?:\s*(?:const\s*)?\*)*|ptr\s)\s*(?P\w+)'
+fcnreg = 
r'(?:static\s+)?(?:str|char\s*\*)\s+(?P\w+)\s*\(\s*(?:(?PClient\s+\w+\s*,\s*MalBlkPtr\s+\w+\s*,\s*MalStkPtr\s+\w+\s*,\s*InstrPtr\s+\w+)|(?P(?:\w+\s*\*+|ptr\s)\s*\w+(?:'+
 fcnargreg + r')*))\s*\)\s*{'
 
 fcnre = re.compile(fcnreg)
+fcnargre = re.compile(fcnargreg)
 
 gpats = {}
 gcmds = {}
 
 mel = []
 
+mappings = {
+'streams': 'Stream',
+'bstream': 'Bstream',
+}
+
+def checkcommand(imp, mod, fcn, decl, retc, argc, args):
+if argc < retc:
+print('bad argc < retc for command {}.{} with implementation 
{}'.format(mod, fcn, imp))
+return
+decl = ',' + decl   # makes processing easier
+pos = 0
+cpos = 0
+if retc == 0:
+retc = 1
+argc += 1
+args = ',arg("",void)' + args
+for i in range(argc):
+res = argre.match(args, pos)
+if res is None:
+print('not enough arguments in command {}.{} with implementation 
{}'.format(mod, fcn, imp))
+return
+if res.group('var'):
+print('cannot have variable number of arguments in command {}.{} 
with implementation {}'.format(mod, fcn, imp))
+return
+if res.group('bat'):
+cmaltype = 'bat'
+elif res.group('any'):
+cmaltype = 'void'
+else:
+cmaltype = res.group('argval')
+cmaltype = mappings.get(cmaltype, cmaltype)
+cres = fcnargre.match(decl, cpos)
+if cres is None:
+print('not enough arguments in implementation {} for command 
{}.{}'.format(imp, mod, fcn))
+return
+ctype = cres.group('type')
+if not ctype:
+ctype = 'void'  # declared as "ptr val", so type is void *
+if i < retc and 'const' in cres.group(0):
+print('const return pointer in implementation {} for command {}.{} 
(arg {})'.format(imp, mod, fcn, i))
+if ctype != cmaltype:
+if cmaltype != 'str' or ctype != 'char' or 
cres.group(0).count('*') != 2:
+print('type mismatch for arg {} in implementation {} for 
command {}.{}'.format(i, imp, mod, fcn))
+pos = res.end(0)
+cpos = cres.end(0)
+
 def process1(f):
 data = exportutils.preprocess(f)
 pats = {}
@@ -51,17 +99,19 @@ def process1(f):
 if imp in cmds or imp in gcmds:
 print('command implementation {} for pattern 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
 else:
-mel.append(('pattern', imp, res.group('mod'), 
res.group('fcn')))
+mel.append(('pattern', imp, res.group('mod'), 
res.group('fcn'), res.group('retc'), res.group('argc'), res.group('args')))
 else:
 if imp not in cmds and imp not in gcmds:
 if imp in pats or imp in gpats:
 print('pattern implementation {} for command 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
 else:
-mel.append(('command ', imp, res.group('mod'), 
res.group('fcn')))
+mel.append(('command', imp, res.group('mod'), 
res.group('fcn'), res.group('retc'), res.group('argc'), res.group('args')))
+else:
+checkcommand(imp, res.group('mod'), res.group('fcn'), 
cmds.get(imp, gcmds.get(imp)), int(res.group('retc')), int(res.group('argc')), 
res.group('args'))
 res = patre.search(data, pos=res.end(0))
 
 def process2():
-for (cmdpat, imp, mod, fcn) in mel:
+for (cmdpat, imp, mod, fcn, retc, argc, args) in mel:
 if cmdpat == 'pattern':
 if imp not in gpats:
 if imp in gcmds:
@@ -74,6 +124,8 @@ def process2():
 print('pattern implementation {} 

MonetDB: default - Check arguments of MEL commands.

2021-01-21 Thread Sjoerd Mullender
Changeset: cd8a99c0d73a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cd8a99c0d73a
Modified Files:
testing/melcheck.py
Branch: default
Log Message:

Check arguments of MEL commands.


diffs (107 lines):

diff --git a/testing/melcheck.py b/testing/melcheck.py
--- a/testing/melcheck.py
+++ b/testing/melcheck.py
@@ -12,21 +12,69 @@ except ImportError:
 from MonetDBtesting import exportutils
 
 # MEL pattern
-argreg = 
r'\s*,\s*(?:bat)?(?:var)?arg(?:any)?\s*\(\s*(?P"[^"]*")\s*,\s*(?P\w*)\s*\)'
+argreg = 
r'\s*,\s*(?Pbat)?(?Pvar)?arg(?Pany)?\s*\(\s*(?P"[^"]*")\s*,\s*(?P\w*)\s*\)'
 patreg = 
r'^\s*(?Ppattern|command)\s*\(\s*"(?P[^"]*)"\s*,\s*"(?P[^"]*)"\s*,\s*(?P\w+)\s*,[^,]*,\s*"[^\"]*(?:\\.[^\"]*)*"\s*,\s*args\s*\(\s*(?P\d+)\s*,\s*(?P\d+)(?P(?:'+argreg+')*)\s*\)\s*\)'
 
 argre = re.compile(argreg)
 patre = re.compile(patreg, re.MULTILINE)
 
-fcnreg = 
r'(?:static\s+)?(?:str|char\s*\*)\s+(?P\w+)\s*\(\s*(?:(?PClient\s+\w+\s*,\s*MalBlkPtr\s+\w+\s*,\s*MalStkPtr\s+\w+\s*,\s*InstrPtr\s+\w+)|(?P(?:\w+\s*\*+|ptr\s)\s*\w+(?:\s*,\s*(?:const\s+)?(?:\w+\s*\*(?:\s*(?:const\s*)?\*)*|ptr\s)\s*\w+)*))\s*\)\s*{'
+fcnargreg = 
r'\s*,\s*(?:const\s+)?(?:(?P\w+)\s*\*(?:\s*(?:const\s*)?\*)*|ptr\s)\s*(?P\w+)'
+fcnreg = 
r'(?:static\s+)?(?:str|char\s*\*)\s+(?P\w+)\s*\(\s*(?:(?PClient\s+\w+\s*,\s*MalBlkPtr\s+\w+\s*,\s*MalStkPtr\s+\w+\s*,\s*InstrPtr\s+\w+)|(?P(?:\w+\s*\*+|ptr\s)\s*\w+(?:'+
 fcnargreg + r')*))\s*\)\s*{'
 
 fcnre = re.compile(fcnreg)
+fcnargre = re.compile(fcnargreg)
 
 gpats = {}
 gcmds = {}
 
 mel = []
 
+mappings = {
+'streams': 'Stream',
+'bstream': 'Bstream',
+}
+
+def checkcommand(imp, mod, fcn, decl, retc, argc, args):
+if argc < retc:
+print('bad argc < retc for command {}.{} with implementation 
{}'.format(mod, fcn, imp))
+return
+decl = ',' + decl   # makes processing easier
+pos = 0
+cpos = 0
+if retc == 0:
+retc = 1
+argc += 1
+args = ',arg("",void)' + args
+for i in range(argc):
+res = argre.match(args, pos)
+if res is None:
+print('not enough arguments in command {}.{} with implementation 
{}'.format(mod, fcn, imp))
+return
+if res.group('var'):
+print('cannot have variable number of arguments in command {}.{} 
with implementation {}'.format(mod, fcn, imp))
+return
+if res.group('bat'):
+cmaltype = 'bat'
+elif res.group('any'):
+cmaltype = 'void'
+else:
+cmaltype = res.group('argval')
+cmaltype = mappings.get(cmaltype, cmaltype)
+cres = fcnargre.match(decl, cpos)
+if cres is None:
+print('not enough arguments in implementation {} for command 
{}.{}'.format(imp, mod, fcn))
+return
+ctype = cres.group('type')
+if not ctype:
+ctype = 'void'  # declared as "ptr val", so type is void *
+if i < retc and 'const' in cres.group(0):
+print('const return pointer in implementation {} for command {}.{} 
(arg {})'.format(imp, mod, fcn, i))
+if ctype != cmaltype:
+if cmaltype != 'str' or ctype != 'char' or 
cres.group(0).count('*') != 2:
+print('type mismatch for arg {} in implementation {} for 
command {}.{}'.format(i, imp, mod, fcn))
+pos = res.end(0)
+cpos = cres.end(0)
+
 def process1(f):
 data = exportutils.preprocess(f)
 pats = {}
@@ -51,17 +99,19 @@ def process1(f):
 if imp in cmds or imp in gcmds:
 print('command implementation {} for pattern 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
 else:
-mel.append(('pattern', imp, res.group('mod'), 
res.group('fcn')))
+mel.append(('pattern', imp, res.group('mod'), 
res.group('fcn'), res.group('retc'), res.group('argc'), res.group('args')))
 else:
 if imp not in cmds and imp not in gcmds:
 if imp in pats or imp in gpats:
 print('pattern implementation {} for command 
{}.{}'.format(imp, res.group('mod'), res.group('fcn')))
 else:
-mel.append(('command ', imp, res.group('mod'), 
res.group('fcn')))
+mel.append(('command', imp, res.group('mod'), 
res.group('fcn'), res.group('retc'), res.group('argc'), res.group('args')))
+else:
+checkcommand(imp, res.group('mod'), res.group('fcn'), 
cmds.get(imp, gcmds.get(imp)), int(res.group('retc')), int(res.group('argc')), 
res.group('args'))
 res = patre.search(data, pos=res.end(0))
 
 def process2():
-for (cmdpat, imp, mod, fcn) in mel:
+for (cmdpat, imp, mod, fcn, retc, argc, args) in mel:
 if cmdpat == 'pattern':
 if imp not in gpats:
 if imp in gcmds:
@@ -74,6 +124,8 @@ def process2():
 print('pattern implementation {}