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