Changeset: 8bee425c19c3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8bee425c19c3
Added Files:
        sql/test/BugTracker-2015/Tests/null_is_null.Bug-3739.sql
        sql/test/BugTracker-2015/Tests/null_is_null.Bug-3739.stable.err
        sql/test/BugTracker-2015/Tests/null_is_null.Bug-3739.stable.out
Modified Files:
        clients/Tests/SQL-dump.stable.out.int128
        gdk/gdk_select.c
        monetdb5/modules/kernel/algebra.c
        sql/backends/monet5/generator/generator.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_gencode.c
        sql/benchmarks/ssbm/Tests/01-explain.stable.out
        sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/02-explain.stable.out
        sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/03-explain.stable.out
        sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/04-explain.stable.out
        sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/05-explain.stable.out
        sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/06-explain.stable.out
        sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/07-explain.stable.out
        sql/benchmarks/ssbm/Tests/07-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/08-explain.stable.out
        sql/benchmarks/ssbm/Tests/08-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/09-explain.stable.out
        sql/benchmarks/ssbm/Tests/09-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/10-explain.stable.out
        sql/benchmarks/ssbm/Tests/10-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/11-explain.stable.out
        sql/benchmarks/ssbm/Tests/11-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/12-explain.stable.out
        sql/benchmarks/ssbm/Tests/12-explain.stable.out.int128
        sql/benchmarks/ssbm/Tests/13-explain.stable.out
        sql/benchmarks/ssbm/Tests/13-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/02-explain.stable.out
        sql/benchmarks/tpch/Tests/03-explain.stable.out
        sql/benchmarks/tpch/Tests/03-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/05-explain.stable.out
        sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit
        sql/benchmarks/tpch/Tests/05-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/07-explain.stable.out
        sql/benchmarks/tpch/Tests/07-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/08-explain.stable.out
        sql/benchmarks/tpch/Tests/08-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/10-explain.stable.out
        sql/benchmarks/tpch/Tests/10-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/11-explain.stable.out
        sql/benchmarks/tpch/Tests/11-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/12-explain.stable.out
        sql/benchmarks/tpch/Tests/12-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/16-explain.stable.out
        sql/benchmarks/tpch/Tests/16-explain.stable.out.32bit
        sql/benchmarks/tpch/Tests/17-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/19-explain.stable.out
        sql/benchmarks/tpch/Tests/19-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/20-explain.stable.out
        sql/benchmarks/tpch/Tests/20-explain.stable.out.32bit
        sql/benchmarks/tpch/Tests/20-explain.stable.out.int128
        sql/benchmarks/tpch/Tests/21-explain.stable.out
        sql/benchmarks/tpch/Tests/21-explain.stable.out.32bit
        sql/benchmarks/tpch/Tests/22-explain.stable.out
        sql/benchmarks/tpch/Tests/22-explain.stable.out.32bit
        sql/benchmarks/tpch/Tests/22-explain.stable.out.int128
        sql/server/rel_optimizer.c
        sql/storage/bat/bat_table.c
        sql/test/BugDay_2005-10-06_2.9.3/Tests/max_min_sum_null.SF-1123132.sql
        sql/test/BugTracker-2015/Tests/All
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out.int128
        sql/test/leaks/Tests/check1.stable.out.int128
        sql/test/leaks/Tests/check2.stable.out.int128
        sql/test/leaks/Tests/check3.stable.out.int128
        sql/test/leaks/Tests/check4.stable.out.int128
        sql/test/leaks/Tests/check5.stable.out.int128
Branch: Jul2015
Log Message:

fixed bug handling nulls (see bug 3739). Null != Null semantics are needed
in the 'in' handling.


diffs (truncated from 2712 to 300 lines):

diff --git a/clients/Tests/SQL-dump.stable.out.int128 
b/clients/Tests/SQL-dump.stable.out.int128
--- a/clients/Tests/SQL-dump.stable.out.int128
+++ b/clients/Tests/SQL-dump.stable.out.int128
@@ -6140,7 +6140,7 @@ CREATE TABLE "sys"."dependencies" (
        "depend_id"   INTEGER,
        "depend_type" SMALLINT
 );
