Changeset: 2abcc9f706f7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2abcc9f706f7
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/test/SQLancer/Tests/sqlancer04.test
Branch: default
Log Message:

Small optimization, when fetching any column from a list of statements, give 
preference to smaller types


diffs (truncated from 449 to 300 lines):

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
@@ -248,15 +248,67 @@ static stmt *create_const_column(backend
        return stmt_append(be, stmt_temp(be, tail_type(val)), val);
 }
 
-static stmt *
-bin_first_column(backend *be, stmt *sub )
+static int
+statment_score(stmt *c)
 {
-       node *n = sub->op4.lval->h;
-       stmt *c = n->data;
-
-       if (c->nrcols == 0)
-               return const_column(be, c);
-       return c;
+       sql_subtype *t = tail_type(c);
+       int score = 0;
+
+       if (c->nrcols != 0) /* no need to create an extra intermediate */
+               score += 200;
+
+       if (!t)
+               return score;
+       switch (ATOMstorage(t->type->localtype)) { /* give preference to 
smaller types */
+               case TYPE_bte:
+                       score += 150 - 8;
+                       break;
+               case TYPE_sht:
+                       score += 150 - 16;
+                       break;
+               case TYPE_int:
+                       score += 150 - 32;
+                       break;
+               case TYPE_void:
+               case TYPE_lng:
+                       score += 150 - 64;
+                       break;
+               case TYPE_uuid:
+#ifdef HAVE_HGE
+               case TYPE_hge:
+#endif
+                       score += 150 - 128;
+                       break;
+               case TYPE_flt:
+                       score += 75 - 24;
+                       break;
+               case TYPE_dbl:
+                       score += 75 - 53;
+                       break;
+               default:
+                       break;
+       }
+       return score;
+}
+
+static stmt *
+bin_find_smallest_column(backend *be, stmt *sub)
+{
+       stmt *res = NULL;
+       int best_score = 0;
+
+       for (node *n = sub->op4.lval->h ; n ; n = n->next) {
+               stmt *c = n->data;
+               int next_score = statment_score(c);
+
+               if (next_score >= best_score) {
+                       res = c;
+                       best_score = next_score;
+               }
+       }
+       if (res->nrcols == 0)
+               return const_column(be, res);
+       return res;
 }
 
 static stmt *
