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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list