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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list