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