mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge from next-mr
This commit is contained in:
@ -1456,3 +1456,22 @@ SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) from t1 GROUP BY b;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
|
||||
--echo Start of 5.4 tests
|
||||
#
|
||||
# Bug#26474: Add Sinhala script (Sri Lanka) collation to MySQL
|
||||
#
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
CREATE TABLE t1 (
|
||||
predicted_order int NOT NULL,
|
||||
utf8_encoding VARCHAR(10) NOT NULL
|
||||
) CHARACTER SET utf8;
|
||||
INSERT INTO t1 VALUES (19, x'E0B696'), (30, x'E0B69AE0B798'), (61, x'E0B6AF'), (93, x'E0B799'), (52, x'E0B6A6'), (73, x'E0B6BBE0B78AE2808D'), (3, x'E0B686'), (56, x'E0B6AA'), (55, x'E0B6A9'), (70, x'E0B6B9'), (94, x'E0B79A'), (80, x'E0B785'), (25, x'E0B69AE0B791'), (48, x'E0B6A2'), (13, x'E0B690'), (86, x'E0B793'), (91, x'E0B79F'), (81, x'E0B786'), (79, x'E0B784'), (14, x'E0B691'), (99, x'E0B78A'), (8, x'E0B68B'), (68, x'E0B6B7'), (22, x'E0B69A'), (16, x'E0B693'), (33, x'E0B69AE0B7B3'), (38, x'E0B69AE0B79D'), (21, x'E0B683'), (11, x'E0B68E'), (77, x'E0B782'), (40, x'E0B69AE0B78A'), (101, x'E0B78AE2808DE0B6BB'), (35, x'E0B69AE0B79A'), (1, x'E0B7B4'), (9, x'E0B68C'), (96, x'E0B79C'), (6, x'E0B689'), (95, x'E0B79B'), (88, x'E0B796'), (64, x'E0B6B3'), (26, x'E0B69AE0B792'), (82, x'E0B78F'), (28, x'E0B69AE0B794'), (39, x'E0B69AE0B79E'), (97, x'E0B79D'), (2, x'E0B685'), (75, x'E0B780'), (34, x'E0B69AE0B799'), (69, x'E0B6B8'), (83, x'E0B790'), (18, x'E0B695'), (90, x'E0B7B2'), (17, x'E0B694'), (72, x'E0B6BB'), (66, x'E0B6B5'), (59, x'E0B6AD'), (44, x'E0B69E'), (15, x'E0B692'), (23, x'E0B69AE0B78F'), (65, x'E0B6B4'), (42, x'E0B69C'), (63, x'E0B6B1'), (85, x'E0B792'), (47, x'E0B6A1'), (49, x'E0B6A3'), (92, x'E0B7B3'), (78, x'E0B783'), (36, x'E0B69AE0B79B'), (4, x'E0B687'), (24, x'E0B69AE0B790'), (87, x'E0B794'), (37, x'E0B69AE0B79C'), (32, x'E0B69AE0B79F'), (29, x'E0B69AE0B796'), (43, x'E0B69D'), (62, x'E0B6B0'), (100, x'E0B78AE2808DE0B6BA'), (60, x'E0B6AE'), (45, x'E0B69F'), (12, x'E0B68F'), (46, x'E0B6A0'), (50, x'E0B6A5'), (51, x'E0B6A4'), (5, x'E0B688'), (76, x'E0B781'), (89, x'E0B798'), (74, x'E0B6BD'), (10, x'E0B68D'), (57, x'E0B6AB'), (71, x'E0B6BA'), (58, x'E0B6AC'), (27, x'E0B69AE0B793'), (54, x'E0B6A8'), (84, x'E0B791'), (31, x'E0B69AE0B7B2'), (98, x'E0B79E'), (53, x'E0B6A7'), (41, x'E0B69B'), (67, x'E0B6B6'), (7, x'E0B68A'), (20, x'E0B682');
|
||||
SELECT predicted_order, hex(utf8_encoding) FROM t1 ORDER BY utf8_encoding COLLATE utf8_sinhala_ci;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.4 tests
|
||||
|
||||
|
@ -694,3 +694,35 @@ SELECT 1 FROM t1 WHERE t1.a NOT IN
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
# Bug#36785: Wrong error message when group_concat() exceeds max length
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(6), b INT);
|
||||
CREATE TABLE t2 (a VARCHAR(6), b INT);
|
||||
|
||||
INSERT INTO t1 VALUES ('111111', 1);
|
||||
INSERT INTO t1 VALUES ('222222', 2);
|
||||
INSERT INTO t1 VALUES ('333333', 3);
|
||||
INSERT INTO t1 VALUES ('444444', 4);
|
||||
INSERT INTO t1 VALUES ('555555', 5);
|
||||
|
||||
SET group_concat_max_len = 5;
|
||||
SET @old_sql_mode = @@sql_mode, @@sql_mode = 'traditional';
|
||||
|
||||
SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b LIMIT 3;
|
||||
--error ER_CUT_VALUE_GROUP_CONCAT
|
||||
INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b;
|
||||
UPDATE t1 SET a = '11111' WHERE b = 1;
|
||||
UPDATE t1 SET a = '22222' WHERE b = 2;
|
||||
--error ER_CUT_VALUE_GROUP_CONCAT
|
||||
INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b;
|
||||
|
||||
SET group_concat_max_len = DEFAULT;
|
||||
SET @@sql_mode = @old_sql_mode;
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -1318,3 +1318,45 @@ insert into t1 values (-1),(null);
|
||||
explain select 1 as a from t1,(select decode(f1,f1) as b from t1) a;
|
||||
explain select 1 as a from t1,(select encode(f1,f1) as b from t1) a;
|
||||
drop table t1;
|
||||
|
||||
|
||||
|
||||
--echo Start of 5.4 tests
|
||||
#
|
||||
# WL#4584 Internationalized number format
|
||||
#
|
||||
SELECT format(12345678901234567890.123, 3);
|
||||
SELECT format(12345678901234567890.123, 3, NULL);
|
||||
SELECT format(12345678901234567890.123, 3, 'ar_AE');
|
||||
SELECT format(12345678901234567890.123, 3, 'ar_SA');
|
||||
SELECT format(12345678901234567890.123, 3, 'be_BY');
|
||||
SELECT format(12345678901234567890.123, 3, 'de_DE');
|
||||
SELECT format(12345678901234567890.123, 3, 'en_IN');
|
||||
SELECT format(12345678901234567890.123, 3, 'en_US');
|
||||
SELECT format(12345678901234567890.123, 3, 'it_CH');
|
||||
SELECT format(12345678901234567890.123, 3, 'ru_RU');
|
||||
SELECT format(12345678901234567890.123, 3, 'ta_IN');
|
||||
|
||||
CREATE TABLE t1 (fmt CHAR(5) NOT NULL);
|
||||
INSERT INTO t1 VALUES ('ar_AE');
|
||||
INSERT INTO t1 VALUES ('ar_SA');
|
||||
INSERT INTO t1 VALUES ('be_BY');
|
||||
INSERT INTO t1 VALUES ('de_DE');
|
||||
INSERT INTO t1 VALUES ('en_IN');
|
||||
INSERT INTO t1 VALUES ('en_US');
|
||||
INSERT INTO t1 VALUES ('it_CH');
|
||||
INSERT INTO t1 VALUES ('ru_RU');
|
||||
INSERT INTO t1 VALUES ('ta_IN');
|
||||
SELECT fmt, format(12345678901234567890.123, 3, fmt) FROM t1 ORDER BY fmt;
|
||||
SELECT fmt, format(12345678901234567890.123, 0, fmt) FROM t1 ORDER BY fmt;
|
||||
SELECT fmt, format(12345678901234567890, 3, fmt) FROM t1 ORDER BY fmt;
|
||||
SELECT fmt, format(-12345678901234567890, 3, fmt) FROM t1 ORDER BY fmt;
|
||||
SELECT fmt, format(-02345678901234567890, 3, fmt) FROM t1 ORDER BY fmt;
|
||||
SELECT fmt, format(-00345678901234567890, 3, fmt) FROM t1 ORDER BY fmt;
|
||||
SELECT fmt, format(-00045678901234567890, 3, fmt) FROM t1 ORDER BY fmt;
|
||||
DROP TABLE t1;
|
||||
|
||||
SELECT format(123, 1, 'Non-existent-locale');
|
||||
|
||||
--echo End of 5.4 tests
|
||||
|
||||
|
@ -570,13 +570,13 @@ explain select count(distinct a1,a2,b) from t1 where (a2 >= 'b') and (b = 'a');
|
||||
explain select count(distinct a1,a2,b,c) from t1 where (a2 >= 'b') and (b = 'a') and (c = 'i121');
|
||||
explain extended select count(distinct a1,a2,b) from t1 where (a1 > 'a') and (a2 > 'a') and (b = 'c');
|
||||
explain select count(distinct b) from t1 where (a2 >= 'b') and (b = 'a');
|
||||
explain extended select ord(a1) + count(distinct a1,a2,b) from t1 where (a1 > 'a') and (a2 > 'a');
|
||||
explain extended select 98 + count(distinct a1,a2,b) from t1 where (a1 > 'a') and (a2 > 'a');
|
||||
|
||||
select count(distinct a1,a2,b) from t1 where (a2 >= 'b') and (b = 'a');
|
||||
select count(distinct a1,a2,b,c) from t1 where (a2 >= 'b') and (b = 'a') and (c = 'i121');
|
||||
select count(distinct a1,a2,b) from t1 where (a1 > 'a') and (a2 > 'a') and (b = 'c');
|
||||
select count(distinct b) from t1 where (a2 >= 'b') and (b = 'a');
|
||||
select ord(a1) + count(distinct a1,a2,b) from t1 where (a1 > 'a') and (a2 > 'a');
|
||||
select 98 + count(distinct a1,a2,b) from t1 where (a1 > 'a') and (a2 > 'a');
|
||||
|
||||
#
|
||||
# Queries with expressions in the select clause
|
||||
@ -1033,3 +1033,124 @@ SELECT a, MAX(b) FROM t WHERE b GROUP BY a;
|
||||
DROP TABLE t;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # WL#3220 (Loose index scan for COUNT DISTINCT)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT, c INT, KEY (a,b));
|
||||
INSERT INTO t1 VALUES (1,1,1), (1,2,1), (1,3,1), (1,4,1);
|
||||
INSERT INTO t1 SELECT a, b + 4, 1 FROM t1;
|
||||
INSERT INTO t1 SELECT a + 1, b, 1 FROM t1;
|
||||
CREATE TABLE t2 (a INT, b INT, c INT, d INT, e INT, f INT, KEY (a,b,c));
|
||||
INSERT INTO t2 VALUES (1,1,1,1,1,1), (1,2,1,1,1,1), (1,3,1,1,1,1),
|
||||
(1,4,1,1,1,1);
|
||||
INSERT INTO t2 SELECT a, b + 4, c,d,e,f FROM t2;
|
||||
INSERT INTO t2 SELECT a + 1, b, c,d,e,f FROM t2;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a) FROM t1;
|
||||
SELECT COUNT(DISTINCT a) FROM t1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a,b) FROM t1;
|
||||
SELECT COUNT(DISTINCT a,b) FROM t1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT b,a) FROM t1;
|
||||
SELECT COUNT(DISTINCT b,a) FROM t1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT b) FROM t1;
|
||||
SELECT COUNT(DISTINCT b) FROM t1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a) FROM t1 GROUP BY a;
|
||||
SELECT COUNT(DISTINCT a) FROM t1 GROUP BY a;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT b) FROM t1 GROUP BY a;
|
||||
SELECT COUNT(DISTINCT b) FROM t1 GROUP BY a;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a) FROM t1 GROUP BY b;
|
||||
SELECT COUNT(DISTINCT a) FROM t1 GROUP BY b;
|
||||
|
||||
EXPLAIN SELECT DISTINCT COUNT(DISTINCT a) FROM t1;
|
||||
SELECT DISTINCT COUNT(DISTINCT a) FROM t1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a, b + 0) FROM t1;
|
||||
SELECT COUNT(DISTINCT a, b + 0) FROM t1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a) FROM t1 HAVING COUNT(DISTINCT b) < 10;
|
||||
SELECT COUNT(DISTINCT a) FROM t1 HAVING COUNT(DISTINCT b) < 10;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a) FROM t1 HAVING COUNT(DISTINCT c) < 10;
|
||||
SELECT COUNT(DISTINCT a) FROM t1 HAVING COUNT(DISTINCT c) < 10;
|
||||
|
||||
EXPLAIN SELECT 1 FROM t1 HAVING COUNT(DISTINCT a) < 10;
|
||||
SELECT 1 FROM t1 HAVING COUNT(DISTINCT a) < 10;
|
||||
|
||||
EXPLAIN SELECT 1 FROM t1 GROUP BY a HAVING COUNT(DISTINCT b) > 1;
|
||||
SELECT 1 FROM t1 GROUP BY a HAVING COUNT(DISTINCT b) > 1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT t1_1.a) FROM t1 t1_1, t1 t1_2 GROUP BY t1_1.a;
|
||||
SELECT COUNT(DISTINCT t1_1.a) FROM t1 t1_1, t1 t1_2 GROUP BY t1_1.a;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a), 12 FROM t1;
|
||||
SELECT COUNT(DISTINCT a), 12 FROM t1;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a, b, c) FROM t2;
|
||||
SELECT COUNT(DISTINCT a, b, c) FROM t2;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a), SUM(DISTINCT a), AVG(DISTINCT a) FROM t2;
|
||||
SELECT COUNT(DISTINCT a), SUM(DISTINCT a), AVG(DISTINCT a) FROM t2;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a), SUM(DISTINCT a), AVG(DISTINCT f) FROM t2;
|
||||
SELECT COUNT(DISTINCT a), SUM(DISTINCT a), AVG(DISTINCT f) FROM t2;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a, b), COUNT(DISTINCT b, a) FROM t2;
|
||||
SELECT COUNT(DISTINCT a, b), COUNT(DISTINCT b, a) FROM t2;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a, b), COUNT(DISTINCT b, f) FROM t2;
|
||||
SELECT COUNT(DISTINCT a, b), COUNT(DISTINCT b, f) FROM t2;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a, b), COUNT(DISTINCT b, d) FROM t2;
|
||||
SELECT COUNT(DISTINCT a, b), COUNT(DISTINCT b, d) FROM t2;
|
||||
|
||||
EXPLAIN SELECT a, c, COUNT(DISTINCT c, a, b) FROM t2 GROUP BY a, b, c;
|
||||
SELECT a, c, COUNT(DISTINCT c, a, b) FROM t2 GROUP BY a, b, c;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT c, a, b) FROM t2
|
||||
WHERE a > 5 AND b BETWEEN 10 AND 20 GROUP BY a, b, c;
|
||||
SELECT COUNT(DISTINCT c, a, b) FROM t2
|
||||
WHERE a > 5 AND b BETWEEN 10 AND 20 GROUP BY a, b, c;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT b), SUM(DISTINCT b) FROM t2 WHERE a = 5
|
||||
GROUP BY b;
|
||||
SELECT COUNT(DISTINCT b), SUM(DISTINCT b) FROM t2 WHERE a = 5
|
||||
GROUP BY b;
|
||||
|
||||
EXPLAIN SELECT a, COUNT(DISTINCT b), SUM(DISTINCT b) FROM t2 GROUP BY a;
|
||||
SELECT a, COUNT(DISTINCT b), SUM(DISTINCT b) FROM t2 GROUP BY a;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT b), SUM(DISTINCT b) FROM t2 GROUP BY a;
|
||||
SELECT COUNT(DISTINCT b), SUM(DISTINCT b) FROM t2 GROUP BY a;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a, b) FROM t2 WHERE c = 13 AND d = 42;
|
||||
SELECT COUNT(DISTINCT a, b) FROM t2 WHERE c = 13 AND d = 42;
|
||||
|
||||
EXPLAIN SELECT a, COUNT(DISTINCT a), SUM(DISTINCT a) FROM t2
|
||||
WHERE b = 13 AND c = 42 GROUP BY a;
|
||||
SELECT a, COUNT(DISTINCT a), SUM(DISTINCT a) FROM t2
|
||||
WHERE b = 13 AND c = 42 GROUP BY a;
|
||||
|
||||
EXPLAIN SELECT COUNT(DISTINCT a, b), SUM(DISTINCT a) FROM t2 WHERE b = 42;
|
||||
SELECT COUNT(DISTINCT a, b), SUM(DISTINCT a) FROM t2 WHERE b = 42;
|
||||
|
||||
EXPLAIN SELECT SUM(DISTINCT a), MAX(b) FROM t2 GROUP BY a;
|
||||
SELECT SUM(DISTINCT a), MAX(b) FROM t2 GROUP BY a;
|
||||
|
||||
EXPLAIN SELECT 42 * (a + c + COUNT(DISTINCT c, a, b)) FROM t2 GROUP BY a, b, c;
|
||||
SELECT 42 * (a + c + COUNT(DISTINCT c, a, b)) FROM t2 GROUP BY a, b, c;
|
||||
|
||||
EXPLAIN SELECT (SUM(DISTINCT a) + MAX(b)) FROM t2 GROUP BY a;
|
||||
SELECT (SUM(DISTINCT a) + MAX(b)) FROM t2 GROUP BY a;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo # end of WL#3220 tests
|
||||
|
@ -21,14 +21,10 @@ let $index_merge_random_rows_in_EXPLAIN = 1;
|
||||
# InnoDB does not support Merge tables (affects include/index_merge1.inc)
|
||||
let $merge_table_support= 0;
|
||||
|
||||
# The first two tests are disabled because of non deterministic explain output.
|
||||
# If include/index_merge1.inc can be enabled for InnoDB and all other
|
||||
# storage engines, please remove the subtest for Bug#21277 from
|
||||
# include/index_merge2.inc.
|
||||
# This test exists already in include/index_merge1.inc.
|
||||
# -- [DISABLED Bug#45727]
|
||||
# --source include/index_merge1.inc
|
||||
# --source include/index_merge_ror.inc
|
||||
# --source include/index_merge2.inc
|
||||
|
||||
--source include/index_merge2.inc
|
||||
--source include/index_merge_2sweeps.inc
|
||||
--source include/index_merge_ror_cpk.inc
|
||||
|
48
mysql-test/t/information_schema-big.test
Normal file
48
mysql-test/t/information_schema-big.test
Normal file
@ -0,0 +1,48 @@
|
||||
# This test uses grants, which can't get tested for embedded server
|
||||
-- source include/big_test.inc
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
# check that CSV engine was compiled in, as the result of the test depends
|
||||
# on the presence of the log tables (which are CSV-based).
|
||||
--source include/have_csv.inc
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t0,t1,t2,t3,t4,t5;
|
||||
DROP VIEW IF EXISTS v1;
|
||||
--enable_warnings
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#18925: subqueries with MIN/MAX functions on INFORMARTION_SCHEMA
|
||||
--echo #
|
||||
|
||||
SELECT t.table_name, c1.column_name
|
||||
FROM information_schema.tables t
|
||||
INNER JOIN
|
||||
information_schema.columns c1
|
||||
ON t.table_schema = c1.table_schema AND
|
||||
t.table_name = c1.table_name
|
||||
WHERE t.table_schema = 'information_schema' AND
|
||||
c1.ordinal_position =
|
||||
( SELECT COALESCE(MIN(c2.ordinal_position),1)
|
||||
FROM information_schema.columns c2
|
||||
WHERE c2.table_schema = t.table_schema AND
|
||||
c2.table_name = t.table_name AND
|
||||
c2.column_name LIKE '%SCHEMA%'
|
||||
)
|
||||
AND t.table_name NOT LIKE 'innodb%';
|
||||
SELECT t.table_name, c1.column_name
|
||||
FROM information_schema.tables t
|
||||
INNER JOIN
|
||||
information_schema.columns c1
|
||||
ON t.table_schema = c1.table_schema AND
|
||||
t.table_name = c1.table_name
|
||||
WHERE t.table_schema = 'information_schema' AND
|
||||
c1.ordinal_position =
|
||||
( SELECT COALESCE(MIN(c2.ordinal_position),1)
|
||||
FROM information_schema.columns c2
|
||||
WHERE c2.table_schema = 'information_schema' AND
|
||||
c2.table_name = t.table_name AND
|
||||
c2.column_name LIKE '%SCHEMA%'
|
||||
)
|
||||
AND t.table_name NOT LIKE 'innodb%';
|
@ -913,41 +913,6 @@ DROP FUNCTION f1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP USER mysql_bug20230@localhost;
|
||||
|
||||
#
|
||||
# Bug#18925 subqueries with MIN/MAX functions on INFORMARTION_SCHEMA
|
||||
#
|
||||
|
||||
SELECT t.table_name, c1.column_name
|
||||
FROM information_schema.tables t
|
||||
INNER JOIN
|
||||
information_schema.columns c1
|
||||
ON t.table_schema = c1.table_schema AND
|
||||
t.table_name = c1.table_name
|
||||
WHERE t.table_schema = 'information_schema' AND
|
||||
c1.ordinal_position =
|
||||
( SELECT COALESCE(MIN(c2.ordinal_position),1)
|
||||
FROM information_schema.columns c2
|
||||
WHERE c2.table_schema = t.table_schema AND
|
||||
c2.table_name = t.table_name AND
|
||||
c2.column_name LIKE '%SCHEMA%'
|
||||
)
|
||||
AND t.table_name not like 'innodb_%';
|
||||
SELECT t.table_name, c1.column_name
|
||||
FROM information_schema.tables t
|
||||
INNER JOIN
|
||||
information_schema.columns c1
|
||||
ON t.table_schema = c1.table_schema AND
|
||||
t.table_name = c1.table_name
|
||||
WHERE t.table_schema = 'information_schema' AND
|
||||
c1.ordinal_position =
|
||||
( SELECT COALESCE(MIN(c2.ordinal_position),1)
|
||||
FROM information_schema.columns c2
|
||||
WHERE c2.table_schema = 'information_schema' AND
|
||||
c2.table_name = t.table_name AND
|
||||
c2.column_name LIKE '%SCHEMA%'
|
||||
)
|
||||
AND t.table_name not like 'innodb_%';
|
||||
|
||||
#
|
||||
# Bug#2123 query with a simple non-correlated subquery over
|
||||
# INFORMARTION_SCHEMA.TABLES
|
||||
|
107
mysql-test/t/loadxml.test
Normal file
107
mysql-test/t/loadxml.test
Normal file
@ -0,0 +1,107 @@
|
||||
#
|
||||
# Tests for "LOAD XML" - a contributed patch from Erik Wetterberg.
|
||||
#
|
||||
|
||||
# Running the $MYSQL_DUMP tool against an embedded server does not work.
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
create table t1 (a int, b varchar(64));
|
||||
|
||||
|
||||
--echo -- Load a static XML file
|
||||
load xml infile '../../std_data/loadxml.dat' into table t1
|
||||
rows identified by '<row>';
|
||||
select * from t1 order by a;
|
||||
delete from t1;
|
||||
|
||||
|
||||
--echo -- Load a static XML file with 'IGNORE num ROWS'
|
||||
load xml infile '../../std_data/loadxml.dat' into table t1
|
||||
rows identified by '<row>' ignore 4 rows;
|
||||
select * from t1 order by a;
|
||||
|
||||
|
||||
--echo -- Check 'mysqldump --xml' + 'LOAD XML' round trip
|
||||
--exec $MYSQL_DUMP --xml test t1 > "$MYSQLTEST_VARDIR/tmp/loadxml-dump.xml" 2>&1
|
||||
delete from t1;
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
--eval load xml infile '$MYSQLTEST_VARDIR/tmp/loadxml-dump.xml' into table t1 rows identified by '<row>';
|
||||
select * from t1 order by a;
|
||||
|
||||
--echo --Check that default row tag is '<row>
|
||||
delete from t1;
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
--eval load xml infile '$MYSQLTEST_VARDIR/tmp/loadxml-dump.xml' into table t1;
|
||||
select * from t1 order by a;
|
||||
|
||||
--echo -- Check that 'xml' is not a keyword
|
||||
select 1 as xml;
|
||||
|
||||
|
||||
#
|
||||
# Bug #42520 killing load .. infile Assertion failed: ! is_set(), file .\sql_error.cc, line 8
|
||||
#
|
||||
|
||||
--disable_query_log
|
||||
delete from t1;
|
||||
insert into t1 values (1, '12345678900987654321'), (2, 'asdfghjkl;asdfghjkl;');
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
insert into t1 select * from t1;
|
||||
--exec $MYSQL_DUMP --xml test t1 > "$MYSQLTEST_VARDIR/tmp/loadxml-dump.xml" 2>&1
|
||||
--enable_query_log
|
||||
|
||||
connect (addconroot, localhost, root,,);
|
||||
connection addconroot;
|
||||
create table t2(fl text);
|
||||
--let $PSEUDO_THREAD_ID=`select @@pseudo_thread_id `
|
||||
|
||||
--send LOAD XML LOCAL INFILE "$MYSQLTEST_VARDIR/tmp/loadxml-dump.xml" INTO TABLE t2 ROWS IDENTIFIED BY '<person>';
|
||||
|
||||
sleep 3;
|
||||
|
||||
|
||||
connection default;
|
||||
--replace_column 1 # 3 localhost 6 #
|
||||
show processlist;
|
||||
|
||||
--disable_query_log
|
||||
--eval kill $PSEUDO_THREAD_ID
|
||||
--enable_query_log
|
||||
|
||||
disconnect addconroot;
|
||||
|
||||
#
|
||||
# Clean up
|
||||
#
|
||||
remove_file $MYSQLTEST_VARDIR/tmp/loadxml-dump.xml;
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
||||
#
|
||||
# Bug #36750 LOAD XML doesn't understand new line (feed) characters in multi line text fields
|
||||
#
|
||||
|
||||
create table t1 (
|
||||
id int(11) not null,
|
||||
text text,
|
||||
primary key (id)
|
||||
) engine=MyISAM default charset=latin1;
|
||||
load xml infile '../../std_data/loadxml2.dat' into table t1;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
34
mysql-test/t/locale.test
Normal file
34
mysql-test/t/locale.test
Normal file
@ -0,0 +1,34 @@
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
--echo Start of 5.4 tests
|
||||
|
||||
--echo #
|
||||
--echo # WL#4642 Greek locale for DAYNAME, MONTHNAME, DATE_FORMAT
|
||||
--echo #
|
||||
|
||||
SET NAMES utf8;
|
||||
|
||||
SET @@lc_time_names=109;
|
||||
SELECT @@lc_time_names;
|
||||
|
||||
CREATE TABLE t1 (a DATE);
|
||||
INSERT INTO t1 VALUES
|
||||
('2006-01-01'),('2006-01-02'),('2006-01-03'),
|
||||
('2006-01-04'),('2006-01-05'),('2006-01-06'),('2006-01-07');
|
||||
SELECT a, date_format(a,'%a') as abday, dayname(a) as day FROM t1 ORDER BY a;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (a DATE);
|
||||
INSERT INTO t1 VALUES
|
||||
('2006-01-01'),('2006-02-01'),('2006-03-01'),
|
||||
('2006-04-01'),('2006-05-01'),('2006-06-01'),
|
||||
('2006-07-01'),('2006-08-01'),('2006-09-01'),
|
||||
('2006-10-01'),('2006-11-01'),('2006-12-01');
|
||||
SELECT a, date_format(a,'%b') as abmon, monthname(a) as mon FROM t1 ORDER BY a;
|
||||
|
||||
SELECT format(123456.789, 3, 'el_GR');
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.4 tests
|
@ -130,3 +130,60 @@ SELECT COALESCE(d, d), IFNULL(d, d), IF(i, d, d),
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
# Verify that column metadata is correct for all possible data types.
|
||||
# Originally about BUG#42980 "Client doesn't set NUM_FLAG for DECIMAL"
|
||||
|
||||
create table t1(
|
||||
# numeric types
|
||||
bool_col bool,
|
||||
boolean_col boolean,
|
||||
bit_col bit(5),
|
||||
tiny tinyint,
|
||||
tiny_uns tinyint unsigned,
|
||||
small smallint,
|
||||
small_uns smallint unsigned,
|
||||
medium mediumint,
|
||||
medium_uns mediumint unsigned,
|
||||
int_col int,
|
||||
int_col_uns int unsigned,
|
||||
big bigint,
|
||||
big_uns bigint unsigned,
|
||||
decimal_col decimal(10,5),
|
||||
# synonyms of DECIMAL
|
||||
numeric_col numeric(10),
|
||||
fixed_col fixed(10),
|
||||
dec_col dec(10),
|
||||
decimal_col_uns decimal(10,5) unsigned,
|
||||
fcol float,
|
||||
fcol_uns float unsigned,
|
||||
dcol double,
|
||||
double_precision_col double precision,
|
||||
dcol_uns double unsigned,
|
||||
# date/time types
|
||||
date_col date,
|
||||
time_col time,
|
||||
timestamp_col timestamp,
|
||||
year_col year,
|
||||
datetime_col datetime,
|
||||
# string types
|
||||
char_col char(5),
|
||||
varchar_col varchar(10),
|
||||
binary_col binary(10),
|
||||
varbinary_col varbinary(10),
|
||||
tinyblob_col tinyblob,
|
||||
blob_col blob,
|
||||
mediumblob_col mediumblob,
|
||||
longblob_col longblob,
|
||||
text_col text,
|
||||
mediumtext_col mediumtext,
|
||||
longtext_col longtext,
|
||||
enum_col enum("A","B","C"),
|
||||
set_col set("F","E","D")
|
||||
);
|
||||
|
||||
--enable_metadata
|
||||
select * from t1;
|
||||
--disable_metadata
|
||||
|
||||
drop table t1;
|
||||
|
@ -1159,3 +1159,22 @@ INSERT INTO t1 VALUES ('2006-03-01 12:00:00');
|
||||
-- echo must use p0 only:
|
||||
explain partitions select * from t1 where recdate < '2006-01-01 00:00:00';
|
||||
drop table t1;
|
||||
|
||||
-- echo #
|
||||
-- echo # BUG#33730 Full table scan instead selected partitions for query more than 10 partitions
|
||||
-- echo #
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int)
|
||||
partition by range(a+0) (
|
||||
partition p0 values less than (64),
|
||||
partition p1 values less than (128),
|
||||
partition p2 values less than (255)
|
||||
);
|
||||
insert into t1 select A.a + 10*B.a from t0 A, t0 B;
|
||||
|
||||
# this will use interval_via_walking
|
||||
explain partitions select * from t1 where a between 10 and 13;
|
||||
explain partitions select * from t1 where a between 10 and 10+33;
|
||||
|
||||
drop table t0, t1;
|
||||
|
26
mysql-test/t/partition_truncate.test
Normal file
26
mysql-test/t/partition_truncate.test
Normal file
@ -0,0 +1,26 @@
|
||||
#
|
||||
# Simple tests to verify truncate partition syntax
|
||||
#
|
||||
--source include/have_partition.inc
|
||||
--disable_warnings
|
||||
drop table if exists t1, t2, t3, t4;
|
||||
--enable_warnings
|
||||
|
||||
create table t1 (a int)
|
||||
partition by list (a)
|
||||
(partition p1 values in (0));
|
||||
--error ER_WRONG_PARTITION_NAME
|
||||
alter table t1 truncate partition p1,p1;
|
||||
--error ER_WRONG_PARTITION_NAME
|
||||
alter table t1 truncate partition p0;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a int)
|
||||
partition by list (a)
|
||||
subpartition by hash (a)
|
||||
subpartitions 1
|
||||
(partition p1 values in (1)
|
||||
(subpartition sp1));
|
||||
--error ER_WRONG_PARTITION_NAME
|
||||
alter table t1 truncate partition sp1;
|
||||
drop table t1;
|
2685
mysql-test/t/signal.test
Normal file
2685
mysql-test/t/signal.test
Normal file
File diff suppressed because it is too large
Load Diff
57
mysql-test/t/signal_code.test
Normal file
57
mysql-test/t/signal_code.test
Normal file
@ -0,0 +1,57 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
# Tests for SIGNAL and RESIGNAL
|
||||
|
||||
-- source include/have_debug.inc
|
||||
|
||||
use test;
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists signal_proc;
|
||||
drop function if exists signal_func;
|
||||
--enable_warnings
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure signal_proc()
|
||||
begin
|
||||
DECLARE foo CONDITION FOR SQLSTATE '12345';
|
||||
|
||||
SIGNAL foo;
|
||||
SIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
RESIGNAL foo;
|
||||
RESIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
end $$
|
||||
|
||||
create function signal_func() returns int
|
||||
begin
|
||||
DECLARE foo CONDITION FOR SQLSTATE '12345';
|
||||
|
||||
SIGNAL foo;
|
||||
SIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
RESIGNAL foo;
|
||||
RESIGNAL foo SET MESSAGE_TEXT = "This is an error message";
|
||||
return 0;
|
||||
end $$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
show procedure code signal_proc;
|
||||
drop procedure signal_proc;
|
||||
|
||||
show function code signal_func;
|
||||
drop function signal_func;
|
||||
|
345
mysql-test/t/signal_demo1.test
Normal file
345
mysql-test/t/signal_demo1.test
Normal file
@ -0,0 +1,345 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#
|
||||
# Demonstrate how SIGNAL can be used to enforce integrity constraints.
|
||||
#
|
||||
|
||||
# Naming:
|
||||
# - PO: Purchase Order
|
||||
# - AB: Address Book
|
||||
# - IN: Inventory
|
||||
|
||||
# Simplified schema:
|
||||
#
|
||||
# Relation 1:
|
||||
# PO_ORDER (PK: po_id) 1:1 <---> 0:N (FK: po_id) PO_ORDER_LINE
|
||||
#
|
||||
# Relation 2:
|
||||
# IN_INVENTORY (PK: item_id) 1:1 <---> 0:N (FK: item_id) PO_ORDER_LINE
|
||||
#
|
||||
# Relation 3:
|
||||
# +--> 0:1 (PK: person_id) AB_PHYSICAL_PERSON
|
||||
# PO_ORDER (FK: cust_id) 1:1 <--|
|
||||
# +--> 0:1 (PK: company_id) AB_MORAL_PERSON
|
||||
# This is an 'arc' relationship :)
|
||||
#
|
||||
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists demo;
|
||||
--enable_warnings
|
||||
|
||||
create database demo;
|
||||
|
||||
use demo;
|
||||
|
||||
create table ab_physical_person (
|
||||
person_id integer,
|
||||
first_name VARCHAR(50),
|
||||
middle_initial CHAR,
|
||||
last_name VARCHAR(50),
|
||||
primary key (person_id));
|
||||
|
||||
create table ab_moral_person (
|
||||
company_id integer,
|
||||
name VARCHAR(100),
|
||||
primary key (company_id));
|
||||
|
||||
create table in_inventory (
|
||||
item_id integer,
|
||||
descr VARCHAR(50),
|
||||
stock integer,
|
||||
primary key (item_id));
|
||||
|
||||
create table po_order (
|
||||
po_id integer auto_increment,
|
||||
cust_type char, /* arc relationship, see cust_id */
|
||||
cust_id integer, /* FK to ab_physical_person *OR* ab_moral_person */
|
||||
primary key (po_id));
|
||||
|
||||
create table po_order_line (
|
||||
po_id integer, /* FK to po_order.po_id */
|
||||
line_no integer,
|
||||
item_id integer, /* FK to in_inventory.item_id */
|
||||
qty integer);
|
||||
|
||||
delimiter $$;
|
||||
|
||||
--echo #
|
||||
--echo # Schema integrity enforcement
|
||||
--echo #
|
||||
|
||||
create procedure check_pk_person(in person_type char, in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
|
||||
/*
|
||||
Test integrity constraints for an 'arc' relationship.
|
||||
Based on 'person_type', 'id' points to either a
|
||||
physical person, or a moral person.
|
||||
*/
|
||||
case person_type
|
||||
when 'P' then
|
||||
begin
|
||||
select count(person_id) from ab_physical_person
|
||||
where ab_physical_person.person_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('No such physical person, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end;
|
||||
|
||||
when 'M' then
|
||||
begin
|
||||
select count(company_id) from ab_moral_person
|
||||
where ab_moral_person.company_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('No such moral person, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end;
|
||||
|
||||
else
|
||||
begin
|
||||
set msg= concat('No such person type:', person_type);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 20000;
|
||||
end;
|
||||
end case;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure check_pk_inventory(in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
|
||||
select count(item_id) from in_inventory
|
||||
where in_inventory.item_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('Failed integrity constraint, table in_inventory, PK:',
|
||||
id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure check_pk_order(in id integer)
|
||||
begin
|
||||
declare x integer;
|
||||
declare msg varchar(128);
|
||||
|
||||
select count(po_id) from po_order
|
||||
where po_order.po_id = id
|
||||
into x;
|
||||
|
||||
if (x != 1)
|
||||
then
|
||||
set msg= concat('Failed integrity constraint, table po_order, PK:', id);
|
||||
SIGNAL SQLSTATE '45000' SET
|
||||
MESSAGE_TEXT = msg,
|
||||
MYSQL_ERRNO = 10000;
|
||||
end if;
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_bi before insert on po_order
|
||||
for each row
|
||||
begin
|
||||
call check_pk_person(NEW.cust_type, NEW.cust_id);
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_bu before update on po_order
|
||||
for each row
|
||||
begin
|
||||
call check_pk_person(NEW.cust_type, NEW.cust_id);
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_line_bi before insert on po_order_line
|
||||
for each row
|
||||
begin
|
||||
call check_pk_order(NEW.po_id);
|
||||
call check_pk_inventory(NEW.item_id);
|
||||
end
|
||||
$$
|
||||
|
||||
create trigger po_order_line_bu before update on po_order_line
|
||||
for each row
|
||||
begin
|
||||
call check_pk_order(NEW.po_id);
|
||||
call check_pk_inventory(NEW.item_id);
|
||||
end
|
||||
$$
|
||||
|
||||
--echo #
|
||||
--echo # Application helpers
|
||||
--echo #
|
||||
|
||||
create procedure po_create_order(
|
||||
in p_cust_type char,
|
||||
in p_cust_id integer,
|
||||
out id integer)
|
||||
begin
|
||||
insert into po_order set cust_type = p_cust_type, cust_id = p_cust_id;
|
||||
set id = last_insert_id();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure po_add_order_line(
|
||||
in po integer,
|
||||
in line integer,
|
||||
in item integer,
|
||||
in q integer)
|
||||
begin
|
||||
insert into po_order_line set
|
||||
po_id = po, line_no = line, item_id = item, qty = q;
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
--echo #
|
||||
--echo # Create sample data
|
||||
--echo #
|
||||
|
||||
insert into ab_physical_person values
|
||||
( 1, "John", "A", "Doe"),
|
||||
( 2, "Marry", "B", "Smith")
|
||||
;
|
||||
|
||||
insert into ab_moral_person values
|
||||
( 3, "ACME real estate, INC"),
|
||||
( 4, "Local school")
|
||||
;
|
||||
|
||||
insert into in_inventory values
|
||||
( 100, "Table, dinner", 5),
|
||||
( 101, "Chair", 20),
|
||||
( 200, "Table, coffee", 3),
|
||||
( 300, "School table", 25),
|
||||
( 301, "School chairs", 50)
|
||||
;
|
||||
|
||||
select * from ab_physical_person order by person_id;
|
||||
select * from ab_moral_person order by company_id;
|
||||
select * from in_inventory order by item_id;
|
||||
|
||||
--echo #
|
||||
--echo # Entering an order
|
||||
--echo #
|
||||
|
||||
set @my_po = 0;
|
||||
|
||||
/* John Doe wants 1 table and 4 chairs */
|
||||
call po_create_order("P", 1, @my_po);
|
||||
|
||||
call po_add_order_line (@my_po, 1, 100, 1);
|
||||
call po_add_order_line (@my_po, 2, 101, 4);
|
||||
|
||||
/* Marry Smith wants a coffee table */
|
||||
call po_create_order("P", 2, @my_po);
|
||||
|
||||
call po_add_order_line (@my_po, 1, 200, 1);
|
||||
|
||||
--echo #
|
||||
--echo # Entering bad data in an order
|
||||
--echo #
|
||||
|
||||
# There is no item 999 in in_inventory
|
||||
--error 10000
|
||||
call po_add_order_line (@my_po, 1, 999, 1);
|
||||
|
||||
--echo #
|
||||
--echo # Entering bad data in an unknown order
|
||||
--echo #
|
||||
|
||||
# There is no order 99 in po_order
|
||||
--error 10000
|
||||
call po_add_order_line (99, 1, 100, 1);
|
||||
|
||||
--echo #
|
||||
--echo # Entering an order for an unknown company
|
||||
--echo #
|
||||
|
||||
# There is no moral person of id 7
|
||||
--error 10000
|
||||
call po_create_order("M", 7, @my_po);
|
||||
|
||||
--echo #
|
||||
--echo # Entering an order for an unknown person type
|
||||
--echo #
|
||||
|
||||
# There is no person of type X
|
||||
--error 20000
|
||||
call po_create_order("X", 1, @my_po);
|
||||
|
||||
/* The local school wants 10 class tables and 20 chairs */
|
||||
call po_create_order("M", 4, @my_po);
|
||||
|
||||
call po_add_order_line (@my_po, 1, 300, 10);
|
||||
call po_add_order_line (@my_po, 2, 301, 20);
|
||||
|
||||
# Raw data
|
||||
select * from po_order;
|
||||
select * from po_order_line;
|
||||
|
||||
# Creative reporting ...
|
||||
|
||||
select po_id as "PO#",
|
||||
( case cust_type
|
||||
when "P" then concat (pp.first_name,
|
||||
" ",
|
||||
pp.middle_initial,
|
||||
" ",
|
||||
pp.last_name)
|
||||
when "M" then mp.name
|
||||
end ) as "Sold to"
|
||||
from po_order po
|
||||
left join ab_physical_person pp on po.cust_id = pp.person_id
|
||||
left join ab_moral_person mp on po.cust_id = company_id
|
||||
;
|
||||
|
||||
select po_id as "PO#",
|
||||
ol.line_no as "Line",
|
||||
ol.item_id as "Item",
|
||||
inv.descr as "Description",
|
||||
ol.qty as "Quantity"
|
||||
from po_order_line ol, in_inventory inv
|
||||
where inv.item_id = ol.item_id
|
||||
order by ol.item_id, ol.line_no;
|
||||
|
||||
drop database demo;
|
||||
|
||||
|
207
mysql-test/t/signal_demo2.test
Normal file
207
mysql-test/t/signal_demo2.test
Normal file
@ -0,0 +1,207 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#
|
||||
# Demonstrate how RESIGNAL can be used to 'catch' and 're-throw' an error
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists demo;
|
||||
--enable_warnings
|
||||
|
||||
create database demo;
|
||||
|
||||
use demo;
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure proc_top_a(p1 integer)
|
||||
begin
|
||||
## DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
end;
|
||||
|
||||
select "Starting ...";
|
||||
call proc_middle_a(p1);
|
||||
select "The end";
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_middle_a(p1 integer)
|
||||
begin
|
||||
DECLARE l integer;
|
||||
# without RESIGNAL:
|
||||
# Should be: DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
DECLARE EXIT HANDLER for 1 /* not sure how to handle exceptions */
|
||||
begin
|
||||
select "Oops ... now what ?";
|
||||
end;
|
||||
|
||||
select "In prod_middle()";
|
||||
|
||||
create temporary table t1(a integer, b integer);
|
||||
select GET_LOCK("user_mutex", 10) into l;
|
||||
|
||||
insert into t1 set a = p1, b = p1;
|
||||
|
||||
call proc_bottom_a(p1);
|
||||
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_bottom_a(p1 integer)
|
||||
begin
|
||||
select "In proc_bottom()";
|
||||
|
||||
if (p1 = 1) then
|
||||
begin
|
||||
select "Doing something that works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 2) then
|
||||
begin
|
||||
select "Doing something that fail (simulate an error) ...";
|
||||
drop table no_such_table;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 3) then
|
||||
begin
|
||||
select "Doing something that *SHOULD* works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
#
|
||||
# Code without RESIGNAL:
|
||||
# errors are apparent to the caller,
|
||||
# but there is no cleanup code,
|
||||
# so that the environment (get_lock(), temporary table) is polluted ...
|
||||
#
|
||||
call proc_top_a(1);
|
||||
|
||||
# Expected
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
call proc_top_a(2);
|
||||
|
||||
# Dirty state
|
||||
--error ER_TABLE_EXISTS_ERROR
|
||||
call proc_top_a(3);
|
||||
|
||||
# Dirty state
|
||||
--error ER_TABLE_EXISTS_ERROR
|
||||
call proc_top_a(1);
|
||||
|
||||
drop temporary table if exists t1;
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure proc_top_b(p1 integer)
|
||||
begin
|
||||
select "Starting ...";
|
||||
call proc_middle_b(p1);
|
||||
select "The end";
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_middle_b(p1 integer)
|
||||
begin
|
||||
DECLARE l integer;
|
||||
DECLARE EXIT HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
begin
|
||||
DECLARE CONTINUE HANDLER for SQLEXCEPTION, NOT FOUND
|
||||
begin
|
||||
/* Ignore errors from the cleanup code */
|
||||
end;
|
||||
|
||||
select "Doing cleanup !";
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end;
|
||||
|
||||
RESIGNAL;
|
||||
end;
|
||||
|
||||
select "In prod_middle()";
|
||||
|
||||
create temporary table t1(a integer, b integer);
|
||||
select GET_LOCK("user_mutex", 10) into l;
|
||||
|
||||
insert into t1 set a = p1, b = p1;
|
||||
|
||||
call proc_bottom_b(p1);
|
||||
|
||||
select RELEASE_LOCK("user_mutex") into l;
|
||||
drop temporary table t1;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_bottom_b(p1 integer)
|
||||
begin
|
||||
select "In proc_bottom()";
|
||||
|
||||
if (p1 = 1) then
|
||||
begin
|
||||
select "Doing something that works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 2) then
|
||||
begin
|
||||
select "Doing something that fail (simulate an error) ...";
|
||||
drop table no_such_table;
|
||||
end;
|
||||
end if;
|
||||
|
||||
if (p1 = 3) then
|
||||
begin
|
||||
select "Doing something that *SHOULD* works ...";
|
||||
select * from t1;
|
||||
end;
|
||||
end if;
|
||||
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
#
|
||||
# Code with RESIGNAL:
|
||||
# errors are apparent to the caller,
|
||||
# the but cleanup code did get a chance to act ...
|
||||
#
|
||||
|
||||
call proc_top_b(1);
|
||||
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
call proc_top_b(2);
|
||||
|
||||
call proc_top_b(3);
|
||||
|
||||
call proc_top_b(1);
|
||||
|
||||
drop database demo;
|
||||
|
159
mysql-test/t/signal_demo3.test
Normal file
159
mysql-test/t/signal_demo3.test
Normal file
@ -0,0 +1,159 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
#
|
||||
# Demonstrate how RESIGNAL can be used to print a stack trace
|
||||
#
|
||||
|
||||
# Save defaults
|
||||
|
||||
SET @start_global_value = @@global.max_error_count;
|
||||
SELECT @start_global_value;
|
||||
SET @start_session_value = @@session.max_error_count;
|
||||
SELECT @start_session_value;
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists demo;
|
||||
--enable_warnings
|
||||
|
||||
create database demo;
|
||||
|
||||
use demo;
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure proc_1()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_1';
|
||||
|
||||
call proc_2();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_2()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_2';
|
||||
|
||||
call proc_3();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_3()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_3';
|
||||
|
||||
call proc_4();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_4()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_4';
|
||||
|
||||
call proc_5();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_5()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_5';
|
||||
|
||||
call proc_6();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_6()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_6';
|
||||
|
||||
call proc_7();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_7()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_7';
|
||||
|
||||
call proc_8();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_8()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_8';
|
||||
|
||||
call proc_9();
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure proc_9()
|
||||
begin
|
||||
declare exit handler for sqlexception
|
||||
resignal sqlstate '45000' set message_text='Oops in proc_9';
|
||||
|
||||
## Do something that fails, to see how errors are reported
|
||||
drop table oops_it_is_not_here;
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
|
||||
# This is the interesting part:
|
||||
# the complete call stack from the origin of failure (proc_9)
|
||||
# to the top level caller (proc_1) is available ...
|
||||
|
||||
show warnings;
|
||||
|
||||
SET @@session.max_error_count = 5;
|
||||
SELECT @@session.max_error_count;
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
show warnings;
|
||||
|
||||
SET @@session.max_error_count = 7;
|
||||
SELECT @@session.max_error_count;
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
show warnings;
|
||||
|
||||
SET @@session.max_error_count = 9;
|
||||
SELECT @@session.max_error_count;
|
||||
|
||||
-- error ER_SIGNAL_EXCEPTION
|
||||
call proc_1();
|
||||
show warnings;
|
||||
|
||||
drop database demo;
|
||||
|
||||
# Restore defaults
|
||||
|
||||
SET @@global.max_error_count = @start_global_value;
|
||||
SELECT @@global.max_error_count;
|
||||
SET @@session.max_error_count = @start_session_value;
|
||||
SELECT @@session.max_error_count;
|
||||
|
123
mysql-test/t/signal_sqlmode.test
Normal file
123
mysql-test/t/signal_sqlmode.test
Normal file
@ -0,0 +1,123 @@
|
||||
# Copyright (C) 2008 Sun Microsystems, Inc
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; version 2 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
# Tests for SIGNAL, RESIGNAL and GET DIAGNOSTICS
|
||||
|
||||
SET @save_sql_mode=@@sql_mode;
|
||||
|
||||
SET sql_mode='';
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists p;
|
||||
drop procedure if exists p2;
|
||||
drop procedure if exists p3;
|
||||
--enable_warnings
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure p()
|
||||
begin
|
||||
declare utf8_var VARCHAR(128) CHARACTER SET UTF8;
|
||||
set utf8_var = concat(repeat('A', 128), 'X');
|
||||
select length(utf8_var), utf8_var;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p2()
|
||||
begin
|
||||
declare msg VARCHAR(129) CHARACTER SET UTF8;
|
||||
set msg = concat(repeat('A', 128), 'X');
|
||||
select length(msg), msg;
|
||||
|
||||
signal sqlstate '55555' set message_text = msg;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p3()
|
||||
begin
|
||||
declare name VARCHAR(65) CHARACTER SET UTF8;
|
||||
set name = concat(repeat('A', 64), 'X');
|
||||
select length(name), name;
|
||||
|
||||
signal sqlstate '55555' set
|
||||
message_text = 'Message',
|
||||
table_name = name;
|
||||
end
|
||||
$$
|
||||
delimiter ;$$
|
||||
|
||||
call p;
|
||||
|
||||
--error ER_SIGNAL_EXCEPTION
|
||||
call p2;
|
||||
|
||||
--error ER_SIGNAL_EXCEPTION
|
||||
call p3;
|
||||
|
||||
drop procedure p;
|
||||
drop procedure p2;
|
||||
drop procedure p3;
|
||||
|
||||
SET sql_mode='STRICT_ALL_TABLES';
|
||||
|
||||
delimiter $$;
|
||||
|
||||
create procedure p()
|
||||
begin
|
||||
declare utf8_var VARCHAR(128) CHARACTER SET UTF8;
|
||||
set utf8_var = concat(repeat('A', 128), 'X');
|
||||
select length(utf8_var), utf8_var;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p2()
|
||||
begin
|
||||
declare msg VARCHAR(129) CHARACTER SET UTF8;
|
||||
set msg = concat(repeat('A', 128), 'X');
|
||||
select length(msg), msg;
|
||||
|
||||
signal sqlstate '55555' set message_text = msg;
|
||||
end
|
||||
$$
|
||||
|
||||
create procedure p3()
|
||||
begin
|
||||
declare name VARCHAR(65) CHARACTER SET UTF8;
|
||||
set name = concat(repeat('A', 64), 'X');
|
||||
select length(name), name;
|
||||
|
||||
signal sqlstate '55555' set
|
||||
message_text = 'Message',
|
||||
table_name = name;
|
||||
end
|
||||
$$
|
||||
|
||||
delimiter ;$$
|
||||
|
||||
--error ER_DATA_TOO_LONG
|
||||
call p;
|
||||
|
||||
--error ER_COND_ITEM_TOO_LONG
|
||||
call p2;
|
||||
|
||||
--error ER_COND_ITEM_TOO_LONG
|
||||
call p3;
|
||||
|
||||
drop procedure p;
|
||||
drop procedure p2;
|
||||
drop procedure p3;
|
||||
|
||||
SET @@sql_mode=@save_sql_mode;
|
||||
|
@ -559,7 +559,7 @@ select @@lc_time_names;
|
||||
--echo *** LC_TIME_NAMES: testing with string expressions
|
||||
set lc_time_names=concat('de','_','DE');
|
||||
select @@lc_time_names;
|
||||
--error ER_UNKNOWN_ERROR
|
||||
--error ER_UNKNOWN_LOCALE
|
||||
set lc_time_names=concat('de','+','DE');
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing with numeric expressions
|
||||
@ -572,15 +572,15 @@ set lc_time_names=en_US;
|
||||
--echo LC_TIME_NAMES: testing NULL and a negative number:
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
set lc_time_names=NULL;
|
||||
--error ER_UNKNOWN_ERROR
|
||||
--error ER_UNKNOWN_LOCALE
|
||||
set lc_time_names=-1;
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing locale with the last ID:
|
||||
set lc_time_names=108;
|
||||
set lc_time_names=109;
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing a number beyond the valid ID range:
|
||||
--error ER_UNKNOWN_ERROR
|
||||
set lc_time_names=109;
|
||||
--error ER_UNKNOWN_LOCALE
|
||||
set lc_time_names=110;
|
||||
select @@lc_time_names;
|
||||
--echo LC_TIME_NAMES: testing that 0 is en_US:
|
||||
set lc_time_names=0;
|
||||
|
Reference in New Issue
Block a user