Changeset: dc4007b3b2e3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dc4007b3b2e3
Modified Files:
monetdb5/modules/mal/pp_hash.c
monetdb5/modules/mal/pp_hash.h
sql/backends/monet5/rel_pphash.c
sql/backends/monet5/sql_pp_statement.c
Branch: manti
Log Message:
WiP: MAL code generation for marked-anti-join and implementation of a new MAL
function oahash.expand() that expands (prb_oid, hsh_gid, mrk) while matching
NULL to all values in the hash-table
more debugging needed
diffs (truncated from 567 to 300 lines):
diff --git a/monetdb5/modules/mal/pp_hash.c b/monetdb5/modules/mal/pp_hash.c
--- a/monetdb5/modules/mal/pp_hash.c
+++ b/monetdb5/modules/mal/pp_hash.c
@@ -110,6 +110,7 @@ _ht_create( int type, size_t size, hash_
h->empty = true;
h->has_nil = 0;
h->gid_NULL = oid_nil;
+ h->max_gid = 0;
h->p = p;
h->pinned = NULL;
h->pinned_nr = 0; /* no more than 1024 */
@@ -742,12 +743,16 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = is_##Type##_nil(bp[i]); \
- if (need_has_nil && !h->has_nil && is_nil) {\
- bit old_has_nil = (bit) ATOMIC_OR(&h->has_nil,
is_nil); \
- if (old_has_nil != (bit) h->has_nil) {\
- assert(!old_has_nil && h->has_nil &&
is_oid_nil(h->gid_NULL)); \
- ATOMIC_SET(&h->gid_NULL, gp[i]); \
+ if (need_has_nil) { \
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = is_##Type##_nil(bp[i]); \
+ if (!h->has_nil && is_nil) {\
+ bit old_has_nil = (bit)
ATOMIC_OR(&h->has_nil, is_nil); \
+ if (old_has_nil != (bit) h->has_nil) {\
+ assert(!old_has_nil &&
h->has_nil && is_oid_nil(h->gid_NULL)); \
+ ATOMIC_SET(&h->gid_NULL,
gp[i]); \
+ } \
} \
} \
} \
@@ -837,12 +842,16 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = is_##Type##_nil(bp[i]); \
- if (need_has_nil && !h->has_nil && is_nil) {\
- bit old_has_nil = (bit) ATOMIC_OR(&h->has_nil,
is_nil); \
- if (old_has_nil != (bit) h->has_nil) {\
- assert(!old_has_nil && h->has_nil &&
is_oid_nil(h->gid_NULL)); \
- ATOMIC_SET(&h->gid_NULL, gp[i]); \
+ if (need_has_nil) {\
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = is_##Type##_nil(bp[i]); \
+ if (!h->has_nil && is_nil) {\
+ bit old_has_nil = (bit)
ATOMIC_OR(&h->has_nil, is_nil); \
+ if (old_has_nil != (bit) h->has_nil) {\
+ assert(!old_has_nil &&
h->has_nil && is_oid_nil(h->gid_NULL)); \
+ ATOMIC_SET(&h->gid_NULL,
gp[i]); \
+ } \
} \
} \
} \
@@ -888,12 +897,16 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = (voff == 0); \
- if (need_has_nil && !h->has_nil && is_nil) {\
- bit old_has_nil = (bit) ATOMIC_OR(&h->has_nil,
is_nil); \
- if (old_has_nil != (bit) h->has_nil) {\
- assert(!old_has_nil && h->has_nil &&
is_oid_nil(h->gid_NULL)); \
- ATOMIC_SET(&h->gid_NULL, gp[i]); \
+ if (need_has_nil) { \
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = (voff == 0); \
+ if (!h->has_nil && is_nil) {\
+ bit old_has_nil = (bit)
ATOMIC_OR(&h->has_nil, is_nil); \
+ if (old_has_nil != (bit) h->has_nil) {\
+ assert(!old_has_nil &&
h->has_nil && is_oid_nil(h->gid_NULL)); \
+ ATOMIC_SET(&h->gid_NULL,
gp[i]); \
+ } \
} \
} \
} \
@@ -942,12 +955,16 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = (voff == 0); \
- if (need_has_nil && !h->has_nil && is_nil) {\
- bit old_has_nil = (bit)
ATOMIC_OR(&h->has_nil, is_nil); \
- if (old_has_nil != (bit) h->has_nil) {\
- assert(!old_has_nil &&
h->has_nil && is_oid_nil(h->gid_NULL)); \
- ATOMIC_SET(&h->gid_NULL,
gp[i]); \
+ if (need_has_nil) {\
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = (voff == 0); \
+ if (!h->has_nil && is_nil) {\
+ bit old_has_nil = (bit)
ATOMIC_OR(&h->has_nil, is_nil); \
+ if (old_has_nil != (bit)
h->has_nil) {\
+ assert(!old_has_nil &&
h->has_nil && is_oid_nil(h->gid_NULL)); \
+
ATOMIC_SET(&h->gid_NULL, gp[i]); \
+ } \
} \
} \
} \
@@ -988,12 +1005,16 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = (voff == 0); \
- if (need_has_nil && !h->has_nil && is_nil) {\
- bit old_has_nil = (bit)
ATOMIC_OR(&h->has_nil, is_nil); \
- if (old_has_nil != (bit) h->has_nil) {\
- assert(!old_has_nil &&
h->has_nil && is_oid_nil(h->gid_NULL)); \
- ATOMIC_SET(&h->gid_NULL,
gp[i]); \
+ if (need_has_nil) { \
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = (voff == 0); \
+ if (!h->has_nil && is_nil) {\
+ bit old_has_nil = (bit)
ATOMIC_OR(&h->has_nil, is_nil); \
+ if (old_has_nil != (bit)
h->has_nil) {\
+ assert(!old_has_nil &&
h->has_nil && is_oid_nil(h->gid_NULL)); \
+
ATOMIC_SET(&h->gid_NULL, gp[i]); \
+ } \
} \
} \
} \
@@ -1042,9 +1063,13 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = is_##Type##_nil(bp[i]); \
- if (need_has_nil && !h->has_nil && is_nil) \
- (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ if (need_has_nil) {\
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = is_##Type##_nil(bp[i]); \
+ if (!h->has_nil && is_nil) \
+ (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ } \
} \
} while (0)
@@ -1137,9 +1162,13 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = is_##Type##_nil(bp[i]); \
- if (need_has_nil && !h->has_nil && is_nil) \
- (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ if (need_has_nil) { \
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = is_##Type##_nil(bp[i]); \
+ if (!h->has_nil && is_nil) \
+ (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ } \
} \
} while (0)
@@ -1186,9 +1215,13 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = (voff == 0); \
- if (need_has_nil && !h->has_nil && is_nil) \
- (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ if (need_has_nil) { \
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = (voff == 0); \
+ if (!h->has_nil && is_nil) \
+ (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ } \
} \
bat_iterator_end(&bi); \
} while (0)
@@ -1238,9 +1271,13 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = (voff == 0); \
- if (need_has_nil && !h->has_nil && is_nil) \
- (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ if (need_has_nil) { \
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = (voff == 0); \
+ if (!h->has_nil && is_nil) \
+ (void)ATOMIC_OR(&h->has_nil,
is_nil); \
+ } \
} \
bat_iterator_end(&bi); \
} else { /* other ATOMvarsized, e.g. BLOB */ \
@@ -1282,9 +1319,13 @@ UHASHext(Client cntxt, MalBlkPtr m, MalS
fnd = 1; \
} \
gp[i] = g-1; \
- bit is_nil = (voff == 0); \
- if (need_has_nil && !h->has_nil && is_nil) \
- (void)ATOMIC_OR(&h->has_nil, is_nil); \
+ if (need_has_nil) { \
+ if (g > h->max_gid) \
+ ATOMIC_SET(&h->max_gid, g); \
+ bit is_nil = (voff == 0); \
+ if (!h->has_nil && is_nil) \
+ (void)ATOMIC_OR(&h->has_nil,
is_nil); \
+ } \
} \
bat_iterator_end(&bi); \
} \
@@ -3050,6 +3091,137 @@ error:
}
static str
+OAHASHexpand3(Client ctx, MalBlkPtr mbp, MalStkPtr s, InstrPtr p)
+{
+ (void)ctx;
+ (void)mbp;
+
+ bat *expdprb = getArgReference_bat(s, p, 0);
+ bat *expdhsh = getArgReference_bat(s, p, 1);
+ bat *expdmrk = getArgReference_bat(s, p, 2);
+ bat *prb_oid = getArgReference_bat(s, p, 3);
+ bat *hsh_gid = getArgReference_bat(s, p, 4);
+ bat *mrk = getArgReference_bat(s, p, 5);
+ bat *frequency = getArgReference_bat(s, p, 6);
+ bat *hp_pos = getArgReference_bat(s, p, 7);
+
+ BAT *ep = NULL, *eh = NULL, *em = NULL;
+ BAT *o = NULL, *g = NULL, *m = NULL, *f = NULL, *h = NULL;
+ str err = NULL;
+
+ o = BATdescriptor(*prb_oid);
+ g = BATdescriptor(*hsh_gid);
+ m = BATdescriptor(*mrk);
+ f = BATdescriptor(*frequency);
+ h = BATdescriptor(*hp_pos);
+ if (!o || !g || !m || !f || !h) {
+ err = createException(SQL, "oahash.expand", SQLSTATE(HY002)
RUNTIME_OBJECT_MISSING);
+ goto error;
+ }
+ hash_table *ht = (hash_table*)h->pl_io;
+
+ oid *oids = Tloc(o, 0);
+ gid *gids = Tloc(g, 0);
+ bit *mrks = Tloc(m, 0);
+ lng *freq = Tloc(f, 0);
+ BUN selcnt = BATcount(o), hpcnt = (BUN)ht->max_gid, xpdcnt = 0;
+ assert(BATcount(o) == BATcount(g));
+
+ QryCtx *qry_ctx = MT_thread_get_qry_ctx();
+ qry_ctx = qry_ctx ? qry_ctx : &(QryCtx) {.endtime = 0};
+ if (selcnt) {
+ TIMEOUT_LOOP_IDX_DECL(i, selcnt, qry_ctx) {
+ if (is_oid_nil(gids[i]))
+ xpdcnt += hpcnt;
+ else
+ xpdcnt += (oid)freq[gids[i]];
+ }
+ TIMEOUT_CHECK(qry_ctx, err = createException(SQL,
"oahash.expand", RUNTIME_QRY_TIMEOUT));
+ if (err)
+ goto error;
+ }
+
+ ep = COLnew(0, TYPE_oid, xpdcnt, TRANSIENT);
+ eh = COLnew(0, TYPE_oid, xpdcnt, TRANSIENT);
+ em = COLnew(0, TYPE_bit, xpdcnt, TRANSIENT);
+ if (!ep || !eh || !em) {
+ err = createException(SQL, "oahash.expand", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto error;
+ }
+ oid *resp = Tloc(ep, 0);
+ oid *resh = Tloc(eh, 0);
+ bit *resm = Tloc(em, 0);
+
+ BUN idx = 0;
+ TIMEOUT_LOOP_IDX_DECL(i, selcnt, qry_ctx) {
+ if (is_oid_nil(gids[i])) {
+ /* expand a NULL to all of ht->gids */
+ TIMEOUT_LOOP_IDX_DECL(j, hpcnt, qry_ctx) {
+ resp[idx] = oids[i];
+ resh[idx] = j;
+ resm[idx] = mrks[i];
+ idx++;
+ }
+ } else {
+ gid frq = (gid)freq[gids[i]];
+ assert(frq);
+ int prime = hash_prime_nr[ht->bits-5];
+ TIMEOUT_LOOP_IDX_DECL(j, frq, qry_ctx) {
+ oid k = (gid)combine(gids[i], oidHash(&j),
prime) & ht->mask;
+ hash_key_t hk = ht->gids[k];
+ while (hk && (ht->pgids[hk] != gids[i] ||
((oid*)ht->vals)[hk] != j)) {
+ k++;
+ k &= ht->mask;
+ hk = ht->gids[k];
+ }
+ assert(hk > 0);
+
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]