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]