Changeset: fdca24df4a1a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fdca24df4a1a
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/include/sql_relation.h
Branch: default
Log Message:

Cleaning function call code generation


diffs (210 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
@@ -2276,7 +2276,7 @@ rel2bin_hash_lookup(backend *be, sql_rel
                        sql_subfunc *xor = sql_bind_func_result(sql, "sys", 
"rotate_xor_hash", F_FUNC, lng, 3, lng, it, tail_type(s));
 
                        h = stmt_Nop(be, stmt_list(be, list_append( list_append(
-                               list_append(sa_list(sql->sa), h), bits), s)), 
NULL, xor, false);
+                               list_append(sa_list(sql->sa), h), bits), s)), 
NULL, xor, NULL);
                        semantics = 1;
                } else {
                        sql_subfunc *hf = sql_bind_func_result(sql, "sys", 
"hash", F_FUNC, lng, 1, tail_type(s));
@@ -2324,7 +2324,6 @@ join_hash_key( backend *be, list *l )
 static stmt *
 releqjoin( backend *be, list *l1, list *l2, list *exps, int used_hash, int 
need_left, int is_semantics )
 {
-       mvc *sql = be->mvc;
        node *n1 = l1->h, *n2 = l2->h, *n3 = NULL;
        stmt *l, *r, *res;
        sql_exp *e;
@@ -2361,25 +2360,14 @@ releqjoin( backend *be, list *l1, list *
                stmt *rd = n2->data;
                stmt *le = stmt_project(be, l, ld );
                stmt *re = stmt_project(be, r, rd );
+               stmt *cmp;
                /* intentional both tail_type's of le (as re sometimes is a 
find for bulk loading */
-               sql_subfunc *f = NULL;
-               stmt * cmp;
-               list *ops;
-
-               f = sql_bind_func(sql, "sys", "=", tail_type(le), 
tail_type(le), F_FUNC);
-               assert(f);
-
-               ops = sa_list(be->mvc->sa);
-               list_append(ops, le);
-               list_append(ops, re);
+
                if (!semantics && exps) {
                        e = n3->data;
                        semantics = is_semantics(e);
                }
-               if (semantics)
-                       list_append(ops, stmt_bool(be, 1));
-               cmp = stmt_Nop(be, stmt_list(be, ops), NULL, f, NULL);
-               cmp = stmt_uselect(be, cmp, stmt_bool(be, 1), cmp_equal, NULL, 
0, 0);
+               cmp = stmt_uselect(be, le, re, cmp_equal, NULL, 0, semantics);
                l = stmt_project(be, cmp, l );
                r = stmt_project(be, cmp, r );
        }
@@ -4951,7 +4939,7 @@ hash_update(backend *be, sql_idx * i, st
                        h = stmt_Nop(be, stmt_list( be, list_append( 
list_append(
                                list_append(sa_list(sql->sa), h),
                                stmt_atom_int(be, bits)),  upd)), NULL,
-                               xor, false);
+                               xor, NULL);
                } else if (h)  {
                        stmt *h2;
                        sql_subfunc *lsh = sql_bind_func_result(sql, "sys", 
"left_shift", F_FUNC, lng, 2, lng, it);
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -40,14 +40,6 @@ convertMultiplexFcn(const char *op)
        return op;
 }
 
-static const char *
-convertOperator(const char *op)
-{
-       if (strcmp(op, "=") == 0)
-               return "==";
-       return op;
-}
-
 static InstrPtr
 multiplex2(MalBlkPtr mb, const char *mod, const char *name, int o1, int o2, 
int rtype)
 {
@@ -1369,7 +1361,7 @@ stmt_genselect(backend *be, stmt *lops, 
                node *n;
 
                op = sa_strconcat(be->mvc->sa, op, selectRef);
-               q = newStmtArgs(mb, mod, convertOperator(op), 9);
+               q = newStmtArgs(mb, mod, convertMultiplexFcn(op), 9);
                // push pointer to the SQL structure into the MAL call
                // allows getting argument names for example
                if (LANG_EXT(f->func->lang))
@@ -1472,7 +1464,7 @@ stmt_uselect(backend *be, stmt *op1, stm
                        TRC_ERROR(SQL_EXECUTION, "Unknown operator\n");
                }
 
-               if ((q = multiplex2(mb, mod, convertOperator(op), l, r, 
TYPE_bit)) == NULL)
+               if ((q = multiplex2(mb, mod, convertMultiplexFcn(op), l, r, 
TYPE_bit)) == NULL)
                        return NULL;
                if (sub && (op1->cand || op2->cand)) {
                        if (op1->cand && !op2->cand) {
@@ -3312,16 +3304,16 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
        InstrPtr q = NULL;
        const char *mod = sql_func_mod(f->func), *fimp = sql_func_imp(f->func);
        sql_subtype *tpe = NULL;
-       int push_cands = 0;
-
-       node *n;
-       stmt *o = NULL;
+       int push_cands = 0, default_nargs;
+       stmt *o = NULL, *card = NULL;
 
        if (rows) {
+               if (sel) /* if there's a candidate list, use it instead of 
'rows' */
+                       rows = sel;
                o = rows;
-       }
-       else if (list_length(ops->op4.lval)) {
-               for (n = ops->op4.lval->h, o = n->data; n; n = n->next) {
+       } else if (list_length(ops->op4.lval)) {
+               o = ops->op4.lval->h->data;
+               for (node *n = ops->op4.lval->h; n; n = n->next) {
                        stmt *c = n->data;
 
                        if (c && o->nrcols < c->nrcols)
@@ -3358,40 +3350,38 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
                if (backend_create_subfunc(be, f, ops->op4.lval) < 0)
                        return NULL;
                mod = sql_func_mod(f->func);
-               fimp = sql_func_imp(f->func);
+               fimp = convertMultiplexFcn(sql_func_imp(f->func));
                push_cands = can_push_cands(sel, mod, fimp);
+               default_nargs = (f->res && list_length(f->res) ? 
list_length(f->res) : 1) + list_length(ops->op4.lval) + (o && o->nrcols > 0 ? 6 
: 4);
+               if (rows) {
+                       card = stmt_aggr(be, rows, NULL, NULL, 
sql_bind_func(be->mvc, "sys", "count", sql_bind_localtype("void"), NULL, 
F_AGGR), 1, 0, 1);
+                       default_nargs++;
+               }
+
                if (o && o->nrcols > 0 && f->func->type != F_LOADER && 
f->func->type != F_PROC) {
                        sql_subtype *res = f->res->h->data;
-                       fimp = convertMultiplexFcn(fimp);
-                       q = NULL;
-                       if (strcmp(fimp, "rotate_xor_hash") == 0 &&
-                               strcmp(mod, calcRef) == 0 &&
-                               (q = newStmt(mb, mkeyRef, 
bulk_rotate_xor_hashRef)) == NULL)
-                               return NULL;
-                       if (!q) {
-                               if (f->func->type == F_UNION)
-                                       q = newStmtArgs(mb, batmalRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 6);
-                               else {
-                                       if (rows) {
-                                               stmt *card = stmt_aggr(be, 
rows, NULL, NULL, sql_bind_func(be->mvc, "sys", "count", 
sql_bind_localtype("void"), NULL, F_AGGR), 1, 0, 1);
-                                               q = newStmtArgs(mb, malRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 7);
-                                               q = pushArgument(mb, q, 
card->nr);
-                                       }
-                                       else
-                                               q = newStmtArgs(mb, malRef, 
multiplexRef, (f->res && list_length(f->res) ? list_length(f->res) : 1) + 
list_length(ops->op4.lval) + 6);
-                               }
+
+                       if (strcmp(fimp, "rotate_xor_hash") == 0 && strcmp(mod, 
calcRef) == 0) {
+                               q = newStmt(mb, mkeyRef, 
bulk_rotate_xor_hashRef);
+                               if (q == NULL)
+                                       return NULL;
+                       } else {
+                               q = newStmtArgs(mb, f->func->type == F_UNION ? 
batmalRef : malRef, multiplexRef, default_nargs);
                                if (q == NULL)
                                        return NULL;
-                               setVarType(mb, getArg(q, 0), 
newBatType(res->type->localtype));
+                               if (rows)
+                                       q = pushArgument(mb, q, card->nr);
                                q = pushStr(mb, q, mod);
                                q = pushStr(mb, q, fimp);
-                       } else {
-                               setVarType(mb, getArg(q, 0), 
newBatType(res->type->localtype));
                        }
+                       setVarType(mb, getArg(q, 0), 
newBatType(res->type->localtype));
                } else {
-                       fimp = convertOperator(fimp);
-                       q = newStmtArgs(mb, mod, fimp, (f->res && 
list_length(f->res) ? list_length(f->res) : 1) + list_length(ops->op4.lval) + 
4);
-
+                       q = newStmtArgs(mb, mod, fimp, default_nargs);
+                       if (q == NULL)
+                               return NULL;
+
+                       if (rows)
+                               q = pushArgument(mb, q, card->nr);
                        if (f->res && list_length(f->res)) {
                                sql_subtype *res = f->res->h->data;
 
@@ -3415,13 +3405,13 @@ stmt_Nop(backend *be, stmt *ops, stmt *s
                if (list_length(ops->op4.lval))
                        tpe = tail_type(ops->op4.lval->h->data);
 
-               for (n = ops->op4.lval->h; n; n = n->next) {
+               for (node *n = ops->op4.lval->h; n; n = n->next) {
                        stmt *op = n->data;
                        q = pushArgument(mb, q, op->nr);
                }
                /* push candidate lists if that's the case */
                if (f->func->type == F_FUNC && push_cands) {
-                       for (n = ops->op4.lval->h; n; n = n->next) {
+                       for (node *n = ops->op4.lval->h; n; n = n->next) {
                                stmt *op = n->data;
 
                                if (op->nrcols > 0) {
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -52,7 +52,7 @@ typedef struct expression {
         nulls_last:1,  /* return null after all other rows */
         zero_if_empty:1,       /* in case of partial aggregator computation, 
some aggregators need to return 0 instead of NULL */
         distinct:1,
-        argument_independence:1, /* compare between symmetric */
+        argument_independence:1, /* for a function expression, the arguments 
are independent of the inner project relation. */
 
         semantics:1,   /* is vs = semantics (nil = nil vs unknown != unknown), 
ranges with or without nil, aggregation with or without nil */
         need_no_nil:1,
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to