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

Reply via email to