Changeset: 7c3109a66dae for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7c3109a66dae
Modified Files:
monetdb5/optimizer/opt_reorder.mx
sql/backends/monet5/sql_optimizer.c
sql/common/sql_types.c
sql/storage/store_dependency.c
sql/test/BugTracker-2010/Tests/mat.slice_limit1.Bug-2645.stable.out
Branch: Dec2011
Log Message:
fix leaks
fix use of query cache in case of string columns
diffs (137 lines):
diff --git a/monetdb5/optimizer/opt_reorder.mx
b/monetdb5/optimizer/opt_reorder.mx
--- a/monetdb5/optimizer/opt_reorder.mx
+++ b/monetdb5/optimizer/opt_reorder.mx
@@ -93,7 +93,8 @@ typedef struct{
} *Node, NodeRecord;
static Node *
-OPTdependencies(Client cntxt, MalBlkPtr mb, int **Ulist){
+OPTdependencies(Client cntxt, MalBlkPtr mb, int **Ulist)
+{
Node *list = (Node *) GDKzalloc(sizeof(Node) * mb->stop);
int *var = (int*) GDKzalloc(sizeof(int) * mb->vtop), *uselist = NULL;
int i,j,sz=0;
@@ -244,8 +245,10 @@ OPTreorderImplementation(Client cntxt, M
limit= mb->stop;
slimit= mb->ssize;
old = mb->stmt;
- if ( newMalBlkStmt(mb, mb->ssize) < 0)
+ if ( newMalBlkStmt(mb, mb->ssize) < 0) {
+ GDKfree(uselist);
return 0;
+ }
pushInstruction(mb,old[0]);
old[0]=0;
@@ -293,6 +296,7 @@ OPTreorderImplementation(Client cntxt, M
if (old[i])
freeInstruction(old[i]);
OPTremoveDep(dep, limit);
+ GDKfree(uselist);
GDKfree(old);
return 1;
}
diff --git a/sql/backends/monet5/sql_optimizer.c
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -507,6 +507,7 @@ setOptimizers(str optimizer)
{
int top=0;
char *base=0, *nxt, *nme, *pipe="notdefined";
+ char *pipedef = NULL;
/* do nothing if the pipe line is already set */
if ( optimizerpipe && optimizer && strcmp(optimizerpipe,optimizer) == 0
&& strcmp(optimizer,"off") )
@@ -516,21 +517,19 @@ setOptimizers(str optimizer)
if (optimizer == NULL || *optimizer == 0 ) {
pipe = GDKgetenv(minimalPipe);
if ( pipe == NULL)
- pipe= getPipeDefinition(optimizer);
+ pipedef = pipe= getPipeDefinition(optimizer);
if ( pipe )
optimizer = pipe;
- } else
- /* optimizers can be temporarily turned on/off */
- if(strcmp(optimizer,"off")==0 ) {
+ } else if(strcmp(optimizer,"off")==0 ) {
+ /* optimizers can be temporarily turned on/off */
if ( previouspipe )
return optimizerpipe;
previouspipe = optimizerpipe; /* give reference away */
optimizerpipe = NULL;
- pipe= getPipeDefinition(minimalPipe);
+ pipedef = pipe= getPipeDefinition(minimalPipe);
if ( pipe )
optimizer = pipe;
- } else
- if (strcmp(optimizer,"on")==0){
+ } else if (strcmp(optimizer,"on")==0){
if ( previouspipe == NULL)
return optimizerpipe;
optimizer= previouspipe;
@@ -539,7 +538,7 @@ setOptimizers(str optimizer)
/* the optimizer may be an environment alias */
pipe = GDKgetenv(optimizer);
if ( pipe == NULL)
- pipe= getPipeDefinition(optimizer);
+ pipedef = pipe= getPipeDefinition(optimizer);
if ( pipe )
optimizer = pipe;
}
@@ -548,7 +547,8 @@ setOptimizers(str optimizer)
need to also free the old value, making sure we don't first
free the value that maybe we want to strdup (in case
optimizer==optimizerpipe) */
- optimizer = GDKstrdup(optimizer);
+ if (!pipedef) /* pipedef is already strdupped */
+ optimizer = GDKstrdup(optimizer);
if (base) /* free old value of previouspipe */
GDKfree(base);
if (optimizerpipe)
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -388,6 +388,9 @@ is_subtype(sql_subtype *sub, sql_subtype
return 0;
if (super->digits > 0 && sub->digits > super->digits)
return 0;
+ if (super->digits == 0 && super->type->eclass == EC_STRING &&
+ (sub->type->eclass == EC_STRING || sub->type->eclass == EC_CHAR))
+ return 1;
/* subtypes are only equal iff
they map onto the same systemtype */
return (type_cmp(sub->type, super->type) == 0);
diff --git a/sql/storage/store_dependency.c b/sql/storage/store_dependency.c
--- a/sql/storage/store_dependency.c
+++ b/sql/storage/store_dependency.c
@@ -131,9 +131,15 @@ sql_trans_get_dependency_type(sql_trans
dep_dep_type = find_sql_column(dep, "depend_type");
rid = table_funcs.column_find_row(tr, dep_id, &id, dep_dep_type,
&depend_type, NULL);
- if (rid != oid_nil)
- return *(int *) table_funcs.column_find_value(tr, dep_dep_id,
rid);
- else return -1;
+ if (rid != oid_nil) {
+ int r, *v = table_funcs.column_find_value(tr, dep_dep_id, rid);
+
+ r = *v;
+ _DELETE(v);
+ return r;
+ } else {
+ return -1;
+ }
}
/*It checks if there are dependency between two ID's */
diff --git
a/sql/test/BugTracker-2010/Tests/mat.slice_limit1.Bug-2645.stable.out
b/sql/test/BugTracker-2010/Tests/mat.slice_limit1.Bug-2645.stable.out
--- a/sql/test/BugTracker-2010/Tests/mat.slice_limit1.Bug-2645.stable.out
+++ b/sql/test/BugTracker-2010/Tests/mat.slice_limit1.Bug-2645.stable.out
@@ -115,7 +115,7 @@ Ready.
#TRACE select cast(x as string)||'-bla-'||cast(y as string) from slice_test
limit 1;
% sys. # table_name
% concat_concat_x # name
-% clob # type
+% varchar # type
% 7 # length
[ "0-bla-1" ]
#SELECT count(*) FROM
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list