Changeset: 0a556a1bdfc8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0a556a1bdfc8
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_upgrades.c
        sql/backends/monet5/sql_user.c
        sql/common/sql_types.c
        sql/include/sql_catalog.h
        sql/server/rel_psm.c
        sql/server/rel_select.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: system-functions
Log Message:

Added a SYSTEM column to the SYS.FUNCTIONS table.


diffs (truncated from 313 to 300 lines):

diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -535,7 +535,7 @@ create_func(mvc *sql, char *sname, char 
                throw(SQL,"sql.create_func", SQLSTATE(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->lang, f->mod, f->imp, f->query, f->varres, f->vararg);
+       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, f->system);
        if (nf && nf->query && nf->lang <= FUNC_LANG_SQL) {
                char *buf;
                sql_rel *r = NULL;
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -76,14 +76,15 @@ sql_fix_system_tables(Client c, mvc *sql
                pos += snprintf(buf + pos, bufsize - pos,
                                "insert into sys.functions values"
                                " (%d, '%s', '%s', '%s',"
-                               " %d, %d, %s, %s, %s, %d);\n",
+                               " %d, %d, %s, %s, %s, %d, %s);\n",
                                func->base.id, func->base.name,
                                func->imp, func->mod, FUNC_LANG_INT,
                                func->type,
                                func->side_effect ? "true" : "false",
                                func->varres ? "true" : "false",
                                func->vararg ? "true" : "false",
-                               func->s ? func->s->base.id : s->base.id);
+                               func->s ? func->s->base.id : s->base.id,
+                               func->system ? "true" : "false");
                if (func->res) {
                        for (m = func->res->h; m; m = m->next, number++) {
                                arg = m->data;
@@ -143,12 +144,13 @@ sql_fix_system_tables(Client c, mvc *sql
                pos += snprintf(buf + pos, bufsize - pos,
                                "insert into sys.functions values"
                                " (%d, '%s', '%s', '%s', %d, %d, false,"
-                               " %s, %s, %d);\n",
+                               " %s, %s, %d, %s);\n",
                                aggr->base.id, aggr->base.name, aggr->imp,
                                aggr->mod, FUNC_LANG_INT, aggr->type,
                                aggr->varres ? "true" : "false",
                                aggr->vararg ? "true" : "false",
-                               aggr->s ? aggr->s->base.id : s->base.id);
+                               aggr->s ? aggr->s->base.id : s->base.id,
+                               aggr->system ? "true" : "false");
                arg = aggr->res->h->data;
                pos += snprintf(buf + pos, bufsize - pos,
                                "insert into sys.args values"
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
@@ -223,7 +223,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, 
FUNC_LANG_SQL, "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, TRUE);
 
        t = mvc_create_view(m, s, "users", SQL_PERSIST,
                            "SELECT u.\"name\" AS \"name\", "
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
@@ -1169,6 +1169,7 @@ sql_create_func_(sql_allocator *sa, cons
        t->side_effect = side_effect;
        t->fix_scale = fix_scale;
        t->s = NULL;
+       t->system = TRUE;
        if (type == F_AGGR) {
                list_append(aggrs, t);
        } else {
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
@@ -329,6 +329,7 @@ typedef struct sql_func {
        bit side_effect;
        bit varres;     /* variable output result */
        bit vararg;     /* variable input arguments */
+       bit system;     /* system function */
        int fix_scale;
                        /*
                           SCALE_NOFIX/SCALE_NONE => nothing
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
@@ -764,7 +764,7 @@ rel_create_function(sql_allocator *sa, c
 }
 
 static sql_rel *
-rel_create_func(mvc *sql, dlist *qname, dlist *params, symbol *res, dlist 
*ext_name, dlist *body, int type, int lang, int replace)
+rel_create_func(mvc *sql, dlist *qname, dlist *params, symbol *res, dlist 
*ext_name, dlist *body, int type, int lang, int replace, int system)
 {
        const char *fname = qname_table(qname);
        const char *sname = qname_schema(qname);
@@ -886,7 +886,7 @@ rel_create_func(mvc *sql, dlist *qname, 
                                        (lang == 
FUNC_LANG_MAP_PY)?"pyapimap":"unknown";
                        sql->params = NULL;
                        if (create) {
-                               f = mvc_create_func(sql, sql->sa, s, fname, l, 
restype, type, lang,  mod, fname, lang_body, (type == F_LOADER)?TRUE:FALSE, 
vararg);
+                               f = mvc_create_func(sql, sql->sa, s, fname, l, 
restype, type, lang,  mod, fname, lang_body, (type == F_LOADER)?TRUE:FALSE, 
vararg, system);
                        } else if (!sf) {
                                return sql_error(sql, 01, SQLSTATE(42000) 
"CREATE %s%s: R function %s.%s not bound", KF, F, s->base.name, fname );
                        } /*else {
@@ -905,7 +905,7 @@ rel_create_func(mvc *sql, dlist *qname, 
 
                        if (create) { /* needed for recursive functions */
                                q = query_cleaned(q);
-                               sql->forward = f = mvc_create_func(sql, 
sql->sa, s, fname, l, restype, type, lang, "user", q, q, FALSE, vararg);
+                               sql->forward = f = mvc_create_func(sql, 
sql->sa, s, fname, l, restype, type, lang, "user", q, q, FALSE, vararg, system);
                                GDKfree(q);
                        }
                        sql->session->schema = s;
@@ -938,7 +938,7 @@ rel_create_func(mvc *sql, dlist *qname, 
                        sql->params = NULL;
                        if (create) {
                                q = query_cleaned(q);
-                               f = mvc_create_func(sql, sql->sa, s, fname, l, 
restype, type, lang, fmod, fnme, q, FALSE, vararg);
+                               f = mvc_create_func(sql, sql->sa, s, fname, l, 
restype, type, lang, fmod, fnme, q, FALSE, vararg, system);
                                GDKfree(q);
                        } else if (!sf) {
                                return sql_error(sql, 01, SQLSTATE(42000) 
"CREATE %s%s: external name %s.%s not bound (%s.%s)", KF, F, fmod, fnme, 
s->base.name, fname );
@@ -1444,8 +1444,9 @@ rel_psm(mvc *sql, symbol *s)
                int type = l->h->next->next->next->next->next->data.i_val;
                int lang = l->h->next->next->next->next->next->next->data.i_val;
                int repl = 
l->h->next->next->next->next->next->next->next->data.i_val;
+               int system = 0;
 
-               ret = rel_create_func(sql, l->h->data.lval, 
l->h->next->data.lval, l->h->next->next->data.sym, 
l->h->next->next->next->data.lval, l->h->next->next->next->next->data.lval, 
type, lang, repl);
+               ret = rel_create_func(sql, l->h->data.lval, 
l->h->next->data.lval, l->h->next->next->data.sym, 
l->h->next->next->next->data.lval, l->h->next->next->next->next->data.lval, 
type, lang, repl, system);
                sql->type = Q_SCHEMA;
        }       break;
        case SQL_DROP_FUNC:
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -687,7 +687,7 @@ rel_named_table_function(mvc *sql, sql_r
                                if (n->next)
                                        append(nexps, ae);
                        }
-                       f = mvc_create_func(sql, sql->sa, s, nfname, args, res, 
F_UNION, FUNC_LANG_SQL, "user", "intern", "intern", FALSE, sf->func->vararg);
+                       f = mvc_create_func(sql, sql->sa, s, nfname, args, res, 
F_UNION, FUNC_LANG_SQL, "user", "intern", "intern", FALSE, sf->func->vararg, 
FALSE);
                        /* call normal table function */
                        ie = exp_op(sql->sa, nexps, sf);
                        nexps = sa_list(sql->sa);
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
@@ -81,13 +81,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,  FUNC_LANG_SQL, 
"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, TRUE);
 
        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, FUNC_LANG_SQL, 
"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, TRUE);
        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
@@ -997,17 +997,17 @@ mvc_drop_type(mvc *m, sql_schema *s, sql
 }
 
 sql_func *
-mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema * s, const char *name, 
list *args, list *res, int type, int lang, const char *mod, const char *impl, 
const char *query, bit varres, bit vararg)
+mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema * s, const char *name, 
list *args, list *res, int type, int lang, const char *mod, const char *impl, 
const char *query, bit varres, bit vararg, bit system)
 {
        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, lang, mod, impl, 
query, varres, vararg);
+               f = create_sql_func(sa, name, args, res, type, lang, mod, impl, 
query, varres, vararg, system);
                f->s = s;
        } else 
-               f = sql_trans_create_func(sql->session->tr, s, name, args, res, 
type, lang, mod, impl, query, varres, vararg);
+               f = sql_trans_create_func(sql->session->tr, s, name, args, res, 
type, lang, mod, impl, query, varres, vararg, system);
        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
@@ -180,7 +180,7 @@ extern sql_trigger *mvc_bind_trigger(mvc
 extern sql_type *mvc_create_type(mvc *sql, sql_schema *s, const char *sqlname, 
int digits, int scale, int radix, const char *impl);
 extern int mvc_drop_type(mvc *sql, sql_schema *s, sql_type *t, int 
drop_action);
 
-extern sql_func *mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema *s, 
const char *name, list *args, list *res, int type, int lang, const char *mod, 
const char *impl, const char *query, bit varres, bit vararg);
+extern sql_func *mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema *s, 
const char *name, list *args, list *res, int type, int lang, const char *mod, 
const char *impl, const char *query, bit varres, bit vararg, bit system);
 extern int mvc_drop_func(mvc *c, sql_schema *s, sql_func * func, int 
drop_action);
 extern int 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
@@ -344,7 +344,7 @@ extern int sql_trans_commit(sql_trans *t
 extern sql_type *sql_trans_create_type(sql_trans *tr, sql_schema * s, const 
char *sqlname, int digits, int scale, int radix, const char *impl);
 extern int sql_trans_drop_type(sql_trans *tr, sql_schema * s, int id, int 
drop_action);
 
-extern sql_func *sql_trans_create_func(sql_trans *tr, sql_schema * s, const 
char *func, list *args, list *res, int type, int lang, const char *mod, const 
char *impl, const char *query, bit varres, bit vararg);
+extern sql_func *sql_trans_create_func(sql_trans *tr, sql_schema * s, const 
char *func, list *args, list *res, int type, int lang, const char *mod, const 
char *impl, const char *query, bit varres, bit vararg, bit system);
 
 extern int sql_trans_drop_func(sql_trans *tr, sql_schema *s, int id, int 
drop_action);
 extern int sql_trans_drop_all_func(sql_trans *tr, sql_schema *s, list 
*list_func, int drop_action);
@@ -420,7 +420,7 @@ extern sql_key * key_create_done(sql_all
 
 extern sql_idx *create_sql_idx(sql_allocator *sa, sql_table *t, const 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, const char *func, list 
*args, list *res, int type, int lang, const char *mod, const char *impl, const 
char *query, bit varres, bit vararg);
+extern sql_func *create_sql_func(sql_allocator *sa, const char *func, list 
*args, list *res, int type, int lang, const char *mod, const char *impl, const 
char *query, bit varres, bit vararg, bit system);
 
 /* 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
@@ -778,6 +778,8 @@ load_func(sql_trans *tr, sql_schema *s, 
        t->varres = *(bit *)v;  _DELETE(v);
        v = table_funcs.column_find_value(tr, find_sql_column(funcs, "vararg"), 
rid);
        t->vararg = *(bit *)v;  _DELETE(v);
+       v = table_funcs.column_find_value(tr, find_sql_column(funcs, "system"), 
rid);
+       t->system = *(bit *)v;  _DELETE(v);
        t->res = NULL;
        t->s = s;
        t->fix_scale = SCALE_EQ;
@@ -1163,9 +1165,9 @@ insert_functions(sql_trans *tr, sql_tabl
                char arg_nme[7] = "arg_0";
 
                if (f->s)
-                       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);
+                       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, &f->system);
                else
-                       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);
+                       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, &f->system);
 
                if (f->res) {
                        char res_nme[] = "res_0";
@@ -1216,9 +1218,9 @@ insert_aggrs(sql_trans *tr, sql_table *s
                int number = 0;
 
                if (aggr->s)
-                       table_funcs.table_insert(tr, sysfunc, &aggr->base.id, 
aggr->base.name, aggr->imp, aggr->mod, &lang, &aggr->type, &F, &aggr->varres, 
&aggr->vararg, &aggr->s->base.id);
+                       table_funcs.table_insert(tr, sysfunc, &aggr->base.id, 
aggr->base.name, aggr->imp, aggr->mod, &lang, &aggr->type, &F, &aggr->varres, 
&aggr->vararg, &aggr->s->base.id, &aggr->system);
                else
-                       table_funcs.table_insert(tr, sysfunc, &aggr->base.id, 
aggr->base.name, aggr->imp, aggr->mod, &lang, &aggr->type, &F, &aggr->varres, 
&aggr->vararg, &zero);
+                       table_funcs.table_insert(tr, sysfunc, &aggr->base.id, 
aggr->base.name, aggr->imp, aggr->mod, &lang, &aggr->type, &F, &aggr->varres, 
&aggr->vararg, &zero, &aggr->system);
                
                res = aggr->res->h->data;
                id = next_oid();
@@ -1503,6 +1505,7 @@ store_load(void) {
        bootstrap_create_column(tr, t, "varres", "boolean", 1);
        bootstrap_create_column(tr, t, "vararg", "boolean", 1);
        bootstrap_create_column(tr, t, "schema_id", "int", 32);
+       bootstrap_create_column(tr, t, "system", "boolean", 1);
 
        args = t = bootstrap_create_table(tr, s, "args");
        bootstrap_create_column(tr, t, "id", "int", 32);
@@ -2524,6 +2527,7 @@ func_dup(sql_trans *tr, int flag, sql_fu
        f->vararg = of->vararg;
        f->ops = list_new(sa, of->ops->destroy);
        f->fix_scale = of->fix_scale;
+       f->system = of->system;
        for(n=of->ops->h; n; n = n->next) 
                list_append(f->ops, arg_dup(sa, n->data));
        if (of->res) {
@@ -4146,7 +4150,7 @@ sql_trans_drop_type(sql_trans *tr, sql_s
 }
 
 sql_func *
-create_sql_func(sql_allocator *sa, const char *func, list *args, list *res, 
int type, int lang, const char *mod, const char *impl, const char *query, bit 
varres, bit vararg)
+create_sql_func(sql_allocator *sa, const char *func, list *args, list *res, 
int type, int lang, const char *mod, const char *impl, const char *query, bit 
varres, bit vararg, bit system)
 {
        sql_func *t = SA_ZNEW(sa, sql_func);
 
@@ -4165,11 +4169,12 @@ create_sql_func(sql_allocator *sa, const
        t->query = (query)?sa_strdup(sa, query):NULL;
        t->fix_scale = SCALE_EQ;
        t->s = NULL;
+       t->system = system;
        return t;
 }
 
 sql_func *
-sql_trans_create_func(sql_trans *tr, sql_schema * s, const char *func, list 
*args, list *res, int type, int lang, const char *mod, const char *impl, const 
char *query, bit varres, bit vararg)
+sql_trans_create_func(sql_trans *tr, sql_schema * s, const char *func, list 
*args, list *res, int type, int lang, const char *mod, const char *impl, const 
char *query, bit varres, bit vararg, bit system)
 {
        sql_func *t = SA_ZNEW(tr->sa, sql_func);
        sql_table *sysfunc = find_sql_table(find_sql_schema(tr, "sys"), 
"functions");
@@ -4190,6 +4195,7 @@ sql_trans_create_func(sql_trans *tr, sql
        t->vararg = vararg;
        t->ops = sa_list(tr->sa);
        t->fix_scale = SCALE_EQ;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to