Update of /cvsroot/monetdb/sql/src/common
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv12834/src/common

Modified Files:
      Tag: GDK-2
        sql_backend.mx sql_types.mx 
Log Message:
propagated changes of Monday Sep 03 2007 - Thursday Sep 06 2007
from the development trunk to the GDK-2 branch


Index: sql_backend.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/common/sql_backend.mx,v
retrieving revision 1.25
retrieving revision 1.25.4.1
diff -u -d -r1.25 -r1.25.4.1
--- sql_backend.mx      21 Feb 2007 14:00:53 -0000      1.25
+++ sql_backend.mx      6 Sep 2007 13:52:00 -0000       1.25.4.1
@@ -49,7 +49,7 @@
 typedef void (*create_privileges_fptr) (ptr mvc, sql_schema *s);
 typedef int  (*schema_has_user_fptr) (ptr mvc, sql_schema *s);
 typedef int  (*alter_user_fptr) (ptr mvc, str user, str passwd, sqlid 
schema_id);
-typedef list*  (*schema_user_dependencies) (ptr mvc, int schema_id);
+typedef void*  (*schema_user_dependencies) (ptr mvc, int schema_id);
 
 /* backing struct for this interface */
 typedef struct _backend_functions {
@@ -64,7 +64,6 @@
        schema_user_dependencies fschuserdep;
 } backend_functions;
 
-extern void backend_init(backend_functions *funcs);
 extern void backend_freestack(backend_stack stk);
 extern void backend_freecode(backend_code code, backend_stack stk, int nr, 
char *name);
 
@@ -74,7 +73,9 @@
 extern void backend_create_privileges(ptr mvc, sql_schema *s);
 extern int  backend_schema_has_user(ptr mvc, sql_schema *s);
 extern int     backend_alter_user(ptr mvc, str user, str passwd, sqlid 
schema_id);
-extern list*   backend_schema_user_dependencies(ptr trans, int schema_id);
+extern void*   backend_schema_user_dependencies(ptr trans, int schema_id);
+
+extern backend_functions be_funcs;
 
 #endif /* _SQL_BACKEND_H_ */
 @c
@@ -82,91 +83,74 @@
 #include "sql_config.h"
 #include "sql_backend.h"
 
-static backend_functions *be_funcs = NULL;
-
-void
-backend_init(backend_functions *funcs)
-{
-       /* copy over, assume the caller doesn't modify the struct and that
-        * it is alloced appropriately */
-       be_funcs = funcs;
-}
+backend_functions be_funcs;
 
 void
 backend_freestack(backend_stack stk)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fstack != NULL)
-               be_funcs->fstack(stk);
+       if (be_funcs.fstack != NULL)
+               be_funcs.fstack(stk);
 }
 
 void
 backend_freecode(backend_code code, backend_stack stk, int nr, char *name)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fcode != NULL)
-               be_funcs->fcode(code, stk, nr, name);
+       if (be_funcs.fcode != NULL)
+               be_funcs.fcode(code, stk, nr, name);
 }
 
 char *
 backend_create_user(list *l, char *user, char *passwd, char *fullname, sqlid 
defschemid, sqlid grantor)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fcuser != NULL)
-               return(be_funcs->fcuser(l, user, passwd, fullname, defschemid, 
grantor));
+       if (be_funcs.fcuser != NULL)
+               return(be_funcs.fcuser(l, user, passwd, fullname, defschemid, 
grantor));
        return(NULL);
 }
 
 int
 backend_drop_user(ptr mvc, char *user)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fduser != NULL)
-               return(be_funcs->fduser(mvc,user));
+       if (be_funcs.fduser != NULL)
+               return(be_funcs.fduser(mvc,user));
        return FALSE;
 }
 
 int
 backend_find_user(ptr m, char *user)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->ffuser != NULL)
-               return(be_funcs->ffuser(m, user));
+       if (be_funcs.ffuser != NULL)
+               return(be_funcs.ffuser(m, user));
        return(0);
 }
 
 void
 backend_create_privileges(ptr mvc, sql_schema *s)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fcrpriv != NULL)
