1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
--source include/force_myisam_default.inc
--source include/have_myisam.inc
SET sql_mode = 'traditional';
--echo
--echo #------------------------------------------------------------------
--echo # Checking INSERT INTO ... SELECT ...
--echo #------------------------------------------------------------------
--echo
--echo # - No column list (all columns) + NULL-value for NOT NULL column.
# Following scenario is to test the functionality of MyISAM
# A table with one NOT NULL column.
CREATE TABLE t1(a INT, b INT NOT NULL) ENGINE=MyISAM;
CREATE VIEW v1 AS SELECT * FROM t1;
# A table with a few NOT NULL columns.
CREATE TABLE t2(a INT, b INT NOT NULL, c INT NOT NULL, d INT NOT NULL) ENGINE=MyISAM;
CREATE VIEW v2 AS SELECT * FROM t2;
# Aux table with data for t1.
CREATE TABLE t1_data(a INT, b INT) ENGINE=MyISAM;
INSERT INTO t1_data VALUES
(11, 12),
(NULL, 22),
(31, NULL),
(NULL, NULL);
# Aux table with data for t2.
CREATE TABLE t2_data(a INT, b INT, c INT, d INT) ENGINE=MyISAM;
INSERT INTO t2_data VALUES
(11, 12, 13, 14),
(NULL, 22, 23, 24),
(31, NULL, 33, 34),
(41, 42, NULL, 44),
(51, 52, 53, NULL),
(NULL, NULL, NULL, NULL);
--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t1 SELECT * FROM t1_data;
--error ER_BAD_NULL_ERROR
INSERT INTO v1 SELECT a * 10, b * 10 FROM t1_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t1's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t1;
DELETE FROM t1;
--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t1 SELECT * FROM t1_data;
--error ER_BAD_NULL_ERROR
REPLACE INTO v1 SELECT a * 10, b * 10 FROM t1_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t1's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t1;
DELETE FROM t1;
--echo
--echo # - No column list (all columns) + NULL-value for NOT NULL column.
--error ER_BAD_NULL_ERROR
INSERT INTO t2 SELECT * FROM t2_data;
--error ER_BAD_NULL_ERROR
INSERT INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t2's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t2;
DELETE FROM t2;
--echo
--echo # - No column list (all columns) + NULL-value for NOT NULL column.
--error ER_BAD_NULL_ERROR
REPLACE INTO t2 SELECT * FROM t2_data;
--error ER_BAD_NULL_ERROR
REPLACE INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t2's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t2;
DELETE FROM t2;
--echo
--echo # - All columns + NULL-value for NOT NULL column.
--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a, b) SELECT * FROM t1_data;
--error ER_BAD_NULL_ERROR
INSERT INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t1's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t1;
DELETE FROM t1;
--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a, b) SELECT * FROM t1_data;
--error ER_BAD_NULL_ERROR
REPLACE INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t1's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t1;
DELETE FROM t1;
--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t2(a, b, c, d) SELECT * FROM t2_data;
--error ER_BAD_NULL_ERROR
INSERT INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t2's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t2;
DELETE FROM t2;
--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t2(a, b, c, d) SELECT * FROM t2_data;
--error ER_BAD_NULL_ERROR
REPLACE INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
--echo
--echo # The following SELECT output should have 4 rows.
--echo # t2's engine is MyISAM, so the transaction can not be fully rolled back.
--sorted_result
SELECT * FROM t2;
DELETE FROM t2;
# Clean up
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t1_data;
DROP TABLE t2_data;
DROP VIEW v1;
DROP VIEW v2;
--echo "Test for multi table update (across engines)"
CREATE TABLE t1(a1 INT NOT NULL, a2 INT) ENGINE = INNODB;
CREATE TABLE t2(a1 INT NOT NULL, a2 INT) ENGINE = MyISAM;
INSERT INTO t1 VALUES (1, NULL),(2, 2);
INSERT INTO t2 VALUES (1, NULL),(2876543, 2098);
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = 10;
CREATE TRIGGER t2_bu BEFORE UPDATE ON t2
FOR EACH ROW
SET NEW.a1 = 20;
UPDATE t1, t2 SET t1.a1 = NULL , t2.a1 = NULL;
SELECT * FROM t1;
SELECT * FROM t2;
DROP TRIGGER t1_bu;
DROP TRIGGER t2_bu;
DROP TABLE t1, t2;
--echo "Test for multi table update (across engines)"
CREATE TABLE t1(a1 INT NOT NULL, a2 INT) ENGINE = INNODB;
CREATE TABLE t2(a1 INT NOT NULL, a2 INT) ENGINE = MyISAM;
INSERT INTO t1 VALUES (1, NULL),(2, 2);
INSERT INTO t2 VALUES (1, NULL),(2876543, 20111098);
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = NULL;
--error ER_BAD_NULL_ERROR
UPDATE t1, t2 SET t1.a1 = 1 , t2.a1 = 2;
SELECT * FROM t1;
# Any changes made to t2 before the error is raised will not be rolled
# back, since MyISAM is not transactional. How much has been modified
# in t2 depends on the query plan, and the hypergraph optimizer
# chooses a different join order than the old optimizer.
--skip_if_hypergraph
SELECT * FROM t2;
DROP TRIGGER t1_bu;
DROP TABLE t1, t2;
|