Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv7368/src/server
Modified Files:
rel_bin.mx rel_exp.mx rel_select.mx sql_statement.mx
Log Message:
adding special output for algebra version
changed sql.trace() into sql.logfile(filename:string), which can be called
from sql too.
fixed handling of dependency problem on views (one remains)
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -d -r1.58 -r1.59
--- rel_select.mx 27 Jan 2008 19:18:58 -0000 1.58
+++ rel_select.mx 28 Jan 2008 16:25:53 -0000 1.59
@@ -152,7 +152,7 @@
static void
rel_setsubquery(sql_rel*r)
{
- if (r->l && r->op != op_basetable)
+ if (r->l && !is_base(r->op))
rel_setsubquery(r->l);
if (r->r && is_join(r->op))
rel_setsubquery(r->r);
@@ -182,72 +182,6 @@
r->name = _strdup(nme);
}
-static sql_exp * exp_atom_ref(int i, sql_subtype *tpe)
-{
- sql_exp *e = exp_create(e_atom);
- e->card = CARD_ATOM;
- e->flag = i;
- e->f = tpe;
- return e;
-}
-
-static sql_exp * exp_param(char *name, sql_subtype *tpe, int frame)
-{
- sql_exp *e = exp_create(e_atom);
- e->r = _strdup(name);
- e->card = CARD_ATOM;
- e->f = tpe;
- e->flag = frame;
- return e;
-}
-
-static sql_exp *
-exp_atom_bool(int b) {
- sql_subtype bt;
-
- sql_find_subtype(&bt, "boolean", 0, 0);
- if (b)
- return exp_atom(atom_bool(&bt, TRUE ));
- else
- return exp_atom(atom_bool(&bt, FALSE ));
-}
-
-static sql_exp *
-exp_column( char *tname, char *cname, sql_subtype *t, int card)
-{
- sql_exp *e = exp_create(e_column);
- e->name = _strdup(cname);
- e->card = card;
- e->l = (tname)?_strdup(tname):NULL;
- e->r = _strdup(cname);
- e->f = t;
- return e;
-}
-
-static sql_exp *
-exp_alias( char *tname, char *cname, sql_rel *orel, sql_exp *old)
-{
- sql_exp *e = exp_create(e_column);
-
- assert(cname);
- e->card = orel->card;
- e->name = _strdup(cname);
- e->l = (tname)?_strdup(tname):NULL;
- e->r = _strdup(cname);
- e->f = exp_subtype(old);
- return e;
-}
-
-/* Set a name (alias) for the expression, such that we can refer
- to this expression by this simple name.
- */
-static void exp_setname( sql_exp *e, char *name )
-{
- if (e->name)
- _DELETE(e->name);
- e->name = _strdup(name);
-}
-
static sql_exp *
exp_alias_or_copy( mvc *sql, char *tname, char *cname, sql_rel *orel, sql_exp
*old, int settname)
{
@@ -258,12 +192,12 @@
char name[16], *nme;
nme = number2name(name, 16, ++sql->label);
- exp_setname(old, nme);
- return exp_alias(tname, nme, orel, old);
+ exp_setname(old, NULL, nme);
+ return exp_column(tname, nme, exp_subtype(old), orel->card);
} else if (cname && !old->name) {
- exp_setname(old, cname);
+ exp_setname(old, NULL, cname);
}
- return exp_alias(tname, cname, orel, old);
+ return exp_column(tname, cname, exp_subtype(old), orel->card);
}
static sql_exp *
@@ -276,7 +210,7 @@
if (rel->exps) /* list of aliases */
e = exps_bind_column(rel->exps, cname);
if (e)
- return exp_alias(NULL, cname, rel, e);
+ return exp_column(NULL, cname, exp_subtype(e), rel->card);
for (cn = t->columns.set->h; cn; cn = cn->next) {
sql_column *c = cn->data;
if (strcmp(c->base.name, cname) == 0)
@@ -480,7 +414,7 @@
node *en;
for (en = rel->exps->h; en; en = en->next) {
sql_exp *e = en->data;
- append(exps, exp_alias(NULL, e->name, rel, e));
+ append(exps, exp_column(NULL, e->name,
exp_subtype(e), rel->card));
}
} else {
for (cn = t->columns.set->h; cn; cn = cn->next) {
@@ -711,14 +645,14 @@
if ((m=exps_find_match_exp(rel->exps, e)) == NULL) {
if (!e->name) {
nme = number2name(name, 16, ++sql->label);
- exp_setname(e, nme);
+ exp_setname(e, NULL, nme);
}
append(rel->exps, e);
m = e;
}
if (!tname && e->type == e_column)
tname = e->l;
- return exp_alias(tname, m->name, rel, m);
+ return exp_column(tname, m->name, exp_subtype(m), rel->card);
}
static void
@@ -737,38 +671,19 @@
}
static sql_exp *
-rel_project_label_exp(mvc *sql, sql_rel *rel, sql_exp *e)
-{
- char name[16], *nme;
- nme = number2name(name, 16, ++sql->label);
-
- exp_setname(e, nme);
- return exp_alias(rel->name, nme, rel, e);
-}
-
-static sql_exp *
-rel_lastexp_renamed(mvc *sql, sql_rel *rel )
-{
- sql_exp *e;
- assert(is_project(rel->op) && list_length(rel->exps));
-
- e = rel->exps->t->data;
- return rel_project_label_exp(sql, rel, e);
-}
-
-static sql_exp *
rel_lastexp(mvc *sql, sql_rel *rel )
{
sql_exp *e;
- if (rel->op == op_project)
- return rel_lastexp_renamed(sql, rel);
- assert(is_project(rel->op) && list_length(rel->exps));
+ assert(list_length(rel->exps));
+ if (rel->op == op_project)
+ return exp_alias_or_copy(sql, rel->name, NULL,
+ rel, rel->exps->t->data, 1);
+ assert(is_project(rel->op));
e = rel->exps->t->data;
return exp_column(rel->name, e->name, exp_subtype(e), e->card);
}
-
void
rel_select_add_exp(sql_rel *l, sql_exp *e)
{
@@ -1058,7 +973,7 @@
node *ne = sq->exps->h;
for (; d && ne; d = d->next, ne = ne->next)
- exp_setname( ne->data, d->data.sval );
+ exp_setname( ne->data, NULL, d->data.sval );
}
}
return sq;
@@ -1195,8 +1110,8 @@
if (!rel->exps)
rel->exps = new_exp_list();
append(rel->exps, e);
- exp_setname(e, nme);
- return exp_alias(NULL, nme, rel, e);
+ exp_setname(e, NULL, nme);
+ return exp_column(NULL, nme, exp_subtype(e), rel->card);
}
sql_exp *
@@ -1337,7 +1252,7 @@
sql_column *c = n->data;
sql_exp *e = m->data;
- exp_setname(e, c->base.name);
+ exp_setname(e, NULL, c->base.name);
if (e->card == CARD_AGGR)
e->card = CARD_MULTI;
}
@@ -3192,7 +3107,7 @@
if (ve) {
dlist *l = dlist_create(sql->sa);
symbol *sym;
- exp_setname(ve, name);
+ exp_setname(ve, NULL, name);
/* now we should rewrite the selection
such that it uses the new group
by column
@@ -3510,7 +3425,7 @@
return NULL;
/* AS name */
if (ve && l->h->next->data.sval)
- exp_setname(ve, l->h->next->data.sval);
+ exp_setname(ve, NULL, l->h->next->data.sval);
return ve;
}
@@ -3607,7 +3522,7 @@
rel = rel_compare_exp(sql, rel, exp_dup(lc),
exp_dup(rc), "=", NULL, sql_where);
cond = rel_unop_(sql, exp_dup(lc), NULL, "isnull");
lc = rel_nop_(sql, cond, exp_dup(rc), exp_dup(lc),
NULL, NULL, "ifthenelse");
- exp_setname(lc, nm);
+ exp_setname(lc, NULL, nm);
append(outexps, lc);
} else if (all) {
found = 0;
@@ -3693,7 +3608,7 @@
assert(e->type == e_cmp);
assert(re->type == e_column);
- re = exp_alias(inner->name, re->r, inner, re);
+ re = exp_column(inner->name, re->r,
exp_subtype(re), inner->card);
e = exp_compare( exp_dup(e->l), re, e->flag);
append(jexps, e);
}
@@ -4050,6 +3965,7 @@
if (js && js->token != SQL_USING) { /* On sql_logical_exp */
rel = rel_logical_exp(sql, rel, js, sql_where);
} else if (js) { /* using */
+ char *tname = NULL;
dnode *n = js->data.lval->h;
list *outexps = new_exp_list(), *exps;
node *m;
@@ -4069,7 +3985,7 @@
rel = rel_compare_exp(sql, rel, exp_dup(ls),
exp_dup(rs), "=", NULL, sql_where);
cond = rel_unop_(sql, exp_dup(ls), NULL, "isnull");
ls = rel_nop_(sql, cond, exp_dup(rs), exp_dup(ls),
NULL, NULL, "ifthenelse");
- exp_setname(ls, nm);
+ exp_setname(ls, tname, nm);
append(outexps, ls);
if (!rel) {
list_destroy(outexps);
@@ -4107,10 +4023,13 @@
}
list_destroy(exps);
rel = rel_project(rel, outexps);
- if (!rel->name)
- rel_label(rel, ++sql->label);
} else { /* ! js -> natural join */
rel = join_on_column_name(sql, rel, t1, t2, 0);
+ /* As the natural join only returns a new relation with
+ join columns, we should rename this relation too beable
+ to uniquely describe a column of this relation again
+ (not refering to the lower relation columns).
+ */
if (!rel->name)
rel_label(rel, ++sql->label);
}
Index: rel_exp.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_exp.mx,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- rel_exp.mx 27 Jan 2008 19:18:58 -0000 1.2
+++ rel_exp.mx 28 Jan 2008 16:25:53 -0000 1.3
@@ -28,7 +28,6 @@
#define new_exp_list() list_create((fdestroy)&exp_destroy)
-extern sql_exp *exp_create( int type);
extern sql_exp *exp_dup(sql_exp* e);
extern void exp_destroy(sql_exp* e);
@@ -53,9 +52,14 @@
#define exp_aggr1(e, a, d, n, c) \
exp_aggr(append(new_exp_list(), e), a, d, n, c)
extern sql_exp * exp_atom( atom *a);
+extern sql_exp * exp_atom_bool(int b);
extern sql_exp * exp_atom_int(int i);
extern sql_exp * exp_atom_str(str s, sql_subtype *st);
extern sql_exp * exp_atom_clob(str s);
+extern sql_exp * exp_atom_ref(int i, sql_subtype *tpe);
+extern sql_exp * exp_param(char *name, sql_subtype *tpe, int frame);
+extern sql_exp * exp_column( char *tname, char *name, sql_subtype *t, int
card);
+extern void exp_setname( sql_exp *e, char *tname, char *name );
extern void exp_swap( sql_exp *e );
@@ -82,12 +86,13 @@
#include "rel_semantic.h"
#include "rel_exp.h"
-sql_exp *
+static sql_exp *
exp_create( int type )
{
sql_exp *e = NEW(sql_exp);
sql_ref_init(&e->ref);
e->name = NULL;
+ e->rname = NULL;
e->card = 0;
e->flag = 0;
e->l = e->r = NULL;
@@ -230,6 +235,18 @@
}
sql_exp *
+exp_atom_bool(int b)
+{
+ sql_subtype bt;
+
+ sql_find_subtype(&bt, "boolean", 0, 0);
+ if (b)
+ return exp_atom(atom_bool(&bt, TRUE ));
+ else
+ return exp_atom(atom_bool(&bt, FALSE ));
+}
+
+sql_exp *
exp_atom_int(int i)
{
sql_subtype it;
@@ -253,6 +270,56 @@
return exp_atom(atom_string(&clob, _strdup(s), 1 ));
}
+sql_exp *
+exp_atom_ref(int i, sql_subtype *tpe)
+{
+ sql_exp *e = exp_create(e_atom);
+ e->card = CARD_ATOM;
+ e->flag = i;
+ e->f = tpe;
+ return e;
+}
+
+sql_exp *
+exp_param(char *name, sql_subtype *tpe, int frame)
+{
+ sql_exp *e = exp_create(e_atom);
+ e->r = _strdup(name);
+ e->card = CARD_ATOM;
+ e->f = tpe;
+ e->flag = frame;
+ return e;
+}
+
+sql_exp *
+exp_column( char *tname, char *cname, sql_subtype *t, int card)
+{
+ sql_exp *e = exp_create(e_column);
+
+ assert(cname);
+ e->card = card;
+ e->name = _strdup(cname);
+ e->l = (tname)?_strdup(tname):NULL;
+ e->r = _strdup(cname);
+ e->f = t;
+ return e;
+}
+
+/* Set a name (alias) for the expression, such that we can refer
+ to this expression by this simple name.
+ */
+void
+exp_setname( sql_exp *e, char *tname, char *name )
+{
+ if (e->name)
+ _DELETE(e->name);
+ e->name = _strdup(name);
+
+ if (e->rname)
+ _DELETE(e->rname);
+ e->rname = (tname)?_strdup(tname):NULL;
+}
+
void
exp_swap( sql_exp *e )
{
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -d -r1.30 -r1.31
--- rel_bin.mx 27 Jan 2008 21:13:06 -0000 1.30
+++ rel_bin.mx 28 Jan 2008 16:25:53 -0000 1.31
@@ -884,9 +884,8 @@
if (!s) {
assert(0);
+ cond_stmt_destroy(sub);
list_destroy(l);
- if (sub)
- stmt_destroy(sub);
return NULL;
}
if (sub && sub->nrcols >= 1 && s->nrcols == 0)
Index: sql_statement.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_statement.mx,v
retrieving revision 1.157
retrieving revision 1.158
diff -u -d -r1.157 -r1.158
--- sql_statement.mx 11 Jan 2008 10:52:14 -0000 1.157
+++ sql_statement.mx 28 Jan 2008 16:25:53 -0000 1.158
@@ -923,8 +923,9 @@
case st_bat:
case st_append_col:
case st_update_col:
- if (depend_type == COLUMN_DEPENDENCY) {
- dep_list = list_append(dep_list,
&(s->op1.cval->base.id));
+ if (depend_type == COLUMN_DEPENDENCY) {
+ if (isTable(s->op1.cval->t))
+ dep_list = list_append(dep_list,
&(s->op1.cval->base.id));
dep_list = list_append(dep_list,
&(s->op1.cval->t->base.id));
}
break;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins