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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list