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