Changeset: 55813d9de1e8 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=55813d9de1e8
Modified Files:
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.c
        sql/include/sql_relation.h
        sql/rel.txt
        sql/server/Makefile.ag
        sql/server/bin_optimizer.c
        sql/server/rel_bin.c
        sql/server/rel_distribute.c
        sql/server/rel_distribute.h
        sql/server/rel_dump.c
        sql/server/rel_prop.c
        sql/server/rel_prop.h
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/sql_rel2bin.c
        sql/server/sql_statement.c
        sql/server/sql_statement.h
Branch: default
Log Message:

initial step for distribution


diffs (truncated from 794 to 300 lines):

diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -1460,6 +1460,7 @@ sql5_export void freeVariables(Client c,
 #include <sql_optimizer.h>
 #include <sql_datetime.h>
 #include <rel_optimizer.h>
+#include <rel_distribute.h>
 #include <rel_select.h>
 #include <rel_exp.h>
 #include <rel_dump.h>
@@ -1630,6 +1631,7 @@ sql_symbol2stmt(mvc *c, symbol *sym)
                int pq;
 
                r = rel_optimizer(c, r);
+               r = rel_distribute(c, r);
                pq = rel_is_point_query(r);
                if (!pq)
                        pq = rel_need_distinct_query(r);
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -50,9 +50,11 @@
 #include <sql_rel2bin.h>
 #include <rel_optimizer.h>
 #include <rel_subquery.h>
+#include <rel_exp.h>
 #include <rel_bin.h>
 
 static int _dumpstmt(backend *sql, MalBlkPtr mb, stmt *s);
+static void backend_dumpstmt(backend *be, MalBlkPtr mb, stmt *s);
 
 /*
  * @+ MAL code support
@@ -229,6 +231,87 @@ table_func_create_result( MalBlkPtr mb, 
        return q;
 }
 
+static InstrPtr
+relational_func_create_result( MalBlkPtr mb, InstrPtr q, sql_rel *f)
+{
+       node *n;
+       int i;
+
+       for (i = 0, n = f->exps->h; n; n = n->next, i++ ) {
+               sql_exp *e = n->data;
+               int type = exp_subtype(e)->type->localtype;
+
+               type = newBatType(TYPE_oid,type);
+               if (i)
+                       q = pushReturn(mb, q, newTmpVariable(mb, type));
+               else
+                       setVarType(mb,getArg(q,0), type);
+       }
+       return q;
+}
+
+static void
+monet5_create_relational_function(mvc *m, char *name, sql_rel *rel, stmt *call)
+{
+       sql_rel *r;
+       Client c = MCgetClient(m->clientid);
+       backend *be = ((backend *) c->state[MAL_SCENARIO_PARSER]);
+       MalBlkPtr curBlk = 0;
+       InstrPtr curInstr = 0;
+       Symbol backup = NULL;
+       stmt *s, *opt;
+
+       r = rel_optimizer(m, rel);
+       s = rel_bin(m, r);
+
+       if (s->type == st_list && s->nrcols == 0 && s->key) {
+               /* row to columns */
+               node *n;
+               list *l = list_new(m->sa);
+
+               for(n=s->op4.lval->h; n; n = n->next)
+                       list_append(l, const_column(m->sa, n->data));
+               s = stmt_list(m->sa, l);
+       }
+       s = stmt_table(m->sa, s, 1);
+       s = stmt_return(m->sa, s, 0);
+       opt = rel2bin(m, s);
+       s = bin_optimizer(m, opt);
+
+       backup = c->curprg;
+       c->curprg = newFunction(userRef,putName(name,strlen(name)), 
FUNCTIONsymbol);
+
+       curBlk = c->curprg->def;
+       curInstr = getInstrPtr(curBlk, 0);
+
+       curInstr = relational_func_create_result(curBlk, curInstr, rel);
+       setVarUDFtype(curBlk,0);
+
+       /* ops */
+       if (call->op1->type == st_list) {
+               node *n;
+
+               for(n=call->op1->op4.lval->h; n; n = n->next) {
+                       stmt *op = n->data;
+                       sql_subtype *t = tail_type(op);
+                       int type = t->type->localtype;
+                       int varid = 0;
+                       char *nme = op->op3->op4.aval->data.val.sval;
+
+                       varid = newVariable(curBlk, _strdup(nme), type);
+                       curInstr = pushArgument(curBlk, curInstr, varid);
+                       setVarType(curBlk, varid, type);
+                       setVarUDFtype(curBlk,varid);
+               }
+       }
+
+       backend_dumpstmt(be, curBlk, s);
+       /* SQL function definitions meant for inlineing should not be optimized 
before */
+       varSetProp(curBlk, getArg(curInstr, 0), sqlfunctionProp, op_eq, NULL);
+       addQueryToCache(c);
+       if (backup)
+               c->curprg = backup;
+}
 /*
  * @-
  * Some utility routines to generate code
@@ -1533,6 +1616,29 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                        /* keep reference to instruction */
                        s->rewritten = (void*)q;
                } break;
