Changeset: d839abf3dc3e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d839abf3dc3e Modified Files: sql/server/rel_select.c sql/test/miscellaneous/Tests/column_aliases.sql sql/test/miscellaneous/Tests/column_aliases.stable.err sql/test/subquery/Tests/subquery3.sql sql/test/subquery/Tests/subquery3.stable.err sql/test/subquery/Tests/subquery3.stable.out Branch: Jun2020 Log Message:
Small bugfix, ensure every column from a subquery is renamed or not (this was already enforced by the CTEs) diffs (224 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 @@ -175,8 +175,8 @@ rel_table_optname(mvc *sql, sql_rel *sq, sq = rel_project(sql->sa, sq, rel_projections(sql, sq, NULL, 1, 0)); osq = sq; } - if (columnrefs && dlist_length(columnrefs) > list_length(sq->exps)) - return sql_error(sql, 02, SQLSTATE(42000) "SELECT: The number of aliases is longer than the number of columns (%d>%d)", dlist_length(columnrefs), sq->nrcols); + if (columnrefs && dlist_length(columnrefs) != list_length(sq->exps)) + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: The number of aliases don't match the number of columns (%d != %d)", dlist_length(columnrefs), sq->nrcols); if (columnrefs && sq->exps) { dnode *d = columnrefs->h; diff --git a/sql/test/miscellaneous/Tests/column_aliases.sql b/sql/test/miscellaneous/Tests/column_aliases.sql --- a/sql/test/miscellaneous/Tests/column_aliases.sql +++ b/sql/test/miscellaneous/Tests/column_aliases.sql @@ -1,12 +1,16 @@ create table t1 (aa int, bb int, cc int); insert into t1 values (1,1,1); select t2.dd, t2.ee, t2.ff from t1 as t2(dd,ee,ff); -select t2.cc from t1 as t2(dd); -select t2.ee from t1 as t2(dd,ee); +select t2.cc from t1 as t2(dd,ee,cc); +select t2.ee from t1 as t2(dd,ee,ff); +select t2.cc from t1 as t2(dd); --error +select t2.ee from t1 as t2(dd,ee); --error select t2.aa from t1 as t2(dd,dd,cc); --error select t2.dd from t1 as t2(dd,ee,ff,gg); --error select t3.output from generate_series(1, 2) as t3(output); +select * from (values(1,2)) as a(a); --error + create table t2 as (select count(*) from t1); --error, labels not allowed in column names create table t2 as (select count(*) as "mylabel" from t1); --allowed select count(*) from t2; diff --git a/sql/test/miscellaneous/Tests/column_aliases.stable.err b/sql/test/miscellaneous/Tests/column_aliases.stable.err --- a/sql/test/miscellaneous/Tests/column_aliases.stable.err +++ b/sql/test/miscellaneous/Tests/column_aliases.stable.err @@ -5,37 +5,25 @@ stderr of test 'column_aliases` in direc # 11:21:19 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=38503" "--set" "mapi_usock=/var/tmp/mtest-2631/.s.monetdb.38503" "--set" "monet_prompt=" "--forcemito" "--dbpath=/home/ferreira/repositories/MonetDB-default/BUILD/var/MonetDB/mTests_sql_test_miscellaneous" "--set" "monet_daemon=yes" "--set" "embedded_c=true" # 11:21:19 > -# builtin opt gdk_dbpath = /home/ferreira/repositories/MonetDB-default/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_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 = 38503 -# cmdline opt mapi_usock = /var/tmp/mtest-2631/.s.monetdb.38503 -# cmdline opt monet_prompt = -# cmdline opt gdk_dbpath = /home/ferreira/repositories/MonetDB-default/BUILD/var/MonetDB/mTests_sql_test_miscellaneous -# cmdline opt monet_daemon = yes -# cmdline opt embedded_c = true -#client2:!ERROR:ParseException:SQLparser:42000!SELECT: Duplicate column name 't2.dd' -#client2:!ERROR:ParseException:SQLparser:42000!SELECT: The number of aliases is longer the number of columns (4>3) - -# 11:21:19 > -# 11:21:19 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-2631" "--port=38503" -# 11:21:19 > - -MAPI = (monetdb) /var/tmp/mtest-2631/.s.monetdb.38503 +MAPI = (monetdb) /var/tmp/mtest-261061/.s.monetdb.34489 +QUERY = select t2.cc from t1 as t2(dd); --error +ERROR = !SELECT: The number of aliases don't match the number of columns (1 != 3) +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-261061/.s.monetdb.34489 +QUERY = select t2.ee from t1 as t2(dd,ee); --error +ERROR = !SELECT: The number of aliases don't match the number of columns (2 != 3) +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-261061/.s.monetdb.34489 QUERY = select t2.aa from t1 as t2(dd,dd,cc); --error ERROR = !SELECT: Duplicate column name 't2.dd' CODE = 42000 MAPI = (monetdb) /var/tmp/mtest-2631/.s.monetdb.38503 QUERY = select t2.dd from t1 as t2(dd,ee,ff,gg); --error -ERROR = !SELECT: The number of aliases is longer than the number of columns (4>3) +ERROR = !SELECT: The number of aliases don't match the number of columns (4 != 3) +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-261061/.s.monetdb.34489 +QUERY = select * from (values(1,2)) as a(a); --error +ERROR = !SELECT: The number of aliases don't match the number of columns (1 != 2) CODE = 42000 MAPI = (monetdb) /var/tmp/mtest-92354/.s.monetdb.36336 QUERY = create table t2 as (select count(*) from t1); --error, labels not allowed in column names 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 @@ -514,7 +514,7 @@ SELECT FROM another_T; --error, more than one row returned by a subquery used as an expression SELECT - (SELECT i1.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i)) + (SELECT i1.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i,j)) FROM integers i1; --error, subquery uses ungrouped column "i1.i" from outer query SELECT @@ -523,9 +523,10 @@ FROM integers i1; -- 1 SELECT - (SELECT i2.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i)) + (SELECT i2.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i,j)), + (SELECT i2.j FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i,j)) FROM integers i1; - -- 1 + -- 1, 3 SELECT (SELECT i2.i FROM (VALUES (i1.i)) as i2(i)) @@ -548,7 +549,7 @@ SELECT FROM integers i1; --error, more than one row returned by a subquery used as an expression SELECT - (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i)) + (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i,j)) FROM integers i1; --error, more than one row returned by a subquery used as an expression SELECT i FROM integers ORDER BY (SELECT true); diff --git a/sql/test/subquery/Tests/subquery3.stable.err b/sql/test/subquery/Tests/subquery3.stable.err --- a/sql/test/subquery/Tests/subquery3.stable.err +++ b/sql/test/subquery/Tests/subquery3.stable.err @@ -317,7 +317,7 @@ ERROR = !Cardinality violation, scalar v CODE = 21000 MAPI = (monetdb) /var/tmp/mtest-114297/.s.monetdb.33062 QUERY = SELECT - (SELECT i1.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i)) + (SELECT i1.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i,j)) FROM integers i1; --error, subquery uses ungrouped column "i1.i" from outer query ERROR = !SELECT: cannot use non GROUP BY column 'i1.i' in query results without an aggregate function CODE = 42000 @@ -329,7 +329,7 @@ ERROR = !Cardinality violation, scalar v CODE = 21000 MAPI = (monetdb) /var/tmp/mtest-600940/.s.monetdb.32137 QUERY = SELECT - (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i)) + (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i,j)) FROM integers i1; --error, more than one row returned by a subquery used as an expression ERROR = !Cardinality violation, scalar value expected CODE = 21000 diff --git a/sql/test/subquery/Tests/subquery3.stable.out b/sql/test/subquery/Tests/subquery3.stable.out --- a/sql/test/subquery/Tests/subquery3.stable.out +++ b/sql/test/subquery/Tests/subquery3.stable.out @@ -193,8 +193,8 @@ stdout of test 'subquery3` in directory # NOT SUM(t1.col2) * MIN(t1.col6 + t1.col6 - t1.col6 * t1.col6) NOT IN (SELECT MAX(t2.col6) FROM another_T t2 GROUP BY t1.col6 HAVING t1.col7 + MIN(t2.col8) < MAX(t2.col7 - t1.col6)) #FROM another_T t1 #GROUP BY t1.col7, t1.col6; -% .%23 # table_name -% %23 # name +% .%24 # table_name +% %24 # name % boolean # type % 5 # length [ false ] @@ -207,7 +207,7 @@ stdout of test 'subquery3` in directory #FROM another_T t1 #GROUP BY t1.col1, t1.col2; % ., . # table_name -% %213, %214 # name +% %271, %272 # name % tinyint, tinyint # type % 1, 1 # length [ 2, 2 ] @@ -231,7 +231,7 @@ stdout of test 'subquery3` in directory #FROM another_T t1 #GROUP BY t1.col1; % . # table_name -% %31 # name +% %62 # name % tinyint # type % 1 # length [ 1 ] @@ -286,8 +286,8 @@ stdout of test 'subquery3` in directory # NOT SUM(t1.col6) NOT IN (SELECT MAX(t2.col6) FROM another_T t2 GROUP BY t1.col6 HAVING t1.col7 < MAX(t2.col7 - t1.col6)) #FROM another_T t1 #GROUP BY t1.col7, t1.col6; -% .t1, .t1, .%17 # table_name -% col6, col7, %17 # name +% .t1, .t1, .%20 # table_name +% col6, col7, %20 # name % int, int, boolean # type % 4, 4, 5 # length [ 6, 7, false ] @@ -299,7 +299,7 @@ stdout of test 'subquery3` in directory #FROM another_T t1 #GROUP BY t1.col1, t1.col2; % . # table_name -% %36 # name +% %64 # name % tinyint # type % 1 # length [ 2 ] @@ -310,7 +310,7 @@ stdout of test 'subquery3` in directory # CASE WHEN NULL NOT IN (SELECT 1 FROM tbl_ProductSales tp FULL OUTER JOIN another_T t2 ON tp.ColID = t1.col1) THEN 1 ELSE 2 END #FROM another_T t1; % . # table_name -% %40 # name +% %105 # name % tinyint # type % 1 # length [ 2 ] @@ -488,11 +488,11 @@ stdout of test 'subquery3` in directory #SELECT # (SELECT i2.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i)) #FROM integers i1; -% .%10 # table_name -% %10 # name -% int # type -% 1 # length -[ 1 ] +% .%10, .%20 # table_name +% %10, %20 # name +% int, int # type +% 1, 1 # length +[ 1, 3 ] #SELECT # (SELECT i2.i FROM (VALUES (i1.i)) as i2(i)) #FROM integers i1; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list