Changeset: 8b32b005db53 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8b32b005db53 Added Files: sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.py sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.sql sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.stable.out sql/test/miscellaneous/Tests/groupby_error.sql sql/test/miscellaneous/Tests/groupby_error.stable.err sql/test/miscellaneous/Tests/groupby_error.stable.out Modified Files: sql/server/rel_select.c sql/test/BugTracker-2019/Tests/All sql/test/miscellaneous/Tests/All Branch: Nov2019 Log Message:
Merge with Apr2019 branch diffs (truncated from 350 to 300 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1062,16 +1062,16 @@ rel_column_ref(sql_query *query, sql_rel return rel_var_ref(sql, name, 0); } if (!exp && !var) { - if (rel && *rel && (*rel)->card <= CARD_AGGR && is_sql_sel(f) && !is_sql_aggr(f)) { + if (rel && *rel && (*rel)->card <= CARD_AGGR && !is_sql_aggr(f) && (is_sql_sel(f) || is_sql_having(f))) { sql_rel *gb = *rel; - while(gb->l && !is_groupby(gb->op)) + while (gb->l && !is_groupby(gb->op)) + gb = gb->l; + if (gb && is_select(gb->op)) /* check for having clause generated selection */ gb = gb->l; if (gb && gb->l && rel_bind_column(sql, gb->l, name, f)) return sql_error(sql, 05, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results without an aggregate function", name); } - if (is_sql_having(f)) - return sql_error(sql, 05, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results without an aggregate function", name); return sql_error(sql, 02, SQLSTATE(42000) "SELECT: identifier '%s' unknown", name); } if (exp && rel && *rel && (*rel)->card <= CARD_AGGR && exp->card > CARD_AGGR && is_sql_sel(f) && !is_sql_aggr(f)) { @@ -1112,16 +1112,16 @@ rel_column_ref(sql_query *query, sql_rel } } if (!exp) { - if (rel && *rel && (*rel)->card == CARD_AGGR && is_sql_sel(f) && !is_sql_aggr(f)) { + if (rel && *rel && (*rel)->card == CARD_AGGR && !is_sql_aggr(f) && (is_sql_sel(f) || is_sql_having(f))) { sql_rel *gb = *rel; - while(gb->l && !is_groupby(gb->op) && is_project(gb->op)) + while (gb->l && !is_groupby(gb->op) && is_project(gb->op)) + gb = gb->l; + if (gb && is_select(gb->op)) /* check for having clause generated selection */ gb = gb->l; if (gb && is_groupby(gb->op) && gb->l && rel_bind_column2(sql, gb->l, tname, cname, f)) return sql_error(sql, 05, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s.%s' in query results without an aggregate function", tname, cname); } - if (is_sql_having(f)) - return sql_error(sql, 05, SQLSTATE(42S22) "SELECT: cannot use non GROUP BY column '%s.%s' in query results without an aggregate function", tname, cname); return sql_error(sql, 02, SQLSTATE(42S22) "SELECT: no such column '%s.%s'", tname, cname); } if (exp && rel && *rel && (*rel)->card == CARD_AGGR && exp->card > CARD_AGGR && is_sql_sel(f) && !is_sql_aggr(f)) { diff --git a/sql/test/BugTracker-2019/Tests/All b/sql/test/BugTracker-2019/Tests/All --- a/sql/test/BugTracker-2019/Tests/All +++ b/sql/test/BugTracker-2019/Tests/All @@ -36,3 +36,5 @@ merge-table-limit.Bug-6756 double-free.Bug-6757 HAVE_LIBPY3?python-loader-string.Bug-6759 select-char.Bug-6761 +grant-select-column.Bug-6765 +next-get-value-bulk.Bug-6766 diff --git a/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.py b/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.py new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.py @@ -0,0 +1,48 @@ +import os +import sys + +try: + from MonetDBtesting import process +except ImportError: + import process + + +def client(next_user, next_passwd, input): + c = process.client('sql', user=next_user, passwd=next_passwd, stdin=process.PIPE, stdout=process.PIPE, stderr=process.PIPE) + out, err = c.communicate(input) + sys.stdout.write(out) + sys.stderr.write(err) + + +s = process.server(args=[], stdin=process.PIPE, stdout=process.PIPE, stderr=process.PIPE) + +client('monetdb', 'monetdb', '''\ +CREATE schema "myschema";\ +CREATE TABLE "myschema"."test" ("id" integer, "name" varchar(20));\ +INSERT INTO "myschema"."test" ("id", "name") VALUES (1,'Tom'),(2,'Karen');\ +CREATE USER myuser WITH UNENCRYPTED PASSWORD 'Test123' NAME 'Hulk' SCHEMA "myschema";\ +GRANT SELECT ON "myschema"."test" TO myuser; +''') + +client('myuser', 'Test123', '''\ +SELECT "id", "name" FROM "myschema"."test"; +''') + +client('monetdb', 'monetdb', '''\ +REVOKE SELECT ON "myschema"."test" FROM myuser;\ +GRANT SELECT ("name") ON "myschema"."test" TO myuser; +''') + +client('myuser', 'Test123', '''\ +SELECT "id", "name" FROM "myschema"."test"; --error, no permission on column "name"%s\ +SELECT "name" FROM "myschema"."test"; --ok +''' % (os.linesep)) + +client('monetdb', 'monetdb', '''\ +DROP USER myuser;\ +DROP SCHEMA "myschema" CASCADE; +''') + +out, err = s.communicate() +sys.stdout.write(out) +sys.stderr.write(err) diff --git a/sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.sql b/sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.sql @@ -0,0 +1,10 @@ +start transaction; + +create sequence myseq as int; +create sequence myotherseq as int; + +select next_value_for('sys', seq.name), next_value_for(s.name, 'myseq'), next_value_for(s.name, seq.name), + get_value_for('sys', seq.name), get_value_for(s.name, 'myseq'), get_value_for(s.name, seq.name) +from sys.sequences seq, sys.schemas s where s.id = seq.schema_id order by s.name, seq.name; + +rollback; diff --git a/sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.stable.out b/sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2019/Tests/next-get-value-bulk.Bug-6766.stable.out @@ -0,0 +1,81 @@ +stdout of test 'next-get-value-bulk.Bug-6766` in directory 'sql/test/BugTracker-2019` itself: + + +# 09:54:58 > +# 09:54:58 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=39869" "--set" "mapi_usock=/var/tmp/mtest-12664/.s.monetdb.39869" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_BugTracker-2019" "--set" "embedded_c=true" +# 09:54:58 > + +# MonetDB 5 server v11.33.12 (hg id: e994c3289040) +# This is an unreleased version +# Serving database 'mTests_sql_test_BugTracker-2019', using 8 threads +# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers +# Found 15.527 GiB available main-memory. +# Copyright (c) 1993 - July 2008 CWI. +# Copyright (c) August 2008 - 2019 MonetDB B.V., all rights reserved +# Visit https://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://localhost.localdomain:39869/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-12664/.s.monetdb.39869 +# MonetDB/GIS module loaded +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql +# loading sql script: 10_math.sql +# loading sql script: 11_times.sql +# loading sql script: 12_url.sql +# loading sql script: 13_date.sql +# loading sql script: 14_inet.sql +# loading sql script: 15_querylog.sql +# loading sql script: 16_tracelog.sql +# loading sql script: 17_temporal.sql +# loading sql script: 18_index.sql +# loading sql script: 20_vacuum.sql +# loading sql script: 21_dependency_views.sql +# loading sql script: 22_clients.sql +# loading sql script: 23_skyserver.sql +# loading sql script: 25_debug.sql +# loading sql script: 26_sysmon.sql +# loading sql script: 27_rejects.sql +# loading sql script: 39_analytics.sql +# loading sql script: 39_analytics_hge.sql +# loading sql script: 40_geom.sql +# loading sql script: 40_json.sql +# loading sql script: 40_json_hge.sql +# loading sql script: 41_md5sum.sql +# loading sql script: 45_uuid.sql +# loading sql script: 46_profiler.sql +# loading sql script: 51_sys_schema_extension.sql +# loading sql script: 60_wlcr.sql +# loading sql script: 72_fits.sql +# loading sql script: 74_netcdf.sql +# loading sql script: 75_lidar.sql +# loading sql script: 75_shp.sql +# loading sql script: 75_storagemodel.sql +# loading sql script: 80_statistics.sql +# loading sql script: 80_udf.sql +# loading sql script: 80_udf_hge.sql +# loading sql script: 85_bam.sql +# loading sql script: 90_generator.sql +# loading sql script: 90_generator_hge.sql +# loading sql script: 99_system.sql +# MonetDB/SQL module loaded + +# 14:05:52 > +# 14:05:52 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-23154" "--port=30076" +# 14:05:52 > + +#start transaction; +#create sequence myseq as int; +#select next_value_for('sys', seq.name), next_value_for(s.name, 'myseq'), next_value_for(s.name, seq.name), +# get_value_for('sys', seq.name), get_value_for(s.name, 'myseq'), get_value_for(s.name, seq.name) +#from sys.sequences seq, sys.schemas s where s.id = seq.schema_id order by s.name, seq.name; +% .L1, sys.L2, sys.L3, .L4, sys.L5, sys.L6 # table_name +% L1, L2, L3, L4, L5, L6 # name +% bigint, bigint, bigint, bigint, bigint, bigint # type +% 1, 1, 1, 1, 1, 1 # length +[ 2, 3, 1, 1, 1, 1 ] +[ 4, 2, 1, 1, 1, 1 ] +#rollback; + +# 09:54:58 > +# 09:54:58 > "Done." +# 09:54:58 > + diff --git a/sql/test/miscellaneous/Tests/All b/sql/test/miscellaneous/Tests/All --- a/sql/test/miscellaneous/Tests/All +++ b/sql/test/miscellaneous/Tests/All @@ -7,3 +7,4 @@ update_delete_aliases groupby_expressions values with_update_stmts +groupby_error diff --git a/sql/test/miscellaneous/Tests/groupby_error.sql b/sql/test/miscellaneous/Tests/groupby_error.sql new file mode 100644 --- /dev/null +++ b/sql/test/miscellaneous/Tests/groupby_error.sql @@ -0,0 +1,7 @@ +CREATE SCHEMA "kagami_dump"; +CREATE TABLE "kagami_dump"."test_task" ("sys_id" CHAR(32) DEFAULT '', "number" VARCHAR(40), "parent" VARCHAR(32)); +INSERT INTO "kagami_dump".test_task(sys_id, number, parent) VALUES ('aaa', 'T0001', null),('bbb','T0002','aaa'); + +SELECT parent."sys_id" FROM "kagami_dump"."test_task" parent INNER JOIN "kagami_dump"."test_task" child ON child."parent" = parent."sys_id" GROUP BY parent."sys_id" HAVING count(child."sys_id") >= 1 ORDER BY parent."number"; --error, parent."number" requires an aggregate function + +DROP SCHEMA "kagami_dump" CASCADE; diff --git a/sql/test/miscellaneous/Tests/groupby_error.stable.err b/sql/test/miscellaneous/Tests/groupby_error.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/miscellaneous/Tests/groupby_error.stable.err @@ -0,0 +1,38 @@ +stderr of test 'groupby_error` in directory 'sql/test/miscellaneous` itself: + + +# 10:56:46 > +# 10:56:46 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=36667" "--set" "mapi_usock=/var/tmp/mtest-13678/.s.monetdb.36667" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_miscellaneous" "--set" "embedded_c=true" +# 10:56:46 > + +# builtin opt gdk_dbpath = /home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/monetdb5/dbfarm/demo +# 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 = 36667 +# cmdline opt mapi_usock = /var/tmp/mtest-13678/.s.monetdb.36667 +# cmdline opt monet_prompt = +# cmdline opt gdk_dbpath = /home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_miscellaneous +# cmdline opt embedded_c = true +#client2:!ERROR:ParseException:SQLparser:42000!SELECT: cannot use non GROUP BY column 'parent.number' in query results without an aggregate function +#main thread:!ERROR:MALException:client.quit:Server stopped + +# 10:56:47 > +# 10:56:47 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-13678" "--port=36667" +# 10:56:47 > + +MAPI = (monetdb) /var/tmp/mtest-13678/.s.monetdb.36667 +QUERY = SELECT parent."sys_id" FROM "kagami_dump"."test_task" parent INNER JOIN "kagami_dump"."test_task" child ON child."parent" = parent."sys_id" GROUP BY parent."sys_id" HAVING count(child."sys_id") >= 1 ORDER BY parent."number"; --error, parent."number" requires an aggregate function +ERROR = !SELECT: cannot use non GROUP BY column 'parent.number' in query results without an aggregate function +CODE = 42000 + +# 10:56:47 > +# 10:56:47 > "Done." +# 10:56:47 > + diff --git a/sql/test/miscellaneous/Tests/groupby_error.stable.out b/sql/test/miscellaneous/Tests/groupby_error.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/miscellaneous/Tests/groupby_error.stable.out @@ -0,0 +1,74 @@ +stdout of test 'groupby_error` in directory 'sql/test/miscellaneous` itself: + + +# 10:56:46 > +# 10:56:46 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=36667" "--set" "mapi_usock=/var/tmp/mtest-13678/.s.monetdb.36667" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/ferreira/repositories/MonetDB-Apr2019/BUILD/var/MonetDB/mTests_sql_test_miscellaneous" "--set" "embedded_c=true" +# 10:56:46 > + +# MonetDB 5 server v11.33.12 (hg id: e994c3289040) +# This is an unreleased version +# Serving database 'mTests_sql_test_miscellaneous', using 8 threads +# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers +# Found 15.527 GiB available main-memory. +# Copyright (c) 1993 - July 2008 CWI. +# Copyright (c) August 2008 - 2019 MonetDB B.V., all rights reserved +# Visit https://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://localhost.localdomain:36667/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-13678/.s.monetdb.36667 +# MonetDB/GIS module loaded +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql +# loading sql script: 10_math.sql +# loading sql script: 11_times.sql +# loading sql script: 12_url.sql +# loading sql script: 13_date.sql _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list