Changeset: 646fe26cd5a6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/646fe26cd5a6
Modified Files:
        monetdb5/modules/mal/tablet.c
        monetdb5/modules/mal/tablet.h
        sql/backends/monet5/sql_result.c
        sql/backends/monet5/sql_statement.c
        sql/include/sql_catalog.h
        sql/storage/bat/res_table.c
Branch: nested
Log Message:

cleanup: compute offsets only once


diffs (226 lines):

diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -277,28 +277,6 @@ output_line(char **buf, size_t *len, cha
        return 0;
 }
 
-#define MS_VALUE 0
-#define MS_ARRAY 2
-/* move into sql_result and store in format */
-static int
-multiset_size( Column *fmt)
-{
-       int nrattrs = (fmt->multiset==MS_VALUE)?0:(fmt->multiset==MS_ARRAY)?3:2;
-       if (fmt->virt)
-               nrattrs++;
-       if (fmt->composite) {
-               int o = 0;
-               for (int i = 0; i<fmt->composite; i++) {
-                       int j = multiset_size(fmt+(o+1));
-                       nrattrs += j;
-                       o += j;
-               }
-       } else {
-               nrattrs ++;
-       }
-       return nrattrs;
-}
-
 static ssize_t output_multiset(char **buf, size_t *len, ssize_t fill, char 
**localbuf, size_t *locallen, Column *fmt, BUN nr_attrs, int multiset, int 
composite, bool quoted, int id);
 
 static inline ssize_t
