Changeset: a3a06432dc17 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a3a06432dc17
Added Files:
sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.sql
sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.err
sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.out
sql/test/BugTracker-2017/Tests/sqlitelogictest-not-between.Bug-6497.stable.err
sql/test/BugTracker-2017/Tests/sqlitelogictest-not-between.Bug-6497.stable.out
Modified Files:
sql/backends/monet5/sql_statement.c
sql/common/sql_types.c
sql/server/rel_select.c
sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
sql/test/BugTracker-2016/Tests/select-in-from.Bug-6121.stable.out
sql/test/BugTracker-2017/Tests/All
sql/test/BugTracker-2017/Tests/sqlitelogictest-select-in-column.Bug-6490.stable.out
sql/test/BugTracker-2017/Tests/sqllitelogistest_case.Bug-6335.stable.err
sql/test/BugTracker-2017/Tests/sqllitelogistest_case.Bug-6335.stable.out
sql/test/mapi/Tests/sql_int128.stable.out.int128
sql/test/remote/Tests/partition_elim.stable.out
Branch: Jul2017
Log Message:
fixes for bug 6491 (select returns null)
bug 6497 (incorrect not between)
bug 6490 (handle multiple columns in in in selection)
fixed type checking, allowed more equal types (int with 17 bits equals one with
31 etc)
diffs (truncated from 731 to 300 lines):
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1570,7 +1570,7 @@ select2_join2(backend *be, stmt *op1, st
q = pushBit(mb, q, TRUE);
q = pushBit(mb, q, TRUE);
q = pushBit(mb, q, TRUE);
- q = pushBit(mb, q, FALSE);
+ q = pushBit(mb, q, (anti)?TRUE:FALSE);
if (q == NULL)
return NULL;
} else {
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -350,8 +350,9 @@ subtype_cmp(sql_subtype *t1, sql_subtype
{
if (!t1->type || !t2->type)
return -1;
+
if ( !(t1->type->eclass == t2->type->eclass &&
- EC_INTERVAL(t1->type->eclass)) &&
+ (EC_INTERVAL(t1->type->eclass) || t1->type->eclass == EC_NUM)) &&
(t1->digits != t2->digits ||
(!(t1->type->eclass == t2->type->eclass &&
t1->type->eclass == EC_FLT) &&
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2132,7 +2132,7 @@ rel_logical_value_exp(mvc *sql, sql_rel
if (l)
st = exp_subtype(l);
}
- if (l && !r && !n->next) { /* possibly a (not)
in function call */
+ if (l && !r) { /* possibly a (not) in function
call */
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
@@ -2140,23 +2140,17 @@ rel_logical_value_exp(mvc *sql, sql_rel
z = left;
r = rel_value_exp(sql, &z, sval, f,
ek);
if (z == left && r) {
- sql_subfunc *f = NULL;
-
- l = rel_check_type(sql,
exp_subtype(r), l, type_equal);
- if (!l)
- return NULL;
- f = sql_bind_func(sql->sa,
sql->session->schema, "=", exp_subtype(l), exp_subtype(r), F_FUNC);
- if (f)
- l = exp_binop(sql->sa,
l, r, f);
- if (f && l && sc->token ==
SQL_NOT_IN) {
- f =
sql_bind_func(sql->sa, sql->session->schema, "not", exp_subtype(l), NULL,
F_FUNC);
- return
exp_unop(sql->sa, l, f);
- } else if (f && l && sc->token
== SQL_IN) {
- return l;
+ if (l && r &&
IS_ANY(st->type->eclass)){
+ l = rel_check_type(sql,
exp_subtype(r), l, type_equal);
+ if (l)
+ st =
exp_subtype(l);
+ else
+ return NULL;
}
-
- }
- r = NULL;
+ z = NULL;
+ } else {
+ r = NULL;
+ }
}
if (!l || !r || !(r=rel_check_type(sql, st, r,
type_equal))) {
rel_destroy(right);
@@ -2220,7 +2214,11 @@ rel_logical_value_exp(mvc *sql, sql_rel
reset_processed(left);
} else
*rel = left;
- if (sc->token == SQL_NOT_IN)
+ if (f == sql_sel) {
+ e = rel_unop_(sql, r, NULL, "isnull",
card_value);
+ if (sc->token == SQL_IN)
+ e = rel_unop_(sql, e, NULL, "not",
card_value);
+ } else if (sc->token == SQL_NOT_IN)
e = rel_binop_(sql, l, r, NULL, "<>",
card_value);
else
e = rel_binop_(sql, l, r, NULL, "=",
card_value);
diff --git
a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
---
a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
+++
b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
@@ -21,8 +21,8 @@ Ready.
# 16:24:01 >
#debug select * from tables;
-mdb>#X_1=0@0:void := querylog.define("debug select * from tables;",
"sequential_pipe", 191:int);
-mdb>#X_160=nil:bat[:int] := bat.new(nil:int);
+mdb>#X_1=0@0:void := querylog.define("debug select * from tables;",
"sequential_pipe", 190:int);
+mdb>#X_159=nil:bat[:int] := bat.new(nil:int);
# 16:24:01 >
# 16:24:01 > "Done."
diff --git a/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
b/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
--- a/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
+++ b/sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
@@ -129,12 +129,12 @@ end user.s4_1;
% clob # type
% 202 # length
function user.s6_1():void;
- X_4:void := querylog.define("explain select replace(a1,a2,a3), id\nfrom
(\n select name as a1, \\'a\\' as a2, \\'A\\' as a3, id + 1 as id \n from
sys.functions\n) as x;", "sequential_pipe", 41:int);
- X_43 := bat.new(nil:str);
- X_49 := bat.new(nil:int);
- X_47 := bat.new(nil:int);
- X_46 := bat.new(nil:str);
+ X_4:void := querylog.define("explain select replace(a1,a2,a3), id\nfrom
(\n select name as a1, \\'a\\' as a2, \\'A\\' as a3, id + 1 as id \n from
sys.functions\n) as x;", "sequential_pipe", 40:int);
+ X_42 := bat.new(nil:str);
+ X_48 := bat.new(nil:int);
+ X_46 := bat.new(nil:int);
X_45 := bat.new(nil:str);
+ X_44 := bat.new(nil:str);
X_7 := sql.mvc();
C_8:bat[:oid] := sql.tid(X_7, "sys", "functions");
X_21:bat[:str] := sql.bind(X_7, "sys", "functions", "name", 0:int);
@@ -149,20 +149,20 @@ function user.s6_1():void;
X_20 := algebra.projection(C_8, X_19);
X_29 := algebra.project(X_20, "a");
X_31 := algebra.project(X_20, "A");
- X_39:bat[:str] := mal.manifold("str", "replace", X_27, X_29, X_31);
+ X_38:bat[:str] := mal.manifold("str", "replace", X_27, X_29, X_31);
X_32 := batcalc.lng(X_20);
- X_36:bat[:lng] := batcalc.+(X_32, 1:lng);
- X_50 := bat.append(X_43, "sys.L12");
- X_52 := bat.append(X_45, "L12");
- X_54 := bat.append(X_46, "varchar");
- X_56 := bat.append(X_47, 0:int);
- X_58 := bat.append(X_49, 0:int);
- X_59 := bat.append(X_50, "sys.x");
- X_61 := bat.append(X_52, "id");
- X_63 := bat.append(X_54, "bigint");
- X_65 := bat.append(X_56, 64:int);
- X_67 := bat.append(X_58, 0:int);
- sql.resultSet(X_59, X_61, X_63, X_65, X_67, X_39, X_36);
+ X_35:bat[:lng] := batcalc.+(X_32, 1:lng);
+ X_49 := bat.append(X_42, "sys.L12");
+ X_51 := bat.append(X_44, "L12");
+ X_53 := bat.append(X_45, "varchar");
+ X_55 := bat.append(X_46, 0:int);
+ X_57 := bat.append(X_48, 0:int);
+ X_58 := bat.append(X_49, "sys.x");
+ X_60 := bat.append(X_51, "id");
+ X_62 := bat.append(X_53, "bigint");
+ X_64 := bat.append(X_55, 64:int);
+ X_66 := bat.append(X_57, 0:int);
+ sql.resultSet(X_58, X_60, X_62, X_64, X_66, X_38, X_35);
end user.s6_1;
#inline actions= 0 time=3 usec
#candidates actions= 1 time=23 usec
diff --git a/sql/test/BugTracker-2016/Tests/select-in-from.Bug-6121.stable.out
b/sql/test/BugTracker-2016/Tests/select-in-from.Bug-6121.stable.out
--- a/sql/test/BugTracker-2016/Tests/select-in-from.Bug-6121.stable.out
+++ b/sql/test/BugTracker-2016/Tests/select-in-from.Bug-6121.stable.out
@@ -88,9 +88,9 @@ Ready.
% 5 # length
[ true ]
[ true ]
-[ NULL ]
-[ NULL ]
-[ NULL ]
+[ false ]
+[ false ]
+[ false ]
#SELECT ( CASE WHEN ( table_one.this_column IN ( SELECT this_column FROM
table_two ) ) THEN 1 ELSE 0 END ) AS new_column FROM table_one;
% .L5 # table_name
% new_column # name
@@ -163,7 +163,7 @@ Ready.
#UNION ALL
#SELECT COUNT(*) AS count, 0 AS new_column FROM table_one
# WHERE this_column NOT IN (SELECT this_column FROM table_two);
-% .L37, .L37 # table_name
+% .L31, .L31 # table_name
% count, new_column # name
% bigint, tinyint # type
% 1, 1 # length
@@ -189,8 +189,8 @@ Ready.
# except
# (select this_column from table_two)
#) as "missing";
-% .L36, .L36 # table_name
-% count, L15 # name
+% .L41, .L41 # table_name
+% count, L16 # name
% bigint, tinyint # type
% 1, 1 # length
[ 2, 1 ]
diff --git a/sql/test/BugTracker-2017/Tests/All
b/sql/test/BugTracker-2017/Tests/All
--- a/sql/test/BugTracker-2017/Tests/All
+++ b/sql/test/BugTracker-2017/Tests/All
@@ -101,6 +101,7 @@ crash-in-topn.Bug-6478
function-resolution.Bug-6436
generate-resolution.Bug-6471
sqlitelogictest-select-in-column.Bug-6490
+select-in-returns-null.Bug-6491
sqlitelogictest-min-distinct-empty-table.Bug-6493
sqlitelogictest-algebra-operators.Bug-6494
sqlitelogictest-hidden-alias.Bug-6495
diff --git a/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.sql
b/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.sql
@@ -0,0 +1,9 @@
+CREATE TABLE t(i INT);
+INSERT INTO t VALUES (1), (2), (3);
+
+SELECT 1 IN (SELECT i FROM t);
+-- expect true
+
+SELECT 4 IN (SELECT i FROM t);
+-- expect false, got null
+drop table t;
diff --git
a/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.err
b/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.err
@@ -0,0 +1,34 @@
+stderr of test 'select-in-returns-null.Bug-6491` in directory
'sql/test/BugTracker-2017` itself:
+
+
+# 11:53:37 >
+# 11:53:37 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=36593" "--set"
"mapi_usock=/var/tmp/mtest-3679/.s.monetdb.36593" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017"
+# 11:53:37 >
+
+# 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 = 36593
+# cmdline opt mapi_usock = /var/tmp/mtest-3679/.s.monetdb.36593
+# cmdline opt monet_prompt =
+# cmdline opt gdk_dbpath =
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017
+# cmdline opt gdk_debug = 553648138
+
+# 11:53:38 >
+# 11:53:38 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-3679" "--port=36593"
+# 11:53:38 >
+
+
+# 11:53:38 >
+# 11:53:38 > "Done."
+# 11:53:38 >
+
diff --git
a/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.out
b/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2017/Tests/select-in-returns-null.Bug-6491.stable.out
@@ -0,0 +1,47 @@
+stdout of test 'select-in-returns-null.Bug-6491` in directory
'sql/test/BugTracker-2017` itself:
+
+
+# 11:53:37 >
+# 11:53:37 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=36593" "--set"
"mapi_usock=/var/tmp/mtest-3679/.s.monetdb.36593" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017"
+# 11:53:37 >
+
+# MonetDB 5 server v11.27.6
+# This is an unreleased version
+# Serving database 'mTests_sql_test_BugTracker-2017', 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:36593/
+# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-3679/.s.monetdb.36593
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+# 11:53:38 >
+# 11:53:38 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-3679" "--port=36593"
+# 11:53:38 >
+
+#CREATE TABLE t(i INT);
+#INSERT INTO t VALUES (1), (2), (3);
+[ 3 ]
+#SELECT 1 IN (SELECT i FROM t);
+% .L5 # table_name
+% L5 # name
+% boolean # type
+% 5 # length
+[ true ]
+#SELECT 4 IN (SELECT i FROM t);
+% .L5 # table_name
+% L5 # name
+% boolean # type
+% 5 # length
+[ false ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list