Changeset: 759aab4cdb4c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/759aab4cdb4c
Added Files:
        sql/backends/monet5/vaults/parquet/Tests/test_parquet_unsigned.test.in
Modified Files:
        sql/backends/monet5/vaults/parquet/Tests/All
        sql/backends/monet5/vaults/parquet/parquet.c
        sql/backends/monet5/vaults/parquet/pqc_reader.c
Branch: default
Log Message:

as monetdb doesn't have unsigned ints, parquet reader up casts unsigneds into 
signed integers with enough space.


diffs (160 lines):

diff --git a/sql/backends/monet5/vaults/parquet/Tests/All 
b/sql/backends/monet5/vaults/parquet/Tests/All
--- a/sql/backends/monet5/vaults/parquet/Tests/All
+++ b/sql/backends/monet5/vaults/parquet/Tests/All
@@ -1,3 +1,4 @@
 #invalid_parquet
 HAVE_SNAPPY?test_parquet_reader
 HAVE_DATA_PATH&HAVE_ZSTD&HAVE_SNAPPY?parquet_testing
+test_parquet_unsigned
diff --git 
a/sql/backends/monet5/vaults/parquet/Tests/test_parquet_unsigned.test.in 
b/sql/backends/monet5/vaults/parquet/Tests/test_parquet_unsigned.test.in
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/vaults/parquet/Tests/test_parquet_unsigned.test.in
@@ -0,0 +1,27 @@
+query IIII nosort
+SELECT * FROM '$QTSTDATAPATH/parquet/parquet_testing/unsigned.parquet'
+----
+1
+1
+1
+1
+2
+2
+2
+2
+3
+3
+3
+3
+4
+4
+4
+4
+5
+5
+5
+5
+255
+65535
+4294967295
+18446744073709551615
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
@@ -244,6 +244,28 @@ pqc_find_subtype(mvc *sql, const pqc_sch
                                return tpe;
                        break;
                case inttype:
+                       if (!pse->isSigned) {
+                               switch(pse->precision) {
+                                       case 8:
+                                               if (sql_find_subtype(tpe, 
"smallint", pse->precision + 1, 0))
+                                                       return tpe;
+                                               break;
+                                       case 16:
+                                               if (sql_find_subtype(tpe, 
"int", pse->precision + 1, 0))
+                                                       return tpe;
+                                               break;
+                                       case 32:
+                                               if (sql_find_subtype(tpe, 
"bigint", pse->precision + 1, 0))
+                                                       return tpe;
+                                               break;
+                                       case 64:
+                                               if (sql_find_subtype(tpe, 
"hugeint", pse->precision + 1, 0))
+                                                       return tpe;
+                                               break;
+                               }
+                       }
+                       if (pse->precision == 8 && sql_find_subtype(tpe, 
"tinyint", pse->precision, 0))
+                               return tpe;
                        if (pse->precision == 8 && sql_find_subtype(tpe, 
"tinyint", pse->precision, 0))
                                return tpe;
                        if (pse->precision == 16 && sql_find_subtype(tpe, 
"smallint", pse->precision, 0))
@@ -252,7 +274,6 @@ pqc_find_subtype(mvc *sql, const pqc_sch
                                return tpe;
                        if (pse->precision == 64 && sql_find_subtype(tpe, 
"bigint", pse->precision, 0))
                                return tpe;
-                       //if (pse->size == 96 && sql_find_subtype(tpe, 
"hugeint", pse->precision, 0))
                        if (pse->precision == 96 && sql_find_subtype(tpe, 
"timestamp", 6, 0))
                                return tpe;
                        break;
@@ -321,18 +342,27 @@ pqc_find_localtype(const pqc_schema_elem
                                return TYPE_bte;
                        break;
                case inttype:
-                       //if (pse->size == 8)
-                       if (pse->precision == 8)
-                               return TYPE_bte;
-                       //if (pse->size == 16)
-                       if (pse->precision == 16)
-                               return TYPE_sht;
-                       //if (pse->size == 32)
-                       if (pse->precision == 32)
-                               return TYPE_int;
-                       //if (pse->size == 64)
-                       if (pse->precision == 64)
-                               return TYPE_lng;
+                       if (!pse->isSigned) {
+                               if (pse->precision == 8)
+                                       return TYPE_sht;
+                               if (pse->precision == 16)
+                                       return TYPE_int;
+                               if (pse->precision == 32)
+                                       return TYPE_lng;
+#ifdef HAVE_HGE
+                               if (pse->precision == 64)
+                                       return TYPE_hge;
+#endif
+                       } else {
+                               if (pse->precision == 8)
+                                       return TYPE_bte;
+                               if (pse->precision == 16)
+                                       return TYPE_sht;
+                               if (pse->precision == 32)
+                                       return TYPE_int;
+                               if (pse->precision == 64)
+                                               return TYPE_lng;
+                       }
                        if (pse->precision == 96)
                                return TYPE_timestamp;
 #ifdef HAVE_HGE
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
@@ -2100,7 +2100,35 @@ pqc_read_page_chunk( pqc_reader_t *r, pq
                }
        }
        /* convert data */
-       if (r->pse->type == datetype) {
+       if (r->pse->precision == 64 && !r->pse->isSigned) {
+               uint64_t *l = output;
+               l += nrows-1;
+               int128_t *r = output;
+               r += nrows-1;
+               for(uint64_t i=0; i< nrows; i++)
+                       r[-i] = l[-i];
+       } else if (r->pse->precision == 32 && !r->pse->isSigned) {
+               uint32_t *l = output;
+               l += nrows-1;
+               int64_t *r = output;
+               r += nrows-1;
+               for(uint64_t i=0; i< nrows; i++)
+                       r[-i] = l[-i];
+       } else if (r->pse->precision == 16 && !r->pse->isSigned) {
+               uint16_t *l = output;
+               l += nrows-1;
+               int32_t *r = output;
+               r += nrows-1;
+               for(uint64_t i=0; i< nrows; i++)
+                       r[-i] = l[-i];
+       } else if (r->pse->precision == 8 && !r->pse->isSigned) {
+               uint8_t *l = output;
+               l += nrows-1;
+               int16_t *r = output;
+               r += nrows-1;
+               for(uint64_t i=0; i< nrows; i++)
+                       r[-i] = l[-i];
+       } else if (r->pse->type == datetype) {
                /* days since epoch ie 1-1-1970 */
                uint32_t epoch_date = mkdate(1970, 1, 1);
                if (r->pse->precision == 32) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to