Changeset: be2a14f4997c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/be2a14f4997c
Modified Files:
        monetdb5/modules/mal/tablet.c
        sql/test/nested/Tests/basic.test
Branch: nested
Log Message:

initial support for none dense list offsets


diffs (94 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
@@ -339,14 +339,16 @@ output_composite(char **buf, size_t *len
                }
                if (f->multiset) {
                        int nr_attrs = f->nrfields - 1;
-                       const char *p = BUNtail(fmt[j+nr_attrs].ci, 
fmt[j+nr_attrs].p);
+                       Column *rowid = fmt+j+nr_attrs;
+                       const char *p = BUNtail(rowid->ci, rowid->p);
 
                        /* various cases:
                         *      rowid column dense (but for ints !!
                         *      rowid column sorted
                         *      else
                         */
-                       if (f->c)
+                       assert(rowid->c->tsorted);
+                       if (rowid->c->tkey)
                                fill = output_multiset_dense(buf, len, fill, 
localbuf, locallen, fmt + j + 1, nr_attrs-1, f->multiset, f->composite, true, 
*(int*)p);
                        else
                                fill = output_multiset_sorted(buf, len, fill, 
localbuf, locallen, fmt + j + 1, nr_attrs-1, f->multiset, f->composite, true, 
*(int*)p);
@@ -413,27 +415,29 @@ output_multiset_sorted(char **buf, size_
        nr_attrs -= (multiset == MS_ARRAY)?2:1;
        Column *msid = fmt + nr_attrs;
        /* how to also keep prev id */
-       int *idp = (int*)Tloc(msid->c, msid->p);
+       BUN pos = msid->p;
+       int *idp = (int*)Tloc(msid->c, pos);
        int first = 1;
 
        if (msid->p) {
-               BUN pos = msid->p;
-               while (idp[-1] >= id && pos > 0) {
+               while (pos > 0 && idp[-1] >= id) {
                        idp--;
                        pos--;
                }
+               msid->p = pos;
        }
 
        if (!quoted)
                (*buf)[fill++] = '\'';
        (*buf)[fill++] = '{';
        (*buf)[fill] = 0;
-       for (; *idp == id && fill > 0; idp++, msid->p++) {
+       for (; *idp == id && fill > 0; idp++, msid->p++, pos++) {
                if (!first)
                        (*buf)[fill++] = ',';
                if (composite) {
                        fill = output_composite(buf, len, fill, localbuf, 
locallen, fmt, nr_attrs, composite, true);
                } else {
+                       fmt->p = pos;
                        fill = output_value(buf, len, fill, localbuf, locallen, 
fmt);
                }
                first = 0;
@@ -459,9 +463,11 @@ output_line_complex(char **buf, size_t *
 
                if (f->multiset) {
                        int nr_attrs = f->nrfields - 1;
-                       p = BUNtail(fmt[j+nr_attrs].ci, fmt[j+nr_attrs].p);
+                       Column *rowid = fmt+j+nr_attrs;
+                       p = BUNtail(rowid->ci, rowid->p);
 
-                       if (f->c)
+                       assert(rowid->c->tsorted);
+                       if (rowid->c->tkey)
                            fill = output_multiset_dense(buf, len, fill, 
localbuf, locallen, fmt + j + 1, nr_attrs-1, f->multiset, f->composite, false, 
*(int*)p);
                        else
                            fill = output_multiset_sorted(buf, len, fill, 
localbuf, locallen, fmt + j + 1, nr_attrs-1, f->multiset, f->composite, false, 
*(int*)p);
diff --git a/sql/test/nested/Tests/basic.test b/sql/test/nested/Tests/basic.test
--- a/sql/test/nested/Tests/basic.test
+++ b/sql/test/nested/Tests/basic.test
@@ -13,3 +13,20 @@ select * from arr_tbl
 ----
 {1,2,3}
 {2,3,4}
+
+
+query TI nosort
+select f1, f.elements from arr_tbl, unnest(f1) f
+----
+{1,2,3}
+1
+{1,2,3}
+2
+{1,2,3}
+3
+{2,3,4}
+2
+{2,3,4}
+3
+{2,3,4}
+4
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to