Changeset: b10295510fcd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b10295510fcd
Modified Files:
        sql/storage/store.c
Branch: Jun2020
Log Message:

Small bugfix, default SQL aggregates may have more than one parameter as input, 
so add them to the 'args' table. Also make insert work for functions with more 
than 100 parameters, if that ever happens.

The lidar library has problems on Fedora 32 at the moment, so I cannot run the 
database dump tests :/


diffs (132 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1490,95 +1490,47 @@ insert_schemas(sql_trans *tr)
 static void
 insert_types(sql_trans *tr, sql_table *systype)
 {
-       int zero = 0;
-       node *n;
-
-       for (n = types->h; n; n = n->next) {
+       for (node *n = types->h; n; n = n->next) {
                sql_type *t = n->data;
-               int radix = t->radix;
-               int eclass = (int) t->eclass;
-
-               if (t->s)
-                       table_funcs.table_insert(tr, systype, &t->base.id, 
t->base.name, t->sqlname, &t->digits, &t->scale, &radix, &eclass, 
&t->s->base.id);
-               else
-                       table_funcs.table_insert(tr, systype, &t->base.id, 
t->base.name, t->sqlname, &t->digits, &t->scale, &radix, &eclass, &zero);
+               int radix = t->radix, eclass = (int) t->eclass;
+               sqlid next_schema = t->s ? t->s->base.id : 0;
+
+               table_funcs.table_insert(tr, systype, &t->base.id, 
t->base.name, t->sqlname, &t->digits, &t->scale, &radix, &eclass, &next_schema);
+       }
+}
+
+static void
+insert_args(sql_trans *tr, sql_table *sysarg, list *args, sqlid funcid, const 
char *arg_def, int *number) 
+{
+       for (node *n = args->h; n; n = n->next) {
+               sql_arg *a = n->data;
+               sqlid id = next_oid();
+               int next_number = (*number)++;
+
+               if (a->name) {
+                       table_funcs.table_insert(tr, sysarg, &id, &funcid, 
a->name, a->type.type->sqlname, &a->type.digits, &a->type.scale, &a->inout, 
&next_number);
+               } else {
+                       char buf[32];
+                       snprintf(buf, sizeof(buf), arg_def, next_number);
+                       table_funcs.table_insert(tr, sysarg, &id, &funcid, buf, 
a->type.type->sqlname, &a->type.digits, &a->type.scale, &a->inout, 
&next_number);
+               }
        }
 }
 
 static void
 insert_functions(sql_trans *tr, sql_table *sysfunc, sql_table *sysarg)
 {
-       int zero = 0;
-       node *n = NULL, *m = NULL;
-
-       for (n = funcs->h; n; n = n->next) {
+       for (node *n = funcs->h; n; n = n->next) {
                sql_func *f = n->data;
-               sqlid id;
-
-               if (f->type == F_AGGR) {
-                       char *name1 = "res";
-                       char *name2 = "arg";
-                       sql_arg *res = NULL;
-                       sql_func *aggr = n->data;
-                       bit F = FALSE;
-                       int number = 0, atype = (int) aggr->type, lang = (int) 
FUNC_LANG_INT;
-
-                       if (aggr->s)
-                               table_funcs.table_insert(tr, sysfunc, 
&aggr->base.id, aggr->base.name, aggr->imp, aggr->mod, &lang, &atype, &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, &atype, &F, 
&aggr->varres, &aggr->vararg, &zero, &aggr->system);
-                       
-                       res = aggr->res->h->data;
-                       id = next_oid();
-                       table_funcs.table_insert(tr, sysarg, &id, 
&aggr->base.id, name1, res->type.type->sqlname, &res->type.digits, 
&res->type.scale, &res->inout, &number);
-
-                       if (aggr->ops->h) {
-                               sql_arg *arg = aggr->ops->h->data;
-
-                               number++;
-                               id = next_oid();
-                               table_funcs.table_insert(tr, sysarg, &id, 
&aggr->base.id, name2, arg->type.type->sqlname, &arg->type.digits, 
&arg->type.scale, &arg->inout, &number);
-                       }
-               } else {
-                       bit se = f->side_effect;
-                       int number = 0, ftype = (int) f->type, flang = (int) 
FUNC_LANG_INT;
-                       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, &flang, &ftype, &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, &flang, &ftype, &se, &f->varres, 
&f->vararg, &zero, &f->system);
-
-                       if (f->res) {
-                               char res_nme[] = "res_0";
-
-                               for (m = f->res->h; m; m = m->next, number++) {
-                                       sql_arg *a = m->data;
-                                       res_nme[4] = '0' + number;
-
-                                       id = next_oid();
-                                       table_funcs.table_insert(tr, sysarg, 
&id, &f->base.id, res_nme, a->type.type->sqlname, &a->type.digits, 
&a->type.scale, &a->inout, &number);
-                               }
-                       }
-                       for (m = f->ops->h; m; m = m->next, number++) {
-                               sql_arg *a = m->data;
-
-                               id = next_oid();
-                               if (a->name) {
-                                       table_funcs.table_insert(tr, sysarg, 
&id, &f->base.id, a->name, a->type.type->sqlname, &a->type.digits, 
&a->type.scale, &a->inout, &number);
-                               } else {
-                                       if (number < 10) {
-                                               arg_nme[4] = '0' + number;
-                                               arg_nme[5] = 0;
-                                       } else {
-                                               arg_nme[4] = '0' + number / 10;
-                                               arg_nme[5] = '0' + number % 10;
-                                               arg_nme[6] = 0;
-                                       }
-                                       table_funcs.table_insert(tr, sysarg, 
&id, &f->base.id, arg_nme, a->type.type->sqlname, &a->type.digits, 
&a->type.scale, &a->inout, &number);
-                               }
-                       }
-               }
+               bit se = (f->type == F_AGGR) ? FALSE : f->side_effect;
+               int number = 0, ftype = (int) f->type, flang = (int) 
FUNC_LANG_INT;
+               sqlid next_schema = f->s ? f->s->base.id : 0;
+
+               table_funcs.table_insert(tr, sysfunc, &f->base.id, 
f->base.name, f->imp, f->mod, &flang, &ftype, &se, &f->varres, &f->vararg, 
&next_schema, &f->system);
+               if (f->res)
+                       insert_args(tr, sysarg, f->res, f->base.id, "res_%d", 
&number);
+               if (f->ops)
+                       insert_args(tr, sysarg, f->ops, f->base.id, "arg_%d", 
&number);
        }
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to