Changeset: fb3fee65e47e for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fb3fee65e47e Modified Files: sql/backends/monet5/generator/generator.c Branch: default Log Message:
Merge heads. diffs (100 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 @@ -904,7 +904,9 @@ str VLTgenerator_join(Client cntxt, MalB { bte f,l,s; bte *v; BUN w; f = *getArgReference_bte(stk,p, 1); l = *getArgReference_bte(stk,p, 2); - s = *getArgReference_bte(stk,p, 3); + if ( p->argc == 3) + s = f<l? (bte) 1: (bte)-1; + else s = * getArgReference_bte(stk, p, 3); incr = s > 0; if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) throw(MAL,"generator.join","Illegal range"); @@ -985,10 +987,12 @@ str VLTgenerator_join(Client cntxt, MalB /* The operands of a join operation can either be defined on a generator */ #define VLTrangejoin(TPE, ABS) \ -{ TPE f,f1,f2,l,s; TPE *vlow,*vhgh; BUN w;\ +{ TPE f,f1,l,s; TPE *vlow,*vhgh; BUN w;\ f = *getArgReference_bte(stk,p, 1);\ l = *getArgReference_bte(stk,p, 2);\ - s = *getArgReference_bte(stk,p, 3);\ + if ( p->argc == 3) \ + s = f<l? (TPE) 1: (TPE)-1;\ + else s = * getArgReference_##TPE(stk, p, 3); \ incr = s > 0;\ if ( s == 0 || (f> l && s>0) || (f<l && s < 0))\ throw(MAL,"generator.rangejoin","Illegal range");\ @@ -997,9 +1001,8 @@ str VLTgenerator_join(Client cntxt, MalB for( ; cnt >0; cnt--, o++,vlow++,vhgh++){\ f1 = f + floor(ABS(*vlow-f)/ABS(s)) * s;\ if ( f1 < *vlow ) f1+= s;\ - f2 = *vhgh < l? *vhgh: l;\ w = (BUN) floor(ABS(f1-f)/ABS(s));\ - for( ; (f1 > *vlow || (li && f1 == *vlow)) && (f1 < f2 || (ri && f1 == f2)); f1 += s, w++){\ + for( ; (f1 > *vlow || (li && f1 == *vlow)) && (f1 < *vhgh || (ri && f1 == *vhgh)); f1 += s, w++){\ if(c == limit)\ VLTrangeExpand();\ *ol++ = (oid) w;\ @@ -1037,12 +1040,12 @@ str VLTgenerator_rangejoin(Client cntxt, ri = *getArgReference_bit(stk,pci,6); cnt = BATcount(blow); + limit = 2 * cnt; //top off result before expansion tpe = blow->ttype; o= blow->hseqbase; - bln = BATnew(TYPE_void,TYPE_oid, 2*cnt, TRANSIENT); - brn = BATnew(TYPE_void,TYPE_oid, 2*cnt, TRANSIENT); - limit= BATcapacity(bln); + bln = BATnew(TYPE_void,TYPE_oid, limit, TRANSIENT); + brn = BATnew(TYPE_void,TYPE_oid, limit, TRANSIENT); if( bln == NULL || brn == NULL){ if(bln) BBPreleaseref(bln->batCacheid); if(brn) BBPreleaseref(brn->batCacheid); @@ -1055,24 +1058,26 @@ str VLTgenerator_rangejoin(Client cntxt, /* The actual join code for generators be injected here */ switch(tpe){ - case TYPE_bte: // VLTrangejoin(bte,abs); break; - { bte f,f1,f2,l,s; bte *vlow,*vhgh; BUN w; - f = *getArgReference_bte(stk,p, 1); - l = *getArgReference_bte(stk,p, 2); - s = *getArgReference_bte(stk,p, 3); + case TYPE_bte: VLTrangejoin(bte,abs); break; + case TYPE_sht: //VLTrangejoin(sht,abs); break; + { sht f,f1,l,s; sht *vlow,*vhgh; BUN w; + f = *getArgReference_sht(stk,p, 1); + l = *getArgReference_sht(stk,p, 2); + if ( p->argc == 3) + s = f<l? (sht) 1: (sht)-1; + else s = * getArgReference_sht(stk, p, 3); incr = s > 0; if ( s == 0 || (f> l && s>0) || (f<l && s < 0)) throw(MAL,"generator.rangejoin","Illegal range"); - vlow = (bte*) Tloc(blow,BUNfirst(blow)); - vhgh = (bte*) Tloc(bhgh,BUNfirst(bhgh)); + vlow = (sht*) Tloc(blow,BUNfirst(blow)); + vhgh = (sht*) Tloc(bhgh,BUNfirst(bhgh)); for( ; cnt >0; cnt--, o++,vlow++,vhgh++){ f1 = f + floor(abs(*vlow-f)/abs(s)) * s; if ( f1 < *vlow ) f1+= s; - f2 = *vhgh < l? *vhgh: l; w = (BUN) floor(abs(f1-f)/abs(s)); - for( ; (f1 > *vlow || (li && f1 == *vlow)) && (f1 < f2 || (ri && f1 == f2)); f1 += s, w++){ + for( ; (f1 > *vlow || (li && f1 == *vlow)) && (f1 < *vhgh || (ri && f1 == *vhgh)); f1 += s, w++){ if(c == limit) VLTrangeExpand(); *ol++ = (oid) w; @@ -1081,7 +1086,6 @@ str VLTgenerator_rangejoin(Client cntxt, } } } break; - case TYPE_sht: VLTrangejoin(sht,abs); break; case TYPE_int: VLTrangejoin(int,abs); break; case TYPE_lng: VLTrangejoin(lng,llabs); break; #ifdef HAVE_HGE _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list