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

Reply via email to