Changeset: a8468c8528d6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a8468c8528d6
Modified Files:
        sql/backends/monet5/sql_bincopyconvert.c
        sql/backends/monet5/sql_bincopyconvert.h
        sql/backends/monet5/sql_bincopyfrom.c
Branch: copyintobinary
Log Message:

Revamp converter selection table


diffs (128 lines):

diff --git a/sql/backends/monet5/sql_bincopyconvert.c 
b/sql/backends/monet5/sql_bincopyconvert.c
--- a/sql/backends/monet5/sql_bincopyconvert.c
+++ b/sql/backends/monet5/sql_bincopyconvert.c
@@ -385,12 +385,15 @@ end:
 
 
 static struct type_record_t type_recs[] = {
+
        // no conversion, no byteswapping
-       { "bte", "bte", .decoder=NULL, },
-       { "uuid", "uuid", .decoder=NULL, },
+       { "bte", "bte", .encoder_trivial=true, .decoder_trivial=true},
+       { "uuid", "uuid", .encoder_trivial=true, .decoder_trivial=true},
+
        // no conversion and no byteswapping but we must do range checking on 
loading
-       { "bit", "bit", .trivial_if_no_byteswap=false, .decoder=validate_bit, 
.encoder=NULL},
-       //
+       { "bit", "bit", .trivial_if_no_byteswap=false, .decoder=validate_bit, 
.encoder_trivial=true},
+
+       // vanilla integer types
        { "sht", "sht", .trivial_if_no_byteswap=true, .decoder=byteswap_sht, 
.encoder=byteswap_sht},
        { "int", "int", .trivial_if_no_byteswap=true, .decoder=byteswap_int, 
.encoder=byteswap_int},
        { "lng", "lng", .trivial_if_no_byteswap=true, .decoder=byteswap_lng, 
.encoder=byteswap_lng},
@@ -399,11 +402,13 @@ static struct type_record_t type_recs[] 
 #ifdef HAVE_HGE
        { "hge", "hge", .trivial_if_no_byteswap=true, .decoder=byteswap_hge, 
.encoder=byteswap_hge},
 #endif
+
        // \0-terminated text records
        { "str", "str", .loader=load_zero_terminated_text, 
.dumper=dump_zero_terminated_text },
        { "url", "url", .loader=load_zero_terminated_text, 
.dumper=dump_zero_terminated_text },
        { "json", "json", .loader=load_zero_terminated_text, 
.dumper=dump_zero_terminated_text },
-       //
+
+       // temporal types have record size different from the underlying gdk 
type
        { "date", "date", .decoder=decode_date, .encoder=encode_date, 
.record_size=sizeof(copy_binary_date), },
        { "daytime", "daytime", .decoder=decode_time, .encoder=encode_time, 
.record_size=sizeof(copy_binary_time), },
        { "timestamp", "timestamp", .decoder=decode_timestamp, 
.encoder=encode_timestamp, .record_size=sizeof(copy_binary_timestamp), },
diff --git a/sql/backends/monet5/sql_bincopyconvert.h 
b/sql/backends/monet5/sql_bincopyconvert.h
--- a/sql/backends/monet5/sql_bincopyconvert.h
+++ b/sql/backends/monet5/sql_bincopyconvert.h
@@ -47,9 +47,11 @@ struct type_record_t {
        size_t record_size;
        bool trivial_if_no_byteswap;
 
+       bool decoder_trivial;
        bincopy_decoder_t decoder;
        bincopy_loader_t loader;
 
+       bool encoder_trivial;
        bincopy_encoder_t encoder;
        bincopy_dumper_t dumper;
 };
diff --git a/sql/backends/monet5/sql_bincopyfrom.c 
b/sql/backends/monet5/sql_bincopyfrom.c
--- a/sql/backends/monet5/sql_bincopyfrom.c
+++ b/sql/backends/monet5/sql_bincopyfrom.c
@@ -168,23 +168,25 @@ load_column(type_record_t *rec, const ch
        str msg = MAL_SUCCEED;
        BUN rows_added;
 
+       bincopy_loader_t loader = rec->loader;
+       bincopy_decoder_t decoder = rec->decoder;
+       bool trivial = rec->decoder_trivial;
+
+       // sanity check
+       assert( (loader != NULL) + (decoder != NULL) + trivial == 1);
+
+       if (rec->trivial_if_no_byteswap && !byteswap)
+               decoder = NULL;
+
        orig_count = BATcount(bat);
 
-       // cannot have loader AND decoder
-       assert(rec->decoder == NULL || rec->loader == NULL);
-
-       // loaders cannot be trivial
-       assert( rec->loader == NULL || !rec->trivial_if_no_byteswap);
-
-       if (rec->loader) {
-               msg = rec->loader(bat, s, eof_reached, byteswap);
-       } else if (rec->decoder == NULL || (rec->trivial_if_no_byteswap && 
!byteswap)) {
+       if (loader) {
+               msg = loader(bat, s, eof_reached, byteswap);
+       } else if (decoder) {
+               msg = load_fixed_width(bat, s, byteswap, rec->decoder, 
rec->record_size, eof_reached);
                // load the bytes directly into the bat, as-is
+       } else {
                msg = load_trivial(bat, s, rows_estimate, eof_reached);
-       } else {
-               // load the bytes into an intermediate buffer and use the 
converter to
-               // move them to the BAT
-               msg = load_fixed_width(bat, s, byteswap, rec->decoder, 
rec->record_size, eof_reached);
        }
 
        new_count = BATcount(bat);
@@ -373,21 +375,22 @@ dump_column(const struct type_record_t *
 {
        str msg = MAL_SUCCEED;
 
-       // cannot have dumper AND encoder
-       assert(rec->encoder == NULL || rec->dumper == NULL);
+       bincopy_dumper_t dumper = rec->dumper;
+       bincopy_encoder_t encoder = rec->encoder;
+       bool trivial = rec->encoder_trivial;
 
-       // dumpers cannot be trivial
-       assert( rec->dumper == NULL || !rec->trivial_if_no_byteswap);
+       // sanity check
+       assert( (dumper != NULL) + (encoder != NULL) + trivial == 1);
 
-       // Temporary measure while not all dumpers have been implemented
-       assert(rec->dumper || rec->encoder || BATttype(b) == TYPE_bit);
+       if (rec->trivial_if_no_byteswap && !byteswap)
+               encoder = NULL;
 
-       if (rec->dumper) {
+       if (dumper) {
                msg = rec->dumper(b, s, byteswap);
-       } else if (rec->encoder == NULL || (rec->trivial_if_no_byteswap && 
!byteswap)) {
+       } else if (encoder) {
+               msg = dump_fixed_width(b, s, byteswap, rec->encoder, 
rec->record_size);
+       } else {
                msg = dump_trivial(b, s);
-       } else {
-               msg = dump_fixed_width(b, s, byteswap, rec->encoder, 
rec->record_size);
        }
 
        return msg;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to