Changeset: 3218f3a5aa4a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3218f3a5aa4a
Modified Files:
sql/backends/monet5/sql_statement.c
Branch: pushcands
Log Message:
Merged with default
diffs (truncated from 1255 to 300 lines):
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -173,7 +173,7 @@ project_oid(BAT *restrict bn, BAT *restr
const oid *restrict r2t = NULL;
struct canditer r1ci = {0}, r2ci = {0};
- if ((!lci || lci->tpe == cand_dense) && !BATtdense(r1) && !r2) {
+ if ((!lci || lci->tpe == cand_dense) && r1->ttype && !BATtdense(r1) &&
!r2) {
if (sizeof(oid) == sizeof(lng))
return project1_lng(bn, l, r1);
else
@@ -808,7 +808,7 @@ BATprojectchain(BAT **bats)
} *ba;
BAT **tobedeleted = NULL;
int ndelete = 0;
- int n;
+ int n, i;
BAT *b = NULL, *bn = NULL;
bool allnil = false;
bool issorted = true;
@@ -849,7 +849,7 @@ BATprojectchain(BAT **bats)
}
ndelete = 0;
- for (n = 0; bats[n]; n++) {
+ for (n = 0, i = 0; bats[n]; n++) {
b = bats[n];
if (b->ttype == TYPE_msk || mask_cand(b)) {
if ((b = BATunmask(b)) == NULL) {
@@ -857,7 +857,9 @@ BATprojectchain(BAT **bats)
}
tobedeleted[ndelete++] = b;
}
- ba[n] = (struct ba) {
+ if (bats[n+1] && BATtdense(b) && b->hseqbase == b->tseqbase &&
b->tseqbase == bats[n+1]->hseqbase && BATcount(b) == BATcount(bats[n+1]))
+ continue; /* skip dense bat */
+ ba[i] = (struct ba) {
.b = b,
.hlo = b->hseqbase,
.hhi = b->hseqbase + b->batCount,
@@ -870,8 +872,23 @@ BATprojectchain(BAT **bats)
nonil &= b->tnonil;
if (b->tnonil && b->tkey && b->tsorted &&
ATOMtype(b->ttype) == TYPE_oid) {
- canditer_init(&ba[n].ci, NULL, b);
+ canditer_init(&ba[i].ci, NULL, b);
}
+ i++;
+ }
+ n = i;
+ if (i<=2) {
+ if (i == 1) {
+ bn = ba[0].b;
+ BBPfix(bn->batCacheid);
+ } else {
+ bn = BATproject(ba[0].b, ba[1].b);
+ }
+ while (ndelete-- > 0)
+ BBPunfix(tobedeleted[ndelete]->batCacheid);
+ GDKfree(tobedeleted);
+ GDKfree(ba);
+ return bn;
}
/* b is last BAT in bats array */
tpe = ATOMtype(b->ttype);
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
@@ -284,7 +284,6 @@ static str
ALGselect2nil(bat *result, const bat *bid, const bat *sid, const void *low,
const void *high, const bit *li, const bit *hi, const bit *anti, const bit
*unknown)
{
BAT *b, *s = NULL, *bn;
- const void *nilptr;
bit nanti = *anti, nli = *li, nhi = *hi;
if (!*unknown)
@@ -305,17 +304,20 @@ ALGselect2nil(bat *result, const bat *bi
derefStr(b, low);
derefStr(b, high);
/* here we don't need open ended parts with nil */
- nilptr = ATOMnilptr(b->ttype);
- if (nli == 1 && ATOMcmp(b->ttype, low, nilptr) == 0) {
- low = high;
- nli = 0;
+ if (!nanti) {
+ const void *nilptr = ATOMnilptr(b->ttype);
+ if (nli == 1 && ATOMcmp(b->ttype, low, nilptr) == 0) {
+ low = high;
+ nli = 0;
+ }
+ if (nhi == 1 && ATOMcmp(b->ttype, high, nilptr) == 0) {
+ high = low;
+ nhi = 0;
+ }
+ if (ATOMcmp(b->ttype, low, high) == 0 && ATOMcmp(b->ttype,
high, nilptr) == 0) /* ugh sql nil != nil */
+ nanti = 1;
}
- if (nhi == 1 && ATOMcmp(b->ttype, high, nilptr) == 0) {
- high = low;
- nhi = 0;
- }
- if (ATOMcmp(b->ttype, low, high) == 0 && ATOMcmp(b->ttype, high,
nilptr) == 0) /* ugh sql nil != nil */
- nanti = !nanti;
+
bn = BATselect(b, s, low, high, nli, nhi, nanti);
BBPunfix(b->batCacheid);
if (s)
diff --git a/monetdb5/optimizer/opt_emptybind.c
b/monetdb5/optimizer/opt_emptybind.c
--- a/monetdb5/optimizer/opt_emptybind.c
+++ b/monetdb5/optimizer/opt_emptybind.c
@@ -159,6 +159,9 @@ OPTemptybindImplementation(Client cntxt,
setFunctionId(p,bindidxRef);
p->typechk= TYPE_UNKNOWN;
empty[getArg(p,0)] = i;
+ if( p->retc == 2){
+ empty[getArg(p,1)] = i;
+ }
// replace the call into a empty bat creation unless
the table was updated already in the same query
sch = getVarConstant(mb,getArg(p,2 +
(p->retc==2))).val.sval;
tbl = getVarConstant(mb,getArg(p,3 +
(p->retc==2))).val.sval;
diff --git a/sql/backends/monet5/sql_optimizer.c
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -32,6 +32,14 @@ SQLgetColumnSize(sql_trans *tr, sql_colu
return store->storage_api.count_col(tr, c, access);
}
+static lng
+SQLgetIdxSize(sql_trans *tr, sql_idx *i, int access)
+{
+ sqlstore *store = tr->store;
+ return store->storage_api.count_idx(tr, i, access);
+}
+
+
/*
* The maximal space occupied by a query is calculated
* under the assumption that the complete database should fit in memory.
@@ -95,8 +103,7 @@ SQLgetSpace(mvc *m, MalBlkPtr mb, int pr
sql_idx *i = mvc_bind_idx(m, s, idxname);
if (i && (!isRemote(i->t) &&
!isMergeTable(i->t))) {
- sql_column *c =
ol_first_node(i->t->columns)->data;
- size = SQLgetColumnSize(tr, c, access);
+ size = SQLgetIdxSize(tr, i, access);
if( !prepare && size == 0 && !
i->t->system){
setFunctionId(p,
emptybindidxRef);
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -703,6 +703,8 @@ stmt_idxbat(backend *be, sql_idx *i, int
s->flag = access;
s->nr = getDestVar(q);
s->q = q;
+ s->tname = i->t->base.name;
+ s->cname = i->base.name;
return s;
}
@@ -1598,7 +1600,7 @@ select2_join2(backend *be, stmt *op1, st
if (op1->nr < 0 || (sel && sel->nr < 0))
return NULL;
l = op1->nr;
- if (((cmp & CMP_BETWEEN && cmp & CMP_SYMMETRIC) || (cmp & CMP_BETWEEN
&& anti) || op2->nrcols > 0 || op3->nrcols > 0 || !reduce) && (type ==
st_uselect2)) {
+ if (((cmp & CMP_BETWEEN && cmp & CMP_SYMMETRIC) || op2->nrcols > 0 ||
op3->nrcols > 0 || !reduce) && (type == st_uselect2)) {
int k;
int nrcols = (op1->nrcols || op2->nrcols || op3->nrcols);
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
@@ -2675,8 +2675,19 @@ rel_logical_exp(sql_query *query, sql_re
}
case SQL_ATOM: {
/* TRUE or FALSE */
+ sql_rel *or = rel;
AtomNode *an = (AtomNode *) sc;
sql_exp *e = exp_atom(sql->sa, atom_dup(sql->sa, an->a));
+
+ if (e) {
+ sql_subtype bt;
+
+ sql_find_subtype(&bt, "boolean", 0, 0);
+ e = exp_check_type(sql, &bt, rel, e, type_equal);
+ }
+ if (!e || or != rel)
+ return NULL;
+ e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1),
cmp_equal);
return rel_select_push_exp_down(sql, rel, e, e, e, e, e, NULL,
f);
}
case SQL_IDENT:
@@ -2692,6 +2703,7 @@ rel_logical_exp(sql_query *query, sql_re
}
if (!e || or != rel)
return NULL;
+ e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1),
cmp_equal);
return rel_select_push_exp_down(sql, rel, e, e, e, e, e, NULL,
f);
}
case SQL_UNION:
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -3634,13 +3634,13 @@ rel_unnest_simplify(visitor *v, sql_rel
if (rel)
rel = rewrite_simplify(v, rel);
if (rel)
- rel = rewrite_or_exp(v, rel);
- if (rel)
rel = rewrite_split_select_exps(v, rel); /* has to run before
rewrite_complex */
if (rel)
- rel = rewrite_aggregates(v, rel);
+ rel = rewrite_outer2inner_union(v, rel); /* has to run before
rewrite_or_exp */
if (rel)
- rel = rewrite_outer2inner_union(v, rel);
+ rel = rewrite_or_exp(v, rel);
+ if (rel)
+ rel = rewrite_aggregates(v, rel);
if (rel)
rel = rewrite_values(v, rel);
return rel;
diff --git
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
---
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
+++
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.test
@@ -53,8 +53,6 @@ 2
sql.bind
2
sql.bind_idxbat
-2
-sql.delta
1
algebra.projection
6
@@ -93,8 +91,6 @@ 2
sql.bind
2
sql.bind_idxbat
-2
-sql.delta
1
algebra.projection
6
diff --git
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
---
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
+++
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.test
@@ -53,8 +53,6 @@ 2
sql.bind
2
sql.bind_idxbat
-2
-sql.delta
1
algebra.projection
6
diff --git
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
---
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
+++
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.test
@@ -53,8 +53,6 @@ 2
sql.bind
2
sql.bind_idxbat
-2
-sql.delta
1
algebra.projection
6
@@ -93,8 +91,6 @@ 3
sql.bind
2
sql.bind_idxbat
-4
-sql.delta
2
algebra.projection
11
diff --git
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
---
a/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
+++
b/sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.test
@@ -53,8 +53,6 @@ 3
sql.bind
2
sql.bind_idxbat
-4
-sql.delta
2
algebra.projection
11
diff --git a/sql/test/SQLancer/Tests/sqlancer13.test
b/sql/test/SQLancer/Tests/sqlancer13.test
--- a/sql/test/SQLancer/Tests/sqlancer13.test
+++ b/sql/test/SQLancer/Tests/sqlancer13.test
@@ -631,6 +631,21 @@ SELECT t0.c0 FROM t0 WHERE t0.c0 BETWEEN
----
query I rowsort
+SELECT t0.c0 FROM t0 WHERE t0.c0 BETWEEN 3 AND 0
+----
+
+query I rowsort
+SELECT t0.c0 FROM t0 WHERE t0.c0 NOT BETWEEN 3 AND 0
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list