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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list