Changeset: 96ca2940cd16 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/96ca2940cd16
Modified Files:
gdk/gdk_calc.c
gdk/gdk_value.c
monetdb5/mal/mal_builder.c
monetdb5/mal/mal_interpreter.c
monetdb5/mal/mal_parser.c
monetdb5/modules/mal/mal_mapi.c
monetdb5/modules/mal/remote.c
Branch: default
Log Message:
Avoid (some) duplication, both in code and in work.
diffs (258 lines):
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -16835,6 +16835,7 @@ VARconvert(ValPtr ret, const ValRecord *
nils = BUN_NONE;
}
ret->val.mval = tmp.val.btval;
+ ret->len = ATOMsize(TYPE_msk);
} else if (v->vtype == TYPE_msk) {
ValRecord tmp;
tmp.vtype = TYPE_bit;
@@ -16845,9 +16846,11 @@ VARconvert(ValPtr ret, const ValRecord *
if (v->vtype == TYPE_void ||
(*ATOMcompare(v->vtype))(VALptr(v),
ATOMnilptr(v->vtype)) == 0) {
- ret->val.sval = GDKstrdup(str_nil);
+ if (VALinit(ret, TYPE_str, str_nil) == NULL)
+ return GDK_FAIL;
} else if (BATatoms[v->vtype].atomToStr ==
BATatoms[TYPE_str].atomToStr) {
- ret->val.sval = GDKstrdup(v->val.sval);
+ if (VALinit(ret, TYPE_str, v->val.sval) == NULL)
+ return GDK_FAIL;
} else {
ret->len = 0;
ret->val.sval = NULL;
@@ -16858,25 +16861,24 @@ VARconvert(ValPtr ret, const ValRecord *
GDKfree(ret->val.sval);
ret->val.sval = NULL;
ret->len = 0;
- nils = BUN_NONE;
- }
- }
- if (ret->val.sval == NULL)
- nils = BUN_NONE;
+ return GDK_FAIL;
+ }
+ }
} else if (ret->vtype == TYPE_void) {
if (abort_on_error &&
ATOMcmp(v->vtype, VALptr(v), ATOMnilptr(v->vtype)) != 0) {
GDKerror("22003!cannot convert non-nil to void.\n");
- nils = BUN_NONE;
+ return GDK_FAIL;
}
ret->val.oval = oid_nil;
+ ret->len = ATOMsize(TYPE_void);
} else if (v->vtype == TYPE_void) {
if (VALinit(ret, ret->vtype, ATOMnilptr(ret->vtype)) == NULL)
- nils = BUN_NONE;
+ return GDK_FAIL;
} else if (v->vtype == TYPE_str) {
if (strNil(v->val.sval)) {
if (VALinit(ret, ret->vtype, ATOMnilptr(ret->vtype)) ==
NULL)
- nils = BUN_NONE;
+ return GDK_FAIL;
} else if (ATOMstorage(ret->vtype) == TYPE_ptr) {
nils = BUN_NONE + 1;
} else {
@@ -16912,7 +16914,7 @@ VARconvert(ValPtr ret, const ValRecord *
"to type %s failed.\n",
ATOMname(ret->vtype));
}
- nils = BUN_NONE;
+ return GDK_FAIL;
} else {
/* now give value obtained to ret */
assert(ATOMextern(ret->vtype) ||
@@ -16928,15 +16930,14 @@ VARconvert(ValPtr ret, const ValRecord *
&(struct
canditer){.tpe=cand_dense, .ncand=1},
0, abort_on_error, &reduce,
scale1, scale2, precision);
- }
- if (nils >= BUN_NONE) {
- if (nils == BUN_NONE + 1) {
- GDKerror("conversion from type %s to type %s "
- "unsupported.\n",
- ATOMname(v->vtype), ATOMname(ret->vtype));
- }
+ if (nils < BUN_NONE)
+ ret->len = ATOMlen(ret->vtype, VALptr(ret));
+ }
+ if (nils == BUN_NONE + 1) {
+ GDKerror("conversion from type %s to type %s "
+ "unsupported.\n",
+ ATOMname(v->vtype), ATOMname(ret->vtype));
return GDK_FAIL;
}
- ret->len = ATOMlen(ret->vtype, VALptr(ret));
- return GDK_SUCCEED;
-}
+ return nils == BUN_NONE ? GDK_FAIL : GDK_SUCCEED;
+}
diff --git a/gdk/gdk_value.c b/gdk/gdk_value.c
--- a/gdk/gdk_value.c
+++ b/gdk/gdk_value.c
@@ -150,11 +150,7 @@ VALcopy(ValPtr d, const ValRecord *s)
if (!ATOMextern(s->vtype)) {
*d = *s;
} else if (s->val.pval == NULL) {
- d->val.pval = ATOMnil(s->vtype);
- if (d->val.pval == NULL)
- return NULL;
- d->vtype = s->vtype;
- d->len = ATOMlen(d->vtype, VALptr(d));
+ return VALinit(d, s->vtype, ATOMnilptr(s->vtype));
} else if (s->vtype == TYPE_str) {
const char *p = s->val.sval;
d->vtype = TYPE_str;
diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c
--- a/monetdb5/mal/mal_builder.c
+++ b/monetdb5/mal/mal_builder.c
@@ -122,13 +122,11 @@ newComment(MalBlkPtr mb, const char *val
return NULL;
q->token = REMsymbol;
q->barrier = 0;
- cst.vtype= TYPE_str;
- if ((cst.val.sval= GDKstrdup(val)) == NULL) {
+ if (VALinit(&cst, TYPE_str, val) == NULL) {
str msg = createException(MAL, "newComment", "Can not allocate
comment");
addMalException(mb, msg);
freeException(msg);
} else {
- cst.len = strlen(cst.val.sval);
k = defConstant(mb, TYPE_str, &cst);
if( k >= 0){
getArg(q,0) = k;
@@ -514,13 +512,12 @@ getStrConstant(MalBlkPtr mb, str val)
int _t;
ValRecord cst;
- cst.vtype = TYPE_str;
- cst.val.sval = val;
- cst.len = strlen(val);
+ VALset(&cst, TYPE_str, val);
_t= fndConstant(mb, &cst, MAL_VAR_WINDOW);
if( _t < 0) {
- if ((cst.val.sval= GDKstrdup(val)) == NULL)
+ if ((cst.val.sval = GDKmalloc(cst.len)) == NULL)
return -1;
+ memcpy(cst.val.sval, val, cst.len); /* includes terminating \0
*/
_t = defConstant(mb, TYPE_str, &cst);
}
assert(_t >= 0);
@@ -535,13 +532,11 @@ pushStr(MalBlkPtr mb, InstrPtr q, const
if (q == NULL)
return NULL;
- cst.vtype= TYPE_str;
- if ((cst.val.sval= GDKstrdup(Val)) == NULL) {
+ if (VALinit(&cst, TYPE_str, Val) == NULL) {
str msg = createException(MAL, "pushStr", "Can not allocate
string variable");
addMalException(mb, msg);
freeException(msg);
} else{
- cst.len = strlen(cst.val.sval);
_t = defConstant(mb,TYPE_str,&cst);
if( _t >= 0)
return pushArgument(mb, q, _t);
@@ -596,14 +591,6 @@ pushNil(MalBlkPtr mb, InstrPtr q, int tp
if (!tpe) {
cst.vtype=TYPE_void;
cst.val.oval= oid_nil;
- } else if (ATOMextern(tpe)) {
- ptr p = ATOMnil(tpe);
- if( p == NULL){
- str msg = createException(MAL, "pushNil", "Can
not allocate nil variable");
- addMalException(mb, msg);
- freeException(msg);
- } else
- VALset(&cst, tpe, p);
} else {
if (VALinit(&cst, tpe, ATOMnilptr(tpe)) == NULL) {
str msg = createException(MAL, "pushNil", "Can
not allocate nil variable");
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -959,9 +959,7 @@ str runMALsequence(Client cntxt, MalBlkP
v = &stk->stk[exceptionVar];
if (v->val.sval)
freeException(v->val.sval); /* old
exception*/
- v->vtype = TYPE_str;
- v->val.sval = ret;
- v->len = strlen(v->val.sval);
+ VALset(v, TYPE_str, ret);
ret = MAL_SUCCEED;
MT_lock_unset(&mal_contextLock);
} else {
diff --git a/monetdb5/mal/mal_parser.c b/monetdb5/mal/mal_parser.c
--- a/monetdb5/mal/mal_parser.c
+++ b/monetdb5/mal/mal_parser.c
@@ -422,13 +422,8 @@ cstToken(Client cntxt, ValPtr cst)
/* JSON Literal */
break;
case '"':
- cst->vtype = TYPE_str;
i = stringLength(cntxt);
- cst->val.sval = strCopy(cntxt, i);
- if (cst->val.sval)
- cst->len = strlen(cst->val.sval);
- else
- cst->len = 0;
+ VALset(cst, TYPE_str, strCopy(cntxt, i));
return i;
case '-':
i++;
@@ -1823,9 +1818,7 @@ parseMAL(Client cntxt, Symbol curPrg, in
}
curInstr->token= REMsymbol;
curInstr->barrier= 0;
- cst.vtype = TYPE_str;
- cst.len = strlen(start);
- if((cst.val.sval = GDKstrdup(start)) == NULL) {
+ if (VALinit(&cst, TYPE_str, start) == NULL) {
parseError(cntxt, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
freeInstruction(curInstr);
continue;
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -1695,13 +1695,11 @@ static int SERVERfieldAnalysis(str fld,
break;
case TYPE_str:
if(fld==0 || strcmp(fld,"nil")==0){
- if((v->val.sval= GDKstrdup(str_nil)) == NULL)
+ if (VALinit(v, TYPE_str, str_nil) == NULL)
return -1;
- v->len = strlen(v->val.sval);
} else {
- if((v->val.sval= GDKstrdup(fld)) == NULL)
+ if (VALinit(v, TYPE_str, fld) == NULL)
return -1;
- v->len = strlen(fld);
}
break;
}
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -359,8 +359,7 @@ RMTconnectTable(Client cntxt, MalBlkPtr
if (msg == MAL_SUCCEED) {
v = &stk->stk[pci->argv[0]];
- v->vtype = TYPE_str;
- if((v->val.sval = GDKstrdup(ret)) == NULL) {
+ if (VALinit(v, TYPE_str, ret) == NULL) {
GDKfree(ret);
throw(MAL, "remote.connect", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
}
@@ -1141,8 +1140,7 @@ static str RMTput(Client cntxt, MalBlkPt
/* return the identifier */
v = &stk->stk[pci->argv[0]];
- v->vtype = TYPE_str;
- if((v->val.sval = GDKstrdup(ident)) == NULL)
+ if (VALinit(v, TYPE_str, ident) == NULL)
throw(MAL, "remote.put", SQLSTATE(HY013) MAL_MALLOC_FAIL);
return(MAL_SUCCEED);
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list