Changeset: 7e1f73a75b3a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7e1f73a75b3a Modified Files: Branch: default Log Message:
Merge with default diffs (truncated from 938 to 300 lines): diff --git a/sql/backends/monet5/Tests/optimizers.stable.out b/sql/backends/monet5/Tests/optimizers.stable.out --- a/sql/backends/monet5/Tests/optimizers.stable.out +++ b/sql/backends/monet5/Tests/optimizers.stable.out @@ -43,9 +43,9 @@ % ., . # table_name % single_value, single_value # name % char, varchar # type -% 15, 175 # length -[ "optimizer test:", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector" ] -#select 'optimizer test:',optimizer; +% 15, 188 # length +[ "optimizer test:", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,accumulators,garbageCollector" ] +#select 'optimizer off test:',optimizer; % ., . # table_name % single_value, single_value # name % char, varchar # type @@ -61,8 +61,8 @@ % ., . # table_name % single_value, single_value # name % char, varchar # type -% 23, 175 # length -[ "optimizer <empty> test:", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector" ] +% 23, 188 # length +[ "optimizer <empty> test:", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,accumulators,garbageCollector" ] #select 'done'; % . # table_name % single_value # name 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 @@ -90,6 +90,10 @@ address SQLinclude comment "Compile and execute a sql statements on the file"; +pattern ra(cmd:str, optimize:bit):void +address RAstatement +comment "Compile and execute a single 'relational algebra' statement"; + pattern assert(b:bit,msg:str):void address SQLassert comment "Generate an exception when b==true"; @@ -1399,6 +1403,7 @@ #ifdef HAVE_RAPTOR # include <rdf.h> #endif +#include "mal_instruction.h" /* Windows doesn't have round or trunc, but it does have floor and ceil */ #ifndef HAVE_ROUND @@ -6329,3 +6334,44 @@ BBPkeepref(*res = r->batCacheid); return MAL_SUCCEED; } + +str +RAstatement(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + int pos = 0; + str *expr = (str*) getArgReference(stk, pci, 1); + bit *opt = (bit*) getArgReference(stk, pci, 2); + backend *b = NULL; + mvc *m = NULL; + str msg = getContext(cntxt, mb, &m, &b); + sql_rel *rel; + + printf("execute relational algebra %s\n", *expr); + m->sa = sa_create(); + //SQLtrans(m); + rel = rel_read(m, *expr, &pos); + if (rel) { + int oldstop = cntxt->curprg->def->stop; + stmt *s; + char *msg; + + rel_print(m, rel, 0); + if (*opt) + printf(" optimize it \n"); + s = output_rel_bin(m, rel); + rel_destroy(rel); + s = rel2bin(m, s); + s = bin_optimizer(m, s); + + MSinitClientPrg(cntxt, "user", "test"); + + /* generate MAL code */ + backend_callinline(b, cntxt, s ); + addQueryToCache(cntxt); + + msg = (str) runMAL(cntxt, cntxt->curprg->def, 1, 0, 0, 0); + if (!msg) + resetMalBlk(cntxt->curprg->def, oldstop); + } + return msg; +} diff --git a/sql/backends/monet5/sql_scenario.mx b/sql/backends/monet5/sql_scenario.mx --- a/sql/backends/monet5/sql_scenario.mx +++ b/sql/backends/monet5/sql_scenario.mx @@ -57,6 +57,7 @@ sql5_export str SQLstatementIntern(Client c, str *expr, str nme, int execute, bit output); sql5_export str SQLcompile(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str SQLinclude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +sql5_export str RAstatement(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str SQLtrace(int *ret); sql5_export str SQLCacheRemove(Client c, str nme); 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 @@ -364,7 +364,7 @@ group *g = grp; assert(sel == NULL); - if (attr) { + if (attr && attr->h) { at = attr->h->data; as = exp_bin(sql, at, left, right, NULL, sel); if (list_length(attr) == 2) diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -22,7 +22,9 @@ #define TABSTOP 2 #include "rel_dump.h" +#include "rel_exp.h" #include "rel_prop.h" +#include "rel_select.h" static void print_indent(mvc *sql, stream *fout, int depth) @@ -81,15 +83,17 @@ return; switch(e->type) { case e_convert: { - list *l = e->r; - sql_subtype *f = l->h->data; + //list *l = e->r; + //sql_subtype *f = l->h->data; char *to_type = sql_subtype_string(&e->tpe); - char *from_type = sql_subtype_string(f); - mnstr_printf(fout, "convert("); + //char *from_type = sql_subtype_string(f); + //mnstr_printf(fout, "convert("); + mnstr_printf(fout, "%s[", to_type); exp_print(sql, fout, e->l, depth, 0, 0); - mnstr_printf(fout, " from %s to %s)", from_type, to_type); + //mnstr_printf(fout, " from %s to %s)", from_type, to_type); + mnstr_printf(fout, "]"); _DELETE(to_type); - _DELETE(from_type); + //_DELETE(from_type); break; } case e_atom: { @@ -101,11 +105,9 @@ isStream(t)?"stream":isMergeTable(t)?"merge table":"table", t->base.name); } else { + char *t = sql_subtype_string(atom_type(a)); char *s = atom2string(sql->sa, a); - if (atom_type(a)->type->localtype == TYPE_str) - mnstr_printf(fout, "'%s'", s); - else - mnstr_printf(fout, "%s", s); + mnstr_printf(fout, "%s \"%s\"", t, s); } } else { /* variables */ if (e->r) { /* named parameters */ @@ -121,19 +123,26 @@ } break; case e_func: { sql_subfunc *f = e->f; - mnstr_printf(fout, "%s", f->func->base.name ); + mnstr_printf(fout, "%s.%s", + f->func->s?f->func->s->base.name:"sys", + f->func->base.name); exps_print(sql, fout, e->l, depth, alias, 1); if (e->r) exps_print(sql, fout, e->r, depth, alias, 1); } break; case e_aggr: { sql_subaggr *a = e->f; - mnstr_printf(fout, "%s", a->aggr->base.name ); + mnstr_printf(fout, "%s.%s", + a->aggr->s?a->aggr->s->base.name:"sys", + a->aggr->base.name); if (need_distinct(e)) mnstr_printf(fout, " unique "); if (need_no_nil(e)) mnstr_printf(fout, " no nil "); - exps_print(sql, fout, e->l, depth, alias, 1); + if (e->l) + exps_print(sql, fout, e->l, depth, alias, 1); + else + mnstr_printf(fout, "()"); } break; case e_column: if (e->l) @@ -552,3 +561,562 @@ list_destroy(refs); } + +static void +skipWS( char *r, int *pos) +{ + while(r[*pos] && (isspace(r[*pos]) || r[*pos] == '|')) + (*pos)++; +} + +static void +skipIdent( char *r, int *pos) +{ + while(r[*pos] && (isalnum(r[*pos]) || r[*pos] == '_' || r[*pos] == '%')) + (*pos)++; +} + +static int +readInt( char *r, int *pos) +{ + int res = 0; + + while (isdigit(r[*pos])) { + res *= 10; + res += r[*pos]-'0'; + (*pos)++; + } + return res; +} + +static char * +readString( char *r, int *pos) +{ + char *st = NULL; + + if (r[*pos] == '"'){ + (*pos)++; + st = r+*pos; + while (r[*pos] != '"') + (*pos)++; + r[*pos] = 0; + (*pos)++; + } + return st; +} + +static sql_exp* exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int *pos, int grp) ; + +static list* +read_exps(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int *pos, char bracket, int grp) +{ + list *exps = new_exp_list(sql->sa); + sql_exp *e; + char ebracket = (bracket == '[')?']':')'; + + if (r[*pos] == bracket) { + skipWS( r, pos); + + (*pos)++; + skipWS( r, pos); + e = exp_read(sql, lrel, rrel, r, pos, grp); + if (!e && r[*pos] != ebracket) { + return sql_error(sql, -1, "missing closing %c\n", ebracket); + } else if (!e) { + (*pos)++; + skipWS( r, pos); + return exps; + } + append(exps, e); + skipWS( r, pos); + while (r[*pos] == ',') { + (*pos)++; + skipWS( r, pos); + e = exp_read(sql, lrel, rrel, r, pos, grp); + if (!e) + return NULL; + append(exps, e); + skipWS( r, pos); + } + if (r[*pos] != ebracket) + return sql_error(sql, -1, "missing closing %c\n", ebracket); + (*pos)++; + skipWS( r, pos); + } + return exps; +} + +static sql_exp* +exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int *pos, int grp) +{ + int not = 1, f = 0, old, d=0, s=0, unique = 0, no_nils = 0; + char *tname, *cname, *e, *b = r + *pos, *st; + sql_exp *exp = NULL; + list *exps = NULL; + sql_subtype *tpe; + + skipIdent(r, pos); + e = r+*pos; + skipWS(r, pos); + switch(r[*pos]) { _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list