@@ -372,7 +424,7 @@ handle_in_exps(backend *be, sql_exp *ce,
                return NULL;
 
        if (reduce && c->nrcols == 0)
-               c = stmt_const(be, bin_first_column(be, left), c);
+               c = stmt_const(be, bin_find_smallest_column(be, left), c);
 
        if (c->nrcols == 0 || depth || !reduce) {
                sql_subtype *bt = sql_bind_localtype("bit");
@@ -396,7 +448,7 @@ handle_in_exps(backend *be, sql_exp *ce,
                }
                if (sel && !(depth || !reduce))
                        s = stmt_uselect(be,
-                               stmt_const(be, bin_first_column(be, left), s),
+                               stmt_const(be, bin_find_smallest_column(be, 
left), s),
                                stmt_bool(be, 1), cmp_equal, sel, 0, 0);
        } else if (list_length(nl) < 16) {
                comp_type cmp = (in)?cmp_equal:cmp_notequal;
@@ -552,7 +604,7 @@ exp_bin_or(backend *be, sql_exp *e, stmt
                        assert(f);
                        s = stmt_binop(be, sel1, s, sin, f);
                } else if (sel1 && (sel1->nrcols == 0 || s->nrcols == 0)) {
-                       stmt *predicate = bin_first_column(be, left);
+                       stmt *predicate = bin_find_smallest_column(be, left);
 
                        predicate = stmt_const(be, predicate, stmt_bool(be, 1));
                        if (s->nrcols == 0)
@@ -579,7 +631,7 @@ exp_bin_or(backend *be, sql_exp *e, stmt
                        assert(f);
                        s = stmt_binop(be, sel2, s, sin, f);
                } else if (sel2 && (sel2->nrcols == 0 || s->nrcols == 0)) {
-                       stmt *predicate = bin_first_column(be, left);
+                       stmt *predicate = bin_find_smallest_column(be, left);
 
                        predicate = stmt_const(be, predicate, stmt_bool(be, 1));
                        if (s->nrcols == 0)
@@ -595,13 +647,13 @@ exp_bin_or(backend *be, sql_exp *e, stmt
                return stmt_binop(be, sel1, sel2, NULL, f);
        }
        if (sel1->nrcols == 0) {
-               stmt *predicate = bin_first_column(be, left);
+               stmt *predicate = bin_find_smallest_column(be, left);
 
                predicate = stmt_const(be, predicate, stmt_bool(be, 1));
                sel1 = stmt_uselect(be, predicate, sel1, cmp_equal, NULL, 
0/*anti*/, 0);
        }
        if (sel2->nrcols == 0) {
-               stmt *predicate = bin_first_column(be, left);
+               stmt *predicate = bin_find_smallest_column(be, left);
 
                predicate = stmt_const(be, predicate, stmt_bool(be, 1));
                sel2 = stmt_uselect(be, predicate, sel2, cmp_equal, NULL, 
0/*anti*/, 0);
@@ -656,7 +708,7 @@ exp2bin_case(backend *be, sql_exp *fe, s
                        if (!res) {
                                stmt *l = isel;
                                if (!l)
-                                       l = bin_first_column(be, left);
+                                       l = bin_find_smallest_column(be, left);
                                res = stmt_const(be, l, stmt_atom(be, 
atom_general(be->mvc->sa, exp_subtype(fe), NULL)));
                                ires = l;
                                if (res)
@@ -691,7 +743,7 @@ exp2bin_case(backend *be, sql_exp *fe, s
                                                ncond = stmt_const(be, isel, 
ncond);
                                                ncond->cand = isel;
                                        } else
-                                               ncond = stmt_const(be, 
bin_first_column(be, left), ncond);
+                                               ncond = stmt_const(be, 
bin_find_smallest_column(be, left), ncond);
                                }
                                if (isel && !ncond->cand) {
                                        ncond = stmt_project(be, nsel, ncond);
@@ -778,7 +830,7 @@ exp2bin_casewhen(backend *be, sql_exp *f
        if (!single_value && !case_when->nrcols) {
                stmt *l = isel;
                if (!l)
-                       l = bin_first_column(be, left);
+                       l = bin_find_smallest_column(be, left);
                case_when = stmt_const(be, l, case_when);
                if (case_when)
                        case_when->cand = isel;
@@ -839,7 +891,7 @@ exp2bin_casewhen(backend *be, sql_exp *f
                        if (!res) {
                                stmt *l = isel;
                                if (!l)
-                                       l = bin_first_column(be, left);
+                                       l = bin_find_smallest_column(be, left);
                                res = stmt_const(be, l, stmt_atom(be, 
atom_general(be->mvc->sa, exp_subtype(fe), NULL)));
                                ires = l;
                                if (res)
@@ -874,7 +926,7 @@ exp2bin_casewhen(backend *be, sql_exp *f
                                                ncond = stmt_const(be, isel, 
ncond);
                                                ncond->cand = isel;
                                        } else
-                                               ncond = stmt_const(be, 
bin_first_column(be, left), ncond);
+                                               ncond = stmt_const(be, 
bin_find_smallest_column(be, left), ncond);
                                }
                                if (isel && !ncond->cand)
                                        ncond = stmt_project(be, nsel, ncond);
@@ -964,7 +1016,7 @@ exp2bin_coalesce(backend *be, sql_exp *f
                        if (!res) {
                                stmt *l = isel;
                                if (!l)
-                                       l = bin_first_column(be, left);
+                                       l = bin_find_smallest_column(be, left);
                                res = stmt_const(be, l, stmt_atom(be, 
atom_general(be->mvc->sa, exp_subtype(fe), NULL)));
                                if (res)
                                        res->cand = isel;
@@ -977,7 +1029,7 @@ exp2bin_coalesce(backend *be, sql_exp *f
                                        sql_subfunc *a = sql_bind_func(be->mvc, 
"sys", "isnotnull", tail_type(es), NULL, F_FUNC);
                                        ncond = stmt_unop(be, es, NULL, a); 
/*TODO sql/test/coalesce failing for passing 'nsel' here */
                                        if (ncond->nrcols == 0) {
-                                               stmt *l = bin_first_column(be, 
left);
+                                               stmt *l = 
bin_find_smallest_column(be, left);
                                                if (nsel && l)
                                                        l = stmt_project(be, 
nsel, l);
                                                ncond = stmt_const(be, l, 
ncond);
@@ -1188,10 +1240,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        if (list_empty(exps) && (strcmp(f->func->base.name, 
"rand") == 0 || (f1 = sql_find_func(sql, f->func->s ? f->func->s->base.name : 
NULL, f->func->base.name, 1, f->func->type, NULL)))) {
                                if (f1)
                                        f = f1;
-                               list_append(l, stmt_const(be, 
bin_first_column(be, left),
+                               list_append(l, stmt_const(be, 
bin_find_smallest_column(be, left),
                                                                                
  stmt_atom(be, atom_general(sql->sa, f1 ? 
&(((sql_arg*)f1->func->ops->h->data)->type) : sql_bind_localtype("int"), 
NULL))));
                        } else if (exps_card(exps) < CARD_MULTI) {
-                               rows = bin_first_column(be, left);
+                               rows = bin_find_smallest_column(be, left);
                        }
                        sql->session->status = 0; /* if the function was not 
found clean the error */
                        sql->errstr[0] = '\0';
@@ -1220,10 +1272,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                        es = stmt_const(be, rows, es);
                                else if (f->func->type == F_ANALYTIC && 
es->nrcols == 0) {
                                        if (en == exps->h && left->nrcols)
-                                               es = stmt_const(be, 
bin_first_column(be, left), es); /* ensure the first argument is a column */
+                                               es = stmt_const(be, 
bin_find_smallest_column(be, left), es); /* ensure the first argument is a 
column */
                                        if (!f->func->s && 
!strcmp(f->func->base.name, "window_bound")
                                                && exps->h->next && 
list_length(f->func->ops) == 6 && en == exps->h->next && left->nrcols)
-                                               es = stmt_const(be, 
bin_first_column(be, left), es);
+                                               es = stmt_const(be, 
bin_find_smallest_column(be, left), es);
                                }
                                if (es->nrcols > nrcols)
                                        nrcols = es->nrcols;
@@ -1253,7 +1305,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                as = exp_bin(be, at, left, right, NULL, NULL, 
NULL, sel, depth+1, 0, push);
 
                                if (as && as->nrcols <= 0 && left)
-                                       as = stmt_const(be, 
bin_first_column(be, left), as);
+                                       as = stmt_const(be, 
bin_find_smallest_column(be, left), as);
                                if (en == attr->h && !en->next && 
exp_aggr_is_count(e))
                                        as = exp_count_no_nil_arg(e, ext, at, 
as);
                                /* insert single value into a column */
@@ -1296,7 +1348,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        if (grp) {
                                as = grp;
                        } else if (left) {
-                               as = bin_first_column(be, left);
+                               as = bin_find_smallest_column(be, left);
                                as = exp_count_no_nil_arg(e, ext, NULL, as);
                        } else {
                                /* create dummy single value in a column */
@@ -1355,7 +1407,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                if (!s)
                                        return s;
                                if (s->nrcols == 0 && first)
-                                       s = stmt_const(be, bin_first_column(be, 
swapped?right:left), s);
+                                       s = stmt_const(be, 
bin_find_smallest_column(be, swapped?right:left), s);
                                list_append(ops, s);
                                first = 0;
                        }
@@ -1436,11 +1488,11 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                (void)is_select;
                if (reduce && left && right) {
                        if (l->nrcols == 0)
-                               l = stmt_const(be, bin_first_column(be, 
swapped?right:left), l);
+                               l = stmt_const(be, bin_find_smallest_column(be, 
swapped?right:left), l);
                        if (r->nrcols == 0)
-                               r = stmt_const(be, bin_first_column(be, 
swapped?left:right), r);
+                               r = stmt_const(be, bin_find_smallest_column(be, 
swapped?left:right), r);
                        if (r2 && r2->nrcols == 0)
-                               r2 = stmt_const(be, bin_first_column(be, 
swapped?left:right), r2);
+                               r2 = stmt_const(be, 
bin_find_smallest_column(be, swapped?left:right), r2);
                        if (r2) {
                                s = stmt_join2(be, l, r, r2, 
(comp_type)e->flag, is_anti(e), swapped);
                        } else if (swapped) {
@@ -1451,7 +1503,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                } else {
                        if (r2) { /* handle all cases in stmt_uselect, 
reducing, non reducing, scalar etc */
                                if (l->nrcols == 0 && ((sel && sel->nrcols > 0) 
|| r->nrcols > 0 || r2->nrcols > 0 || reduce))
-                                       l = left ? stmt_const(be, 
bin_first_column(be, left), l) : column(be, l);
+                                       l = left ? stmt_const(be, 
bin_find_smallest_column(be, left), l) : column(be, l);
                                s = stmt_uselect2(be, l, r, r2, 
(comp_type)e->flag, sel, is_anti(e), reduce);
                        } else {
                                /* value compare or select */
@@ -2170,7 +2222,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                        return NULL;
                }
                if (sub && sub->nrcols >= 1 && s->nrcols == 0)
-                       s = stmt_const(be, bin_first_column(be, sub), s);
+                       s = stmt_const(be, bin_find_smallest_column(be, sub), 
s);
                s = stmt_alias(be, s, rnme, exp_name(exp));
                list_append(l, s);
        }
@@ -2474,8 +2526,8 @@ rel2bin_join(backend *be, sql_rel *rel, 
 
                split_join_exps(rel, jexps, sexps);
                if (list_empty(jexps)) { /* cross product and continue after 
project */
-                       stmt *l = bin_first_column(be, left);
-                       stmt *r = bin_first_column(be, right);
+                       stmt *l = bin_find_smallest_column(be, left);
+                       stmt *r = bin_find_smallest_column(be, right);
                        join = stmt_join(be, l, r, 0, cmp_all, 0, 0, false);
                }
 
@@ -2538,8 +2590,8 @@ rel2bin_join(backend *be, sql_rel *rel, 
                        }
                }
        } else {
-               stmt *l = bin_first_column(be, left);
-               stmt *r = bin_first_column(be, right);
+               stmt *l = bin_find_smallest_column(be, left);
+               stmt *r = bin_find_smallest_column(be, right);
                join = stmt_join(be, l, r, 0, cmp_all, 0, 0, rel->single);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to