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