Changeset: 1c21fb27d410 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1c21fb27d410
Modified Files:
        gdk/gdk_join.c
Branch: default
Log Message:

Merged with Jul2021


diffs (truncated from 973 to 300 lines):

diff --git a/ctest/tools/monetdbe/CMakeLists.txt 
b/ctest/tools/monetdbe/CMakeLists.txt
--- a/ctest/tools/monetdbe/CMakeLists.txt
+++ b/ctest/tools/monetdbe/CMakeLists.txt
@@ -85,7 +85,6 @@ target_link_libraries(example_proxy
   PRIVATE
     monetdb_config_header
     monetdbe)
-add_test(run_example_proxy example_proxy)
 
 if(WITH_CMOCKA)
   add_executable(cmocka_test cmocka_test.c test_helper.c)
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -4016,13 +4016,15 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
        if ((parent = VIEWtparent(l)) != 0) {
                BAT *b = BBPdescriptor(parent);
                if (l->hseqbase == b->hseqbase &&
-                   BATcount(l) == BATcount(b))
+                   BATcount(l) == BATcount(b) &&
+                   ATOMtype(l->ttype) == ATOMtype(b->ttype))
                        l = b;
        }
        if ((parent = VIEWtparent(r)) != 0) {
                BAT *b = BBPdescriptor(parent);
                if (r->hseqbase == b->hseqbase &&
-                   BATcount(r) == BATcount(b))
+                   BATcount(r) == BATcount(b) &&
+                   ATOMtype(r->ttype) == ATOMtype(b->ttype))
                        r = b;
        }
 
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -45,6 +45,7 @@ project1_##TYPE(BAT *restrict bn, BAT *r
                for (lo = 0, hi = BATcount(l); lo < hi; lo++)           \
                        bt[lo] = r1t[lo];                               \
        } else {                                                        \
+               assert(l->ttype);\
                const oid *restrict ot = (const oid *) Tloc(l, 0);      \
                for (lo = 0, hi = BATcount(l); lo < hi; lo++) {         \
                        oid o = ot[lo];                                 \
@@ -85,7 +86,8 @@ project_##TYPE(BAT *restrict bn, BAT *re
        oid r1seq, r1end;                                               \
        oid r2seq, r2end;                                               \
                                                                        \
-       if ((!ci || ci->tpe == cand_dense) && l->tnonil && !r2)         \
+       if ((!ci || (ci->tpe == cand_dense && BATtdense(l))) && \
+            l->tnonil && r1->ttype && !BATtdense(r1) && !r2) \
                return project1_##TYPE(bn, l, r1);                      \
        MT_thread_setalgorithm(__func__);                               \
        r1t = (const TYPE *) Tloc(r1, 0);                               \
@@ -173,7 +175,7 @@ project_oid(BAT *restrict bn, BAT *restr
        const oid *restrict r2t = NULL;
        struct canditer r1ci = {0}, r2ci = {0};
 
-       if ((!lci || lci->tpe == cand_dense) && r1->ttype && !BATtdense(r1) && 
!r2) {
+       if ((!lci || (lci->tpe == cand_dense && BATtdense(l))) && r1->ttype && 
!BATtdense(r1) && !r2) {
                if (sizeof(oid) == sizeof(lng))
                        return project1_lng(bn, l, r1);
                else
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -94,10 +94,13 @@ OPTmitosisImplementation(Client cntxt, M
                }
 
                /* locate the largest non-partitioned table */
-               if (getModuleId(p) != sqlRef || (getFunctionId(p) != bindRef && 
getFunctionId(p) != bindidxRef))
+               if (getModuleId(p) != sqlRef ||
+                               (getFunctionId(p) != bindRef &&
+                                getFunctionId(p) != bindidxRef &&
+                                getFunctionId(p) != tidRef))
                        continue;
                /* don't split insert BATs */
-               if (getVarConstant(mb, getArg(p, 5)).val.ival == 1)
+               if (p->argc > 5 && getVarConstant(mb, getArg(p, 5)).val.ival == 
1)
                        continue;
                if (p->argc > 6)
                        continue;  /* already partitioned */
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2778,11 +2778,11 @@ rel2bin_antijoin(backend *be, sql_rel *r
                assert(list_length(mexps) == 1);
                for( en = mexps->h; en; en = en->next ) {
                        sql_exp *e = en->data;
-                       stmt *ls = exp_bin(be, e->l, left, right, NULL, NULL, 
NULL, NULL, 0, 1, 0), *rs;
+                       stmt *ls = exp_bin(be, e->l, left, right, NULL, NULL, 
NULL, NULL, 1, 0, 0), *rs;
                        if (!ls)
                                return NULL;
 
-                       if (!(rs = exp_bin(be, e->r, left, right, NULL, NULL, 
NULL, NULL, 0, 1, 0)))
+                       if (!(rs = exp_bin(be, e->r, left, right, NULL, NULL, 
NULL, NULL, 1, 0, 0)))
                                return NULL;
 
                        if (ls->nrcols == 0)
@@ -2881,14 +2881,14 @@ rel2bin_semijoin(backend *be, sql_rel *r
 
                                if (equality_only) {
                                        int oldvtop = be->mb->vtop, oldstop = 
be->mb->stop, oldvid = be->mb->vid, swap = 0;
-                                       stmt *r, *l = exp_bin(be, e->l, left, 
NULL, NULL, NULL, NULL, NULL, 0, 1, 0);
+                                       stmt *r, *l = exp_bin(be, e->l, left, 
NULL, NULL, NULL, NULL, NULL, 1, 0, 0);
 
                                        if (!l) {
                                                swap = 1;
                                                clean_mal_statements(be, 
oldstop, oldvtop, oldvid);
-                                               l = exp_bin(be, e->l, right, 
NULL, NULL, NULL, NULL, NULL, 0, 1, 0);
+                                               l = exp_bin(be, e->l, right, 
NULL, NULL, NULL, NULL, NULL, 1, 0, 0);
                                        }
-                                       r = exp_bin(be, e->r, left, right, 
NULL, NULL, NULL, NULL, 0, 1, 0);
+                                       r = exp_bin(be, e->r, left, right, 
NULL, NULL, NULL, NULL, 1, 0, 0);
 
                                        if (swap) {
                                                stmt *t = l;
@@ -6428,7 +6428,7 @@ output_rel_bin(backend *be, sql_rel *rel
 
        be->join_idx = 0;
        be->rowcount = 0;
-       be->silent = GDKembedded() || !top;
+       be->silent = !top;
 
        s = subrel_bin(be, rel, refs);
        s = subrel_project(be, s, refs, rel);
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -79,7 +79,7 @@ SQLgetSpace(mvc *m, MalBlkPtr mb, int pr
                        if (!t || isDeclaredTable(t))
                                continue;
                        c = mvc_bind_column(m, t, cname);
-                       if (!s)
+                       if (!c)
                                continue;
 
                        /* we have to sum the cost of all three components of a 
BAT */
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
@@ -6124,9 +6124,6 @@ split_aggr_and_project(mvc *sql, list *a
                list_split_aggr_and_project(sql, aexps, e->l);
                return e;
        case e_atom:
-               if (e->f)
-                       list_split_aggr_and_project(sql, aexps, e->f);
-               return e;
        case e_column: /* constants and columns shouldn't be rewriten */
        case e_psm:
                return e;
@@ -7879,9 +7876,6 @@ split_exp(mvc *sql, sql_exp *e, sql_rel 
                }
                return e;
        case e_atom:
-               if (e->f)
-                       split_exps(sql, e->f, rel);
-               return e;
        case e_psm:
                return e;
        }
@@ -8000,9 +7994,6 @@ select_split_exp(mvc *sql, sql_exp *e, s
                }
                return e;
        case e_atom:
-               if (e->f)
-                       select_split_exp(sql, e->f, rel);
-               return e;
        case e_psm:
                return e;
        }
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
@@ -1937,7 +1937,7 @@ rel_in_value_exp(sql_query *query, sql_r
        dnode *n = dl->h->next, *dn = NULL;
        sql_exp *le = NULL, *re, *e = NULL;
        list *ll = sa_list(sql->sa);
-       int is_tuple = 0;
+       int is_tuple = 0, add_select = 0;
 
        /* complex case */
        if (dl->h->type == type_list) { /* (a,b..) in (.. ) */
@@ -1987,12 +1987,16 @@ rel_in_value_exp(sql_query *query, sql_r
                                re = exp_rel_label(sql, re);
                        } else if (exp_is_rel(re)) {
                                sql_rel *r = exp_rel_get_rel(sql->sa, re);
+                               add_select = 1;
                                if (is_project(r->op) && is_project_true(r->l) 
&& list_length(r->exps) == 1)
                                        re = r->exps->h->data;
                        }
                        append(vals, re);
                }
 
+               if (list_empty(vals))
+                       return sql_error(sql, 02, SQLSTATE(42000) "The list of 
values for IN operator cannot be empty");
+
                values = exp_values(sql->sa, vals);
                exp_label(sql->sa, values, ++sql->label);
                if (is_tuple) {
@@ -2002,13 +2006,27 @@ rel_in_value_exp(sql_query *query, sql_r
                                return NULL;
                        le->f = nvalues;
                } else { /* if it's not a tuple, enforce coersion on the type 
for every element on the list */
-                       sql_subtype super;
-
-                       if (!(values = exp_values_set_supertype(sql, values, 
exp_subtype(le))))
-                               return NULL;
-                       if (rel_binop_check_types(sql, rel ? *rel : NULL, le, 
values, 0) < 0)
-                               return NULL;
-                       supertype(&super, exp_subtype(values), exp_subtype(le));
+                       sql_subtype super, *le_tpe = exp_subtype(le), 
*values_tpe = NULL;
+
+                       for (node *m = vals->h; m; m = m->next) { /* first get 
values supertype */
+                               sql_exp *e = m->data;
+                               sql_subtype *tpe = exp_subtype(e);
+
+                               if (values_tpe && tpe) {
+                                       supertype(&super, values_tpe, tpe);
+                                       *values_tpe = super;
+                               } else if (!values_tpe && tpe) {
+                                       super = *tpe;
+                                       values_tpe = &super;
+                               }
+                       }
+                       if (!le_tpe)
+                               le_tpe = values_tpe;
+                       if (!values_tpe)
+                               values_tpe = le_tpe;
+                       if (!le_tpe || !values_tpe)
+                               return sql_error(sql, 01, SQLSTATE(42000) "For 
the IN operator, both sides must have a type defined");
+                       supertype(&super, values_tpe, le_tpe); /* compute 
supertype */
 
                        /* on selection/join cases we can generate cmp 
expressions instead of anyequal for trivial cases */
                        if ((is_sql_where(f) || is_sql_having(f)) && 
!is_sql_farg(f) && !exp_has_rel(le) && exps_are_atoms(vals)) {
@@ -2026,11 +2044,20 @@ rel_in_value_exp(sql_query *query, sql_r
                                        e = exp_in(sql->sa, le, vals, 
(sc->token == SQL_IN) ? cmp_in : cmp_notin);
                                }
                        }
-                       if (!e && (le = exp_check_type(sql, &super, rel ? *rel 
: NULL, le, type_equal)) == NULL)
-                               return NULL;
-               }
-               if (!e)
+                       if (!e) { /* after computing supertype, check types for 
each IN value */
+                               for (node *n = vals->h ; n ; n = n->next)
+                                       if ((n->data = exp_check_type(sql, 
&super, rel ? *rel : NULL, n->data, type_equal)) == NULL)
+                                               return NULL;
+                               values->tpe = *exp_subtype(vals->h->data);
+                               if (!(le = exp_check_type(sql, &super, rel ? 
*rel : NULL, le, type_equal)))
+                                       return NULL;
+                       }
+               }
+               if (!e) {
+                       if (add_select && rel && *rel && 
!is_project((*rel)->op) && !is_select((*rel)->op))
+                               *rel = rel_select(sql->sa, *rel, NULL);
                        e = exp_in_func(sql, le, values, (sc->token == SQL_IN), 
is_tuple);
+               }
        }
        return e;
 }
@@ -2444,7 +2471,7 @@ rel_logical_value_exp(sql_query *query, 
                        return NULL;
                if (ek.card <= card_set && is_project(sq->op) && 
list_length(sq->exps) > 1)
                        return sql_error(sql, 02, SQLSTATE(42000) "SELECT: 
subquery must return only one column");
-               if (ek.card < card_set && sq->card >= CARD_MULTI && 
(is_sql_sel(f) | is_sql_having(f) | ( is_sql_where(f) && rel && (!*rel || 
is_basetable((*rel)->op) || is_simple_project((*rel)->op) || 
is_joinop((*rel)->op)))))
+               if (ek.card < card_set && sq->card >= CARD_AGGR && 
(is_sql_sel(f) | is_sql_having(f) | ( is_sql_where(f) && rel && (!*rel || 
is_basetable((*rel)->op) || is_simple_project((*rel)->op) || 
is_joinop((*rel)->op)))))
                        sq = rel_zero_or_one(sql, sq, ek);
                return exp_rel(sql, sq);
        }
@@ -6064,7 +6091,7 @@ rel_subquery(sql_query *query, sql_rel *
        rel = rel_query(query, rel, sq, toplevel, ek);
        stack_pop_frame(sql);
 
-       if (rel && ek.type == type_relation && ek.card < card_set && rel->card 
>= CARD_MULTI)
+       if (rel && ek.type == type_relation && ek.card < card_set && rel->card 
>= CARD_AGGR)
                return rel_zero_or_one(sql, rel, ek);
        return rel;
 }
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
@@ -2129,13 +2129,24 @@ rewrite_or_exp(visitor *v, sql_rel *rel)
                                                rel = l;
                                        }
                                        rel = rel_add_identity(v->sql, rel, 
&id); /* identity function needed */
-                                       (void) id;
-                                       assert(id);
+                                       const char *idrname = exp_relname(id), 
*idname = exp_name(id);
+                                       list *tids = NULL, *exps = 
rel_projections(v->sql, rel, NULL, 1, 1);
+
+                                       for( node *n = exps->h ; n ; ) {
+                                               node *next = n->next;
+                                               sql_exp *e = n->data;
+
+                                               if (strcmp(exp_name(e), TID) == 
0) { /* remove TID references and later restore them with identity function 
references */
+                                                       if (!tids)
+                                                               tids = 
sa_list(v->sql->sa);
+                                                       list_append(tids, 
exp_alias(v->sql->sa, exp_relname(e), TID, idrname, idname, 
sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
+                                                       list_remove_node(exps, 
NULL, n);
+                                               }
+                                               n = next;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to