Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv16448/src/server

Modified Files:
        rel_bin.mx rel_dump.mx rel_exp.mx rel_select.mx 
Log Message:
expressions can now have relation and expression aliases
also added more checks for the correct cardinality, we leads to
earlier (clearer) errors


Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -d -r1.60 -r1.61
--- rel_select.mx       29 Jan 2008 08:51:08 -0000      1.60
+++ rel_select.mx       29 Jan 2008 15:02:21 -0000      1.61
@@ -195,7 +195,7 @@
                exp_setname(old, NULL, nme);
                return exp_column(tname, nme, exp_subtype(old), orel->card);
        } else if (cname && !old->name) {
-               exp_setname(old, NULL, cname);
+               exp_setname(old, tname, cname);
        }
        return exp_column(tname, cname, exp_subtype(old), orel->card);
 }
@@ -293,11 +293,11 @@
 
                        if (exps_bind_column(rel->exps, e->r))
                                found = 1;
-               } else if (e->l && exps_bind_column2(rel->exps, e->l, e->r)) {
+               }
+               if (!found && e->l && exps_bind_column2(rel->exps, e->l, e->r)) 
                        found = 1;
-               } else if (!e->l && exps_bind_column(rel->exps, e->r)) {
+               if (!found && !e->l && exps_bind_column(rel->exps, e->r)) 
                        found = 1;
-               }
                break;
        case op_table:
                if (e->l && rel->name && strcmp(e->l, rel->name) != 0)
