Changeset: 4a3fe2c9fcfd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a3fe2c9fcfd
Modified Files:
        monetdb5/modules/mosaic/TODO_MOSAIC.txt
        monetdb5/modules/mosaic/mosaic.c
        monetdb5/optimizer/opt_mitosis.c
        monetdb5/optimizer/opt_mosaic.c
        sql/backends/monet5/sql_mosaic.c
        sql/test/mosaic/Tests/mix.stable.err
        sql/test/mosaic/Tests/mix.stable.out
Branch: mosaic
Log Message:

Fix memory leaks and error handling in sql_mosaicLayout.


diffs (126 lines):

diff --git a/monetdb5/modules/mosaic/TODO_MOSAIC.txt 
b/monetdb5/modules/mosaic/TODO_MOSAIC.txt
--- a/monetdb5/modules/mosaic/TODO_MOSAIC.txt
+++ b/monetdb5/modules/mosaic/TODO_MOSAIC.txt
@@ -1,5 +1,4 @@
 ####technical depth####
-Fix memory leak
 make sure candidate lists are working properly (2)
 Be sure alignment is correct. Use asserts for this.
 Add test for float/double
diff --git a/monetdb5/modules/mosaic/mosaic.c b/monetdb5/modules/mosaic/mosaic.c
--- a/monetdb5/modules/mosaic/mosaic.c
+++ b/monetdb5/modules/mosaic/mosaic.c
@@ -103,8 +103,10 @@ MOSlayout(BAT *b, BAT *btech, BAT *bcoun
        if( task == NULL)
                throw(SQL,"mosaic",MAL_MALLOC_FAIL);
 
-       if( b->tmosaic == NULL)
+       if( b->tmosaic == NULL) {
+                       GDKfree(task);
                        throw(MAL,"mosaic.layout","Compression heap missing");
+       }
 
        MOSinit(task,b);
        MOSinitializeScan(task, b);
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -278,6 +278,7 @@ OPTmitosisImplementation(Client cntxt, M
        for (; i<limit; i++) 
                if (old[i])
                        pushInstruction(mb,old[i]);
+                       
        for (; i<slimit; i++) 
                if (old[i])
                        freeInstruction(old[i]);
diff --git a/monetdb5/optimizer/opt_mosaic.c b/monetdb5/optimizer/opt_mosaic.c
--- a/monetdb5/optimizer/opt_mosaic.c
+++ b/monetdb5/optimizer/opt_mosaic.c
@@ -50,7 +50,7 @@ str
 OPTmosaicImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci)
 {
        InstrPtr p,q, *old;
-    int limit,i,j, k, actions =0;
+    int limit, slimit,i,j, k, actions =0;
        signed char *check;
        char buf[256];
     lng usec = GDKusec();
@@ -65,7 +65,8 @@ OPTmosaicImplementation(Client cntxt, Ma
        mnstr_printf(cntxt->fdout,"#mosaic implementation\n");
     printFunction(cntxt->fdout,mb,0,LIST_MAL_ALL);
 #endif
-       limit = mb->stop;
+       limit  = mb->stop;
+       slimit = mb->ssize;
        old = mb->stmt;
        if ( newMalBlkStmt(mb, mb->ssize) < 0){
                GDKfree(check);
@@ -145,6 +146,9 @@ OPTmosaicImplementation(Client cntxt, Ma
                if( p )
                        pushInstruction(mb,p);
     }
+       for (; i<slimit; i++)
+               if (old[i])
+                       freeInstruction(old[i]);
        GDKfree(old);
        GDKfree(check);
        chkTypes(cntxt->usermodule, mb, FALSE);
diff --git a/sql/backends/monet5/sql_mosaic.c b/sql/backends/monet5/sql_mosaic.c
--- a/sql/backends/monet5/sql_mosaic.c
+++ b/sql/backends/monet5/sql_mosaic.c
@@ -107,12 +107,24 @@ sql_mosaicLayout(Client cntxt, MalBlkPtr
                                                        continue;
                                                // perform the analysis
                                                bn = 
store_funcs.bind_col(m->session->tr, c, 0);
-                                               MOSlayout(bn, btech, bcount, 
binput, boutput, bproperties);
+
+                                               if ((msg = MOSlayout(bn, btech, 
bcount, binput, boutput, bproperties)) != MAL_SUCCEED) {
+                                                       break;
+                                               }
                                                BBPunfix(bn->batCacheid);
                                                (void) c;
                                        }
                        }
        }
+
+       if (msg != MAL_SUCCEED) {
+               BBPunfix(btech->batCacheid);
+               BBPunfix(bcount->batCacheid);
+               BBPunfix(binput->batCacheid);
+               BBPunfix(boutput->batCacheid);
+               return msg;
+       }
+
        BBPkeepref(*tech);
        BBPkeepref(*count);
        BBPkeepref(*input);
diff --git a/sql/test/mosaic/Tests/mix.stable.err 
b/sql/test/mosaic/Tests/mix.stable.err
--- a/sql/test/mosaic/Tests/mix.stable.err
+++ b/sql/test/mosaic/Tests/mix.stable.err
@@ -34,6 +34,10 @@ CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-15770/.s.monetdb.33013
 QUERY = alter table mix0 alter column i set storage 'mosaic';
 ERROR = !Currently MonetDB does not support the mosaic storage strategy.
+MAPI  = (monetdb) /var/tmp/mtest-25315/.s.monetdb.39889
+QUERY = select * from mosaic.layout('sys','mix0','i') ;
+ERROR = !Compression heap missing
+
 
 
 # 21:39:24 >  
diff --git a/sql/test/mosaic/Tests/mix.stable.out 
b/sql/test/mosaic/Tests/mix.stable.out
--- a/sql/test/mosaic/Tests/mix.stable.out
+++ b/sql/test/mosaic/Tests/mix.stable.out
@@ -131,12 +131,6 @@ stdout of test 'mix` in directory 'sql/t
 [ 9    ]
 [ 9    ]
 #alter table mix0 set read only;
-#alter table mix0 alter column i set storage 'mosaic';
-#select * from mosaic.layout('sys','mix0','i') ;
-% .L4, .L4,    .L4,    .L4,    .L4 # table_name
-% technique,   count,  inputsize,      outputsize,     properties # name
-% clob,        bigint, bigint, bigint, clob # type
-% 0,   1,      1,      1,      0 # length
 #drop table mix0;
 
 # 21:39:24 >  
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to