Changeset: 11f81865f1f4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=11f81865f1f4
Modified Files:
sql/backends/monet5/Tests/optimizers.stable.out
sql/backends/monet5/sql.mx
sql/backends/monet5/sql_scenario.mx
sql/server/rel_bin.c
sql/server/rel_dump.c
sql/server/rel_dump.h
sql/sql/25_debug.sql
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
sql/test/Tests/order_by_complex_exp.stable.out
sql/test/Tests/setoptimizer.stable.out
sql/test/mapi/Tests/php_monetdb.stable.out
Branch: default
Log Message:
added relational algebra parser
using the sql procedure 'ra' you can now test relational plans.
Beware this is for debuging only. No garantees what so ever
are given on this function.
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