Changeset: b322a1e6ddb2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b322a1e6ddb2 Modified Files: sql/benchmarks/tpcds/Tests/44.stable.out sql/benchmarks/tpcds/Tests/54.stable.out sql/server/rel_unnest.c sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out sql/test/BugTracker-2017/Tests/crash_on_NULL_ptr.Bug-6130.stable.out sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6477.stable.out sql/test/mergetables/Tests/sqlsmith-exists.stable.out sql/test/subquery/Tests/correlated.stable.out Branch: linear-hashing Log Message:
fixed problem with correlated exists always join with 'is' semantics in general unnest use left join on subqueries within functions (or projects) use full (left) on correlated 'allnotequal' diffs (273 lines): diff --git a/sql/benchmarks/tpcds/Tests/44.stable.out b/sql/benchmarks/tpcds/Tests/44.stable.out --- a/sql/benchmarks/tpcds/Tests/44.stable.out +++ b/sql/benchmarks/tpcds/Tests/44.stable.out @@ -41,7 +41,7 @@ stdout of test '44` in directory 'sql/be # HAVING avg(ss_net_profit) > 0.9* # (SELECT avg(ss_net_profit) rank_col # FROM store_sales -% sys.asceding, sys., sys. # table_name +% .asceding, sys., sys. # table_name % rnk, best_performing, worst_performing # name % int, char, char # type % 2, 50, 50 # length diff --git a/sql/benchmarks/tpcds/Tests/54.stable.out b/sql/benchmarks/tpcds/Tests/54.stable.out --- a/sql/benchmarks/tpcds/Tests/54.stable.out +++ b/sql/benchmarks/tpcds/Tests/54.stable.out @@ -39,7 +39,7 @@ stdout of test '54` in directory 'sql/be # date_dim, # customer # WHERE sold_date_sk = d_date_sk -% sys.segments, sys., sys. # table_name +% .segments, ., . # table_name % segment, num_customers, segment_base # name % int, bigint, bigint # type % 5, 1, 6 # length diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -608,7 +608,6 @@ move_join_exps(mvc *sql, sql_rel *j, sql static sql_rel * rel_general_unnest(mvc *sql, sql_rel *rel, list *ad) { - /* current unnest only possible for equality joins, <, <> etc needs more work */ if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel) && ad) { list *fd; node *n, *m; @@ -652,7 +651,7 @@ rel_general_unnest(mvc *sql, sql_rel *re l = exp_ref(sql->sa, l); r = exp_ref(sql->sa, r); - e = exp_compare(sql->sa, l, r, (is_outerjoin(rel->op)|is_semi(rel->op))?cmp_equal_nil:cmp_equal); + e = exp_compare(sql->sa, l, r, cmp_equal_nil); if (!rel->exps) rel->exps = sa_list(sql->sa); append(rel->exps, e); @@ -1476,7 +1475,7 @@ rewrite_exp_rel(mvc *sql, sql_rel *rel, { (void)depth; if (exp_has_rel(e) && !is_ddl(rel->op)) { - sql_exp *ne = rewrite_inner(sql, rel, exp_rel_get_rel(sql->sa, e), op_join); + sql_exp *ne = rewrite_inner(sql, rel, exp_rel_get_rel(sql->sa, e), depth?op_left:op_join); if (!ne) return ne; @@ -2047,7 +2046,7 @@ rewrite_anyequal(mvc *sql, sql_rel *rel, } } - if (is_project(rel->op) || depth > 0) { + if (is_project(rel->op) || depth > 0 || (!is_tuple && rsq && rel_has_freevar(sql, rsq) && !is_anyequal(sf))) { list *exps = NULL; sql_exp *rid, *lid, *a = NULL; sql_rel *sq = lsq; @@ -2523,8 +2522,9 @@ rewrite_ifthenelse(mvc *sql, sql_rel *re list *l = e->l; sql_exp *cond = l->h->data; sql_subfunc *nf = cond->f; + sql_rel *inner = rel->l; - if (has_nil(cond) && (cond->type != e_func || !is_isnull_func(nf))) { + if ((has_nil(cond) || (inner && is_outerjoin(inner->op))) && (cond->type != e_func || !is_isnull_func(nf))) { /* add is null */ sql_exp *condnil = rel_unop_(sql, rel, cond, NULL, "isnull", card_value); diff --git a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out --- a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out +++ b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out @@ -97,7 +97,7 @@ join ( | | | ) [ "o"."open_auction_id" NOT NULL, "b3"."increase" NOT NULL as "%2"."%2" ] | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.zero_or_one("%2"."%2" NOT NULL) NOT NULL as "%3"."%3", "o"."open_auction_id" NOT NULL ] | ) [ "%3"."%3" NOT NULL, "o"."open_auction_id" NOT NULL as "%25"."%25" ] -) [ "o"."open_auction_id" NOT NULL = "%25"."%25" NOT NULL ] +) [ "o"."open_auction_id" NOT NULL =* "%25"."%25" NOT NULL ] project ( | select ( | | join ( @@ -123,7 +123,7 @@ project ( | | | | | ) [ "o"."open_auction_id" NOT NULL, "b2"."increase" NOT NULL as "%5"."%5" ] | | | | ) [ "o"."open_auction_id" NOT NULL ] [ sys.zero_or_one("%5"."%5" NOT NULL) NOT NULL as "%6"."%6", "o"."open_auction_id" NOT NULL ] | | | ) [ "%6"."%6" NOT NULL, "o"."open_auction_id" NOT NULL as "%47"."%47" ] -| | ) [ "o"."open_auction_id" NOT NULL = "%47"."%47" NOT NULL ] +| | ) [ "o"."open_auction_id" NOT NULL =* "%47"."%47" NOT NULL ] | ) [ sys.sql_mul("%3"."%3" NOT NULL, double "2") <= "%6"."%6" NOT NULL ] ) [ "b"."id" NOT NULL HASHCOL , "b"."open_auction_id" NOT NULL, "b"."date" NOT NULL, "b"."time" NOT NULL, "b"."personref" NOT NULL, "b"."increase" NOT NULL ] #Select b.* FROM open_auctions o, bidder b WHERE (select b3.INCREASE from bidder b3 where b3.id = (select min(b3a.id) from bidder b3a where b3a.open_auction_id = o.open_auction_id)) * 2 <= (Select b2.INCREASE from bidder b2 where b2.id = (SELECT MAX(b2a.id) from bidder b2a where b2a.open_auction_id = o.open_auction_id)) AND o.open_auction_id = b.open_auction_id order by date, time; diff --git a/sql/test/BugTracker-2017/Tests/crash_on_NULL_ptr.Bug-6130.stable.out b/sql/test/BugTracker-2017/Tests/crash_on_NULL_ptr.Bug-6130.stable.out --- a/sql/test/BugTracker-2017/Tests/crash_on_NULL_ptr.Bug-6130.stable.out +++ b/sql/test/BugTracker-2017/Tests/crash_on_NULL_ptr.Bug-6130.stable.out @@ -232,7 +232,7 @@ stdout of test 'crash_on_NULL_ptr.Bug-61 # SELECT t.id, t.name, p.creationDate # FROM messages p, message_tags pt, tags t # WHERE p.creator IN (SELECT * FROM friends1) -% sys.resultset, sys.resultset # table_name +% .resultset, .resultset # table_name % name, count # name % varchar, bigint # type % 0, 1 # length diff --git a/sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6477.stable.out b/sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6477.stable.out --- a/sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6477.stable.out +++ b/sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6477.stable.out @@ -54,7 +54,7 @@ stdout of test 'sqlsmith.Bug-6477` in di # from # tab0 as ref_1 # left join tab1 as ref_2 -% sys., sys., sys., sys., sys., sys., sys. # table_name +% ., ., ., ., ., ., . # table_name % c0, c1, c2, c3, c4, c5, c6 # name % timestamp, int, int, int, timestamp, int, int # type % 26, 4, 4, 4, 26, 4, 4 # length diff --git a/sql/test/mergetables/Tests/sqlsmith-exists.stable.out b/sql/test/mergetables/Tests/sqlsmith-exists.stable.out --- a/sql/test/mergetables/Tests/sqlsmith-exists.stable.out +++ b/sql/test/mergetables/Tests/sqlsmith-exists.stable.out @@ -222,13 +222,22 @@ stdout of test 'sqlsmith-exists` in dire # subq_0.c5 AS c11, # subq_0.c4 AS c12 # FROM -% sys. # table_name +% . # table_name % c0 # name % int # type % 1 # length [ 1 ] [ 2 ] [ 3 ] +#SELECT 1 FROM integers WHERE CASE WHEN EXISTS (SELECT 1 WHERE i IS NULL) THEN true ELSE true END; +% . # table_name +% single_value # name +% tinyint # type +% 1 # length +[ 1 ] +[ 1 ] +[ 1 ] +[ 1 ] #select # subq_1.c1 as c0, # subq_1.c2 as c1, diff --git a/sql/test/subquery/Tests/correlated.stable.out b/sql/test/subquery/Tests/correlated.stable.out --- a/sql/test/subquery/Tests/correlated.stable.out +++ b/sql/test/subquery/Tests/correlated.stable.out @@ -562,16 +562,16 @@ stdout of test 'correlated` in directory [ 12, false ] [ 13, false ] #SELECT "str", "str"=ANY(SELECT str2 FROM test2) FROM test; -% .test, .%11 # table_name -% str, %11 # name +% .test, .%12 # table_name +% str, %12 # name % varchar, boolean # type % 1, 5 # length [ "a", true ] [ "b", true ] [ "c", false ] #SELECT "str", "str"=ANY(SELECT str2 FROM test2 WHERE test.a<>test2.a) FROM test; -% .test, .%13 # table_name -% str, %13 # name +% .test, .%14 # table_name +% str, %14 # name % varchar, boolean # type % 1, 5 # length [ "a", false ] @@ -620,7 +620,7 @@ stdout of test 'correlated` in directory % 1, 1 # length [ 1, 2 ] #SELECT * FROM integers s1 INNER JOIN integers s2 ON (SELECT s1.i=s2.i) ORDER BY s1.i; -% sys.s1, sys.s2 # table_name +% .s1, .s2 # table_name % i, i # name % int, int # type % 1, 1 # length @@ -628,7 +628,7 @@ stdout of test 'correlated` in directory [ 2, 2 ] [ 3, 3 ] #SELECT * FROM integers s1 INNER JOIN integers s2 ON (SELECT s1.i=i FROM integers WHERE s2.i=i) ORDER BY s1.i; -% sys.s1, sys.s2 # table_name +% .s1, .s2 # table_name % i, i # name % int, int # type % 1, 1 # length @@ -664,7 +664,7 @@ stdout of test 'correlated` in directory [ 3, 12 ] #SELECT i, (SELECT row_number() OVER (ORDER BY i)) FROM integers i1 ORDER BY i; --Should we support correlated expressions inside PARTITION BY and ORDER BY on Window functions? % .i1, . # table_name -% i, %1 # name +% i, %4 # name % int, int # type % 1, 1 # length [ NULL, 1 ] @@ -717,7 +717,7 @@ stdout of test 'correlated` in directory [ 3, 51 ] #SELECT i, (SELECT row_number() OVER (ORDER BY i) FROM integers WHERE i1.i=i) FROM integers i1 ORDER BY i; % .i1, . # table_name -% i, %3 # name +% i, %5 # name % int, int # type % 1, 1 # length [ NULL, NULL ] @@ -726,7 +726,7 @@ stdout of test 'correlated` in directory [ 3, 1 ] #SELECT i1.i, (SELECT rank() OVER (ORDER BY i) FROM integers WHERE i1.i=i) FROM integers i1, integers i2 ORDER BY i1.i; % .i1, . # table_name -% i, %3 # name +% i, %5 # name % int, int # type % 1, 1 # length [ NULL, NULL ] @@ -747,7 +747,7 @@ stdout of test 'correlated` in directory [ 3, 1 ] #SELECT i1.i, (SELECT row_number() OVER (ORDER BY i) FROM integers WHERE i1.i=i) FROM integers i1, integers i2 ORDER BY i1.i; % .i1, . # table_name -% i, %3 # name +% i, %5 # name % int, int # type % 1, 1 # length [ NULL, NULL ] @@ -768,7 +768,7 @@ stdout of test 'correlated` in directory [ 3, 1 ] #SELECT i, CAST((SELECT SUM(i) OVER (ORDER BY i) FROM integers WHERE i1.i=i) AS BIGINT) FROM integers i1 ORDER BY i; % .i1, . # table_name -% i, %2 # name +% i, %10 # name % int, bigint # type % 1, 1 # length [ NULL, NULL ] @@ -1088,32 +1088,32 @@ stdout of test 'correlated` in directory [ 2, 4 ] [ 3, 6 ] #SELECT NULL IN (SELECT * FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v; -% .%4 # table_name -% %4 # name +% .%5 # table_name +% %5 # name % boolean # type % 5 # length [ false ] [ NULL ] [ NULL ] #SELECT 'hello' IN (SELECT * FROM strings WHERE v=s1.v) FROM strings s1 ORDER BY v; -% .%4 # table_name -% %4 # name +% .%5 # table_name +% %5 # name % boolean # type % 5 # length [ false ] [ true ] [ false ] #SELECT 'hello' IN (SELECT * FROM strings WHERE v=s1.v or v IS NULL) FROM strings s1 ORDER BY v; -% .%4 # table_name -% %4 # name +% .%5 # table_name +% %5 # name % boolean # type % 5 # length [ NULL ] [ true ] [ NULL ] #SELECT 'bla' IN (SELECT * FROM strings WHERE v=s1.v or v IS NULL) FROM strings s1 ORDER BY v; -% .%4 # table_name -% %4 # name +% .%5 # table_name +% %5 # name % boolean # type % 5 # length [ NULL ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list