Changeset: 2bf31e6acb03 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2bf31e6acb03
Modified Files:
gdk/gdk_value.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_gencode.c
sql/server/rel_exp.c
sql/server/rel_optimizer.c
sql/server/rel_select.c
sql/server/sql_atom.c
sql/server/sql_atom.h
sql/server/sql_mvc.c
Branch: Dec2016
Log Message:
Fix some memory leaks in the use of SQL atoms.
Atoms are mostly allocated and destroyed using SQL allocators. This
means that any memory allocated for those atoms also need to be
allocated using the same allocators. In addition, we try to not
allocate extra space for NIL values, and make sure we don't free them
accidentally in VALclear.
diffs (217 lines):
diff --git a/gdk/gdk_value.c b/gdk/gdk_value.c
--- a/gdk/gdk_value.c
+++ b/gdk/gdk_value.c
@@ -116,7 +116,7 @@ void
VALclear(ValPtr v)
{
if (v->vtype == TYPE_str || ATOMextern(v->vtype)) {
- if (v->val.pval && v->val.pval != str_nil)
+ if (v->val.pval && v->val.pval != ATOMnilptr(v->vtype))
GDKfree(v->val.pval);
}
VALempty(v);
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -893,7 +893,7 @@ sql_convert_arg(mvc *sql, int nr, sql_su
if (atom_null(a)) {
if (a->data.vtype != rt->type->localtype) {
a->data.vtype = rt->type->localtype;
- VALinit(&a->data, a->data.vtype,
ATOMnilptr(a->data.vtype));
+ VALset(&a->data, a->data.vtype, (ptr)
ATOMnilptr(a->data.vtype));
}
}
a->tpe = *rt;
@@ -916,7 +916,7 @@ inplace_convert(mvc *sql, sql_subtype *c
return s;
a = sql_bind_arg(sql, s->flag);
- if (atom_cast(a, ct)) {
+ if (atom_cast(sql->sa, a, ct)) {
stmt *r = stmt_varnr(sql->sa, s->flag, ct);
sql_convert_arg(sql, s->flag, ct);
return r;
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -233,7 +233,7 @@ SQLexecutePrepared(Client c, backend *be
atom *arg = m->args[i];
sql_subtype *pt = q->params + i;
- if (!atom_cast(arg, pt)) {
+ if (!atom_cast(m->sa, arg, pt)) {
/*sql_error(c, 003, buf); */
if (pci->argc >= MAXARG)
GDKfree(argv);
@@ -294,7 +294,7 @@ SQLrun(Client c, backend *be, mvc *m){
sql_subtype *pt = be->q->params + j;
atom *arg = m->args[j];
- if (!atom_cast(arg, pt)) {
+ if (!atom_cast(m->sa, arg, pt)) {
throw(SQL, "sql.prepare", "07001!EXEC:
wrong type for argument %d of " "query template : %s, expected %s", i + 1,
atom_type(arg)->type->sqlname, pt->type->sqlname);
}
val= (ValPtr) &arg->data;
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -3002,7 +3002,7 @@ backend_call(backend *be, Client c, cq *
atom *a = m->args[i];
sql_subtype *pt = cq->params + i;
- if (!atom_cast(a, pt)) {
+ if (!atom_cast(m->sa, a, pt)) {
sql_error(m, 003, "wrong type for argument %d
of " "function call: %s, expected %s\n", i + 1, atom_type(a)->type->sqlname,
pt->type->sqlname);
break;
}
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1764,7 +1764,7 @@ exp_flatten(mvc *sql, sql_exp *e)
} else if (e->type == e_convert) {
atom *v = exp_flatten(sql, e->l);
- if (v && atom_cast(v, &e->tpe))
+ if (v && atom_cast(sql->sa, v, &e->tpe))
return v;
return NULL;
} else if (e->type == e_func) {
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -2719,7 +2719,7 @@ exp_simplify_math( mvc *sql, sql_exp *e,
atom *ra = exp_flatten(sql, re);
if (la && ra) {
- atom *a = atom_mul(la, ra);
+ atom *a = atom_mul(sql->sa, la, ra);
if (a) {
sql_exp *ne = exp_atom(sql->sa,
a);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1148,7 +1148,7 @@ convert_atom(atom *a, sql_subtype *rt)
a->data.vtype = rt->type->localtype;
p = ATOMnilptr(a->data.vtype);
- VALinit(&a->data, a->data.vtype, p);
+ VALset(&a->data, a->data.vtype, (ptr) p);
}
}
a->tpe = *rt;
@@ -1171,7 +1171,7 @@ exp_convert_inplace(mvc *sql, sql_subtyp
if (t->scale && t->type->eclass != EC_FLT)
return NULL;
- if (a && atom_cast(a, t)) {
+ if (a && atom_cast(sql->sa, a, t)) {
convert_atom(a, t);
exp->tpe = *t;
return exp;
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
@@ -36,8 +36,10 @@ atom_create( sql_allocator *sa )
}
static ValPtr
-SA_VALcopy(sql_allocator *sa, ValPtr d, ValPtr s)
+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) {
@@ -266,7 +268,7 @@ atom_general(sql_allocator *sa, sql_subt
/*_DELETE(val);*/
}
} else {
- VALinit(&a->data, a->data.vtype, ATOMnilptr(a->data.vtype));
+ VALset(&a->data, a->data.vtype, (ptr)
ATOMnilptr(a->data.vtype));
a->isnull = 1;
}
return a;
@@ -617,7 +619,7 @@ lng scales[19] = {
#endif
/* cast atom a to type tp (success == 1, fail == 0) */
int
-atom_cast(atom *a, sql_subtype *tp)
+atom_cast(sql_allocator *sa, atom *a, sql_subtype *tp)
{
sql_subtype *at = &a->tpe;
@@ -1096,15 +1098,14 @@ atom_cast(atom *a, sql_subtype *tp)
a->tpe = *tp;
a->data.vtype = type;
VALset(&a->data, a->data.vtype, p);
- if (p && ATOMextern(a->data.vtype) == 0)
- GDKfree(p);
+ SA_VALcopy(sa, &a->data, &a->data);
+ GDKfree(p);
return 1;
}
} else {
a->tpe = *tp;
a->data.vtype = tp->type->localtype;
- VALinit(&a->data, a->data.vtype, ATOMnilptr(a->data.vtype));
- return 1;
+ return VALset(&a->data, a->data.vtype, (ptr)
ATOMnilptr(a->data.vtype)) != NULL;
}
return 0;
}
@@ -1243,7 +1244,7 @@ atom_sub(atom *a1, atom *a2)
}
atom *
-atom_mul(atom *a1, atom *a2)
+atom_mul(sql_allocator *sa, atom *a1, atom *a2)
{
if (!EC_COMPUTE(a1->tpe.type->eclass))
return NULL;
@@ -1259,9 +1260,9 @@ atom_mul(atom *a1, atom *a2)
return a2;
}
if (a1->tpe.type->localtype > a2->tpe.type->localtype) {
- if (!atom_cast(a2, &a1->tpe))
+ if (!atom_cast(sa, a2, &a1->tpe))
return NULL;
- } else if (!atom_cast(a1, &a2->tpe)) {
+ } else if (!atom_cast(sa, a1, &a2->tpe)) {
return NULL;
}
}
diff --git a/sql/server/sql_atom.h b/sql/server/sql_atom.h
--- a/sql/server/sql_atom.h
+++ b/sql/server/sql_atom.h
@@ -46,7 +46,7 @@ extern unsigned int atom_num_digits( ato
extern atom *atom_dup( sql_allocator *sa, atom *a);
/* cast atom a to type tp (success == 1, fail == 0) */
-extern int atom_cast(atom *a, sql_subtype *tp);
+extern int atom_cast(sql_allocator *sa, atom *a, sql_subtype *tp);
extern char *atom2string(sql_allocator *sa, atom *a);
extern char *atom2sql(atom *a);
@@ -62,7 +62,7 @@ extern int atom_cmp(atom *a1, atom *a2);
extern atom *atom_add(atom *a1, atom *a2);
extern atom *atom_sub(atom *a1, atom *a2);
-extern atom *atom_mul(atom *a1, atom *a2);
+extern atom *atom_mul(sql_allocator *sa, atom *a1, atom *a2);
extern void atom_inc(atom *a);
extern int atom_is_zero(atom *a);
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -1364,7 +1364,7 @@ stack_set(mvc *sql, int var, const char
v->frame = frame;
if (type) {
int tpe = type->type->localtype;
- VALinit(&sql->vars[var].a.data, tpe, ATOMnilptr(tpe));
+ VALset(&sql->vars[var].a.data, tpe, (ptr) ATOMnilptr(tpe));
v->a.tpe = *type;
}
if (name)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list