Changeset: 1bc9d92796e1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1bc9d92796e1
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/explain_gives_crash.SF-2741829.sql
        sql/test/BugTracker-2009/Tests/explain_gives_crash.SF-2741829.stable.out
        
sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
        sql/test/BugTracker-2016/Tests/All
        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
        sql/test/emptydb-upgrade-chain-hge/Tests/check.stable.out.int128
        sql/test/emptydb-upgrade-chain/Tests/check.stable.out
        sql/test/emptydb-upgrade-chain/Tests/check.stable.out.32bit
        sql/test/emptydb-upgrade-chain/Tests/check.stable.out.int128
        sql/test/emptydb-upgrade-hge/Tests/check.stable.out.int128
        sql/test/emptydb-upgrade/Tests/check.stable.out
        sql/test/emptydb-upgrade/Tests/check.stable.out.32bit
        sql/test/emptydb-upgrade/Tests/check.stable.out.int128
        sql/test/emptydb/Tests/check.stable.out
        sql/test/emptydb/Tests/check.stable.out.32bit
        sql/test/emptydb/Tests/check.stable.out.int128
Branch: malupgrade
Log Message:

merge with default


diffs (truncated from 2636 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/explain_gives_crash.SF-2741829.sql 
b/sql/test/BugTracker-2009/Tests/explain_gives_crash.SF-2741829.sql
--- a/sql/test/BugTracker-2009/Tests/explain_gives_crash.SF-2741829.sql
+++ b/sql/test/BugTracker-2009/Tests/explain_gives_crash.SF-2741829.sql
@@ -1,12 +1,12 @@
--- disable parallelism (mitosis & dataflow) to avoid ambiguous results 
+-- disable parallelism (mitosis & dataflow) to avoid ambiguous results
 set optimizer='sequential_pipe';
-\f csv
 create table blabla(id integer);
-select '#~BeginVariableOutput~#';
+-- use "ProfilingOutput" since we're only interested in crashes
+select '~BeginProfilingOutput~';
 explain alter table blabla add constraint dada unique (id);
 explain alter table blabla add constraint dada unique (id);
-select '#~EndVariableOutput~#';
+select '~EndProfilingOutput~';
 alter table blabla drop constraint dada;
-select '#~BeginVariableOutput~#';
+select '~BeginProfilingOutput~';
 explain alter table blabla add constraint dada unique (id);
-select '#~EndVariableOutput~#';
+select '~EndProfilingOutput~';
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(
+    person_id BIGINT NOT NULL,
+    tag_id BIGINT NOT NULL,
+    PRIMARY KEY(person_id, tag_id)
+);
+
+CREATE TABLE person_posts(
+    person_id BIGINT NOT NULL,
+    post_id BIGINT NOT NULL,
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to