Changeset: 02c08819c11f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=02c08819c11f Added Files: sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.sql sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.err sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.out Modified Files: sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_rel.c Branch: Jul2017 Log Message:
fixed bug 6207, remove duplicate expressions in group by list. diffs (165 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 @@ -795,6 +795,23 @@ exp_match( sql_exp *e1, sql_exp *e2) return 0; } +/* list already contains matching expression */ +int +exps_find_exp( list *l, sql_exp *e) +{ + node *n; + + if (!l || !l->h) + return 0; + + for(n=l->h; n; n = n->next) { + if (exp_match(n->data, e)) + return 1; + } + return 0; +} + + /* c refers to the parent p */ int exp_refers( sql_exp *p, sql_exp *c) 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 @@ -109,6 +109,7 @@ extern int exp_cmp( sql_exp *e1, sql_exp extern int exp_equal( sql_exp *e1, sql_exp *e2); extern int exp_refers( sql_exp *p, sql_exp *c); extern int exp_match( sql_exp *e1, sql_exp *e2); +extern int exps_find_exp( list *l, sql_exp *e); extern int exp_match_exp( sql_exp *e1, sql_exp *e2); /* match just the column (cmp equality) expressions */ extern int exp_match_col_exps( sql_exp *e, list *l); diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -742,6 +742,19 @@ rel_groupby(mvc *sql, sql_rel *l, list * } rel->card = CARD_ATOM; + /* reduce duplicates in groupbyexps */ + if (groupbyexps && list_length(groupbyexps) > 1) { + list *gexps = sa_list(sql->sa); + + for (en = groupbyexps->h; en; en = en->next) { + sql_exp *e = en->data; + + if (!exps_find_exp(gexps, e)) + append(gexps, e); + } + groupbyexps = gexps; + } + if (groupbyexps) { rel->card = CARD_AGGR; for (en = groupbyexps->h; en; en = en->next) { diff --git a/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.sql b/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.sql @@ -0,0 +1,3 @@ +select name,name from sys.functions group by name limit 2; +select name, name from sys.functions group by name,name limit 2; +select f.name, f.name from sys.functions AS f group by name,name limit 2; diff --git a/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.err b/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.err @@ -0,0 +1,34 @@ +stderr of test 'double-groupby-column.Bug-6207` in directory 'sql/test/BugTracker-2017` itself: + + +# 08:52:53 > +# 08:52:53 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=34679" "--set" "mapi_usock=/var/tmp/mtest-4722/.s.monetdb.34679" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017" +# 08:52:53 > + +# 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 = 34679 +# cmdline opt mapi_usock = /var/tmp/mtest-4722/.s.monetdb.34679 +# 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 = 536870922 + +# 08:52:53 > +# 08:52:53 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-4722" "--port=34679" +# 08:52:53 > + + +# 08:52:53 > +# 08:52:53 > "Done." +# 08:52:53 > + diff --git a/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.out b/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.out @@ -0,0 +1,52 @@ +stdout of test 'double-groupby-column.Bug-6207` in directory 'sql/test/BugTracker-2017` itself: + + +# 08:52:53 > +# 08:52:53 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=34679" "--set" "mapi_usock=/var/tmp/mtest-4722/.s.monetdb.34679" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2017" +# 08:52:53 > + +# 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:34679/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-4722/.s.monetdb.34679 +# MonetDB/GIS module loaded +# MonetDB/SQL module loaded + +Ready. + +# 08:52:53 > +# 08:52:53 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-4722" "--port=34679" +# 08:52:53 > + +#select name,name from sys.functions group by name limit 2; +% sys.functions, sys.functions # table_name +% name, name # name +% varchar, varchar # type +% 11, 11 # length +[ "mbr_overlap", "mbr_overlap" ] +[ "mbr_above", "mbr_above" ] +#select name, name from sys.functions group by name,name limit 2; +% sys.functions, sys.functions # table_name +% name, name # name +% varchar, varchar # type +% 11, 11 # length +[ "mbr_overlap", "mbr_overlap" ] +[ "mbr_above", "mbr_above" ] +#select f.name, f.name from sys.functions AS f group by name,name limit 2; +% sys.f, sys.f # table_name +% name, name # name +% varchar, varchar # type +% 11, 11 # length +[ "mbr_overlap", "mbr_overlap" ] +[ "mbr_above", "mbr_above" ] + +# 08:52:53 > +# 08:52:53 > "Done." +# 08:52:53 > + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list