Changeset: ac53b6560442 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ac53b6560442
Modified Files:
MonetDB/src/gdk/gdk_batop.mx
MonetDB5/src/mal/mal_box.mx
MonetDB5/src/mal/mal_stack.mx
MonetDB5/src/optimizer/opt_evaluate.mx
sql/src/backends/monet5/sql_gencode.mx
sql/src/backends/monet5/sql_scenario.mx
sql/src/common/sql_list.c
sql/src/server/rel_optimizer.c
Branch: default
Log Message:
now we 'cleanup' prepared statement when we receive an Xrelease from
the client.
After that fixed some leaks...
diffs (256 lines):
diff -r a71e02537e8c -r ac53b6560442 MonetDB/src/gdk/gdk_batop.mx
--- a/MonetDB/src/gdk/gdk_batop.mx Wed Dec 15 14:23:18 2010 +0100
+++ b/MonetDB/src/gdk/gdk_batop.mx Wed Dec 15 23:34:30 2010 +0100
@@ -2914,6 +2914,7 @@
if (!p && (p = (PROPrec *) GDKmalloc(sizeof(PROPrec))) != NULL) {
p->id = idx;
p->next = b->T->props;
+ p->v.vtype = 0;
b->T->props = p;
}
if (p) {
diff -r a71e02537e8c -r ac53b6560442 MonetDB5/src/mal/mal_box.mx
--- a/MonetDB5/src/mal/mal_box.mx Wed Dec 15 14:23:18 2010 +0100
+++ b/MonetDB5/src/mal/mal_box.mx Wed Dec 15 23:34:30 2010 +0100
@@ -419,6 +419,7 @@
chkStack(box->val, i);
}
v = &box->val->stk[i];
+ VALclear(v);
box->val->stktop++;
VALcopy(v, val);
box->dirty= TRUE;
diff -r a71e02537e8c -r ac53b6560442 MonetDB5/src/mal/mal_stack.mx
--- a/MonetDB5/src/mal/mal_stack.mx Wed Dec 15 14:23:18 2010 +0100
+++ b/MonetDB5/src/mal/mal_stack.mx Wed Dec 15 23:34:30 2010 +0100
@@ -213,6 +213,7 @@
for (v = s->stk; i >= 0; i--, v++)
if (ATOMextern(v->vtype) && v->val.pval) {
GDKfree(v->val.pval);
+ v->vtype = 0;
v->val.pval = NULL;
}
s->stkbot = 0;
diff -r a71e02537e8c -r ac53b6560442 MonetDB5/src/optimizer/opt_evaluate.mx
--- a/MonetDB5/src/optimizer/opt_evaluate.mx Wed Dec 15 14:23:18 2010 +0100
+++ b/MonetDB5/src/optimizer/opt_evaluate.mx Wed Dec 15 23:34:30 2010 +0100
@@ -199,6 +199,8 @@
}
if (msg == MAL_SUCCEED) {
ValRecord cst;
+
+ cst.vtype = 0;
VALcopy(&cst, &env->stk[getArg(p, 0)]);
/* You may not overwrite constants. They may
be used by
* other instructions */
diff -r a71e02537e8c -r ac53b6560442 sql/src/backends/monet5/sql_gencode.mx
--- a/sql/src/backends/monet5/sql_gencode.mx Wed Dec 15 14:23:18 2010 +0100
+++ b/sql/src/backends/monet5/sql_gencode.mx Wed Dec 15 23:34:30 2010 +0100
@@ -100,6 +100,7 @@
ValRecord cst;
(void) sql;
+ cst.vtype = 0;
VALcopy(&cst,vr);
idx = defConstant(mb, vr->vtype, &cst);
return idx;
diff -r a71e02537e8c -r ac53b6560442 sql/src/backends/monet5/sql_scenario.mx
--- a/sql/src/backends/monet5/sql_scenario.mx Wed Dec 15 14:23:18 2010 +0100
+++ b/sql/src/backends/monet5/sql_scenario.mx Wed Dec 15 23:34:30 2010 +0100
@@ -105,7 +105,7 @@
(void)clientid;
if (p != NULL)
- GDKfree(p);
+ freeStack(p);
#ifdef _SQL_SCENARIO_DEBUG
mnstr_printf(GDKout, "#monet5_freestack\n");
#endif
@@ -1204,13 +1204,17 @@
v = (int) strtol(in->buf+in->pos+6,NULL,0);
t = res_tables_find(m->results, v);
- if (t) {
- cq *q = NULL;
+ if (t)
+ m->results = res_tables_remove(m->results, t);
+ in->pos = in->len; /* HACK: should use parsed
lenght */
+ return NULL;
+ }
+ if( strncmp(in->buf+in->pos,"release ", 8)==0 ){
+ cq *q = NULL;
- if (t->query_type == Q_PREPARE && (q =
qc_find(m->qc, t->cur_col)) != NULL)
+ v = (int) strtol(in->buf+in->pos+ 8,NULL,0);
+ if ((q = qc_find(m->qc, v)) != NULL)
qc_delete(m->qc, q);
- m->results = res_tables_remove(m->results, t);
- }
in->pos = in->len; /* HACK: should use parsed
lenght */
return NULL;
}
@@ -1326,13 +1330,6 @@
m->type,/* the type of the statement
*/
sql_escape_str(QUERY(m->scanner)));
scanner_query_processed(&(m->scanner));
- /* keep prepared statements in list of results, such
- that Xclose statements can clean them up */
- if (be->q->type == Q_PREPARE) {
- res_table *t = res_table_create(m->session->tr,
m->result_id++, 0, Q_PREPARE, m->results, NULL);
- m->results = t;
- t->cur_col = be->q->id;
- }
be->q->code =
(backend_code)backend_dumpproc(be, c, be->q, s);
be->q->stk = 0;
diff -r a71e02537e8c -r ac53b6560442 sql/src/common/sql_list.c
--- a/sql/src/common/sql_list.c Wed Dec 15 14:23:18 2010 +0100
+++ b/sql/src/common/sql_list.c Wed Dec 15 23:34:30 2010 +0100
@@ -55,6 +55,17 @@
return l;
}
+static list *
+list_new_(list *l)
+{
+ list *res = NULL;
+ if (l->sa)
+ res = list_new(l->sa);
+ else
+ res = list_create(l->destroy);
+ return res;
+}
+
int
list_empty(list *l)
{
@@ -270,7 +281,7 @@
list *
list_keysort(list *l, int *keys, fdup dup)
{
- list *res = list_create(l->destroy);
+ list *res = list_new_(l);
node *n = NULL;
int i, j, *pos, cnt = list_length(l);
@@ -291,7 +302,7 @@
list *
list_sort(list *l, fkeyvalue key, fdup dup)
{
- list *res = list_create(l->destroy);
+ list *res = list_new_(l);
node *n = NULL;
int i, j, *keys, *pos, cnt = list_length(l);
@@ -318,10 +329,7 @@
node *n = NULL;
if (key && l) {
- if (l->sa)
- res = list_new(l->sa);
- else
- res = list_create(l->destroy);
+ res = list_new_(l);
for (n = l->h; n; n = n->next)
if (cmp(n->data, key) == 0)
list_append(res, dup?dup(n->data):n->data);
@@ -333,7 +341,7 @@
list *
list_order(list *l, fcmp cmp, fdup dup)
{
- list *res = list_create(l->destroy);
+ list *res = list_new_(l);
node *m, *n = NULL;
/* use simple insert sort */
@@ -354,7 +362,7 @@
list *
list_distinct(list *l, fcmp cmp, fdup dup)
{
- list *res = list_create(l->destroy);
+ list *res = list_new_(l);
node *n = NULL;
for (n = l->h; n; n = n->next) {
@@ -407,7 +415,7 @@
list *
list_distinct2(list *l, void *data, fcmp2 cmp, fdup dup)
{
- list *res = list_create(l->destroy);
+ list *res = list_new_(l);
node *n = NULL;
for (n = l->h; n; n = n->next) {
@@ -451,7 +459,7 @@
list *
list_map(list *l, void *data, fmap map)
{
- list *res = list_create(l->destroy);
+ list *res = list_new_(l);
node *n = l->h;
@@ -505,11 +513,7 @@
list *
list_dup(list *l, fdup dup)
{
- list *res = NULL;
- if (l->sa)
- res = list_new(l->sa);
- else
- res = list_create(l->destroy);
+ list *res = list_new_(l);
return list_merge(res, l, dup);
}
diff -r a71e02537e8c -r ac53b6560442 sql/src/server/rel_optimizer.c
--- a/sql/src/server/rel_optimizer.c Wed Dec 15 14:23:18 2010 +0100
+++ b/sql/src/server/rel_optimizer.c Wed Dec 15 23:34:30 2010 +0100
@@ -495,9 +495,9 @@
}
list *
-order_join_expressions(list *dje, list *rels)
+order_join_expressions(sql_allocator *sa, list *dje, list *rels)
{
- list *res = list_create(dje->destroy);
+ list *res = list_new(sa);
node *n = NULL;
int i, j, *keys, *pos, cnt = list_length(dje);
@@ -530,7 +530,7 @@
}
static list *
-find_fk(list *rels, list *exps)
+find_fk(sql_allocator *sa, list *rels, list *exps)
{
node *djn;
list *sdje, *aje, *dje;
@@ -599,7 +599,7 @@
}
/* sort expressions on weighted number of reducing operators */
- sdje = order_join_expressions(dje, rels);
+ sdje = order_join_expressions(sa, dje, rels);
return sdje;
}
@@ -613,7 +613,7 @@
int fnd = 0;
/* find foreign keys and reorder the expressions on reducing quality */
- sdje = find_fk(rels, exps);
+ sdje = find_fk(sql->sa, rels, exps);
/* open problem, some expressions use more then 2 relations */
/* For example a.x = b.y * c.z; */
@@ -828,7 +828,7 @@
list_append(rels, rel->l);
list_append(rels, rel->r);
cnt = list_length(exps);
- rel->exps = find_fk(rels, exps);
+ rel->exps = find_fk(sql->sa, rels, exps);
if (list_length(rel->exps) != cnt) {
rel->exps = list_dup(exps, (fdup)NULL);
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list