Changeset: 208c3336ab05 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=208c3336ab05
Modified Files:
        monetdb5/modules/mosaic/mosaic_prefix.c
Branch: mosaic
Log Message:

Add boundary checks


diffs (148 lines):

diff --git a/monetdb5/modules/mosaic/mosaic_prefix.c 
b/monetdb5/modules/mosaic/mosaic_prefix.c
--- a/monetdb5/modules/mosaic/mosaic_prefix.c
+++ b/monetdb5/modules/mosaic/mosaic_prefix.c
@@ -141,8 +141,7 @@ MOSadvance_prefix(Client cntxt, MOStask 
                        unsigned char mask = *dst++;
                        unsigned char val = *dst++;
                        bits = (int)(val & (~mask));
-                       // be aware that we use longs as bit vectors
-                       bytes = sizeof(int) * ((MOSgetCnt(task->blk) * bits)/32 
+ (((MOSgetCnt(task->blk) * bits) %32) != 0));
+                       bytes = getBitVectorSize(MOSgetCnt(task->blk),bits) + 
size;
                        task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes, int)); 
                }
                break;
@@ -151,7 +150,7 @@ MOSadvance_prefix(Client cntxt, MOStask 
                        unsigned short mask = *dst++;
                        unsigned short val = *dst++;
                        bits = (int)(val & (~mask));
-                       bytes = sizeof(int) * ((MOSgetCnt(task->blk) * bits)/32 
+ (((MOSgetCnt(task->blk) * bits) %32) != 0));
+                       bytes = getBitVectorSize(MOSgetCnt(task->blk),bits) + 
size;
                        task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes, int)); 
                }
                break;
@@ -160,7 +159,7 @@ MOSadvance_prefix(Client cntxt, MOStask 
                        unsigned int mask = *dst++;
                        unsigned int val = *dst++;
                        bits = (int)(val & (~mask));
-                       bytes = sizeof(int) * ((MOSgetCnt(task->blk) * bits)/32 
+ (((MOSgetCnt(task->blk) * bits) %32) != 0));
+                       bytes = getBitVectorSize(MOSgetCnt(task->blk),bits) + 
size;
                        task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes, int)); 
                }
                break;
@@ -169,7 +168,7 @@ MOSadvance_prefix(Client cntxt, MOStask 
                        ulng mask = *dst++;
                        ulng val = *dst++;
                        bits = (int)(val & (~mask));
-                       bytes = sizeof(int) * ((MOSgetCnt(task->blk) * bits)/32 
+ (((MOSgetCnt(task->blk) * bits) %32) != 0));
+                       bytes = getBitVectorSize(MOSgetCnt(task->blk),bits) + 
size;
                        task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes, int)); 
                }
        }
@@ -203,8 +202,8 @@ flt
 MOSestimate_prefix(Client cntxt, MOStask task)
 {      BUN i = 0;
        flt factor = 0.0;
-       int prefixbits = 0,bits, size;
-       lng store;
+       int prefixbits = 0,size;
+       lng bits,store;
        BUN limit = task->stop - task->start > MOSlimit()? MOSlimit(): 
task->stop - task->start;
        (void) cntxt;
 
@@ -221,6 +220,7 @@ MOSestimate_prefix(Client cntxt, MOStask
                                val2 = *w;
                                break;
                        }
+                       // all are the same?
                        if ( i == limit -1)
                                break;
                        Prefix(bits, mask, val, val2, 8);
@@ -236,6 +236,7 @@ MOSestimate_prefix(Client cntxt, MOStask
                                return task->factor[MOSAIC_PREFIX] = ( (flt)i * 
sizeof(bte))/ store;
                        }
                        
+                       // calculate the number of values covered by this prefix
                        val = *v & mask;
                        for(w=v, i = 0; i < limit ; w++, i++){
                                if ( val != (*w & mask) )
@@ -274,6 +275,7 @@ MOSestimate_prefix(Client cntxt, MOStask
                                return task->factor[MOSAIC_PREFIX] = ( (flt)i * 
sizeof(sht))/ store;
                        }
                        
+                       // calculate the number of values covered by this prefix
                        val = *v & mask;
                        for(w=v,i = 0; i < limit ; w++, i++){
                                if ( val != (*w & mask) )
@@ -312,6 +314,7 @@ MOSestimate_prefix(Client cntxt, MOStask
                                return task->factor[MOSAIC_PREFIX] = ( (flt)i * 
sizeof(int))/ store;
                        }
                        
+                       // calculate the number of values covered by this prefix
                        val = *v & mask;
                        for(w=v,i = 0; i < limit; w++, i++){
                                if ( val != (*w & mask) )
@@ -337,12 +340,10 @@ MOSestimate_prefix(Client cntxt, MOStask
                        }
                        if ( i == limit-1 )
                                break;
-                       Prefix(prefixbits, mask, val, val2, 64); 
-                       if( prefixbits == 0)
+                       Prefix(prefixbits, mask, val, val2, 32); // bitvector 
has limit of 32-bit fields
+                       if( prefixbits == 0 || 64-prefixbits >= 32)
                                break;
 
-                       if( 64 - prefixbits > 32)       // bitvector is limited 
to 32 bits
-                               return 0.0;
                        if( task->range[MOSAIC_PREFIX] > task->start + 1){
                                bits = (task->range[MOSAIC_PREFIX] - 
task->start) * (64-prefixbits);
                                store = bits/8 + ((bits % 8) >0);
@@ -381,8 +382,8 @@ void
 MOScompress_prefix(Client cntxt, MOStask task)
 {
        BUN limit, i, j =0 ;
-       int size;
-       int prefixbits,bits; 
+       int prefixbits; 
+       lng bits,size;
        BitVector base;
        MosaicHdr hdr = task->hdr;
        MosaicBlk blk = task->blk;
@@ -507,22 +508,24 @@ MOScompress_prefix(Client cntxt, MOStask
                        w = v+1;
                        Prefix(prefixbits, mask, val, val2, 32);
                        bits = 64-prefixbits;
-                       *dst++ = mask;
-                       val = *v & mask;        //reference value
-                       *dst = val;
-                       *dst = *dst | bits; // bits outside mask
-                       dst++;
-                       base  = (BitVector) dst; // start of bit vector
-                       
+                       if (bits <= 32){
+                               *dst++ = mask;
+                               val = *v & mask;        //reference value
+                               *dst = val;
+                               *dst = *dst | bits; // bits outside mask
+                               dst++;
+                               base  = (BitVector) dst; // start of bit vector
+                               
 #ifdef _DEBUG_PREFIX_
-                       mnstr_printf(cntxt->fdout,"#prefix compress %o %o val 
%d bits %d, %d mask %o\n",*v,*w,val,bits, bits,mask);
+                               mnstr_printf(cntxt->fdout,"#prefix compress %o 
%o val %d bits %d, %d mask %o\n",*v,*w,val,bits, bits,mask);
 #endif
-                       if( i < limit)
-                       for(j=0, w = v, i = 0; i < limit; w++, i++,j++){
-                               if ( val  != (*w & mask) )
-                                       break;
-                               compress(base,j,bits, (int)(*w & (~mask))); // 
bits
-                               hdr->checksum.sumlng += val;
+                               if( i < limit)
+                               for(j=0, w = v, i = 0; i < limit; w++, i++,j++){
+                                       if ( val  != (*w & mask) )
+                                               break;
+                                       compress(base,j,bits, (int)(*w & 
(~mask))); // bits
+                                       hdr->checksum.sumlng += val;
+                               }
                        }
                        MOSsetCnt(blk,j);
                }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to