@@ -506,7 +506,6 @@
 {
        sql_rel *rel = rel_create();
 
-       rel->name = NULL;
        rel->l = l;
        rel->r = r;
        rel->op = setop;
@@ -522,7 +521,6 @@
 {
        sql_rel *rel = rel_create();
 
-       rel->name = NULL;
        rel->l = l;
        rel->r = r;
        rel->op = join;
@@ -557,7 +555,6 @@
 {
        sql_rel *rel = rel_create();
 
-       rel->name = NULL;
        rel->l = l;
        rel->r = NULL;
        rel->op = op_project;
@@ -762,7 +759,6 @@
                        append(aggrs, e);
                }
        }
-       rel->name = NULL;
        rel->l = l;
        rel->r = groupbyexps;
        rel->exps = aggrs;
@@ -777,7 +773,6 @@
        if (l->op != op_project) {
                sql_rel *rel = rel_create();
 
-               rel->name = NULL;
                rel->l = l;
                rel->r = orderbyexps;
                rel->op = op_project;   
@@ -796,7 +791,6 @@
 {
        sql_rel *rel = rel_create();
 
-       rel->name = NULL;
        rel->l = l;
        rel->r = NULL;
        rel->op = op_topn;      
@@ -901,7 +895,7 @@
        node *ln, *rn;
        sql_rel *lrel = NULL, *rrel = NULL, *p = NULL;
 
-       if (!l || !r)
+       if (!l || !r) 
                return NULL;
 
        p = rel;
@@ -1131,7 +1125,7 @@
                if (rel->exps) {
                        sql_exp *e = exps_bind_column(rel->exps, cname);
                        if (e)
-                               return exp_alias_or_copy(sql, rel->name, cname, 
rel, e, 1);
+                               return exp_alias_or_copy(sql, 
e->rname?e->rname:rel->name, cname, rel, e, 1);
                }
        } else if (rel->op == op_basetable) {
                return basetable_bind_column(rel, cname);
@@ -1685,6 +1679,10 @@
        }
 
        /* atom or row => select */
+       if (ls->card > rel->card)
+               return sql_error(sql, 02, "SELECT: cannot use non GROUP BY 
column '%s' in query results without an aggregate function", ls->name);
+       if (rs->card > rel->card) 
+               return sql_error(sql, 02, "SELECT: cannot use non GROUP BY 
column '%s' in query results without an aggregate function", rs->name);
        if (rs->card <= CARD_ATOM && is_atom(rs)) {
                if (ls->card == rs->card)  /* bin compare op */
                        return rel_select(rel, e);
@@ -3663,21 +3661,12 @@
                        list *te = NULL; 
                        sql_exp *ce = rel_column_exp(sql, &inner, n->data.sym, 
sql_sel);
                        if (ce && exp_subtype(ce)) {
-                               /* seems some sub-queries return 
-                                  valid expressions with invalid cardinality 
-                                  (which need a dynamic check!!!)
-                                */
-                               if (/*outer && */ rel->card < ce->card) {
-                                       if (ce->type == e_column && ce->r) {
-                                               return sql_error(sql, 02, 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", ce->r);
+                               if (rel->card < ce->card) {
+                                       if (ce->name) {
+                                               return sql_error(sql, 02, 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", ce->name);
                                        } else {
                                                return sql_error(sql, 02, 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
                                        }
-/*
-                                       assert(0);
-                                       ce = rel_groupby_add_aggr(sql, rel->l, 
ce);
-                                       ce->card = rel->card;   
-*/
                                }
                                if (sn->having) {
                                        ce = rel_groupby_add_aggr(sql, inner, 
ce);
@@ -3708,36 +3697,8 @@
                        list_merge( rel->exps, te, (fdup)&exp_dup);
                        list_destroy(te);
                }
-               /* here we need to check the cardinality of the columns */
-               if (rel && is_project(rel->op) && !outer) {
-                       node *n;
-                       list *exps = rel->exps;
-
-                       for (n = exps->h; n; n = n->next) {
-                               sql_exp *ce = n->data;
-
-                               if (ce->card > rel->card) {
-                                       rel_destroy(rel);
-                                       assert(0);
-                                       if (ce->type == e_column && ce->r) {
-                                               return sql_error(sql, 02, 
"SELECT: cannot use non GROUP BY column '%s' in query results without an 
aggregate function", ce->r);
-                                       } else {
-                                               return sql_error(sql, 02, 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
-                                       }
-                               }
-/*
-                               if (rel->card != ce->card && ce->card != 
CARD_ATOM) {
-                                       rel_destroy(rel);
-                                       return sql_error(sql, 02, "SELECT: 
single value in column expression");
-                               }
-                               ce->card = rel->card;
-*/
-                               /* reset cardinality of constants */
-                       }
-               }
        } else {
                /* select * from tables */
-
                if (aggr) {
                        rel_destroy(rel);
                        return sql_error(sql, 02, "SELECT: cannot combine '*' 
with GROUP BY");
@@ -3972,11 +3933,12 @@
        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;
+               char rname[16], *rnme;
                dnode *n = js->data.lval->h;
                list *outexps = new_exp_list(), *exps;
                node *m;
 
+               rnme = number2name(rname, 16, ++sql->label);
                for (; n; n = n->next) {
                        char *nm = n->data.sval;
                        sql_exp *cond;
@@ -3992,7 +3954,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, tname, nm);
+                       exp_setname(ls, rnme, nm);
                        append(outexps, ls);
                        if (!rel) {
                                list_destroy(outexps);

Index: rel_exp.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_exp.mx,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- rel_exp.mx  29 Jan 2008 08:51:08 -0000      1.4
+++ rel_exp.mx  29 Jan 2008 15:02:21 -0000      1.5
@@ -58,8 +58,8 @@
 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 sql_exp * exp_column( char *rname, char *name, sql_subtype *t, int 
card);
+extern void exp_setname( sql_exp *e, char *rname, char *name );
 
 extern void exp_swap( sql_exp *e );
 
@@ -77,7 +77,7 @@
 extern int exp_is_correlation(sql_exp *e, sql_rel *r );
 
 extern sql_exp *exps_bind_column( list *exps, char *cname);
-extern sql_exp *exps_bind_column2( list *exps, char *tname, char *cname);
+extern sql_exp *exps_bind_column2( list *exps, char *rname, char *cname);
 
 #endif /* _REL_EXP_H_ */
 @c
@@ -292,14 +292,14 @@
 }
 
 sql_exp * 
-exp_column( char *tname, char *cname, sql_subtype *t, int card) 
+exp_column( char *rname, 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->l = (rname)?_strdup(rname):NULL;
        e->r = _strdup(cname);
        e->f = t;
        return e;
@@ -309,7 +309,7 @@
    to this expression by this simple name.
  */
 void 
-exp_setname( sql_exp *e, char *tname, char *name )
+exp_setname( sql_exp *e, char *rname, char *name )
 {
        if (e->name)
                _DELETE(e->name);
@@ -317,7 +317,7 @@
 
        if (e->rname)
                _DELETE(e->rname);
-       e->rname = (tname)?_strdup(tname):NULL;
+       e->rname = (rname)?_strdup(rname):NULL;
 }
 
 void
@@ -543,10 +543,11 @@
        return NULL;
 }
 
+/*
 static sql_exp *
 exp_find_column( sql_exp *e )
 {
-       while(e && e->type != e_column) {
+       while(e && !is_column(e->type)) {
                if (e->type == e_atom || e->type == e_cmp || !e->l)
                        return NULL;
                if (e->type == e_aggr || e->type == e_func) {
@@ -558,19 +559,23 @@
        }
        return e;
 }
+*/
 
 sql_exp *
-exps_bind_column2( list *exps, char *tname, char *cname ) 
+exps_bind_column2( list *exps, char *rname, char *cname ) 
 {
        if (exps) {
                node *en;
 
                for (en = exps->h; en; en = en->next ) {
-                       sql_exp *e = exp_find_column(en->data);
+                       //sql_exp *e = exp_find_column(en->data);
+                       sql_exp *e = en->data;
                
-                       if (e && e->type == e_column && e->name && e->l && 
strcmp(e->name, cname) == 0 && strcmp(e->l, tname) == 0)
+                       if (e && is_column(e->type) && e->name && e->rname && 
strcmp(e->name, cname) == 0 && strcmp(e->rname, rname) == 0)
                                return e;
-                       if (e && e->type == e_column && !e->name && e->l && 
e->r && strcmp(e->r, cname) == 0 && strcmp(e->l, tname) == 0)
+                       if (e && is_column(e->type) && e->name && e->l && 
strcmp(e->name, cname) == 0 && strcmp(e->l, rname) == 0)
+                               return e;
+                       if (e && is_column(e->type) && !e->name && e->l && e->r 
&& strcmp(e->r, cname) == 0 && strcmp(e->l, rname) == 0)
                                return e;
                }
        }

Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- rel_bin.mx  29 Jan 2008 08:51:08 -0000      1.32
+++ rel_bin.mx  29 Jan 2008 15:02:21 -0000      1.33
@@ -318,10 +318,12 @@
 stmt_rename( sql_rel *rel, sql_exp *exp, stmt *s )
 {
        char *name = exp->name;
-       char *rname = rel->name;
+       char *rname = exp->rname;
 
        if (!name)
                name = column_name(s);
+       if (!rname)     
+               rname = rel->name;
        if (!rname)
                rname = table_name(s);
        name = _strdup(name);
@@ -373,12 +375,14 @@
                for( en = rel->exps->h; en; en = en->next ) {
                        sql_exp *exp = en->data;
                        stmt *s = bin_find_column(sub, exp->l, exp->r);
+                       char *rname = exp->rname;
        
                        if (!s) {
                                assert(0);
                                stmt_destroy(sub);
                                return NULL;
                        }
+                       rname = rname?_strdup(rname):NULL;
                        s = stmt_alias(s, NULL, _strdup(exp->name));
                        list_append(l, s);
                }

Index: rel_dump.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_dump.mx,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- rel_dump.mx 27 Jan 2008 15:40:06 -0000      1.21
+++ rel_dump.mx 29 Jan 2008 15:02:21 -0000      1.22
@@ -124,7 +124,7 @@
                if (e->l)
                        printf("%s.", (char*)e->l);
                printf("%s", (char*)e->r);
-               if (e->name && strcmp(e->name, e->r)==0)
+               if (!e->rname && e->name && strcmp(e->name, e->r)==0)
                        alias = 0;
                break;
        case e_cmp: 
@@ -141,8 +141,12 @@
        }
        if (e->flag&ASCENDING)
                printf(" ASC");
-       if (e->name && alias)
-               printf(" as %s", e->name);
+       if (e->name && alias) {
+               printf(" as ");
+               if (e->rname)
+                       printf("%s.", e->rname);
+               printf("%s", e->name);
+       }
        if (comma)
                printf(", ");
 }


-------------------------------------------------------------------------
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

Reply via email to