Changeset: 1c6b9e076254 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1c6b9e076254
Modified Files:
gdk/gdk_system.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/common/sql_types.c
sql/server/rel_select.c
sql/server/sql_parser.y
sql/storage/bat/bat_storage.c
Branch: default
Log Message:
handle ALL|SOME|ANY semantics
diffs (truncated from 369 to 300 lines):
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -432,6 +432,7 @@ MT_thread_sigmask(sigset_t * new_mask, s
{
(void) sigdelset(new_mask, SIGQUIT);
(void) sigdelset(new_mask, SIGALRM); /* else sleep doesn't work */
+ (void) sigdelset(new_mask, SIGPROF);
(void) pthread_sigmask(SIG_SETMASK, new_mask, orig_mask);
}
#endif
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -3614,6 +3614,61 @@ zero_or_one(ptr ret, const bat *bid)
}
str
+SQLall(ptr ret, const bat *bid)
+{
+ BAT *b;
+ BUN c, _s;
+ ptr p;
+
+ if ((b = BATdescriptor(*bid)) == NULL) {
+ throw(SQL, "all", "Cannot access descriptor");
+ }
+ c = BATcount(b);
+ if (c == 0) {
+ p = ATOMnilptr(b->ttype);
+ } else {
+ BUN q, r;
+ int (*ocmp) (const void *, const void *);
+ BATiter bi = bat_iterator(b);
+ q = BUNfirst(b);
+ r = BUNlast(b);
+ p = BUNtail(bi, q);
+ ocmp = ATOMcompare(b->ttype);
+ for( ; (q+1) < r; q++) {
+ const void *c = BUNtail(bi, q+1);
+ if (ocmp(p, c) != 0) {
+ p = ATOMnilptr(b->ttype);
+ break;
+ }
+ }
+ }
+ _s = ATOMsize(ATOMtype(b->ttype));
+ if (ATOMextern(b->ttype)) {
+ _s = ATOMlen(ATOMtype(b->ttype), p);
+ memcpy(*(ptr *) ret = GDKmalloc(_s), p, _s);
+ } else if (b->ttype == TYPE_bat) {
+ bat bid = *(bat *) p;
+ *(BAT **) ret = BATdescriptor(bid);
+ } else if (_s == 4) {
+ *(int *) ret = *(int *) p;
+ } else if (_s == 1) {
+ *(bte *) ret = *(bte *) p;
+ } else if (_s == 2) {
+ *(sht *) ret = *(sht *) p;
+ } else if (_s == 8) {
+ *(lng *) ret = *(lng *) p;
+#ifdef HAVE_HGE
+ } else if (_s == 16) {
+ *(hge *) ret = *(hge *) p;
+#endif
+ } else {
+ memcpy(ret, p, _s);
+ }
+ BBPunfix(b->batCacheid);
+ return MAL_SUCCEED;
+}
+
+str
not_unique(bit *ret, const bat *bid)
{
BAT *b;
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -124,6 +124,7 @@ sql5_export str mvc_get_value(Client cnt
sql5_export str mvc_getVersion(lng *r, const int *clientid);
sql5_export str mvc_restart_seq(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str zero_or_one(ptr ret, const bat *bid);
+sql5_export str SQLall(ptr ret, const bat *bid);
sql5_export str not_unique(bit *ret, const bat *bid);
sql5_export str SQLshrink(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
sql5_export str SQLreuse(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal
--- a/sql/backends/monet5/sql.mal
+++ b/sql/backends/monet5/sql.mal
@@ -396,6 +396,25 @@ inline function sql.subzero_or_one( b:ba
return zero_or_one := b;
end sql.subzero_or_one;
+command all( col:bat[:any_1]) :any_1
+address SQLall
+comment "if col contains exactly one value return this. Incase of more raise
an exception else return nil";
+
+# todo implement = all aggregator (ie keep last value and compare status)
+inline function sql.all( b:bat[:any_1], gp:bat[:oid], gpe:bat[:oid],
no_nil:bit) :bat[:any_1];
+ (g,e,h) := group.subgroup(gp);
+ m := aggr.max(h);
+ c0 := calc.isnil(m);
+ c01 := calc.not(c0);
+ c1 := calc.>(m,1:wrd);
+ c11 := calc.and(c01,c1);
+ ms := calc.str(m);
+ msg := str.+("21000!zero_or_one: cardinality violation (", ms);
+ msg1 := str.+(msg, ">1)");
+ sql.assert(c11, msg1);
+ return all := b;
+end sql.all;
+
command not_unique( b:bat[:oid]) :bit
address not_unique
comment "check if the tail sorted bat b doesn't have unique tail values" ;
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1381,6 +1381,7 @@ sqltypeinit( sql_allocator *sa)
sql_create_func(sa, "<", "calc", "<", ANY, ANY, BIT, SCALE_FIX);
sql_create_func(sa, "<=", "calc", "<=", ANY, ANY, BIT, SCALE_FIX);
sql_create_aggr(sa, "zero_or_one", "sql", "zero_or_one", ANY, ANY);
+ sql_create_aggr(sa, "all", "sql", "all", ANY, ANY);
sql_create_aggr(sa, "exist", "aggr", "exist", ANY, BIT);
sql_create_aggr(sa, "not_exist", "aggr", "not_exist", ANY, BIT);
/* needed for relational version */
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1566,9 +1566,26 @@ rel_compare_exp(mvc *sql, sql_rel *rel,
return rel_compare_exp_(sql, rel, ls, rs, esc, type, 0);
}
+static const char *
+compare_aggr_op( char *compare, int quantifier)
+{
+ if (quantifier == 0)
+ return "zero_or_one";
+ switch(compare[0]) {
+ case '<':
+ if (compare[1] == '>')
+ return "all";
+ return "min";
+ case '>':
+ return "max";
+ default:
+ return "all";
+ }
+}
+
static sql_rel *
rel_compare(mvc *sql, sql_rel *rel, symbol *lo, symbol *ro, symbol *ro2,
- char *compare_op, int f, exp_kind k)
+ char *compare_op, int f, exp_kind k, int quantifier)
{
sql_exp *rs = NULL, *rs2 = NULL, *ls;
exp_kind ek = {type_value, card_column, FALSE};
@@ -1614,8 +1631,8 @@ rel_compare(mvc *sql, sql_rel *rel, symb
if (r) {
rs = rel_lastexp(sql, r);
- if (f == sql_sel && r->card > CARD_ATOM) {
- sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(rs));
+ if (f == sql_sel && r->card > CARD_ATOM &&
quantifier != 1) {
+ sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, compare_aggr_op(compare_op,
quantifier), exp_subtype(rs));
rs = exp_aggr1(sql->sa, rs,
zero_or_one, 0, 0, CARD_ATOM, 0);
/* group by the right of the apply */
@@ -1632,8 +1649,8 @@ rel_compare(mvc *sql, sql_rel *rel, symb
/* if single value (independed of relations),
rewrite */
if (is_project(r->op) && !r->l && r->exps &&
list_length(r->exps) == 1) {
return rel_compare_exp(sql, rel, ls,
r->exps->h->data, compare_op, NULL, k.reduce);
- } else {
- sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(rs));
+ } else if (quantifier != 1) {
+ sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, compare_aggr_op(compare_op,
quantifier), exp_subtype(rs));
rs = exp_aggr1(sql->sa, rs,
zero_or_one, 0, 0, CARD_ATOM, 0);
}
@@ -2112,12 +2129,17 @@ rel_logical_exp(mvc *sql, sql_rel *rel,
}
case SQL_COMPARE:
{
- symbol *lo = sc->data.lval->h->data.sym;
- symbol *ro = sc->data.lval->h->next->next->data.sym;
- char *compare_op = sc->data.lval->h->next->data.sval;
+ dnode *n = sc->data.lval->h;
+ symbol *lo = n->data.sym;
+ symbol *ro = n->next->next->data.sym;
+ char *compare_op = n->next->data.sval;
+ int quantifier = 0;
/* currently we don't handle the (universal and existential)
quantifiers (all and any/some) */
- return rel_compare(sql, rel, lo, ro, NULL, compare_op, f, ek);
+ if (n->next->next->next)
+ quantifier = n->next->next->next->data.i_val + 1;
+ assert(quantifier == 0 || quantifier == 1 || quantifier == 2);
+ return rel_compare(sql, rel, lo, ro, NULL, compare_op, f, ek,
quantifier);
}
/* Set Member ship */
case SQL_IN:
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -3391,6 +3391,13 @@ all_or_any_predicate:
append_symbol(l, $4);
append_int(l, $3);
$$ = _symbol_create_list(SQL_COMPARE, l ); }
+ | pred_exp '=' any_all_some pred_exp
+ { dlist *l = L();
+ append_symbol(l, $1);
+ append_string(l, sa_strdup(SA, "="));
+ append_symbol(l, $4);
+ append_int(l, $3);
+ $$ = _symbol_create_list(SQL_COMPARE, l ); }
;
any_all_some:
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1660,7 +1660,7 @@ BATcleanProps( BAT *b )
}
static int
-gtr_update_delta( sql_trans *tr, sql_delta *cbat, int *changes)
+gtr_update_delta( sql_trans *tr, sql_delta *cbat)
{
int ok = LOG_OK;
BAT *ins, *cur;
@@ -1672,7 +1672,6 @@ gtr_update_delta( sql_trans *tr, sql_del
ins = temp_descriptor(cbat->ibid);
/* any inserts */
if (BUNlast(ins) > BUNfirst(ins)) {
- (*changes)++;
assert(cur->T->heap.storage != STORE_PRIV);
BATappend(cur,ins,TRUE);
cbat->cnt = cbat->ibase = BATcount(cur);
@@ -1687,7 +1686,6 @@ gtr_update_delta( sql_trans *tr, sql_del
BAT *uv = temp_descriptor(cbat->uvbid);
/* any updates */
if (BUNlast(ui) > BUNfirst(ui)) {
- (*changes)++;
void_replace_bat(cur, ui, uv, TRUE);
temp_destroy(cbat->uibid);
temp_destroy(cbat->uvbid);
@@ -1707,7 +1705,7 @@ gtr_update_delta( sql_trans *tr, sql_del
}
static int
-gtr_update_dbat(sql_dbat *d, int *changes)
+gtr_update_dbat(sql_dbat *d)
{
int ok = LOG_OK;
BAT *idb;
@@ -1720,7 +1718,6 @@ gtr_update_dbat(sql_dbat *d, int *change
if (BUNlast(idb) > idb->batInserted) {
BAT *cdb = temp_descriptor(dbid);
- (*changes)++;
append_inserted(cdb, idb);
bat_destroy(cdb);
}
@@ -1730,73 +1727,63 @@ gtr_update_dbat(sql_dbat *d, int *change
static int
-gtr_update_table(sql_trans *tr, sql_table *t, int *tchanges)
+gtr_update_table(sql_trans *tr, sql_table *t)
{
int ok = LOG_OK;
node *n;
- gtr_update_dbat(t->data, tchanges);
+ if (!t->base.wtime)
+ return ok;
+ gtr_update_dbat(t->data);
for (n = t->columns.set->h; ok == LOG_OK && n; n = n->next) {
- int changes = 0;
sql_column *c = n->data;
if (!c->base.wtime)
continue;
- ok = gtr_update_delta(tr, c->data, &changes);
- if (changes)
- c->base.wtime = tr->wstime;
- (*tchanges) |= changes;
+ ok = gtr_update_delta(tr, c->data);
+ c->base.wtime = 0;
}
if (ok == LOG_OK && t->idxs.set) {
for (n = t->idxs.set->h; ok == LOG_OK && n; n = n->next) {
- int changes = 0;
sql_idx *ci = n->data;
/* some indices have no bats */
if (!ci->base.wtime)
continue;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list