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

Reply via email to