Changeset: 75fc8583de89 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=75fc8583de89
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/test/SQLancer/Tests/sqlancer03.sql
        sql/test/SQLancer/Tests/sqlancer03.stable.out
Branch: default
Log Message:

Merged with Jun2020


diffs (101 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
@@ -7537,18 +7537,27 @@ rel_simplify_predicates(visitor *v, sql_
                                                e->l = ie;
                                        } else if (is_atom(r->type) && r->l) { 
/* direct literal */
                                                atom *a = r->l;
-                                               int flag = a->data.val.bval;
-
-                                               assert(list_length(args) == 1);
-                                               l = args->h->data;
-                                               if (exp_subtype(l)) {
-                                                       r = 
exp_atom(v->sql->sa, atom_general(v->sql->sa, exp_subtype(l), NULL));
-                                                       e = 
exp_compare(v->sql->sa, l, r, e->flag);
-                                                       if (e && !flag)
-                                                               set_anti(e);
-                                                       if (e)
-                                                               
set_semantics(e);
+
+                                               if (a->isnull) {
+                                                       if (is_semantics(e)) /* 
isnull(x) = NULL -> false, isnull(x) <> NULL -> true */
+                                                               e = 
exp_atom_bool(v->sql->sa, e->flag == cmp_notequal);
+                                                       else /* always NULL */
+                                                               e = 
exp_null(v->sql->sa, sql_bind_localtype("bit"));
                                                        v->changes++;
+                                               } else {
+                                                       int flag = 
a->data.val.bval;
+
+                                                       
assert(list_length(args) == 1);
+                                                       l = args->h->data;
+                                                       if (exp_subtype(l)) {
+                                                               r = 
exp_atom(v->sql->sa, atom_general(v->sql->sa, exp_subtype(l), NULL));
+                                                               e = 
exp_compare(v->sql->sa, l, r, e->flag);
+                                                               if (e && !flag)
+                                                                       
set_anti(e);
+                                                               if (e)
+                                                                       
set_semantics(e);
+                                                               v->changes++;
+                                                       }
                                                }
                                        }
                                } else if (!f->func->s && is_not_func(f)) {
diff --git a/sql/test/SQLancer/Tests/sqlancer03.sql 
b/sql/test/SQLancer/Tests/sqlancer03.sql
--- a/sql/test/SQLancer/Tests/sqlancer03.sql
+++ b/sql/test/SQLancer/Tests/sqlancer03.sql
@@ -1,1 +1,17 @@
 select splitpart(r'%Fz晟2墁', '', 1), splitpart(r'%Fz晟2墁', r'', 2), 
splitpart(r'%Fz晟2墁', r'', 1271186887);
+
+START TRANSACTION; -- Bug 6916
+CREATE TABLE "t0" ("c0" BOOLEAN NOT NULL,"c1" SMALLINT NOT NULL,CONSTRAINT 
"t0_c0_c1_pkey" PRIMARY KEY ("c0", "c1"));
+INSERT INTO "t0" VALUES (false, -1);
+create view v0(c0, c1, c2, c3) as (select 
((t0.c1)<<(cast(0.09114074486978418487836961503489874303340911865234375 as 
int))), 0.4088967652609865, 
0.3848869389602949109274732109042815864086151123046875, t0.c0 from t0 where 
t0.c0);
+
+SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0;
+       -- NULL
+SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0 WHERE 
(rtrim(((upper(''))||(v0.c1)))) IS NULL;
+       -- NULL
+SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0 WHERE NOT 
((rtrim(((upper(''))||(v0.c1)))) IS NULL);
+       -- empty
+SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0 WHERE 
((rtrim(((upper(''))||(v0.c1)))) IS NULL) IS NULL;
+       -- empty
+
+ROLLBACK;
diff --git a/sql/test/SQLancer/Tests/sqlancer03.stable.out 
b/sql/test/SQLancer/Tests/sqlancer03.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer03.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer03.stable.out
@@ -11,6 +11,34 @@ stdout of test 'sqlancer03` in directory
 % clob,        clob,   varchar # type
 % 9,   0,      0 # length
 [ "%Fz晟2墁",   "",     ""      ]
+#START TRANSACTION; -- Bug 6916
+#CREATE TABLE "t0" ("c0" BOOLEAN NOT NULL,"c1" SMALLINT NOT NULL,CONSTRAINT 
"t0_c0_c1_pkey" PRIMARY KEY ("c0", "c1"));
+#INSERT INTO "t0" VALUES (false, -1);
+[ 1    ]
+#create view v0(c0, c1, c2, c3) as (select 
((t0.c1)<<(cast(0.09114074486978418487836961503489874303340911865234375 as 
int))), 0.4088967652609865, 
0.3848869389602949109274732109042815864086151123046875, t0.c0 from t0 where 
t0.c0);
+#SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0;
+% .v0 # table_name
+% c0 # name
+% smallint # type
+% 1 # length
+[ NULL ]
+#SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0 WHERE 
(rtrim(((upper(''))||(v0.c1)))) IS NULL;
+% .v0 # table_name
+% c0 # name
+% smallint # type
+% 1 # length
+[ NULL ]
+#SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0 WHERE NOT 
((rtrim(((upper(''))||(v0.c1)))) IS NULL);
+% .v0 # table_name
+% c0 # name
+% smallint # type
+% 1 # length
+#SELECT v0.c0 FROM t0 FULL OUTER JOIN v0 ON t0.c0 WHERE 
((rtrim(((upper(''))||(v0.c1)))) IS NULL) IS NULL;
+% sys.v0 # table_name
+% c0 # name
+% smallint # type
+% 1 # length
+#ROLLBACK;
 
 # 17:14:16 >  
 # 17:14:16 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to