Changeset: 4e16b08fa079 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4e16b08fa079
Added Files:
        sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.sql
        sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.err
        sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.out
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/mergetables/Tests/All
Branch: Jul2017
Log Message:

fixed crash in apply handling with anti/semijoins


diffs (192 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
@@ -8684,9 +8684,12 @@ rel_apply_rewrite(int *changes, mvc *sql
                p = rel_projections(sql, rel, NULL, 1, 1);
                nl = rel_apply(sql, rel_dup(rel->l), rel_dup(r->l), rel->exps, 
rel->flag);
                nr = rel_apply(sql, rel_dup(rel->l), rel_dup(r->r), rel->exps, 
rel->flag);
+               nl = rel_project(sql->sa, nl, rel_projections(sql, nl, NULL, 1, 
1));
+               nr = rel_project(sql->sa, nr, rel_projections(sql, nr, NULL, 1, 
1));
                l = rel_setop(sql->sa, nl, nr, op_union);
                l->flag = r->flag;
-               l->exps = list_merge(p, r->exps, (fdup)NULL);
+               l->exps = p; //list_merge(p, r->exps, (fdup)NULL);
+               assert(list_length(nl->exps) == list_length(nr->exps) && 
list_length(nl->exps) == list_length(l->exps));
                set_processed(l);
                rel_destroy(rel);
                (*changes)++;
@@ -8760,11 +8763,17 @@ rel_apply_rewrite(int *changes, mvc *sql
                        return l;
                } else { /* both unused */
                        int flag = rel->flag;
-                       list *exps = r->exps;
-
-                       assert(is_join(r->op));
-                       r = rel_crossproduct(sql->sa, rel_dup(r->l), 
rel_dup(r->r), flag == APPLY_LOJ?op_left:op_join);
-                       r->exps = exps_copy(sql->sa, exps);
+
+                       assert(is_join(r->op) || is_semi(r->op));
+                       if (is_join(r->op)) {
+                               list *exps = r->exps;
+
+                               r = rel_crossproduct(sql->sa, rel_dup(r->l), 
rel_dup(r->r), flag == APPLY_LOJ?op_left:op_join);
+                               r->exps = exps_copy(sql->sa, exps);
+                       } else if (is_semi(r->op)) {
+                               assert(flag != APPLY_LOJ);
+                               r = rel_dup(r);
+                       }
                        rel_destroy(rel);
                        (*changes)++;
                        return r;
diff --git a/sql/test/mergetables/Tests/All b/sql/test/mergetables/Tests/All
--- a/sql/test/mergetables/Tests/All
+++ b/sql/test/mergetables/Tests/All
@@ -28,4 +28,5 @@ HAVE_NETCDF?sqlsmith.Bug-6453
 HAVE_NETCDF&HAVE_SAMTOOLS?sqlsmith.Bug-6455
 HAVE_GEOM?sqlsmith.Bug-6459
 HAVE_NETCDF?sqlsmith-exist-lateral
+HAVE_NETCDF?sqlsmith-apply-outer-join-or
 mergedb_drop
diff --git a/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.sql 
b/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.sql
@@ -0,0 +1,44 @@
+select
+   cast(coalesce(ref_8.name,
+     cast(nullif(ref_7.column,
+       cast(null as clob)) as clob)) as clob) as c0,
+   ref_10.function_id as c1,
+   cast(coalesce(ref_6.action,
+     ref_6.id) as int) as c2
+from
+   sys.types as ref_0
+     left join sys.netcdf_attrs as ref_1
+       inner join sys.keys as ref_6
+         inner join sys.storagemodelinput as ref_7
+             left join sys.optimizers as ref_8
+               inner join sys.users as ref_9
+                 right join sys.systemfunctions as ref_10
+                 on (ref_9.default_schema = ref_10.function_id )
+               on (true)
+             on (ref_7.typewidth = ref_9.default_schema )
+           inner join sys.systemfunctions as ref_11
+           on (ref_9.default_schema = ref_11.function_id )
+         on (ref_6.action is NULL)
+       on (ref_6.action is not NULL)
+     on (ref_0.radix = ref_11.function_id )
+where EXISTS (
+   select
+       case when ref_8.name is NULL then ref_7.orderidx else ref_7.orderidx end
+          as c0
+     from
+       (select
+                 ref_8.def as c0,
+                 ref_9.fullname as c1
+               from
+                 sys.r2 as ref_12
+               where ref_11.function_id is NULL
+               limit 79) as subq_0
+           left join tmp._tables as ref_13
+             inner join sys.netcdf_vardim as ref_14
+             on (ref_14.dimpos is NULL)
+           on ((ref_1.att_type is not NULL)
+               or (ref_0.id is NULL))
+         inner join sys.netcdf_vardim as ref_15
+         on (ref_10.function_id is not NULL)
+     where ref_0.systemname is NULL)
+limit 77;
diff --git a/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.err 
b/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.err
@@ -0,0 +1,34 @@
+stderr of test 'sqlsmith-apply-outer-join-or` in directory 
'sql/test/mergetables` itself:
+
+
+# 13:26:58 >  
+# 13:26:58 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=39204" "--set" 
"mapi_usock=/var/tmp/mtest-12177/.s.monetdb.39204" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_mergetables"
+# 13:26:58 >  
+
+# builtin opt  gdk_dbpath = 
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 39204
+# cmdline opt  mapi_usock = /var/tmp/mtest-12177/.s.monetdb.39204
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_mergetables
+# cmdline opt  gdk_debug = 536870922
+
+# 13:26:58 >  
+# 13:26:58 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-12177" "--port=39204"
+# 13:26:58 >  
+
+
+# 13:26:58 >  
+# 13:26:58 >  "Done."
+# 13:26:58 >  
+
diff --git a/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.out 
b/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/sqlsmith-apply-outer-join-or.stable.out
@@ -0,0 +1,50 @@
+stdout of test 'sqlsmith-apply-outer-join-or` in directory 
'sql/test/mergetables` itself:
+
+
+# 13:26:58 >  
+# 13:26:58 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=39204" "--set" 
"mapi_usock=/var/tmp/mtest-12177/.s.monetdb.39204" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_mergetables"
+# 13:26:58 >  
+
+# MonetDB 5 server v11.27.6
+# This is an unreleased version
+# Serving database 'mTests_sql_test_mergetables', using 4 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 128bit integers
+# Found 7.330 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://localhost.nes.nl:39204/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-12177/.s.monetdb.39204
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+# 13:26:58 >  
+# 13:26:58 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-12177" "--port=39204"
+# 13:26:58 >  
+
+#select
+#   cast(coalesce(ref_8.name,
+#     cast(nullif(ref_7.column,
+#       cast(null as clob)) as clob)) as clob) as c0,
+#   ref_10.function_id as c1,
+#   cast(coalesce(ref_6.action,
+#     ref_6.id) as int) as c2
+#from
+#   sys.types as ref_0
+#     left join sys.netcdf_attrs as ref_1
+#       inner join sys.keys as ref_6
+#         inner join sys.storagemodelinput as ref_7
+#             left join sys.optimizers as ref_8
+#               inner join sys.users as ref_9
+#                 right join sys.systemfunctions as ref_10
+% .L36,        .L40,   .L43 # table_name
+% c0,  c1,     c2 # name
+% clob,        int,    int # type
+% 0,   1,      1 # length
+
+# 13:26:58 >  
+# 13:26:58 >  "Done."
+# 13:26:58 >  
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to