Changeset: f77be188a4c3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f77be188a4c3
Added Files:
sql/test/BugTracker-2017/Tests/python_loader_clobbers_default_with_null.Bug-6464.sql
sql/test/BugTracker-2017/Tests/python_loader_clobbers_default_with_null.Bug-6464.stable.err
sql/test/BugTracker-2017/Tests/python_loader_clobbers_default_with_null.Bug-6464.stable.out
sql/test/BugTracker-2017/Tests/skip_problem_best_effort.Bug-6442.sql
sql/test/BugTracker-2017/Tests/skip_problem_best_effort.Bug-6442.stable.err
sql/test/BugTracker-2017/Tests/skip_problem_best_effort.Bug-6442.stable.out
sql/test/mergetables/Tests/sqlsmith-exist-lateral.sql
sql/test/mergetables/Tests/sqlsmith-exist-lateral.stable.err
sql/test/mergetables/Tests/sqlsmith-exist-lateral.stable.out
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
clients/mapiclient/dump.c
gdk/gdk_heap.c
gdk/gdk_private.h
gdk/gdk_storage.c
monetdb5/modules/mal/tablet.c
sql/backends/monet5/Tests/pyloader01.sql
sql/backends/monet5/Tests/pyloader01.stable.out
sql/backends/monet5/UDF/pyapi/emit.c
sql/backends/monet5/UDF/pyapi/pyloader.c
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_scenario.h
sql/common/sql_types.c
sql/include/sql_catalog.h
sql/scripts/99_system.sql
sql/server/rel_select.c
sql/server/rel_updates.c
sql/storage/sql_storage.h
sql/storage/store.c
sql/test/BugTracker-2017/Tests/All
sql/test/Dependencies/Tests/Dependencies.stable.out
sql/test/Dependencies/Tests/Dependencies.stable.out.int128
sql/test/leaks/Tests/check1.stable.out
sql/test/leaks/Tests/check1.stable.out.int128
sql/test/mergetables/Tests/All
Branch: default
Log Message:
Merge with Jul2017 branch.
diffs (truncated from 1739 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -8447,6 +8447,8 @@ Ready.
[ "sql", "transaction_release", "pattern
sql.transaction_release(chain:int, name:str):void ",
"SQLtransaction_release;", "A transaction statement (type can be
commit,release,rollback or start)" ]
[ "sql", "transaction_rollback", "pattern
sql.transaction_rollback(chain:int, name:str):void ",
"SQLtransaction_rollback;", "A transaction statement (type can be
commit,release,rollback or start)" ]
[ "sql", "update", "pattern sql.update(mvc:int, sname:str,
tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update
the values of the column tname.cname. Returns sequence number for order
dependence)" ]
+[ "sql", "update_schemas", "pattern sql.update_schemas():void ",
"SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas
table" ]
+[ "sql", "update_tables", "pattern sql.update_tables():void ",
"SYSupdate_tables;", "Procedure triggered on update of the sys._tables
table" ]
[ "sql", "vacuum", "pattern sql.vacuum(sch:str, tbl:str):void ",
"SQLvacuum;", "Choose an approach to consolidate the deletions" ]
[ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1]):any_1
", "zero_or_one;", "if col contains exactly one value return this. Incase
of more raise an exception else return nil" ]
[ "sqlblob", "#fromstr", "command sqlblob.#fromstr():void ",
"SQLBLOBfromstr;", "" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -10811,6 +10811,8 @@ Ready.
[ "sql", "transaction_release", "pattern
sql.transaction_release(chain:int, name:str):void ",
"SQLtransaction_release;", "A transaction statement (type can be
commit,release,rollback or start)" ]
[ "sql", "transaction_rollback", "pattern
sql.transaction_rollback(chain:int, name:str):void ",
"SQLtransaction_rollback;", "A transaction statement (type can be
commit,release,rollback or start)" ]
[ "sql", "update", "pattern sql.update(mvc:int, sname:str,
tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update
the values of the column tname.cname. Returns sequence number for order
dependence)" ]
+[ "sql", "update_schemas", "pattern sql.update_schemas():void ",
"SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas
table" ]
+[ "sql", "update_tables", "pattern sql.update_tables():void ",
"SYSupdate_tables;", "Procedure triggered on update of the sys._tables
table" ]
[ "sql", "vacuum", "pattern sql.vacuum(sch:str, tbl:str):void ",
"SQLvacuum;", "Choose an approach to consolidate the deletions" ]
[ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1]):any_1
", "zero_or_one;", "if col contains exactly one value return this. Incase
of more raise an exception else return nil" ]
[ "sqlblob", "#fromstr", "command sqlblob.#fromstr():void ",
"SQLBLOBfromstr;", "" ]
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -1238,6 +1238,7 @@ dump_function(Mapi mid, stream *toConsol
/* all information is stored in the func column */
mnstr_printf(toConsole, "%s\n", ffunc);
mapi_close_handle(hdl);
+ free(query);
return 0;
}
mnstr_printf(toConsole, "CREATE ");
@@ -1612,7 +1613,7 @@ dump_database(Mapi mid, stream *toConsol
"sys.schemas s, "
"sys._tables t "
"WHERE s.id = t.schema_id AND "
- "t.id = tr.table_id"
+ "t.id = tr.table_id AND t.system = FALSE"
") "
"SELECT sname, name, query, type FROM vft ORDER BY id";
char *sname = NULL;
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -1003,7 +1003,7 @@ HEAP_malloc(Heap *heap, size_t nbytes)
*/
ttrail = 0;
trail = 0;
- for (block = hheader->head; block != 0; block = HEAP_index(heap, block,
CHUNK)->next) {
+ for (block = hheader->head; block != 0; block = blockp->next) {
blockp = HEAP_index(heap, block, CHUNK);
#ifdef TRACE
@@ -1171,3 +1171,118 @@ HEAP_free(Heap *heap, var_t mem)
hheader->head = block;
}
}
+
+void
+HEAP_recover(Heap *h, const var_t *offsets, BUN noffsets)
+{
+ HEADER *hheader;
+ CHUNK *blockp;
+ size_t dirty = 0;
+ var_t maxoff = 0;
+ BUN i;
+
+ if (!h->cleanhash)
+ return;
+ hheader = HEAP_index(h, 0, HEADER);
+ assert(h->free >= sizeof(HEADER));
+ assert(hheader->version == HEAPVERSION);
+ assert(h->size >= hheader->firstblock);
+ for (i = 0; i < noffsets; i++)
+ if (offsets[i] > maxoff)
+ maxoff = offsets[i];
+ assert(maxoff < h->free);
+ if (maxoff == 0) {
+ if (hheader->head != hheader->firstblock) {
+ hheader->head = hheader->firstblock;
+ dirty = sizeof(HEADER);
+ }
+ blockp = HEAP_index(h, hheader->firstblock, CHUNK);
+ if (blockp->next != 0 ||
+ blockp->size != h->size - hheader->head) {
+ blockp->size = (size_t) (h->size - hheader->head);
+ blockp->next = 0;
+ dirty = hheader->firstblock + sizeof(CHUNK);
+ }
+ } else {
+ size_t block = maxoff - hheader->alignment;
+ size_t end = block + *HEAP_index(h, block, size_t);
+ size_t trail;
+
+ assert(end <= h->free);
+ if (end + sizeof(CHUNK) <= h->free) {
+ blockp = HEAP_index(h, end, CHUNK);
+ if (hheader->head <= end &&
+ blockp->next == 0 &&
+ blockp->size == h->free - end)
+ return;
+ } else if (hheader->head == 0) {
+ /* no free space after last allocated block
+ * and no free list */
+ return;
+ }
+ block = hheader->head;
+ trail = 0;
+ while (block < maxoff && block != 0) {
+ blockp = HEAP_index(h, block, CHUNK);
+ trail = block;
+ block = blockp->next;
+ }
+ if (trail == 0) {
+ /* no free list */
+ if (end + sizeof(CHUNK) > h->free) {
+ /* no free space after last allocated
+ * block */
+ if (hheader->head != 0) {
+ hheader->head = 0;
+ dirty = sizeof(HEADER);
+ }
+ } else {
+ /* there is free space after last
+ * allocated block */
+ if (hheader->head != end) {
+ hheader->head = end;
+ dirty = sizeof(HEADER);
+ }
+ blockp = HEAP_index(h, end, CHUNK);
+ if (blockp->next != 0 ||
+ blockp->size != h->free - end) {
+ blockp->next = 0;
+ blockp->size = h->free - end;
+ dirty = end + sizeof(CHUNK);
+ }
+ }
+ } else {
+ /* there is a free list */
+ blockp = HEAP_index(h, trail, CHUNK);
+ if (end + sizeof(CHUNK) > h->free) {
+ /* no free space after last allocated
+ * block */
+ if (blockp->next != 0) {
+ blockp->next = 0;
+ dirty = trail + sizeof(CHUNK);
+ }
+ } else {
+ /* there is free space after last
+ * allocated block */
+ if (blockp->next != end) {
+ blockp->next = end;
+ dirty = trail + sizeof(CHUNK);
+ }
+ blockp = HEAP_index(h, end, CHUNK);
+ if (blockp->next != 0 ||
+ blockp->size != h->free - end) {
+ blockp->next = 0;
+ blockp->size = h->free - end;
+ dirty = end + sizeof(CHUNK);
+ }
+ }
+ }
+ }
+ h->cleanhash = 0;
+ if (dirty) {
+ if (h->storage == STORE_MMAP)
+ (void) MT_msync(h->base, dirty);
+ else
+ h->dirty = 1;
+ }
+}
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -172,6 +172,8 @@ void BBPdump(void); /* never called: fo
__hidden gdk_return HEAPload(Heap *h, const char *nme, const char *ext, int
trunc)
__attribute__((__warn_unused_result__))
__attribute__((__visibility__("hidden")));
+__hidden void HEAP_recover(Heap *, const var_t *, BUN)
+ __attribute__((__visibility__("hidden")));
__hidden gdk_return HEAPsave(Heap *h, const char *nme, const char *ext)
__attribute__((__warn_unused_result__))
__attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -824,6 +824,9 @@ BATload_intern(bat bid, int lock)
}
if (ATOMstorage(b->ttype) == TYPE_str) {
strCleanHash(b->tvheap, FALSE); /* ensure consistency */
+ } else {
+ HEAP_recover(b->tvheap, (const var_t *) Tloc(b, 0),
+ BATcount(b));
}
}
diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c
--- a/monetdb5/modules/mal/tablet.c
+++ b/monetdb5/modules/mal/tablet.c
@@ -1834,6 +1834,8 @@ SQLload_file(Client cntxt, Tablet *as, b
int width;
for (attr = 0; attr < as->nr_attrs; attr++) {
+ if (as->format[attr].skip)
+ continue;
width = as->format[attr].c->twidth;
switch (width){
case 1:
diff --git a/sql/backends/monet5/Tests/pyloader01.sql
b/sql/backends/monet5/Tests/pyloader01.sql
--- a/sql/backends/monet5/Tests/pyloader01.sql
+++ b/sql/backends/monet5/Tests/pyloader01.sql
@@ -1,7 +1,7 @@
START TRANSACTION;
-CREATE TABLE mytable(a DOUBLE, d int, s STRING);
+CREATE TABLE mytable(a DOUBLE, d int, s STRING DEFAULT 'hello');
CREATE LOADER myfunc() LANGUAGE PYTHON {
_emit.emit({'a':42,'d':1})
@@ -23,10 +23,10 @@ SELECT name,func,mod,language,type,side_
-- there is a reason for this, functions with 0, 1, 2 and 3+ arguments are
handled differently.
+COPY LOADER INTO mytable FROM myfunc();
COPY LOADER INTO mytable FROM myfunc3(46, 'asdf', 3.2);
COPY LOADER INTO mytable FROM myfunc2(45, 'asdf');
COPY LOADER INTO mytable FROM myfunc1(44);
-COPY LOADER INTO mytable FROM myfunc();
SELECT * FROM mytable;
diff --git a/sql/backends/monet5/Tests/pyloader01.stable.out
b/sql/backends/monet5/Tests/pyloader01.stable.out
--- a/sql/backends/monet5/Tests/pyloader01.stable.out
+++ b/sql/backends/monet5/Tests/pyloader01.stable.out
@@ -52,11 +52,11 @@ Ready.
% sys.mytable, sys.mytable, sys.mytable # table_name
% a, d, s # name
% double, int, clob # type
-% 24, 1, 5 # length
+% 24, 1, 7 # length
+[ 42, 1, "'hello'" ]
[ 46, 4, "hello" ]
-[ 45, 3, NULL ]
-[ 44, 2, NULL ]
-[ 42, 1, NULL ]
+[ 45, 3, "'hello'" ]
+[ 44, 2, "'hello'" ]
#DROP TABLE mytable;
#DROP ALL LOADER myfunc;
#CREATE LOADER myfunc() LANGUAGE PYTHON {
diff --git a/sql/backends/monet5/UDF/pyapi/emit.c
b/sql/backends/monet5/UDF/pyapi/emit.c
--- a/sql/backends/monet5/UDF/pyapi/emit.c
+++ b/sql/backends/monet5/UDF/pyapi/emit.c
@@ -199,6 +199,7 @@ PyObject *PyEmit_Emit(PyEmitObject *self
self->cols[self->ncols].b = COLnew(0, bat_type,
0, TRANSIENT);
self->cols[self->ncols].name = GDKstrdup(val);
+ self->cols[self->ncols].def = NULL;
if (self->nvals > 0) {
// insert NULL values up until the
current entry
for (ai = 0; ai < self->nvals; ai++) {
@@ -209,9 +210,9 @@ PyObject *PyEmit_Emit(PyEmitObject *self
goto wrapup;
}
}
- self->cols[i].b->tnil = 1;
- self->cols[i].b->tnonil = 0;
- BATsetcount(self->cols[i].b,
self->nvals);
+ self->cols[self->ncols].b->tnil = 1;
+ self->cols[self->ncols].b->tnonil = 0;
+ BATsetcount(self->cols[self->ncols].b,
self->nvals);
}
self->ncols++;
}
@@ -351,14 +352,21 @@ PyObject *PyEmit_Emit(PyEmitObject *self
self->cols[i].b->tnonil = 1 -
self->cols[i].b->tnil;
}
} else {
+ void* nill_value = ATOMnil(self->cols[i].b->ttype);
+ void* default_value = self->cols[i].def ?
+
self->cols[i].def :
+ nill_value;
for (ai = 0; ai < (size_t)el_count; ai++) {
- if (BUNappend(self->cols[i].b,
ATOMnil(self->cols[i].b->ttype),
+ if (BUNappend(self->cols[i].b,
+ default_value,
0) != GDK_SUCCEED) {
goto wrapup;
}
}
- self->cols[i].b->tnil = 1;
- self->cols[i].b->tnonil = 0;
+ if
(BATatoms[self->cols[i].b->ttype].atomCmp(default_value, nill_value) == 0) {
+ self->cols[i].b->tnil = 1;
+ self->cols[i].b->tnonil = 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list