Changeset: 569e990addc1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/569e990addc1
Modified Files:
        gdk/gdk_batop.c
        gdk/gdk_heap.c
        sql/server/rel_select.c
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
        sql/test/BugTracker-2022/Tests/All
        sql/test/miscellaneous/Tests/simple_selects.test
Branch: default
Log Message:

Merged with Jan2022


diffs (truncated from 442 to 300 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -349,8 +349,6 @@ append_varsized_bat(BAT *b, BATiter *ni,
                /* if b is still empty, in the transient farm, and n
                 * is read-only, we replace b's vheap with a reference
                 * to n's */
-               /* make sure locking happens in a predictable order:
-                * lowest id first */
                MT_lock_set(&b->theaplock);
                if (b->tvheap->parentid != b->batCacheid)
                        BBPunshare(b->tvheap->parentid);
@@ -417,6 +415,30 @@ append_varsized_bat(BAT *b, BATiter *ni,
                MT_lock_unset(&b->theaplock);
                HEAPdecref(oh, false);
        }
+       if (BATcount(b) == 0 && BATatoms[b->ttype].atomFix == NULL &&
+           ci->tpe == cand_dense && ci->ncand == ni->count) {
+               /* just copy the heaps */
+               if (HEAPgrow(&b->theaplock, &b->tvheap, ni->vhfree, false) != 
GDK_SUCCEED)
+                       return GDK_FAIL;
+               memcpy(b->theap->base, ni->base, ni->hfree);
+               memcpy(b->tvheap->base, ni->vh->base, ni->vhfree);
+               b->theap->free = ni->hfree;
+               b->tvheap->free = ni->vhfree;
+               BATsetcount(b, ni->count);
+               b->tnil = ni->nil;
+               b->tnonil = ni->nonil;
+               b->tsorted = ni->sorted;
+               b->tnosorted = ni->b->tnosorted;
+               b->trevsorted = ni->revsorted;
+               b->tnorevsorted = ni->b->tnorevsorted;
+               b->tkey = ni->key;
+               b->tnokey[0] = ni->b->tnokey[0];
+               b->tnokey[1] = ni->b->tnokey[1];
+               b->tminpos = ni->minpos;
+               b->tmaxpos = ni->maxpos;
+               b->tunique_est = ni->unique_est;
+               return GDK_SUCCEED;
+       }
        /* copy data from n to b */
        r = BATcount(b);
        MT_rwlock_wrlock(&b->thashlock);
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -1098,7 +1098,11 @@ HEAP_malloc(BAT *b, size_t nbytes)
                size_t newsize;
 
                assert(heap->free + MAX(heap->free, nbytes) <= VAR_MAX);
+#if SIZEOF_SIZE_T == 4
                newsize = MIN(heap->free, (size_t) 1 << 20);
+#else
+               newsize = MIN(heap->free, (size_t) 1 << 30);
+#endif
                newsize = (size_t) roundup_8(heap->free + MAX(newsize, nbytes));
                assert(heap->free <= VAR_MAX);
                block = (size_t) heap->free;    /* current end-of-heap */
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1141,9 +1141,14 @@ rel_column_ref(sql_query *query, sql_rel
                if (!exp && inner)
                        if (!(exp = rel_bind_column(sql, inner, name, f, 0)) && 
sql->session->status == -ERR_AMBIGUOUS)
                                return NULL;
-               if (!exp && inner && is_sql_aggr(f) && is_groupby(inner->op))
-                       if (!(exp = rel_bind_column(sql, inner->l, name, f, 0)) 
&& sql->session->status == -ERR_AMBIGUOUS)
+               if (!exp && inner && is_sql_aggr(f) && (is_groupby(inner->op) 
|| is_select(inner->op))) {
+                       /* if inner is selection, ie having clause, get the 
left relation to reach group by */
+                       sql_rel *gp = inner;
+                       while (gp && is_select(gp->op))
+                               gp = gp->l;
+                       if (gp && gp->l && !(exp = rel_bind_column(sql, gp->l, 
name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS)
                                return NULL;
+               }
                if (!exp && query && query_has_outer(query)) {
                        int i;
 
@@ -1226,9 +1231,14 @@ rel_column_ref(sql_query *query, sql_rel
                if (!exp && rel && inner)
                        if (!(exp = rel_bind_column2(sql, inner, tname, cname, 
f)) && sql->session->status == -ERR_AMBIGUOUS)
                                return NULL;
-               if (!exp && inner && is_sql_aggr(f) && is_groupby(inner->op))
-                       if (!(exp = rel_bind_column2(sql, inner->l, tname, 
cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
+               if (!exp && inner && is_sql_aggr(f) && (is_groupby(inner->op) 
|| is_select(inner->op))) {
+                       /* if inner is selection, ie having clause, get the 
left relation to reach group by */
+                       sql_rel *gp = inner;
+                       while (gp && is_select(gp->op))
+                               gp = gp->l;
+                       if (gp && gp->l && !(exp = rel_bind_column2(sql, gp->l, 
tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
                                return NULL;
+               }
                if (!exp && query && query_has_outer(query)) {
                        int i;
 
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
@@ -2937,7 +2937,7 @@ create_col(sql_trans *tr, sql_column *c)
 
                /* alter ? */
                if (ol_first_node(c->t->columns) && (fc = 
ol_first_node(c->t->columns)->data) != NULL) {
-                       storage *s = ATOMIC_PTR_GET(&fc->t->data);
+                       storage *s = tab_timestamp_storage(tr, fc->t);
                        cnt = segs_end(s->segs, tr, c->t);
                }
                if (cnt && fc != c) {
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3031,9 +3031,8 @@ part_dup(sql_trans *tr, sql_part *op, sq
                        list_append(p->part.values, nextv);
                }
        }
-       if ((res = os_add(mt->s->parts, tr, p->base.name, dup_base(&p->base)))) 
{
-               return res;
-       }
+       if (isGlobal(mt) && (res = os_add(mt->s->parts, tr, p->base.name, 
dup_base(&p->base))))
+               return res;
        *pres = p;
        return res;
 }
@@ -3066,9 +3065,8 @@ trigger_dup(sql_trans *tr, sql_trigger *
 
                list_append(nt->columns, kc_dup(tr, okc, t));
        }
-       if (isGlobal(t) && (res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base)))) {
-               return res;
-       }
+       if (isGlobal(t) && (res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base))))
+               return res;
        *tres = nt;
        return res;
 }
@@ -3402,7 +3400,7 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        if ((res = ol_add(t->idxs, &ni->base)))
                return res;
 
-       if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base))))
+       if (isGlobal(t) && (res = os_add(t->s->idxs, tr, ni->base.name, 
dup_base(&ni->base))))
                return res;
        if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
functions depending on the table */
                return res;
@@ -3473,7 +3471,7 @@ sql_trans_copy_trigger( sql_trans *tr, s
        if ((res = ol_add(t->triggers, &nt->base)))
                return res;
 
-       if ((res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base))))
+       if (isGlobal(t) && (res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base))))
                return res;
        if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
functions depending on the table */
                return res;
@@ -4249,7 +4247,7 @@ sys_drop_idx(sql_trans *tr, sql_idx * i,
                        return res;
        }
 
-       /* remove idx from schema and table*/
+       /* remove idx from schema and table */
        if (isGlobal(i->t))
                if ((res = os_del(i->t->s->idxs, tr, i->base.name, 
dup_base(&i->base))))
                        return res;
@@ -6546,9 +6544,8 @@ sql_trans_drop_key(sql_trans *tr, sql_sc
 
        if (drop_action == DROP_CASCADE_START || drop_action == DROP_CASCADE) {
                sqlid *local_id = MNEW(sqlid);
-               if (!local_id) {
+               if (!local_id)
                        return -1;
-               }
 
                if (!tr->dropped) {
                        tr->dropped = list_create((fdestroy) &id_destroy);
@@ -6566,7 +6563,7 @@ sql_trans_drop_key(sql_trans *tr, sql_sc
        if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
functions depending on the table */
                return res;
 
-       if (!isTempTable(k->t) && (res = sys_drop_key(tr, k, drop_action)))
+       if ((res = sys_drop_key(tr, k, drop_action)))
                return res;
 
        /*Clean the key from the keys*/
@@ -6656,9 +6653,8 @@ sql_trans_drop_idx(sql_trans *tr, sql_sc
 
        if (drop_action == DROP_CASCADE_START || drop_action == DROP_CASCADE) {
                sqlid *local_id = MNEW(sqlid);
-               if (!local_id) {
+               if (!local_id)
                        return -1;
-               }
 
                if (!tr->dropped) {
                        tr->dropped = list_create((fdestroy) &id_destroy);
@@ -6671,7 +6667,7 @@ sql_trans_drop_idx(sql_trans *tr, sql_sc
                list_append(tr->dropped, local_id);
        }
 
-       if (!isTempTable(i->t) && (res = sys_drop_idx(tr, i, drop_action)))
+       if ((res = sys_drop_idx(tr, i, drop_action)))
                return res;
        if ((res = store_reset_sql_functions(tr, i->t->base.id))) /* reset sql 
functions depending on the table */
                return res;
diff --git a/sql/test/BugTracker-2022/Tests/All 
b/sql/test/BugTracker-2022/Tests/All
--- a/sql/test/BugTracker-2022/Tests/All
+++ b/sql/test/BugTracker-2022/Tests/All
@@ -6,3 +6,4 @@ HAVE_LIBPY3?python-udf-inside-udf.Bug-72
 empty-MAL.Bug-7259
 pkey-restart.Bug-7263
 delete-update.Bug-7267
+having-clauses.Bug-7278
diff --git a/sql/test/BugTracker-2022/Tests/having-clauses.Bug-7278.test 
b/sql/test/BugTracker-2022/Tests/having-clauses.Bug-7278.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2022/Tests/having-clauses.Bug-7278.test
@@ -0,0 +1,176 @@
+statement ok
+START TRANSACTION
+
+statement ok
+create table x (x int, y int, z int)
+
+statement ok rowcount 3
+insert into x values (1,1,1),(2,2,2),(3,3,3)
+
+query I rowsort
+select y from x group by y having count(z) > 1 and count(x) > 1
+----
+
+query I nosort
+select y from x group by y order by count(z) > 1 and count(x) > 1
+----
+1
+2
+3
+
+query I nosort
+select y from x group by y order by count(z), count(x)
+----
+1
+2
+3
+
+query I nosort
+select y from x group by y having count(z) > 1 and count(x) > 1 order by 
count(z), count(x)
+----
+
+query I nosort
+select y from x group by y having count(z) > 1 and count(x) > 1 order by 
count(z) > 1 and count(x) > 1
+----
+
+query I rowsort
+select count(y) from x group by y having count(z) > 1 and count(x) > 1
+----
+
+query I nosort
+select count(y) from x group by y order by count(z) > 1 and count(x) > 1
+----
+1
+1
+1
+
+query I nosort
+select count(y) from x group by y order by count(z), count(x)
+----
+1
+1
+1
+
+query I nosort
+select count(y) from x group by y having count(z) > 1 and count(x) > 1 order 
by count(z), count(x)
+----
+
+query I nosort
+select count(y) from x group by y having count(z) > 1 and count(x) > 1 order 
by count(z) > 1 and count(x) > 1
+----
+
+query I rowsort
+select count(x) from x group by y having count(z) > 1 and count(x) > 1
+----
+
+query II nosort
+select count(x), count(z) from x group by y order by count(z) > 1 and count(x) 
> 1
+----
+1
+1
+1
+1
+1
+1
+
+query II nosort
+select count(x), count(z) from x group by y order by count(z), count(x)
+----
+1
+1
+1
+1
+1
+1
+
+query II nosort
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to