Changeset: 31b5a8597517 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=31b5a8597517 Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_user.c sql/include/sql_catalog.h sql/server/rel_psm.c sql/server/sql_env.c sql/server/sql_mvc.c sql/server/sql_mvc.h sql/storage/sql_storage.h sql/storage/store.c Branch: RIntegration-default Log Message:
manual merge between vararg and rint for SQL, part 1 diffs (truncated from 382 to 300 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -869,8 +869,8 @@ create_func(mvc *sql, char *sname, sql_f return sql_message("3F000!CREATE %s%s: no such schema '%s'", KF, F, sname); if (!s) s = cur_schema(sql); - nf = mvc_create_func(sql, NULL, s, f->base.name, f->ops, f->res, f->type, f->mod, f->imp, f->query, f->varres, f->vararg); - if (nf && nf->query) { + nf = mvc_create_func(sql, NULL, s, f->base.name, f->ops, f->res, f->type, f->lang, f->mod, f->imp, f->query, f->varres, f->vararg); + if (nf && nf->query && nf->lang <= FUNC_LANG_SQL) { char *buf; sql_rel *r = NULL; sql_allocator *sa = sql->sa; diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c --- a/sql/backends/monet5/sql_user.c +++ b/sql/backends/monet5/sql_user.c @@ -211,7 +211,7 @@ monet5_create_privileges(ptr _mvc, sql_s ops = sa_list(m->sa); /* following funcion returns a table (single column) of user names with the approriate scenario (sql) */ - mvc_create_func(m, NULL, s, "db_users", ops, res, F_UNION, "sql", "db_users", "CREATE FUNCTION db_users () RETURNS TABLE( name varchar(2048)) EXTERNAL NAME sql.db_users;", FALSE, FALSE); + mvc_create_func(m, NULL, s, "db_users", ops, res, F_UNION, FUNC_LANG_SQL, "sql", "db_users", "CREATE FUNCTION db_users () RETURNS TABLE( name varchar(2048)) EXTERNAL NAME sql.db_users;", FALSE, FALSE); t = mvc_create_view(m, s, "users", SQL_PERSIST, "SELECT u.\"name\" AS \"name\", " "ui.\"fullname\", ui.\"default_schema\" " "FROM db_users() AS u LEFT JOIN " "\"sys\".\"db_user_info\" AS ui " "ON u.\"name\" = ui.\"name\" " ";", 1); mvc_create_column_(m, t, "name", "varchar", 1024); diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -285,6 +285,15 @@ typedef struct sql_arg { #define IS_FILT(f) (f->type == F_FILT) #define IS_UNION(f) (f->type == F_UNION) +#define FUNC_LANG_INT 0 /* internal */ +#define FUNC_LANG_MAL 1 /* create sql external mod.func */ +#define FUNC_LANG_SQL 2 /* create ... sql function/procedure */ +#define FUNC_LANG_R 3 /* create .. language R */ +#define FUNC_LANG_C 4 +#define FUNC_LANG_J 5 + +#define LANG_EXT(l) (l>FUNC_LANG_SQL) + typedef struct sql_func { sql_base base; @@ -298,6 +307,7 @@ typedef struct sql_func { 1 sql 2 sql instantiated proc */ + int lang; char *query; /* sql code */ bit side_effect; bit varres; /* variable output result */ diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -768,8 +768,25 @@ rel_create_func(mvc *sql, dlist *qname, return sql_error(sql, 01, "CREATE %s%s: failed to get restype", KF, F); } - - if (body) { /* sql func */ + if (body && lang > FUNC_LANG_SQL) { + char *lang_body = body->h->data.sval; + char *mod = (lang == FUNC_LANG_R)?"rapi": + (lang == FUNC_LANG_C)?"capi": + (lang == FUNC_LANG_J)?"japi":"unknown"; + sql->params = NULL; + if (create) { + f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, mod, fname, lang_body, FALSE, FALSE); + } else if (!sf) { + return sql_error(sql, 01, "CREATE %s%s: R function %s.%s not bound", KF, F, s->base.name, fname ); + } else { + sql_func *f = sf->func; + f->mod = _STRDUP("rapi"); + f->imp = _STRDUP("eval"); + if (res && restype) + f->res = *restype; + f->sql = 0; /* native */ + } + } else if (body) { sql_arg *ra = (restype && !is_table)?restype->h->data:NULL; list *b = NULL; sql_schema *old_schema = cur_schema(sql); @@ -795,7 +812,7 @@ rel_create_func(mvc *sql, dlist *qname, if (instantiate || deps) { return rel_psm_block(sql->sa, b); } else if (create) { - f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, "user", q, q, FALSE, vararg); + f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, "user", q, q, FALSE, vararg); } } else { char *fmod = qname_module(ext_name); @@ -805,7 +822,7 @@ rel_create_func(mvc *sql, dlist *qname, return NULL; sql->params = NULL; if (create) { - f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, fmod, fnme, q, FALSE, vararg); + f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, fmod, fnme, q, FALSE, vararg); } else if (!sf) { return sql_error(sql, 01, "CREATE %s%s: external name %s.%s not bound (%s,%s)", KF, F, fmod, fnme, s->base.name, fname ); } else { diff --git a/sql/server/sql_env.c b/sql/server/sql_env.c --- a/sql/server/sql_env.c +++ b/sql/server/sql_env.c @@ -101,13 +101,13 @@ sql_create_env(mvc *m, sql_schema *s) /* add function */ ops = sa_list(m->sa); - mvc_create_func(m, NULL, s, "env", ops, res, F_UNION, "sql", "sql_environment", "CREATE FUNCTION env () RETURNS TABLE( name varchar(1024), value varchar(2048)) EXTERNAL NAME sql.sql_environment;", FALSE, FALSE); + mvc_create_func(m, NULL, s, "env", ops, res, F_UNION, FUNC_LANG_SQL, "sql", "sql_environment", "CREATE FUNCTION env () RETURNS TABLE( name varchar(1024), value varchar(2048)) EXTERNAL NAME sql.sql_environment;", FALSE, FALSE); res = sa_list(m->sa); list_append(res, sql_create_arg(m->sa, "name", sql_bind_subtype(m->sa, "varchar", 1024, 0), ARG_OUT)); /* add function */ ops = sa_list(m->sa); - mvc_create_func(m, NULL, s, "var", ops, res, F_UNION, "sql", "sql_variables", "CREATE FUNCTION var() RETURNS TABLE( name varchar(1024)) EXTERNAL NAME sql.sql_variables;", FALSE, FALSE); + mvc_create_func(m, NULL, s, "var", ops, res, F_UNION, FUNC_LANG_SQL, "sql", "sql_variables", "CREATE FUNCTION var() RETURNS TABLE( name varchar(1024)) EXTERNAL NAME sql.sql_variables;", FALSE, FALSE); return 0; } diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -782,17 +782,17 @@ mvc_create_type(mvc *sql, sql_schema * s } sql_func * -mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema * s, char *name, list *args, list *res, int type, char *mod, char *impl, char *query, bit varres, bit vararg) +mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema * s, char *name, list *args, list *res, int type, int lang, char *mod, char *impl, char *query, bit varres, bit vararg) { sql_func *f = NULL; if (mvc_debug) fprintf(stderr, "#mvc_create_func %s\n", name); if (sa) { - f = create_sql_func(sa, name, args, res, type, mod, impl, query, varres, vararg); + f = create_sql_func(sa, name, args, res, type, lang, mod, impl, query, varres, vararg); f->s = s; } else - f = sql_trans_create_func(sql->session->tr, s, name, args, res, type, mod, impl, query, varres, vararg); + f = sql_trans_create_func(sql->session->tr, s, name, args, res, type, lang, mod, impl, query, varres, vararg); return f; } diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -171,7 +171,7 @@ extern sql_key *mvc_bind_ukey(sql_table extern sql_trigger *mvc_bind_trigger(mvc *c, sql_schema *s, char *tname); extern sql_type *mvc_create_type(mvc *sql, sql_schema *s, char *sqlname, int digits, int scale, int radix, char *impl); -extern sql_func *mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema *s, char *name, list *args, list *res, int type, char *mod, char *impl, char *query, bit varres, bit vararg); +extern sql_func *mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema *s, char *name, list *args, list *res, int type, int lang, char *mod, char *impl, char *query, bit varres, bit vararg); extern void mvc_drop_func(mvc *c, sql_schema *s, sql_func * func, int drop_action); extern void mvc_drop_all_func(mvc *c, sql_schema *s, list *list_func, int drop_action); diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -307,7 +307,7 @@ extern int sql_trans_commit(sql_trans *t extern sql_type *sql_trans_create_type(sql_trans *tr, sql_schema * s, char *sqlname, int digits, int scale, int radix, char *impl); -extern sql_func *sql_trans_create_func(sql_trans *tr, sql_schema * s, char *func, list *args, list *res, int type, char *mod, char *impl, char *query, bit varres, bit vararg); +extern sql_func *sql_trans_create_func(sql_trans *tr, sql_schema * s, char *func, list *args, list *res, int type, int lang, char *mod, char *impl, char *query, bit varres, bit vararg); extern void sql_trans_drop_func(sql_trans *tr, sql_schema *s, int id, int drop_action); extern void sql_trans_drop_all_func(sql_trans *tr, sql_schema *s, list *list_func, int drop_action); @@ -380,7 +380,7 @@ extern sql_key * key_create_done(sql_all extern sql_idx *create_sql_idx(sql_allocator *sa, sql_table *t, char *nme, idx_type it); extern sql_idx *create_sql_ic(sql_allocator *sa, sql_idx *i, sql_column *c); -extern sql_func *create_sql_func(sql_allocator *sa, char *func, list *args, list *res, int type, char *mod, char *impl, char *query, bit varres, bit vararg); +extern sql_func *create_sql_func(sql_allocator *sa, char *func, list *args, list *res, int type, int lang, char *mod, char *impl, char *query, bit varres, bit vararg); /* for alter we need to duplicate a table */ extern sql_table *dup_sql_table(sql_allocator *sa, sql_table *t); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -746,9 +746,10 @@ load_func(sql_trans *tr, sql_schema *s, t->imp = (v)?sa_strdup(tr->sa, v):NULL; _DELETE(v); v = table_funcs.column_find_value(tr, find_sql_column(funcs, "mod"), rid); t->mod = (v)?sa_strdup(tr->sa, v):NULL; _DELETE(v); - v = table_funcs.column_find_value(tr, find_sql_column(funcs, "sql"), rid); - t->sql = *(bit *)v; _DELETE(v); + v = table_funcs.column_find_value(tr, find_sql_column(funcs, "language"), rid); + t->lang = *(int *)v; _DELETE(v); v = table_funcs.column_find_value(tr, find_sql_column(funcs, "type"), rid); + t->sql = (t->lang==FUNC_LANG_SQL||t->lang==FUNC_LANG_MAL)?1:0; t->type = *(int *)v; _DELETE(v); v = table_funcs.column_find_value(tr, find_sql_column(funcs, "side_effect"), rid); t->side_effect = *(bit *)v; _DELETE(v); @@ -759,7 +760,7 @@ load_func(sql_trans *tr, sql_schema *s, t->res = NULL; t->s = s; t->fix_scale = SCALE_EQ; - if (t->sql) { + if (t->lang != FUNC_LANG_INT) { t->query = t->imp; t->imp = NULL; } @@ -875,6 +876,9 @@ load_schema(sql_trans *tr, sqlid id, oid find_sql_column(ss, "authorization"), rid); s->auth_id = *(sqlid *)v; _DELETE(v); v = table_funcs.column_find_value(tr, + find_sql_column(tables, "system"), rid); + s->system = *(bit *)v; _DELETE(v); + v = table_funcs.column_find_value(tr, find_sql_column(tables, "system"), rid); s->system = *(bit *)v; _DELETE(v); v = table_funcs.column_find_value(tr, find_sql_column(ss, "owner"), rid); @@ -1038,17 +1042,17 @@ insert_functions(sql_trans *tr, sql_tabl for (n = funcs->h; n; n = n->next) { sql_func *f = n->data; - bit sql = f->sql; + int lang = FUNC_LANG_INT; bit se = f->side_effect; sqlid id; int number = 0; char arg_nme[] = "arg_0"; if (f->s) - table_funcs.table_insert(tr, sysfunc, &f->base.id, f->base.name, f->imp, f->mod, &sql, &f->type, &se, &f->varres, &f->vararg, &f->s->base.id); + table_funcs.table_insert(tr, sysfunc, &f->base.id, f->base.name, f->imp, f->mod, &lang, &f->type, &se,&f->varres, &f->vararg, &f->s->base.id); else - table_funcs.table_insert(tr, sysfunc, &f->base.id, f->base.name, f->imp, f->mod, &sql, &f->type, &se, &f->varres, &f->vararg, &zero); - + table_funcs.table_insert(tr, sysfunc, &f->base.id, f->base.name, f->imp, f->mod, &lang, &f->type, &se, &f->varres, &f->vararg, &zero); + if (f->res) { char res_nme[] = "res_0"; @@ -1372,8 +1376,10 @@ store_init(int debug, store_type store, bootstrap_create_column(tr, t, "name", "varchar", 256); bootstrap_create_column(tr, t, "func", "varchar", 8196); bootstrap_create_column(tr, t, "mod", "varchar", 8196); - /* sql or database internal */ - bootstrap_create_column(tr, t, "sql", "boolean", 1); + + /* language asm=0, sql=1, R=2, C=3, J=4 */ + bootstrap_create_column(tr, t, "language", "int", 32); + /* func, proc, aggr or filter */ bootstrap_create_column(tr, t, "type", "int", 32); bootstrap_create_column(tr, t, "side_effect", "boolean", 1); @@ -2117,6 +2123,7 @@ func_dup(sql_trans *tr, int flag, sql_fu f->mod = (of->mod)?sa_strdup(sa, of->mod):NULL; f->type = of->type; f->query = (of->query)?sa_strdup(sa, of->query):NULL; + f->lang = of->lang; f->sql = of->sql; f->side_effect = of->side_effect; f->varres = of->varres; @@ -3694,7 +3701,7 @@ sql_trans_create_type(sql_trans *tr, sql } sql_func * -create_sql_func(sql_allocator *sa, char *func, list *args, list *res, int type, char *mod, char *impl, char *query, bit varres, bit vararg) +create_sql_func(sql_allocator *sa, char *func, list *args, list *res, int type, int lang, char *mod, char *impl, char *query, bit varres, bit vararg) { sql_func *t = SA_ZNEW(sa, sql_func); @@ -3703,7 +3710,8 @@ create_sql_func(sql_allocator *sa, char t->imp = (impl)?sa_strdup(sa, impl):NULL; t->mod = (mod)?sa_strdup(sa, mod):NULL; t->type = type; - t->sql = (query)?1:0; + t->lang = lang; + t->sql = (lang==FUNC_LANG_SQL||lang==FUNC_LANG_MAL)?1:0; t->side_effect = res?FALSE:TRUE; t->varres = varres; t->vararg = vararg; @@ -3716,21 +3724,22 @@ create_sql_func(sql_allocator *sa, char } sql_func * -sql_trans_create_func(sql_trans *tr, sql_schema * s, char *func, list *args, list *res, int type, char *mod, char *impl, char *query, bit varres, bit vararg) +sql_trans_create_func(sql_trans *tr, sql_schema * s, char *func, list *args, list *res, int type, int lang, char *mod, char *impl, char *query, bit varres, bit vararg) { sql_func *t = SA_ZNEW(tr->sa, sql_func); sql_table *sysfunc = find_sql_table(find_sql_schema(tr, "sys"), "functions"); sql_table *sysarg = find_sql_table(find_sql_schema(tr, "sys"), "args"); node *n; int number = 0; - bit se, sql; + bit se; base_init(tr->sa, &t->base, next_oid(), TR_NEW, func); assert(impl && mod); t->imp = (impl)?sa_strdup(tr->sa, impl):NULL; t->mod = (mod)?sa_strdup(tr->sa, mod):NULL; t->type = type; - sql = t->sql = (query)?1:0; + t->lang = lang; + t->sql = (lang==FUNC_LANG_SQL||lang==FUNC_LANG_MAL)?1:0; se = t->side_effect = res?FALSE:TRUE; t->varres = varres; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list