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