diff --git a/client/mysql.cc b/client/mysql.cc index 82684b390cd96..67435704fcbdd 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -914,6 +914,7 @@ static COMMANDS commands[] = { { "ADDTIME", 0, 0, 0, ""}, { "AES_ENCRYPT", 0, 0, 0, ""}, { "AES_DECRYPT", 0, 0, 0, ""}, + { "ANY_VALUE", 0, 0, 0, ""}, { "AREA", 0, 0, 0, ""}, { "ASIN", 0, 0, 0, ""}, { "ASBINARY", 0, 0, 0, ""}, diff --git a/mysql-test/main/any_value.result b/mysql-test/main/any_value.result new file mode 100644 index 0000000000000..14faa00552397 --- /dev/null +++ b/mysql-test/main/any_value.result @@ -0,0 +1,170 @@ +# +# MDEV-10426: ANY_VALUE function +# +CREATE TABLE t0 (a INT, b INT); +CREATE TABLE t1 (a INT, b INT); +CREATE TABLE t2 (a INT, b INT); +CREATE TABLE t3 (c INT, d INT); +CREATE TABLE t4 (x INT, y INT, z INT); +CREATE TABLE t5 (x INT, y INT, INDEX idx (y, x)); +CREATE TABLE t6 (x INT, y CHAR(1), z INT); +INSERT INTO t0 VALUES (NULL,10),(NULL,10),(NULL,20),(NULL,20),(NULL,30); +INSERT INTO t1 VALUES (NULL,NULL),(NULL,NULL),(NULL,NULL); +INSERT INTO t2 VALUES (1,10),(2,10),(NULL,20),(3,20),(NULL,30),(4,40); +INSERT INTO t3 VALUES (1,100),(2,200),(3,300); +INSERT INTO t4 VALUES (1,10,10),(2,10,10),(3,20,20),(4,20,20),(5,30,30); +INSERT INTO t5 VALUES (1,10),(2,10),(3,20),(4,20),(5,30); +INSERT INTO t6 VALUES (1,'a',1),(1,'a',2),(1,'b',3),(1,'b',4),(2,'a',5),(2,'a',6),(2,'b',7); +SET @save_sql_mode=@@sql_mode; +SET SQL_MODE=''; +SELECT ANY_VALUE(b) FROM t2; +ANY_VALUE(b) +10 +SELECT b, a FROM t2 GROUP BY b; +b a +10 1 +20 NULL +30 NULL +40 4 +SELECT b, ANY_VALUE(a) FROM t2 GROUP BY b; +b ANY_VALUE(a) +10 1 +20 NULL +30 NULL +40 4 +SET SQL_MODE=ONLY_FULL_GROUP_BY; +SELECT ANY_VALUE(b) FROM t0; +ANY_VALUE(b) +10 +SELECT ANY_VALUE(b) FROM t2; +ANY_VALUE(b) +10 +SELECT COUNT(*), ANY_VALUE(b) FROM t2; +COUNT(*) ANY_VALUE(b) +6 10 +SELECT c FROM t3 WHERE ANY_VALUE(d) = 200; +ERROR HY000: Invalid use of group function +SELECT ANY_VALUE(b) FROM t0 GROUP BY b; +ANY_VALUE(b) +10 +20 +30 +SELECT ANY_VALUE(a), b FROM t2 GROUP BY b; +ANY_VALUE(a) b +1 10 +NULL 20 +NULL 30 +4 40 +SELECT ANY_VALUE(b) FROM t2 GROUP BY b; +ANY_VALUE(b) +10 +20 +30 +40 +SELECT b, ANY_VALUE(a + 100) FROM t2 GROUP BY b; +b ANY_VALUE(a + 100) +10 101 +20 NULL +30 NULL +40 104 +SELECT b, ANY_VALUE(a * 2 + b) FROM t2 GROUP BY b; +b ANY_VALUE(a * 2 + b) +10 12 +20 NULL +30 NULL +40 48 +SELECT y, ANY_VALUE(x + z) FROM t4 GROUP BY y; +y ANY_VALUE(x + z) +10 11 +20 23 +30 35 +SELECT ANY_VALUE(a) FROM t0; +ANY_VALUE(a) +NULL +SELECT b, ANY_VALUE(a) FROM t0 GROUP BY b; +b ANY_VALUE(a) +10 NULL +20 NULL +30 NULL +SELECT COUNT(*), ANY_VALUE(a) FROM t0; +COUNT(*) ANY_VALUE(a) +5 NULL +SELECT b, COUNT(*), ANY_VALUE(a) FROM t0 GROUP BY b; +b COUNT(*) ANY_VALUE(a) +10 2 NULL +20 2 NULL +30 1 NULL +SELECT ANY_VALUE(a), ANY_VALUE(b) FROM t1; +ANY_VALUE(a) ANY_VALUE(b) +NULL NULL +SELECT COUNT(*), ANY_VALUE(a) FROM t1; +COUNT(*) ANY_VALUE(a) +3 NULL +SELECT a, ANY_VALUE(b) FROM t1 GROUP BY a; +a ANY_VALUE(b) +NULL NULL +SELECT y, ANY_VALUE(x) FROM t5 GROUP BY y; +y ANY_VALUE(x) +10 1 +20 3 +30 5 +EXPLAIN SELECT y, ANY_VALUE(x) FROM t5 GROUP BY y; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t5 index NULL idx 10 NULL 5 Using index +SELECT b, (SELECT SUM(t3.d) + SUM(t2.a) FROM t3) AS sub FROM t2 GROUP BY b; +b sub +10 603 +20 603 +30 NULL +40 604 +SELECT b, (SELECT SUM(t3.d) + ANY_VALUE(t2.a) FROM t3) AS sub FROM t2 GROUP BY b; +b sub +10 601 +20 NULL +30 NULL +40 604 +SELECT y, ANY_VALUE(z) FROM t4 GROUP BY y HAVING ANY_VALUE(z) = 20; +y ANY_VALUE(z) +20 20 +SELECT x, y, ANY_VALUE(z) FROM t6 GROUP BY x, y WITH ROLLUP; +x y ANY_VALUE(z) +1 a 1 +1 b 3 +1 NULL 1 +2 a 5 +2 b 7 +2 NULL 5 +NULL NULL 1 +SELECT x, y, ANY_VALUE(x) OVER (PARTITION BY y) AS w FROM t4 ORDER BY x; +x y w +1 10 1 +2 10 1 +3 20 3 +4 20 3 +5 30 5 +SELECT x, y, ANY_VALUE(x) OVER () AS w FROM t4 ORDER BY x; +x y w +1 10 1 +2 10 1 +3 20 1 +4 20 1 +5 30 1 +SELECT x, y, ANY_VALUE(z) OVER (PARTITION BY y ORDER BY x) AS w FROM t4 ORDER BY x; +x y w +1 10 10 +2 10 10 +3 20 20 +4 20 20 +5 30 30 +DROP TABLE t0,t1,t2,t3,t4,t5,t6; +CREATE TABLE t (a CHAR CHARACTER SET latin2); +INSERT INTO t VALUES ('a'),('b'); +SELECT charset(ANY_VALUE(a)), collation(ANY_VALUE(a)) FROM t; +charset(ANY_VALUE(a)) collation(ANY_VALUE(a)) +latin2 latin2_general_ci +SELECT coercibility(ANY_VALUE(a)), coercibility(ANY_VALUE('x')) FROM t; +coercibility(ANY_VALUE(a)) coercibility(ANY_VALUE('x')) +2 6 +DROP TABLE t; +SET sql_mode=@save_sql_mode; +# End of 13.1 tests. diff --git a/mysql-test/main/any_value.test b/mysql-test/main/any_value.test new file mode 100644 index 0000000000000..cee0c7c54868f --- /dev/null +++ b/mysql-test/main/any_value.test @@ -0,0 +1,115 @@ +--echo # +--echo # MDEV-10426: ANY_VALUE function +--echo # + +CREATE TABLE t0 (a INT, b INT); +CREATE TABLE t1 (a INT, b INT); +CREATE TABLE t2 (a INT, b INT); +CREATE TABLE t3 (c INT, d INT); +CREATE TABLE t4 (x INT, y INT, z INT); +CREATE TABLE t5 (x INT, y INT, INDEX idx (y, x)); +CREATE TABLE t6 (x INT, y CHAR(1), z INT); +INSERT INTO t0 VALUES (NULL,10),(NULL,10),(NULL,20),(NULL,20),(NULL,30); +INSERT INTO t1 VALUES (NULL,NULL),(NULL,NULL),(NULL,NULL); +INSERT INTO t2 VALUES (1,10),(2,10),(NULL,20),(3,20),(NULL,30),(4,40); +INSERT INTO t3 VALUES (1,100),(2,200),(3,300); +INSERT INTO t4 VALUES (1,10,10),(2,10,10),(3,20,20),(4,20,20),(5,30,30); +INSERT INTO t5 VALUES (1,10),(2,10),(3,20),(4,20),(5,30); +INSERT INTO t6 VALUES (1,'a',1),(1,'a',2),(1,'b',3),(1,'b',4),(2,'a',5),(2,'a',6),(2,'b',7); + +SET @save_sql_mode=@@sql_mode; +SET SQL_MODE=''; + +SELECT ANY_VALUE(b) FROM t2; + +SELECT b, a FROM t2 GROUP BY b; +SELECT b, ANY_VALUE(a) FROM t2 GROUP BY b; + +SET SQL_MODE=ONLY_FULL_GROUP_BY; + +# +# Without GROUP BY +# + +SELECT ANY_VALUE(b) FROM t0; +SELECT ANY_VALUE(b) FROM t2; + +# Mixing real aggregate function +SELECT COUNT(*), ANY_VALUE(b) FROM t2; + +# In WHERE +--error ER_INVALID_GROUP_FUNC_USE +SELECT c FROM t3 WHERE ANY_VALUE(d) = 200; + +# +# With GROUP BY +# + +SELECT ANY_VALUE(b) FROM t0 GROUP BY b; + +# Regular use in SELECT-list +SELECT ANY_VALUE(a), b FROM t2 GROUP BY b; +SELECT ANY_VALUE(b) FROM t2 GROUP BY b; + +# Expression inside ANY_VALUE +SELECT b, ANY_VALUE(a + 100) FROM t2 GROUP BY b; +SELECT b, ANY_VALUE(a * 2 + b) FROM t2 GROUP BY b; +SELECT y, ANY_VALUE(x + z) FROM t4 GROUP BY y; + +# +# NULL handling +# + +SELECT ANY_VALUE(a) FROM t0; +SELECT b, ANY_VALUE(a) FROM t0 GROUP BY b; + +SELECT COUNT(*), ANY_VALUE(a) FROM t0; +SELECT b, COUNT(*), ANY_VALUE(a) FROM t0 GROUP BY b; + +SELECT ANY_VALUE(a), ANY_VALUE(b) FROM t1; +SELECT COUNT(*), ANY_VALUE(a) FROM t1; + +SELECT a, ANY_VALUE(b) FROM t1 GROUP BY a; + +# Table with index on GROUP BY column +SELECT y, ANY_VALUE(x) FROM t5 GROUP BY y; +EXPLAIN SELECT y, ANY_VALUE(x) FROM t5 GROUP BY y; + +# Correlated subquery +SELECT b, (SELECT SUM(t3.d) + SUM(t2.a) FROM t3) AS sub FROM t2 GROUP BY b; + +SELECT b, (SELECT SUM(t3.d) + ANY_VALUE(t2.a) FROM t3) AS sub FROM t2 GROUP BY b; + +# In HAVING +SELECT y, ANY_VALUE(z) FROM t4 GROUP BY y HAVING ANY_VALUE(z) = 20; + +# Rollup +SELECT x, y, ANY_VALUE(z) FROM t6 GROUP BY x, y WITH ROLLUP; + +# +# As a window function +# + +SELECT x, y, ANY_VALUE(x) OVER (PARTITION BY y) AS w FROM t4 ORDER BY x; +SELECT x, y, ANY_VALUE(x) OVER () AS w FROM t4 ORDER BY x; +SELECT x, y, ANY_VALUE(z) OVER (PARTITION BY y ORDER BY x) AS w FROM t4 ORDER BY x; + +DROP TABLE t0,t1,t2,t3,t4,t5,t6; + +# +# Charset/Collation/Coercibility Tests +# + +CREATE TABLE t (a CHAR CHARACTER SET latin2); +INSERT INTO t VALUES ('a'),('b'); + +# Charset/Collation preserved + +SELECT charset(ANY_VALUE(a)), collation(ANY_VALUE(a)) FROM t; +SELECT coercibility(ANY_VALUE(a)), coercibility(ANY_VALUE('x')) FROM t; + +DROP TABLE t; + +SET sql_mode=@save_sql_mode; + +--echo # End of 13.1 tests. diff --git a/mysql-test/main/group_by.result b/mysql-test/main/group_by.result index 57a3cf97e94eb..1034abeb3c616 100644 --- a/mysql-test/main/group_by.result +++ b/mysql-test/main/group_by.result @@ -1047,7 +1047,10 @@ m 3 SELECT (SELECT SUM(t1_outer.a) FROM t1 AS t1_inner LIMIT 1) FROM t1 AS t1_outer GROUP BY t1_outer.b; -ERROR 42000: 'test.t1_outer.a' isn't in GROUP BY +(SELECT SUM(t1_outer.a) FROM t1 AS t1_inner LIMIT 1) +3 +7 +11 SELECT 1 FROM t1 as t1_outer WHERE (SELECT t1_outer.b FROM t1 AS t1_inner GROUP BY t1_inner.b LIMIT 1); 1 @@ -3154,3 +3157,48 @@ we BPYFY BPYFY we c c DROP TABLE t1, t2; # End of 11.8 tests +# +# MDEV-39932: Assert correct ONLY_FULL_GROUP_BY behavior with outer refs in correlated subqueries +# +SET @save_sql_mode=@@sql_mode; +SET SQL_MODE = 'ONLY_FULL_GROUP_BY'; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT); +INSERT INTO t1 VALUES (1,1),(2,1),(3,2),(4,2),(5,3),(6,3); +SELECT (SELECT SUM(t1_inner.a) + t1_outer.a FROM t1 AS t1_inner LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +ERROR 42000: 'test.t1_outer.a' isn't in GROUP BY +SELECT (SELECT SUM(t1_outer.b) + t1_outer.a FROM t1 AS t1_inner LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +ERROR 42000: 'test.t1_outer.a' isn't in GROUP BY +SELECT (SELECT SUM(t1_inner.a + t1_outer.a) FROM t1 AS t1_inner LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +ERROR 42000: 'test.t1_outer.a' isn't in GROUP BY +SELECT (SELECT SUM(t1_outer.a) + t1_outer.b FROM t1 AS t1_inner LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +c1 +4 +9 +14 +SELECT (SELECT SUM(t1_inner.a) FROM t1 AS t1_inner WHERE t1_inner.a = t1_outer.a LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +ERROR 42000: 'test.t1_outer.a' isn't in GROUP BY +SELECT (SELECT t1_inner.a FROM t1 AS t1_inner WHERE t1_outer.a > 5 LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +ERROR 42000: 'test.t1_outer.a' isn't in GROUP BY +SELECT (SELECT t1_inner.a FROM t1 AS t1_inner WHERE SUM(t1_outer.a) > 5 LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +c1 +NULL +1 +1 +SELECT (SELECT t1_inner.a FROM t1 AS t1_inner GROUP BY t1_inner.a HAVING t1_inner.a + SUM(t1_outer.a) > 5 LIMIT 1) AS c1 +FROM t1 AS t1_outer GROUP BY t1_outer.b; +c1 +3 +1 +1 +DROP TABLE t1; +SET sql_mode=@save_sql_mode; +# +# End of 10.11 tests +# diff --git a/mysql-test/main/group_by.test b/mysql-test/main/group_by.test index 8009d976d191e..974749324edd4 100644 --- a/mysql-test/main/group_by.test +++ b/mysql-test/main/group_by.test @@ -793,7 +793,6 @@ SELECT (SELECT SUM(t1_inner.a) FROM t1 AS t1_inner GROUP BY t1_inner.b LIMIT 1) AS m FROM t1 AS t1_outer; ---error ER_WRONG_FIELD_WITH_GROUP SELECT (SELECT SUM(t1_outer.a) FROM t1 AS t1_inner LIMIT 1) FROM t1 AS t1_outer GROUP BY t1_outer.b; @@ -2231,3 +2230,47 @@ DROP TABLE t1, t2; --echo # End of 11.8 tests +--echo # +--echo # MDEV-39932: Assert correct ONLY_FULL_GROUP_BY behavior with outer refs in correlated subqueries +--echo # +SET @save_sql_mode=@@sql_mode; +SET SQL_MODE = 'ONLY_FULL_GROUP_BY'; + +CREATE TABLE t1 (a INT PRIMARY KEY, b INT); +INSERT INTO t1 VALUES (1,1),(2,1),(3,2),(4,2),(5,3),(6,3); + +--error ER_WRONG_FIELD_WITH_GROUP +SELECT (SELECT SUM(t1_inner.a) + t1_outer.a FROM t1 AS t1_inner LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +--error ER_WRONG_FIELD_WITH_GROUP +SELECT (SELECT SUM(t1_outer.b) + t1_outer.a FROM t1 AS t1_inner LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +--error ER_WRONG_FIELD_WITH_GROUP +SELECT (SELECT SUM(t1_inner.a + t1_outer.a) FROM t1 AS t1_inner LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +SELECT (SELECT SUM(t1_outer.a) + t1_outer.b FROM t1 AS t1_inner LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +--error ER_WRONG_FIELD_WITH_GROUP +SELECT (SELECT SUM(t1_inner.a) FROM t1 AS t1_inner WHERE t1_inner.a = t1_outer.a LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +--error ER_WRONG_FIELD_WITH_GROUP +SELECT (SELECT t1_inner.a FROM t1 AS t1_inner WHERE t1_outer.a > 5 LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +SELECT (SELECT t1_inner.a FROM t1 AS t1_inner WHERE SUM(t1_outer.a) > 5 LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +SELECT (SELECT t1_inner.a FROM t1 AS t1_inner GROUP BY t1_inner.a HAVING t1_inner.a + SUM(t1_outer.a) > 5 LIMIT 1) AS c1 + FROM t1 AS t1_outer GROUP BY t1_outer.b; + +DROP TABLE t1; +SET sql_mode=@save_sql_mode; + +--echo # +--echo # End of 10.11 tests +--echo # diff --git a/mysql-test/suite/perfschema/r/digest_view.result b/mysql-test/suite/perfschema/r/digest_view.result index 0f20350c8e29d..432c8eaff8ec4 100644 --- a/mysql-test/suite/perfschema/r/digest_view.result +++ b/mysql-test/suite/perfschema/r/digest_view.result @@ -191,17 +191,17 @@ SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR FROM performance_schema.events_statements_summary_by_digest ORDER BY DIGEST_TEXT; SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR -test 7f807b8cf301913b61deb32c6cab1e1b EXPLAIN SELECT * FROM `test` . `v1` 1 -test e17dbf6fd40651ae8bd34f6a3e8ef24e EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1 -test 602c8a82b325449790d331768979c6b9 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1 -test e261dc01764c5f2708df66fa22884459 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1 -test d63272115b72b81871327666eaeea38b EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1 -test 2885c2680299873f350feba04eeafaf8 SELECT * FROM `test` . `v1` 1 -test 311ba3c50a8a7360e6667ad134607fab SELECT * FROM `test` . `v1` WHERE `a` = ? 1 -test 5587d23d7fa7acabd8e15b0b9526a3c9 SELECT * FROM `test` . `v1` WHERE `b` > ? 1 -test dd24f2a9de5abbd2f9e8db1d5eaf615c SELECT `a` , `b` FROM `test` . `v1` 1 -test f15dd457d598d7befe8cf8047bed0927 SELECT `b` , `a` FROM `test` . `v1` 1 -test 750d4101ef2bcc9061debad4690a80d9 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 +test 8c92a6ee049c827302dc47cbce98b0b6 EXPLAIN SELECT * FROM `test` . `v1` 1 +test 2f8be9376d5ec147d9c7db162331b67b EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1 +test 36de669de2d8750ac9708659ddbddf2c EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1 +test 99c441e2d837275363e133406aac2d3d EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1 +test 99f2271a12bab66c3738b9ab4137d249 EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1 +test 0fecbb2e7f65284df5dc3ef9fcd19a5c SELECT * FROM `test` . `v1` 1 +test 37f57a741af937fc92eea53339a2c60c SELECT * FROM `test` . `v1` WHERE `a` = ? 1 +test 8967a67eb9b2f93083d47f6528cfff9e SELECT * FROM `test` . `v1` WHERE `b` > ? 1 +test 7c4c24a1eedd9a621f39cbfd3502ac78 SELECT `a` , `b` FROM `test` . `v1` 1 +test 234df289757769e4905c58338fa32d56 SELECT `b` , `a` FROM `test` . `v1` 1 +test 28cedb6b15f15fd336317ec60fad8db3 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 DROP TABLE test.v1; CREATE VIEW test.v1 AS SELECT * FROM test.t1; EXPLAIN SELECT * from test.v1; @@ -248,19 +248,19 @@ SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR FROM performance_schema.events_statements_summary_by_digest ORDER BY DIGEST_TEXT; SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR -test 2977c8beffabf7bebac017c7b95aefe3 CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1 -test fd8390bb0d24a48e871d95b5b0758269 DROP TABLE `test` . `v1` 1 -test 7f807b8cf301913b61deb32c6cab1e1b EXPLAIN SELECT * FROM `test` . `v1` 2 -test e17dbf6fd40651ae8bd34f6a3e8ef24e EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2 -test 602c8a82b325449790d331768979c6b9 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2 -test e261dc01764c5f2708df66fa22884459 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2 -test d63272115b72b81871327666eaeea38b EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2 -test 2885c2680299873f350feba04eeafaf8 SELECT * FROM `test` . `v1` 2 -test 311ba3c50a8a7360e6667ad134607fab SELECT * FROM `test` . `v1` WHERE `a` = ? 2 -test 5587d23d7fa7acabd8e15b0b9526a3c9 SELECT * FROM `test` . `v1` WHERE `b` > ? 2 -test d885cf933b5d3317333a02003dee7b48 SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1 -test dd24f2a9de5abbd2f9e8db1d5eaf615c SELECT `a` , `b` FROM `test` . `v1` 2 -test f15dd457d598d7befe8cf8047bed0927 SELECT `b` , `a` FROM `test` . `v1` 2 -test 750d4101ef2bcc9061debad4690a80d9 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 +test 3a0d63c722399b7610bc0266772706b3 CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1 +test f51a546b46b6f1fd55605213febad945 DROP TABLE `test` . `v1` 1 +test 8c92a6ee049c827302dc47cbce98b0b6 EXPLAIN SELECT * FROM `test` . `v1` 2 +test 2f8be9376d5ec147d9c7db162331b67b EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2 +test 36de669de2d8750ac9708659ddbddf2c EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2 +test 99c441e2d837275363e133406aac2d3d EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2 +test 99f2271a12bab66c3738b9ab4137d249 EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2 +test 0fecbb2e7f65284df5dc3ef9fcd19a5c SELECT * FROM `test` . `v1` 2 +test 37f57a741af937fc92eea53339a2c60c SELECT * FROM `test` . `v1` WHERE `a` = ? 2 +test 8967a67eb9b2f93083d47f6528cfff9e SELECT * FROM `test` . `v1` WHERE `b` > ? 2 +test 8f9bdc4443ea3f6472f12048188ef5ac SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1 +test 7c4c24a1eedd9a621f39cbfd3502ac78 SELECT `a` , `b` FROM `test` . `v1` 2 +test 234df289757769e4905c58338fa32d56 SELECT `b` , `a` FROM `test` . `v1` 2 +test 28cedb6b15f15fd336317ec60fad8db3 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 DROP VIEW test.v1; DROP TABLE test.t1; diff --git a/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result b/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result index d2fc10a678bb5..73f9896477599 100644 --- a/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result +++ b/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result @@ -8,5 +8,5 @@ SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 #################################### SELECT event_name, digest, digest_text, sql_text FROM events_statements_history_long; event_name digest digest_text sql_text -statement/sql/select bc85fb4e8188bed1c842f764ec9fb06a SELECT ? + ? + SELECT ... -statement/sql/truncate 208418d9203df0b1b2cadb4d7196ea77 TRUNCATE TABLE truncat... +statement/sql/select 7adcf0b0fdfd361331d11c1b1dca9fb9 SELECT ? + ? + SELECT ... +statement/sql/truncate 9a7022a63c6ea7994932ba87e7515552 TRUNCATE TABLE truncat... diff --git a/sql/item.cc b/sql/item.cc index 3bdd7f82da327..23a07f32c7e1f 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -6231,6 +6231,7 @@ Item_field::fix_outer_field(THD *thd, Field **from_field, Item **reference) if (*from_field) { if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY && + !thd->lex->in_sum_func && select->cur_pos_in_select_list != UNDEF_POS) { /* diff --git a/sql/item_sum.cc b/sql/item_sum.cc index efc5b9450c3f6..d319a048c4c4c 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -324,15 +324,20 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref) in_sum_func->outer_fields.push_back(field, thd->mem_root); } else + { sel->set_non_agg_field_used(true); + sel->join->non_agg_fields.push_back(field, thd->mem_root); + } } - if (sel->nest_level > aggr_level && - (sel->agg_func_used()) && - !sel->group_list.elements) + else if (sel->nest_level > aggr_level) { - my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS, - ER_THD(thd, ER_MIX_OF_GROUP_FUNC_AND_FIELDS), MYF(0)); - return TRUE; + if ((sel->agg_func_used()) && !sel->group_list.elements) + { + my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS, + ER_THD(thd, ER_MIX_OF_GROUP_FUNC_AND_FIELDS), MYF(0)); + return TRUE; + } + sel->join->non_agg_fields.push_back(field, thd->mem_root); } } } @@ -2610,6 +2615,46 @@ bool Item_sum_max::add() } +bool Item_sum_any_value::add() +{ + DBUG_ENTER("Item_sum_any_value::add"); + + if (!has_value) + { + value->store(args[0]); + value->cache_value(); + null_value= args[0]->null_value; + has_value= 1; + } + DBUG_RETURN(0); +} + + +void Item_sum_any_value::clear() +{ + DBUG_ENTER("Item_sum_any_value::clear"); + if (!const_item()) + { + value->clear(); + null_value= 1; + has_value= 0; + } + DBUG_VOID_RETURN; +} + + +void Item_sum_any_value::update_field() {} + + +Item *Item_sum_any_value::copy_or_same(THD* thd) +{ + DBUG_ENTER("Item_sum_any_value::copy_or_same"); + Item_sum_any_value *item= new (thd->mem_root) Item_sum_any_value(thd, this); + item->setup_hybrid(thd, args[0], value); + DBUG_RETURN(item); +} + + /* bit_or and bit_and */ longlong Item_sum_bit::val_int() diff --git a/sql/item_sum.h b/sql/item_sum.h index 39ed79e7c0203..14c98fc8c8e4d 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -348,7 +348,7 @@ class Item_sum :public Item_func_or_sum enum Sumfunctype { COUNT_FUNC, COUNT_DISTINCT_FUNC, SUM_FUNC, SUM_DISTINCT_FUNC, AVG_FUNC, - AVG_DISTINCT_FUNC, MIN_FUNC, MAX_FUNC, STD_FUNC, + AVG_DISTINCT_FUNC, ANY_VALUE_FUNC, MIN_FUNC, MAX_FUNC, STD_FUNC, VARIANCE_FUNC, SUM_BIT_FUNC, UDF_SUM_FUNC, GROUP_CONCAT_FUNC, ROW_NUMBER_FUNC, RANK_FUNC, DENSE_RANK_FUNC, PERCENT_RANK_FUNC, CUME_DIST_FUNC, NTILE_FUNC, FIRST_VALUE_FUNC, LAST_VALUE_FUNC, @@ -421,6 +421,7 @@ class Item_sum :public Item_func_or_sum bool is_aggr_sum_func() { switch (sum_func()) { + case ANY_VALUE_FUNC: case COUNT_FUNC: case COUNT_DISTINCT_FUNC: case SUM_FUNC: @@ -1255,6 +1256,41 @@ class Item_sum_max final :public Item_sum_min_max }; +class Item_sum_any_value final : public Item_sum_min_max +{ +public: + Item_sum_any_value(THD *thd, Item *item_par) + : Item_sum_min_max(thd, item_par, 1), has_value(FALSE) + { + } + Item_sum_any_value(THD *thd, Item_sum_any_value *item) + : Item_sum_min_max(thd, item), has_value(item->has_value) + { + } + + bool add() override; + void clear() override; + void update_field() override; + + enum Sumfunctype sum_func() const override { return ANY_VALUE_FUNC; } + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING sum_name= {STRING_WITH_LEN("any_value(")}; + return sum_name; + } + Item *copy_or_same(THD* thd) override; + +protected: + Item *shallow_copy(THD *thd) const override + { + return get_item_copy(thd, this); + } + +private: + bool has_value; +}; + + class Item_sum_bit :public Item_sum_int { public: diff --git a/sql/lex.h b/sql/lex.h index 5e52cbfc2a6ce..d129b77068872 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -70,6 +70,7 @@ SYMBOL symbols[] = { { "ANALYZE", SYM(ANALYZE_SYM)}, { "AND", SYM(AND_SYM)}, { "ANY", SYM(ANY_SYM)}, + { "ANY_VALUE", SYM(ANY_VALUE_SYM)}, { "ARRAY", SYM(ARRAY_SYM)}, { "AS", SYM(AS)}, { "ASC", SYM(ASC)}, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6ab9dff16ad4f..c306d90b68d10 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -486,6 +486,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %token ALTER /* SQL-2003-R */ %token ANALYZE_SYM %token AND_SYM /* SQL-2003-R */ +%token ANY_VALUE_SYM %token ASC /* SQL-2003-N */ %token ASENSITIVE_SYM /* FUTURE-USE */ %token AS /* SQL-2003-R */ @@ -11583,7 +11584,19 @@ udf_expr: ; sum_expr: - AVG_SYM '(' in_sum_expr ')' + ANY_VALUE_SYM '(' in_sum_expr ')' + { + $$= new (thd->mem_root) Item_sum_any_value(thd, $3); + if (unlikely($$ == NULL)) + MYSQL_YYABORT; + } + | ANY_VALUE_SYM '(' DISTINCT in_sum_expr ')' + { + $$= new (thd->mem_root) Item_sum_any_value(thd, $4); + if (unlikely($$ == NULL)) + MYSQL_YYABORT; + } + | AVG_SYM '(' in_sum_expr ')' { $$= new (thd->mem_root) Item_sum_avg(thd, $3, FALSE); if (unlikely($$ == NULL))