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