Changeset: 9d89746abd20 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/9d89746abd20 Modified Files: sql/backends/monet5/generator/generator.c Branch: Jul2021 Log Message:
Don't leak please diffs (268 lines): diff --git a/sql/backends/monet5/generator/generator.c b/sql/backends/monet5/generator/generator.c --- a/sql/backends/monet5/generator/generator.c +++ b/sql/backends/monet5/generator/generator.c @@ -225,9 +225,12 @@ findGeneratorDefinition(MalBlkPtr mb, In if ( p->argc == 3) \ s = f<l? (TPE) 1: (TPE)-1; \ else s = * getArgReference_##TPE(stk, p, 3); \ - if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) || is_##TPE##_nil(f) || is_##TPE##_nil(l)) \ + if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) || is_##TPE##_nil(f) || is_##TPE##_nil(l)) { \ + if (cand) \ + BBPunfix(cand->batCacheid); \ throw(MAL, "generator.select", \ SQLSTATE(42000) "Illegal generator range"); \ + } \ n = (BUN) (((TPE2) l - (TPE2) f) / (TPE2) s); \ if ((TPE)(n * s + f) != l) \ n++; \ @@ -345,15 +348,21 @@ VLTgenerator_subselect(Client cntxt, Mal tsf = *getArgReference_TYPE(stk, p, 1, timestamp); tsl = *getArgReference_TYPE(stk, p, 2, timestamp); - if ( p->argc == 3) + if ( p->argc == 3) { + if (cand) + BBPunfix(cand->batCacheid); throw(MAL,"generator.table", SQLSTATE(42000) "Timestamp step missing"); + } tss = *getArgReference_lng(stk, p, 3); if ( tss == 0 || is_timestamp_nil(tsf) || is_timestamp_nil(tsl) || (tss > 0 && tsf > tsl ) || (tss < 0 && tsf < tsl ) - ) + ) { + if (cand) + BBPunfix(cand->batCacheid); throw(MAL, "generator.select", SQLSTATE(42000) "Illegal generator range"); + } tlow = *getArgReference_TYPE(stk,pci,i, timestamp); thgh = *getArgReference_TYPE(stk,pci,i+1, timestamp); @@ -362,13 +371,19 @@ VLTgenerator_subselect(Client cntxt, Mal hi = li; if( hi && !is_timestamp_nil(thgh)) { thgh = timestamp_add_usec(thgh, 1); - if (is_timestamp_nil(thgh)) + if (is_timestamp_nil(thgh)) { + if (cand) + BBPunfix(cand->batCacheid); throw(MAL, "generator.select", SQLSTATE(22003) "overflow in calculation"); + } } if( !li && !is_timestamp_nil(tlow)) { tlow = timestamp_add_usec(tlow, 1); - if (is_timestamp_nil(tlow)) + if (is_timestamp_nil(tlow)) { + if (cand) + BBPunfix(cand->batCacheid); throw(MAL, "generator.select", SQLSTATE(22003) "overflow in calculation"); + } } /* casting one value to lng causes the whole @@ -377,8 +392,11 @@ VLTgenerator_subselect(Client cntxt, Mal tss *= 1000; /* msec -> usec */ o2 = (BUN) (timestamp_diff(tsl, tsf) / tss); bn = COLnew(0, TYPE_oid, o2 + 1, TRANSIENT); - if (bn == NULL) + if (bn == NULL) { + if (cand) + BBPunfix(cand->batCacheid); throw(MAL, "generator.select", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } // simply enumerate the sequence and filter it by predicate and candidate list ol = (oid *) Tloc(bn, 0); @@ -393,10 +411,14 @@ VLTgenerator_subselect(Client cntxt, Mal } tsf = timestamp_add_usec(tsf, tss); if (is_timestamp_nil(tsf)) { + if (cand) + BBPunfix(cand->batCacheid); BBPreclaim(bn); throw(MAL, "generator.select", SQLSTATE(22003) "overflow in calculation"); } } + if (cand) + BBPunfix(cand->batCacheid); BATsetcount(bn, (BUN) n); bn->tsorted = true; bn->trevsorted = BATcount(bn) <= 1; @@ -406,8 +428,11 @@ VLTgenerator_subselect(Client cntxt, Mal * getArgReference_bat(stk, pci, 0) = bn->batCacheid; BBPkeepref(bn->batCacheid); return MAL_SUCCEED; - } else + } else { + if (cand) + BBPunfix(cand->batCacheid); throw(MAL, "generator.select", SQLSTATE(42000) "Unsupported type in select"); + } } if (o1 > (oid) n) o1 = (oid) n; @@ -495,12 +520,18 @@ VLTgenerator_subselect(Client cntxt, Mal if ( p->argc == 3) \ s = f<l? (TPE) 1: (TPE)-1; \ else s = *getArgReference_##TPE(stk,p, 3); \ - if( s == 0 || (f<l && s < 0) || (f>l && s> 0)) \ + if( s == 0 || (f<l && s < 0) || (f>l && s> 0)) { \ + if (cand) \ + BBPunfix(cand->batCacheid); \ throw(MAL,"generator.thetaselect", SQLSTATE(42000) "Illegal range"); \ + } \ cap = (BUN)(ABS(l-f)/ABS(s)); \ bn = COLnew(0, TYPE_oid, cap, TRANSIENT); \ - if( bn == NULL) \ + if( bn == NULL) { \ + if (cand) \ + BBPunfix(cand->batCacheid); \ throw(MAL,"generator.thetaselect", SQLSTATE(HY013) MAL_MALLOC_FAIL); \ + } \ low= hgh = TPE##_nil; \ v = (oid*) Tloc(bn,0); \ if ( strcmp(oper,"<") == 0){ \ @@ -518,8 +549,12 @@ VLTgenerator_subselect(Client cntxt, Mal anti = 1; \ } else if ( strcmp(oper,"==") == 0 || strcmp(oper, "=") == 0){ \ hgh= low= *getArgReference_##TPE(stk,pci,3); \ - } else \ + } else { \ + if (cand) \ + BBPunfix(cand->batCacheid); \ + BBPreclaim(bn); \ throw(MAL,"generator.thetaselect", SQLSTATE(42000) "Unknown operator"); \ + } \ for(j=0;j<cap;j++, f+=s, o++) \ if( ((is_##TPE##_nil(low) || f >= low) && (is_##TPE##_nil(hgh) || f <= hgh)) != anti){ \ if(cand == NULL || canditer_contains(&ci, o)) { \ @@ -686,11 +721,13 @@ wrapup: s = f<l? (TPE) 1: (TPE)-1; \ else \ s = * getArgReference_##TPE(stk, p, 3); \ - if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) \ + if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) { \ + BBPunfix(b->batCacheid); \ throw(MAL,"generator.projection", SQLSTATE(42000) "Illegal range"); \ + } \ bn = COLnew(0, TYPE_##TPE, cnt, TRANSIENT); \ if( bn == NULL){ \ - BBPunfix(bid); \ + BBPunfix(b->batCacheid); \ throw(MAL,"generator.projection", SQLSTATE(HY013) MAL_MALLOC_FAIL); \ } \ v = (TPE*) Tloc(bn,0); \ @@ -706,7 +743,7 @@ wrapup: str VLTgenerator_projection(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { int c= 0, tpe; - bat bid = 0, *ret; + bat *ret; BAT *b, *bn = NULL; BUN cnt; oid *ol = NULL, o= 0; @@ -716,7 +753,7 @@ str VLTgenerator_projection(Client cntxt p = findGeneratorDefinition(mb,pci,pci->argv[2]); ret = getArgReference_bat(stk,pci,0); - b = BATdescriptor(bid = *getArgReference_bat(stk,pci,1)); + b = BATdescriptor(*getArgReference_bat(stk,pci,1)); if( b == NULL) throw(MAL,"generator.projection", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); @@ -777,7 +814,7 @@ str VLTgenerator_projection(Client cntxt s *= 1000; /* msec -> usec */ bn = COLnew(0, TYPE_timestamp, cnt, TRANSIENT); if( bn == NULL){ - BBPunfix(bid); + BBPunfix(b->batCacheid); throw(MAL,"generator.projection", SQLSTATE(HY013) MAL_MALLOC_FAIL); } @@ -786,8 +823,11 @@ str VLTgenerator_projection(Client cntxt for(; cnt-- > 0; o++){ t = ((lng) (ol == NULL ? o : ol[o])) * s; val = timestamp_add_usec(f, t); - if (is_timestamp_nil(val)) + if (is_timestamp_nil(val)) { + BBPunfix(b->batCacheid); + BBPreclaim(bn); throw(MAL, "generator.projection", SQLSTATE(22003) "overflow in calculation"); + } if ( is_timestamp_nil(val)) continue; @@ -802,7 +842,7 @@ str VLTgenerator_projection(Client cntxt } /* adminstrative wrapup of the projection */ - BBPunfix(bid); + BBPunfix(b->batCacheid); if( bn){ bn->tsorted = bn->trevsorted = false; bn->tkey = false; @@ -826,8 +866,13 @@ str VLTgenerator_projection(Client cntxt s = * getArgReference_##TPE(stk, p, 3); \ incr = s > 0; \ v = (TPE*) Tloc(b,0); \ - if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) \ + if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) { \ + BBPunfix(bln->batCacheid); \ + BBPunfix(brn->batCacheid); \ + if(bl) BBPunfix(bl->batCacheid); \ + if(br) BBPunfix(br->batCacheid); \ throw(MAL,"generator.join", SQLSTATE(42000) "Illegal range"); \ + } \ for( ; cnt >0; cnt--,o++,v++){ \ w = (BUN) (ABS(*v -f)/ABS(s)); \ if ( f + (TPE)(w * s) == *v ){ \ @@ -882,8 +927,10 @@ str VLTgenerator_join(Client cntxt, MalB if ( q == NULL){ /* p != NULL, hence bl == NULL */ br = BATdescriptor(*getArgReference_bat(stk,pci,3)); - if( br == NULL) + if( br == NULL) { + if(bl) BBPunfix(bl->batCacheid); throw(MAL,"generator.join", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); + } } // in case of both generators || getModuleId(q) == generatorRef)materialize the 'smallest' one first @@ -933,6 +980,10 @@ str VLTgenerator_join(Client cntxt, MalB // it is easier to produce the timestamp series // then to estimate the possible index } + BBPunfix(bln->batCacheid); + BBPunfix(brn->batCacheid); + if(bl) BBPunfix(bl->batCacheid); + if(br) BBPunfix(br->batCacheid); throw(MAL,"generator.join", SQLSTATE(42000) "Illegal type"); } @@ -999,8 +1050,13 @@ str VLTgenerator_join(Client cntxt, MalB else \ s = * getArgReference_##TPE(stk, p, 3); \ incr = s > 0; \ - if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) \ + if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) { \ + if(bln) BBPunfix(bln->batCacheid); \ + if(brn) BBPunfix(brn->batCacheid); \ + if(blow) BBPunfix(blow->batCacheid); \ + if(bhgh) BBPunfix(bhgh->batCacheid); \ throw(MAL,"generator.rangejoin", SQLSTATE(42000) "Illegal range"); \ + } \ vlow = (TPE*) Tloc(blow,0); \ vhgh = (TPE*) Tloc(bhgh,0); \ for( ; cnt >0; cnt--, done++, o++,vlow++,vhgh++){ \ @@ -1079,6 +1135,10 @@ str VLTgenerator_rangejoin(Client cntxt, // it is easier to produce the timestamp series // then to estimate the possible index } + if(bln) BBPunfix(bln->batCacheid); + if(brn) BBPunfix(brn->batCacheid); + if(blow) BBPunfix(blow->batCacheid); + if(bhgh) BBPunfix(bhgh->batCacheid); throw(MAL,"generator.rangejoin","Illegal type"); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list