Changeset: a92ded53f773 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a92ded53f773
Modified Files:
        sql/backends/monet5/vaults/parquet/parquet.c
        sql/backends/monet5/vaults/parquet/pqc_dict_lookup.h
        sql/backends/monet5/vaults/parquet/pqc_dict_lookup_var.h
        sql/backends/monet5/vaults/parquet/pqc_filemetadata.c
        sql/backends/monet5/vaults/parquet/pqc_reader.c
        sql/backends/monet5/vaults/parquet/pqc_thrift.c
        sql/backends/monet5/vaults/parquet/pqc_thrift.h
Branch: default
Log Message:

improved parquet reader for unalign reads


diffs (truncated from 526 to 300 lines):

diff --git a/sql/backends/monet5/vaults/parquet/parquet.c 
b/sql/backends/monet5/vaults/parquet/parquet.c
--- a/sql/backends/monet5/vaults/parquet/parquet.c
+++ b/sql/backends/monet5/vaults/parquet/parquet.c
@@ -467,7 +467,7 @@ pqc_relation(mvc *sql, sql_subfunc *f, c
                        if (e->type == LT_UNKNOWN || e->type == listtype)
                                set_intern(ne);
                        list_append(res_exps, ne);
-                       if (e->precision && *est > ((lng) 1 << e->precision)) {
+                       if (e->precision && e->precision < 64 && *est > ((lng) 
1 << e->precision)) {
                                prop *p = ne->p = prop_create(sql->sa, 
PROP_NUNIQUES, ne->p);
                                p->value.dval = 1L << e->precision;
                        }
@@ -678,11 +678,11 @@ PARQUETread_large(BAT **R, pqc_creader *
                memset(h->base, 0, h->size);
 #endif
                rb->tascii = false; /* tobe fixed */
-               size_t offset = 0;
+               size_t offset = 8;
                if (dict >= 4 && is_string)
-                       offset = h->free;
+                       offset = h->free+8;
                int64_t rsz = 0, tsz = 0;
-               if ((rsz = pqc_read_chunk(r->c[pse->ccnr], wnr, 
rb->theap->base, ((char*)h->base)+h->free, sz, &offset, &dict)) < 0) {
+               if ((rsz = pqc_read_chunk(r->c[pse->ccnr], wnr, 
rb->theap->base, ((char*)h->base)+h->free+8, sz, &offset, &dict)) < 0) {
                        BBPreclaim(rb);
                        const char *err = pqc_get_error(r->c[pse->ccnr]);
                        if (err)
diff --git a/sql/backends/monet5/vaults/parquet/pqc_dict_lookup.h 
b/sql/backends/monet5/vaults/parquet/pqc_dict_lookup.h
--- a/sql/backends/monet5/vaults/parquet/pqc_dict_lookup.h
+++ b/sql/backends/monet5/vaults/parquet/pqc_dict_lookup.h
@@ -59,13 +59,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                        pos += (sh)/8;
                        } else if (nr_bits < 16) {
                                for(; i < nrows && j < cr->remaining; j++, i++) 
{
-                                       uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                       uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 16) {
                                                pos+=2;
                                                sh -= 16;
-                                               uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                               uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -75,13 +75,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                        pos += (sh)/8;
                        } else if (nr_bits < 32) {
                                for(; i < nrows && j < cr->remaining; j++, i++) 
{
-                                       uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                       uint32_t v = 
pqc_int(get_uint32(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 32) {
                                                pos+=4;
                                                sh -= 32;
-                                               uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                               uint32_t v = 
pqc_int(get_uint32(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -145,13 +145,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                }
                        } else if (nr_bits < 16) {
                                for (; i < nrows && j < m; j++, i++) {
-                                       uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                       uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 16) {
                                                pos+=2;
                                                sh -= 16;
-                                               uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                               uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -166,13 +166,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                }
                        } else if (nr_bits < 32) {
                                for (; i < nrows && j < m; j++, i++) {
-                                       uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                       uint32_t v = 
pqc_int(get_uint32(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 32) {
                                                pos+=4;
                                                sh -= 32;
-                                               uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                               uint32_t v = 
pqc_int(get_uint32(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -210,7 +210,7 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                        }
                } else if (nr_bits <= 16) { /* rle */
                        len>>=1;
-                       uint16_t idx = pqc_sht(*(uint16_t*)(data+pos));
+                       uint16_t idx = pqc_sht(get_uint16(data+pos));
                        idx &= mask;
                        uint32_t j = 0;
                        pos += 2;
@@ -223,7 +223,7 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                        }
                } else if (nr_bits <= 24) { /* rle */
                        len>>=1;
-                       uint32_t idx = pqc_int(*(uint32_t*)(data+pos));
+                       uint32_t idx = pqc_int(get_uint32(data+pos));
                        idx &= mask;
                        uint32_t j = 0;
                        pos += 3;
diff --git a/sql/backends/monet5/vaults/parquet/pqc_dict_lookup_var.h 
b/sql/backends/monet5/vaults/parquet/pqc_dict_lookup_var.h
--- a/sql/backends/monet5/vaults/parquet/pqc_dict_lookup_var.h
+++ b/sql/backends/monet5/vaults/parquet/pqc_dict_lookup_var.h
@@ -60,13 +60,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                        pos += (sh)/8;
                        } else if (nr_bits < 16) {
                                for(; i < nrows && j < cr->remaining; j++, i++) 
{
-                                       uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                       uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 16) {
                                                pos+=2;
                                                sh -= 16;
-                                               uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                               uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -76,13 +76,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                        pos += (sh)/8;
                        } else if (nr_bits < 32) {
                                for(; i < nrows && j < cr->remaining; j++, i++) 
{
-                                       uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                       uint32_t v = 
pqc_int(get_uint32(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 32) {
                                                pos+=4;
                                                sh -= 32;
-                                               uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                               uint32_t v = 
pqc_int(get_uint32(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -156,13 +156,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                }
                        } else if (nr_bits < 16) {
                                for (; i < nrows && j < m; j++, i++) {
-                                       uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                       uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 16) {
                                                pos+=2;
                                                sh -= 16;
-                                               uint16_t v = 
pqc_sht(*(uint16_t*)(data+pos));
+                                               uint16_t v = 
pqc_sht(get_uint16(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -177,13 +177,13 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                                }
                        } else if (nr_bits < 32) {
                                for (; i < nrows && j < m; j++, i++) {
-                                       uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                       uint32_t v = 
pqc_int(get_uint32(data+pos));
                                        uint32_t idx = (v >> sh)&mask;
                                        sh += nr_bits;
                                        if (sh >= 32) {
                                                pos+=4;
                                                sh -= 32;
-                                               uint32_t v = 
pqc_int(*(uint32_t*)(data+pos));
+                                               uint32_t v = 
pqc_int(get_uint32(data+pos));
                                                idx |= (v << (nr_bits-sh))&mask;
                                        }
                                        assert(idx < cr->dict_num_values);
@@ -219,7 +219,7 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                        }
                } else if (nr_bits <= 16) { /* rle */
                        len>>=1;
-                       uint16_t idx = pqc_sht(*(uint16_t*)(data+pos));
+                       uint16_t idx = pqc_sht(get_uint16(data+pos));
                        pos += 2;
                        for(; i < nrows && j < len; j++, i++)
                                dst[i] = offset+offsets[idx];
@@ -230,7 +230,7 @@ pqc_dict_lookup( pqc_creader_t *cr, void
                        }
                } else if (nr_bits <= 32) { /* rle */
                        len>>=1;
-                       uint32_t idx = pqc_int(*(uint32_t*)(data+pos));
+                       uint32_t idx = pqc_int(get_uint32(data+pos));
                        pos += 4;
                        for(; i < nrows && j < len; j++, i++)
                                dst[i] = offset+offsets[idx];
diff --git a/sql/backends/monet5/vaults/parquet/pqc_filemetadata.c 
b/sql/backends/monet5/vaults/parquet/pqc_filemetadata.c
--- a/sql/backends/monet5/vaults/parquet/pqc_filemetadata.c
+++ b/sql/backends/monet5/vaults/parquet/pqc_filemetadata.c
@@ -851,8 +851,8 @@ pqc_binary2string(pqc_schema_element *ps
                        if (pse->size == 64)
                                return snprintf(buf, sz, LLFMT, 
*(int64_t*)bindata);
                        if (pse->size == 96) {
-                               uint64_t nanoseconds = 
pqc_lng(*(uint64_t*)bindata);
-                               uint32_t julian_day = 
pqc_int(*(uint32_t*)(bindata+8));
+                               uint64_t nanoseconds = 
pqc_lng(get_uint64((unsigned char*)bindata));
+                               uint32_t julian_day = 
pqc_int(get_uint32((unsigned char*)bindata+8));
 
                                nanoseconds /= LL_CONSTANT(1000);
                                julian_day -= 2440588;
diff --git a/sql/backends/monet5/vaults/parquet/pqc_reader.c 
b/sql/backends/monet5/vaults/parquet/pqc_reader.c
--- a/sql/backends/monet5/vaults/parquet/pqc_reader.c
+++ b/sql/backends/monet5/vaults/parquet/pqc_reader.c
@@ -466,7 +466,7 @@ string_read_dict( pqc_creader_t *cr, uin
                return -1;
        if (num_values > 100000 || hsz > 2000000)
                return -1;
-       /* make one error to simplify memory management */
+       /* make one array to simplify memory management */
        char *mem = NEW_ARRAY(char, (sizeof(char*) * num_values + sizeof(int) * 
num_values) + hsz);
        if (!mem)
                return -1;
@@ -506,17 +506,19 @@ blob_read_dict( pqc_creader_t *cr, uint3
 
                data += len + sizeof(int);
                hsz += len + sizeof(size_t);
+               hsz = (hsz +15)&(~15);
        }
+       hsz+=16;
        if (num_values < 1)
                return -1;
        if (num_values > 100000 || hsz > 2000000)
                return -1;
-       /* make one error to simplify memory management */
+       /* make one array to simplify memory management */
        char *mem = NEW_ARRAY(char, (sizeof(char*) * num_values + sizeof(int) * 
num_values) + hsz);
        if (!mem)
                return -1;
        char **rc = (char**)mem;
-       char *buf = mem + sizeof(char*) * num_values + sizeof(int) * 
num_values, *obuf = buf;
+       char *buf = mem + (((sizeof(char*) * num_values + sizeof(int) * 
num_values)+15)&(~15)), *obuf = buf;
        int *offsets = (int*)(mem + sizeof(char*) * num_values);
        data = (uint8_t*)cr->dict;
        for (i=0; i<num_values; i++) {
@@ -528,7 +530,7 @@ blob_read_dict( pqc_creader_t *cr, uint3
                b->nitems = len;
                offsets[i] = (int) (buf - obuf);
                rc[i] = buf;
-               buf += sizeof(size_t)+len;
+               buf += (sizeof(size_t)+len+15)&(~15);
                data += len;
        }
        if (cr->dict_allocated)
@@ -754,6 +756,14 @@ pqc_page_header( pqc_reader_t *r, pqc_cr
                } else {
                        pr->dict_allocated = false;
                        pr->dict = pr->buffer+pos;
+                       if((((ulng)pr->dict) & 15) != 0) { /* copy for 
alignment issues */
+                               char *buf = pr->dict;
+                               pr->dict = NEW_ARRAY(char, uncompressed_size);
+                               if (!pr->dict)
+                                       return -1;
+                               pr->dict_allocated = true;
+                               memcpy(pr->dict, buf, uncompressed_size);
+                       }
                        pr->dictsize = uncompressed_size;
                        pos += uncompressed_size;
                        if (!uncompressed_size)
@@ -773,21 +783,21 @@ pqc_page_header( pqc_reader_t *r, pqc_cr
                        char *s = pr->dict;
                        if (r->pse->size == 16)
                                for(uint32_t i = 0; i < num_values; i++, 
s+=sizeof(uint16_t))
-                                       *(uint16_t*)s = pqc_sht(*(uint16_t*)s);
+                                       *(uint16_t*)s = pqc_sht(get_uint16(s));
                        if (r->pse->size == 32)
                                for(uint32_t i = 0; i < num_values; i++, 
s+=sizeof(uint32_t))
-                                       *(uint32_t*)s = pqc_int(*(uint32_t*)s);
+                                       *(uint32_t*)s = pqc_int(get_uint32(s));
                        if (r->pse->size == 64)
                                for(uint32_t i = 0; i < num_values; i++, 
s+=sizeof(uint64_t))
-                                       *(uint64_t*)s = pqc_lng(*(uint64_t*)s);
+                                       *(uint64_t*)s = pqc_lng(get_uint64(s));
                }
 #endif
                if (num_values && r->pse->type == inttype && r->pse->precision 
== 96) { /* remove the 32 useless bits */
                        ulng *d = (ulng*)pr->dict;
-                       char *s = pr->dict;
+                       unsigned char *s = (unsigned char*)pr->dict;
                        for(uint32_t i = 0; i < num_values; i++, s += 12) {
-                               uint64_t nanoseconds = pqc_lng(*(uint64_t*)s);
-                               uint32_t julian_day = 
pqc_int(*(uint32_t*)(s+8));
+                               uint64_t nanoseconds = pqc_lng(get_uint64(s));
+                               uint32_t julian_day = pqc_int(get_uint32(s+8));
 
                                nanoseconds /= LL_CONSTANT(1000);
                                julian_day -= 2440588;
@@ -796,7 +806,8 @@ pqc_page_header( pqc_reader_t *r, pqc_cr
                }
        }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to