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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list