-COPY 238 RECORDS INTO "sys"."dependencies" FROM stdin USING DELIMITERS 
'\t','\n','"';
+COPY 240 RECORDS INTO "sys"."dependencies" FROM stdin USING DELIMITERS 
'\t','\n','"';
 418    5728    7
 417    5728    7
 1023   5728    7
@@ -6173,6 +6173,7 @@ 2086      6041    7
 2090   6041    7
 2083   6041    7
 2079   6041    7
+36     6041    7
 5659   6046    7
 2047   6046    7
 2046   6046    7
@@ -6225,6 +6226,7 @@ 2087      6071    7
 2103   6071    7
 2102   6071    7
 2104   6071    7
+36     6071    7
 33     6071    7
 32     6071    7
 34     6071    7
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1270,13 +1270,14 @@ BATsubselect(BAT *b, BAT *s, const void 
        equi = th == NULL || (lval && ATOMcmp(t, tl, th) == 0); /* point 
select? */
        if (equi) {
                assert(lval);
-               if (th == NULL)
-                       hi = li;
+               hi = li;
                th = tl;
                hval = 1;
        } else {
                hval = ATOMcmp(t, th, nil) != 0;
        }
+       if (!equi && !lval && !hval && lnil) 
+               anti = !anti;
        if (anti) {
                if (lval != hval) {
                        /* one of the end points is nil and the other
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -26,16 +26,16 @@
  * and we have to de-reference them before entering the gdk library.
  * This calls for knowlegde on the underlying BAT typs`s
  */
-#define derefStr(b, s, v)                                                      
\
-               do {                                                            
                \
-                       int _tpe= ATOMstorage((b)->s##type);    \
-                       if (_tpe >= TYPE_str) {                                 
\
-                               if ((v) == 0 || *(str*) (v) == 0)       \
-                                       (v) = (str) str_nil;                    
\
-                               else                                            
                \
-                                       (v) = *(str *) (v);                     
        \
-                       }                                                       
                        \
-               } while (0)
+#define derefStr(b, s, v)                                      \
+       do {                                                    \
+               int _tpe= ATOMstorage((b)->s##type);            \
+               if (_tpe >= TYPE_str) {                         \
+                       if ((v) == 0 || *(str*) (v) == 0)       \
+                               (v) = (str) str_nil;            \
+                       else                                    \
+                               (v) = *(str *) (v);             \
+               }                                               \
+       } while (0)
 
 #include "monetdb_config.h"
 #include "algebra.h"
@@ -433,23 +433,26 @@ str
 ALGselectNotNil(bat *result, const bat *bid)
 {
        BAT *b, *bn = NULL;
-       ptr low,high;
-       bit bound=FALSE;
 
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, "algebra.selectNotNil", RUNTIME_OBJECT_MISSING);
 
        if( BATcount_no_nil(b) != BATcount(b) ){
-               low=high= ATOMnilptr(b->ttype);
-               CMDselect_(&bn, b, low, high, &bound, &bound);
+               BAT *s = NULL;
+               ptr low = ATOMnilptr(b->ttype);
+
+               s = BATsubselect(b, s, low, NULL, TRUE, TRUE, TRUE);
+               if (s) {
+                       bn = BATproject(s, b);
+                       BBPunfix(s->batCacheid);
+               }
+               BBPunfix(b->batCacheid);
                if (bn) {
                        if (!(bn->batDirty&2)) BATsetaccess(bn, BAT_READ);
                        *result = bn->batCacheid;
                        BBPkeepref(*result);
-                       BBPunfix(b->batCacheid);
                        return MAL_SUCCEED;
                }
-               BBPunfix(b->batCacheid);
                throw(MAL, "algebra.selectNotNil", GDK_EXCEPTION);
        }
        /* just pass on the result */
@@ -1677,6 +1680,11 @@ ALGslice_oid(bat *ret, const bat *bid, c
 {
        BAT *b, *bv;
 
+       if (*start == oid_nil && end && *end == oid_nil) {
+               *ret = *bid;
+               BBPincref(*ret, TRUE);
+               return MAL_SUCCEED;
+       }
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, "algebra.slice", RUNTIME_OBJECT_MISSING);
 
diff --git a/sql/backends/monet5/generator/generator.c 
b/sql/backends/monet5/generator/generator.c
--- a/sql/backends/monet5/generator/generator.c
+++ b/sql/backends/monet5/generator/generator.c
@@ -236,6 +236,8 @@ findGeneratorDefinition(MalBlkPtr mb, In
                low = * getArgReference_##TPE(stk, pci, i);             \
                hgh = * getArgReference_##TPE(stk, pci, i + 1); \
                                                                        \
+               if (low == hgh && low != TPE##_nil)                     \
+                       hi = li;                                        \
                if (low == TPE##_nil && hgh == TPE##_nil) {             \
                        if (li && hi && !anti) {                        \
                                /* match NILs (of which there aren't */ \
@@ -359,6 +361,10 @@ VLTgenerator_subselect(Client cntxt, Mal
                        tlow = *getArgReference_TYPE(stk,pci,i, timestamp);
                        thgh = *getArgReference_TYPE(stk,pci,i+1, timestamp);
 
+                       if (tlow.msecs == thgh.msecs &&
+                           tlow.days == thgh.days &&
+                           !timestamp_isnil(tlow))
+                               hi = li;
                        if( hi && !timestamp_isnil(thgh) )
                                thgh.msecs++;
                        if( !li && !timestamp_isnil(tlow) )
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2852,6 +2852,15 @@ stmt_selectnonil( mvc *sql, stmt *col, s
 }
 
 static stmt *
+stmt_selectnil( mvc *sql, stmt *col)
+{
+       sql_subtype *t = tail_type(col);
+       stmt *n = stmt_atom(sql->sa, atom_general(sql->sa, t, NULL));
+       stmt *nn = stmt_uselect2(sql->sa, col, n, n, 3, NULL);
+       return nn;
+}
+
+static stmt *
 insert_check_ukey(mvc *sql, list *inserts, sql_key *k, stmt *idx_inserts)
 {
 /* pkey's cannot have NULLs, ukeys however can
@@ -3111,8 +3120,7 @@ sql_insert_check_null(mvc *sql, sql_tabl
                        char *msg = NULL;
 
                        if (!(s->key && s->nrcols == 0)) {
-                               s = stmt_atom(sql->sa, atom_general(sql->sa, 
&c->type, NULL));
-                               s = stmt_uselect(sql->sa, i->op1, s, cmp_equal, 
NULL);
+                               s = stmt_selectnil(sql, i->op1);
                                s = stmt_aggr(sql->sa, s, NULL, NULL, cnt, 1, 
0);
                        } else {
                                sql_subfunc *isnil = sql_bind_func(sql->sa, 
sql->session->schema, "isnull", &c->type, NULL, F_FUNC);
@@ -3531,9 +3539,7 @@ join_updated_pkey(mvc *sql, sql_key * k,
                        upd = stmt_project(sql->sa, upd, stmt_col(sql, c->c, 
dels));
                }
                if (c->c->null) {       /* new nulls (MATCH SIMPLE) */
-                       stmt *nn = upd;
-
-                       nn = stmt_uselect(sql->sa, nn, stmt_atom(sql->sa, 
atom_general(sql->sa, &c->c->type, NULL)), cmp_equal, NULL);
+                       stmt *nn = stmt_selectnil(sql, upd);
                        if (null)
                                null = stmt_tunion(sql->sa, null, nn);
                        else
@@ -3828,9 +3834,7 @@ join_idx_update(mvc *sql, sql_idx * i, s
                /* FOR MATCH FULL/SIMPLE/PARTIAL see above */
                /* Currently only the default MATCH SIMPLE is supported */
                if (c->c->null) {
-                       stmt *nn = upd;
-
-                       nn = stmt_uselect(sql->sa, nn, stmt_atom(sql->sa, 
atom_general(sql->sa, &c->c->type, NULL)), cmp_equal, NULL);
+                       stmt *nn = stmt_selectnil(sql, upd);
                        if (null)
                                null = stmt_tunion(sql->sa, null, nn);
                        else
@@ -3968,8 +3972,7 @@ sql_update_check_null(mvc *sql, sql_tabl
                        char *msg = NULL;
 
                        if (!(s->key && s->nrcols == 0)) {
-                               s = stmt_atom(sql->sa, atom_general(sql->sa, 
&c->type, NULL));
-                               s = stmt_uselect(sql->sa, 
updates[c->colnr]->op2, s, cmp_equal, NULL);
+                               s = stmt_selectnil(sql, updates[c->colnr]->op2);
                                s = stmt_aggr(sql->sa, s, NULL, NULL, cnt, 1, 
0);
                        } else {
                                sql_subfunc *isnil = sql_bind_func(sql->sa, 
sql->session->schema, "isnull", &c->type, NULL, F_FUNC);
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1410,7 +1410,7 @@ static int
                                        q = pushArgument(mb, q, r);
                                        q = pushArgument(mb, q, r);
                                        q = pushBit(mb, q, TRUE);
-                                       q = pushBit(mb, q, TRUE);
+                                       q = pushBit(mb, q, FALSE);
                                        q = pushBit(mb, q, FALSE);
                                        if (q == NULL)
                                                return -1;
diff --git a/sql/benchmarks/ssbm/Tests/01-explain.stable.out 
b/sql/benchmarks/ssbm/Tests/01-explain.stable.out
--- a/sql/benchmarks/ssbm/Tests/01-explain.stable.out
+++ b/sql/benchmarks/ssbm/Tests/01-explain.stable.out
@@ -61,11 +61,11 @@ function user.s2_1{autoCommit=true}(A0:i
     X_32 := sql.projectdelta(X_25,X_27,X_29,r1_36,X_31);
     X_36:bat[:oid,:int]  := sql.bind(X_6,"sys","dwdate","d_year",0);
     X_33:bat[:oid,:oid]  := sql.tid(X_6,"sys","dwdate");
-    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,true,false);
+    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,false,false);
     (X_39,r1_48) := sql.bind(X_6,"sys","dwdate","d_year",2);
-    X_100 := algebra.subselect(r1_48,nil:bat[:oid,:oid],A0,A0,true,true,false);
+    X_100 := 
algebra.subselect(r1_48,nil:bat[:oid,:oid],A0,A0,true,false,false);
     X_42:bat[:oid,:int]  := sql.bind(X_6,"sys","dwdate","d_year",1);
-    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,true,false);
+    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,false,false);
     X_44 := sql.subdelta(X_99,X_33,X_39,X_100,X_102);
     X_46 := X_44;
     (X_47,r1_59) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,false,nil:lng);
diff --git a/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128
@@ -61,11 +61,11 @@ function user.s2_1{autoCommit=true}(A0:i
     X_32 := sql.projectdelta(X_25,X_27,X_29,r1_36,X_31);
     X_36:bat[:oid,:int]  := sql.bind(X_6,"sys","dwdate","d_year",0);
     X_33:bat[:oid,:oid]  := sql.tid(X_6,"sys","dwdate");
-    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,true,false);
+    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,false,false);
     (X_39,r1_48) := sql.bind(X_6,"sys","dwdate","d_year",2);
-    X_100 := algebra.subselect(r1_48,nil:bat[:oid,:oid],A0,A0,true,true,false);
+    X_100 := 
algebra.subselect(r1_48,nil:bat[:oid,:oid],A0,A0,true,false,false);
     X_42:bat[:oid,:int]  := sql.bind(X_6,"sys","dwdate","d_year",1);
-    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,true,false);
+    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,false,false);
     X_44 := sql.subdelta(X_99,X_33,X_39,X_100,X_102);
     X_46 := X_44;
     (X_47,r1_59) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,false,nil:lng);
diff --git a/sql/benchmarks/ssbm/Tests/02-explain.stable.out 
b/sql/benchmarks/ssbm/Tests/02-explain.stable.out
--- a/sql/benchmarks/ssbm/Tests/02-explain.stable.out
+++ b/sql/benchmarks/ssbm/Tests/02-explain.stable.out
@@ -61,11 +61,11 @@ function user.s2_1{autoCommit=true}(A0:i
     X_32 := sql.projectdelta(X_26,X_27,X_29,r1_37,X_31);
     X_36:bat[:oid,:int]  := sql.bind(X_7,"sys","dwdate","d_yearmonthnum",0);
     X_33:bat[:oid,:oid]  := sql.tid(X_7,"sys","dwdate");
-    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,true,false);
+    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,false,false);
     (X_39,r1_49) := sql.bind(X_7,"sys","dwdate","d_yearmonthnum",2);
-    X_100 := algebra.subselect(r1_49,nil:bat[:oid,:oid],A0,A0,true,true,false);
+    X_100 := 
algebra.subselect(r1_49,nil:bat[:oid,:oid],A0,A0,true,false,false);
     X_42:bat[:oid,:int]  := sql.bind(X_7,"sys","dwdate","d_yearmonthnum",1);
-    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,true,false);
+    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,false,false);
     X_44 := sql.subdelta(X_99,X_33,X_39,X_100,X_102);
     X_46 := X_44;
     (X_47,r1_60) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,false,nil:lng);
diff --git a/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128 
b/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
--- a/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
+++ b/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128
@@ -61,11 +61,11 @@ function user.s2_1{autoCommit=true}(A0:i
     X_32 := sql.projectdelta(X_26,X_27,X_29,r1_37,X_31);
     X_36:bat[:oid,:int]  := sql.bind(X_7,"sys","dwdate","d_yearmonthnum",0);
     X_33:bat[:oid,:oid]  := sql.tid(X_7,"sys","dwdate");
-    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,true,false);
+    X_99 := algebra.subselect(X_36,X_33,A0,A0,true,false,false);
     (X_39,r1_49) := sql.bind(X_7,"sys","dwdate","d_yearmonthnum",2);
-    X_100 := algebra.subselect(r1_49,nil:bat[:oid,:oid],A0,A0,true,true,false);
+    X_100 := 
algebra.subselect(r1_49,nil:bat[:oid,:oid],A0,A0,true,false,false);
     X_42:bat[:oid,:int]  := sql.bind(X_7,"sys","dwdate","d_yearmonthnum",1);
-    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,true,false);
+    X_102 := algebra.subselect(X_42,X_33,A0,A0,true,false,false);
     X_44 := sql.subdelta(X_99,X_33,X_39,X_100,X_102);
     X_46 := X_44;
     (X_47,r1_60) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,false,nil:lng);
diff --git a/sql/benchmarks/ssbm/Tests/03-explain.stable.out 
b/sql/benchmarks/ssbm/Tests/03-explain.stable.out
--- a/sql/benchmarks/ssbm/Tests/03-explain.stable.out
+++ b/sql/benchmarks/ssbm/Tests/03-explain.stable.out
@@ -62,17 +62,17 @@ function user.s2_1{autoCommit=true}(A0:i
     X_37:bat[:oid,:int]  := sql.bind(X_8,"sys","dwdate","d_weeknuminyear",0);
     X_45:bat[:oid,:int]  := sql.bind(X_8,"sys","dwdate","d_year",0);
     X_34:bat[:oid,:oid]  := sql.tid(X_8,"sys","dwdate");
-    X_109 := algebra.subselect(X_45,X_34,A1,A1,true,true,false);
+    X_109 := algebra.subselect(X_45,X_34,A1,A1,true,false,false);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to