@@ -359,7 +337,7 @@ output_composite(char **buf, size_t *len
                        (*buf)[fill] = 0;
                }
                if (f->multiset) {
-                       int nr_attrs = multiset_size(f)-1;
+                       int nr_attrs = f->nrfields - 1;
                        const char *p = BUNtail(fmt[j+nr_attrs].ci, 
fmt[j+nr_attrs].p);
 
                        fill = output_multiset(buf, len, fill, localbuf, 
locallen, fmt + j + 1, nr_attrs-1, f->multiset, f->composite, true, *(int*)p);
@@ -367,7 +345,7 @@ output_composite(char **buf, size_t *len
                        f = fmt + j + nr_attrs; /* closing bracket */
                        j += nr_attrs + 1;
                } else if (f->composite) {
-                       int nr_attrs = multiset_size(f)-1;
+                       int nr_attrs = f->nrfields - 1;
                        fill = output_composite(buf, len, fill, localbuf, 
locallen, fmt + j + 1, nr_attrs-j-1, f->composite, true);
                        f = fmt + j + nr_attrs; /* closing bracket */
                        j += nr_attrs + 1;
@@ -384,6 +362,7 @@ output_composite(char **buf, size_t *len
        return fill;
 }
 
+#define MS_ARRAY 2
 static ssize_t
 output_multiset(char **buf, size_t *len, ssize_t fill, char **localbuf, size_t 
*locallen,
                                  Column *fmt, BUN nr_attrs, int multiset, int 
composite, bool quoted, int id)
@@ -427,7 +406,7 @@ output_line_complex(char **buf, size_t *
                const char *p;
 
                if (f->multiset) {
-                       int nr_attrs = multiset_size(f)-1;
+                       int nr_attrs = f->nrfields - 1;
                        p = BUNtail(fmt[j+nr_attrs].ci, fmt[j+nr_attrs].p);
 
                        fill = output_multiset(buf, len, fill, localbuf, 
locallen, fmt + j + 1, nr_attrs-1, f->multiset, f->composite, false, *(int*)p);
@@ -435,7 +414,7 @@ output_line_complex(char **buf, size_t *
                        f = fmt + j + nr_attrs; /* closing bracket */
                        j += nr_attrs + 1;
                } else if (f->composite) {
-                       int nr_attrs = multiset_size(f)-1;
+                       int nr_attrs = f->nrfields - 1;
                        fill = output_composite(buf, len, fill, localbuf, 
locallen, fmt + j + 1, nr_attrs-j, f->composite, false);
                        f = fmt + j + nr_attrs; /* closing bracket */
                        j += nr_attrs + 1;
diff --git a/monetdb5/modules/mal/tablet.h b/monetdb5/modules/mal/tablet.h
--- a/monetdb5/modules/mal/tablet.h
+++ b/monetdb5/modules/mal/tablet.h
@@ -45,6 +45,7 @@ typedef struct Column_t {
        unsigned int maxwidth;          /* permissible width */
        int composite;                          /* number of composite fields */
        int multiset;                           /* type of multiset */
+       int nrfields;                           /* nr columns which together 
form an output column */
        bool virt;                                      /* not part of output */
        int fieldstart;                         /* Fixed character field load 
positions */
        int fieldwidth;
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -1307,6 +1307,7 @@ mvc_export_table_(mvc *m, int output_for
        fmt[0].seplen = _strlen(fmt[0].sep);
        fmt[0].ws = 0;
        fmt[0].nullstr = NULL;
+       fmt[0].nrfields = as.nr_attrs;
 
        for (i = 1; i <= t->nr_cols; i++) {
                res_col *c = t->cols + (i - 1);
@@ -1326,6 +1327,7 @@ mvc_export_table_(mvc *m, int output_for
                }
                fmt[i].ci = bat_iterator(fmt[i].c);
                fmt[i].name = NULL;
+               fmt[i].nrfields = c->nrfields;
                if (csv) {
                        fmt[i].sep = ((i - 1) < (t->nr_cols - 1)) ? sep : rsep;
                        fmt[i].seplen = _strlen(fmt[i].sep);
@@ -1709,6 +1711,7 @@ next_col(res_col *c)
        } else {
                res++;
        }
+       c->nrfields = res;
        return res;
 }
 
@@ -1721,6 +1724,7 @@ count_cols(res_table *t)
                res_col *c = t->cols + i;
                //if (!c->virt || !c->multiset)
                        res++;
+
                i += next_col(c);
        }
        return res;
@@ -1734,7 +1738,7 @@ count_rows(res_table *t) /* find real ou
 
        if (c->virt) {
                if (c->multiset)
-                       res = next_col(c) - 1;
+                       res = c->nrfields - 1;
                else
                        res++;
        }
@@ -1756,6 +1760,7 @@ mvc_export_head(backend *b, stream *s, i
        if (!s || !t)
                return 0;
 
+       /* needed at the start as it fills in the nrfields */
        if (t->complex_type) {
                t->nr_output_cols = count_cols(t);
                t->nr_rows = count_rows(t);
@@ -1815,7 +1820,7 @@ mvc_export_head(backend *b, stream *s, i
 
                if (len && mnstr_write(s, c->tn, len, 1) != 1)
                        return -4;
-               i += next_col(c);
+               i += c->nrfields;
                if (i < t->nr_cols && mnstr_write(s, ",\t", 2, 1) != 1)
                        return -4;
        }
@@ -1843,7 +1848,7 @@ mvc_export_head(backend *b, stream *s, i
                        if (mnstr_write(s, c->name, strlen(c->name), 1) != 1)
                                return -4;
                }
-               i += next_col(c);
+               i += c->nrfields;
 
                if (i < t->nr_cols && mnstr_write(s, ",\t", 2, 1) != 1)
                        return -4;
@@ -1861,7 +1866,7 @@ mvc_export_head(backend *b, stream *s, i
                        return -4;
                //if (c->type.multiset && mnstr_write(s, "[]", 2, 1) != 1)
                        //return -4;
-               i += next_col(c);
+               i += c->nrfields;
                if (i < t->nr_cols && mnstr_write(s, ",\t", 2, 1) != 1)
                        return -4;
        }
@@ -1875,7 +1880,7 @@ mvc_export_head(backend *b, stream *s, i
 
                        if ((res = export_length(s, mtype, eclass, 
c->type.digits, c->type.scale, type_has_tz(&c->type), c->b, c->p)) < 0)
                                return res;
-                       i += next_col(c);
+                       i += c->nrfields;
                        if (i < t->nr_cols && mnstr_write(s, ",\t", 2, 1) != 1)
                                return -4;
                }
@@ -1890,7 +1895,7 @@ mvc_export_head(backend *b, stream *s, i
 
                        if (mnstr_printf(s, "%u %u", c->type.digits, 
c->type.scale) < 0)
                                return -4;
-                       i += next_col(c);
+                       i += c->nrfields;
                        if (i < t->nr_cols && mnstr_write(s, ",\t", 2, 1) != 1)
                                return -4;
                }
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3351,13 +3351,13 @@ nested_dump_header(mvc *sql, MalBlkPtr m
 static int
 nested_len(list *l)
 {
-       int nr;
+       int nr = 0;
        if (list_empty(l))
                return 0;
        for(node *n = l->h; n; n = n->next) {
                stmt *s = n->data;
                if (s->nested)
-                       nr += nested_len(unnest_stmt(s));
+                       nr += nested_len(unnest_stmt(s)) + 1;
                else
                        nr++;
        }
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
@@ -764,7 +764,7 @@ typedef struct res_col {
                         composite:1,
                         multiset:2,
                         cached:1;
-       int complex_len;
+       int nrfields;
        ptr *p;
 } res_col;
 
diff --git a/sql/storage/bat/res_table.c b/sql/storage/bat/res_table.c
--- a/sql/storage/bat/res_table.c
+++ b/sql/storage/bat/res_table.c
@@ -62,6 +62,7 @@ res_col_create(sql_trans *tr, res_table 
 
        if (!sql_find_subtype(&c->type, typename, digits, scale))
                sql_init_subtype(&c->type, sql_trans_bind_type(tr, NULL, 
typename), digits, scale);
+       c->nrfields = 1;
        c->virt = (multiset&4)?true:false;
        c->type.multiset = multiset&3;
        c->multiset = c->type.multiset;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to