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