Changeset: 2a07f6ffc4c0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a07f6ffc4c0 Added Files: sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.stable.err sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.stable.out Removed Files: sql/test/BugTracker-2015/Tests/inf-nan-handling.Bug-3696.sql~ Modified Files: gdk/gdk_atoms.c sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit sql/server/rel_optimizer.c sql/test/BugTracker-2015/Tests/All Branch: default Log Message:
Merge with Oct2014 branch. diffs (truncated from 508 to 300 lines): diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -23,7 +23,13 @@ #include "monetdb_config.h" #include "gdk.h" #include "gdk_private.h" -#include <math.h> /* for INFINITY and NAN */ +#include <math.h> /* for isfinite macro */ +#ifdef HAVE_IEEEFP_H +#include <ieeefp.h> /* for Solaris */ +#ifndef isfinite +#define isfinite(f) finite(f) +#endif +#endif static int bteCmp(const bte *l, const bte *r) diff --git a/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit b/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit --- a/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit +++ b/sql/benchmarks/tpch/Tests/05-explain.stable.out.32bit @@ -21,183 +21,9 @@ stdout of test '05-explain` in directory Ready. -# 15:45:52 > -# 15:45:52 > "/usr/bin/python2" "05-explain.SQL.py" "05-explain" -# 15:45:52 > - -#set optimizer = 'sequential_pipe'; -#explain select -# n_name, -# sum(l_extendedprice * (1 - l_discount)) as revenue -#from -# customer, -# orders, -# lineitem, -# supplier, -# nation, -# region -#where -# c_custkey = o_custkey -# and l_orderkey = o_orderkey -# and l_suppkey = s_suppkey -# and c_nationkey = s_nationkey -# and s_nationkey = n_nationkey -# and n_regionkey = r_regionkey -# and r_name = 'ASIA' -# and o_orderdate >= date '1994-01-01' -# and o_orderdate < date '1994-01-01' + interval '1' year -#group by -# n_name -#order by -# revenue desc; -% .explain # table_name -% mal # name -% clob # type -% 571 # length -function user.s2_1{autoCommit=true}(A0:bte,A1:str,A2:date,A3:date,A4:int):void; - X_7 := sql.mvc(); - X_11:bat[:oid,:date] := sql.bind(X_7,"sys","orders","o_orderdate",0); - X_8:bat[:oid,:oid] := sql.tid(X_7,"sys","orders"); - X_19 := mtime.addmonths(A3,A4); - X_236 := algebra.subselect(X_11,X_8,A2,X_19,true,false,false); - (X_14,r1_14) := sql.bind(X_7,"sys","orders","o_orderdate",2); - X_237 := algebra.subselect(r1_14,A2,X_19,true,false,false); - X_17:bat[:oid,:date] := sql.bind(X_7,"sys","orders","o_orderdate",1); - X_238 := algebra.subselect(X_17,X_8,A2,X_19,true,false,false); - X_20 := sql.subdelta(X_236,X_8,X_14,X_237,X_238); - X_22:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","orders","orders_o_custkey_fkey",0); - (X_24,r1_29) := sql.bind_idxbat(X_7,"sys","orders","orders_o_custkey_fkey",2); - X_26:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","orders","orders_o_custkey_fkey",1); - X_27 := sql.projectdelta(X_20,X_22,X_24,r1_29,X_26); - X_28:bat[:oid,:oid] := sql.tid(X_7,"sys","customer"); - (X_30,r1_37) := algebra.join(X_27,X_28); - X_32 := X_20; - X_33 := algebra.leftfetchjoin(X_30,X_32); - X_34:bat[:oid,:oid] := sql.tid(X_7,"sys","lineitem"); - X_37:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","lineitem","lineitem_l_orderkey_fkey",0); - (X_40,r1_47) := sql.bind_idxbat(X_7,"sys","lineitem","lineitem_l_orderkey_fkey",2); - X_43:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","lineitem","lineitem_l_orderkey_fkey",1); - X_45 := sql.projectdelta(X_34,X_37,X_40,r1_47,X_43); - (X_46,r1_54) := algebra.join(X_33,X_45); - X_48:bat[:oid,:int] := sql.bind(X_7,"sys","lineitem","l_suppkey",0); - (X_50,r1_58) := sql.bind(X_7,"sys","lineitem","l_suppkey",2); - X_52:bat[:oid,:int] := sql.bind(X_7,"sys","lineitem","l_suppkey",1); - X_53 := sql.projectdelta(X_34,X_48,X_50,r1_58,X_52); - X_54 := algebra.leftfetchjoin(r1_54,X_53); - X_55:bat[:oid,:wrd] := batmkey.hash(X_54); - X_57:bat[:oid,:int] := sql.bind(X_7,"sys","customer","c_nationkey",0); - (X_60,r1_72) := sql.bind(X_7,"sys","customer","c_nationkey",2); - X_62:bat[:oid,:int] := sql.bind(X_7,"sys","customer","c_nationkey",1); - X_64 := sql.projectdelta(X_28,X_57,X_60,r1_72,X_62); - X_65:bat[:oid,:int] := algebra.leftfetchjoinPath(X_46,r1_37,X_64); - X_66:bat[:oid,:wrd] := mkey.bulk_rotate_xor_hash(X_55,22,X_65); - X_67:bat[:oid,:oid] := sql.tid(X_7,"sys","supplier"); - X_69:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_suppkey",0); - (X_72,r1_86) := sql.bind(X_7,"sys","supplier","s_suppkey",2); - X_75:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_suppkey",1); - X_77 := sql.projectdelta(X_67,X_69,X_72,r1_86,X_75); - X_78:bat[:oid,:wrd] := batmkey.hash(X_77); - X_79:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_nationkey",0); - (X_81,r1_97) := sql.bind(X_7,"sys","supplier","s_nationkey",2); - X_83:bat[:oid,:int] := sql.bind(X_7,"sys","supplier","s_nationkey",1); - X_84 := sql.projectdelta(X_67,X_79,X_81,r1_97,X_83); - X_85:bat[:oid,:wrd] := mkey.bulk_rotate_xor_hash(X_78,22,X_84); - (X_86,r1_103) := algebra.join(X_66,X_85); - X_88 := algebra.leftfetchjoin(X_86,X_54); - X_89 := algebra.leftfetchjoin(r1_103,X_77); - X_90:bat[:oid,:bit] := batcalc.==(X_88,X_89); - X_92 := algebra.subselect(X_90,true,true,true,true,false); - X_94 := algebra.leftfetchjoin(X_92,X_86); - X_95 := algebra.leftfetchjoin(X_94,X_65); - X_96 := algebra.leftfetchjoin(X_92,r1_103); - X_97 := algebra.leftfetchjoin(X_96,X_84); - X_98:bat[:oid,:bit] := batcalc.==(X_95,X_97); - X_99 := algebra.subselect(X_98,true,true,true,true,false); - X_100:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","supplier","supplier_s_nationkey_fkey",0); - (X_105,r1_127) := sql.bind_idxbat(X_7,"sys","supplier","supplier_s_nationkey_fkey",2); - X_108:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","supplier","supplier_s_nationkey_fkey",1); - X_110 := sql.projectdelta(X_67,X_100,X_105,r1_127,X_108); - X_111:bat[:oid,:oid] := algebra.leftfetchjoinPath(X_99,X_96,X_110); - X_112:bat[:oid,:oid] := sql.tid(X_7,"sys","nation"); - (X_114,r1_137) := algebra.join(X_111,X_112); - X_116:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","nation","nation_n_regionkey_fkey",0); - (X_118,r1_141) := sql.bind_idxbat(X_7,"sys","nation","nation_n_regionkey_fkey",2); - X_120:bat[:oid,:oid] := sql.bind_idxbat(X_7,"sys","nation","nation_n_regionkey_fkey",1); - X_121 := sql.projectdelta(X_112,X_116,X_118,r1_141,X_120); - X_122 := algebra.leftfetchjoin(r1_137,X_121); - X_125:bat[:oid,:str] := sql.bind(X_7,"sys","region","r_name",0); - X_123:bat[:oid,:oid] := sql.tid(X_7,"sys","region"); - X_239 := algebra.subselect(X_125,X_123,A1,A1,true,true,false); - (X_127,r1_151) := sql.bind(X_7,"sys","region","r_name",2); - X_240 := algebra.subselect(r1_151,A1,A1,true,true,false); - X_129:bat[:oid,:str] := sql.bind(X_7,"sys","region","r_name",1); - X_241 := algebra.subselect(X_129,X_123,A1,A1,true,true,false); - X_130 := sql.subdelta(X_239,X_123,X_127,X_240,X_241); - X_133 := X_130; - (X_134,r1_161) := algebra.join(X_122,X_133); - X_242 := algebra.leftfetchjoin(X_134,X_114); - X_136 := algebra.leftfetchjoin(X_99,X_94); - X_137:bat[:oid,:lng] := sql.bind(X_7,"sys","lineitem","l_extendedprice",0); - (X_142,r1_169) := sql.bind(X_7,"sys","lineitem","l_extendedprice",2); - X_145:bat[:oid,:lng] := sql.bind(X_7,"sys","lineitem","l_extendedprice",1); - X_147 := sql.projectdelta(X_34,X_137,X_142,r1_169,X_145); - X_148:bat[:oid,:lng] := algebra.leftfetchjoinPath(X_242,X_136,r1_54,X_147); - X_149 := calc.lng(A0,15,2); - X_151:bat[:oid,:lng] := sql.bind(X_7,"sys","lineitem","l_discount",0); - (X_153,r1_185) := sql.bind(X_7,"sys","lineitem","l_discount",2); - X_155:bat[:oid,:lng] := sql.bind(X_7,"sys","lineitem","l_discount",1); - X_156 := sql.projectdelta(X_34,X_151,X_153,r1_185,X_155); - X_157:bat[:oid,:lng] := algebra.leftfetchjoinPath(X_242,X_136,r1_54,X_156); - X_158:bat[:oid,:lng] := batcalc.-(X_149,X_157); - X_159:bat[:oid,:lng] := batcalc.*(X_148,X_158); - X_160:bat[:oid,:str] := sql.bind(X_7,"sys","nation","n_name",0); - (X_165,r1_204) := sql.bind(X_7,"sys","nation","n_name",2); - X_168:bat[:oid,:str] := sql.bind(X_7,"sys","nation","n_name",1); - X_170 := sql.projectdelta(X_112,X_160,X_165,r1_204,X_168); - X_171:bat[:oid,:str] := algebra.leftfetchjoinPath(X_134,r1_137,X_170); - (X_172,r1_213,r2_213) := group.subgroupdone(X_171); - X_175:bat[:oid,:lng] := aggr.subsum(X_159,X_172,r1_213,true,true); - (X_177,r1_218,r2_218) := algebra.subsort(X_175,true,false); - X_181:bat[:oid,:str] := algebra.leftfetchjoinPath(r1_218,r1_213,X_171); - X_182 := algebra.leftfetchjoin(r1_218,X_175); - X_183 := sql.resultSet(2,1,X_181); - sql.rsColumn(X_183,"sys.nation","n_name","char",25,0,X_181); - sql.rsColumn(X_183,"sys.L1","revenue","decimal",19,4,X_182); - X_194 := io.stdout(); - sql.exportResult(X_194,X_183); -end s2_1; -# querylog.define("explain select\n\tn_name,\n\tsum(l_extendedprice * (1 - l_discount)) as revenue\nfrom\n\tcustomer,\n\torders,\n\tlineitem,\n\tsupplier,\n\tnation,\n\tregion\nwhere\n\tc_custkey = o_custkey\n\tand l_orderkey = o_orderkey\n\tand l_suppkey = s_suppkey\n\tand c_nationkey = s_nationkey\n\tand s_nationkey = n_nationkey\n\tand n_regionkey = r_regionkey\n\tand r_name = \\'ASIA\\'\n\tand o_orderdate >= date \\'1994-01-01\\'\n\tand o_orderdate < date \\'1994-01-01\\' + interval \\'1\\' year\ngroup by\n\tn_name\norder by\n\trevenue desc;","sequential_pipe") - -# 15:45:52 > -# 15:45:52 > "Done." -# 15:45:52 > - -stdout of test '05-explain` in directory 'sql/benchmarks/tpch` itself: - - -# 22:53:26 > -# 22:53:26 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=34581" "--set" "mapi_usock=/var/tmp/mtest-9096/.s.monetdb.34581" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/ufs/manegold/_/Monet/HG/Feb2013/prefix/--disable-debug_--enable-assert_--enable-optimize/var/MonetDB/mTests_sql_benchmarks_tpch" "--set" "mal_listing=0" -# 22:53:26 > - -# MonetDB 5 server v11.15.12 -# This is an unreleased version -# Serving database 'mTests_sql_benchmarks_tpch', using 8 threads -# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically linked -# Found 15.591 GiB available main-memory. -# Copyright (c) 1993-July 2008 CWI. -# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved -# Visit http://www.monetdb.org/ for further information -# Listening for connection requests on mapi:monetdb://rome.ins.cwi.nl:34581/ -# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-9096/.s.monetdb.34581 -# MonetDB/GIS module loaded -# MonetDB/JAQL module loaded -# MonetDB/SQL module loaded - -Ready. - -# 22:53:26 > -# 22:53:26 > "/usr/bin/python2" "05-explain.SQL.py" "05-explain" -# 22:53:26 > +# 09:52:37 > +# 09:52:37 > "/usr/bin/python2" "05-explain.SQL.py" "05-explain" +# 09:52:37 > #set optimizer = 'sequential_pipe'; #explain select 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 @@ -197,8 +197,8 @@ list_find_exp( list *exps, sql_exp *e) if (e->type != e_column) return NULL; - if ((e->l && (ne=exps_bind_column2(exps, e->l, e->r)) != NULL) || - ((ne=exps_bind_column(exps, e->r, NULL)) != NULL)) + if (( e->l && (ne=exps_bind_column2(exps, e->l, e->r)) != NULL) || + ((!e->l && (ne=exps_bind_column(exps, e->r, NULL)) != NULL))) return ne; return NULL; } @@ -1900,6 +1900,8 @@ exp_push_down_prj(mvc *sql, sql_exp *e, ne = exps_bind_column2(f->exps, e->l, e->r); if (!ne && !e->l) ne = exps_bind_column(f->exps, e->r, NULL); + if (ne && list_position(f->exps, ne) >= list_position(f->exps, one)) + ne = NULL; if (!ne || ne == one) { ne = one; e = oe; diff --git a/sql/test/BugTracker-2015/Tests/All b/sql/test/BugTracker-2015/Tests/All --- a/sql/test/BugTracker-2015/Tests/All +++ b/sql/test/BugTracker-2015/Tests/All @@ -18,3 +18,4 @@ with-columns-mismatch.Bug-3697 find_fk.Bug-3690 is_null_limit.Bug-3684 inf-nan-handling.Bug-3696 +project_rewrite.Bug-3693 diff --git a/sql/test/BugTracker-2015/Tests/inf-nan-handling.Bug-3696.sql~ b/sql/test/BugTracker-2015/Tests/inf-nan-handling.Bug-3696.sql~ deleted file mode 100644 --- a/sql/test/BugTracker-2015/Tests/inf-nan-handling.Bug-3696.sql~ +++ /dev/null @@ -1,46 +0,0 @@ -CREATE TABLE DOUBLE_TBL(x double); -INSERT INTO DOUBLE_TBL(x) VALUES ('NaN'); -SELECT x, cast(x as varchar(30)) as x_str FROM DOUBLE_TBL; - -INSERT INTO DOUBLE_TBL(x) VALUES ('-NaN'); -SELECT x, cast(x as varchar(30)) as x_str FROM DOUBLE_TBL; - -INSERT INTO DOUBLE_TBL(x) VALUES ('Inf'); -INSERT INTO DOUBLE_TBL(x) VALUES ('Infinity'); -INSERT INTO DOUBLE_TBL(x) VALUES ('inf'); -INSERT INTO DOUBLE_TBL(x) VALUES ('infinity'); -SELECT x, cast(x as varchar(30)) as x_str FROM DOUBLE_TBL; - -INSERT INTO DOUBLE_TBL(x) VALUES ('-Inf'); -INSERT INTO DOUBLE_TBL(x) VALUES ('-Infinity'); -INSERT INTO DOUBLE_TBL(x) VALUES ('-inf'); -INSERT INTO DOUBLE_TBL(x) VALUES ('-infinity'); -SELECT x, cast(x as varchar(30)) as x_str FROM DOUBLE_TBL; - - - -CREATE TABLE REAL_TBL(x real); -INSERT INTO REAL_TBL(x) VALUES ('NaN'); -SELECT x, cast(x as varchar(30)) as x_str FROM REAL_TBL; - -INSERT INTO REAL_TBL(x) VALUES ('-NaN'); -SELECT x, cast(x as varchar(30)) as x_str FROM REAL_TBL; - -INSERT INTO REAL_TBL(x) VALUES ('Inf'); -INSERT INTO REAL_TBL(x) VALUES ('Infinity'); -INSERT INTO REAL_TBL(x) VALUES ('inf'); -INSERT INTO REAL_TBL(x) VALUES ('infinity'); -SELECT x, cast(x as varchar(30)) as x_str FROM REAL_TBL; - -INSERT INTO REAL_TBL(x) VALUES ('-Inf'); -INSERT INTO REAL_TBL(x) VALUES ('-Infinity'); -INSERT INTO REAL_TBL(x) VALUES ('-inf'); -INSERT INTO REAL_TBL(x) VALUES ('-infinity'); -SELECT x, cast(x as varchar(30)) as x_str FROM REAL_TBL; - -INSERT INTO REAL_TBL(x) VALUES ('1e+39'); -INSERT INTO REAL_TBL(x) VALUES ('-1e+39'); - - -DROP TABLE DOUBLE_TBL; -DROP TABLE REAL_TBL; diff --git a/sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql b/sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2015/Tests/project_rewrite.Bug-3693.sql @@ -0,0 +1,76 @@ +START TRANSACTION; + + +CREATE TABLE "naturalis_obj_dict" ( + "idstr" CHARACTER LARGE OBJECT NOT NULL, _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list