-               be_funcs->fcrpriv(mvc, s);
+       if (be_funcs.fcrpriv != NULL)
+               be_funcs.fcrpriv(mvc, s);
 }
 
 int
 backend_schema_has_user(ptr mvc, sql_schema *s)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fshuser != NULL)
-               return(be_funcs->fshuser(mvc, s));
+       if (be_funcs.fshuser != NULL)
+               return(be_funcs.fshuser(mvc, s));
        return(FALSE);
 }
 
 int
 backend_alter_user(ptr mvc, str user, str passwd, sqlid schema_id)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fauser != NULL)
-               return(be_funcs->fauser(mvc, user, passwd, schema_id));
+       if (be_funcs.fauser != NULL)
+               return(be_funcs.fauser(mvc, user, passwd, schema_id));
        return(FALSE);
 }
 
-list*
+void*
 backend_schema_user_dependencies(ptr trans, int schema_id)
 {
-       assert(be_funcs != NULL);
-       if (be_funcs->fschuserdep != NULL)
-               return(be_funcs->fschuserdep(trans, schema_id));
+       if (be_funcs.fschuserdep != NULL)
+               return(be_funcs.fschuserdep(trans, schema_id));
        return NULL;
 }
 @}

Index: sql_types.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/common/sql_types.mx,v
retrieving revision 1.90.2.3
retrieving revision 1.90.2.4
diff -u -d -r1.90.2.3 -r1.90.2.4
--- sql_types.mx        28 Aug 2007 13:31:33 -0000      1.90.2.3
+++ sql_types.mx        6 Sep 2007 13:52:00 -0000       1.90.2.4
@@ -99,7 +99,7 @@
 extern void arg_destroy(sql_arg *a);
 
 extern sql_subaggr *sql_bind_aggr(sql_schema *s, char *name, sql_subtype 
*type);
-extern sql_aggr *sql_create_aggr(char *name, char *mod, char *imp, sql_type 
*tpe, sql_type *res);
+extern sql_func *sql_create_aggr(char *name, char *mod, char *imp, sql_type 
*tpe, sql_type *res);
 extern sql_subaggr *sql_dup_aggr(sql_subaggr *a);
 extern void sql_subaggr_destroy(sql_subaggr *f);
 
@@ -122,7 +122,7 @@
 extern sql_func *sql_create_func3(char *name, char *mod, char *imp, sql_type 
*tpe1, sql_type *tpe2, sql_type *tpe3, sql_type *res, int scale_fixing);
 extern sql_func *sql_create_func4(char *name, char *mod, char *imp, sql_type 
*tpe1, sql_type *tpe2, sql_type *tpe3, sql_type *tpe4, sql_type *res, int 
scale_fixing);
 
-extern sql_func *sql_create_func_(char *name, char *mod, char *imp, list *ops, 
sql_subtype *res, bit side_effect);
+extern sql_func *sql_create_func_(char *name, char *mod, char *imp, list *ops, 
sql_subtype *res, bit side_effect, bit aggr);
 
 extern sql_func *sql_create_sqlfunc(char *name, char *imp, list *ops, 
sql_subtype *res);
 
