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