Changeset: aa93fac297ed for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=aa93fac297ed
Modified Files:
        monetdb5/modules/atoms/blob.c
        monetdb5/modules/atoms/nested_table.c
        monetdb5/modules/atoms/nested_table.mal
        sql/backends/monet5/sql_statement.c
Branch: graph0
Log Message:

RUNTIME: use HEAP_malloc to obtain a memory area for the values


diffs (210 lines):

diff --git a/monetdb5/modules/atoms/blob.c b/monetdb5/modules/atoms/blob.c
--- a/monetdb5/modules/atoms/blob.c
+++ b/monetdb5/modules/atoms/blob.c
@@ -52,7 +52,6 @@ mal_export str BLOBtoblob(blob **retval,
 mal_export str BLOBfromblob(str *retval, blob **b);
 mal_export str BLOBfromidx(str *retval, blob **binp, int *index);
 mal_export str BLOBnitems(int *ret, blob *b);
-mal_export int BLOBget(Heap *h, int *bun, int *l, blob **val);
 mal_export blob * BLOBread(blob *a, stream *s, size_t cnt);
 mal_export gdk_return BLOBwrite(blob *a, stream *s, size_t cnt);
 
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
@@ -12,6 +12,8 @@
 #include "mal_exception.h"
 #include "gdk_bbp.h"
 
+#include "nested_table.h"
+
 // errors
 #if !defined(NDEBUG) /* debug only */
 #define _CHECK_ERRLINE_EXPAND(LINE) #LINE
@@ -27,28 +29,33 @@
 mal_export str NESTEDTABLEnest1_oid(bat*, const bat*, const bat*);
 mal_export str NESTEDTABLEunnest101_oid(bat*, bat*, const bat*);
 mal_export void NESTEDTABLEheap(Heap*, size_t);
+mal_export var_t NESTEDTABLEput(Heap *h, var_t *bun, nested_table *val);
 mal_export str NESTEDTABLEprelude(void*);
 
 // index in the BATatoms table
 int TYPE_nested_table;
 
-// only needed for its side effect: it asks the gdk initialise the vheap 
storage
-void NESTEDTABLEheap(Heap *heap, size_t capacity){
-       (void) capacity;
-       heap->base = heap->base -1; // fool the gdk -> ATOMheap
+void NESTEDTABLEheap(Heap* heap, size_t capacity){
+       (void) capacity; // capacity refers to the #number of elements in the 
non virtual heap
+       HEAP_initialize(heap, 0, 0, sizeof(oid));
 }
 
 // initializer
 str NESTEDTABLEprelude(void* ret) {
-       atomDesc* descriptor = NULL;
-
        (void) ret;
        TYPE_nested_table = ATOMindex("nestedtable");
-       descriptor = BATatoms + TYPE_nested_table;
-       descriptor->linear = FALSE;
+
+       BATatoms[TYPE_nested_table].linear = FALSE;
        return MAL_SUCCEED;
 }
 
+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
+       memcpy(h->base + offset, value, size);
+       return (*bun = offset);
+}
+
 // MAL interface
 mal_export str NESTEDTABLEnest1_oid(bat* id_out, const bat* id_group_mapping, 
const bat* id_histogram) {
        const char* function_name = "nestedtable.nest1";
@@ -58,9 +65,11 @@ mal_export str NESTEDTABLEnest1_oid(bat*
        BAT* histogram = NULL;
        lng* __restrict histogram_values = NULL;
        BAT* output = NULL;
-       var_t* __restrict output_offsets = NULL;
-       oid* __restrict output_content = NULL;
+       var_t heap_alloc_offset = 0;
+       var_t* /*__restrict*/ output_offsets = NULL;
+       char* /*__restrict*/ output_content = NULL;
        size_t output_sz = 0;
+       size_t output_content_sz = 0;
        oid sum = 0;
 
        // input arguments
@@ -76,20 +85,26 @@ mal_export str NESTEDTABLEnest1_oid(bat*
        output = COLnew(group_mapping->hseqbase, TYPE_nested_table, 
BATcount(histogram), TRANSIENT);
        CHECK(output != NULL, MAL_MALLOC_FAIL);
 
+       // allocate the virtual heap
+       output_sz = BATcount(histogram);
+       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));
+
        // edge case, the input is empty
-       output_sz = BATcount(histogram);
        if(output_sz == 0) goto success;
 
        // compute the offsets
        histogram_values = (lng*) histogram->T.heap.base;
        output_offsets = (var_t*) output->T.heap.base;
-       output_offsets[0] = 0;
+       output_offsets[0] = sum = heap_alloc_offset;
        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[output_sz -1] +1;
-       assert(sum == BATcount(histogram) + BATcount(group_mapping) && "#groups 
+ #values != computed sum");
+       assert((sum - heap_alloc_offset) == output_content_sz && "computed sum 
!= #groups + #values");
        output->tvarsized = 1;
        output->tkey = 1;
        output->tdense = output->tnodense = 0;
@@ -98,20 +113,14 @@ mal_export str NESTEDTABLEnest1_oid(bat*
        output->tnonil = 1; output->tnil = 0;
        BATsetcount(output, output_sz);
 
-       // allocate the virtual heap
-       HEAP_initialize(output->tvheap, 0, sum, sizeof(oid));
-       CHECK(output->tvheap != NULL, MAL_MALLOC_FAIL);
-    memset(output->tvheap->base, 0, output->tvheap->size);
-
     // insert the actual values into the vheap
     group_mapping_values = (oid*) group_mapping->theap.base;
-    output_content = (oid*) output->T.vheap->base;
     for(size_t i = 0, sz = BATcount(group_mapping); i < sz; i++){
-       oid count = output_offsets[ group_mapping_values[i] ];
-       oid pos = ++output_content[count];
-       output_content[pos] = 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;
     }
-    output->tvheap->free = sum * sizeof(oid);
 
 success:
        BBPunfix(group_mapping->batCacheid);
@@ -150,19 +159,16 @@ mal_export str NESTEDTABLEunnest101_oid(
        jr = COLnew(nested_attribute->hseqbase, TYPE_oid, 
BATcount(nested_attribute) * 5, TRANSIENT);
        CHECK(jl != NULL && jr != NULL, MAL_MALLOC_FAIL);
 
-       // empty argument?
        na_count = BATcount(nested_attribute);
-       if(na_count == 0) goto success; // skip here as the vheap may not be 
effectively allocated
-
        na_offsets = (var_t*) nested_attribute->T.heap.base;
        assert(nested_attribute->T.vheap != NULL);
        na_values = (oid*) nested_attribute->T.vheap->base;
-       assert(na_values != NULL && ((lng) na_values) != -1);
+       assert(na_values != NULL);
        for(oid i = 0; i < na_count; i++){
                var_t offset = na_offsets[i];
                oid* __restrict base = na_values + offset;
                oid off_count = *(base++);
-               assert(((offset+off_count) * sizeof(oid) <= 
nested_attribute->T.vheap->size) && "Index out of bounds");
+               assert((offset + (off_count * sizeof(oid)) <= 
nested_attribute->T.vheap->size) && "Index out of bounds");
                for(oid j = 0; j < off_count; j++){
                        BUNappend(jl, &i, false);
                }
@@ -172,7 +178,7 @@ mal_export str NESTEDTABLEunnest101_oid(
                }
        }
 
-success:
+//success:
        BBPunfix(nested_attribute->batCacheid);
        *out_jl = jl->batCacheid;
        BBPkeepref(jl->batCacheid);
diff --git a/monetdb5/modules/atoms/nested_table.mal 
b/monetdb5/modules/atoms/nested_table.mal
--- a/monetdb5/modules/atoms/nested_table.mal
+++ b/monetdb5/modules/atoms/nested_table.mal
@@ -6,10 +6,11 @@
 
 module nestedtable;
 
-atom nestedtable : oid;
+atom nestedtable;
 
 command heap()    address NESTEDTABLEheap;
 command prelude() address NESTEDTABLEprelude;
+command put()     address NESTEDTABLEput;
 
 command nest1(group_mapping :bat[:oid], histogram :bat[:lng]) 
:bat[:nestedtable]
 address NESTEDTABLEnest1_oid
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3538,9 +3538,24 @@ list *list_nested_attributes(stmt* st){
                break;
        case st_alias:
                return list_nested_attributes(st->op1);
-       case st_join:
+       case st_append:
+               // assuming both operands have the same attributes in the 
nested table
+               return list_nested_attributes(st->op1);
+       case st_const:
+               // atom => this should be always null
+               return list_nested_attributes(st->op2);
+       case st_convert:
+               return NULL;
+       case st_join: // projection
                return st->op4.lval;
+       case st_temp:
+               return NULL;
+       case st_bat: // implies storage
+       case st_Nop: // to be reviewed
        case st_rs_column:
+       case st_single:
+       case st_tid:
+       case st_var: // implies storage
                return NULL;
        default:
                assert(0 && "Statement type not handled");
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to