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