Changeset: db9678cc8b05 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=db9678cc8b05 Added Files: monetdb5/mal/Tests/tst880.mal sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.sql sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.stable.err sql/test/BugTracker-2013/Tests/bogus_aggregation_casts.Bug-3342.stable.out sql/test/BugTracker-2013/Tests/nestedcalls.sql sql/test/BugTracker-2013/Tests/recursion.sql sql/test/BugTracker-2013/Tests/sort_void_crash.Bug-3341.sql sql/test/BugTracker-2013/Tests/sort_void_crash.Bug-3341.stable.err sql/test/BugTracker-2013/Tests/sort_void_crash.Bug-3341.stable.out sql/test/LSST/Tests/cleanup.reqtests sql/test/LSST/Tests/dbQuery000.reqtests sql/test/LSST/Tests/dbQuery001.reqtests sql/test/LSST/Tests/dbQuery002.reqtests sql/test/LSST/Tests/dbQuery003.reqtests sql/test/LSST/Tests/dbQuery004.reqtests sql/test/LSST/Tests/dbQuery005.reqtests sql/test/LSST/Tests/dbQuery007.reqtests sql/test/LSST/Tests/dbQuery008.reqtests sql/test/LSST/Tests/dbQuery009.reqtests sql/test/LSST/Tests/dbQuery010.reqtests sql/test/LSST/Tests/dbQuery011.reqtests sql/test/LSST/Tests/dbQuery012.reqtests sql/test/LSST/Tests/dbQuery013.reqtests sql/test/LSST/Tests/dbQuery014.reqtests sql/test/LSST/Tests/dbQuery015.reqtests sql/test/LSST/Tests/dbQuery016.reqtests sql/test/LSST/Tests/dbQuery017.reqtests sql/test/LSST/Tests/dbQuery018.reqtests sql/test/LSST/Tests/dbQuery019.reqtests sql/test/LSST/Tests/dbQuery020.reqtests sql/test/LSST/Tests/dbQuery022.reqtests sql/test/LSST/Tests/dbQuery024.reqtests sql/test/LSST/Tests/dbQuery025.reqtests sql/test/LSST/Tests/dbQuery026.reqtests sql/test/LSST/Tests/dbQuery027.reqtests sql/test/LSST/Tests/dbQuery028.reqtests sql/test/LSST/Tests/dbQuery029.reqtests sql/test/LSST/Tests/dbQuery030.reqtests sql/test/LSST/Tests/dbQuery031.reqtests sql/test/LSST/Tests/dbQuery032.reqtests sql/test/LSST/Tests/dbQuery034.reqtests sql/test/LSST/Tests/dbQuery035.reqtests sql/test/LSST/Tests/dbQuery036.reqtests sql/test/LSST/Tests/dbQuery037.reqtests sql/test/LSST/Tests/dbQuery038.reqtests sql/test/LSST/Tests/dbQuery041.reqtests sql/test/LSST/Tests/dbQuery042.reqtests sql/test/LSST/Tests/dbQuery043.reqtests sql/test/LSST/Tests/dbQuery044.reqtests sql/test/LSST/Tests/dbQuery045.reqtests sql/test/LSST/Tests/dbQuery046.reqtests sql/test/LSST/Tests/dbQuery047.reqtests sql/test/LSST/Tests/dbQuery048.reqtests sql/test/LSST/Tests/dbQuery053.reqtests sql/test/LSST/Tests/dbQuery054.reqtests sql/test/LSST/Tests/dbQuery055.reqtests sql/test/LSST/Tests/dbQuery056.reqtests sql/test/LSST/Tests/dbQuery066.reqtests sql/test/Users/Tests/privs.reqtests sql/test/Users/Tests/privs2.reqtests sql/test/Users/Tests/role1.reqtests sql/test/Users/Tests/role2.reqtests sql/test/Users/Tests/table.reqtests sql/test/Users/Tests/test_privs2_p1.reqtests sql/test/Users/Tests/test_privs2_p2.reqtests sql/test/Users/Tests/test_privs_p1.reqtests sql/test/Users/Tests/test_privs_p2.reqtests sql/test/Users/Tests/unknown_user.reqtests sql/test/broken_delete/Tests/broken_delete_1.reqtests sql/test/broken_delete/Tests/broken_delete_2.reqtests sql/test/broken_delete/Tests/broken_delete_3.reqtests sql/test/broken_delete/Tests/broken_delete_4.reqtests sql/test/broken_delete/Tests/broken_delete_5.reqtests sql/test/rdf/Tests/drop_tables_t.reqtests sql/test/rdf/Tests/drop_tables_v.reqtests sql/test/rdf/Tests/q1_t.reqtests sql/test/rdf/Tests/q1_v.reqtests sql/test/rdf/Tests/q2_28_t.reqtests sql/test/rdf/Tests/q2_28_v.reqtests sql/test/rdf/Tests/q2_t.reqtests sql/test/rdf/Tests/q2_v.reqtests sql/test/rdf/Tests/q3_28_t.reqtests sql/test/rdf/Tests/q3_28_v.reqtests sql/test/rdf/Tests/q3_t.reqtests sql/test/rdf/Tests/q3_v.reqtests sql/test/rdf/Tests/q4_28_t.reqtests sql/test/rdf/Tests/q4_28_v.reqtests sql/test/rdf/Tests/q4_t.reqtests sql/test/rdf/Tests/q4_v.reqtests sql/test/rdf/Tests/q5_t.reqtests sql/test/rdf/Tests/q5_v.reqtests sql/test/rdf/Tests/q6_28_t.reqtests sql/test/rdf/Tests/q6_28_v.reqtests sql/test/rdf/Tests/q6_t.reqtests sql/test/rdf/Tests/q6_v.reqtests sql/test/rdf/Tests/q7_t.reqtests sql/test/rdf/Tests/q7_v.reqtests sql/test/rdf/Tests/q8_t.reqtests sql/test/rdf/Tests/q8_v.reqtests sql/test/sql_xml/Tests/xml.reqtests sql/test/sql_xml/Tests/xml_attribute_parsing.SF-1855673.reqtests sql/test/sql_xml/Tests/xmlelement_segfault.SF-2812767.reqtests sql/test/testdb/Tests/testdb-dump.reqtests Modified Files: gdk/gdk_batop.c gdk/gdk_imprints.c gdk/gdk_select.c monetdb5/mal/Tests/All monetdb5/mal/mal_dataflow.c monetdb5/mal/mal_debugger.c monetdb5/mal/mal_http_daemon.c monetdb5/mal/mal_recycle.c monetdb5/mal/mal_recycle.h monetdb5/modules/atoms/mcurl.c monetdb5/modules/atoms/mcurl.mal monetdb5/optimizer/Tests/cst01.stable.out monetdb5/optimizer/opt_evaluate.c sql/backends/monet5/rel_bin.c sql/backends/monet5/rest/rest_jsonstore.c sql/backends/monet5/rest/rest_jsonstore.h sql/backends/monet5/rest/rest_jsonstore_handle_get.c sql/backends/monet5/rest/rest_jsonstore_handle_get.h sql/backends/monet5/sql_result.c sql/backends/monet5/sql_scenario.c sql/backends/monet5/sql_statistics.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out.32bit sql/test/BugTracker-2011/Tests/copy-into-file-error.Bug-2722.stable.out sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err sql/test/BugTracker-2013/Tests/All sql/test/BugTracker/Tests/cardinality_violation.SF-1240701.stable.err sql/test/BugTracker/Tests/cardinality_violation.SF-1240701.stable.err.Windows sql/test/BugTracker/Tests/set_sql_debug_64__breaking_the_DB.SF-1906287.stable.out sql/test/leaks/Tests/check0.stable.out sql/test/leaks/Tests/check0_nogeom.stable.out sql/test/leaks/Tests/check1.stable.out sql/test/leaks/Tests/check1_nogeom.stable.out sql/test/leaks/Tests/check2.stable.out sql/test/leaks/Tests/check2_nogeom.stable.out sql/test/leaks/Tests/check3.stable.out sql/test/leaks/Tests/check3_nogeom.stable.out sql/test/leaks/Tests/check4.stable.out sql/test/leaks/Tests/check4_nogeom.stable.out sql/test/leaks/Tests/check5.stable.out sql/test/leaks/Tests/check5_nogeom.stable.out sql/test/leaks/Tests/drop3.stable.out sql/test/leaks/Tests/drop3_nogeom.stable.out sql/test/leaks/Tests/select1.stable.out sql/test/leaks/Tests/select1_nogeom.stable.out sql/test/leaks/Tests/select2.stable.out sql/test/leaks/Tests/select2_nogeom.stable.out sql/test/leaks/Tests/temp1.stable.out sql/test/leaks/Tests/temp1_nogeom.stable.out sql/test/leaks/Tests/temp2.stable.out sql/test/leaks/Tests/temp2_nogeom.stable.out sql/test/leaks/Tests/temp3.stable.out sql/test/leaks/Tests/temp3_nogeom.stable.out sql/test/mapi/Tests/php_monetdb.stable.out sql/test/mapi/Tests/php_monetdb_nogeom.stable.out Branch: mutation Log Message:
Merge with default diffs (truncated from 4472 to 300 lines): diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -1176,7 +1176,8 @@ BATorder_internal(BAT *b, int stable, in * column needs to be key) */ return BATrevert(b); } - if (do_sort(Hloc(b, BUNfirst(b)), Tloc(b, BUNfirst(b)), + if ((!(reverse && b->hrevsorted) && !(!reverse && b->hsorted)) && + do_sort(Hloc(b, BUNfirst(b)), Tloc(b, BUNfirst(b)), b->H->vheap ? b->H->vheap->base : NULL, BATcount(b), Hsize(b), Tsize(b), b->htype, reverse, stable) == GDK_FAIL) { @@ -1419,7 +1420,15 @@ BATsubsort(BAT **sorted, BAT **order, BA bn->tsorted = r == 0 && !reverse; bn->trevsorted = r == 0 && reverse; } else { - if (do_sort(Tloc(bn, BUNfirst(bn)), + if (b->ttype == TYPE_void) { + b->tsorted = 1; + b->trevsorted = b->tseqbase == oid_nil || b->U->count <= 1; + b->tkey |= b->tseqbase != oid_nil; + } else if (b->U->count <= 1) { + b->tsorted = b->trevsorted = 1; + } + if ((!(reverse && bn->trevsorted) && !(!reverse && bn->tsorted)) && + do_sort(Tloc(bn, BUNfirst(bn)), on ? Tloc(on, BUNfirst(on)) : NULL, bn->T->vheap ? bn->T->vheap->base : NULL, BATcount(bn), Tsize(bn), on ? Tsize(on) : 0, diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c --- a/gdk/gdk_imprints.c +++ b/gdk/gdk_imprints.c @@ -727,6 +727,7 @@ do { BBPunfix(b->batCacheid); b = o; } + assert(b->batCapacity >= BATcount(b)); return b; }; diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -186,26 +186,26 @@ do { \ e = i+limit-pr_off; \ if (im[icnt] & mask) { \ if ((im[icnt] & ~innermask) == 0) { \ - while (o < e && p <= q) { \ + while (o < e && p < q) { \ v = src[o]; \ ADD; \ cnt++; \ + p++; \ CAND; \ - p++; \ } \ } else { \ - while (o < e && p <= q) { \ + while (o < e && p < q) { \ v = src[o]; \ ADD; \ cnt += (TEST); \ + p++; \ CAND; \ - p++; \ } \ } \ } else { \ while (o < e && p <= q) { \ + p++; \ CAND; \ - p++; \ } \ } \ } while (0) @@ -222,7 +222,6 @@ do { \ cchdc_t *d = (cchdc_t *) imprints->dict->base; \ bte rpp = ATOMelmshift(IMPS_PAGE >> b->T->shift); \ CAND; \ - p++; \ for (i=0, dcnt=0, icnt=0; \ (dcnt < imprints->dictcnt) && (i < w+pr_off); \ dcnt++) { \ @@ -660,6 +659,8 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, * BUNlast(s) (i.e. s not fully used)? */ candlist = (const oid *) Tloc(s, p); /* call type-specific core scan select function */ + assert(b->batCapacity >= BATcount(b)); + assert(s->batCapacity >= BATcount(s)); switch (ATOMstorage(b->ttype)) { case TYPE_bte: cnt = candscan_bte(scanargs); @@ -684,6 +685,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, } if (cnt == BUN_NONE) return NULL; + assert(bn->batCapacity >= cnt); } else { if (s) { assert(BATtdense(s)); @@ -725,6 +727,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, } if (cnt == BUN_NONE) return NULL; + assert(bn->batCapacity >= cnt); } BATsetcount(bn, cnt); bn->tsorted = 1; diff --git a/monetdb5/mal/Tests/All b/monetdb5/mal/Tests/All --- a/monetdb5/mal/Tests/All +++ b/monetdb5/mal/Tests/All @@ -201,6 +201,7 @@ tst850 tst866 tst867 tst870 +#tst880 requested feature tst890 tst900 tst901 diff --git a/monetdb5/mal/Tests/tst880.mal b/monetdb5/mal/Tests/tst880.mal new file mode 100644 --- /dev/null +++ b/monetdb5/mal/Tests/tst880.mal @@ -0,0 +1,25 @@ +#min/max over two BATs + +b:= bat.new(:oid,:int); +bat.append(b,-5); +bat.append(b,0); +bat.append(b,5); +bat.append(b,nil:int); +bat.append(c,nil:int); +bat.append(c,7); +bat.append(c,8); + +c:= bat.new(:oid,:int); +bat.append(c,-5); +bat.append(c,0); +bat.append(c,5); +bat.append(c,nil:int); +bat.append(c,4); +bat.append(c,9); +bat.append(c,nil:int); + + +z:= batcalc.max(b,c); +io.print(b,c,z); +z:= batcalc.min(b,c); +io.print(b,c,z); diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c --- a/monetdb5/mal/mal_dataflow.c +++ b/monetdb5/mal/mal_dataflow.c @@ -37,6 +37,7 @@ */ #include "monetdb_config.h" #include "mal_dataflow.h" +#include "mal_client.h" #define DFLOWpending 0 /* runnable */ #define DFLOWrunning 1 /* currently in progress */ @@ -62,7 +63,7 @@ typedef struct queue { FlowEvent *data; MT_Lock l; /* it's a shared resource, ie we need locks */ MT_Sema s; /* threads wait on empty queues */ -} queue; +} Queue; /* * The dataflow dependency is administered in a graph list structure. @@ -79,12 +80,14 @@ typedef struct DATAFLOW { int *nodes; /* dependency graph nodes */ int *edges; /* dependency graph */ MT_Lock flowlock; /* lock to protect the above */ - queue *done; /* instructions handled */ + Queue *done; /* instructions handled */ } *DataFlow, DataFlowRec; -static MT_Id workers[THREADS]; -static queue *todo = 0; /* pending instructions */ -static int volatile exiting; +#define MAXQ 1024 +static MT_Id workers[THREADS] = {0}; +static int workerqueue[THREADS] = {0}; /* maps workers towards the todo queues */ +static Queue *todo[MAXQ] = {0}; /* pending instructions organized by user MAXTODO > #users */ +static int volatile exiting = 0; /* * Calculate the size of the dataflow dependency graph. @@ -106,12 +109,11 @@ DFLOWgraphSize(MalBlkPtr mb, int start, * can be executed in parallel. */ -static queue* +static Queue* q_create(int sz, const char *name) { - queue *q = (queue*)GDKmalloc(sizeof(queue)); + Queue *q = (Queue*)GDKmalloc(sizeof(Queue)); - (void) name; if (q == NULL) return NULL; q->size = ((sz << 1) >> 1); /* we want a multiple of 2 */ @@ -122,14 +124,16 @@ q_create(int sz, const char *name) return NULL; } + (void) name; /* in case MT_LOCK_TRACE is not enabled in gdk_system.h */ MT_lock_init(&q->l, name); MT_sema_init(&q->s, 0, name); return q; } static void -q_destroy(queue *q) +q_destroy(Queue *q) { + assert(q); MT_lock_destroy(&q->l); MT_sema_destroy(&q->s); GDKfree(q->data); @@ -139,8 +143,10 @@ q_destroy(queue *q) /* keep a simple LIFO queue. It won't be a large one, so shuffles of requeue is possible */ /* we might actually sort it for better scheduling behavior */ static void -q_enqueue_(queue *q, FlowEvent d) +q_enqueue_(Queue *q, FlowEvent d) { + assert(q); + assert(d); if (q->last == q->size) { q->size <<= 1; q->data = (FlowEvent*) GDKrealloc(q->data, sizeof(FlowEvent) * q->size); @@ -149,7 +155,7 @@ q_enqueue_(queue *q, FlowEvent d) q->data[q->last++] = d; } static void -q_enqueue(queue *q, FlowEvent d) +q_enqueue(Queue *q, FlowEvent d) { assert(q); assert(d); @@ -167,10 +173,12 @@ q_enqueue(queue *q, FlowEvent d) #ifdef USE_MAL_ADMISSION static void -q_requeue_(queue *q, FlowEvent d) +q_requeue_(Queue *q, FlowEvent d) { int i; + assert(q); + assert(d); if (q->last == q->size) { /* enlarge buffer */ q->size <<= 1; @@ -183,7 +191,7 @@ q_requeue_(queue *q, FlowEvent d) q->last++; } static void -q_requeue(queue *q, FlowEvent d) +q_requeue(Queue *q, FlowEvent d) { assert(q); assert(d); @@ -195,7 +203,7 @@ q_requeue(queue *q, FlowEvent d) #endif static void * -q_dequeue(queue *q) +q_dequeue(Queue *q) { void *r = NULL; @@ -273,6 +281,7 @@ DFLOWworker(void *t) DataFlow flow; FlowEvent fe = 0, fnxt = 0; int id = (int) ((MT_Id *) t - workers), last = 0; + int wq; Thread thr; str error = 0; @@ -285,8 +294,10 @@ DFLOWworker(void *t) GDKsetbuf(GDKmalloc(GDKMAXERRLEN)); /* where to leave errors */ GDKerrbuf[0] = 0; while (1) { + assert(workerqueue[id] > 0); + wq = workerqueue[id] - 1; if (fnxt == 0) - fe = q_dequeue(todo); + fe = q_dequeue(todo[wq]); else fe = fnxt; if (exiting) { @@ -308,10 +319,10 @@ DFLOWworker(void *t) #ifdef USE_MAL_ADMISSION if (MALadmission(fe->argclaim, fe->hotclaim)) { fe->hotclaim = 0; /* don't assume priority anymore */ - assert(todo); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list