Changeset: cfd7d5529bc7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cfd7d5529bc7
Modified Files:
        monetdb5/modules/atoms/nested_table.c
Branch: graph0
Log Message:

Bugfix: treat offsets in the vheap as byte displacements


diffs (88 lines):

diff --git a/monetdb5/modules/atoms/nested_table.c 
b/monetdb5/modules/atoms/nested_table.c
--- a/monetdb5/modules/atoms/nested_table.c
+++ b/monetdb5/modules/atoms/nested_table.c
@@ -51,7 +51,7 @@ str NESTEDTABLEprelude(void* ret) {
 
 var_t NESTEDTABLEput(Heap *h, var_t *bun, nested_table *value) {
        const size_t size = (value->count+1) * sizeof(oid);
-       const var_t offset = HEAP_malloc(h, size); // longjmp in case of error 
O.o
+       const var_t offset = HEAP_malloc(h, size) << GDK_VARSHIFT; // longjmp 
in case of error O.o
        memcpy(h->base + offset, value, size);
        return (*bun = offset);
 }
@@ -90,7 +90,7 @@ mal_export str NESTEDTABLEnest1_oid(bat*
        output_content_sz = output_sz + BATcount(group_mapping);
        heap_alloc_offset = HEAP_malloc(output->tvheap, output_content_sz * 
sizeof(oid)) << GDK_VARSHIFT;
        output_content = output->tvheap->base;
-    memset(output_content + heap_alloc_offset, 0, output_content_sz * 
sizeof(oid));
+       memset(output_content + heap_alloc_offset, 0, output_content_sz * 
sizeof(oid));
 
        // edge case, the input is empty
        if(output_sz == 0) goto success;
@@ -98,13 +98,14 @@ mal_export str NESTEDTABLEnest1_oid(bat*
        // compute the offsets
        histogram_values = (lng*) histogram->T.heap.base;
        output_offsets = (var_t*) output->T.heap.base;
-       output_offsets[0] = sum = heap_alloc_offset;
+       sum = heap_alloc_offset;
+       output_offsets[0] = sum >> GDK_VARSHIFT;
        for (size_t i = 1; i < output_sz; i++){
-               sum += histogram_values[i-1] + /* length */ 1;
-               output_offsets[i] = (var_t) sum;
+               sum += (histogram_values[i-1] + /* length */ 1) * sizeof(oid);
+               output_offsets[i] = ((var_t) sum) >> GDK_VARSHIFT;
        }
-       sum += histogram_values[output_sz -1] +1;
-       assert((sum - heap_alloc_offset) == output_content_sz && "computed sum 
!= #groups + #values");
+       sum += (histogram_values[output_sz -1] +1) * sizeof(oid);
+       assert((sum - heap_alloc_offset) == output_content_sz * sizeof(oid) && 
"computed sum != #groups + #values");
        output->tvarsized = 1;
        output->tkey = 1;
        output->tdense = output->tnodense = 0;
@@ -113,14 +114,14 @@ mal_export str NESTEDTABLEnest1_oid(bat*
        output->tnonil = 1; output->tnil = 0;
        BATsetcount(output, output_sz);
 
-    // insert the actual values into the vheap
-    group_mapping_values = (oid*) group_mapping->theap.base;
-    for(size_t i = 0, sz = BATcount(group_mapping); i < sz; i++){
-       var_t offset = output_offsets[ group_mapping_values[i] ];
-       oid* __restrict values = (oid*) (output_content + (offset << 
GDK_VARSHIFT));
-       oid pos = ++values[0];
-       values[pos] = i;
-    }
+       // insert the actual values into the vheap
+       group_mapping_values = (oid*) group_mapping->theap.base;
+       for(size_t i = 0, sz = BATcount(group_mapping); i < sz; i++){
+               var_t offset = output_offsets[ group_mapping_values[i] ] << 
GDK_VARSHIFT;
+               oid* __restrict values = (oid*) (output_content + offset);
+               oid pos = ++values[0];
+               values[pos] = i;
+       }
 
 success:
        BBPunfix(group_mapping->batCacheid);
@@ -143,7 +144,7 @@ mal_export str NESTEDTABLEunnest101_oid(
        str rc = MAL_SUCCEED;
        BAT *nested_attribute = NULL;
        var_t* __restrict na_offsets = NULL;
-       oid* __restrict na_values = NULL;
+       char* __restrict na_values = NULL;
        oid na_count = 0;
        BAT *jl = NULL, *jr = NULL;
 
@@ -162,11 +163,11 @@ mal_export str NESTEDTABLEunnest101_oid(
        na_count = BATcount(nested_attribute);
        na_offsets = (var_t*) nested_attribute->T.heap.base;
        assert(nested_attribute->T.vheap != NULL);
-       na_values = (oid*) nested_attribute->T.vheap->base;
+       na_values =  nested_attribute->T.vheap->base;
        assert(na_values != NULL);
        for(oid i = 0; i < na_count; i++){
-               var_t offset = na_offsets[i];
-               oid* __restrict base = na_values + offset;
+               var_t offset = na_offsets[i] << GDK_VARSHIFT;
+               oid* __restrict base = (oid*) (na_values + offset);
                oid off_count = *(base++);
                assert((offset + (off_count * sizeof(oid)) <= 
nested_attribute->T.vheap->size) && "Index out of bounds");
                for(oid j = 0; j < off_count; j++){
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to