Changeset: 553eb6be7d4b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=553eb6be7d4b
Removed Files:
sql/test/SQLancer/Tests/sqlancer07.sql
sql/test/SQLancer/Tests/sqlancer10.sql
sql/test/SQLancer/Tests/sqlancer11.sql
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_updates.c
sql/test/SQLancer/Tests/sqlancer07.test
sql/test/SQLancer/Tests/sqlancer10.test
sql/test/SQLancer/Tests/sqlancer11.test
Branch: default
Log Message:
Merged with Oct2020
diffs (269 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1365,10 +1365,8 @@ can_push_func(sql_exp *e, sql_rel *rel,
} else {
int mustl = 0, mustr = 0, mustf = 0;
return ((l->type == e_column || can_push_func(l, rel,
&mustl, depth + 1)) && (*must = mustl)) ||
- (!f && (r->type == e_column ||
can_push_func(r, rel, &mustr, depth + 1)) && (*must = mustr)) ||
- (f &&
- (r->type == e_column ||
can_push_func(r, rel, &mustr, depth + 1)) &&
- (f->type == e_column || can_push_func(f, rel,
&mustf, depth + 1)) && (*must = (mustr || mustf)));
+ ((r->type == e_column ||
can_push_func(r, rel, &mustr, depth + 1)) && (*must = mustr)) ||
+ ((f && (f->type == e_column ||
can_push_func(f, rel, &mustf, depth + 1)) && (*must = mustf)));
}
}
case e_convert:
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -68,15 +68,6 @@ get_table(sql_rel *t)
return tab;
}
-static list *
-get_inserts( sql_rel *ins )
-{
- sql_rel *r = ins->r;
-
- assert(is_project(r->op) || r->op == op_table);
- return r->exps;
-}
-
static sql_rel *
rel_insert_hash_idx(mvc *sql, const char* alias, sql_idx *i, sql_rel *inserts)
{
@@ -85,10 +76,13 @@ rel_insert_hash_idx(mvc *sql, const char
sql_subtype *it, *lng;
int bits = 1 + ((sizeof(lng)*8)-1)/(list_length(i->columns)+1);
sql_exp *h = NULL;
+ sql_rel *ins = inserts->r;
+ assert(is_project(ins->op) || ins->op == op_table);
if (list_length(i->columns) <= 1 || i->type == no_idx) {
/* dummy append */
- append(get_inserts(inserts), exp_label(sql->sa,
exp_atom_lng(sql->sa, 0), ++sql->label));
+ inserts->r = ins = rel_project(sql->sa, ins,
rel_projections(sql, ins, NULL, 1, 1));
+ list_append(ins->exps, exp_label(sql->sa, exp_atom_lng(sql->sa,
0), ++sql->label));
return inserts;
}
@@ -96,7 +90,7 @@ rel_insert_hash_idx(mvc *sql, const char
lng = sql_bind_localtype("lng");
for (m = i->columns->h; m; m = m->next) {
sql_kc *c = m->data;
- sql_exp *e = list_fetch(get_inserts(inserts), c->c->colnr);
+ sql_exp *e = list_fetch(ins->exps, c->c->colnr);
e = exp_ref(sql, e);
if (h && i->type == hash_idx) {
@@ -124,7 +118,8 @@ rel_insert_hash_idx(mvc *sql, const char
}
}
/* append inserts to hash */
- append(get_inserts(inserts), h);
+ inserts->r = ins = rel_project(sql->sa, ins, rel_projections(sql, ins,
NULL, 1, 1));
+ list_append(ins->exps, h);
exp_setname(sql->sa, h, alias, iname);
return inserts;
}
@@ -145,6 +140,7 @@ rel_insert_join_idx(mvc *sql, const char
sql_exp *lnll_exps = NULL, *rnll_exps = NULL, *e;
list *join_exps = new_exp_list(sql->sa), *pexps;
+ assert(is_project(ins->op) || ins->op == op_table);
for (m = i->columns->h; m; m = m->next) {
sql_kc *c = m->data;
@@ -218,7 +214,6 @@ static sql_rel *
rel_insert_idxs(mvc *sql, sql_table *t, const char* alias, sql_rel *inserts)
{
sql_rel *p = inserts->r;
- bool need_proj = true, special_insert = false;
if (!t->idxs.set)
return inserts;
@@ -226,23 +221,14 @@ rel_insert_idxs(mvc *sql, sql_table *t,
inserts->r = rel_label(sql, inserts->r, 1);
for (node *n = t->idxs.set->h; n; n = n->next) {
sql_idx *i = n->data;
- sql_rel *ins = inserts->r;
- if (is_union(ins->op))
- inserts->r = rel_project(sql->sa, ins,
rel_projections(sql, ins, NULL, 0, 1));
if (hash_index(i->type) || i->type == no_idx) {
- /* needs projection for hash functions */
- if (list_length(i->columns) > 1 && hash_index(i->type)
&& need_proj) {
- inserts->r = rel_project(sql->sa, inserts->r,
rel_projections(sql, inserts->r, NULL, 1, 1));
- need_proj = false;
- }
rel_insert_hash_idx(sql, alias, i, inserts);
} else if (i->type == join_idx) {
- special_insert = true;
rel_insert_join_idx(sql, alias, i, inserts);
}
}
- if (special_insert) {
+ if (inserts->r != p) {
sql_rel *r = rel_create(sql->sa);
if(!r)
return NULL;
@@ -642,7 +628,9 @@ rel_update_hash_idx(mvc *sql, const char
sql_subtype *it, *lng = 0; /* is not set in first if below */
int bits = 1 + ((sizeof(lng)*8)-1)/(list_length(i->columns)+1);
sql_exp *h = NULL;
+ sql_rel *ups = updates->r;
+ assert(is_project(ups->op) || ups->op == op_table);
if (list_length(i->columns) <= 1 || i->type == no_idx) {
h = exp_label(sql->sa, exp_atom_lng(sql->sa, 0), ++sql->label);
} else {
@@ -650,7 +638,7 @@ rel_update_hash_idx(mvc *sql, const char
lng = sql_bind_localtype("lng");
for (m = i->columns->h; m; m = m->next) {
sql_kc *c = m->data;
- sql_exp *e = list_fetch(get_inserts(updates),
c->c->colnr+1);
+ sql_exp *e = list_fetch(ups->exps, c->c->colnr+1);
e = exp_ref(sql, e);
if (h && i->type == hash_idx) {
@@ -679,7 +667,8 @@ rel_update_hash_idx(mvc *sql, const char
}
}
/* append hash to updates */
- append(get_inserts(updates), h);
+ updates->r = ups = rel_project(sql->sa, ups, rel_projections(sql, ups,
NULL, 1, 1));
+ list_append(ups->exps, h);
exp_setname(sql->sa, h, alias, iname);
if (!updates->exps)
@@ -733,6 +722,7 @@ rel_update_join_idx(mvc *sql, const char
sql_exp *lnll_exps = NULL, *rnll_exps = NULL, *e;
list *join_exps = new_exp_list(sql->sa), *pexps;
+ assert(is_project(ups->op) || ups->op == op_table);
for (m = i->columns->h; m; m = m->next) {
sql_kc *c = m->data;
@@ -743,7 +733,7 @@ rel_update_join_idx(mvc *sql, const char
sql_kc *c = m->data;
sql_kc *rc = o->data;
sql_subfunc *isnil = sql_bind_func(sql, "sys", "isnull",
&c->c->type, NULL, F_FUNC);
- sql_exp *upd = list_fetch(get_inserts(updates), c->c->colnr +
1), *lnl, *rnl, *je;
+ sql_exp *upd = list_fetch(ups->exps, c->c->colnr + 1), *lnl,
*rnl, *je;
sql_exp *rtc = exp_column(sql->sa, rel_name(rt),
rc->c->base.name, &rc->c->type, CARD_MULTI, rc->c->null, 0);
/* FOR MATCH FULL/SIMPLE/PARTIAL see above */
@@ -814,7 +804,6 @@ static sql_rel *
rel_update_idxs(mvc *sql, const char *alias, sql_table *t, sql_rel *relup)
{
sql_rel *p = relup->r;
- bool need_proj = true, special_update = false;
if (!t->idxs.set)
return relup;
@@ -834,18 +823,12 @@ rel_update_idxs(mvc *sql, const char *al
*/
if (hash_index(i->type) || i->type == no_idx) {
- /* needs projection for hash functions */
- if (list_length(i->columns) > 1 && hash_index(i->type)
&& need_proj) {
- relup->r = rel_project(sql->sa, relup->r,
rel_projections(sql, relup->r, NULL, 1, 1));
- need_proj = false;
- }
rel_update_hash_idx(sql, alias, i, relup);
} else if (i->type == join_idx) {
- special_update = true;
rel_update_join_idx(sql, alias, i, relup);
}
}
- if (special_update) {
+ if (relup->r != p) {
sql_rel *r = rel_create(sql->sa);
if(!r)
return NULL;
diff --git a/sql/test/SQLancer/Tests/sqlancer07.test
b/sql/test/SQLancer/Tests/sqlancer07.test
--- a/sql/test/SQLancer/Tests/sqlancer07.test
+++ b/sql/test/SQLancer/Tests/sqlancer07.test
@@ -470,24 +470,6 @@ statement ok
START TRANSACTION
statement ok
-CREATE TABLE "t1" ("c0" BIGINT NOT NULL,CONSTRAINT "t1_c0_pkey" PRIMARY KEY
("c0"))
-
-statement ok
-INSERT INTO t1(c0) VALUES(2), (+ ((VALUES (sql_min(3, 4)))))
-
-query I rowsort
-SELECT * from t1
-----
-2
-3
-
-statement ok
-ROLLBACK
-
-statement ok
-START TRANSACTION
-
-statement ok
CREATE TABLE "t0" ("c0" TIMESTAMP NOT NULL,CONSTRAINT "t0_c0_pkey" PRIMARY KEY
("c0"),CONSTRAINT "t0_c0_unique" UNIQUE ("c0"))
statement ok
diff --git a/sql/test/SQLancer/Tests/sqlancer10.test
b/sql/test/SQLancer/Tests/sqlancer10.test
--- a/sql/test/SQLancer/Tests/sqlancer10.test
+++ b/sql/test/SQLancer/Tests/sqlancer10.test
@@ -81,4 +81,28 @@ update t0 set c1 = true, c0 = r'.+' wher
statement ok
ROLLBACK
+statement ok
+START TRANSACTION
+statement ok
+CREATE TABLE t1(c0 int)
+
+statement ok
+CREATE VIEW v4(vc0) AS ((SELECT NULL FROM t1 AS l0t1) UNION ALL (SELECT true))
+
+statement ok
+INSERT INTO t1(c0) VALUES(12), (2), (6), (3), (1321), (10), (8), (1), (2),
(3), (9)
+
+statement ok
+DELETE FROM t1 WHERE true
+
+statement ok
+INSERT INTO t1(c0) VALUES(9), (1), (3), (2), (5)
+
+query I rowsort
+SELECT 1 FROM v4 JOIN (SELECT 2) AS sub0 ON COALESCE(v4.vc0, v4.vc0 BETWEEN
v4.vc0 AND v4.vc0)
+----
+1
+
+statement ok
+ROLLBACK
diff --git a/sql/test/SQLancer/Tests/sqlancer11.test
b/sql/test/SQLancer/Tests/sqlancer11.test
--- a/sql/test/SQLancer/Tests/sqlancer11.test
+++ b/sql/test/SQLancer/Tests/sqlancer11.test
@@ -1,3 +1,21 @@
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "t1" ("c0" BIGINT NOT NULL,CONSTRAINT "t1_c0_pkey" PRIMARY KEY
("c0"))
+
+statement ok
+INSERT INTO t1(c0) VALUES(2), (+ ((VALUES (sql_min(3, 4)))))
+
+query I rowsort
+SELECT * from t1
+----
+2
+3
+
+statement ok
+ROLLBACK
+
statement ok
START TRANSACTION
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list