Changeset: 21b467469899 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=21b467469899
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/SQLancer/Tests/sqlancer09.sql
        sql/test/SQLancer/Tests/sqlancer09.stable.out
Branch: Oct2020
Log Message:

If a projection doesn't have a left relation, create a new projection at 
rel_push_func_down, so the code generation doesn't screw up


diffs (86 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
@@ -1511,9 +1511,9 @@ rel_push_func_down(visitor *v, sql_rel *
 
                        /* we need a full projection, group by's and unions 
cannot be extended
                         * with more expressions */
-                       if (!is_simple_project(l->op))
+                       if (!is_simple_project(l->op) || !l->l)
                                rel->l = l = rel_project(v->sql->sa, l, 
rel_projections(v->sql, l, NULL, 1, 1));
-                       if (is_joinop(rel->op) && !is_simple_project(r->op))
+                       if (is_joinop(rel->op) && (!is_simple_project(r->op) || 
!r->l))
                                rel->r = r = rel_project(v->sql->sa, r, 
rel_projections(v->sql, r, NULL, 1, 1));
                        nrel = rel_project(v->sql->sa, rel, 
rel_projections(v->sql, rel, NULL, 1, 1));
 
@@ -1537,9 +1537,9 @@ rel_push_func_down(visitor *v, sql_rel *
                        sql_rel *l = pl->l, *r = pl->r;
                        list *nexps = new_exp_list(v->sql->sa);
 
-                       if (!is_simple_project(l->op))
+                       if (!is_simple_project(l->op) || !l->l)
                                pl->l = l = rel_project(v->sql->sa, l, 
rel_projections(v->sql, l, NULL, 1, 1));
-                       if (is_joinop(rel->op) && !is_simple_project(r->op))
+                       if (is_joinop(rel->op) && (!is_simple_project(r->op) || 
!r->l))
                                pl->r = r = rel_project(v->sql->sa, r, 
rel_projections(v->sql, r, NULL, 1, 1));
                        for (node *n = rel->exps->h; n; n = n->next) {
                                sql_exp *e = n->data;
diff --git a/sql/test/SQLancer/Tests/sqlancer09.sql 
b/sql/test/SQLancer/Tests/sqlancer09.sql
--- a/sql/test/SQLancer/Tests/sqlancer09.sql
+++ b/sql/test/SQLancer/Tests/sqlancer09.sql
@@ -228,12 +228,15 @@ nullif(0.322, 4.3)), 0.31),
 (abs(6363), -34)) with check option;
 create view v32(vc0, vc1) as (select distinct cast(((-4)*(-4)) as tinyint), 
coalesce(nullif(r'p', r'E]T'),
 sql_max(r'f)6_', r'.u'), cast(true as string(679)), case -3 when -5 then r'94' 
end)
-group by substr(r'FALSE', 6318585747));
+group by substr(r'FALSE', 2));
 
 select sum(all abs(interval '-27135172' second)) from v27 full outer join 
(select all scale_up(0.131, 12375.0)
-from v32 cross join (values (round(0.23, 24055))) as sub0
+from v32 cross join (values (round(0.23, 10))) as sub0
 where ((v32.vc0)=(0.32))) as sub0 on case 3 when
 case 21 when 12524 then -3 when r'1092027064' then 3692 else 18 end then case 
when true then true else true end
 when case when true then 0.33 end then (6363) not in (3,
 -3, v27.vc0, -3) end;
+
+create or replace view v27(vc0) as (values (4.3), (63));
+select 1 from v27 full outer join (select 1) as sub0 on case 3 when 0.33 then 
(2) in (v27.vc0, 9) end;
 ROLLBACK;
diff --git a/sql/test/SQLancer/Tests/sqlancer09.stable.out 
b/sql/test/SQLancer/Tests/sqlancer09.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer09.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer09.stable.out
@@ -234,6 +234,34 @@ stdout of test 'sqlancer09` in directory
 % 1 # length
 [ 0    ]
 #ROLLBACK;
+#START TRANSACTION;
+#create view v27(vc0, vc1) as (values (sql_max(case when false then -4 when 
false then 96 when true then 19491 end,
+#nullif(0.322, 4.3)), 0.31),
+#(abs(6363), -34)) with check option;
+#create view v32(vc0, vc1) as (select distinct cast(((-4)*(-4)) as tinyint), 
coalesce(nullif(r'p', r'E]T'),
+#sql_max(r'f)6_', r'.u'), cast(true as string(679)), case -3 when -5 then 
r'94' end)
+#group by substr(r'FALSE', 2));
+#select sum(all abs(interval '-27135172' second)) from v27 full outer join 
(select all scale_up(0.131, 12375.0)
+#from v32 cross join (values (round(0.23, 10))) as sub0
+#where ((v32.vc0)=(0.32))) as sub0 on case 3 when
+#case 21 when 12524 then -3 when r'1092027064' then 3692 else 18 end then case 
when true then true else true end
+#when case when true then 0.33 end then (6363) not in (3,
+#-3, v27.vc0, -3) end;
+% .%21 # table_name
+% %21 # name
+% sec_interval # type
+% 12 # length
+[ 54270344.000 ]
+#create or replace view v27(vc0) as (values (4.3), (63));
+#select 1 from v27 full outer join (select 1) as sub0 on case 3 when 0.33 then 
(2) in (v27.vc0, 9) end;
+% .%12 # table_name
+% %12 # name
+% tinyint # type
+% 1 # length
+[ 1    ]
+[ 1    ]
+[ 1    ]
+#ROLLBACK;
 
 # 14:35:03 >  
 # 14:35:03 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to