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