Changeset: 0c5b8e8b6e6e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/0c5b8e8b6e6e Modified Files: sql/include/sql_catalog.h sql/server/sql_atom.c sql/storage/sql_catalog.c Branch: default Log Message:
Avoid calling strlen twice for long strings. Also validate content for types using string as their storage in the parser (eg json) diffs (163 lines): diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -861,6 +861,7 @@ typedef struct atom { } atom; /* duplicate atom */ +extern ValPtr SA_VALcopy(sql_allocator *sa, ValPtr d, const ValRecord *s); extern atom *atom_dup(sql_allocator *sa, atom *a); typedef struct pl { diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c --- a/sql/server/sql_atom.c +++ b/sql/server/sql_atom.c @@ -34,37 +34,6 @@ atom_create( sql_allocator *sa ) return a; } -static ValPtr -SA_VALcopy(sql_allocator *sa, ValPtr d, const ValRecord *s) -{ - if (sa == NULL) - return VALcopy(d, s); - if (!ATOMextern(s->vtype)) { - *d = *s; - } else if (s->val.pval == 0) { - d->val.pval = ATOMnil(s->vtype); - if (d->val.pval == NULL) - return NULL; - d->vtype = s->vtype; - } else if (s->vtype == TYPE_str) { - d->vtype = TYPE_str; - d->val.sval = sa_strdup(sa, s->val.sval); - if (d->val.sval == NULL) - return NULL; - d->len = strLen(d->val.sval); - } else { - ptr p = s->val.pval; - - d->vtype = s->vtype; - d->len = ATOMlen(d->vtype, p); - d->val.pval = sa_alloc(sa, d->len); - if (d->val.pval == NULL) - return NULL; - memcpy(d->val.pval, p, d->len); - } - return d; -} - atom * atom_bool( sql_allocator *sa, sql_subtype *tpe, bit val) { @@ -288,36 +257,28 @@ lng scales[19] = { atom * atom_general(sql_allocator *sa, sql_subtype *tpe, const char *val) { - atom *a; - ptr p = NULL; + atom *a = atom_create(sa); - if (tpe->type->localtype == TYPE_str) - return atom_string(sa, tpe, val); - a = atom_create(sa); if(!a) return NULL; a->tpe = *tpe; - a->data.val.pval = NULL; a->data.vtype = tpe->type->localtype; - a->data.len = 0; - assert(a->data.vtype >= 0); if (!strNil(val)) { int type = a->data.vtype; - a->isnull = 0; - if (ATOMstorage(type) == TYPE_str) { - a->isnull = 0; - a->data.val.sval = sa_strdup(sa, val); - a->data.len = strlen(a->data.val.sval); + if (type == TYPE_str) { + a->data.len = strLen(val); + a->data.val.sval = sa_alloc(sa, a->data.len); + memcpy(a->data.val.sval, val, a->data.len); } else { + ptr p = NULL; ssize_t res = ATOMfromstr(type, &p, &a->data.len, val, false); /* no result or nil means error (SQL has NULL not nil) */ if (res < 0 || !p || ATOMcmp(type, p, ATOMnilptr(type)) == 0) { - if (p) - GDKfree(p); + GDKfree(p); GDKclrerr(); return NULL; } @@ -362,17 +323,15 @@ atom_ptr( sql_allocator *sa, sql_subtype atom * atom_general_ptr( sql_allocator *sa, sql_subtype *tpe, void *v) { - atom *a = SA_ZNEW(sa, atom); - + atom *a = atom_create(sa); + if(!a) + return NULL; a->tpe = *tpe; a->data.vtype = tpe->type->localtype; - if (ATOMstorage(a->data.vtype) == TYPE_str) { - if (strNil((char*)v)) { - VALset(&a->data, a->data.vtype, (ptr) ATOMnilptr(a->data.vtype)); - } else { - a->data.val.sval = sa_strdup(sa, v); - a->data.len = strlen(a->data.val.sval); - } + if (ATOMextern(a->data.vtype)) { + a->data.len = ATOMlen(a->data.vtype, v); + a->data.val.sval = sa_alloc(sa, a->data.len); + memcpy(a->data.val.sval, v, a->data.len); } else { VALset(&a->data, a->data.vtype, v); } diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c --- a/sql/storage/sql_catalog.c +++ b/sql/storage/sql_catalog.c @@ -499,7 +499,7 @@ nested_mergetable(sql_trans *tr, sql_tab return 0; } -static ValPtr /* TODO remove this duplicated code */ +ValPtr SA_VALcopy(sql_allocator *sa, ValPtr d, const ValRecord *s) { if (sa == NULL) @@ -511,15 +511,17 @@ SA_VALcopy(sql_allocator *sa, ValPtr d, if (d->val.pval == NULL) return NULL; d->vtype = s->vtype; + d->len = ATOMlen(d->vtype, VALptr(d)); } else if (s->vtype == TYPE_str) { + const char *p = s->val.sval; d->vtype = TYPE_str; - d->val.sval = sa_strdup(sa, s->val.sval); + d->len = strLen(p); + d->val.sval = sa_alloc(sa, d->len); if (d->val.sval == NULL) return NULL; - d->len = strLen(d->val.sval); + memcpy(d->val.sval, p, d->len); } else { - ptr p = s->val.pval; - + const void *p = s->val.pval; d->vtype = s->vtype; d->len = ATOMlen(d->vtype, p); d->val.pval = sa_alloc(sa, d->len); @@ -529,7 +531,6 @@ SA_VALcopy(sql_allocator *sa, ValPtr d, } return d; } - atom * atom_dup(sql_allocator *sa, atom *a) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list