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]