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

Reply via email to