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

Reply via email to