Changeset: 65f85ac24acd for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=65f85ac24acd Modified Files: MonetDB.spec gdk/gdk_batop.c gdk/gdk_calc.c gdk/gdk_group.c gdk/gdk_join.c gdk/gdk_qsort.c gdk/gdk_select.c gdk/gdk_setop.c gdk/gdk_ssort_impl.h sql/dump-restore.html sql/dump-restore.txt Branch: default Log Message:
Merge with Jan2014 branch. diffs (truncated from 411 to 300 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -609,9 +609,11 @@ systemd-tmpfiles --create %{_sysconfdir} %doc %{_mandir}/man1/monetdb.1.gz %doc %{_mandir}/man1/monetdbd.1.gz %if (0%{?fedora} >= 20) +%dir %{_datadir}/doc/MonetDB-SQL %docdir %{_datadir}/doc/MonetDB-SQL %{_datadir}/doc/MonetDB-SQL/* %else +%dir %{_datadir}/doc/MonetDB-SQL-%{version} %docdir %{_datadir}/doc/MonetDB-SQL-%{version} %{_datadir}/doc/MonetDB-SQL-%{version}/* %endif diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -2226,6 +2226,7 @@ BATcount_no_nil(BAT *b) BUN i, n; const void *p, *nil; const char *base; + int t; int (*cmp)(const void *, const void *); BATcheck(b, "BATcnt"); @@ -2233,7 +2234,12 @@ BATcount_no_nil(BAT *b) if (b->T->nonil) return n; p = Tloc(b, b->U->first); - switch (ATOMstorage(b->ttype)) { + t = b->ttype; + if (t != ATOMstorage(t) && + ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t) && + BATatoms[ATOMstorage(t)].atomCmp == BATatoms[t].atomCmp) + t = ATOMstorage(t); + switch (t) { case TYPE_void: cnt = b->tseqbase == oid_nil ? 0 : n; break; @@ -2285,8 +2291,8 @@ BATcount_no_nil(BAT *b) } break; default: - nil = ATOMnilptr(b->ttype); - cmp = BATatoms[b->ttype].atomCmp; + nil = ATOMnilptr(t); + cmp = BATatoms[t].atomCmp; if (b->tvarsized) { base = b->T->vheap->base; for (i = 0; i < n; i++) diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -8388,6 +8388,11 @@ BATcalcbetween_intern(const void *src, i CANDLOOP(dst, l, bit_nil, 0, start); + if (tp != ATOMstorage(tp) && + ATOMnilptr(ATOMstorage(tp)) == ATOMnilptr(tp) && + BATatoms[ATOMstorage(tp)].atomCmp == BATatoms[tp].atomCmp) + tp = ATOMstorage(tp); + switch (tp) { case TYPE_bte: BETWEEN_LOOP_TYPE(bte); diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c --- a/gdk/gdk_group.c +++ b/gdk/gdk_group.c @@ -362,6 +362,7 @@ BATgroup_internal(BAT **groups, BAT **ex BAT *b, BAT *g, BAT *e, BAT *h, int subsorted) { BAT *gn = NULL, *en = NULL, *hn = NULL; + int t; int (*cmp)(const void *, const void *); const oid *grps = NULL; oid *ngrps, ngrp, prev = 0; @@ -543,6 +544,16 @@ BATgroup_internal(BAT **groups, BAT **ex BATseqbase(gn, b->hseqbase); if (g) grps = (const oid *) Tloc(g, BUNfirst(g)); + + /* figure out if we can use the storage type also for + * comparing values */ + t = b->ttype; + if (t != ATOMstorage(t) && + ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t) && + BATatoms[ATOMstorage(t)].atomCmp == cmp && + BATatoms[ATOMstorage(t)].atomHash == BATatoms[t].atomHash) + t = ATOMstorage(t); + if (((b->tsorted || b->trevsorted) && (g == NULL || g->tsorted || g->trevsorted)) || subsorted) { @@ -566,7 +577,7 @@ BATgroup_internal(BAT **groups, BAT **ex if (histo) cnts[0] = 1; - switch (ATOMstorage(b->ttype)) { + switch (t) { case TYPE_bte: GRP_compare_consecutive_values_tpe(bte); break; @@ -639,7 +650,7 @@ BATgroup_internal(BAT **groups, BAT **ex ngrp++; /* the next group to be assigned */ gn->tsorted = 1; /* be optimistic */ - switch (ATOMstorage(b->ttype)) { + switch (t) { case TYPE_bte: GRP_subscan_old_groups_tpe(bte); break; @@ -678,7 +689,7 @@ BATgroup_internal(BAT **groups, BAT **ex hs = b->T->hash; gn->tsorted = 1; /* be optimistic */ - switch (ATOMstorage(b->ttype)) { + switch (t) { case TYPE_bte: GRP_use_existing_hash_table_tpe(bte); break; @@ -755,7 +766,7 @@ BATgroup_internal(BAT **groups, BAT **ex } gn->tsorted = 1; /* be optimistic */ - switch (ATOMstorage(b->ttype)) { + switch (t) { case TYPE_bte: GRP_create_partial_hash_table_tpe(bte); break; diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c --- a/gdk/gdk_join.c +++ b/gdk/gdk_join.c @@ -1450,7 +1450,14 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT * break; } } else { - switch (r->htype) { + int t = r->htype; + if (t != ATOMstorage(t) && + ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t) && + BATatoms[ATOMstorage(t)].atomCmp == BATatoms[t].atomCmp && + BATatoms[ATOMstorage(t)].atomHash == BATatoms[t].atomHash) + t = ATOMstorage(t); + + switch (t) { case TYPE_int: #if SIZEOF_OID == SIZEOF_INT case TYPE_oid: @@ -1832,6 +1839,7 @@ bandjoin(BAT *r1, BAT *r2, BAT *l, BAT * const oid *rcand = NULL, *rcandend = NULL; const char *lvals, *rvals; int lwidth, rwidth; + int t; const void *nil = ATOMnilptr(l->ttype); int (*cmp)(const void *, const void *) = BATatoms[l->ttype].atomCmp; const char *vl, *vr; @@ -1865,7 +1873,13 @@ bandjoin(BAT *r1, BAT *r2, BAT *l, BAT * assert(sl == NULL || sl->tsorted); assert(sr == NULL || sr->tsorted); - switch (ATOMtype(l->ttype)) { + t = ATOMtype(l->ttype); + if (t != ATOMstorage(t) && + ATOMnilptr(ATOMstorage(t)) == nil && + BATatoms[ATOMstorage(t)].atomCmp == cmp) + t = ATOMstorage(t); + + switch (t) { case TYPE_bte: if (*(const bte *)c1 == bte_nil || *(const bte *)c2 == bte_nil || @@ -2178,6 +2192,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT int lwidth, rlwidth, rhwidth; const void *nil = ATOMnilptr(l->ttype); int (*cmp)(const void *, const void *) = BATatoms[l->ttype].atomCmp; + int t; const char *vl, *vrl, *vrh; const oid *p; oid lastr = 0; @@ -2251,6 +2266,12 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT loff = (wrd) l->tseqbase - (wrd) l->hseqbase; } + t = ATOMtype(l->ttype); + if (t != ATOMstorage(t) && + ATOMnilptr(ATOMstorage(t)) == nil && + BATatoms[ATOMstorage(t)].atomCmp == cmp) + t = ATOMstorage(t); + /* nested loop implementation for range join */ for (;;) { if (lcand) { @@ -2316,7 +2337,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT } ro = n++ + rl->hseqbase; } - switch (ATOMtype(l->ttype)) { + switch (t) { case TYPE_bte: if (*(const bte*)vrl == bte_nil || *(const bte*)vrh == bte_nil || diff --git a/gdk/gdk_qsort.c b/gdk/gdk_qsort.c --- a/gdk/gdk_qsort.c +++ b/gdk/gdk_qsort.c @@ -314,7 +314,12 @@ GDKqsort(void *h, void *t, const void *b if (base) tpe = TYPE_str; /* we need the default case */ - switch (ATOMstorage(tpe)) { + if (tpe != ATOMstorage(tpe) && + ATOMnilptr(ATOMstorage(tpe)) == ATOMnilptr(tpe) && + BATatoms[ATOMstorage(tpe)].atomCmp == BATatoms[tpe].atomCmp) + tpe = ATOMstorage(tpe); + + switch (tpe) { case TYPE_bte: GDKqsort_impl_bte(&buf, h, t, n); break; @@ -361,7 +366,12 @@ GDKqsort_rev(void *h, void *t, const voi if (base) tpe = TYPE_str; /* we need the default case */ - switch (ATOMstorage(tpe)) { + if (tpe != ATOMstorage(tpe) && + ATOMnilptr(ATOMstorage(tpe)) == ATOMnilptr(tpe) && + BATatoms[ATOMstorage(tpe)].atomCmp == BATatoms[tpe].atomCmp) + tpe = ATOMstorage(tpe); + + switch (tpe) { case TYPE_bte: GDKqsort_impl_bte_rev(&buf, h, t, n); break; diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -610,6 +610,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, #ifndef NDEBUG int (*cmp)(const void *, const void *); #endif + int t; BUN p, q, cnt; oid o, *dst; /* off must be signed as it can be negative, @@ -646,6 +647,12 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, dst = (oid *) Tloc(bn, BUNfirst(bn)); cnt = 0; + t = b->ttype; + if (t != ATOMstorage(t) && + ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t) && + BATatoms[ATOMstorage(t)].atomCmp == BATatoms[t].atomCmp) + t = ATOMstorage(t); + if (s && !BATtdense(s)) { assert(s->tsorted); @@ -661,7 +668,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, /* call type-specific core scan select function */ assert(b->batCapacity >= BATcount(b)); assert(s->batCapacity >= BATcount(s)); - switch (ATOMstorage(b->ttype)) { + switch (t) { case TYPE_bte: cnt = candscan_bte(scanargs); break; @@ -703,7 +710,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, } candlist = NULL; /* call type-specific core scan select function */ - switch (ATOMstorage(b->ttype)) { + switch (t) { case TYPE_bte: cnt = fullscan_bte(scanargs); break; diff --git a/gdk/gdk_setop.c b/gdk/gdk_setop.c --- a/gdk/gdk_setop.c +++ b/gdk/gdk_setop.c @@ -172,42 +172,49 @@ (void) cmp; \ } #define elim_doubles(a1) \ - switch (ATOMstorage(b->htype)) { \ - case TYPE_bte: \ - elim(a1,loc,_bte,simple_CMP(h,BUNhloc(bi,r),bte)); \ - break; \ - case TYPE_sht: \ - elim(a1,loc,_sht,simple_CMP(h,BUNhloc(bi,r),sht)); \ - break; \ - case TYPE_int: \ - elim(a1,loc,_int,simple_CMP(h,BUNhloc(bi,r),int)); \ - break; \ - case TYPE_flt: \ - elim(a1,loc,_flt,simple_CMP(h,BUNhloc(bi,r),flt)); \ - break; \ - case TYPE_dbl: \ - elim(a1,loc,_dbl,simple_CMP(h,BUNhloc(bi,r),dbl)); \ - break; \ - case TYPE_lng: \ - elim(a1,loc,_lng,simple_CMP(h,BUNhloc(bi,r),lng)); \ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list