Changeset: 9ba1aec2265b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9ba1aec2265b
Added Files:
sql/test/BugTracker-2013/Tests/qualified_aggrname.Bug-3332.sql
sql/test/BugTracker-2013/Tests/qualified_aggrname.Bug-3332.stable.err
sql/test/BugTracker-2013/Tests/qualified_aggrname.Bug-3332.stable.out
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/server/rel_updates.c
sql/server/sql_parser.y
sql/test/BugTracker-2013/Tests/All
Branch: default
Log Message:
merged with feb2013
diffs (truncated from 506 to 300 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -5870,7 +5870,7 @@ rel_apply_rewrite(int *changes, mvc *sql
return rel;
}
if (r->op == op_project) { /* merge projections */
- if (!r->l) { // TODO check realy apply case
+ if (!r->l) { /* TODO check realy apply case */
(*changes)++;
return l;
} else {
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
@@ -646,7 +646,6 @@ rel_inplace_project(sql_allocator *sa, s
rel->card = CARD_MULTI;
rel->flag = 0;
if (l) {
-// rel->card = l->card;
rel->nrcols = l->nrcols;
assert (exps_card(rel->exps) <= rel->card);
}
@@ -1490,10 +1489,8 @@ rel_named_table_operator(mvc *sql, sql_r
if (column_spec) {
dnode *n = column_spec->h;
- //TO be tested if (!is_project(sq->op)) {
- sq = rel_project(sql->sa, sq,
rel_projections(sql, sq, NULL, 1, 1));
- set_processed(sq);
- //}
+ sq = rel_project(sql->sa, sq, rel_projections(sql, sq,
NULL, 1, 1));
+ set_processed(sq);
for (en = sq->exps->h; n && en; n = n->next, en =
en->next)
exp_setname(sql->sa, en->data, tname,
n->data.sval );
}
@@ -3235,7 +3232,7 @@ rel_unop_(mvc *sql, sql_exp *e, sql_sche
return NULL;
}
-static sql_exp * _rel_aggr(mvc *sql, sql_rel **rel, int distinct, char
*aggrstr, dnode *arguments, int f);
+static sql_exp * _rel_aggr(mvc *sql, sql_rel **rel, int distinct, sql_schema
*s, char *aname, dnode *arguments, int f);
static sql_exp *
rel_unop(mvc *sql, sql_rel **rel, symbol *se, int fs, exp_kind ek)
@@ -3261,7 +3258,7 @@ rel_unop(mvc *sql, sql_rel **rel, symbol
if (!f)
f = sql_bind_func(sql->sa, s, fname, t, NULL, F_AGGR);
if (f && IS_AGGR(f->func))
- return _rel_aggr(sql, rel, 0, fname, l->next, fs);
+ return _rel_aggr(sql, rel, 0, s, fname, l->next, fs);
return rel_unop_(sql, e, s, fname, ek.card);
}
@@ -3561,7 +3558,7 @@ rel_nop(mvc *sql, sql_rel **rel, symbol
}
static sql_exp *
-_rel_aggr(mvc *sql, sql_rel **rel, int distinct, char *aggrstr, dnode *args,
int f)
+_rel_aggr(mvc *sql, sql_rel **rel, int distinct, sql_schema *s, char *aname,
dnode *args, int f)
{
exp_kind ek = {type_value, card_column, FALSE};
sql_subaggr *a = NULL;
@@ -3570,10 +3567,10 @@ static sql_exp *
list *exps = NULL;
if (!groupby) {
- char *uaggrstr = malloc(strlen(aggrstr) + 1);
+ char *uaname = malloc(strlen(aname) + 1);
sql_exp *e = sql_error(sql, 02, "%s: missing group by",
- toUpperCopy(uaggrstr, aggrstr));
- free(uaggrstr);
+ toUpperCopy(uaname, aname));
+ free(uaname);
return e;
}
@@ -3600,24 +3597,24 @@ static sql_exp *
}
if (f == sql_where) {
- char *uaggrstr = malloc(strlen(aggrstr) + 1);
+ char *uaname = malloc(strlen(aname) + 1);
sql_exp *e = sql_error(sql, 02, "%s: not allowed in WHERE
clause",
- toUpperCopy(uaggrstr, aggrstr));
- free(uaggrstr);
+ toUpperCopy(uaname, aname));
+ free(uaname);
return e;
}
if (!args->data.sym) { /* count(*) case */
sql_exp *e;
- if (strcmp(aggrstr, "count") != 0) {
- char *uaggrstr = malloc(strlen(aggrstr) + 1);
+ if (strcmp(aname, "count") != 0) {
+ char *uaname = malloc(strlen(aname) + 1);
sql_exp *e = sql_error(sql, 02, "%s: unable to perform
'%s(*)'",
- toUpperCopy(uaggrstr, aggrstr),
aggrstr);
- free(uaggrstr);
+ toUpperCopy(uaname, aname), aname);
+ free(uaname);
return e;
}
- a = sql_bind_aggr(sql->sa, sql->session->schema, aggrstr, NULL);
+ a = sql_bind_aggr(sql->sa, s, aname, NULL);
/* add aggr expression to the groupby, and return a
column expression */
@@ -3663,9 +3660,9 @@ static sql_exp *
}
groupby->l = gr;
- a = sql_bind_aggr_(sql->sa, sql->session->schema, aggrstr,
exp_types(sql->sa, exps));
+ a = sql_bind_aggr_(sql->sa, s, aname, exp_types(sql->sa, exps));
if (!a) { /* find aggr + convert */
- a = sql_find_aggr(sql->sa, sql->session->schema, aggrstr);
+ a = sql_find_aggr(sql->sa, s, aname);
if (a) {
node *n, *op = a->aggr->ops->h;
list *nexps = sa_list(sql->sa);
@@ -3693,7 +3690,7 @@ static sql_exp *
} else {
sql_exp *e;
char *type = "unknown";
- char *uaggrstr = malloc(strlen(aggrstr) + 1);
+ char *uaname = malloc(strlen(aname) + 1);
if (exps->h) {
sql_exp *e = exps->h->data;
@@ -3701,9 +3698,9 @@ static sql_exp *
}
e = sql_error(sql, 02, "%s: no such operator '%s(%s)'",
- toUpperCopy(uaggrstr, aggrstr), aggrstr, type);
-
- free(uaggrstr);
+ toUpperCopy(uaname, aname), aname, type);
+
+ free(uaname);
return e;
}
}
@@ -3713,10 +3710,14 @@ rel_aggr(mvc *sql, sql_rel **rel, symbol
{
dlist *l = se->data.lval;
int distinct = l->h->next->data.i_val;
- char *aggrstr = l->h->data.sval;
+ char *aname = qname_fname(l->h->data.lval);
+ char *sname = qname_schema(l->h->data.lval);
+ sql_schema *s = sql->session->schema;
assert(l->h->next->type == type_int);
- return _rel_aggr( sql, rel, distinct, aggrstr, l->h->next->next, f);
+ if (sname)
+ s = mvc_bind_schema(sql, sname);
+ return _rel_aggr( sql, rel, distinct, s, aname, l->h->next->next, f);
}
static sql_exp *
@@ -4284,7 +4285,6 @@ rel_order_by(mvc *sql, sql_rel **R, symb
int is_last = 0;
exp_kind ek = {type_value, card_column, FALSE};
- //e = rel_column_ref(sql, &rel, col, f);
e = rel_value_exp2(sql, &rel, col, f, ek,
&is_last);
/* do not cache this query */
@@ -4300,7 +4300,6 @@ rel_order_by(mvc *sql, sql_rel **R, symb
e = exps_get_exp(rel->exps, nr);
if (!e)
return NULL;
- //e = exp_column(sql->sa,
e->rname, e->r, exp_subtype(e), rel->card, has_nil(e), is_intern(e));
e = exp_column(sql->sa,
e->rname, exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_intern(e));
} else if (e->type == e_atom) {
return sql_error(sql, 02,
"order not of type SQL_COLUMN\n");
@@ -4366,24 +4365,31 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
dlist *l = se->data.lval;
symbol *window_function = l->h->data.sym;
dlist *window_specification = l->h->next->data.lval;
- char *aggrstr = NULL;
+ char *aname = NULL;
+ char *sname = NULL;
sql_subfunc *wf = NULL;
sql_exp *e = NULL;
sql_rel *r = *rel;
list *gbe = NULL, *obe = NULL;
sql_subtype *idtype = sql_bind_localtype("oid");
+ sql_schema *s = sql->session->schema;
if (window_function->token == SQL_RANK) {
- aggrstr = window_function->data.sval;
+ aname = qname_fname(window_function->data.lval);
+ sname = qname_schema(window_function->data.lval);
} else { /* window aggr function */
- aggrstr = window_function->data.lval->h->data.sval;
- }
+ dnode *n = window_function->data.lval->h;
+ aname = qname_fname(n->data.lval);
+ sname = qname_schema(n->data.lval);
+ }
+ if (sname)
+ s = mvc_bind_schema(sql, sname);
if (f == sql_where) {
- char *uaggrstr = malloc(strlen(aggrstr) + 1);
+ char *uaname = malloc(strlen(aname) + 1);
e = sql_error(sql, 02, "%s: not allowed in WHERE clause",
- toUpperCopy(uaggrstr, aggrstr));
- free(uaggrstr);
+ toUpperCopy(uaname, aname));
+ free(uaname);
return e;
}
@@ -4411,9 +4417,9 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
if (!obe)
return NULL;
}
- wf = sql_bind_func(sql->sa, sql->session->schema, aggrstr, idtype,
NULL, F_FUNC);
+ wf = sql_bind_func(sql->sa, s, aname, idtype, NULL, F_FUNC);
if (!wf)
- return sql_error(sql, 02, "SELECT: function '%s' not found",
aggrstr );
+ return sql_error(sql, 02, "SELECT: function '%s' not found",
aname );
/* now we need the gbe and obe lists */
e = exp_op(sql->sa, gbe, wf);
/* make sure the expression has the proper cardinality */
@@ -4768,25 +4774,6 @@ join_on_column_name(mvc *sql, sql_rel *r
}
-#if 0
-static sql_rel *exp_top_relation(sql_exp *e )
-{
- switch(e->type) {
- case e_atom:
- return NULL;
- case e_convert:
- case e_cmp:
- if (e->l)
- return exp_top_relation(e->l);
- break;
- case e_column:
- default:
- return NULL;
- }
- return NULL;
-}
-#endif
-
static int
exp_is_not_intern(sql_exp *e)
{
@@ -4955,13 +4942,12 @@ rel_select_exp(mvc *sql, sql_rel *rel, S
if (!l || !(l=rel_check_type(sql, wrd, l, type_equal)))
return NULL;
- if ((ek.card != card_relation && sn->limit) &&
- (ek.card == card_value && sn->limit)) {
- sql_subaggr *zero_or_one = sql_bind_aggr(sql->sa,
sql->session->schema, "zero_or_one", exp_subtype(l));
-
- l = exp_aggr1(sql->sa, l, zero_or_one, 0, 0, CARD_ATOM,
0);
- }
- /* return sql_error(sql, 01, "SELECT: LIMIT only allowed on
outermost SELECT"); */
+ if ((ek.card != card_relation && sn->limit) &&
+ (ek.card == card_value && sn->limit)) {
+ sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(l));
+
+ l = exp_aggr1(sql->sa, l, zero_or_one, 0, 0,
CARD_ATOM, 0);
+ }
append(exps, l);
} else
append(exps, NULL);
@@ -5016,9 +5002,22 @@ rel_query(mvc *sql, sql_rel *rel, symbol
for (n = fl->h; n ; n = n->next) {
fnd = table_ref(sql, NULL, n->data.sym);
- if (!fnd && rel) {
+ if (!fnd && rel && sql->session->status !=
-ERR_AMBIGUOUS) {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = 0;
if (used)
rel = rel_dup(rel);
+ if (!used) {
+ sql_rel *o = rel;
+
+ /* remove the outer (running) project */
+ if (!is_processed(o) &&
is_project(o->op))
+ o = rel->l;
+ outer = rel;
+ /* create dummy single row project */
+ rel = rel_project(sql->sa, NULL,
applyexps = rel_projections(sql, o, NULL, 1, 1));
+ }
fnd = table_ref(sql, rel, n->data.sym);
used = 1;
}
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list