Changeset: c27e64586b10 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c27e64586b10
Modified Files:
sql/backends/monet5/generator/generator.c
Branch: default
Log Message:
Better check on upper bound in series rangejoin.
diffs (59 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
@@ -985,7 +985,7 @@ 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,l,s; TPE *vlow,*vhgh; BUN w;\
+{ TPE f,f1,f2,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);\
@@ -997,8 +997,9 @@ 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 < *vhgh ||
(ri && f1 == *vhgh)); f1 += s, w++){\
+ for( ; (f1 > *vlow || (li && f1 == *vlow)) && (f1 < f2 || (ri
&& f1 == f2)); f1 += s, w++){\
if(c == limit)\
VLTrangeExpand();\
*ol++ = (oid) w;\
@@ -1036,12 +1037,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, limit, TRANSIENT);
- brn = BATnew(TYPE_void,TYPE_oid, limit, TRANSIENT);
+ bln = BATnew(TYPE_void,TYPE_oid, 2*cnt, TRANSIENT);
+ brn = BATnew(TYPE_void,TYPE_oid, 2*cnt, TRANSIENT);
+ limit= BATcapacity(bln);
if( bln == NULL || brn == NULL){
if(bln) BBPreleaseref(bln->batCacheid);
if(brn) BBPreleaseref(brn->batCacheid);
@@ -1055,7 +1056,7 @@ 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,l,s; bte *vlow,*vhgh; BUN w;
+ { 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);
@@ -1069,8 +1070,9 @@ str VLTgenerator_rangejoin(Client cntxt,
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 < *vhgh ||
(ri && f1 == *vhgh)); f1 += s, w++){
+ for( ; (f1 > *vlow || (li && f1 == *vlow)) && (f1 < f2 || (ri
&& f1 == f2)); f1 += s, w++){
if(c == limit)
VLTrangeExpand();
*ol++ = (oid) w;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list