Changeset: 29bba680f7a3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/29bba680f7a3 Modified Files: sql/storage/bat/bat_storage.c sql/storage/store.c Branch: iso Log Message:
Merged with Jul2021 diffs (246 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 @@ -6119,12 +6119,10 @@ rel_groupby_distinct(visitor *v, sql_rel list_append(exps, darg); darg = exp_ref(v->sql, darg); arg->h->data = darg; - if (!exp_match_list(ngbe, gbe)) { /* if the grouping columns match don't create an extra grouping */ - l = rel->l = rel_groupby(v->sql, rel->l, gbe); - l->exps = exps; - set_processed(l); - rel->r = ngbe; - } + l = rel->l = rel_groupby(v->sql, rel->l, gbe); + l->exps = exps; + set_processed(l); + rel->r = ngbe; rel->exps = nexps; set_nodistinct(distinct); append(nexps, distinct); diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -818,11 +818,15 @@ rel_create_func(sql_query *query, dlist int instantiate = (sql->emode == m_instantiate); int deps = (sql->emode == m_deps); int create = (!instantiate && !deps); - bit vararg = FALSE; + bit vararg = FALSE, union_err = 0; char *F = NULL, *fn = NULL, is_func; - if (res && res->token == SQL_TABLE) - type = F_UNION; + if (res && res->token == SQL_TABLE) { + if (type == F_FUNC) + type = F_UNION; + else + union_err = 1; + } FUNC_TYPE_STR(type, F, fn) @@ -832,7 +836,9 @@ rel_create_func(sql_query *query, dlist if (create && store_readonly(sql->session->tr->store)) return sql_error(sql, 06, SQLSTATE(42000) "Schema statements cannot be executed on a readonly database."); - if (res && type == F_PROC) + if (union_err) + return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %ss cannot return tables", F, fn); + else if (res && type == F_PROC) return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: procedures cannot have return parameters", F); else if (res && (type == F_FILT || type == F_LOADER)) return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: %s functions don't have to specify a return type", F, fn); 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 @@ -595,7 +595,9 @@ count_col(sql_trans *tr, sql_column *c, return d->segs->t?d->segs->t->end:0; if (access == 10) { size_t cnt = segs_end(d->segs, tr, c->t); + lock_table(tr->store, c->t->base.id); cnt -= count_deletes_in_range(d->segs->h, tr, 0, cnt); + unlock_table(tr->store, c->t->base.id); return cnt; } return segs_end(d->segs, tr, c->t); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3458,22 +3458,31 @@ sql_trans_commit(sql_trans *tr) { int ok = LOG_OK; sqlstore *store = tr->store; - - MT_lock_set(&store->commit); - store_lock(store); - ulng oldest = store_oldest(store); - - if (tr->predicates && (ok = sql_trans_valid(tr)) != LOG_OK) { - sql_trans_rollback(tr, 1); + bool locked = false; + + if (!list_empty(tr->predicates)) { + MT_lock_set(&store->commit); + store_lock(store); + locked = true; + + if ((ok = sql_trans_valid(tr)) != LOG_OK) { + sql_trans_rollback(tr, 1); + store_unlock(store); + MT_lock_unset(&store->commit); + return ok; + } + } + + if (!list_empty(tr->changes)) { + if (!locked) { + MT_lock_set(&store->commit); + store_lock(store); + locked = true; + } + ulng oldest = store_oldest(store); + store_pending_changes(store, oldest); + oldest = store_oldest_pending(store); store_unlock(store); - MT_lock_unset(&store->commit); - return ok; - } - - store_pending_changes(store, oldest); - oldest = store_oldest_pending(store); - store_unlock(store); - if (tr->changes) { ulng commit_ts = 0; int min_changes = GDKdebug & FORCEMITOMASK ? 5 : 100000; int flush = (tr->logchanges > min_changes && !store->changes); @@ -3534,9 +3543,11 @@ sql_trans_commit(sql_trans *tr) list_destroy(tr->changes); tr->changes = NULL; tr->ts = commit_ts; + } + if (locked) { store_unlock(store); - } - MT_lock_unset(&store->commit); + MT_lock_unset(&store->commit); + } /* drop local temp tables with commit action CA_DROP, after cleanup */ if (cs_size(&tr->localtmps)) { for(node *n=tr->localtmps.set->h; n; ) { diff --git a/sql/test/BugTracker-2017/Tests/sqlitelogictest-aggregation-having-avg.Bug-6428.test b/sql/test/BugTracker-2017/Tests/sqlitelogictest-aggregation-having-avg.Bug-6428.test --- a/sql/test/BugTracker-2017/Tests/sqlitelogictest-aggregation-having-avg.Bug-6428.test +++ b/sql/test/BugTracker-2017/Tests/sqlitelogictest-aggregation-having-avg.Bug-6428.test @@ -11,9 +11,11 @@ PLAN SELECT - col0 AS col1 FROM tab0 AS project ( | select ( | | group by ( -| | | select ( -| | | | table("sys"."tab0") [ "tab0"."col0" as "cor0"."col0", "tab0"."col1" as "cor0"."col1" ] COUNT -| | | ) [ "cor0"."col0" * = int "NULL" ] +| | | group by ( +| | | | select ( +| | | | | table("sys"."tab0") [ "tab0"."col0" as "cor0"."col0", "tab0"."col1" as "cor0"."col1" ] COUNT +| | | | ) [ "cor0"."col0" * = int "NULL" ] +| | | ) [ "cor0"."col1", "cor0"."col0" ] [ "cor0"."col1", "cor0"."col0" ] | | ) [ "cor0"."col1", "cor0"."col0" ] [ "cor0"."col1", "cor0"."col0", "sys"."avg" no nil ("cor0"."col0") as "%1"."%1" ] | ) [ "sys"."sql_add"(double["sys"."sql_neg"("cor0"."col1")], "%1"."%1") ! * = double "NULL" ] ) [ "sys"."sql_neg"("cor0"."col0") as "col1" ] diff --git a/sql/test/BugTracker-2021/Tests/All b/sql/test/BugTracker-2021/Tests/All --- a/sql/test/BugTracker-2021/Tests/All +++ b/sql/test/BugTracker-2021/Tests/All @@ -15,3 +15,5 @@ WITH-alias-DELETE-1.deletes-wrong-tuples WITH-alias-DELETE-2.deletes-too-many-tuples.Bug-7133 merge-delete.Bug-7136 HAVE_LIBPY3?python-aggregates-void-bat.Bug-7138 +count-distinct.Bug-7141 +HAVE_LIBPY3?aggregates-tables.Bug-7142 diff --git a/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.test b/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/aggregates-tables.Bug-7142.test @@ -0,0 +1,34 @@ +statement ok +START TRANSACTION + +statement error 42000!CREATE AGGREGATE: aggregates cannot return tables +CREATE AGGREGATE linear_least_squares(xg DOUBLE, yg DOUBLE) +RETURNS TABLE (a DOUBLE, b DOUBLE) +LANGUAGE PYTHON { + import numpy as np + # Define an inner function to do the work + def perform_least_squares(x, y): + mx = np.average(x) + my = np.average(y) + N = len(x) + a = (np.dot(x,y) - mx*my)/(np.dot(x,x) - N*mx*mx) + b = (my*np.dot(x,x) - mx*(np.dot(x,y)))/(np.dot(x,x) - N*mx*mx) + return [a, b] + ab = {"a": list(), "b": list()} + try: + groups = np.unique(aggr_group) + for i in range(groups): + a,b = perform_least_squares(xg[aggr_group==groups[i]], yg[aggr_group==groups[i]]) + ab["a"].append(a) + ab["b"].append(b) + except NameError: + a,b = perform_least_squares(xg, yg) + ab["a"].append(a) + ab["b"].append(b) + return ab +} + +statement ok +ROLLBACK + + diff --git a/sql/test/BugTracker-2021/Tests/count-distinct.Bug-7141.test b/sql/test/BugTracker-2021/Tests/count-distinct.Bug-7141.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2021/Tests/count-distinct.Bug-7141.test @@ -0,0 +1,45 @@ +statement ok +START TRANSACTION + +statement ok +create table test ("id" int, "version" int) + +statement ok rowcount 9 +insert into test values(1,1),(1,1),(1,2),(1,2),(2,1),(2,2),(2,2),(3,4),(3,4) + +query I rowsort +SELECT COUNT(distinct "version") FROM test GROUP BY "id", "version" +---- +1 +1 +1 +1 +1 + +query III rowsort +SELECT "id", "version", COUNT(distinct "version") FROM test GROUP BY "id", "version" +---- +1 +1 +1 +1 +2 +1 +2 +1 +1 +2 +2 +1 +3 +4 +1 + +query III rowsort +SELECT "id", "version", COUNT(distinct "version") FROM test GROUP BY "id", "version" HAVING COUNT(distinct "version") > 1 +---- + +statement ok +ROLLBACK + + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list