+               case st_func:{
+                       char *mod = "user";
+                       char *fimp = s->op2->op4.aval->data.val.sval;
+                       sql_rel *rel = s->op4.rel;
+                       node *n;
+
+                       /* dump args */
+                       if (s->op1) 
+                               _dumpstmt(sql, mb, s->op1);
+                       monet5_create_relational_function(sql->mvc, fimp, rel, 
s);
+
+                       q = newStmt(mb, mod, fimp);
+                       q = relational_func_create_result(mb, q, rel);
+                       if (s->op1)
+                               for (n = s->op1->op4.lval->h; n; n = n->next) {
+                                       stmt *op = n->data;
+
+                                       q = pushArgument(mb, q, op->nr);
+                               }
+                       s->nr = getDestVar(q);
+                       /* keep reference to instruction */
+                       s->rewritten = (void*)q;
+               } break;
                case st_aggr:{
                        int l = _dumpstmt(sql, mb, s->op1);
                        char *mod, *aggrfunc;
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
@@ -257,7 +257,7 @@ typedef struct relation {
        char card;      /* 0, 1 (row), 2 aggr, 3 */
        char processed; /* fully processed or still in the process of building 
*/
        char subquery;  /* is this part a subquery, this is needed for proper 
name binding */
-       void *p;        /* properties for the optimizer */
+       void *p;        /* properties for the optimizer, distribution */
 } sql_rel;
 
 #endif /* SQL_RELATION_H */
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -5,9 +5,13 @@ BASETABLE
        -> l            (sql_table)
 
 TABLE  (card MULTI)
+       -> flags        (1) TABLE query 
+                       (2) RELATIONAL subquery (ie wrap function around 
subquery)
        -> exps         is list of column expressions (also used for aliases)
        -> l            optional input relation
-       -> r            table function expression
+       -> r            (1) table function expression
+                       (2) list of input expressions
+               
 
 /* Wrapping relational operator, is a big complex top level only 
    operator, which only does DDL kind of statements
diff --git a/sql/server/Makefile.ag b/sql/server/Makefile.ag
--- a/sql/server/Makefile.ag
+++ b/sql/server/Makefile.ag
@@ -55,11 +55,12 @@ lib_sqlserver = {
                rel_prop.c \
                rel_exp.c \
                rel_optimizer.c \
+               rel_distribute.c \
                rel_bin.c \
                rel_xml.c \
                rel_dump.c \
                bin_optimizer.h rel_bin.h rel_dump.h rel_exp.h \
-               rel_optimizer.h rel_prop.h rel_schema.h rel_select.h \
+               rel_optimizer.h rel_distribute.h rel_prop.h rel_schema.h 
rel_select.h \
                rel_semantic.h rel_sequence.h rel_subquery.h rel_trans.h \
                rel_updates.h rel_xml.h sql_atom.h sql_datetime.h \
                sql_decimal.h sql_env.h sql_mvc.h sql_parser.h \
diff --git a/sql/server/bin_optimizer.c b/sql/server/bin_optimizer.c
--- a/sql/server/bin_optimizer.c
+++ b/sql/server/bin_optimizer.c
@@ -430,6 +430,7 @@ _bin_optimizer(mvc *c, stmt *s)
        case st_unop:
        case st_binop:
        case st_Nop:
+       case st_func:
        case st_convert:
 
        case st_affected_rows:
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -770,34 +770,70 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
        list *l; 
        stmt *sub = NULL;
        node *en, *n;
-       int i;
        sql_exp *op = rel->r;
-       sql_subfunc *f = op->f;
-       sql_table *t = f->res.comp_type;
+
+       if (op) {
+               int i;
+               sql_subfunc *f = op->f;
+               sql_table *t = f->res.comp_type;
                        
-       if (!t)
-               t = f->func->res.comp_type;
-       if (rel->l)
-               sub = subrel_bin(sql, rel->l, refs);
-       sub = exp_bin(sql, rel->r, sub, NULL, NULL, NULL); /* table function */
-       if (!sub || !t) { 
+               if (!t)
+                       t = f->func->res.comp_type;
+               sub = exp_bin(sql, op, sub, NULL, NULL, NULL); /* table 
function */
+               if (!t || !sub) { 
+                       assert(0);
+                       return NULL;    
+               }
+               l = list_new(sql->sa);
+               for(i = 0, n = t->columns.set->h; n; n = n->next, i++ ) {
+                       sql_column *c = n->data;
+                       stmt *s = stmt_rs_column(sql->sa, sub, i, &c->type); 
+                       char *nme = c->base.name;
+                       char *rnme = exp_find_rel_name(op);
+
+                       rnme = (rnme)?sa_strdup(sql->sa, rnme):NULL;
+                       s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, 
nme));
+                       list_append(l, s);
+               }
+               sub = stmt_list(sql->sa, l);
+       } else if (rel->l) {
+               int i, argc;
+               char name[16], *nme;
+               /* handle sub query via function */
+               (void)refs;
+
+               nme = number2name(name, 16, ++sql->label);
+
+               /* arguments (todo check which are used) */
+               l = list_new(sql->sa);
+               for (argc = 0; argc < sql->argc; argc++) {
+                       atom *a = sql->args[argc];
+                       stmt *s = stmt_atom(sql->sa, a);
+                       char nme[16];
+
+                       snprintf(nme, 16, "A%d", argc);
+                       s = stmt_alias(sql->sa, s, NULL, sa_strdup(sql->sa, 
nme));
+                       list_append(l, s);
+               }
+               sub = stmt_list(sql->sa, l);
+               sub = stmt_func(sql->sa, sub, sa_strdup(sql->sa, nme), rel->l);
+               l = list_new(sql->sa);
+               for(i = 0, n = rel->exps->h; n; n = n->next, i++ ) {
+                       sql_exp *c = n->data;
+                       stmt *s = stmt_rs_column(sql->sa, sub, i, 
exp_subtype(c)); 
+                       char *nme = exp_name(c);
+                       char *rnme = op?exp_find_rel_name(op):NULL;
+
+                       rnme = (rnme)?sa_strdup(sql->sa, rnme):NULL;
+                       s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, 
nme));
+                       list_append(l, s);
+               }
+               sub = stmt_list(sql->sa, l);
+       }
+       if (!sub) { 
                assert(0);
                return NULL;    
        }
-
-       l = list_new(sql->sa);
-       for(i = 0, n = t->columns.set->h; n; n = n->next, i++ ) {
-               sql_column *c = n->data;
-               stmt *s = stmt_rs_column(sql->sa, sub, i, &c->type); 
-               char *nme = c->base.name;
-               char *rnme = exp_find_rel_name(op);
-
-               rnme = (rnme)?sa_strdup(sql->sa, rnme):NULL;
-               s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, nme));
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to