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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list