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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list