MonetDB: Dec2023 - move drop bats code into the sys_drop_* funct...
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.
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.
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...
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
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.
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
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.
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.
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
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...
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
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
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.
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...
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
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) -