Changeset: 22b8f71d7627 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/22b8f71d7627
Modified Files:
        sql/common/sql_types.c
        sql/common/sql_types.h
        sql/storage/store.c
Branch: mangled
Log Message:

mangle name for all function and procedure variants.


diffs (117 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -625,21 +625,37 @@ sql_create_arg(sql_allocator *sa, const 
        return create_arg(sa, name, t, inout);
 }
 
-static char* mangle_name(sql_allocator *sa, const char *name, sql_ftype type, 
sql_arg *res, list *ops) {
-
-       if (type != F_FUNC && type != F_AGGR)
-               return (char*) str_nil;
-
+char*
+mangle_name(sql_allocator *sa, const char *name, sql_ftype type, list *res, 
list *ops) {
        char buf[1000] = {0};
 
        char* c = buf; // cursor
 
-       assert(type == F_FUNC || type == F_AGGR);
+       int retc = res ? res->cnt : 0;
+       int argc = retc + ops->cnt;
 
-       c += sprintf(buf, "function_or_aggregate%%%s", name);
+       switch (type) {
+       case F_FUNC:
+       case F_AGGR:
+       case F_FILT:
+               c += sprintf(buf, "function_or_aggregate%%%s(%u,%u)", name, 
retc, argc);break;
+       case F_ANALYTIC:
+               c += sprintf(buf, "window%%%s(%u,%u)", name, retc, argc);break;
+       case F_UNION:
+               c += sprintf(buf, "table_returning_function%%%s(%u,%u)", name, 
retc, argc);break;
+       case F_PROC:
+               c += sprintf(buf, "procedure%%%s(%u,%u)", name, retc, 
argc);break;
+       case F_LOADER:
+               c += sprintf(buf, "loader%%%s(%u,%u)", name, retc, argc);break;
+       default:
+               assert(0); // Should not happen.
+       }
 
        if (res) {
-               c += sprintf(c, "%%%s(%u,%u)", res->type.type->base.name, 
res->type.digits, res->type.scale);
+               for (node* n = res->h; n; n = n->next) {
+                       sql_arg *o = n->data;
+                       c += sprintf(c, "%%%s(%u,%u)", o->type.type->base.name, 
o->type.digits, o->type.scale);
+               }
        }
 
        for (node* n = ops->h; n; n = n->next) {
@@ -647,7 +663,7 @@ static char* mangle_name(sql_allocator *
                c += sprintf(c, "%%%s(%u,%u)", a->type.type->base.name, 
a->type.digits, a->type.scale);
        }
 
-       return sa_strdup(sa, buf);
+       return SA_STRDUP(sa, buf);
 }
 
 static sql_func *
@@ -662,13 +678,15 @@ sql_create_func_(sql_allocator *sa, cons
                sql_type *tpe = va_arg(valist, sql_type*);
                list_append(ops, create_arg(sa, NULL, sql_create_subtype(sa, 
tpe, 0, 0), ARG_IN));
        }
-       if (res)
+       list *lres = NULL;
+       if (res) {
                fres = create_arg(sa, NULL, sql_create_subtype(sa, res, 0, 0), 
ARG_OUT);
+               lres = SA_LIST(sa, (fdestroy) &arg_destroy);
+               list_append(lres, fres);
+       }
        base_init(sa, &t->base, local_id++, false, name);
 
-       t->mangled = mangle_name(sa, name, type, fres, ops);
-       if (t->mangled)
-               printf("%s\n", t->mangled);
+       t->mangled = mangle_name(sa, name, type, lres, ops);
        t->imp = sa_strdup(sa, imp);
        t->mod = sa_strdup(sa, mod);
        t->ops = ops;
diff --git a/sql/common/sql_types.h b/sql/common/sql_types.h
--- a/sql/common/sql_types.h
+++ b/sql/common/sql_types.h
@@ -28,6 +28,7 @@ extern unsigned int type_digits_to_char_
 extern int sql_type_convert(int form, int to); /* return 1, convert possible 
but it's a down cast, 2 convert possible can be done savely */
 extern bool is_commutative(const char *sname, const char *fnm);        /* 
return true if commutative */
 
+extern char* mangle_name(sql_allocator *sa, const char *name, sql_ftype type, 
list *res, list *ops);
 extern char *sql_bind_alias(const char *alias);
 
 extern sql_subtype *arg_type( sql_arg *a);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4825,6 +4825,7 @@ create_sql_func(sqlstore *store, sql_all
 
        base_init(sa, &t->base, next_oid(store), true, func);
        assert(mod);
+       t->mangled = mangle_name(sa, func, type, res, args);
        t->imp = (impl)?SA_STRDUP(sa, impl):NULL;
        t->mod = SA_STRDUP(sa, mod);
        t->type = type;
@@ -4858,6 +4859,7 @@ sql_trans_create_func(sql_func **fres, s
        sql_func *t = SA_ZNEW(tr->sa, sql_func);
        base_init(tr->sa, &t->base, next_oid(tr->store), true, func);
        assert(mod);
+       t->mangled = mangle_name(tr->sa, func, type, ffres, args);
        t->imp = (impl)?SA_STRDUP(tr->sa, impl):NULL;
        t->mod = SA_STRDUP(tr->sa, mod);
        t->type = type;
@@ -4884,7 +4886,7 @@ sql_trans_create_func(sql_func **fres, s
 
        if ((res = os_add(s->funcs, tr, t->base.name, &t->base)))
                return res;
-       if ((res = store->table_api.table_insert(tr, sysfunc, &t->base.id, 
&t->base.name, query?(char**)&query:&t->imp, &t->mod, &flang, &ftype, 
&t->side_effect,
+       if ((res = store->table_api.table_insert(tr, sysfunc, &t->base.id, 
&t->base.name, &t->mangled, query?(char**)&query:&t->imp, &t->mod, &flang, 
&ftype, &t->side_effect,
                        &t->varres, &t->vararg, &s->base.id, &t->system, 
&t->semantics)))
                return res;
        if (t->res) for (n = t->res->h; n; n = n->next, number++) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to