MonetDB: Dec2023 - move drop bats code into the sys_drop_* funct...

2024-06-05 Thread Niels Nes via checkin-list
Changeset: 5bf0cccb943e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5bf0cccb943e
Modified Files:
sql/storage/store.c
Branch: Dec2023
Log Message:

move drop bats code into the sys_drop_* functions, should solve bat leaks on 
disk
(grafted from 3f2d29873c785ab7a63bad9160b9d055a5f62416)


diffs (74 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4345,6 +4345,11 @@ sys_drop_idx(sql_trans *tr, sql_idx * i,
return res;
}
 
+   i->base.deleted = 1;
+   if (!isNew(i) && !isTempTable(i->t))
+   if ((res = store->storage_api.drop_idx(tr, 
(sql_idx*)dup_base(&i->base
+   return res;
+
/* remove idx from schema and table */
if (isGlobal(i->t) && (res = os_del(i->t->s->idxs, tr, i->base.name, 
dup_base(&i->base
return res;
@@ -4561,6 +4566,11 @@ sys_drop_column(sql_trans *tr, sql_colum
if ((res = sys_drop_default_object(tr, col, drop_action)))
return res;
 
+   col->base.deleted = 1;
+   if (!isNew(col) && !isTempTable(col->t))
+   if ((res = store->storage_api.drop_col(tr, 
(sql_column*)dup_base(&col->base
+   return res;
+
if (drop_action && (res = sql_trans_drop_all_dependencies(tr, 
col->base.id, COLUMN_DEPENDENCY)))
return res;
if (col->type.type->s && (res = sql_trans_drop_dependency(tr, 
col->type.type->base.id, col->base.id, TYPE_DEPENDENCY)))
@@ -4771,6 +4781,10 @@ sys_drop_table(sql_trans *tr, sql_table 
if ((res = sys_drop_columns(tr, t, drop_action)))
return res;
 
+   if (isTable(t) && !isNew(t))
+   if ((res = store->storage_api.drop_del(tr, t)))
+   return res;
+
if (drop_action && (res = sql_trans_drop_all_dependencies(tr, 
t->base.id, !isView(t) ? TABLE_DEPENDENCY : VIEW_DEPENDENCY)))
return res;
return res;
@@ -6036,11 +6050,6 @@ sql_trans_drop_table(sql_trans *tr, sql_
if (t != gt && (res = os_del(tr->localtmps, tr, t->base.name, 
dup_base(&t->base
return res;
 
-   sqlstore *store = tr->store;
-   if (isTable(t) && !isNew(t))
-   if ((res = store->storage_api.drop_del(tr, t)))
-   return res;
-
if (drop_action == DROP_CASCADE_START && tr->dropped) {
list_destroy(tr->dropped);
tr->dropped = NULL;
@@ -6243,11 +6252,6 @@ sql_trans_drop_column(sql_trans *tr, sql
if ((res = sys_drop_column(tr, col, drop_action)))
return res;
 
-   col->base.deleted = 1;
-   if (!isNew(col) && !isTempTable(col->t))
-   if ((res = store->storage_api.drop_col(tr, 
(sql_column*)dup_base(&col->base
-   return res;
-
if (isNew(col)) { /* remove create from changes */
trans_del(tr, &col->base);
if (!isNew(col->t))
@@ -6858,11 +6862,6 @@ sql_trans_drop_idx(sql_trans *tr, sql_sc
if ((res = store_reset_sql_functions(tr, i->t->base.id))) /* reset sql 
functions depending on the table */
return res;
 
-   i->base.deleted = 1;
-   if (!isNew(i) && !isTempTable(i->t))
-   if ((res = store->storage_api.drop_idx(tr, 
(sql_idx*)dup_base(&i->base
-   return res;
-
node *n = ol_find_name(i->t->idxs, i->base.name);
if (n)
ol_del(i->t->idxs, store, n);
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Aug2024 - Merge with Dec2023 branch.

2024-06-05 Thread Sjoerd Mullender via checkin-list
Changeset: 1b36a61240f0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1b36a61240f0
Modified Files:
monetdb5/modules/mal/txtsim.c
sql/storage/store.c
Branch: Aug2024
Log Message:

Merge with Dec2023 branch.


diffs (49 lines):

diff --git a/monetdb5/modules/mal/txtsim.c b/monetdb5/modules/mal/txtsim.c
--- a/monetdb5/modules/mal/txtsim.c
+++ b/monetdb5/modules/mal/txtsim.c
@@ -481,6 +481,10 @@ str_2_codepointseq(str_item *s)
 {
const uint8_t *p = (const uint8_t *) s->val;
 
+   if (s->len == 0) {
+   s->cp_sequence = NULL;
+   return MAL_SUCCEED;
+   }
s->cp_sequence = GDKmalloc(s->len * sizeof(int));
if (s->cp_sequence == NULL)
throw(MAL, "str_2_byteseq", SQLSTATE(HY013) MAL_MALLOC_FAIL);
@@ -589,20 +593,29 @@ static str
 TXTSIMjarowinkler(dbl *res, const char *const *x, const char *const *y)
 {
int *x_flags = NULL, *y_flags = NULL;
-   str_item xi = { 0 }, yi = { 0 };
+   str_item xi, yi;
str msg = MAL_SUCCEED;
 
if (strNil(*x) || strNil(*y)) {
*res = dbl_nil;
return MAL_SUCCEED;
}
-   xi.val = *x;
-   xi.len = UTF8_strlen(*x);
+   xi = (str_item) {
+   .val = *x,
+   .len = UTF8_strlen(*x),
+   };
+   yi = (str_item) {
+   .val = *y,
+   .len = UTF8_strlen(*y),
+   };
+   if (xi.len == 0 || yi.len == 0) {
+   *res = 0;
+   return MAL_SUCCEED;
+   }
+
if ((msg = str_2_codepointseq(&xi)) != MAL_SUCCEED)
goto bailout;
 
-   yi.val = *y;
-   yi.len = UTF8_strlen(*y);
if ((msg = str_2_codepointseq(&yi)) != MAL_SUCCEED)
goto bailout;
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: default - Merge with Aug2024 branch.

2024-06-05 Thread Sjoerd Mullender via checkin-list
Changeset: fefb169a14d2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fefb169a14d2
Modified Files:
sql/storage/store.c
Branch: default
Log Message:

Merge with Aug2024 branch.


diffs (49 lines):

diff --git a/monetdb5/modules/mal/txtsim.c b/monetdb5/modules/mal/txtsim.c
--- a/monetdb5/modules/mal/txtsim.c
+++ b/monetdb5/modules/mal/txtsim.c
@@ -481,6 +481,10 @@ str_2_codepointseq(str_item *s)
 {
const uint8_t *p = (const uint8_t *) s->val;
 
+   if (s->len == 0) {
+   s->cp_sequence = NULL;
+   return MAL_SUCCEED;
+   }
s->cp_sequence = GDKmalloc(s->len * sizeof(int));
if (s->cp_sequence == NULL)
throw(MAL, "str_2_byteseq", SQLSTATE(HY013) MAL_MALLOC_FAIL);
@@ -589,20 +593,29 @@ static str
 TXTSIMjarowinkler(dbl *res, const char *const *x, const char *const *y)
 {
int *x_flags = NULL, *y_flags = NULL;
-   str_item xi = { 0 }, yi = { 0 };
+   str_item xi, yi;
str msg = MAL_SUCCEED;
 
if (strNil(*x) || strNil(*y)) {
*res = dbl_nil;
return MAL_SUCCEED;
}
-   xi.val = *x;
-   xi.len = UTF8_strlen(*x);
+   xi = (str_item) {
+   .val = *x,
+   .len = UTF8_strlen(*x),
+   };
+   yi = (str_item) {
+   .val = *y,
+   .len = UTF8_strlen(*y),
+   };
+   if (xi.len == 0 || yi.len == 0) {
+   *res = 0;
+   return MAL_SUCCEED;
+   }
+
if ((msg = str_2_codepointseq(&xi)) != MAL_SUCCEED)
goto bailout;
 
-   yi.val = *y;
-   yi.len = UTF8_strlen(*y);
if ((msg = str_2_codepointseq(&yi)) != MAL_SUCCEED)
goto bailout;
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Aug2024 - fixed small performance regression, because w...

2024-06-05 Thread Niels Nes via checkin-list
Changeset: 1ee668a18e17 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1ee668a18e17
Modified Files:
sql/backends/monet5/sql_statement.c
Branch: Aug2024
Log Message:

fixed small performance regression, because we lost track of null/no null info 
on the stmt level.


diffs (12 lines):

diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -4639,6 +4639,8 @@ stmt_has_null(stmt *s)
case st_uselect2:
case st_atom:
return 0;
+   case st_alias:
+   return stmt_has_null(s->op1);
case st_join:
return stmt_has_null(s->op2);
case st_bat:
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Aug2024 - merged

2024-06-05 Thread Niels Nes via checkin-list
Changeset: e9c109807f3a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e9c109807f3a
Branch: Aug2024
Log Message:

merged


diffs (49 lines):

diff --git a/monetdb5/modules/mal/txtsim.c b/monetdb5/modules/mal/txtsim.c
--- a/monetdb5/modules/mal/txtsim.c
+++ b/monetdb5/modules/mal/txtsim.c
@@ -481,6 +481,10 @@ str_2_codepointseq(str_item *s)
 {
const uint8_t *p = (const uint8_t *) s->val;
 
+   if (s->len == 0) {
+   s->cp_sequence = NULL;
+   return MAL_SUCCEED;
+   }
s->cp_sequence = GDKmalloc(s->len * sizeof(int));
if (s->cp_sequence == NULL)
throw(MAL, "str_2_byteseq", SQLSTATE(HY013) MAL_MALLOC_FAIL);
@@ -589,20 +593,29 @@ static str
 TXTSIMjarowinkler(dbl *res, const char *const *x, const char *const *y)
 {
int *x_flags = NULL, *y_flags = NULL;
-   str_item xi = { 0 }, yi = { 0 };
+   str_item xi, yi;
str msg = MAL_SUCCEED;
 
if (strNil(*x) || strNil(*y)) {
*res = dbl_nil;
return MAL_SUCCEED;
}
-   xi.val = *x;
-   xi.len = UTF8_strlen(*x);
+   xi = (str_item) {
+   .val = *x,
+   .len = UTF8_strlen(*x),
+   };
+   yi = (str_item) {
+   .val = *y,
+   .len = UTF8_strlen(*y),
+   };
+   if (xi.len == 0 || yi.len == 0) {
+   *res = 0;
+   return MAL_SUCCEED;
+   }
+
if ((msg = str_2_codepointseq(&xi)) != MAL_SUCCEED)
goto bailout;
 
-   yi.val = *y;
-   yi.len = UTF8_strlen(*y);
if ((msg = str_2_codepointseq(&yi)) != MAL_SUCCEED)
goto bailout;
 
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: default - Approve new signatures.

2024-06-05 Thread Sjoerd Mullender via checkin-list
Changeset: b35af04a9070 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b35af04a9070
Modified Files:
clients/Tests/MAL-signatures-hge.test
clients/Tests/MAL-signatures.test
Branch: default
Log Message:

Approve new signatures.


diffs (154 lines):

diff --git a/clients/Tests/MAL-signatures-hge.test 
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -44944,36 +44944,6 @@ pattern generator.join(X_0:bat[:sht], X_
 VLTgenerator_join;
 (empty)
 generator
-join
-pattern generator.join(X_0:bat[:bte], X_1:bat[:bte], X_2:bat[:bte], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:dbl], X_1:bat[:dbl], X_2:bat[:dbl], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-Overloaded range join operation
-generator
-join
-pattern generator.join(X_0:bat[:flt], X_1:bat[:flt], X_2:bat[:flt], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:int], X_1:bat[:int], X_2:bat[:int], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:lng], X_1:bat[:lng], X_2:bat[:lng], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:sht], X_1:bat[:sht], X_2:bat[:sht], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
 parameters
 pattern generator.parameters(X_0:bte, X_1:bte):bat[:bte]
 VLTgenerator_noop;
@@ -45104,6 +45074,36 @@ pattern generator.projection(X_0:bat[:oi
 VLTgenerator_projection;
 Overloaded projection operation
 generator
+rangejoin
+pattern generator.rangejoin(X_0:bat[:bte], X_1:bat[:bte], X_2:bat[:bte], 
X_3:bat[:oid], X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit, X_8:bit, X_9:lng) 
(X_10:bat[:oid], X_11:bat[:oid])
+VLTgenerator_rangejoin;
+(empty)
+generator
+rangejoin
+pattern generator.rangejoin(X_0:bat[:dbl], X_1:bat[:dbl], X_2:bat[:dbl], 
X_3:bat[:oid], X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit, X_8:bit, X_9:lng) 
(X_10:bat[:oid], X_11:bat[:oid])
+VLTgenerator_rangejoin;
+Overloaded range join operation
+generator
+rangejoin
+pattern generator.rangejoin(X_0:bat[:flt], X_1:bat[:flt], X_2:bat[:flt], 
X_3:bat[:oid], X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit, X_8:bit, X_9:lng) 
(X_10:bat[:oid], X_11:bat[:oid])
+VLTgenerator_rangejoin;
+(empty)
+generator
+rangejoin
+pattern generator.rangejoin(X_0:bat[:int], X_1:bat[:int], X_2:bat[:int], 
X_3:bat[:oid], X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit, X_8:bit, X_9:lng) 
(X_10:bat[:oid], X_11:bat[:oid])
+VLTgenerator_rangejoin;
+(empty)
+generator
+rangejoin
+pattern generator.rangejoin(X_0:bat[:lng], X_1:bat[:lng], X_2:bat[:lng], 
X_3:bat[:oid], X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit, X_8:bit, X_9:lng) 
(X_10:bat[:oid], X_11:bat[:oid])
+VLTgenerator_rangejoin;
+(empty)
+generator
+rangejoin
+pattern generator.rangejoin(X_0:bat[:sht], X_1:bat[:sht], X_2:bat[:sht], 
X_3:bat[:oid], X_4:bat[:oid], X_5:bit, X_6:bit, X_7:bit, X_8:bit, X_9:lng) 
(X_10:bat[:oid], X_11:bat[:oid])
+VLTgenerator_rangejoin;
+(empty)
+generator
 select
 pattern generator.select(X_0:bat[:bte], X_1:bat[:oid], X_2:bte, X_3:bte, 
X_4:bit, X_5:bit, X_6:bit):bat[:oid]
 VLTgenerator_subselect;
diff --git a/clients/Tests/MAL-signatures.test 
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -33474,36 +33474,6 @@ pattern generator.join(X_0:bat[:sht], X_
 VLTgenerator_join;
 (empty)
 generator
-join
-pattern generator.join(X_0:bat[:bte], X_1:bat[:bte], X_2:bat[:bte], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:dbl], X_1:bat[:dbl], X_2:bat[:dbl], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-Overloaded range join operation
-generator
-join
-pattern generator.join(X_0:bat[:flt], X_1:bat[:flt], X_2:bat[:flt], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:int], X_1:bat[:int], X_2:bat[:int], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:lng], X_1:bat[:lng], X_2:bat[:lng], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
-join
-pattern generator.join(X_0:bat[:sht], X_1:bat[:sht], X_2:bat[:sht], X_3:bit, 
X_4:bit) (X_5:bat[:oid], X_6:bat[:oid])
-VLTgenerator_rangejoin;
-(empty)
-generator
 parameters
 pattern generator.parameters(X_0:bte, X_1:bte):bat[:bte]
 VLTgenerator_noop;
@@ -33619,6 +33589,36 @@ pattern generator.projection(X_0:bat[:oi
 VLTgenerator_projection;
 Overloaded projection operation
 generator
+rangejoin
+pattern g

MonetDB: Aug2024 - Adds test for recursive munions with group-by

2024-06-05 Thread stefanos mavros via checkin-list
Changeset: ba487f6886f1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ba487f6886f1
Modified Files:
sql/test/rel-optimizers/Tests/merge-unions.test
Branch: Aug2024
Log Message:

Adds test for recursive munions with group-by


diffs (29 lines):

diff --git a/sql/test/rel-optimizers/Tests/merge-unions.test 
b/sql/test/rel-optimizers/Tests/merge-unions.test
--- a/sql/test/rel-optimizers/Tests/merge-unions.test
+++ b/sql/test/rel-optimizers/Tests/merge-unions.test
@@ -257,3 +257,25 @@ 2
 5
 1
 
+query T nosort
+plan select n, count(n) from f_merge_rec group by n 
+
+project (
+| group by (
+| | munion (
+| | | group by (
+| | | | table("sys"."f1") [ "f1"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ],
+| | | group by (
+| | | | table("sys"."f2") [ "f2"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ],
+| | | group by (
+| | | | table("sys"."f3") [ "f3"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ],
+| | | group by (
+| | | | table("sys"."f4") [ "f4"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ]
+| | ) [ "f_merge_rec"."n", "%1"."%1" NOT NULL ]
+| ) [ "f_merge_rec"."n" ] [ "f_merge_rec"."n", "sys"."sum" no nil ("%1"."%1" 
NOT NULL) NOT NULL as "%1"."%1" ]
+) [ "f_merge_rec"."n" UNIQUE, "%1"."%1" NOT NULL ]
+
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: default - Merge with Aug2024 branch.

2024-06-05 Thread Sjoerd Mullender via checkin-list
Changeset: fb6bc35c16a9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fb6bc35c16a9
Modified Files:
sql/test/rel-optimizers/Tests/merge-unions.test
Branch: default
Log Message:

Merge with Aug2024 branch.


diffs (78 lines):

diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -4639,6 +4639,8 @@ stmt_has_null(stmt *s)
case st_uselect2:
case st_atom:
return 0;
+   case st_alias:
+   return stmt_has_null(s->op1);
case st_join:
return stmt_has_null(s->op2);
case st_bat:
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -3440,18 +3440,26 @@ rel_push_project_down_union(visitor *v, 
 static inline sql_rel *
 rel_merge_unions(visitor *v, sql_rel *rel)
 {
-   (void)v;
+   /* stacked munion flattening e.g.
+* munion( munion(a, b, c), munion(d, e)) => munion(a,b,c,d,e)
+*/
if (rel && is_munion(rel->op)) {
list *l = rel->l;
for(node *n = l->h; n; ) {
node *next = n->next;
-   sql_rel *i = n->data;
-   if (is_munion(i->op)) {
-   i = rel_dup(i);
+   sql_rel *oc = n->data;
+   sql_rel *c = oc;
+
+   /* acount for any group-bys pushed down between stacked 
munions */
+   if (oc->op == op_groupby)
+   c = oc->l;
+
+   if (is_munion(c->op)) {
+   c = rel_dup(c);
list_remove_node(l, NULL, n);
-   l = list_merge(l, i->l, (fdup)NULL);
-   i->l = NULL;
-   rel_destroy(i);
+   l = list_merge(l, c->l, (fdup)NULL);
+   c->l = NULL;
+   rel_destroy(oc);
if (!next)
next = l->h;
v->changes++;
diff --git a/sql/test/rel-optimizers/Tests/merge-unions.test 
b/sql/test/rel-optimizers/Tests/merge-unions.test
--- a/sql/test/rel-optimizers/Tests/merge-unions.test
+++ b/sql/test/rel-optimizers/Tests/merge-unions.test
@@ -257,3 +257,25 @@ 2
 5
 1
 
+query T nosort
+plan select n, count(n) from f_merge_rec group by n 
+
+project (
+| group by (
+| | munion (
+| | | group by (
+| | | | table("sys"."f1") [ "f1"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ],
+| | | group by (
+| | | | table("sys"."f2") [ "f2"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ],
+| | | group by (
+| | | | table("sys"."f3") [ "f3"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ],
+| | | group by (
+| | | | table("sys"."f4") [ "f4"."n" UNIQUE as "f_merge_rec"."n" ]
+| | | ) [ "f_merge_rec"."n" UNIQUE ] [ "f_merge_rec"."n" UNIQUE, "sys"."count" 
no nil ("f_merge_rec"."n" UNIQUE) NOT NULL as "%1"."%1" ]
+| | ) [ "f_merge_rec"."n", "%1"."%1" NOT NULL ]
+| ) [ "f_merge_rec"."n" ] [ "f_merge_rec"."n", "sys"."sum" no nil ("%1"."%1" 
NOT NULL) NOT NULL as "%1"."%1" ]
+) [ "f_merge_rec"."n" UNIQUE, "%1"."%1" NOT NULL ]
+
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Aug2024 - A new test program has appeared.

2024-06-05 Thread Sjoerd Mullender via checkin-list
Changeset: cf573882ef1c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cf573882ef1c
Modified Files:
MonetDB.spec
debian/monetdb-client-testing.install
Branch: Aug2024
Log Message:

A new test program has appeared.


diffs (22 lines):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -417,6 +417,7 @@ developer.
 %{_bindir}/arraytest
 %{_bindir}/bincopydata
 %{_bindir}/murltest
+%{_bindir}/odbcconnect
 %{_bindir}/odbcsample1
 %{_bindir}/sample0
 %{_bindir}/sample1
diff --git a/debian/monetdb-client-testing.install 
b/debian/monetdb-client-testing.install
--- a/debian/monetdb-client-testing.install
+++ b/debian/monetdb-client-testing.install
@@ -5,6 +5,7 @@ debian/tmp/usr/bin/ODBCtester usr/bin
 debian/tmp/usr/bin/arraytest usr/bin
 debian/tmp/usr/bin/bincopydata usr/bin
 debian/tmp/usr/bin/murltest usr/bin
+debian/tmp/usr/bin/odbcconnect usr/bin
 debian/tmp/usr/bin/odbcsample1 usr/bin
 debian/tmp/usr/bin/sample0 usr/bin
 debian/tmp/usr/bin/sample1 usr/bin
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Aug2024 - Partial cleanup of munion impl

2024-06-05 Thread stefanos mavros via checkin-list
Changeset: d48550dc5df9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d48550dc5df9
Modified Files:
sql/server/rel_optimize_proj.c
Branch: Aug2024
Log Message:

Partial cleanup of munion impl


diffs (truncated from 645 to 300 lines):

diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -977,7 +977,7 @@ bind_project_reduce_casts(visitor *v, gl
return gp->cnt[op_project] && (flag & project_reduce_casts) ? 
rel_project_reduce_casts : NULL;
 }
 
-
+#if 0
 static sql_rel *
 exp_skip_output_parts(sql_rel *rel)
 {
@@ -988,6 +988,7 @@ exp_skip_output_parts(sql_rel *rel)
}
return rel;
 }
+#endif
 
 static sql_column *
 exp_find_column_( sql_rel *rel, sql_exp *exp, int pnr, sql_rel **bt )
@@ -1085,6 +1086,7 @@ rel_is_join_on_pkey(sql_rel *rel, bool p
return NULL;
 }
 
+#if 0
 /* return true if the given expression is guaranteed to have no rows */
 static int
 exp_is_zero_rows(visitor *v, sql_rel *rel, sql_rel *sel)
@@ -1160,56 +1162,6 @@ exp_is_zero_rows(visitor *v, sql_rel *re
return 0;
 }
 
-/* discard sides of UNION or UNION ALL which cannot produce any rows, as per
-statistics, similarly to the merge table optimizer, e.g.
-   select * from a where x between 1 and 2 union all select * from b where 
x between 1 and 2
--> select * from b where x between 1 and 2   [assuming a has no rows with 
1<=x<=2]
-*/
-static inline sql_rel *
-rel_remove_union_partitions(visitor *v, sql_rel *rel)
-{
-   if (!is_union(rel->op) || rel_is_ref(rel))
-   return rel;
-   int left_zero_rows = !rel_is_ref(rel->l) && exp_is_zero_rows(v, rel->l, 
NULL);
-   int right_zero_rows = !rel_is_ref(rel->r) && exp_is_zero_rows(v, 
rel->r, NULL);
-
-   if (left_zero_rows && right_zero_rows) {
-   /* generate dummy relation */
-   list *converted = sa_list(v->sql->sa);
-   sql_rel *nrel = rel_project_exp(v->sql, 
exp_atom_bool(v->sql->sa, 1));
-   nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa, 
0));
-   set_processed(nrel);
-
-   for (node *n = rel->exps->h ; n ; n = n->next) {
-   sql_exp *e = n->data, *a = exp_atom(v->sql->sa, 
atom_general(v->sql->sa, exp_subtype(e), NULL, 0));
-   exp_prop_alias(v->sql->sa, a, e);
-   list_append(converted, a);
-   }
-   rel_destroy(rel);
-   v->changes++;
-   return rel_project(v->sql->sa, nrel, converted);
-   } else if (left_zero_rows) {
-   sql_rel *r = rel->r;
-   if (!is_project(r->op))
-   r = rel_project(v->sql->sa, r, rel_projections(v->sql, 
r, NULL, 1, 1));
-   rel_rename_exps(v->sql, rel->exps, r->exps);
-   rel->r = NULL;
-   rel_destroy(rel);
-   v->changes++;
-   return r;
-   } else if (right_zero_rows) {
-   sql_rel *l = rel->l;
-   if (!is_project(l->op))
-   l = rel_project(v->sql->sa, l, rel_projections(v->sql, 
l, NULL, 1, 1));
-   rel_rename_exps(v->sql, rel->exps, l->exps);
-   rel->l = NULL;
-   rel_destroy(rel);
-   v->changes++;
-   return l;
-   }
-   return rel;
-}
-
 static int
 rel_match_projections(sql_rel *l, sql_rel *r)
 {
@@ -1227,6 +1179,7 @@ rel_match_projections(sql_rel *l, sql_re
return 0;
return 1;
 }
+#endif
 
 static int
 exps_has_predicate( list *l )
@@ -1252,55 +1205,6 @@ rel_find_select( sql_rel *r)
return NULL;
 }
 
-static inline sql_rel *
-rel_merge_union(visitor *v, sql_rel *rel)
-{
-   sql_rel *l = rel->l;
-   sql_rel *r = rel->r;
-   sql_rel *ref = NULL;
-
-   if (is_union(rel->op) &&
-   l && is_project(l->op) && !project_unsafe(l,0) &&
-   r && is_project(r->op) && !project_unsafe(r,0) &&
-   (ref = rel_find_ref(l)) != NULL && ref == rel_find_ref(r)) {
-   /* Find selects and try to merge */
-   sql_rel *ls = rel_find_select(l);
-   sql_rel *rs = rel_find_select(r);
-
-   /* can we merge ? */
-   if (!ls || !rs)
-   return rel;
-
-   /* merge any extra projects */
-   if (l->l != ls)
-   rel->l = l = rel_merge_projects_(v, l);
-   if (r->l != rs)
-   rel->r = r = rel_merge_projects_(v, r);
-
-   if (!rel_match_projections(l,r))
-   return rel;
-
-   /* for now only union(project*(select(R),project*(select(R))) */
-   if (ls != l->l || rs != r->l ||
-   ls->l != rs->l || !rel_is_ref(ls->l))
-   return rel;
-
-   if (!ls->exp

MonetDB: Aug2024 - skip mat functions for commonTerms as they ne...

2024-06-05 Thread Niels Nes via checkin-list
Changeset: c35df5669d2a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c35df5669d2a
Modified Files:
monetdb5/optimizer/opt_commonTerms.c
monetdb5/optimizer/opt_support.c
sql/backends/monet5/sql_statement.c
Branch: Aug2024
Log Message:

skip mat functions for commonTerms as they need to work in sets
don't mark mat as Update function as that breaks dataflow
properly set null for Nop's.


diffs (38 lines):

diff --git a/monetdb5/optimizer/opt_commonTerms.c 
b/monetdb5/optimizer/opt_commonTerms.c
--- a/monetdb5/optimizer/opt_commonTerms.c
+++ b/monetdb5/optimizer/opt_commonTerms.c
@@ -144,6 +144,11 @@ OPTcommonTermsImplementation(Client cntx
old[i] = NULL;
continue;
}
+   if (getModuleId(p) == matRef) { /* mat.packIncrement has 
requirement on number of instructions (or that needs an update */
+   pushInstruction(mb, p);
+   old[i] = NULL;
+   continue;
+   }
 
/* from here we have a candidate to look for a match */
 
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -264,8 +264,6 @@ isUpdateInstruction(InstrPtr p)
&& (getFunctionId(p) == appendRef || getFunctionId(p) == 
replaceRef
|| getFunctionId(p) == deleteRef))
return TRUE;
-   if (getModuleId(p) == matRef)
-   return TRUE;
return FALSE;
 }
 
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -4633,7 +4633,6 @@ stmt_has_null(stmt *s)
 {
switch (s->type) {
case st_aggr:
-   case st_Nop:
case st_semijoin:
case st_uselect:
case st_uselect2:
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Aug2024 - merged

2024-06-05 Thread Niels Nes via checkin-list
Changeset: da9db530cfe2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/da9db530cfe2
Branch: Aug2024
Log Message:

merged


diffs (truncated from 730 to 300 lines):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -417,6 +417,7 @@ developer.
 %{_bindir}/arraytest
 %{_bindir}/bincopydata
 %{_bindir}/murltest
+%{_bindir}/odbcconnect
 %{_bindir}/odbcsample1
 %{_bindir}/sample0
 %{_bindir}/sample1
diff --git a/debian/monetdb-client-testing.install 
b/debian/monetdb-client-testing.install
--- a/debian/monetdb-client-testing.install
+++ b/debian/monetdb-client-testing.install
@@ -5,6 +5,7 @@ debian/tmp/usr/bin/ODBCtester usr/bin
 debian/tmp/usr/bin/arraytest usr/bin
 debian/tmp/usr/bin/bincopydata usr/bin
 debian/tmp/usr/bin/murltest usr/bin
+debian/tmp/usr/bin/odbcconnect usr/bin
 debian/tmp/usr/bin/odbcsample1 usr/bin
 debian/tmp/usr/bin/sample0 usr/bin
 debian/tmp/usr/bin/sample1 usr/bin
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -977,7 +977,7 @@ bind_project_reduce_casts(visitor *v, gl
return gp->cnt[op_project] && (flag & project_reduce_casts) ? 
rel_project_reduce_casts : NULL;
 }
 
-
+#if 0
 static sql_rel *
 exp_skip_output_parts(sql_rel *rel)
 {
@@ -988,6 +988,7 @@ exp_skip_output_parts(sql_rel *rel)
}
return rel;
 }
+#endif
 
 static sql_column *
 exp_find_column_( sql_rel *rel, sql_exp *exp, int pnr, sql_rel **bt )
@@ -1085,6 +1086,7 @@ rel_is_join_on_pkey(sql_rel *rel, bool p
return NULL;
 }
 
+#if 0
 /* return true if the given expression is guaranteed to have no rows */
 static int
 exp_is_zero_rows(visitor *v, sql_rel *rel, sql_rel *sel)
@@ -1160,56 +1162,6 @@ exp_is_zero_rows(visitor *v, sql_rel *re
return 0;
 }
 
-/* discard sides of UNION or UNION ALL which cannot produce any rows, as per
-statistics, similarly to the merge table optimizer, e.g.
-   select * from a where x between 1 and 2 union all select * from b where 
x between 1 and 2
--> select * from b where x between 1 and 2   [assuming a has no rows with 
1<=x<=2]
-*/
-static inline sql_rel *
-rel_remove_union_partitions(visitor *v, sql_rel *rel)
-{
-   if (!is_union(rel->op) || rel_is_ref(rel))
-   return rel;
-   int left_zero_rows = !rel_is_ref(rel->l) && exp_is_zero_rows(v, rel->l, 
NULL);
-   int right_zero_rows = !rel_is_ref(rel->r) && exp_is_zero_rows(v, 
rel->r, NULL);
-
-   if (left_zero_rows && right_zero_rows) {
-   /* generate dummy relation */
-   list *converted = sa_list(v->sql->sa);
-   sql_rel *nrel = rel_project_exp(v->sql, 
exp_atom_bool(v->sql->sa, 1));
-   nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa, 
0));
-   set_processed(nrel);
-
-   for (node *n = rel->exps->h ; n ; n = n->next) {
-   sql_exp *e = n->data, *a = exp_atom(v->sql->sa, 
atom_general(v->sql->sa, exp_subtype(e), NULL, 0));
-   exp_prop_alias(v->sql->sa, a, e);
-   list_append(converted, a);
-   }
-   rel_destroy(rel);
-   v->changes++;
-   return rel_project(v->sql->sa, nrel, converted);
-   } else if (left_zero_rows) {
-   sql_rel *r = rel->r;
-   if (!is_project(r->op))
-   r = rel_project(v->sql->sa, r, rel_projections(v->sql, 
r, NULL, 1, 1));
-   rel_rename_exps(v->sql, rel->exps, r->exps);
-   rel->r = NULL;
-   rel_destroy(rel);
-   v->changes++;
-   return r;
-   } else if (right_zero_rows) {
-   sql_rel *l = rel->l;
-   if (!is_project(l->op))
-   l = rel_project(v->sql->sa, l, rel_projections(v->sql, 
l, NULL, 1, 1));
-   rel_rename_exps(v->sql, rel->exps, l->exps);
-   rel->l = NULL;
-   rel_destroy(rel);
-   v->changes++;
-   return l;
-   }
-   return rel;
-}
-
 static int
 rel_match_projections(sql_rel *l, sql_rel *r)
 {
@@ -1227,6 +1179,7 @@ rel_match_projections(sql_rel *l, sql_re
return 0;
return 1;
 }
+#endif
 
 static int
 exps_has_predicate( list *l )
@@ -1252,55 +1205,6 @@ rel_find_select( sql_rel *r)
return NULL;
 }
 
-static inline sql_rel *
-rel_merge_union(visitor *v, sql_rel *rel)
-{
-   sql_rel *l = rel->l;
-   sql_rel *r = rel->r;
-   sql_rel *ref = NULL;
-
-   if (is_union(rel->op) &&
-   l && is_project(l->op) && !project_unsafe(l,0) &&
-   r && is_project(r->op) && !project_unsafe(r,0) &&
-   (ref = rel_find_ref(l)) != NULL && ref == rel_find_ref(r)) {
-   /* Find selects and try to merge */
-   sql_rel *ls = rel_find_select(l);
-   sql_rel *rs = rel_find_select(r);
-
-

MonetDB: Aug2024 - Removes dead code

2024-06-05 Thread stefanos mavros via checkin-list
Changeset: 4c16486c623b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4c16486c623b
Modified Files:
sql/server/rel_optimize_proj.c
Branch: Aug2024
Log Message:

Removes dead code


diffs (125 lines):

diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -977,19 +977,6 @@ bind_project_reduce_casts(visitor *v, gl
return gp->cnt[op_project] && (flag & project_reduce_casts) ? 
rel_project_reduce_casts : NULL;
 }
 
-#if 0
-static sql_rel *
-exp_skip_output_parts(sql_rel *rel)
-{
-   while ((is_topn(rel->op) || is_project(rel->op) || is_sample(rel->op)) 
&& rel->l) {
-   if (is_union(rel->op) || is_munion(rel->op) || 
(is_groupby(rel->op) && list_empty(rel->r)))
-   return rel; /* a group-by with no 
columns is a plain aggregate and hence always returns one row */
-   rel = rel->l;
-   }
-   return rel;
-}
-#endif
-
 static sql_column *
 exp_find_column_( sql_rel *rel, sql_exp *exp, int pnr, sql_rel **bt )
 {
@@ -1086,101 +1073,6 @@ rel_is_join_on_pkey(sql_rel *rel, bool p
return NULL;
 }
 
-#if 0
-/* return true if the given expression is guaranteed to have no rows */
-static int
-exp_is_zero_rows(visitor *v, sql_rel *rel, sql_rel *sel)
-{
-   if (!rel || mvc_highwater(v->sql))
-   return 0;
-   rel = exp_skip_output_parts(rel);
-   if (is_select(rel->op) && rel->l) {
-   sel = rel;
-   rel = exp_skip_output_parts(rel->l);
-   }
-
-   sql_table *t = is_basetable(rel->op) && rel->l ? rel->l : NULL;
-   bool table_readonly = t && isTable(t) && t->access == TABLE_READONLY;
-
-   if (sel && !list_empty(sel->exps) && (v->value_based_opt || 
table_readonly)) {
-   for (node *n = sel->exps->h; n; n = n->next) {
-   sql_exp *e = n->data;
-
-   /* if the expression is false, then the select is empty 
*/
-   if (v->value_based_opt && (exp_is_false(e) || 
exp_is_null(e)))
-   return 1;
-   if (table_readonly && e->type == e_cmp && (e->flag == 
cmp_equal || e->f)) {
-   /* half-ranges are theoretically optimizable 
here, but not implemented */
-   sql_exp *c = e->l;
-   if (c->type == e_column) {
-   sql_exp *l = e->r;
-   sql_exp *h = e->f;
-
-   atom *lval = exp_flatten(v->sql, 
v->value_based_opt, l);
-   atom *hval = h ? exp_flatten(v->sql, 
v->value_based_opt, h) : lval;
-   if (lval && hval) {
-   sql_rel *bt;
-   sql_column *col = 
name_find_column(sel, exp_relname(c), exp_name(c), -2, &bt);
-   void *min = NULL, *max = NULL;
-   atom *amin, *amax;
-   sql_subtype *ct = 
exp_subtype(c);
-
-   if (col
-   && col->t == t
-   && 
sql_trans_ranges(v->sql->session->tr, col, &min, &max)
-   && min && max
-   && (amin = 
atom_general_ptr(v->sql->sa, ct, min)) && (amax = atom_general_ptr(v->sql->sa, 
ct, max))
-   && 
!exp_range_overlap(amin, amax, lval, hval, false, false)) {
-   return 1;
-   }
-   }
-   }
-   }
-   }
-   }
-   if ((is_innerjoin(rel->op) || is_left(rel->op) || is_right(rel->op) || 
is_semi(rel->op)) && !list_empty(rel->exps)) {
-   sql_exp *je;
-
-   /* check non overlaping pk-fk join */
-   if ((je = rel_is_join_on_pkey(rel, true))) {
-   int lpnr = rel_part_nr(rel->l, je);
-
-   if (lpnr >= 0 && !rel_uses_part_nr(rel->r, je, lpnr))
-   return 1;
-   }
-   return (((is_innerjoin(rel->op) || is_left(rel->op) || 
is_semi(rel->op)) && exp_is_zero_rows(v, rel->l, sel)) ||
-   ((is_innerjoin(rel->op) || is_right(rel->op)) && 
exp_is_zero_rows(v, rel->r, sel)));
-   }
-   /* global aggregates always return 1 row */
-   if (is_simple_project(rel->op) || (is_groupby(rel->op) && 
!list_empty(rel->r)) 

MonetDB: Dec2023 - A little cleanup.

2024-06-05 Thread Sjoerd Mullender via checkin-list
Changeset: f3e8eff39fb4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f3e8eff39fb4
Modified Files:
clients/odbc/driver/ODBCError.c
clients/odbc/driver/ODBCError.h
gdk/gdk.h
gdk/gdk_utils.c
monetdb5/modules/mal/txtsim.c
Branch: Dec2023
Log Message:

A little cleanup.


diffs (100 lines):

diff --git a/clients/odbc/driver/ODBCError.c b/clients/odbc/driver/ODBCError.c
--- a/clients/odbc/driver/ODBCError.c
+++ b/clients/odbc/driver/ODBCError.c
@@ -373,27 +373,6 @@ appendODBCError(ODBCError **head, ODBCEr
 }
 
 
-#if 0  /* unused */
-/*
- * Prepends a valid ODBCError object 'err' to the front of the list
- * of a valid ODBCError object 'head' and return the new head.
- *
- * Precondition: both head and err must be valid (non NULL)
- * Returns: the new head (which is the same as the prepended 'err').
- */
-void
-prependODBCError(ODBCError **head, ODBCError *err)
-{
-   assert(head);
-   assert(err);
-   assert(err->next == NULL);
-
-   err->next = *head;
-   *head = err;
-}
-#endif
-
-
 /*
  * Frees the ODBCError object including its linked ODBCError objects.
  *
diff --git a/clients/odbc/driver/ODBCError.h b/clients/odbc/driver/ODBCError.h
--- a/clients/odbc/driver/ODBCError.h
+++ b/clients/odbc/driver/ODBCError.h
@@ -110,18 +110,6 @@ int getErrorRecCount(ODBCError *error);
 void appendODBCError(ODBCError **head, ODBCError *err);
 
 
-#if 0  /* unused */
-/*
- * Prepends a valid ODBCError object 'this' to the front of the list
- * of a valid ODBCError object 'head' and return the new head.
- *
- * Precondition: both head and this must be valid (non NULL)
- * Returns: the new head (which is the same as the prepended 'this').
- */
-void prependODBCError(ODBCError **head, ODBCError *err);
-#endif
-
-
 /*
  * Frees the ODBCError object including its linked ODBCError objects.
  *
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1092,7 +1092,7 @@ bat_iterator_nolock(BAT *b)
 {
/* does not get matched by bat_iterator_end */
if (b) {
-   bool isview = VIEWtparent(b);
+   const bool isview = VIEWtparent(b) != 0;
return (BATiter) {
.b = b,
.h = b->theap,
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -378,19 +378,7 @@ GDKlog(FILE *lockFile, const char *forma
 
 /*
  * @+ Interrupt handling
- * The current version simply catches signals and prints a warning.
- * It should be extended to cope with the specifics of the interrupt
- * received.
  */
-#if 0  /* these are unused */
-static void
-BATSIGignore(int nr)
-{
-   (void) nr;
-   GDKsyserror("! ERROR signal %d caught by thread %zu\n", nr, (size_t) 
MT_getpid());
-}
-#endif
-
 #ifdef WIN32
 static void
 BATSIGabort(int nr)
diff --git a/monetdb5/modules/mal/txtsim.c b/monetdb5/modules/mal/txtsim.c
--- a/monetdb5/modules/mal/txtsim.c
+++ b/monetdb5/modules/mal/txtsim.c
@@ -243,7 +243,7 @@ levenshtein(int *res, const char *x, con
throw(MAL, "txtsim.levenshtein", "Illegal unicode code point");
 }
 
-/* Levenshtein OP but with column externaly allocated */
+/* Levenshtein OP but with column externally allocated */
 static inline int
 levenshtein2(const char *x, const char *y, const size_t xlen, const size_t 
ylen,
 unsigned int *column, const int insdel_cost,
___
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org


MonetDB: Aug2024 - Fix a problem that interrupting a query halfw...

2024-06-05 Thread Sjoerd Mullender via checkin-list
Changeset: 9a93a50925ef for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9a93a50925ef
Modified Files:
common/stream/mapi_stream.c
common/stream/socket_stream.c
monetdb5/mal/mal_client.c
monetdb5/modules/mal/tablet.c
sql/backends/monet5/sql.c
sql/server/sql_scan.c
Branch: Aug2024
Log Message:

Fix a problem that interrupting a query halfway on the client didn't work 
properly.


diffs (185 lines):

diff --git a/common/stream/mapi_stream.c b/common/stream/mapi_stream.c
--- a/common/stream/mapi_stream.c
+++ b/common/stream/mapi_stream.c
@@ -152,8 +152,12 @@ setup_transfer(const char *req, const ch
bool ok;
int oob = 0;
 
-   while (!bs->eof)
-   bstream_next(bs);
+   while (!bs->eof) {
+   if (bstream_next(bs) < 0) {
+   msg = mnstr_peek_error(ws);
+   goto end;
+   }
+   }
stream *rs = bs->s;
assert(isa_block_stream(ws));
assert(isa_block_stream(rs));
diff --git a/common/stream/socket_stream.c b/common/stream/socket_stream.c
--- a/common/stream/socket_stream.c
+++ b/common/stream/socket_stream.c
@@ -126,7 +126,7 @@ socket_read(stream *restrict s, void *re
struct pollfd pfd;
 
pfd = (struct pollfd) {.fd = s->stream_data.s,
-  .events = POLLIN};
+  .events = POLLIN | POLLPRI};
 
ret = poll(&pfd, 1, (int) s->timeout);
if (ret == -1 && errno == EINTR)
@@ -135,6 +135,20 @@ socket_read(stream *restrict s, void *re
mnstr_set_error_errno(s, MNSTR_READ_ERROR, 
"poll error");
return -1;
}
+   if (ret == 1 && pfd.revents & POLLPRI) {
+   char b = 0;
+   switch (recv(s->stream_data.s, &b, 1, MSG_OOB)) 
{
+   case 0:
+   /* unexpectedly didn't receive a byte */
+   continue;
+   case 1:
+   mnstr_set_error(s, MNSTR_INTERRUPT, 
"query abort from client");
+   return -1;
+   case -1:
+   mnstr_set_error_errno(s, 
MNSTR_READ_ERROR, "recv error");
+   return -1;
+   }
+   }
 #else
struct timeval tv;
fd_set fds;
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -107,11 +107,13 @@ MCpushClientInput(Client c, bstream *new
ClientInput *x = (ClientInput *) GDKmalloc(sizeof(ClientInput));
if (x == 0)
return -1;
-   x->fdin = c->fdin;
-   x->yycur = c->yycur;
-   x->listing = c->listing;
-   x->prompt = c->prompt;
-   x->next = c->bak;
+   *x = (ClientInput) {
+   .fdin = c->fdin,
+   .yycur = c->yycur,
+   .listing = c->listing,
+   .prompt = c->prompt,
+   .next = c->bak,
+   };
c->bak = x;
c->fdin = new_input;
c->qryctx.bs = new_input;
@@ -567,7 +569,10 @@ MCreadClient(Client c)
if (!in->mode)  /* read one line at a time in 
line mode */
break;
}
-   if (in->mode) { /* find last new line */
+   if (rd < 0) {
+   /* force end of stream handling below */
+   in->pos = in->len;
+   } else if (in->mode) {  /* find last new line */
char *p = in->buf + in->len - 1;
 
while (p > in->buf && *p != '\n') {
diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -601,8 +601,13 @@ tablet_read_more(READERtask *task)
do {
/* query is not finished ask for more */
/* we need more query text */
-   if (bstream_next(in) < 0)
+   if (bstream_next(in) < 0) {
+   if (mnstr_errnr(in->s) == MNSTR_INTERRUPT) {
+   task->aborted = true;
+   mnstr_clearerr(in->s);
+   }
return false;
+   }
if (in->eof) {
if (bstream_getoob(in)) {
   

MonetDB: Aug2024 - Eliminates op_union creation

2024-06-05 Thread stefanos mavros via checkin-list
Changeset: 7bf2478b3374 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7bf2478b3374
Modified Files:
sql/server/rel_unnest.c
Branch: Aug2024
Log Message:

Eliminates op_union creation


diffs (219 lines):

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
@@ -1497,6 +1497,7 @@ push_up_set(mvc *sql, sql_rel *rel, list
 
/* left of rel should be a set */
if (d && is_distinct_set(sql, d, ad) && s && is_set(s->op)) {
+   assert(s->op != op_union);
sql_rel *sl = s->l, *sr = s->r, *ns;
 
sl = rel_project(sql->sa, rel_dup(sl), 
rel_projections(sql, sl, NULL, 1, 1));
@@ -1557,10 +1558,12 @@ push_up_set(mvc *sql, sql_rel *rel, list
ns->r = rel_project(sql->sa, ns->r, 
rel_projections(sql, ns->r, NULL, 1, 1));
if (is_semi(rel->op)) /* only push left side of 
semi/anti join */
ns->exps = rel_projections(sql, ns->l, NULL, 1, 
1);
-   if (rel->op == op_anti && s->op == op_union)
-   ns->op = op_inter;
-   if (rel->op == op_anti && s->op == op_inter)
-   ns->op = op_union;
+   if (rel->op == op_anti && s->op == op_inter) {
+   list *urs = sa_list(sql->sa);
+   urs = append(urs, ns->l);
+   urs = append(urs, ns->r);
+   rel_inplace_setop_n_ary(sql, ns, urs, 
op_munion, ns->exps);
+   }
rel_destroy(rel);
return ns;
}
@@ -3005,8 +3008,11 @@ rel_union_exps(mvc *sql, sql_exp **l, li
if (!u) {
u = sq;
} else {
-   u = rel_setop(sql->sa, u, sq, op_union);
-   rel_setop_set_exps(sql, u, exps, false);
+   list *urs = sa_list(sql->sa);
+   urs = append(urs, u);
+   urs = append(urs, sq);
+   u = rel_setop_n_ary(sql->sa, urs, op_munion);
+   rel_setop_n_ary_set_exps(sql, u, exps, false);
set_distinct(u);
set_processed(u);
}
@@ -3688,6 +3694,7 @@ rewrite_ifthenelse(visitor *v, sql_rel *
)[not(cond) or cond is null]
  ) [ cols ] */
sql_rel *lsq = NULL, *rsq = NULL, *usq = NULL;
+   list *urs = sa_list(v->sql->sa);
 
if (exp_has_rel(then_exp)) {
lsq = exp_rel_get_rel(v->sql->sa, then_exp);
@@ -3720,8 +3727,10 @@ rewrite_ifthenelse(visitor *v, sql_rel *
set_processed(rsq);
rsq = rel_select(v->sql->sa, rsq, not_cond);
set_processed(rsq);
-   usq = rel_setop(v->sql->sa, lsq, rsq, op_union);
-   rel_setop_set_exps(v->sql, usq, 
append(sa_list(v->sql->sa), exp_ref(v->sql, e)), false);
+   urs = append(urs, lsq);
+   urs = append(urs, rsq);
+   usq = rel_setop_n_ary(v->sql->sa, urs, op_munion);
+   rel_setop_n_ary_set_exps(v->sql, usq, 
append(sa_list(v->sql->sa), exp_ref(v->sql, e)), false);
if (single)
set_single(usq);
set_processed(usq);
@@ -3888,7 +3897,7 @@ rewrite_groupings(visitor *v, sql_rel *r
/* ROLLUP, CUBE, GROUPING SETS cases */
if ((found = find_prop(rel->p, PROP_GROUPINGS))) {
list *sets = (list*) found->value.pval;
-   sql_rel *unions = NULL;
+   list *grpr = sa_list(v->sql->sa);
 
rel->p = prop_remove(rel->p, found); /* remove property 
*/
for (node *n = sets->h ; n ; n = n->next) {
@@ -3980,27 +3989,20 @@ rewrite_groupings(visitor *v, sql_rel *r
}
nrel = rel_project(v->sql->sa, nrel, pexps);
set_processed(nrel);
-
-   if (!unions)
-   unions = nrel;
-   else {
-   unions = rel_setop(v->sql->sa, unions, 
nrel, op_union);
-   rel_setop_set_exps(v->sql, unions, 
rel_projections(v->sql, rel, NULL, 1, 1), false);
-   set_processed(unions);
-   }
-   if (!unions)
-