diff options
Diffstat (limited to 'mysql-test/t')
-rw-r--r-- | mysql-test/t/csv.test | 80 | ||||
-rw-r--r-- | mysql-test/t/ctype_cp1251.test | 10 | ||||
-rw-r--r-- | mysql-test/t/ctype_ldml.test | 27 | ||||
-rw-r--r-- | mysql-test/t/ctype_utf8.test | 13 | ||||
-rw-r--r-- | mysql-test/t/func_isnull.test | 12 | ||||
-rw-r--r-- | mysql-test/t/func_math.test | 11 | ||||
-rw-r--r-- | mysql-test/t/log_tables.test | 21 | ||||
-rw-r--r-- | mysql-test/t/myisam_crash_before_flush_keys.test | 3 | ||||
-rw-r--r-- | mysql-test/t/odbc.test | 4 | ||||
-rw-r--r-- | mysql-test/t/partition.test | 23 | ||||
-rw-r--r-- | mysql-test/t/partition_archive.test | 21 | ||||
-rw-r--r-- | mysql-test/t/partition_column.test | 17 | ||||
-rw-r--r-- | mysql-test/t/partition_innodb.test | 1 | ||||
-rw-r--r-- | mysql-test/t/select.test | 41 | ||||
-rw-r--r-- | mysql-test/t/sp-ucs2.test | 120 | ||||
-rw-r--r-- | mysql-test/t/subselect.test | 232 | ||||
-rw-r--r-- | mysql-test/t/type_blob.test | 20 | ||||
-rw-r--r-- | mysql-test/t/udf.test | 14 | ||||
-rw-r--r-- | mysql-test/t/union.test | 124 | ||||
-rw-r--r-- | mysql-test/t/view.test | 26 |
20 files changed, 722 insertions, 98 deletions
diff --git a/mysql-test/t/csv.test b/mysql-test/t/csv.test index cdf274190dd..ea949f463c9 100644 --- a/mysql-test/t/csv.test +++ b/mysql-test/t/csv.test @@ -1819,4 +1819,84 @@ repair table t1; select * from t1 limit 1; drop table t1; +# +# Bug #40814 CSV engine does not parse \X characters when they occur in unquoted fields +# + +--echo # +--echo # Test for the following cases +--echo # 1) integers and strings enclosed in quotes +--echo # 2) integers and strings not enclosed in quotes +--echo # 3) \X characters with quotes +--echo # 4) \X characters outside quotes +--echo # + +CREATE TABLE t1(c1 INT NOT NULL, c2 VARCHAR(50) NOT NULL) ENGINE=csv; + +--echo # remove the already existing .CSV file if any +--remove_file $MYSQLD_DATADIR/test/t1.CSV + +--echo # create the .CSV file that contains the hard-coded data used in +--echo # testing +--write_file $MYSQLD_DATADIR/test/t1.CSV +1,"integer sans quotes" +1,string sans quotes +1,quotes"in between" strings +"1",Integer with quote and string with no quote +1,"escape sequence \n \" \\ \r \a within quotes" +1,escape sequence \n \" \\ \r \a without quotes +EOF +--cat_file $MYSQLD_DATADIR/test/t1.CSV + +--echo # select from the table in which the data has been filled in using +--echo # the hard-coded .CSV file +SELECT * FROM t1; + +DROP TABLE t1; + +--echo # Test for the case when a field begins with a quote, but does not end in a +--echo # quote. +--echo # Note: This results in an error. + +CREATE TABLE t1(c1 INT NOT NULL, c2 VARCHAR(50) NOT NULL) ENGINE=csv; + +--echo # remove the already existing .CSV file if any +--remove_file $MYSQLD_DATADIR/test/t1.CSV + +--echo # create the .CSV file that contains the hard-coded data used in +--echo # testing +--write_file $MYSQLD_DATADIR/test/t1.CSV +1,"string only at the beginning quotes +EOF +--cat_file $MYSQLD_DATADIR/test/t1.CSV + +--echo # select from the table in which the data has been filled in using +--echo # the hard-coded .CSV file +--error ER_CRASHED_ON_USAGE +SELECT * FROM t1; + +DROP TABLE t1; + +--echo # Test for the case when a field ends with a quote, but does not begin in a +--echo # quote. +--echo # Note: This results in an error. + +CREATE TABLE t1(c1 INT NOT NULL, c2 VARCHAR(50) NOT NULL) ENGINE=csv; + +--echo # remove the already existing .CSV file if any +--remove_file $MYSQLD_DATADIR/test/t1.CSV + +--echo # create the .CSV file that contains the hard-coded data used in +--echo # testing +--write_file $MYSQLD_DATADIR/test/t1.CSV +1,string with only ending quotes" +EOF +--cat_file $MYSQLD_DATADIR/test/t1.CSV + +--echo # select from the table in which the data has been filled in using +--echo # the hard-coded .CSV file +--error ER_CRASHED_ON_USAGE +SELECT * FROM t1; + +DROP TABLE t1; --echo End of 5.1 tests diff --git a/mysql-test/t/ctype_cp1251.test b/mysql-test/t/ctype_cp1251.test index 463a9cea4bc..b6a1cfc3f98 100644 --- a/mysql-test/t/ctype_cp1251.test +++ b/mysql-test/t/ctype_cp1251.test @@ -47,4 +47,14 @@ insert into t1 (a) values ('air'), select * from t1 where a like 'we_%'; drop table t1; +# +# Bug#158 ENUM and SET types does not accept valid cp1251 character +# +CREATE TABLE t1 ( + e1 enum('ябълка'), + e2 enum('мляко') +) ENGINE=MYISAM character set cp1251; +SHOW CREATE TABLE t1; +DROP TABLE t1; + # End of 4.1 tests diff --git a/mysql-test/t/ctype_ldml.test b/mysql-test/t/ctype_ldml.test index 0fcfd603aad..99d9cd5a866 100644 --- a/mysql-test/t/ctype_ldml.test +++ b/mysql-test/t/ctype_ldml.test @@ -4,11 +4,30 @@ drop table if exists t1; --enable_warnings +--echo In the following tests we change the order of letter "b" +--echo making it equal to letter "a", and check that it works +--echo with all Unicode character sets set names utf8; --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR show variables like 'character_sets_dir%'; +show collation like 'utf8_phone_ci'; +CREATE TABLE t1 ( + name VARCHAR(64), + phone VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_phone_ci +); +INSERT INTO t1 VALUES ('Svoj','+7 912 800 80 02'); +INSERT INTO t1 VALUES ('Hf','+7 (912) 800 80 04'); +INSERT INTO t1 VALUES ('Bar','+7-912-800-80-01'); +INSERT INTO t1 VALUES ('Ramil','(7912) 800 80 03'); +INSERT INTO t1 VALUES ('Sanja','+380 (912) 8008005'); +SELECT * FROM t1 ORDER BY phone; +SELECT * FROM t1 WHERE phone='+7(912)800-80-01'; +SELECT * FROM t1 WHERE phone='79128008001'; +SELECT * FROM t1 WHERE phone='7 9 1 2 8 0 0 8 0 0 1'; +DROP TABLE t1; + show collation like 'utf8_test_ci'; create table t1 (c1 char(1) character set utf8 collate utf8_test_ci); insert into t1 values ('a'); @@ -125,3 +144,11 @@ CREATE TABLE t1 (s1 char(10) character set utf8 collate utf8_maxuserid_ci); INSERT INTO t1 VALUES ('a'),('b'); SELECT * FROM t1 WHERE s1='a' ORDER BY BINARY s1; DROP TABLE t1; + + +# +# Bug#47756 Setting 2byte collation ID with 'set names' crashes the server +# +SET NAMES utf8 COLLATE utf8_phone_ci; +SHOW COLLATION LIKE 'utf8_phone_ci'; +SET NAMES utf8; diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index bb3eaa84391..3cf87c2bd22 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -1431,6 +1431,19 @@ DROP TABLE t1; --echo Start of 5.4 tests # +# Bug#26180: Can't add columns to tables created with utf8 text indexes +# +CREATE TABLE t1 ( + clipid INT NOT NULL, + Tape TINYTEXT, + PRIMARY KEY (clipid), + KEY tape(Tape(255)) +) CHARACTER SET=utf8; +ALTER TABLE t1 ADD mos TINYINT DEFAULT 0 AFTER clipid; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +# # Bug#26474: Add Sinhala script (Sri Lanka) collation to MySQL # --disable_warnings diff --git a/mysql-test/t/func_isnull.test b/mysql-test/t/func_isnull.test index 6218efb882f..424f6dc6640 100644 --- a/mysql-test/t/func_isnull.test +++ b/mysql-test/t/func_isnull.test @@ -13,3 +13,15 @@ select * from t1 where isnull(to_days(mydate)); drop table t1; # End of 4.1 tests + +# +# Bug #41371 Select returns 1 row with condition "col is not null and col is null" +# + +CREATE TABLE t1 (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY(id)); +INSERT INTO t1( id ) VALUES ( NULL ); +SELECT t1.id FROM t1 WHERE (id is not null and id is null ); +DROP TABLE t1; + +# End of 5.1 tests + diff --git a/mysql-test/t/func_math.test b/mysql-test/t/func_math.test index 91fdce8addb..b999b1e8c1b 100644 --- a/mysql-test/t/func_math.test +++ b/mysql-test/t/func_math.test @@ -309,4 +309,15 @@ DROP TABLE t1; --echo # +# +# Bug #8457: Precision math: +# DIV returns incorrect result with large decimal value +# Bug #46606:Casting error for large numbers in 5.4 when 'div' is used + +--error ER_WARN_DATA_OUT_OF_RANGE +select 123456789012345678901234567890.123456789012345678901234567890 div 1 as x; +--error ER_WARN_DATA_OUT_OF_RANGE +select "123456789012345678901234567890.123456789012345678901234567890" div 1 as x; +SHOW WARNINGS; + --echo End of 5.1 tests diff --git a/mysql-test/t/log_tables.test b/mysql-test/t/log_tables.test index 076f2e8bc3b..5275b8e7db3 100644 --- a/mysql-test/t/log_tables.test +++ b/mysql-test/t/log_tables.test @@ -258,14 +258,21 @@ set global slow_query_log='OFF'; # check that alter table doesn't work for other engines set @save_storage_engine= @@session.storage_engine; set storage_engine= MEMORY; +# After fixing bug#35765 the error behaivor changed: +# If compiled in/enabled ER_UNSUPORTED_LOG_ENGINE +# If not (i.e. not existant) it will show a warning +# and use the current one. +alter table mysql.slow_log engine=NonExistentEngine; --error ER_UNSUPORTED_LOG_ENGINE -alter table mysql.slow_log engine=ndb; ---error ER_UNSUPORTED_LOG_ENGINE -alter table mysql.slow_log engine=innodb; ---error ER_UNSUPORTED_LOG_ENGINE -alter table mysql.slow_log engine=archive; ---error ER_UNSUPORTED_LOG_ENGINE -alter table mysql.slow_log engine=blackhole; +alter table mysql.slow_log engine=memory; +#--error ER_UNSUPORTED_LOG_ENGINE +#alter table mysql.slow_log engine=ndb; +#--error ER_UNSUPORTED_LOG_ENGINE +#alter table mysql.slow_log engine=innodb; +#--error ER_UNSUPORTED_LOG_ENGINE +#alter table mysql.slow_log engine=archive; +#--error ER_UNSUPORTED_LOG_ENGINE +#alter table mysql.slow_log engine=blackhole; set storage_engine= @save_storage_engine; drop table mysql.slow_log; diff --git a/mysql-test/t/myisam_crash_before_flush_keys.test b/mysql-test/t/myisam_crash_before_flush_keys.test index 1860ddd27e3..0b0491098cd 100644 --- a/mysql-test/t/myisam_crash_before_flush_keys.test +++ b/mysql-test/t/myisam_crash_before_flush_keys.test @@ -8,6 +8,9 @@ --echo # Binary must be compiled with debug for crash to occur --source include/have_debug.inc +call mtr.add_suppression("Got an error from thread_id=.*ha_myisam.cc:"); +call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table"); + let $MYSQLD_DATADIR= `select @@datadir`; SET GLOBAL delay_key_write=ALL; CREATE TABLE t1(a INT, diff --git a/mysql-test/t/odbc.test b/mysql-test/t/odbc.test index 6a754bb32a7..f1d60e15bc8 100644 --- a/mysql-test/t/odbc.test +++ b/mysql-test/t/odbc.test @@ -3,6 +3,8 @@ drop table if exists t1; --enable_warnings +set @@session.sql_auto_is_null=1; + # # Test some ODBC compatibility # @@ -32,3 +34,5 @@ SELECT sql_no_cache a, last_insert_id() FROM t1; DROP TABLE t1; # End of 4.1 tests + +set @@session.sql_auto_is_null=default; diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index 8ab91f23522..73365b85ca5 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -98,6 +98,29 @@ SELECT * FROM t1 WHERE pk < 0 ORDER BY pk; DROP TABLE t1; # +# Bug#35765: ALTER TABLE produces wrong error when non-existent storage engine +# used +CREATE TABLE t1 (a INT) +ENGINE=NonExistentEngine; +DROP TABLE t1; +CREATE TABLE t1 (a INT) +ENGINE=NonExistentEngine +PARTITION BY HASH (a); +DROP TABLE t1; +CREATE TABLE t1 (a INT) +ENGINE=Memory; +ALTER TABLE t1 ENGINE=NonExistentEngine; +# OK to only specify one partitions engine, since it is already assigned at +# table level (after create, it is specified on all levels and all parts). +ALTER TABLE t1 +PARTITION BY HASH (a) +(PARTITION p0 ENGINE=Memory, + PARTITION p1 ENGINE=NonExistentEngine); +ALTER TABLE t1 ENGINE=NonExistentEngine; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +# # Bug#40494: Crash MYSQL server crashes on range access with partitioning # and order by # diff --git a/mysql-test/t/partition_archive.test b/mysql-test/t/partition_archive.test index fad57107b7d..39551991702 100644 --- a/mysql-test/t/partition_archive.test +++ b/mysql-test/t/partition_archive.test @@ -10,6 +10,27 @@ --source include/have_partition.inc --source include/have_archive.inc +let $MYSQLD_DATADIR= `select @@datadir`; + +# +# Bug#44622: Using PARTITIONs with ARCHIVE engine reports 0 bytes in i_s.TABLES +# +CREATE TABLE t1 (f1 DATE NOT NULL) +ENGINE = ARCHIVE PARTITION BY RANGE (TO_DAYS(f1)) +(partition p1 values less than (733751), + partition p2 values less than MAXVALUE); + +INSERT INTO t1 VALUES(CURRENT_DATE); + +SELECT DATA_LENGTH, INDEX_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +SELECT DATA_LENGTH, INDEX_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +DROP TABLE t1; +CREATE TABLE t1 (f1 DATE NOT NULL) +ENGINE = ARCHIVE; +INSERT INTO t1 VALUES(CURRENT_DATE); +SELECT DATA_LENGTH, INDEX_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +SELECT DATA_LENGTH, INDEX_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +DROP TABLE t1; # # Bug 17310 Partitions: Bugs with archived partitioned tables diff --git a/mysql-test/t/partition_column.test b/mysql-test/t/partition_column.test index 7577325234f..9e47b94b036 100644 --- a/mysql-test/t/partition_column.test +++ b/mysql-test/t/partition_column.test @@ -9,6 +9,21 @@ drop table if exists t1; --enable_warnings # +# BUG#49180, Possible to define empty intervals for column list partitioning +# +--error ER_RANGE_NOT_INCREASING_ERROR +create table t1 (a int, b int) +partition by range columns (a,b) +( partition p0 values less than (maxvalue, 10), + partition p1 values less than (maxvalue, maxvalue)); + +--error ER_RANGE_NOT_INCREASING_ERROR +create table t1 (a int, b int, c int) +partition by range columns (a,b,c) +( partition p0 values less than (1, maxvalue, 10), + partition p1 values less than (1, maxvalue, maxvalue)); + +# # BUG#48161, Delivering too few records using collate syntax with partitions # # Test case from BUG#48447 with some extension @@ -78,7 +93,7 @@ subpartition by hash (to_seconds(d)) subpartitions 4 ( partition p0 values less than (1, '0', MAXVALUE, '1900-01-01'), partition p1 values less than (1, 'a', MAXVALUE, '1999-01-01'), - partition p2 values less than (1, 'a', MAXVALUE, MAXVALUE), + partition p2 values less than (1, 'b', MAXVALUE, MAXVALUE), partition p3 values less than (1, MAXVALUE, MAXVALUE, MAXVALUE)); select partition_method, partition_expression, partition_description from information_schema.partitions where table_name = "t1"; diff --git a/mysql-test/t/partition_innodb.test b/mysql-test/t/partition_innodb.test index 2e08834cfc7..fe3a5be085c 100644 --- a/mysql-test/t/partition_innodb.test +++ b/mysql-test/t/partition_innodb.test @@ -250,7 +250,6 @@ engine = innodb partition by list (a) (partition p0 values in (0)); --- error ER_MIX_HANDLER_ERROR alter table t1 engine = x; show create table t1; drop table t1; diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test index 51f0cd73374..95c16849633 100644 --- a/mysql-test/t/select.test +++ b/mysql-test/t/select.test @@ -3767,9 +3767,14 @@ INSERT INTO t1 VALUES (2),(3); --echo # Should not crash --error ER_SUBQUERY_NO_1_ROW SELECT 1 FROM t1 WHERE a <> 1 AND NOT -ROW(a,a) <=> ROW((SELECT 1 FROM t1 WHERE 1=2),(SELECT 1 FROM t1)) +ROW(1,a) <=> ROW(1,(SELECT 1 FROM t1)) INTO @var0; +# Query correctly return 2 rows since comparison a <=> fisrt_subquery is +# always false, thus the second query is never executed. +SELECT 1 FROM t1 WHERE a <> 1 AND NOT +ROW(a,a) <=> ROW((SELECT 1 FROM t1 WHERE 1=2),(SELECT 1 FROM t1)); + DROP TABLE t1; @@ -3918,4 +3923,38 @@ SELECT table1 .`time_key` field2 FROM B table1 LEFT JOIN BB JOIN A table5 ON drop table A,AA,B,BB; --echo #end of test for bug#45266 + +--echo # +--echo # Bug#33546: Slowdown on re-evaluation of constant expressions. +--echo # +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (2); +SELECT * FROM t1 WHERE a = 1 + 1; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = 1 + 1; +SELECT * FROM t1 HAVING a = 1 + 1; +EXPLAIN EXTENDED SELECT * FROM t1 HAVING a = 1 + 1; +SELECT * FROM t1, t2 WHERE a = b + (1 + 1); +EXPLAIN EXTENDED SELECT * FROM t1, t2 WHERE a = b + (1 + 1); +SELECT * FROM t2 LEFT JOIN t1 ON a = b + 1; +EXPLAIN EXTENDED SELECT * FROM t2 LEFT JOIN t1 ON a = b + 1; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a > UNIX_TIMESTAMP('2009-03-10 00:00:00'); + +delimiter |; +CREATE FUNCTION f1() RETURNS INT DETERMINISTIC +BEGIN + SET @cnt := @cnt + 1; + RETURN 1; +END;| +delimiter ;| + +SET @cnt := 0; +SELECT * FROM t1 WHERE a = f1(); +SELECT @cnt; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = f1(); +DROP TABLE t1, t2; +DROP FUNCTION f1; +--echo # End of bug#33546 + --echo End of 5.1 tests diff --git a/mysql-test/t/sp-ucs2.test b/mysql-test/t/sp-ucs2.test index 7dd88b04871..0480d8f0799 100644 --- a/mysql-test/t/sp-ucs2.test +++ b/mysql-test/t/sp-ucs2.test @@ -25,4 +25,124 @@ drop function bug17615| drop table t3| +# +# Testing COLLATE clause in +# - IN parameter +# - RETURNS +# - DELCARE +# + +CREATE FUNCTION f(f1 VARCHAR(64) CHARACTER SET ucs2 COLLATE ucs2_unicode_ci) + RETURNS VARCHAR(64) CHARACTER SET ucs2 COLLATE ucs2_danish_ci +BEGIN + DECLARE f2 VARCHAR(64) CHARACTER SET ucs2 COLLATE ucs2_swedish_ci; + DECLARE f3 VARCHAR(64) CHARACTER SET ucs2 COLLATE ucs2_bin; + SET f1= concat(collation(f1), ' ', collation(f2), ' ', collation(f3)); + RETURN f1; +END| +SELECT f('a')| +SELECT collation(f('a'))| +DROP FUNCTION f| + +# +# Testing keywords UNICODE + BINARY +# +CREATE FUNCTION f() + RETURNS VARCHAR(64) UNICODE BINARY +BEGIN + RETURN ''; +END| +SHOW CREATE FUNCTION f; +DROP FUNCTION f; + +CREATE FUNCTION f() + RETURNS VARCHAR(64) BINARY UNICODE +BEGIN + RETURN ''; +END| +SHOW CREATE FUNCTION f; +DROP FUNCTION f; + + +# +# Testing keywords ASCII + BINARY +# +CREATE FUNCTION f() + RETURNS VARCHAR(64) ASCII BINARY +BEGIN + RETURN ''; +END| +SHOW CREATE FUNCTION f; +DROP FUNCTION f; + +CREATE FUNCTION f() + RETURNS VARCHAR(64) BINARY ASCII +BEGIN + RETURN ''; +END| +SHOW CREATE FUNCTION f; +DROP FUNCTION f; + +# +# Testing COLLATE in OUT parameter +# + +CREATE PROCEDURE p1(IN f1 VARCHAR(64) CHARACTER SET ucs2 COLLATE ucs2_czech_ci, + OUT f2 VARCHAR(64) CHARACTER SET ucs2 COLLATE ucs2_polish_ci) +BEGIN + SET f2= f1; + SET f2= concat(collation(f1), ' ', collation(f2)); +END| + + +CREATE FUNCTION f1() + RETURNS VARCHAR(64) CHARACTER SET ucs2 +BEGIN + DECLARE f1 VARCHAR(64) CHARACTER SET ucs2; + DECLARE f2 VARCHAR(64) CHARACTER SET ucs2; + SET f1='str'; + CALL p1(f1, f2); + RETURN f2; +END| + + +SELECT f1()| +DROP PROCEDURE p1| +DROP FUNCTION f1| + + +# +# COLLATE with no CHARACTER SET in IN param +# +--error ER_NOT_SUPPORTED_YET +CREATE FUNCTION f(f1 VARCHAR(64) COLLATE ucs2_unicode_ci) + RETURNS VARCHAR(64) CHARACTER SET ucs2 +BEGIN + RETURN 'str'; +END| + + +# +# COLLATE with no CHARACTER SET in RETURNS +# +--error ER_NOT_SUPPORTED_YET +CREATE FUNCTION f(f1 VARCHAR(64) CHARACTER SET ucs2) + RETURNS VARCHAR(64) COLLATE ucs2_unicode_ci +BEGIN + RETURN 'str'; +END| + + +# +# COLLATE with no CHARACTER SET in DECLARE +# +--error ER_NOT_SUPPORTED_YET +CREATE FUNCTION f(f1 VARCHAR(64) CHARACTER SET ucs2) + RETURNS VARCHAR(64) CHARACTER SET ucs2 +BEGIN + DECLARE f2 VARCHAR(64) COLLATE ucs2_unicode_ci; + RETURN 'str'; +END| + + delimiter ;| diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 7f2dba00ba8..98c4a75c426 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -2513,8 +2513,6 @@ DROP TABLE t1, t2; CREATE TABLE t1 (i INT); (SELECT i FROM t1) UNION (SELECT i FROM t1); -#TODO:not supported ---error ER_PARSE_ERROR SELECT sql_no_cache * FROM t1 WHERE NOT EXISTS ( (SELECT i FROM t1) UNION @@ -2531,8 +2529,6 @@ WHERE NOT EXISTS (((SELECT i FROM t1) UNION (SELECT i FROM t1))); explain select ((select t11.i from t1 t11) union (select t12.i from t1 t12)) from t1; -#TODO:not supported ---error ER_PARSE_ERROR explain select * from t1 where not exists ((select t11.i from t1 t11) union (select t12.i from t1 t12)); @@ -3203,8 +3199,6 @@ EXPLAIN EXTENDED SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a)); -#TODO:not supported ---error ER_PARSE_ERROR EXPLAIN EXTENDED SELECT 2 FROM t1 WHERE EXISTS ((SELECT 1 FROM t2 WHERE t1.a=t2.a) UNION (SELECT 1 FROM t2 WHERE t1.a = t2.a)); @@ -3544,6 +3538,232 @@ where v in(select v where t1.g=t2.g) is unknown; drop table t1, t2; +-- echo # +-- echo # Bug#33204: INTO is allowed in subselect, causing inconsistent results +-- echo # +CREATE TABLE t1( a INT ); +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2( a INT, b INT ); + +--error ER_PARSE_ERROR +SELECT * +FROM (SELECT a INTO @var FROM t1 WHERE a = 2) t1a; +--error ER_PARSE_ERROR +SELECT * +FROM (SELECT a INTO OUTFILE 'file' FROM t1 WHERE a = 2) t1a; +--error ER_PARSE_ERROR +SELECT * +FROM (SELECT a INTO DUMPFILE 'file' FROM t1 WHERE a = 2) t1a; + +--error ER_PARSE_ERROR +SELECT * FROM ( + SELECT 1 a + UNION + SELECT a INTO @var FROM t1 WHERE a = 2 +) t1a; + +--error ER_PARSE_ERROR +SELECT * FROM ( + SELECT 1 a + UNION + SELECT a INTO OUTFILE 'file' FROM t1 WHERE a = 2 +) t1a; + +--error ER_PARSE_ERROR +SELECT * FROM ( + SELECT 1 a + UNION + SELECT a INTO DUMPFILE 'file' FROM t1 WHERE a = 2 +) t1a; + +SELECT * FROM (SELECT a FROM t1 WHERE a = 2) t1a; + +SELECT * FROM ( + SELECT a FROM t1 WHERE a = 2 + UNION + SELECT a FROM t1 WHERE a = 2 +) t1a; + +SELECT * FROM ( + SELECT 1 a + UNION + SELECT a FROM t1 WHERE a = 2 + UNION + SELECT a FROM t1 WHERE a = 2 +) t1a; + +# This was not allowed previously. Possibly, it should be allowed on the future. +# For now, the intent is to keep the fix as non-intrusive as possible. +--error ER_PARSE_ERROR +SELECT * FROM ((SELECT 1 a) UNION SELECT 1 a); +SELECT * FROM (SELECT 1 a UNION (SELECT 1 a)) alias; +SELECT * FROM (SELECT 1 UNION SELECT 1) t1a; +--error ER_PARSE_ERROR +SELECT * FROM ((SELECT 1 a INTO @a)) t1a; +--error ER_PARSE_ERROR +SELECT * FROM ((SELECT 1 a INTO OUTFILE 'file' )) t1a; +--error ER_PARSE_ERROR +SELECT * FROM ((SELECT 1 a INTO DUMPFILE 'file' )) t1a; + +--error ER_PARSE_ERROR +SELECT * FROM (SELECT 1 a UNION (SELECT 1 a INTO @a)) t1a; +--error ER_PARSE_ERROR +SELECT * FROM (SELECT 1 a UNION (SELECT 1 a INTO DUMPFILE 'file' )) t1a; +--error ER_PARSE_ERROR +SELECT * FROM (SELECT 1 a UNION (SELECT 1 a INTO OUTFILE 'file' )) t1a; + +--error ER_PARSE_ERROR +SELECT * FROM (SELECT 1 a UNION ((SELECT 1 a INTO @a))) t1a; +--error ER_PARSE_ERROR +SELECT * FROM (SELECT 1 a UNION ((SELECT 1 a INTO DUMPFILE 'file' ))) t1a; +--error ER_PARSE_ERROR +SELECT * FROM (SELECT 1 a UNION ((SELECT 1 a INTO OUTFILE 'file' ))) t1a; + +SELECT * FROM (SELECT 1 a ORDER BY a) t1a; +SELECT * FROM (SELECT 1 a UNION SELECT 1 a ORDER BY a) t1a; +SELECT * FROM (SELECT 1 a UNION SELECT 1 a LIMIT 1) t1a; +SELECT * FROM (SELECT 1 a UNION SELECT 1 a ORDER BY a LIMIT 1) t1a; + +# Test of rule +# table_factor: '(' get_select_lex query_expression_body ')' opt_table_alias +# UNION should not be allowed inside the parentheses, nor should +# aliases after. +# +SELECT * FROM t1 JOIN (SELECT 1 UNION SELECT 1) alias ON 1; +--error ER_PARSE_ERROR +SELECT * FROM t1 JOIN ((SELECT 1 UNION SELECT 1)) ON 1; +--error ER_PARSE_ERROR +SELECT * FROM t1 JOIN (t1 t1a UNION SELECT 1) ON 1; +--error ER_PARSE_ERROR +SELECT * FROM t1 JOIN ((t1 t1a UNION SELECT 1)) ON 1; +--error ER_PARSE_ERROR +SELECT * FROM t1 JOIN (t1 t1a) t1a ON 1; +--error ER_PARSE_ERROR +SELECT * FROM t1 JOIN ((t1 t1a)) t1a ON 1; + +SELECT * FROM t1 JOIN (t1 t1a) ON 1; +SELECT * FROM t1 JOIN ((t1 t1a)) ON 1; + +SELECT * FROM (t1 t1a); +SELECT * FROM ((t1 t1a)); + +SELECT * FROM t1 JOIN (SELECT 1 t1a) alias ON 1; +SELECT * FROM t1 JOIN ((SELECT 1 t1a)) alias ON 1; + +SELECT * FROM t1 JOIN (SELECT 1 a) a ON 1; +SELECT * FROM t1 JOIN ((SELECT 1 a)) a ON 1; + +# For the join, TABLE_LIST::select_lex == NULL +# Check that we handle this. +--error ER_PARSE_ERROR +SELECT * FROM (t1 JOIN (SELECT 1) t1a1 ON 1) t1a2; + +SELECT * FROM t1 WHERE a = ALL ( SELECT 1 ); +SELECT * FROM t1 WHERE a = ALL ( SELECT 1 UNION SELECT 1 ); +SELECT * FROM t1 WHERE a = ANY ( SELECT 3 UNION SELECT 1 ); + +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ANY ( SELECT 1 UNION SELECT 1 INTO @a); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ANY ( SELECT 1 UNION SELECT 1 INTO OUTFILE 'file' ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ANY ( SELECT 1 UNION SELECT 1 INTO DUMPFILE 'file' ); + +SELECT * FROM t1 WHERE a = ( SELECT 1 ); +SELECT * FROM t1 WHERE a = ( SELECT 1 UNION SELECT 1 ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( SELECT 1 INTO @a); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( SELECT 1 INTO OUTFILE 'file' ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( SELECT 1 INTO DUMPFILE 'file' ); + +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( SELECT 1 UNION SELECT 1 INTO @a); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( SELECT 1 UNION SELECT 1 INTO OUTFILE 'file' ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( SELECT 1 UNION SELECT 1 INTO DUMPFILE 'file' ); + +--error ER_PARSE_ERROR +SELECT ( SELECT 1 INTO @v ); +--error ER_PARSE_ERROR +SELECT ( SELECT 1 INTO OUTFILE 'file' ); +--error ER_PARSE_ERROR +SELECT ( SELECT 1 INTO DUMPFILE 'file' ); + +--error ER_PARSE_ERROR +SELECT ( SELECT 1 UNION SELECT 1 INTO @v ); +--error ER_PARSE_ERROR +SELECT ( SELECT 1 UNION SELECT 1 INTO OUTFILE 'file' ); +--error ER_PARSE_ERROR +SELECT ( SELECT 1 UNION SELECT 1 INTO DUMPFILE 'file' ); + +# Make sure context is popped when we leave the nested select +SELECT ( SELECT a FROM t1 WHERE a = 1 ), a FROM t1; +SELECT ( SELECT a FROM t1 WHERE a = 1 UNION SELECT 1 ), a FROM t1; + +# Make sure we have feature F561 (see .yy file) +SELECT * FROM t2 WHERE (a, b) IN (SELECT a, b FROM t2); + +# Make sure the parser does not allow nested UNIONs anywhere + +--error ER_PARSE_ERROR +SELECT 1 UNION ( SELECT 1 UNION SELECT 1 ); +--error ER_PARSE_ERROR +( SELECT 1 UNION SELECT 1 ) UNION SELECT 1; + +--error ER_PARSE_ERROR +SELECT ( SELECT 1 UNION ( SELECT 1 UNION SELECT 1 ) ); +--error ER_PARSE_ERROR +SELECT ( ( SELECT 1 UNION SELECT 1 ) UNION SELECT 1; +SELECT ( SELECT 1 UNION SELECT 1 UNION SELECT 1 ); +SELECT ((SELECT 1 UNION SELECT 1 UNION SELECT 1)); + +--error ER_PARSE_ERROR +SELECT * FROM ( SELECT 1 UNION ( SELECT 1 UNION SELECT 1 ) ); +--error ER_PARSE_ERROR +SELECT * FROM ( ( SELECT 1 UNION SELECT 1 ) UNION SELECT 1 ); +SELECT * FROM ( SELECT 1 UNION SELECT 1 UNION SELECT 1 ) a; + +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( SELECT 1 UNION ( SELECT 1 UNION SELECT 1 ) ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ALL ( SELECT 1 UNION ( SELECT 1 UNION SELECT 1 ) ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ANY ( SELECT 1 UNION ( SELECT 1 UNION SELECT 1 ) ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a IN ( SELECT 1 UNION ( SELECT 1 UNION SELECT 1 ) ); + +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ( ( SELECT 1 UNION SELECT 1 ) UNION SELECT 1 ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ALL ( ( SELECT 1 UNION SELECT 1 ) UNION SELECT 1 ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a = ANY ( ( SELECT 1 UNION SELECT 1 ) UNION SELECT 1 ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a IN ( ( SELECT 1 UNION SELECT 1 ) UNION SELECT 1 ); + +SELECT * FROM t1 WHERE a = ( SELECT 1 UNION SELECT 1 UNION SELECT 1 ); +SELECT * FROM t1 WHERE a = ALL ( SELECT 1 UNION SELECT 1 UNION SELECT 1 ); +SELECT * FROM t1 WHERE a = ANY ( SELECT 1 UNION SELECT 1 UNION SELECT 1 ); +SELECT * FROM t1 WHERE a IN ( SELECT 1 UNION SELECT 1 UNION SELECT 1 ); + +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE EXISTS ( SELECT 1 UNION SELECT 1 INTO @v ); +SELECT EXISTS(SELECT 1+1); +--error ER_PARSE_ERROR +SELECT EXISTS(SELECT 1+1 INTO @test); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a IN ( SELECT 1 UNION SELECT 1 INTO @v ); + +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE EXISTS ( SELECT 1 INTO @v ); +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE a IN ( SELECT 1 INTO @v ); + +DROP TABLE t1, t2; # # Bug #31157: Crash when select+order by the avg of some field within the # group by diff --git a/mysql-test/t/type_blob.test b/mysql-test/t/type_blob.test index 17ffade5f63..c06d8ac97e0 100644 --- a/mysql-test/t/type_blob.test +++ b/mysql-test/t/type_blob.test @@ -598,3 +598,23 @@ explain select convert(1, binary(4294967296)); explain select convert(1, binary(999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999)); --echo End of 5.0 tests + +# +# Bug #33969: Updating a text field via a left join +# + +CREATE TABLE t1(id INT NOT NULL); +CREATE TABLE t2(id INT NOT NULL, c TEXT NOT NULL); + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1, ''); + +UPDATE t2 SET c = REPEAT('1', 70000); +SELECT LENGTH(c) FROM t2; + +UPDATE t1 LEFT JOIN t2 USING(id) SET t2.c = REPEAT('1', 70000) WHERE t1.id = 1; +SELECT LENGTH(c) FROM t2; + +DROP TABLE t1, t2; + +--echo End of 5.1 tests diff --git a/mysql-test/t/udf.test b/mysql-test/t/udf.test index 7bf252040e5..7e383ce69fa 100644 --- a/mysql-test/t/udf.test +++ b/mysql-test/t/udf.test @@ -449,3 +449,17 @@ SELECT IF( a = 1, a, a ) AS `b` FROM t1 ORDER BY field( `b`, 1 ); DROP TABLE t1; --echo End of 5.0 tests. + +--echo # +--echo # Bug#33546: Slowdown on re-evaluation of constant expressions. +--echo # +CREATE TABLE t1 (f1 INT); +INSERT INTO t1 VALUES(1),(50); +--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB +eval CREATE FUNCTION myfunc_double RETURNS INTEGER SONAME "$UDF_EXAMPLE_LIB"; +EXPLAIN EXTENDED SELECT 1 FROM t1 WHERE f1=1 + myfunc_double(1); +DROP FUNCTION myfunc_double; +DROP TABLE t1; +--echo # +--echo End of 5.1 tests. + diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index ec169838d59..dc4173039d2 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -91,88 +91,6 @@ SELECT @a:=1 UNION SELECT @a:=@a+1; (SELECT 1) UNION (SELECT 2) ORDER BY (SELECT a); (SELECT 1,3) UNION (SELECT 2,1) ORDER BY (SELECT 2); - -# -# Bug#32858: Erro: "Incorrect usage of UNION and INTO" does not take subselects -# into account -# -CREATE TABLE t1 (a INT); -INSERT INTO t1 VALUES (1); - -SELECT a INTO @v FROM ( - SELECT a FROM t1 - UNION - SELECT a FROM t1 -) alias; - ---let $outfile = $MYSQLTEST_VARDIR/tmp/union.out.file ---error 0,1 ---remove_file $outfile - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> -eval SELECT a INTO OUTFILE '$outfile' FROM ( - SELECT a FROM t1 - UNION - SELECT a FROM t1 WHERE 0 -) alias; ---remove_file $outfile - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> -eval SELECT a INTO DUMPFILE '$outfile' FROM ( - SELECT a FROM t1 - UNION - SELECT a FROM t1 WHERE 0 -) alias; ---remove_file $outfile - -# -# INTO will not be allowed in subqueries in version 5.1 and above. -# -SELECT a FROM ( - SELECT a FROM t1 - UNION - SELECT a INTO @v FROM t1 -) alias; - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> -eval SELECT a FROM ( - SELECT a FROM t1 - UNION - SELECT a INTO OUTFILE '$outfile' FROM t1 -) alias; ---remove_file $outfile - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> -eval SELECT a FROM ( - SELECT a FROM t1 - UNION - SELECT a INTO DUMPFILE '$outfile' FROM t1 -) alias; ---remove_file $outfile - -SELECT a FROM t1 UNION SELECT a INTO @v FROM t1; - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> -eval SELECT a FROM t1 UNION SELECT a INTO OUTFILE '$outfile' FROM t1; ---remove_file $outfile - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> -eval SELECT a FROM t1 UNION SELECT a INTO DUMPFILE '$outfile' FROM t1; ---remove_file $outfile - ---error ER_WRONG_USAGE -SELECT a INTO @v FROM t1 UNION SELECT a FROM t1; - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> ---error ER_WRONG_USAGE -eval SELECT a INTO OUTFILE '$outfile' FROM t1 UNION SELECT a FROM t1; - ---replace_result $MYSQLTEST_VARDIR <MYSQLTEST_VARDIR> ---error ER_WRONG_USAGE -eval SELECT a INTO DUMPFILE '$outfile' FROM t1 UNION SELECT a FROM t1; - -DROP TABLE t1; - # # Test bug reported by joc@presence-pc.com # @@ -1102,3 +1020,45 @@ DROP TABLE t1; --echo End of 5.0 tests +-- echo # +-- echo # Bug#32858: Error: "Incorrect usage of UNION and INTO" does not take +-- echo # subselects into account +-- echo # +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1); + +-- echo # Tests fix in parser rule select_derived_union. +SELECT a INTO @v FROM ( + SELECT a FROM t1 + UNION + SELECT a FROM t1 +) alias; + +SELECT a INTO OUTFILE 'union.out.file' FROM ( + SELECT a FROM t1 + UNION + SELECT a FROM t1 WHERE 0 +) alias; + +SELECT a INTO DUMPFILE 'union.out.file2' FROM ( + SELECT a FROM t1 + UNION + SELECT a FROM t1 WHERE 0 +) alias; + +SELECT a FROM t1 UNION SELECT a INTO @v FROM t1; +SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file5' FROM t1; +SELECT a FROM t1 UNION SELECT a INTO OUTFILE 'union.out.file6' FROM t1; +--error ER_WRONG_USAGE +SELECT a INTO @v FROM t1 UNION SELECT a FROM t1; +--error ER_WRONG_USAGE +SELECT a INTO OUTFILE 'union.out.file7' FROM t1 UNION SELECT a FROM t1; +--error ER_WRONG_USAGE +SELECT a INTO DUMPFILE 'union.out.file8' FROM t1 UNION SELECT a FROM t1; + +-- echo # Tests fix in parser rule query_expression_body. +SELECT ( SELECT a UNION SELECT a ) INTO @v FROM t1; +SELECT ( SELECT a UNION SELECT a ) INTO OUTFILE 'union.out.file3' FROM t1; +SELECT ( SELECT a UNION SELECT a ) INTO DUMPFILE 'union.out.file4' FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index abf8dac2870..4515f26bc52 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -3908,3 +3908,29 @@ DROP TABLE t1; --echo # ----------------------------------------------------------------- --echo # -- End of 5.1 tests. --echo # ----------------------------------------------------------------- + +# +# Bug#9801 (Views: imperfect error message) +# + +--disable_warnings +drop table if exists t_9801; +drop view if exists v_9801; +--enable_warnings + +create table t_9801 (s1 int); + +--error ER_VIEW_NONUPD_CHECK +create view v_9801 as + select sum(s1) from t_9801 with check option; + +--error ER_VIEW_NONUPD_CHECK +create view v_9801 as + select sum(s1) from t_9801 group by s1 with check option; + + --error ER_VIEW_NONUPD_CHECK +create view v_9801 as + select sum(s1) from t_9801 group by s1 with rollup with check option; + +drop table t_9801; + |