Changeset: d21f0dcf53f0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d21f0dcf53f0 Added Files: sql/test/BugTracker-2016/Tests/dce.Bug-6114.sql sql/test/BugTracker-2016/Tests/dce.Bug-6114.stable.err sql/test/BugTracker-2016/Tests/dce.Bug-6114.stable.out sql/test/BugTracker-2016/Tests/dce2.Bug-6115.sql sql/test/BugTracker-2016/Tests/dce2.Bug-6115.stable.err sql/test/BugTracker-2016/Tests/dce2.Bug-6115.stable.out sql/test/BugTracker-2016/Tests/semijoin.Bug-6116.sql sql/test/BugTracker-2016/Tests/semijoin.Bug-6116.stable.err sql/test/BugTracker-2016/Tests/semijoin.Bug-6116.stable.out sql/test/BugTracker-2016/Tests/split_project.Bug-6117.sql sql/test/BugTracker-2016/Tests/split_project.Bug-6117.stable.err sql/test/BugTracker-2016/Tests/split_project.Bug-6117.stable.out Modified Files: sql/jdbc/tests/Tests/BugDatabaseMetaData_Bug_3356.stable.out sql/jdbc/tests/Tests/Test_JdbcClient.stable.out sql/server/rel_optimizer.c sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out sql/test/BugTracker-2016/Tests/All sql/test/BugTracker-2016/Tests/catalog_name_qualifier.Bug-3948.stable.out sql/test/BugTracker-2016/Tests/fk-smaller-pk.Bug-3983.stable.out sql/test/BugTracker-2016/Tests/ifthenelse-void.Bug-6075.stable.out sql/test/BugTracker-2016/Tests/storagemodel.stable.out sql/test/BugTracker-2016/Tests/storagemodel.stable.out.32bit sql/test/BugTracker-2016/Tests/storagemodel.stable.out.int128 sql/test/BugTracker/Tests/authorization.SF-1430616.stable.out sql/test/BugTracker/Tests/explain.SF-1739353.stable.out Branch: Dec2016 Log Message:
merged with Jun2016 diffs (truncated from 2038 to 300 lines): diff --git a/sql/jdbc/tests/Tests/BugDatabaseMetaData_Bug_3356.stable.out b/sql/jdbc/tests/Tests/BugDatabaseMetaData_Bug_3356.stable.out --- a/sql/jdbc/tests/Tests/BugDatabaseMetaData_Bug_3356.stable.out +++ b/sql/jdbc/tests/Tests/BugDatabaseMetaData_Bug_3356.stable.out @@ -21,21 +21,21 @@ stdout of test 'BugDatabaseMetaData_Bug_ Ready. -# 17:27:28 > -# 17:27:28 > "./BugDatabaseMetaData_Bug_3356.SQL.sh" "BugDatabaseMetaData_Bug_3356" -# 17:27:28 > +# 22:06:18 > +# 22:06:18 > "./BugDatabaseMetaData_Bug_3356.SQL.sh" "BugDatabaseMetaData_Bug_3356" +# 22:06:18 > -# 17:27:28 > -# 17:27:28 > java BugDatabaseMetaData_Bug_3356 "jdbc:monetdb://madrid:34631/mTests_sql_jdbc_tests?user=monetdb&password=monetdb" -# 17:27:28 > +# 22:06:18 > +# 22:06:18 > java BugDatabaseMetaData_Bug_3356 "jdbc:monetdb://localhost:39265/mTests_sql_jdbc_tests?user=monetdb&password=monetdb" +# 22:06:18 > _tables _tables YES YES -# 17:27:28 > -# 17:27:28 > "Done." -# 17:27:28 > +# 22:06:18 > +# 22:06:18 > "Done." +# 22:06:18 > 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 @@ -4168,11 +4168,35 @@ rel_push_join_down(int *changes, mvc *sq * semijoin( join(A, B) [ A.x == B.y ], C ) [ A.z == C.c ] * -> * join( semijoin(A, C) [ A.z == C.c ], B ) [ A.x == B.y ] + * + * also push simple expressions of a semijoin down if they only + * involve the left sided of the semijoin. */ static sql_rel * rel_push_semijoin_down(int *changes, mvc *sql, sql_rel *rel) { (void)*changes; + + /* first push down the expressions involving only A */ + if (is_semi(rel->op) && rel->exps && rel->l) { + list *exps = rel->exps, *nexps = sa_list(sql->sa); + node *n; + + for(n = exps->h; n; n = n->next) { + sql_exp *sje = n->data; + + if (n != exps->h && + !is_complex_exp(sje->flag) && + rel_has_exp(rel->l, sje->l) >= 0 && + rel_has_exp(rel->l, sje->r) >= 0) { + rel->l = rel_select(sql->sa, rel->l, NULL); + rel_select_add_exp(sql->sa, rel->l, sje); + } else { + append(nexps, sje); + } + } + rel->exps = nexps; + } if (is_semi(rel->op) && rel->exps && rel->l) { operator_type op = rel->op, lop; node *n; @@ -5884,6 +5908,65 @@ rel_remove_unused(mvc *sql, sql_rel *rel return rel; } +static void +rel_dce_refs(mvc *sql, sql_rel *rel, list *refs) +{ + if (!rel) + return ; + + if (rel_is_ref(rel)) { + if (!list_find(refs, rel, NULL)) + list_append(refs, rel); + } + + switch(rel->op) { + case op_basetable: + case op_table: + + if (rel->l && rel->op == op_table) + rel_dce_refs(sql, rel->l, refs); + case op_insert: + case op_ddl: + break; + + case op_update: + case op_delete: + + if (rel->r) + rel_dce_refs(sql, rel->r, refs); + break; + + case op_topn: + case op_sample: + case op_project: + case op_groupby: + case op_select: + + if (rel->l) + rel_dce_refs(sql, rel->l, refs); + break; + + case op_union: + case op_inter: + case op_except: + case op_join: + case op_left: + case op_right: + case op_full: + case op_semi: + case op_anti: + + if (rel->l) + rel_dce_refs(sql, rel->l, refs); + if (rel->r) + rel_dce_refs(sql, rel->r, refs); + break; + + case op_apply: + assert(0); + } +} + static sql_rel * rel_dce_down(mvc *sql, sql_rel *rel, list *refs, int skip_proj) { @@ -6062,9 +6145,11 @@ rel_dce(mvc *sql, sql_rel *rel) list *refs = sa_list(sql->sa); node *n; + rel_dce_refs(sql, rel, refs); rel = rel_add_projects(sql, rel); rel_used(rel); rel_dce_sub(sql, rel, refs); + for (n = refs->h; n; n = n->next) rel_dce_sub(sql, n->data, refs); return rel; @@ -6584,10 +6669,14 @@ rel_split_project(int *changes, mvc *sql append(rel->exps, split_exp(sql, n->data, rel)); } } - /* TODO handle right (ie join/union) */ - if (!is_basetable(rel->op) && rel->l) + if (is_set(rel->op) || is_basetable(rel->op)) + return rel; + if (rel->l) rel->l = rel_split_project(changes, sql, rel->l, (is_topn(rel->op)||is_ddl(rel->op)||is_modify(rel->op))?top:0); + if (is_join(rel->op) && rel->r) + rel->r = rel_split_project(changes, sql, rel->r, + (is_topn(rel->op)||is_ddl(rel->op)||is_modify(rel->op))?top:0); return rel; } @@ -8428,7 +8517,7 @@ static sql_rel * if (gp.cnt[op_left] || gp.cnt[op_right] || gp.cnt[op_full]) rel = rewrite_topdown(sql, rel, &rel_split_outerjoin, &changes); - if (gp.cnt[op_select]) { + if (gp.cnt[op_select] || gp.cnt[op_semi]) { /* only once */ if (level <= 0) rel = rewrite(sql, rel, &rel_merge_rse, &changes); diff --git a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out --- a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out +++ b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out @@ -22,7 +22,7 @@ Ready. #debug select * from tables; mdb>#X_0=0@0:void := querylog.define("debug select * from tables;","default_pipe",156); -mdb>#X_190=nil:bat[:str] := bat.new(nil:str); +mdb>#X_198=nil:bat[:str] := bat.new(nil:str); # 16:24:01 > # 16:24:01 > "Done." diff --git a/sql/test/BugTracker-2016/Tests/catalog_name_qualifier.Bug-3948.stable.out b/sql/test/BugTracker-2016/Tests/catalog_name_qualifier.Bug-3948.stable.out --- a/sql/test/BugTracker-2016/Tests/catalog_name_qualifier.Bug-3948.stable.out +++ b/sql/test/BugTracker-2016/Tests/catalog_name_qualifier.Bug-3948.stable.out @@ -131,12 +131,12 @@ Ready. [ 21 ] #drop table sys.t3948; #select * from dependencies_tables_on_views(); -% ., ., . # table_name +% .L1, .L1, .L1 # table_name % sch, usr, dep_type # name % varchar, varchar, varchar # type % 0, 0, 0 # length #select * from sys.dependencies_tables_on_views(); -% ., ., . # table_name +% .L1, .L1, .L1 # table_name % sch, usr, dep_type # name % varchar, varchar, varchar # type % 0, 0, 0 # length diff --git a/sql/test/BugTracker-2016/Tests/dce.Bug-6114.sql b/sql/test/BugTracker-2016/Tests/dce.Bug-6114.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2016/Tests/dce.Bug-6114.sql @@ -0,0 +1,260 @@ + +/* Relations */ +CREATE TABLE comments( + id BIGINT NOT NULL PRIMARY KEY, + creationDate TIMESTAMP(3) WITH TIME ZONE NOT NULL, + locationIP VARCHAR(40) NOT NULL, + browserUsed VARCHAR(40) NOT NULL, + content VARCHAR(2000) NOT NULL, + length INT NOT NULL, + creator BIGINT NOT NULL, + place_id BIGINT NOT NULL, + replyOfPost BIGINT, + replyOfComment BIGINT +); + +CREATE TABLE comment_tags( + comment_id BIGINT NOT NULL, + tag_id BIGINT NOT NULL, + PRIMARY KEY(comment_id, tag_id) +); + +CREATE TABLE forums( + id BIGINT NOT NULL PRIMARY KEY, + title VARCHAR(80) NOT NULL, + creationDate TIMESTAMP(3) WITH TIME ZONE NOT NULL, + moderator BIGINT /*though it seems that all generated tuples have always a moderator */ +); + +CREATE TABLE forum_persons( + forum_id BIGINT NOT NULL, + person_id BIGINT NOT NULL, + joinDate TIMESTAMP(3) WITH TIME ZONE NOT NULL, + PRIMARY KEY(forum_id, person_id) +); + +CREATE TABLE forum_tags( + forum_id BIGINT NOT NULL, + tag_id BIGINT NOT NULL, + PRIMARY KEY(forum_id, tag_id) +); + +CREATE TABLE friends( + src BIGINT NOT NULL, + dst BIGINT NOT NULL, + creationDate TIMESTAMP(3) WITH TIME ZONE NOT NULL, + PRIMARY KEY(src, dst) +); + +CREATE TABLE organisations( + id BIGINT NOT NULL PRIMARY KEY, + "type" VARCHAR(40) NOT NULL, /* university or company */ + name VARCHAR(160) NOT NULL, + url VARCHAR(2000) NOT NULL, + place_id BIGINT NOT NULL +); + +CREATE TABLE persons( + id BIGINT NOT NULL PRIMARY KEY, + firstName VARCHAR(40) NOT NULL , + lastName VARCHAR(40) NOT NULL, + gender VARCHAR(40) NOT NULL, + birthDay DATE NOT NULL, + creationDate TIMESTAMP(3) WITH TIME ZONE NOT NULL, + locationIP VARCHAR(40) NOT NULL, + browserUsed VARCHAR(40) NOT NULL, + place_id BIGINT NOT NULL +); + +CREATE TABLE person_comments( + person_id BIGINT NOT NULL, + comment_id BIGINT NOT NULL, + creationDate TIMESTAMP(3) WITH TIME ZONE NOT NULL, + PRIMARY KEY(person_id, comment_id) +); + +CREATE TABLE person_emails( + id BIGINT NOT NULL, + email VARCHAR(120) NOT NULL, + PRIMARY KEY(id, email) +); + +CREATE TABLE person_languages( + id BIGINT NOT NULL, + "language" VARCHAR(40) NOT NULL, + PRIMARY KEY(id, "language") +); + +CREATE TABLE person_tags( _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list