Changeset: 1819101644c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1819101644c1
Modified Files:
        gdk/gdk_aggr.c
        gdk/gdk_calc.h
        monetdb5/modules/kernel/algebra.c
        monetdb5/modules/kernel/algebra.h
        monetdb5/modules/kernel/algebra.mal
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql.mal
        sql/server/rel_select.c
        sql/storage/bat/bat_storage.c
Branch: subquery
Log Message:

subquery


diffs (truncated from 493 to 300 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -2547,10 +2547,16 @@ BATgroupmin(BAT *b, BAT *g, BAT *e, BAT 
                              do_groupmin, "BATgroupmin");
 }
 
+void *
+BATmin(BAT *b, void *aggr)
+{
+       return BATmin_skipnil(b, aggr, 1);
+}
+
 /* return pointer to smallest non-nil value in b, or pointer to nil if
  * there is no such value (no values at all, or only nil) */
 void *
-BATmin(BAT *b, void *aggr)
+BATmin_skipnil(BAT *b, void *aggr, bit skipnil)
 {
        PROPrec *prop;
        const void *res;
@@ -2615,7 +2621,7 @@ BATmin(BAT *b, void *aggr)
                } else {
                        (void) do_groupmin(&pos, b, NULL, 1, 0, 0, 0,
                                           BATcount(b), NULL, NULL, BATcount(b),
-                                          true, false);
+                                          skipnil, false);
                }
                if (is_oid_nil(pos)) {
                        res = ATOMnilptr(b->ttype);
@@ -2647,6 +2653,12 @@ BATgroupmax(BAT *b, BAT *g, BAT *e, BAT 
 void *
 BATmax(BAT *b, void *aggr)
 {
+       return BATmax_skipnil(b, aggr, 1);
+}
+
+void *
+BATmax_skipnil(BAT *b, void *aggr, bit skipnil)
+{
        PROPrec *prop;
        const void *res;
        size_t s;
@@ -2674,6 +2686,16 @@ BATmax(BAT *b, void *aggr)
                        const oid *ords = (const oid *) (pb ? 
pb->torderidx->base : b->torderidx->base) + ORDERIDXOFF;
 
                        pos = ords[BATcount(b) - 1];
+                       /* nils are first, ie !skipnil, check for nils */
+                       if (!skipnil) {
+                               BUN z = ords[0];
+
+                               bi = bat_iterator(b);
+                               res = BUNtail(bi, z - b->hseqbase);
+
+                               if (ATOMcmp(b->ttype, res, 
ATOMnilptr(b->ttype)) == 0)
+                                       pos = z;
+                       }
                } else if ((VIEWtparent(b) == 0 ||
                            BATcount(b) == 
BATcount(BBPdescriptor(VIEWtparent(b)))) &&
                           BATcheckimprints(b)) {
@@ -2691,7 +2713,7 @@ BATmax(BAT *b, void *aggr)
                } else {
                        (void) do_groupmax(&pos, b, NULL, 1, 0, 0, 0,
                                           BATcount(b), NULL, NULL, BATcount(b),
-                                          true, false);
+                                          skipnil, false);
                }
                if (is_oid_nil(pos)) {
                        res = ATOMnilptr(b->ttype);
diff --git a/gdk/gdk_calc.h b/gdk/gdk_calc.h
--- a/gdk/gdk_calc.h
+++ b/gdk/gdk_calc.h
@@ -141,6 +141,8 @@ gdk_export gdk_return BATsum(void *res, 
 gdk_export gdk_return BATprod(void *res, int tp, BAT *b, BAT *s, bool 
skip_nils, bool abort_on_error, bool nil_if_empty);
 gdk_export void *BATmax(BAT *b, void *aggr);
 gdk_export void *BATmin(BAT *b, void *aggr);
+gdk_export void *BATmax_skipnil(BAT *b, void *aggr, bit skipnil);
+gdk_export void *BATmin_skipnil(BAT *b, void *aggr, bit skipnil);
 
 gdk_export dbl BATcalcstdev_population(dbl *avgp, BAT *b);
 gdk_export dbl BATcalcstdev_sample(dbl *avgp, BAT *b);
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -127,7 +127,7 @@ slice(BAT **retval, BAT *b, lng start, l
  */
 
 str
-ALGminany(ptr result, const bat *bid)
+ALGminany_skipnil(ptr result, const bat *bid, const bit *skipnil)
 {
        BAT *b;
        ptr p;
@@ -142,9 +142,9 @@ ALGminany(ptr result, const bat *bid)
                                                          ATOMname(b->ttype));
        } else {
                if (ATOMextern(b->ttype)) {
-                       * (ptr *) result = p = BATmin(b, NULL);
+                       * (ptr *) result = p = BATmin_skipnil(b, NULL, 
*skipnil);
                } else {
-                       p = BATmin(b, result);
+                       p = BATmin_skipnil(b, result, *skipnil);
                        assert(p == result);
                }
                if (p == NULL)
@@ -155,7 +155,14 @@ ALGminany(ptr result, const bat *bid)
 }
 
 str
-ALGmaxany(ptr result, const bat *bid)
+ALGminany(ptr result, const bat *bid)
+{
+       bit skipnil = TRUE;
+       return ALGminany_skipnil(result, bid, &skipnil);
+}
+
+str
+ALGmaxany_skipnil(ptr result, const bat *bid, const bit *skipnil)
 {
        BAT *b;
        ptr p;
@@ -170,9 +177,9 @@ ALGmaxany(ptr result, const bat *bid)
                                                          ATOMname(b->ttype));
        } else {
                if (ATOMextern(b->ttype)) {
-                       * (ptr *) result = p = BATmax(b, NULL);
+                       * (ptr *) result = p = BATmax_skipnil(b, NULL, 
*skipnil);
                } else {
-                       p = BATmax(b, result);
+                       p = BATmax_skipnil(b, result, *skipnil);
                        assert(p == result);
                }
                if (p == NULL)
@@ -183,6 +190,13 @@ ALGmaxany(ptr result, const bat *bid)
 }
 
 str
+ALGmaxany(ptr result, const bat *bid)
+{
+       bit skipnil = TRUE;
+       return ALGmaxany_skipnil(result, bid, &skipnil);
+}
+
+str
 ALGgroupby(bat *res, const bat *gids, const bat *cnts)
 {
        BAT *bn, *g, *c;
diff --git a/monetdb5/modules/kernel/algebra.h 
b/monetdb5/modules/kernel/algebra.h
--- a/monetdb5/modules/kernel/algebra.h
+++ b/monetdb5/modules/kernel/algebra.h
@@ -20,6 +20,8 @@ mal_export str ALGvariancep(dbl *res, co
 
 mal_export str ALGminany(ptr result, const bat *bid);
 mal_export str ALGmaxany(ptr result, const bat *bid);
+mal_export str ALGminany_skipnil(ptr result, const bat *bid, const bit 
*skipnil);
+mal_export str ALGmaxany_skipnil(ptr result, const bat *bid, const bit 
*skipnil);
 mal_export str ALGgroupby(bat *res, const bat *gids, const bat *cnts);
 mal_export str ALGcard(lng *result, const bat *bid);
 mal_export str ALGselect1(bat *result, const bat *bid, const void *low, const 
void *high, const bit *li, const bit *hi, const bit *anti);
diff --git a/monetdb5/modules/kernel/algebra.mal 
b/monetdb5/modules/kernel/algebra.mal
--- a/monetdb5/modules/kernel/algebra.mal
+++ b/monetdb5/modules/kernel/algebra.mal
@@ -317,10 +317,18 @@ command min(b:bat[:any_2]):any_2
 address ALGminany
 comment "Return the lowest tail value or nil.";
 
+command min(b:bat[:any_2], skipnil:bit):any_2
+address ALGminany_skipnil
+comment "Return the lowest tail value or nil.";
+
 command max(b:bat[:any_2]):any_2
 address ALGmaxany
 comment "Return the highest tail value or nil.";
 
+command max(b:bat[:any_2], skipnil:bit):any_2
+address ALGmaxany_skipnil
+comment "Return the highest tail value or nil.";
+
 pattern avg(b:bat[:any_2]) :dbl
 address CMDcalcavg
 comment "Gives the avg of all tail values";
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -657,14 +657,14 @@ exp_bin(backend *be, sql_exp *e, stmt *l
 
                                as = exp_bin(be, at, left, right, NULL, NULL, 
NULL, sel);
 
-                               if (as && as->nrcols <= 0 && left) 
+                               if (as && as->nrcols <= 0 && left && 
(a->aggr->base.name[0] != 'm' || en->next || en == attr->h)) 
                                        as = stmt_const(be, 
bin_first_column(be, left), as);
                                /* insert single value into a column */
-                               if (as && as->nrcols <= 0 && !left)
+                               if (as && as->nrcols <= 0 && !left && 
(a->aggr->base.name[0] != 'm' || en->next || en == attr->h))
                                        as = const_column(be, as);
 
-                               if (!as) 
-                                       return NULL;    
+                               if (!as)
+                                       return NULL;
                                if (need_distinct(e)){ 
                                        stmt *g = stmt_group(be, as, grp, ext, 
cnt, 1);
                                        stmt *next = stmt_result(be, g, 1); 
@@ -889,10 +889,14 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        return NULL;
                }
 
+               /*
                if (left && right && !is_select &&
                   ((l->nrcols && (r->nrcols || (r2 && r2->nrcols))) || 
                     re->card > CARD_ATOM || 
                    (re2 && re2->card > CARD_ATOM))) {
+                   */
+               (void)is_select;
+               if (left && right) {
                        if (l->nrcols == 0)
                                l = stmt_const(be, bin_first_column(be, 
swapped?right:left), l); 
                        if (r->nrcols == 0)
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
@@ -3023,7 +3023,7 @@ mvc_bin_import_table_wrap(Client cntxt, 
 }
 
 str
-zero_or_one(ptr ret, const bat *bid)
+zero_or_one_error(ptr ret, const bat *bid, const bit *err)
 {
        BAT *b;
        BUN c;
@@ -3036,7 +3036,7 @@ zero_or_one(ptr ret, const bat *bid)
        c = BATcount(b);
        if (c == 0) {
                p = ATOMnilptr(b->ttype);
-       } else if (c == 1) {
+       } else if (c == 1 || (c > 1 && *err == false)) {
                BATiter bi = bat_iterator(b);
                p = BUNtail(bi, 0);
        } else {
@@ -3079,6 +3079,21 @@ zero_or_one(ptr ret, const bat *bid)
 }
 
 str
+zero_or_one_error_bat(ptr ret, const bat *bid, const bat *err)
+{
+       bit t = FALSE;
+       (void)err;
+       return zero_or_one_error(ret, bid, &t);
+}
+
+str
+zero_or_one(ptr ret, const bat *bid)
+{
+       bit t = TRUE;
+       return zero_or_one_error(ret, bid, &t);
+}
+
+str
 SQLall(ptr 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
@@ -114,6 +114,8 @@ sql5_export str mvc_bat_next_value(Clien
 sql5_export str mvc_get_value(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 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_error(ptr ret, const bat *bid, const bit *err );
+sql5_export str zero_or_one_error_bat(ptr ret, const bat *bid, const bat *err 
);
 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);
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
@@ -308,6 +308,12 @@ comment "Import a table from the files (
 command zero_or_one( col:bat[:any_1]) :any_1
 address zero_or_one
 comment "if col contains exactly one value return this. Incase of more raise 
an exception else return nil";
+command zero_or_one( col:bat[:any_1], err:bit) :any_1
+address zero_or_one_error
+comment "if col contains exactly one value return this. Incase of more raise 
an exception if err is true else return nil";
+command zero_or_one( col:bat[:any_1], err:bat[:bit]) :any_1
+address zero_or_one_error_bat
+comment "if col contains exactly one value return this. Incase of more raise 
an exception if err is true else return nil";
 
 inline function sql.subzero_or_one( b:bat[:any_1], gp:bat[:oid], 
gpe:bat[:oid], no_nil:bit) :bat[:any_1];
        (g,e,h) := group.group(gp);
@@ -322,7 +328,7 @@ 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";
+comment "if all values in col are equal return this, else 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];
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to