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

Reply via email to