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
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to