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