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

Reply via email to