Changeset: 2075952d1dc8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2075952d1dc8
Modified Files:
        monetdb5/modules/mal/tablet.c
        sql/backends/monet5/sql_result.c
Branch: directappend
Log Message:

Inline SQLconvert_val into SQLworker_str_column

getting rid of an intermediate copy


diffs (90 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
@@ -37,6 +37,7 @@
 
 #include "monetdb_config.h"
 #include "tablet.h"
+#include "str.h"
 #include "mapi_prompt.h"
 
 #include <string.h>
@@ -1042,9 +1043,9 @@ SQLworker_str_column(READERtask *task, i
        size_t secondary_size = 0;
        for (int i = 0; i < count; i++) {
                size_t max_field_size = c->nil_len;
-               char *s = task->fields[col][i];
-               if (s) {
-                       max_field_size += strlen(s) + 1;
+               char *v = task->fields[col][i];
+               if (v) {
+                       max_field_size += strlen(v) + 1;
                }
                secondary_size += max_field_size;
        }
@@ -1063,13 +1064,48 @@ SQLworker_str_column(READERtask *task, i
        void *s_end = (char*)s + task->secondary.len;
        for (int i = 0; i < count; i++) {
                assert(s <= s_end);
-               size_t len = (char*)s_end - (char*)s;
-               void *orig = s;
-               if (SQLconvert_val(task, col, i, &s, &len) < 0)
-                       return -1;
-               assert(s == orig); (void)orig;
+               size_t s_len = (char*)s_end - (char*)s;
+
+               char *v = task->fields[col][i];
+               if (v == NULL) {
+                       make_it_nil(c, &s, &s_len);
+                       *p++ = s;
+                       s = (char*)s + c->nil_len; // includes trailing NUL byte
+                       continue;
+               }
+
+               // Copy or unescape directly into the secondary buffer.
+               size_t len = strlen(v);
+               if (!task->escape) {
+                       memcpy(s, v, len + 1);
+               } else if (GDKstrFromStr((unsigned char*)s, (unsigned char *)v, 
len) >= 0) {
+                       len = strlen(s);
+               } else {
+                       // GDKstrFromStr failed. How bad is it?
+                       int ret = report_conversion_failed(task, c, i, col + 1, 
v);
+                       make_it_nil(c, &s, &s_len);
+                       if (ret < 0)
+                               return ret;
+                       len = c->nil_len - 1; // trailing NUL byte will be 
accounted for later
+               }
+
+               // Validate against the column's length restriction.
+               // Assumes strlen(s) >= UTF8_strlen(s) >= strPrintWidth(s)
+               if (c->maxwidth > 0 && len > c->maxwidth && !strNil(s)) {
+                       if ((unsigned int)UTF8_strlen(s) > c->maxwidth) {
+                               if ((unsigned int)strPrintWidth(s) > 
c->maxwidth) {
+                                       int ret = 
report_conversion_failed(task, c, i, col + 1, v);
+                                       make_it_nil(c, &s, &s_len);
+                                       if (ret < 0)
+                                               return ret;
+                                       len = c->nil_len - 1; // trailing NUL 
byte will be accounted for later
+                               }
+                       }
+               }
+
+               // Store it in primary and advance secondary
                *p++ = s;
-               s = (char*)s + strlen(s) + 1;
+               s = (char*)s + len + 1; // + 1 because of trailing NUL byte
        }
 
        // Now insert it.
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -898,6 +898,7 @@ mvc_import_table(Client cntxt, BAT ***ba
                                fmt[i].frstr = &sec_frstr;
                        }
                        fmt[i].size = ATOMsize(fmt[i].adt);
+                       fmt[i].maxwidth = col->type.digits;
                }
 
                // do .. while (false) allows us to use 'break' to drop out at 
any point
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to