Changeset: 39b41810dc43 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=39b41810dc43 Added Files: sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.sql sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.err sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.sql sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.err sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.out Modified Files: sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/test/BugTracker-2014/Tests/All Branch: Jan2014 Log Message:
fixed bug 3523 (which also fixed 3526). Make sure we only push down a project without window functions diffs (truncated from 305 to 300 lines): diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c --- a/sql/server/rel_exp.c +++ b/sql/server/rel_exp.c @@ -1159,6 +1159,33 @@ exp_has_func( sql_exp *e ) return 0; } +int +exp_unsafe( sql_exp *e) +{ + if (!e) + return 0; + + if (e->type != e_func && e->type != e_convert) + return 0; + + if (e->type == e_func && e->card == CARD_AGGR) + return 1; + if (e->type == e_convert && e->l) + return exp_unsafe(e->l); + if (e->type == e_func && e->l) { + list *args = e->l; + node *n; + + for(n = args->h; n; n = n->next) { + sql_exp *e = n->data; + + if (exp_unsafe(e)) + return 1; + } + } + return 0; +} + static int exp_key( sql_exp *e ) { diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h --- a/sql/server/rel_exp.h +++ b/sql/server/rel_exp.h @@ -113,6 +113,7 @@ extern int exp_is_join_exp(sql_exp *e); extern int exp_is_atom(sql_exp *e); extern int exps_are_atoms(list *exps); extern int exp_has_func(sql_exp *e); +extern int exp_unsafe(sql_exp *e); extern int rel_has_exp(sql_rel *rel, sql_exp *e); extern sql_rel *find_rel(list *rels, sql_exp *e); @@ -130,4 +131,5 @@ extern int exps_intern(list *exps); extern char *compare_func( comp_type t ); extern int is_identity( sql_exp *e, sql_rel *r); + #endif /* _REL_EXP_H_ */ 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 @@ -1292,7 +1292,7 @@ project_unsafe(sql_rel *rel) sql_exp *e = n->data; /* aggr func in project ! */ - if (e->type == e_func && e->card == CARD_AGGR) + if (exp_unsafe(e)) return 1; } return 0; diff --git a/sql/test/BugTracker-2014/Tests/All b/sql/test/BugTracker-2014/Tests/All --- a/sql/test/BugTracker-2014/Tests/All +++ b/sql/test/BugTracker-2014/Tests/All @@ -23,4 +23,6 @@ stringfloatshtcompare.Bug-3512 oid-table-assert.Bug-3514 round-properties.Bug-3515 union_with_subqueries.Bug-3518 +unsafe_project_push_down.Bug-3523 non_groupby_column.Bug-3524 +orderby_count.Bug-3526 diff --git a/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.sql b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.sql @@ -0,0 +1,9 @@ +start transaction; +create table a (k varchar(64),v boolean); +insert into a values ('one',true),('two',false),('one',false); +create table b (k varchar(64)); +insert into b values ('two'),('two'),('two'); +select * from a; +select * from b; +select k, v from a union all select k,NULL from b; +select k,count(*),count(v) from (select k,v from a union all select k,null from b) as t(k,v) group by k order by count(*) desc; diff --git a/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.err b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.err @@ -0,0 +1,35 @@ +stderr of test 'orderby_count.Bug-3526` in directory 'sql/test/BugTracker-2014` itself: + + +# 17:12:12 > +# 17:12:12 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=33631" "--set" "mapi_usock=/var/tmp/mtest-917/.s.monetdb.33631" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014" "--set" "mal_listing=0" +# 17:12:12 > + +# builtin opt gdk_dbpath = /home/niels/scratch/rc-clean/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 = 33631 +# cmdline opt mapi_usock = /var/tmp/mtest-917/.s.monetdb.33631 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbpath = /home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014 +# cmdline opt mal_listing = 0 + +# 17:12:12 > +# 17:12:12 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-917" "--port=33631" +# 17:12:12 > + + +# 17:12:13 > +# 17:12:13 > "Done." +# 17:12:13 > + diff --git a/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2014/Tests/orderby_count.Bug-3526.stable.out @@ -0,0 +1,73 @@ +stdout of test 'orderby_count.Bug-3526` in directory 'sql/test/BugTracker-2014` itself: + + +# 17:12:12 > +# 17:12:12 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=33631" "--set" "mapi_usock=/var/tmp/mtest-917/.s.monetdb.33631" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014" "--set" "mal_listing=0" +# 17:12:12 > + +# MonetDB 5 server v11.17.22 +# This is an unreleased version +# Serving database 'mTests_sql_test_BugTracker-2014', using 4 threads +# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically linked +# Found 7.334 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2014 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://localhost.nes.nl:33631/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-917/.s.monetdb.33631 +# MonetDB/GIS module loaded +# MonetDB/JAQL module loaded +# MonetDB/SQL module loaded + +Ready. + +# 17:12:12 > +# 17:12:12 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-917" "--port=33631" +# 17:12:12 > + +#start transaction; +#create table a (k varchar(64),v boolean); +#insert into a values ('one',true),('two',false),('one',false); +[ 3 ] +#create table b (k varchar(64)); +#insert into b values ('two'),('two'),('two'); +[ 3 ] +#select * from a; +% sys.a, sys.a # table_name +% k, v # name +% varchar, boolean # type +% 3, 5 # length +[ "one", true ] +[ "two", false ] +[ "one", false ] +#select * from b; +% sys.b # table_name +% k # name +% varchar # type +% 3 # length +[ "two" ] +[ "two" ] +[ "two" ] +#select k, v from a union all select k,NULL from b; +% .L1, .L1 # table_name +% k, v # name +% varchar, boolean # type +% 3, 5 # length +[ "one", true ] +[ "two", false ] +[ "one", false ] +[ "two", NULL ] +[ "two", NULL ] +[ "two", NULL ] +#select k,count(*),count(v) from (select k,v from a union all select k,null from b) as t(k,v) group by k order by count(*) desc; +% .t, .L2, .L3 # table_name +% k, L2, L3 # name +% varchar, wrd, wrd # type +% 3, 1, 1 # length +[ "two", 4, 1 ] +[ "one", 2, 2 ] + +# 17:12:13 > +# 17:12:13 > "Done." +# 17:12:13 > + diff --git a/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.sql b/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.sql @@ -0,0 +1,4 @@ +start transaction; +create table foo (id int); +insert into foo values (42); +select id-row_number() over (order by id) from (select id from foo union all select id from foo) as z; diff --git a/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.err b/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.err @@ -0,0 +1,35 @@ +stderr of test 'unsafe_project_push_down.Bug-3523` in directory 'sql/test/BugTracker-2014` itself: + + +# 17:05:59 > +# 17:05:59 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37461" "--set" "mapi_usock=/var/tmp/mtest-32652/.s.monetdb.37461" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014" "--set" "mal_listing=0" +# 17:05:59 > + +# builtin opt gdk_dbpath = /home/niels/scratch/rc-clean/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 = 37461 +# cmdline opt mapi_usock = /var/tmp/mtest-32652/.s.monetdb.37461 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbpath = /home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014 +# cmdline opt mal_listing = 0 + +# 17:05:59 > +# 17:05:59 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-32652" "--port=37461" +# 17:05:59 > + + +# 17:05:59 > +# 17:05:59 > "Done." +# 17:05:59 > + diff --git a/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.out b/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2014/Tests/unsafe_project_push_down.Bug-3523.stable.out @@ -0,0 +1,43 @@ +stdout of test 'unsafe_project_push_down.Bug-3523` in directory 'sql/test/BugTracker-2014` itself: + + +# 17:05:59 > +# 17:05:59 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37461" "--set" "mapi_usock=/var/tmp/mtest-32652/.s.monetdb.37461" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014" "--set" "mal_listing=0" +# 17:05:59 > + +# MonetDB 5 server v11.17.22 +# This is an unreleased version +# Serving database 'mTests_sql_test_BugTracker-2014', using 4 threads +# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically linked +# Found 7.334 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2014 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://localhost.nes.nl:37461/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-32652/.s.monetdb.37461 +# MonetDB/GIS module loaded +# MonetDB/JAQL module loaded +# MonetDB/SQL module loaded + +Ready. + +# 17:05:59 > +# 17:05:59 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-32652" "--port=37461" +# 17:05:59 > + +#start transaction; +#create table foo (id int); +#insert into foo values (42); +[ 1 ] +#select id-row_number() over (order by id) from (select id from foo union all select id from foo) as z; +% .L # table_name +% sql_sub_id # name +% bigint # type +% 2 # length +[ 41 ] +[ 40 ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list