Changeset: 035bc030ee6c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=035bc030ee6c
Modified Files:
sql/server/rel_rel.c
sql/server/rel_select.c
sql/test/miscellaneous/Tests/simple_selects.stable.err
Branch: octbugs
Log Message:
Fixing bugs with aliases. When binding a group by column from an alias, look
for a possible duplicated one. Also look for ambiguous identifiers when binding
a column from a projection before returning
diffs (117 lines):
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -269,18 +269,22 @@ rel_bind_column_(mvc *sql, int *exp_has_
case op_groupby:
case op_project:
case op_table:
- case op_basetable:
- if (rel->exps && exps_bind_column(rel->exps, cname, &ambiguous,
&multi, no_tname))
- return rel;
- if (rel->r && is_groupby(rel->op) && exps_bind_column(rel->r,
cname, &ambiguous, &multi, no_tname))
- return rel;
+ case op_basetable: {
+ sql_exp *found = NULL;
+
+ if (rel->exps)
+ found = exps_bind_column(rel->exps, cname, &ambiguous,
&multi, no_tname);
+ if (!found && rel->r && is_groupby(rel->op))
+ found = exps_bind_column(rel->r, cname, &ambiguous,
&multi, no_tname);
if (ambiguous || multi)
return sql_error(sql, ERR_AMBIGUOUS, SQLSTATE(42000)
"SELECT: identifier '%s' ambiguous", cname);
+ if (found)
+ return rel;
if (is_processed(rel))
return NULL;
if (rel->l && !(is_base(rel->op)))
return rel_bind_column_(sql, exp_has_nil, rel->l,
cname, no_tname);
- break;
+ } break;
case op_semi:
case op_anti:
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -3862,12 +3862,14 @@ rel_next_value_for( mvc *sql, symbol *se
/* some users like to use aliases already in the groupby */
static sql_exp *
-rel_selection_ref(sql_query *query, sql_rel **rel, symbol *grp, dlist
*selection )
+rel_selection_ref(sql_query *query, sql_rel **rel, symbol *grp, dlist
*selection)
{
sql_allocator *sa = query->sql->sa;
- dlist *gl;
+ dlist *nl, *gl;
char *name = NULL;
exp_kind ek = {type_value, card_column, FALSE};
+ sql_exp *res = NULL;
+ symbol *nsym;
if (grp->token != SQL_COLUMN && grp->token != SQL_IDENT)
return NULL;
@@ -3884,32 +3886,28 @@ rel_selection_ref(sql_query *query, sql_
if (to == SQL_COLUMN || to == SQL_IDENT) {
dlist *l = n->data.sym->data.lval;
/* AS name */
- if (l->h->next->data.sval &&
- strcmp(l->h->next->data.sval, name) ==
0){
+ if (l->h->next->data.sval &&
strcmp(l->h->next->data.sval, name) == 0) {
sql_exp *ve = rel_value_exp(query, rel,
l->h->data.sym, sql_sel|sql_groupby, ek);
if (ve) {
- dlist *l = dlist_create(sa);
- symbol *sym;
+ if (res)
+ return sql_error(query->sql,
ERR_AMBIGUOUS, SQLSTATE(42000) "SELECT: identifier '%s' ambiguous", name);
+ res = ve;
+
+ nl = dlist_create(sa);
exp_setname(sa, ve, NULL, name);
- /* now we should rewrite the selection
- such that it uses the new group
- by column
- */
- dlist_append_string(sa, l,
- sa_strdup(sa, name));
- sym = symbol_create_list(sa, to, l);
- l = dlist_create(sa);
- dlist_append_symbol(sa, l, sym);
+ /* now we should rewrite the selection
such that it uses the new group by column */
+ dlist_append_string(sa, nl,
sa_strdup(sa, name));
+ nsym = symbol_create_list(sa, to, nl);
+ nl = dlist_create(sa);
+ dlist_append_symbol(sa, nl, nsym);
/* no alias */
- dlist_append_symbol(sa, l, NULL);
- n->data.sym = symbol_create_list(sa,
to, l);
-
+ dlist_append_symbol(sa, nl, NULL);
+ n->data.sym = symbol_create_list(sa,
to, nl);
}
- return ve;
}
}
}
- return NULL;
+ return res;
}
static sql_exp*
diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.err
b/sql/test/miscellaneous/Tests/simple_selects.stable.err
--- a/sql/test/miscellaneous/Tests/simple_selects.stable.err
+++ b/sql/test/miscellaneous/Tests/simple_selects.stable.err
@@ -266,6 +266,14 @@ MAPI = (monetdb) /var/tmp/mtest-493793/
QUERY = select cast(13121 as varchar(2147483647)) || cast(231231 as
varchar(2147483647)); --error, too big
ERROR = !SELECT: output number of digits for concat is too large
CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-921778/.s.monetdb.37437
+QUERY = select x as z, y as z from (select 1, 2) as x(x,y) group by z;
+ERROR = !SELECT: identifier 'z' ambiguous
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-921778/.s.monetdb.37437
+QUERY = select x as z, y as z from (select 1, 2) as x(x,y) order by z;
+ERROR = !SELECT: identifier 'z' ambiguous
+CODE = 42000
# 17:31:38 >
# 17:31:38 > "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list