Update of /cvsroot/monetdb/sql/src/server
In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv2788

Modified Files:
        rel_select.mx 
Log Message:
in rel_unop check if a function is an aggregate operation. If so
we now switch to rel_aggr. 


Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.168
retrieving revision 1.169
diff -u -d -r1.168 -r1.169
--- rel_select.mx       12 Jan 2010 09:17:35 -0000      1.168
+++ rel_select.mx       10 Feb 2010 08:21:49 -0000      1.169
@@ -2958,6 +2958,8 @@
        return NULL;
 }
 
+static sql_exp * _rel_aggr(mvc *sql, sql_rel **rel, int distinct, char 
*aggrstr, symbol *sym, int f);
+
 static sql_exp *
 rel_unop(mvc *sql, sql_rel **rel, symbol *se, int fs, exp_kind ek)
 {
@@ -2967,11 +2969,19 @@
        sql_schema *s = sql->session->schema;
        exp_kind iek = {type_value, card_column, FALSE};
        sql_exp *e = rel_value_exp(sql, rel, l->next->data.sym, fs, iek);
+       sql_subfunc *f = NULL;
+       sql_subtype *t = NULL;
 
        if (!e)
                return NULL;
        if (sname) 
                s = mvc_bind_schema(sql, sname);
+       if (!s)
+               s = sql->session->schema;
+       t = exp_subtype(e);
+       f = sql_bind_func(s, fname, t, NULL);
+       if (f && f->func->aggr)
+               return _rel_aggr(sql, rel, 0, fname, l->next->data.sym, fs);
        return rel_unop_(sql, e, s, fname, (ek.card == card_relation));
 }
 
@@ -3255,18 +3265,12 @@
 }
 
 static sql_exp *
-rel_aggr(mvc *sql, sql_rel **rel, symbol *se, int f)
+_rel_aggr(mvc *sql, sql_rel **rel, int distinct, char *aggrstr, symbol *sym, 
int f)
 {
-       dlist *l = se->data.lval;
        sql_subaggr *a = NULL;
-       int distinct = l->h->next->data.i_val;
-       char *aggrstr = l->h->data.sval;
-       sql_exp *e = NULL, *exp = NULL;
-       sql_rel *groupby;
        int no_nil = 0;
-
-       assert(l->h->next->type == type_int);
-       groupby = *rel;
+       sql_exp *e = NULL, *exp = NULL;
+       sql_rel *groupby = *rel;
 
        if (f == sql_having && is_select(groupby->op)) 
                groupby = groupby->l;
@@ -3294,7 +3298,7 @@
                return sql_error(sql, 02, "%s: not allowed in WHERE clause",
                                toUpperCopy(alloca(strlen(aggrstr) + 1), 
aggrstr));
        
-       if (!l->h->next->next->data.sym) {      /* count(*) case */
+       if (!sym) {     /* count(*) case */
 
                if (strcmp(aggrstr, "count") != 0) {
                        return sql_error(sql, 02, "%s: unable to perform 
'%s(*)'",
@@ -3324,7 +3328,7 @@
                sql_rel *gr = groupby->l;
 
                no_nil = 1;
-               e = rel_value_exp(sql, &gr, l->h->next->next->data.sym, f, ek);
+               e = rel_value_exp(sql, &gr, sym, f, ek);
                groupby->l = gr;
        }
 
@@ -3361,6 +3365,17 @@
 }
 
 static sql_exp *
+rel_aggr(mvc *sql, sql_rel **rel, symbol *se, int f)
+{
+       dlist *l = se->data.lval;
+       int distinct = l->h->next->data.i_val;
+       char *aggrstr = l->h->data.sval;
+
+       assert(l->h->next->type == type_int);
+       return _rel_aggr( sql, rel, distinct, aggrstr, 
l->h->next->next->data.sym, f);
+}
+
+static sql_exp *
 rel_case(mvc *sql, sql_rel **rel, int token, symbol *opt_cond, dlist 
*when_search_list, symbol *opt_else, int f)
 {
        sql_subtype *tpe = NULL;


------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to