@@ -503,11 +503,15 @@
 
        (void)s;
        while (n) {
-               sql_aggr *a = n->data;
+               sql_func *a = n->data;
+               sql_arg *arg = NULL;
 
-               if (strcmp(a->base.name, sqlaname) == 0 && (!a->tpe.type ||
-                   a->tpe.type->eclass == EC_ANY || 
-                   (type && is_subtype(type, &a->tpe )))) {
+               if (a->ops->h)
+                       arg = a->ops->h->data;
+
+               if (strcmp(a->base.name, sqlaname) == 0 && (!arg ||
+                   arg->type.type->eclass == EC_ANY || 
+                   (type && is_subtype(type, &arg->type )))) {
                        int scale = 0;
                        int digits = 0;
                        sql_subaggr *ares = NEW(sql_subaggr);
@@ -530,17 +534,45 @@
                }
                n = n->next;
        }
-       return NULL;
-}
+       if (s) {
+               node *n;
 
-void
-aggr_destroy(sql_aggr *t)
-{
-       base_destroy(&t->base);
-       _DELETE(t->imp);
-       if (t->mod)
-               _DELETE(t->mod);
-       _DELETE(t);
+               if (s->funcs.set) for (n=s->funcs.set->h; n; n = n->next) {
+                       sql_func *a = n->data;
+                       sql_arg *arg = NULL;
+
+                       if ((a->is_func && !a->res.type) || !a->aggr)
+                               continue;
+
+                       if (a->ops->h)
+                               arg = a->ops->h->data;
+
+                       if (strcmp(a->base.name, sqlaname) == 0 && (!arg ||
+                               arg->type.type->eclass == EC_ANY || 
+                               (type && is_subtype(type, &arg->type )))) {
+                               int scale = 0;
+                               int digits = 0;
+                               sql_subaggr *ares = NEW(sql_subaggr);
+               
+                               sql_ref_init(&(ares->ref));
+                               ares->aggr = a;
+                               digits = a->res.digits;
+                               scale = a->res.scale;
+                               /* same scale as the input */
+                               if (type) {
+                                       digits = type->digits;
+                                       scale = type->scale;
+                               }
+                               /* same type as the input */
+                               if (a->res.type->eclass == EC_ANY) 
+                                       sql_init_subtype(&ares->res, 
type->type, digits, scale);
+                               else
+                                       sql_init_subtype(&ares->res, 
a->res.type, digits, scale);
+                               return ares;
+                       }
+               }
+       }
+       return NULL;
 }
 
 sql_subaggr *
@@ -999,25 +1031,13 @@
        return t;
 }
 
-sql_aggr *
-sql_create_aggr(char *name, char *mod, char *imp, sql_type *tpe, sql_type *res)
+static sql_arg *
+create_arg(char *name, sql_subtype *t)
 {
-       sql_aggr *t = NEW(sql_aggr);
+       sql_arg *a = sql_create_arg(name, t);
 
-       base_init(&t->base, store_next_oid(), TR_OLD, name);
-       t->imp = _strdup(imp);
-       t->mod = _strdup(mod);
-       if (tpe) {
-               sql_init_subtype(&t->tpe, tpe, 0, 0);
-       } else {
-               t->tpe.type = NULL;
-       }
-       assert(res);
-       sql_init_subtype(&t->res, res, 0, 0);
-       t->nr = list_length(aggrs);
-       t->s = NULL;
-       list_append(aggrs, t);
-       return t;
+       sql_subtype_destroy(t);
+       return a;
 }
 
 sql_arg *
@@ -1030,16 +1050,6 @@
        return a;
 }
 
-static sql_arg *
-create_arg(char *name, sql_subtype *t)
-{
-       sql_arg *a = sql_create_arg(name, t);
-
-       sql_subtype_destroy(t);
-       return a;
-}
-
-
 sql_arg *
 arg_dup(sql_arg *oa)
 {
@@ -1059,6 +1069,19 @@
 }
 
 sql_func *
+sql_create_aggr(char *name, char *mod, char *imp, sql_type *tpe, sql_type *res)
+{
+       list *l = list_create((fdestroy) &arg_destroy);
+       sql_subtype sres;
+
+       if (tpe)
+               list_append(l, create_arg(NULL, sql_create_subtype(tpe, 0, 0)));
+       assert(res);
+       sql_init_subtype(&sres, res, 0, 0);
+       return sql_create_func_(name, mod, imp, l, &sres, FALSE, TRUE);
+}
+
+sql_func *
 sql_create_func(char *name, char *mod, char *imp, sql_type *tpe1, sql_type 
*tpe2, sql_type *res, int scale_fixing)
 {
        list *l = list_create((fdestroy) &arg_destroy);
@@ -1070,7 +1093,7 @@
                list_append(l,create_arg(NULL, sql_create_subtype(tpe2, 0, 0)));
 
        sql_init_subtype(&sres, res, 0, scale_fixing);
-       return sql_create_func_(name, mod, imp, l, &sres, FALSE);
+       return sql_create_func_(name, mod, imp, l, &sres, FALSE, FALSE);
 }
 
 sql_func *
