Changeset: 271a1d899d42 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/271a1d899d42
Modified Files:
monetdb5/modules/mal/mkey.c
monetdb5/optimizer/opt_prelude.c
monetdb5/optimizer/opt_prelude.h
sql/backends/monet5/sql_statement.c
sql/common/sql_types.c
Branch: pushcands
Log Message:
mkey module cleanup. Added candidate list support and updated its ancient
interface
diffs (truncated from 1036 to 300 lines):
diff --git a/monetdb5/modules/mal/mkey.c b/monetdb5/modules/mal/mkey.c
--- a/monetdb5/modules/mal/mkey.c
+++ b/monetdb5/modules/mal/mkey.c
@@ -113,35 +113,26 @@
#include "mal_interpreter.h"
#include "mal_exception.h"
-#define MKEYHASH_bte(valp) ((ulng) (lng) *(const bte*)(valp))
-#define MKEYHASH_sht(valp) ((ulng) (lng) *(const sht*)(valp))
-#define MKEYHASH_int(valp) ((ulng) (lng) *(const int*)(valp))
-#define MKEYHASH_lng(valp) ((ulng) (lng) *(const lng*)(valp))
+#define MKEYHASH_bte(valp) ((lng) valp)
+#define MKEYHASH_sht(valp) ((lng) valp)
+#define MKEYHASH_int(valp) ((lng) valp)
+#define MKEYHASH_lng(valp) (valp)
#ifdef HAVE_HGE
-#define MKEYHASH_hge(valp) ((ulng) (*(const uhge *)(valp) >> 64) ^ \
- (ulng) *(const uhge
*)(valp))
+#define MKEYHASH_hge(valp) ((lng) (valp >> 64) ^ (lng) (valp))
#endif
-static inline ulng
-GDK_ROTATE(ulng x, int y, int z)
+static inline lng
+GDK_ROTATE(lng x, int y, int z)
{
return (x << y) | (x >> z);
}
-/* TODO: nil handling. however; we do not want to lose time in
bulk_rotate_xor_hash with that */
static str
-MKEYrotate(lng *res, const lng *val, const int *n)
+MKEYhash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- *res = (lng) GDK_ROTATE((ulng) *val, *n, (sizeof(lng)*8) - *n);
- return MAL_SUCCEED;
-}
-
-static str
-MKEYhash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
-{
- lng *res = getArgReference_lng(stk,p,0);
- ptr val = getArgReference(stk,p,1);
- int tpe = getArgType(mb,p,1);
+ lng *res = getArgReference_lng(stk,pci,0);
+ ptr val = getArgReference(stk,pci,1);
+ int tpe = getArgType(mb,pci,1);
(void) cntxt;
switch (ATOMstorage(tpe)) {
@@ -153,22 +144,22 @@ MKEYhash(Client cntxt, MalBlkPtr mb, Mal
// illegal types, avoid falling into the default case.
assert(0);
case TYPE_bte:
- *res = (lng) MKEYHASH_bte(val);
+ *res = MKEYHASH_bte((*(bte*)val));
break;
case TYPE_sht:
- *res = (lng) MKEYHASH_sht(val);
+ *res = MKEYHASH_sht((*(sht*)val));
break;
case TYPE_int:
case TYPE_flt:
- *res = (lng) MKEYHASH_int(val);
+ *res = MKEYHASH_int((*(int*)val));
break;
case TYPE_lng:
case TYPE_dbl:
- *res = (lng) MKEYHASH_lng(val);
+ *res = MKEYHASH_lng((*(lng*)val));
break;
#ifdef HAVE_HGE
case TYPE_hge:
- *res = (lng) MKEYHASH_hge(val);
+ *res = MKEYHASH_hge((*(hge*)val));
break;
#endif
default:
@@ -181,230 +172,259 @@ MKEYhash(Client cntxt, MalBlkPtr mb, Mal
return MAL_SUCCEED;
}
-static str
-MKEYbathash(bat *res, const bat *bid)
-{
- BAT *b, *dst;
- ulng *restrict r;
- BUN n;
-
- if ((b = BATdescriptor(*bid)) == NULL)
- throw(SQL, "mkey.bathash", SQLSTATE(HY002)
RUNTIME_OBJECT_MISSING);
+#define MKEYbathashloop(TPE) \
+ do { \
+ const TPE *restrict v = (const TPE *) Tloc(b, 0); \
+ if (ci.tpe == cand_dense) { \
+ for (BUN i = 0; i < n; i++) { \
+ oid p = (canditer_next_dense(&ci) - off); \
+ r[i] = (lng) MKEYHASH_##TPE(v[p]); \
+ } \
+ } else { \
+ for (BUN i = 0; i < n; i++) { \
+ oid p = (canditer_next(&ci) - off); \
+ r[i] = (lng) MKEYHASH_##TPE(v[p]); \
+ } \
+ } \
+ } while (0)
- n = BATcount(b);
- dst = COLnew(b->hseqbase, TYPE_lng, n, TRANSIENT);
- if (dst == NULL) {
- BBPunfix(b->batCacheid);
- throw(SQL, "mkey.bathash", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+static str
+MKEYbathash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ bat *res = getArgReference_bat(stk, pci, 0), *bid =
getArgReference_bat(stk, pci, 1),
+ *sid1 = pci->argc == 3 ? getArgReference_bat(stk, pci, 2) :
NULL;
+ BAT *bn = NULL, *b = NULL, *bs = NULL;
+ str msg = MAL_SUCCEED;
+ struct canditer ci = {0};
+ oid off;
+ BUN n = 0;
+ lng *restrict r;
+
+ (void) cntxt;
+ (void) mb;
+ if (!(b = BATdescriptor(*bid))) {
+ msg = createException(MAL, "mkey.bathash", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
}
- BATsetcount(dst, n);
-
- r = (ulng *) Tloc(dst, 0);
+ if (sid1 && !is_bat_nil(*sid1) && !(bs = BATdescriptor(*sid1))) {
+ msg = createException(MAL, "mkey.bathash", SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ n = canditer_init(&ci, b, bs);
+ if (!(bn = COLnew(ci.hseq, TYPE_lng, n, TRANSIENT))) {
+ msg = createException(MAL, "mkey.bathash", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ off = b->hseqbase;
+ r = (lng *) Tloc(bn, 0);
switch (ATOMstorage(b->ttype)) {
case TYPE_void: {
oid o = b->tseqbase;
- if (is_oid_nil(o))
- for (BUN i = 0; i < n; i++)
- r[i] = (ulng) lng_nil;
- else
- for (BUN i = 0; i < n; i++)
- r[i] = o + i;
+ if (is_oid_nil(o)) {
+ for (BUN i = 0; i < n; i++) {
+ r[i] = lng_nil;
+ }
+ } else {
+ for (BUN i = 0; i < n; i++) {
+ oid p = (canditer_next(&ci) - off);
+ r[i] = (lng) (o + p);
+ }
+ }
+ } break;
+ case TYPE_bte:
+ MKEYbathashloop(bte);
break;
- }
- case TYPE_bte: {
- const bte *restrict v = (const bte *) Tloc(b, 0);
- for (BUN i = 0; i < n; i++)
- r[i] = MKEYHASH_bte(v + i);
+ case TYPE_sht:
+ MKEYbathashloop(sht);
break;
- }
- case TYPE_sht: {
- const sht *restrict v = (const sht *) Tloc(b, 0);
- for (BUN i = 0; i < n; i++)
- r[i] = MKEYHASH_sht(v + i);
- break;
- }
case TYPE_int:
- case TYPE_flt: {
- const int *restrict v = (const int *) Tloc(b, 0);
- for (BUN i = 0; i < n; i++)
- r[i] = MKEYHASH_int(v + i);
+ case TYPE_flt:
+ MKEYbathashloop(int);
break;
- }
case TYPE_lng:
- case TYPE_dbl: {
- const lng *restrict v = (const lng *) Tloc(b, 0);
- for (BUN i = 0; i < n; i++)
- r[i] = MKEYHASH_lng(v + i);
+ case TYPE_dbl:
+ MKEYbathashloop(lng);
break;
- }
#ifdef HAVE_HGE
- case TYPE_hge: {
- const hge *restrict v = (const hge *) Tloc(b, 0);
- for (BUN i = 0; i < n; i++)
- r[i] = MKEYHASH_hge(v + i);
+ case TYPE_hge:
+ MKEYbathashloop(hge);
break;
- }
#endif
default: {
BATiter bi = bat_iterator(b);
BUN (*hash)(const void *) = BATatoms[b->ttype].atomHash;
- int (*cmp)(const void *, const void *) = ATOMcompare(b->ttype);
- const void *nil = ATOMnilptr(b->ttype);
- for (BUN i = 0; i < n; i++) {
- const void *restrict v = BUNtail(bi, i);
- if ((*cmp)(v, nil) == 0)
- r[i] = (ulng) lng_nil;
- else
- r[i] = (ulng) (*hash)(v);
+ if (ci.tpe == cand_dense) {
+ for (BUN i = 0; i < n; i++) {
+ oid p = (canditer_next_dense(&ci) - off);
+ r[i] = (lng) hash(BUNtail(bi, p));
+ }
+ } else {
+ for (BUN i = 0; i < n; i++) {
+ oid p = (canditer_next(&ci) - off);
+ r[i] = (lng) hash(BUNtail(bi, p));
+ }
}
- break;
}
}
- if (dst->batCount <= 1) {
- BATkey(dst, true);
- dst->tsorted = dst->trevsorted = true;
- } else {
- BATkey(dst, false);
- dst->tsorted = dst->trevsorted = false;
+bailout:
+ if (bn && !msg) {
+ BATsetcount(bn, n);
+ bn->tnonil = false;
+ bn->tnil = false;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = BATcount(bn) <= 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn) {
+ BBPreclaim(bn);
}
- dst->tnonil = false;
- dst->tnil = false;
-
- BBPkeepref(*res = dst->batCacheid);
- BBPunfix(b->batCacheid);
- return MAL_SUCCEED;
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (bs)
+ BBPunfix(bs->batCacheid);
+ return msg;
}
static str
-MKEYrotate_xor_hash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
+MKEYrotate_xor_hash(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- lng *dst = getArgReference_lng(stk, p, 0);
- ulng h = (ulng) *getArgReference_lng(stk, p, 1);
- int lbit = *getArgReference_int(stk, p, 2);
- int rbit = (int) sizeof(lng) * 8 - lbit;
- int tpe = getArgType(mb, p, 3);
- ptr pval = getArgReference(stk, p, 3);
- ulng val;
+ lng *res = getArgReference_lng(stk, pci, 0), h =
*getArgReference_lng(stk, pci, 1), val;
+ int lbit = *getArgReference_int(stk, pci, 2), rbit = (int) sizeof(lng)
* 8 - lbit, tpe = getArgType(mb, pci, 3);
+ ptr pval = getArgReference(stk, pci, 3);
(void) cntxt;
switch (ATOMstorage(tpe)) {
case TYPE_bte:
- val = MKEYHASH_bte(pval);
+ val = MKEYHASH_bte((*(bte*)pval));
break;
case TYPE_sht:
- val = MKEYHASH_sht(pval);
+ val = MKEYHASH_sht((*(sht*)pval));
break;
case TYPE_int:
case TYPE_flt:
- val = MKEYHASH_int(pval);
+ val = MKEYHASH_int((*(int*)pval));
break;
case TYPE_lng:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list