Changeset: f9df9cfbcdea for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f9df9cfbcdea
Modified Files:
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_gencode.h
sql/common/sql_backend.c
sql/common/sql_backend.h
sql/common/sql_types.c
sql/include/sql_catalog.h
sql/server/rel_psm.c
sql/storage/store.c
Branch: privfuncs
Log Message:
Functions have many boolean properties. Pack them
diffs (200 lines):
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -984,7 +984,7 @@ monet5_freecode(const char *mod, int cli
/* the function 'f' may not have the 'imp' field set yet */
int
-monet5_resolve_function(ptr M, sql_func *f, const char *fimp, bit *side_effect)
+monet5_resolve_function(ptr M, sql_func *f, const char *fimp, bool
*side_effect)
{
Client c;
Module m;
@@ -1016,7 +1016,7 @@ monet5_resolve_function(ptr M, sql_func
int argc = sig->argc - sig->retc, nfargs =
list_length(f->ops), nfres = list_length(f->res);
if ((sig->varargs & VARARGS) == VARARGS || f->vararg ||
f->varres) {
- *side_effect = (bit) s->def->unsafeProp;
+ *side_effect = (bool) s->def->unsafeProp;
MT_lock_unset(&sql_gencodeLock);
return 1;
} else if (nfargs == argc && (nfres == sig->retc ||
(sig->retc == 1 && (IS_FILT(f) || IS_PROC(f))))) {
@@ -1053,7 +1053,7 @@ monet5_resolve_function(ptr M, sql_func
}
}
if (all_match)*/
- *side_effect = (bit) s->def->unsafeProp;
+ *side_effect = (bool) s->def->unsafeProp;
MT_lock_unset(&sql_gencodeLock);
return 1;
}
@@ -1145,7 +1145,7 @@ int
backend_create_mal_func(mvc *m, sql_func *f)
{
char *F = NULL, *fn = NULL;
- bit old_side_effect = f->side_effect, new_side_effect = 0;
+ bool old_side_effect = f->side_effect, new_side_effect = 0;
int clientid = m->clientid;
str fimp = NULL;
diff --git a/sql/backends/monet5/sql_gencode.h
b/sql/backends/monet5/sql_gencode.h
--- a/sql/backends/monet5/sql_gencode.h
+++ b/sql/backends/monet5/sql_gencode.h
@@ -21,7 +21,7 @@ extern int backend_dumpproc(backend *be,
extern int backend_dumpstmt(backend *be, MalBlkPtr mb, sql_rel *r, int top,
int addend, const char *query);
extern int monet5_has_module(ptr M, char *module);
extern void monet5_freecode(const char *mod, int clientid, const char *name);
-extern int monet5_resolve_function(ptr M, sql_func *f, const char *fimp, bit
*side_effect);
+extern int monet5_resolve_function(ptr M, sql_func *f, const char *fimp, bool
*side_effect);
extern int backend_create_mal_func(mvc *m, sql_func *f);
extern int backend_create_subfunc(backend *be, sql_subfunc *f, list *ops);
diff --git a/sql/common/sql_backend.c b/sql/common/sql_backend.c
--- a/sql/common/sql_backend.c
+++ b/sql/common/sql_backend.c
@@ -99,7 +99,7 @@ backend_schema_user_dependencies(ptr tra
}
int
-backend_resolve_function(ptr M, sql_func *f, const char *fimp, bit
*side_effect)
+backend_resolve_function(ptr M, sql_func *f, const char *fimp, bool
*side_effect)
{
if (be_funcs.fresolve_function != NULL)
return be_funcs.fresolve_function(M, f, fimp, side_effect);
diff --git a/sql/common/sql_backend.h b/sql/common/sql_backend.h
--- a/sql/common/sql_backend.h
+++ b/sql/common/sql_backend.h
@@ -24,7 +24,7 @@ typedef int (*alter_user_fptr) (ptr mvc
typedef int (*rename_user_fptr) (ptr mvc, str olduser, str newuser);
typedef void* (*schema_user_dependencies) (ptr mvc, int schema_id);
typedef void (*create_function) (ptr mvc, str name, sql_rel *rel, sql_table
*t);
-typedef int (*resolve_function) (ptr mvc, sql_func *f, const char *fimp, bit
*side_effect);
+typedef int (*resolve_function) (ptr mvc, sql_func *f, const char *fimp, bool
*side_effect);
typedef int (*has_module_function) (ptr mvc, char *name);
typedef void *(*create_sub_backend) (void *mvc, void *client);
@@ -54,7 +54,7 @@ extern int backend_schema_has_user(ptr
extern int backend_alter_user(ptr mvc, str user, str passwd, char enc,
sqlid schema_id, char *schema_path, str oldpasswd);
extern int backend_rename_user(ptr mvc, str olduser, str newuser);
extern void* backend_schema_user_dependencies(ptr trans, sqlid schema_id);
-extern int backend_resolve_function(ptr trans, sql_func *f, const char
*fimp, bit *side_effect);
+extern int backend_resolve_function(ptr trans, sql_func *f, const char
*fimp, bool *side_effect);
extern int backend_has_module(ptr M, char *name);
extern backend_functions be_funcs;
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
@@ -660,8 +660,12 @@ sql_create_func_(sql_allocator *sa, cons
list_append(funcs, t);
/* grouping aggregate doesn't have a backend */
- if (strlen(imp) != 0 && strlen(mod) != 0)
- backend_resolve_function(&(int){0}, t, t->imp,
&(t->side_effect)); /* backend_resolve_function sets 'side_effect' flag */
+ if (strlen(imp) != 0 && strlen(mod) != 0) {
+ bool se = t->side_effect;
+ int res = backend_resolve_function(&(int){0}, t, t->imp, &se);
/* backend_resolve_function sets 'side_effect' flag */
+ t->side_effect = se;
+ assert(res);
+ }
return t;
}
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
@@ -492,12 +492,13 @@ typedef struct sql_func {
list *res; /* list of results */
sql_flang lang;
char *query; /* sql code */
- bit semantics; /*When set to true, function incorporates some kind of
null semantics.*/
- bit side_effect;
- bit varres; /* variable output result */
- bit vararg; /* variable input arguments */
- bit system; /* system function */
- bit instantiated; /* if the function is instantiated */
+ bool
+ semantics:1, /* When set to true, function incorporates some kind of
null semantics */
+ side_effect:1, /* if the function has side-effects */
+ varres:1, /* variable output result */
+ vararg:1, /* variable input arguments */
+ system:1, /* system function */
+ instantiated:1; /* if the function is instantiated */
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
@@ -1018,8 +1018,10 @@ rel_create_func(sql_query *query, dlist
break;
}
/* instantiate MAL functions while being created. This
also sets the side-effects flag */
- if (!backend_resolve_function(&clientid, f, fnme,
&(f->side_effect)))
+ bool se = f->side_effect;
+ if (!backend_resolve_function(&clientid, f, fnme, &se))
return sql_error(sql, 02, SQLSTATE(3F000)
"CREATE %s: external name %s.%s not bound (%s.%s)", F, fmod, fnme,
s->base.name, fname );
+ f->side_effect = se;
f->instantiated = TRUE;
} else if (!sf) {
return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s:
external name %s.%s not bound (%s.%s)", F, fmod, fnme, s->base.name, fname );
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -926,11 +926,11 @@ load_func(sql_trans *tr, sql_schema *s,
t->lang = (sql_flang) store->table_api.column_find_int(tr,
find_sql_column(funcs, "language"), rid);
t->instantiated = t->lang != FUNC_LANG_SQL && t->lang != FUNC_LANG_MAL;
t->type = (sql_ftype) store->table_api.column_find_int(tr,
find_sql_column(funcs, "type"), rid);
- t->side_effect = (bit) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "side_effect"), rid);
- t->varres = (bit) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "varres"), rid);
- t->vararg = (bit) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "vararg"), rid);
- t->system = (bit) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "system"), rid);
- t->semantics = (bit) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "semantics"), rid);
+ t->side_effect = (bool) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "side_effect"), rid);
+ t->varres = (bool) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "varres"), rid);
+ t->vararg = (bool) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "vararg"), rid);
+ t->system = (bool) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "system"), rid);
+ t->semantics = (bool) store->table_api.column_find_bte(tr,
find_sql_column(funcs, "semantics"), rid);
t->res = NULL;
t->s = s;
t->fix_scale = SCALE_EQ;
@@ -1453,8 +1453,9 @@ insert_functions(sql_trans *tr, sql_tabl
sql_func *f = n->data;
int number = 0, ftype = (int) f->type, flang = (int)
FUNC_LANG_INT;
sqlid next_schema = f->s ? f->s->base.id : 0;
-
- if ((res = store->table_api.table_insert(tr, sysfunc,
&f->base.id, &f->base.name, &f->imp, &f->mod, &flang, &ftype, &f->side_effect,
&f->varres, &f->vararg, &next_schema, &f->system, &f->semantics)))
+ bit se = f->side_effect, vares = f->varres, varg = f->vararg,
system = f->system, sem = f->semantics;
+
+ if ((res = store->table_api.table_insert(tr, sysfunc,
&f->base.id, &f->base.name, &f->imp, &f->mod, &flang, &ftype, &se, &vares,
&varg, &next_schema, &system, &sem)))
return res;
if (f->res && (res = insert_args(tr, sysarg, f->res,
f->base.id, "res_%d", &number)))
return res;
@@ -4898,6 +4899,7 @@ sql_trans_create_func(sql_func **fres, s
sql_table *sysarg = find_sql_table(tr, find_sql_schema(tr, "sys"),
"args");
node *n;
int number = 0, ftype = (int) type, flang = (int) lang, res = LOG_OK;
+ bit semantics = TRUE;
sql_func *t = SA_ZNEW(tr->sa, sql_func);
base_init(tr->sa, &t->base, next_oid(tr->store), true, func);
@@ -4907,7 +4909,7 @@ sql_trans_create_func(sql_func **fres, s
t->type = type;
t->lang = lang;
t->instantiated = lang != FUNC_LANG_SQL && lang != FUNC_LANG_MAL;
- t->semantics = TRUE;
+ t->semantics = semantics;
t->side_effect = side_effect;
t->varres = varres;
t->vararg = vararg;
@@ -4926,8 +4928,8 @@ sql_trans_create_func(sql_func **fres, s
if ((res = os_add(s->funcs, tr, t->base.name, &t->base)))
return res;
- if ((res = store->table_api.table_insert(tr, sysfunc, &t->base.id,
&t->base.name, query?(char**)&query:&t->imp, &t->mod, &flang, &ftype,
&t->side_effect,
- &t->varres, &t->vararg, &s->base.id, &t->system,
&t->semantics)))
+ if ((res = store->table_api.table_insert(tr, sysfunc, &t->base.id,
&t->base.name, query?(char**)&query:&t->imp, &t->mod, &flang, &ftype,
&side_effect,
+ &varres, &vararg, &s->base.id, &system, &semantics)))
return res;
if (t->res) for (n = t->res->h; n; n = n->next, number++) {
sql_arg *a = n->data;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]