@@ -1085,7 +1108,7 @@
                list_append(l,create_arg(NULL, sql_create_subtype(tpe2, 0, 0)));
 
        sql_init_subtype(&sres, res, 0, scale_fixing);
-       return sql_create_func_(name, mod, imp, l, &sres, TRUE);
+       return sql_create_func_(name, mod, imp, l, &sres, TRUE, FALSE);
 }
 
 
@@ -1100,7 +1123,7 @@
        list_append(l, create_arg(NULL, sql_create_subtype(tpe3, 0, 0)));
 
        sql_init_subtype(&sres, res, 0, scale_fixing);
-       return sql_create_func_(name, mod, imp, l, &sres, FALSE);
+       return sql_create_func_(name, mod, imp, l, &sres, FALSE, FALSE);
 }
 
 sql_func *
@@ -1115,12 +1138,12 @@
        list_append(l, create_arg(NULL, sql_create_subtype(tpe4, 0, 0)));
 
        sql_init_subtype(&sres, res, 0, scale_fixing);
-       return sql_create_func_(name, mod, imp, l, &sres, FALSE);
+       return sql_create_func_(name, mod, imp, l, &sres, FALSE, FALSE);
 }
 
 
 sql_func *
-sql_create_func_(char *name, char *mod, char *imp, list *ops, sql_subtype 
*res, bit side_effect)
+sql_create_func_(char *name, char *mod, char *imp, list *ops, sql_subtype 
*res, bit side_effect, bit aggr)
 {
        sql_func *t = NEW(sql_func);
 
@@ -1138,10 +1161,13 @@
        }
        t->nr = list_length(funcs);
        t->sql = 0;
-       t->aggr = 0;
+       t->aggr = aggr;
        t->side_effect = side_effect;
        t->s = NULL;
-       list_append(funcs, t);
+       if (aggr)
+               list_append(aggrs, t);
+       else
+               list_append(funcs, t);
        return t;
 }
 
@@ -1177,7 +1203,7 @@
        aliases = list_create((fdestroy) &alias_destroy);
        types = list_create((fdestroy) &type_destroy);
        localtypes = list_create((fdestroy) &sql_subtype_destroy);
-       aggrs = list_create((fdestroy) &aggr_destroy);
+       aggrs = list_create((fdestroy) &func_destroy);
        funcs = list_create((fdestroy) &func_destroy);
        sqltypeinit();
 }
@@ -1499,7 +1525,7 @@
                { sql_subtype sres;
                sql_init_subtype(&sres, *t, 0, 0);
                sql_create_func_("levenshtein", "calc", "levenshtein",
-                                list_append(list_append (list_append 
(list_append(list_append(list_create((fdestroy) &arg_destroy), create_arg(NULL, 
sql_create_subtype(*t, 0, 0))), create_arg(NULL, sql_create_subtype(*t, 0, 
0))), create_arg(NULL, sql_create_subtype(INT, 0, 0))), create_arg(NULL, 
sql_create_subtype(INT, 0, 0))), create_arg(NULL, sql_create_subtype(INT, 0, 
0))), &sres, FALSE);
+                                list_append(list_append (list_append 
(list_append(list_append(list_create((fdestroy) &arg_destroy), create_arg(NULL, 
sql_create_subtype(*t, 0, 0))), create_arg(NULL, sql_create_subtype(*t, 0, 
0))), create_arg(NULL, sql_create_subtype(INT, 0, 0))), create_arg(NULL, 
sql_create_subtype(INT, 0, 0))), create_arg(NULL, sql_create_subtype(INT, 0, 
0))), &sres, FALSE, FALSE);
                }
        }
 }


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to