Changeset: 5d5c142ea8cb for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5d5c142ea8cb Modified Files: sql/server/rel_select.c sql/test/scanner/Tests/raw_strings.stable.err sql/test/scanner/Tests/raw_strings.stable.out sql/test/subquery/Tests/subquery.sql sql/test/subquery/Tests/subquery.stable.err sql/test/subquery/Tests/subquery.stable.out sql/test/subquery/Tests/subquery3.sql sql/test/subquery/Tests/subquery3.stable.out Branch: json Log Message:
Merge with default diffs (truncated from 361 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 @@ -776,6 +776,7 @@ rel_values(sql_query *query, symbol *tab } r = rel_project(sql->sa, NULL, exps); r->nrcols = list_length(exps); + r->card = dlist_length(rowlist) == 1 ? CARD_ATOM : CARD_MULTI; return rel_table_optname(sql, r, optname); } @@ -3809,18 +3810,20 @@ static sql_exp * rel_selection_ref(sql_query *query, sql_rel **rel, symbol *grp, dlist *selection ) { sql_allocator *sa = query->sql->sa; - dnode *n; - dlist *gl = grp->data.lval; + dlist *gl; char *name = NULL; exp_kind ek = {type_value, card_column, FALSE}; + if (grp->token != SQL_COLUMN && grp->token != SQL_IDENT) + return NULL; + gl = grp->data.lval; if (dlist_length(gl) > 1) return NULL; if (!selection) return NULL; name = gl->h->data.sval; - for (n = selection->h; n; n = n->next) { + for (dnode *n = selection->h; n; n = n->next) { /* we only look for columns */ tokens to = n->data.sym->token; if (to == SQL_COLUMN || to == SQL_IDENT) { @@ -4058,8 +4061,8 @@ rel_partition_groupings(sql_query *query return NULL; } } - if(e->type != e_column) { //store group by expressions in the stack - if(!stack_push_groupby_expression(sql, grp, e)) + if (e->type != e_column) { //store group by expressions in the stack + if (!stack_push_groupby_expression(sql, grp, e)) return NULL; } if (e->card > CARD_AGGR) @@ -4878,21 +4881,25 @@ rel_value_exp2(sql_query *query, sql_rel return rel_column_ref(query, rel, se, f ); case SQL_NAME: return rel_var_ref(sql, se->data.sval, 1); + case SQL_VALUES: case SQL_WITH: case SQL_SELECT: { sql_rel *r; if (se->token == SQL_WITH) { r = rel_with_query(query, se); + } else if (se->token == SQL_VALUES) { + r = rel_values(query, se); } else { + assert(se->token == SQL_SELECT); if (rel && *rel) query_push_outer(query, *rel, f); r = rel_subquery(query, NULL, se, ek); if (rel && *rel) *rel = query_pop_outer(query); - if (!r) - return NULL; } + if (!r) + return NULL; if (ek.card <= card_set && is_project(r->op) && list_length(r->exps) > 1) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery must return only one column"); if (list_length(r->exps) == 1) { /* for now don't rename multi attribute results */ diff --git a/sql/test/scanner/Tests/raw_strings.stable.err b/sql/test/scanner/Tests/raw_strings.stable.err --- a/sql/test/scanner/Tests/raw_strings.stable.err +++ b/sql/test/scanner/Tests/raw_strings.stable.err @@ -0,0 +1,30 @@ +stderr of test 'raw_strings` in directory 'sql/test/scanner` itself: + + +# 13:58:26 > +# 13:58:26 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37621" "--set" "mapi_usock=/var/tmp/mtest-27871/.s.monetdb.37621" "--forcemito" "--dbpath=/home/kutsurak/work/src/monet/worktrees/master/build/install/var/MonetDB/mTests_sql_test_scanner" "--set" "embedded_c=true" +# 13:58:26 > + +# builtin opt gdk_dbpath = /home/kutsurak/work/src/monet/worktrees/master/build/install/var/monetdb5/dbfarm/demo +# builtin opt mapi_port = 50000 +# builtin opt mapi_open = false +# builtin opt mapi_ipv6 = 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 = 37621 +# cmdline opt mapi_usock = /var/tmp/mtest-27871/.s.monetdb.37621 +# cmdline opt gdk_dbpath = /home/kutsurak/work/src/monet/worktrees/master/build/install/var/MonetDB/mTests_sql_test_scanner +# cmdline opt embedded_c = true + +# 13:58:26 > +# 13:58:26 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-27871" "--port=37621" +# 13:58:26 > + + +# 13:58:26 > +# 13:58:26 > "Done." +# 13:58:26 > + diff --git a/sql/test/scanner/Tests/raw_strings.stable.out b/sql/test/scanner/Tests/raw_strings.stable.out --- a/sql/test/scanner/Tests/raw_strings.stable.out +++ b/sql/test/scanner/Tests/raw_strings.stable.out @@ -0,0 +1,85 @@ +stdout of test 'raw_strings` in directory 'sql/test/scanner` itself: + + +# 13:58:26 > +# 13:58:26 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=37621" "--set" "mapi_usock=/var/tmp/mtest-27871/.s.monetdb.37621" "--forcemito" "--dbpath=/home/kutsurak/work/src/monet/worktrees/master/build/install/var/MonetDB/mTests_sql_test_scanner" "--set" "embedded_c=true" +# 13:58:26 > + +# MonetDB 5 server v11.36.0 (hg id: b0c3d06a15 (git)) +# This is an unreleased version +# Serving database 'mTests_sql_test_scanner', using 4 threads +# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers +# Found 15.488 GiB available main-memory of which we use 12.622 GiB +# 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://zarquon.zarniwoop.org:37621/ +# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-27871/.s.monetdb.37621 +# SQL catalog created, loading sql scripts once +# loading sql script: 09_like.sql +# loading sql script: 10_math.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_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: 58_hot_snapshot.sql +# loading sql script: 60_wlcr.sql +# loading sql script: 61_wlcr.sql +# loading sql script: 72_fits.sql +# loading sql script: 74_netcdf.sql +# loading sql script: 75_lidar.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 + +# 13:58:26 > +# 13:58:26 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-27871" "--port=37621" +# 13:58:26 > + +#SELECT r'\"'; +% . # table_name +% single_value # name +% char # type +% 2 # length +[ "\\\"" ] +#SELECT r''''; +% . # table_name +% single_value # name +% char # type +% 1 # length +[ "'" ] +#SELECT r'\u1234'; +% . # table_name +% single_value # name +% char # type +% 6 # length +[ "\\u1234" ] + +# 13:58:26 > +# 13:58:26 > "Done." +# 13:58:26 > + diff --git a/sql/test/subquery/Tests/subquery.sql b/sql/test/subquery/Tests/subquery.sql --- a/sql/test/subquery/Tests/subquery.sql +++ b/sql/test/subquery/Tests/subquery.sql @@ -81,6 +81,20 @@ SELECT SUM(SUM(i)) FROM integers; -- agg SELECT i1.i FROM integers i1 WHERE i1.i >= (SELECT i1.i, i2.i FROM integers i2 WHERE i2.i > 1); --error, subquery must return a single column +SELECT i1.i FROM integers i1 GROUP BY (SELECT SUM(i1.i) + i2.i FROM integers i2); --error, cannot use non GROUP BY column 'i2.i' in query results without an aggregate function + +SELECT i1.i FROM integers i1 GROUP BY (SELECT i2.i FROM integers i2); --error, column "i1.i" must appear in the GROUP BY clause or be used in an aggregate function + +SELECT 1 FROM integers i1 GROUP BY (VALUES(1), (2)); --error, more than one row returned by a subquery used as an expression + +SELECT 1 FROM integers i1 GROUP BY (VALUES(1,2,3)); --error, subquery must return only one column + +SELECT (VALUES(1)); + +SELECT (VALUES(1),(2)); --error, cardinality violation, scalar value expected + +SELECT (VALUES(1,2,3)); --error, subquery must return only one column + drop TABLE integers; -- varchar tests diff --git a/sql/test/subquery/Tests/subquery.stable.err b/sql/test/subquery/Tests/subquery.stable.err --- a/sql/test/subquery/Tests/subquery.stable.err +++ b/sql/test/subquery/Tests/subquery.stable.err @@ -58,6 +58,30 @@ MAPI = (monetdb) /var/tmp/mtest-8966/.s QUERY = SELECT i1.i FROM integers i1 WHERE i1.i >= (SELECT i1.i, i2.i FROM integers i2 WHERE i2.i > 1); --error, subquery must return a single column ERROR = !SELECT: subquery must return only one column CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-338558/.s.monetdb.33733 +QUERY = SELECT i1.i FROM integers i1 GROUP BY (SELECT SUM(i1.i) + i2.i FROM integers i2); --error, cannot use non GROUP BY column 'i2.i' in query results without an aggregate function + +CODE = 42S22 +MAPI = (monetdb) /var/tmp/mtest-367512/.s.monetdb.35898 +QUERY = SELECT i1.i FROM integers i1 GROUP BY (SELECT i2.i FROM integers i2); --error, column "i1.i" must appear in the GROUP BY clause or be used in an aggregate function + +CODE = 42S22 +MAPI = (monetdb) /var/tmp/mtest-367512/.s.monetdb.35898 +QUERY = SELECT 1 FROM integers i1 GROUP BY (VALUES(1), (2)); --error, more than one row returned by a subquery used as an expression +ERROR = !Cardinality violation, scalar value expected +CODE = 21000 +MAPI = (monetdb) /var/tmp/mtest-269616/.s.monetdb.32681 +QUERY = SELECT 1 FROM integers i1 GROUP BY (VALUES(1,2,3)); --error, subquery must return only one column +ERROR = !SELECT: subquery must return only one column +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-269616/.s.monetdb.32681 +QUERY = SELECT (VALUES(1),(2)); --error, cardinality violation, scalar value expected +ERROR = !Cardinality violation, scalar value expected +CODE = 21000 +MAPI = (monetdb) /var/tmp/mtest-269215/.s.monetdb.36194 +QUERY = SELECT (VALUES(1,2,3)); --error, subquery must return only one column +ERROR = !SELECT: subquery must return only one column +CODE = 42000 # 17:27:37 > # 17:27:37 > "Done." diff --git a/sql/test/subquery/Tests/subquery.stable.out b/sql/test/subquery/Tests/subquery.stable.out --- a/sql/test/subquery/Tests/subquery.stable.out +++ b/sql/test/subquery/Tests/subquery.stable.out @@ -301,6 +301,12 @@ stdout of test 'subquery` in directory ' % bigint, tinyint # type % 1, 2 # length [ 6, 42 ] +#SELECT (VALUES(1)); +% .%1 # table_name +% %1 # name +% tinyint # type +% 1 # length +[ 1 ] #drop TABLE integers; #CREATE TABLE strings(v VARCHAR(128)); #INSERT INTO strings VALUES ('hello'), ('world'), (NULL); diff --git a/sql/test/subquery/Tests/subquery3.sql b/sql/test/subquery/Tests/subquery3.sql --- a/sql/test/subquery/Tests/subquery3.sql +++ b/sql/test/subquery/Tests/subquery3.sql @@ -2,6 +2,8 @@ CREATE TABLE tbl_ProductSales (ColID int INSERT INTO tbl_ProductSales VALUES (1,'Game','Mobo Game',200),(2,'Game','PKO Game',400),(3,'Fashion','Shirt',500),(4,'Fashion','Shorts',100); CREATE TABLE another_T (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT, col6 INT, col7 INT, col8 INT); INSERT INTO another_T VALUES (1,2,3,4,5,6,7,8), (11,22,33,44,55,66,77,88), (111,222,333,444,555,666,777,888), (1111,2222,3333,4444,5555,6666,7777,8888); +CREATE TABLE integers(i INTEGER); +INSERT INTO integers VALUES (1), (2), (3), (NULL); SELECT NOT MAX(t1.col6) IN (SELECT SUM(t1.col6) FROM tbl_ProductSales tp HAVING MAX(t1.col1) > MIN(tp.colID)) @@ -256,6 +258,25 @@ FROM another_T t1; -- 2 -- 2 +SELECT + MIN(i1.i) +FROM integers i1 +GROUP BY (SELECT MAX(i2.i) FROM integers i2 LEFT JOIN integers i3 on i1.i = i2.i); + -- 1 + +SELECT + MAX(t1.col1) +FROM another_T t1 +GROUP BY (NOT t1.col6 NOT IN (SELECT MAX(t2.col6) FROM another_T t2 GROUP BY t1.col6 HAVING t1.col7 < MAX(t2.col7 - t1.col6))) +HAVING (MIN(t1.col7) <> ANY(SELECT MAX(t2.col5) FROM another_T t2 GROUP BY t2.col6 HAVING t2.col6 + MIN(t2.col2) = MAX(t1.col7))); + -- empty + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list