config root man

Current Path : /home/usr.opt/mysql57/mysql-test/t/

FreeBSD hs32.drive.ne.jp 9.1-RELEASE FreeBSD 9.1-RELEASE #1: Wed Jan 14 12:18:08 JST 2015 root@hs32.drive.ne.jp:/sys/amd64/compile/hs32 amd64
Upload File :
Current File : /home/usr.opt/mysql57/mysql-test/t/trigger_wl6030.test

# The include statement below is a temp one for tests that are yet to
#be ported to run with InnoDB,
#but needs to be kept for tests that would need MyISAM in future.
--source include/force_myisam_default.inc

--echo #
--echo # WL#6030: Triggers are not processed for NOT NULL columns.
--echo #

CREATE TABLE t2(a INT, b INT, c INT);

--echo
--echo ###################################################################
--echo # Test 1: BEFORE INSERT, NOT NULL.
--echo #   - Test 1.1: SET to NOT NULL.
--echo ###################################################################

CREATE TABLE t1(a INT NOT NULL, b INT, c INT);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET NEW.a = 1;

INSERT INTO t2 VALUES (1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);

--echo
--echo # Single INSERT ... VALUES.
INSERT INTO t1 VALUES (NULL, 2, 3);
INSERT INTO t1(a, b, c) VALUES (NULL, 20, 30);
INSERT INTO t1(b, c) VALUES (200, 300);
INSERT INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Single REPLACE ... VALUES.
REPLACE INTO t1 VALUES (NULL, 2, 3);
REPLACE INTO t1(a, b, c) VALUES (NULL, 20, 30);
REPLACE INTO t1(b, c) VALUES (200, 300);
REPLACE INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi INSERT ... VALUES.
INSERT INTO t1 VALUES (-1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
INSERT INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
INSERT INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
INSERT INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi REPLACE ... VALUES.
REPLACE INTO t1 VALUES (-1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
REPLACE INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
REPLACE INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
REPLACE INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # INSERT ... SELECT.
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t1(a, b, c) SELECT * FROM t2;
INSERT INTO t1(b, c) SELECT b, c FROM t2;
INSERT INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # REPLACE ... SELECT.
REPLACE INTO t1 SELECT * FROM t2;
REPLACE INTO t1(a, b, c) SELECT * FROM t2;
REPLACE INTO t1(b, c) SELECT b, c FROM t2;
REPLACE INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;
DELETE FROM t2;

DROP TRIGGER t1_bi;

--echo
--echo ###################################################################
--echo #   - Test 1.2: SET to NULL.
--echo ###################################################################

CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET NEW.a = NULL;
# For a single-row INSERT, no warning occurs when NULL is inserted into a NOT
# NULL column. Instead, the statement fails with an error.

INSERT INTO t2 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);

--echo
--echo # Single INSERT ... VALUES.
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES (1, 2, 3);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a, b, c) VALUES (1, 2, 3);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(b, c) VALUES (2, 3);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a) VALUES (1);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Single REPLACE ... VALUES.
--error ER_BAD_NULL_ERROR
REPLACE INTO t1 VALUES (1, 2, 3);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a, b, c) VALUES (1, 2, 3);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(b, c) VALUES (2, 3);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a) VALUES (1);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi INSERT ... VALUES.
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a) VALUES (1), (10), (100);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi REPLACE ... VALUES.
--error ER_BAD_NULL_ERROR
REPLACE INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a) VALUES (1), (10), (100);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # INSERT ... SELECT.
--error ER_BAD_NULL_ERROR
INSERT INTO t1 SELECT * FROM t2;
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a, b, c) SELECT * FROM t2;
--error ER_BAD_NULL_ERROR
INSERT INTO t1(b, c) SELECT b, c FROM t2;
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # REPLACE ... SELECT.
--error ER_BAD_NULL_ERROR
REPLACE INTO t1 SELECT * FROM t2;
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a, b, c) SELECT * FROM t2;
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(b, c) SELECT b, c FROM t2;
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

DROP TRIGGER t1_bi;

--echo
--echo ###################################################################
--echo # Test 2: BEFORE UPDATE, NOT NULL.
--echo #   - Test 2.1: SET to NOT NULL.
--echo ###################################################################

CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW SET NEW.a = 999;
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);

--echo
--echo # Regular UPDATE.
UPDATE t1 SET a = NULL WHERE a = 1;
UPDATE t1 SET a = NULL, c = NULL WHERE a = 100;

--echo
SELECT * FROM t1;
--echo

DELETE FROM t1;
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);

--echo
--echo # Multiple UPDATE.
CREATE TABLE t3(a INT, b INT);
INSERT INTO t3 VALUES (10, -10);

UPDATE t1, t3 SET t1.a = NULL, t3.a = -20 WHERE t1.a = t3.a AND t3.a = 10;

--echo
SELECT * FROM t1;
--echo
SELECT * FROM t3;
--echo

DROP TRIGGER t1_bu;
DROP TABLE t3;
DELETE FROM t1;

CREATE TABLE t3(a INT NOT NULL, b INT);
CREATE TRIGGER t3_bu BEFORE UPDATE ON t3 FOR EACH ROW SET NEW.a = 999;
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
INSERT INTO t3 VALUES (10, -10);

UPDATE t1, t3 SET t1.a = -20, t3.a = NULL WHERE t1.a = t3.a AND t3.a = 10;

SELECT * FROM t1;
SELECT * FROM t3;
DROP TRIGGER t3_bu;
DROP TABLE t3;

--echo
--echo #   - Test 2.1: SET to NULL.

CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW SET NEW.a = NULL;
DELETE FROM t1;
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);

--echo
--echo # Regular UPDATE.
--error ER_BAD_NULL_ERROR
UPDATE t1 SET a = 99 WHERE a = 1;
--error ER_BAD_NULL_ERROR
UPDATE t1 SET a = 99, b = 99 WHERE a = 1;

--echo
SELECT * FROM t1;

--echo
--echo # Multiple UPDATE.
CREATE TABLE t3(a INT, b INT);
INSERT INTO t3 VALUES (10, -10);

--error ER_BAD_NULL_ERROR
UPDATE t1, t3 SET t1.a = 99, t3.a = -10 WHERE t1.a = t3.a AND t3.a = 10;

--echo
SELECT * FROM t1;
--echo
SELECT * FROM t3;
--echo

DELETE FROM t1;
DELETE FROM t2;
DROP TABLE t3;

DROP TRIGGER t1_bu;

--echo
--echo ###################################################################
--echo # Test 3: Using illegal NULL-value as r-value.
--echo #   - Test 3.1: using NULL.
--echo ###################################################################

delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
  SET NEW.b = NEW.a;
  SET NEW.a = 1;
END|
delimiter ;|

INSERT INTO t2 VALUES (1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);

--echo
--echo # Single INSERT ... VALUES.
INSERT INTO t1 VALUES (NULL, 2, 3);
INSERT INTO t1(a, b, c) VALUES (NULL, 20, 30);
INSERT INTO t1(b, c) VALUES (200, 300);
INSERT INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Single REPLACE ... VALUES.
REPLACE INTO t1 VALUES (NULL, 2, 3);
REPLACE INTO t1(a, b, c) VALUES (NULL, 20, 30);
REPLACE INTO t1(b, c) VALUES (200, 300);
REPLACE INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi INSERT ... VALUES.
INSERT INTO t1 VALUES (-1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
INSERT INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
INSERT INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
INSERT INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi REPLACE ... VALUES.
REPLACE INTO t1 VALUES (-1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
REPLACE INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
REPLACE INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
REPLACE INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # INSERT ... SELECT
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t1(a, b, c) SELECT * FROM t2;
INSERT INTO t1(b, c) SELECT b, c FROM t2;
INSERT INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # REPLACE ... SELECT
REPLACE INTO t1 SELECT * FROM t2;
REPLACE INTO t1(a, b, c) SELECT * FROM t2;
REPLACE INTO t1(b, c) SELECT b, c FROM t2;
REPLACE INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

DROP TRIGGER t1_bi;

--echo
--echo ###################################################################
--echo #   - Test 3.2: using NOT NULL.
--echo ###################################################################

delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
  SET NEW.a = 99;
  SET NEW.b = NEW.a;
END|
delimiter ;|

--echo
--echo # Single INSERT ... VALUES.
INSERT INTO t1 VALUES (NULL, 2, 3);
INSERT INTO t1(a, b, c) VALUES (NULL, 20, 30);
INSERT INTO t1(b, c) VALUES (200, 300);
INSERT INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Single REPLACE ... VALUES.
REPLACE INTO t1 VALUES (NULL, 2, 3);
REPLACE INTO t1(a, b, c) VALUES (NULL, 20, 30);
REPLACE INTO t1(b, c) VALUES (200, 300);
REPLACE INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi INSERT ... VALUES.
INSERT INTO t1 VALUES (-1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
INSERT INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
INSERT INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
INSERT INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi REPLACE ... VALUES.
REPLACE INTO t1 VALUES (-1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
REPLACE INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
REPLACE INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
REPLACE INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # INSERT ... SELECT
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t1(a, b, c) SELECT * FROM t2;
INSERT INTO t1(b, c) SELECT b, c FROM t2;
INSERT INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # REPLACE ... SELECT
REPLACE INTO t1 SELECT * FROM t2;
REPLACE INTO t1(a, b, c) SELECT * FROM t2;
REPLACE INTO t1(b, c) SELECT b, c FROM t2;
REPLACE INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;
DELETE FROM t2;

DROP TRIGGER t1_bi;

--echo
--echo ###################################################################
--echo # Test 4: Temporarily setting to illegal NULL-value in trigger
--echo # (here we only check that it's possible to temporarily assign
--echo # NULL in triggers).
--echo ###################################################################

delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
  SET NEW.a = NULL;
  SET NEW.b = NEW.a;
  SET NEW.a = 99;
END|

CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW
BEGIN
  SET NEW.a = NULL;
  SET NEW.b = NEW.a;
  SET NEW.a = 199;
END|
delimiter ;|

--echo
--echo # Checking BEFORE INSERT trigger.
INSERT INTO t1 VALUES (1, 2, 3);
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
SELECT * FROM t1;

--echo
--echo # Checking BEFORE UPDATE trigger.
UPDATE t1 SET b = 999 WHERE c = 300;
SELECT * FROM t1;

--echo
DROP TRIGGER t1_bi;
DROP TRIGGER t1_bu;
DELETE FROM t1;

--echo
--echo ###################################################################
--echo # Test 5: Using IS NULL inside trigger.
--echo #   - Test 5.1: BEFORE INSERT trigger.
--echo ###################################################################

ALTER TABLE t1 ADD COLUMN a_new_is_null BOOLEAN DEFAULT NULL;

delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
  SET NEW.a_new_is_null = NEW.a IS NULL;
  SET NEW.a = 99;
END|
delimiter ;|

INSERT INTO t2 VALUES (1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);

--echo
--echo # Single INSERT ... VALUES.
INSERT INTO t1 VALUES (NULL, 2, 3, NULL);
INSERT INTO t1(a, b, c) VALUES (NULL, 20, 30);
INSERT INTO t1(b, c) VALUES (200, 300);
INSERT INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Single REPLACE ... VALUES.
REPLACE INTO t1 VALUES (NULL, 2, 3, NULL);
REPLACE INTO t1(a, b, c) VALUES (NULL, 20, 30);
REPLACE INTO t1(b, c) VALUES (200, 300);
REPLACE INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi INSERT ... VALUES.
INSERT INTO t1 VALUES
  (-1, 2, 3, NULL), (NULL, 20, 30, NULL), (NULL, 200, 300, NULL);
INSERT INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
INSERT INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
INSERT INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # Multi REPLACE ... VALUES.
REPLACE INTO t1 VALUES
  (-1, 2, 3, NULL), (NULL, 20, 30, NULL), (NULL, 200, 300, NULL);
REPLACE INTO t1(a, b, c) VALUES (-2, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
REPLACE INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
REPLACE INTO t1(a) VALUES (-3), (NULL), (NULL);

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # INSERT ... SELECT
INSERT INTO t1 SELECT t2.*, NULL FROM t2;
INSERT INTO t1(a, b, c) SELECT * FROM t2;
INSERT INTO t1(b, c) SELECT b, c FROM t2;
INSERT INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

--echo
--echo # REPLACE ... SELECT
REPLACE INTO t1 SELECT t2.*, NULL FROM t2;
REPLACE INTO t1(a, b, c) SELECT * FROM t2;
REPLACE INTO t1(b, c) SELECT b, c FROM t2;
REPLACE INTO t1(a) SELECT a FROM t2;

--echo
SELECT * FROM t1;
--echo
DELETE FROM t1;

DROP TRIGGER t1_bi;

--echo
--echo ###################################################################
--echo #   - Test 5.2: BEFORE UPDATE trigger.
--echo ###################################################################

ALTER TABLE t1 ADD COLUMN a_old_is_null BOOLEAN DEFAULT NULL;
ALTER TABLE t1 ADD COLUMN b_new_is_null BOOLEAN DEFAULT NULL;
ALTER TABLE t1 ADD COLUMN b_old_is_null BOOLEAN DEFAULT NULL;

delimiter |;
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW
BEGIN
  SET NEW.a_new_is_null = NEW.a IS NULL;
  SET NEW.a_old_is_null = OLD.a IS NULL;

  SET NEW.b_new_is_null = NEW.b IS NULL;
  SET NEW.b_old_is_null = OLD.b IS NULL;

  SET NEW.a = 99;
END|
delimiter ;|

INSERT INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);

--echo
--echo # Regular UPDATE.
UPDATE t1 SET a = NULL WHERE a = 1;
UPDATE t1 SET a = NULL, c = NULL WHERE a = 10;
UPDATE t1 SET b = NULL WHERE a = 100;

--echo
SELECT * FROM t1;
--echo

DELETE FROM t1;
INSERT INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);

--echo
--echo # Multiple UPDATE.
CREATE TABLE t3(a INT, b INT);
INSERT INTO t3 VALUES (10, -10);

UPDATE t1, t3 SET t1.a = NULL, t3.a = -20 WHERE t1.a = t3.a AND t3.a = 10;

--echo
SELECT * FROM t1;
--echo
SELECT * FROM t3;
--echo

DROP TABLE t3;

DROP TRIGGER t1_bu;

DROP TABLE t1;
DROP TABLE t2;

--echo
--echo ###################################################################
--echo # Test 6: Nullability of non-updated columns.
--echo ###################################################################

CREATE TABLE t1(a INT, b INT NOT NULL);

--echo
--echo # - Unconditional SET in a trigger.
--echo

CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
  SET NEW.b = NULL;

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a) VALUES (1);

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a) VALUES (1);

--echo
SELECT * FROM t1;
DELETE FROM t1;

DROP TRIGGER t1_bi;

--echo
--echo # - Conditional SET in a trigger, which is executed for every row.
--echo

delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
  SET NEW.b = NEW.a;
  IF NEW.b IS NULL THEN
    SET NEW.b = 1;
  END IF;
END|
delimiter ;|

--echo
INSERT INTO t1(a) VALUES (NULL);

--echo
REPLACE INTO t1(a) VALUES (NULL);

--echo
SELECT * FROM t1;
DELETE FROM t1;

DROP TRIGGER t1_bi;

--echo
--echo # - Conditional SET in a trigger, which is NOT executed for every row.
--echo
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
  IF (MOD(NEW.a, 2) = 0) THEN
    SET NEW.b = NEW.a - 1;
  END IF;
END|
delimiter ;|

--echo
INSERT INTO t1(a) VALUES (1), (2), (3), (4), (5), (6);

--echo
REPLACE INTO t1(a) VALUES (1), (2), (3), (4), (5), (6);

--echo
SELECT * FROM t1;

DROP TABLE t1;
SET sql_mode = default;
--echo
--echo ###################################################################
--echo # Test 7: Nullability of column being copied as result of INSERT SELECT.
--echo ###################################################################

CREATE TABLE t1(a INT NOT NULL);

CREATE TABLE t2(a INT);
INSERT INTO t2 VALUES (NULL);

CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
  SET NEW.a = 1;

--echo
INSERT INTO t1 SELECT * FROM t2;
REPLACE INTO t1 SELECT * FROM t2;

--echo
SELECT * FROM t1;
--echo

DROP TRIGGER t1_bi;
DROP TABLE t1,t2;

CREATE TABLE t1(a INT NOT NULL);
INSERT INTO t1 VALUES (1);

CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW
  SET NEW.a = 2;

CREATE TABLE t2(a INT);
INSERT INTO t2 VALUES (NULL);

--echo
UPDATE t1, t2 SET t1.a = t2.a;

--echo
SELECT * FROM t1;
--echo

DROP TRIGGER t1_bu;
DROP TABLE t1,t2;

--echo
--echo ###################################################################
--echo # Test 8: Nullability of column being copied as result of
--echo #         LOAD DATA INFILE.
--echo ###################################################################

CREATE TABLE t1 (a INT NOT NULL, b VARCHAR(10) NOT NULL);

delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
  IF NEW.b IS NULL THEN
    SET NEW.b = '123';
  END IF;
END |
delimiter ;|

LOAD DATA INFILE '../../std_data/wl6030.dat' INTO TABLE t1 FIELDS
TERMINATED BY ',' ENCLOSED BY '"';

SELECT * FROM t1;
DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo
--echo ###################################################################
--echo # Misc tests.
--echo ###################################################################
--echo

# A table with one NOT NULL column.
CREATE TABLE t1(a INT, b INT NOT NULL);
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);
CREATE VIEW v2 AS SELECT * FROM t2;

# Aux table with data for t1.
CREATE TABLE t1_data(a INT, b INT);
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);
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);


SET @sql_mode_saved = @@sql_mode;

--echo
--echo ###################################################################
--echo # Checking permissive SQL_MODE.
--echo ###################################################################
--echo

SET sql_mode = '';

--echo
--echo #------------------------------------------------------------------
--echo # Checking INSERT INTO ... VALUES ...
--echo #------------------------------------------------------------------

--echo
--echo #   - No column list (all columns) + NULL-value for NOT NULL column.

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
INSERT INTO v1 VALUES (1, NULL);

--echo
SELECT * FROM t1;


--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t1 VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
REPLACE INTO v1 VALUES (1, NULL);

--echo
SELECT * FROM t1;

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t2 VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
INSERT INTO v2 VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t2 VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
REPLACE INTO v2 VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--echo #   - All columns + NULL-value for NOT NULL column.

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO v1(a, b) VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a, b) VALUES (1, NULL);

--echo
SELECT * FROM t1;

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO v1(a, b) VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a, b) VALUES (1, NULL);

--echo
SELECT * FROM t1;

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
INSERT INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
REPLACE INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--echo #   - Single nullable column, no values for NOT NULL columns.
--echo #     Expect exactly 4 warnings and 8 rows being inserted into t1.

--echo
INSERT INTO t1(a) VALUES (1);
INSERT INTO t1(a) VALUES (2), (3), (4);
INSERT INTO v1(a) VALUES (5);
INSERT INTO v1(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
REPLACE INTO t1(a) VALUES (1);
REPLACE INTO t1(a) VALUES (2), (3), (4);
REPLACE INTO v1(a) VALUES (5);
REPLACE INTO v1(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
INSERT INTO t2(a) VALUES (1);
INSERT INTO t2(a) VALUES (2), (3), (4);
INSERT INTO v2(a) VALUES (5);
INSERT INTO v2(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
REPLACE INTO t2(a) VALUES (1);
REPLACE INTO t2(a) VALUES (2), (3), (4);
REPLACE INTO v2(a) VALUES (5);
REPLACE INTO v2(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
--echo #------------------------------------------------------------------
--echo # Checking INSERT INTO ... SELECT ...
--echo #------------------------------------------------------------------

--echo
--echo #   - No column list (all columns) + NULL-value for NOT NULL column.
--echo #     Expect 4 warnings for each statement.

--echo
INSERT INTO t1 SELECT * FROM t1_data;
INSERT INTO v1 SELECT a * 10, b * 10 FROM t1_data;

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
REPLACE INTO t1 SELECT * FROM t1_data;
REPLACE INTO v1 SELECT a * 10, b * 10 FROM t1_data;

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
--echo #   - No column list (all columns) + NULL-value for NOT NULL column.
--echo #     Expect 4 warnings for each statement.

--echo
INSERT INTO t2 SELECT * FROM t2_data;
INSERT INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
REPLACE INTO t2 SELECT * FROM t2_data;
REPLACE INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
--echo #   - All columns + NULL-value for NOT NULL column.
--echo #     Expect 4 warnings for each statement.

--echo
INSERT INTO t1(a, b) SELECT * FROM t1_data;
INSERT INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
REPLACE INTO t1(a, b) SELECT * FROM t1_data;
REPLACE INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
INSERT INTO t2(a, b, c, d) SELECT * FROM t2_data;
INSERT INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
REPLACE INTO t2(a, b, c, d) SELECT * FROM t2_data;
REPLACE INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
--echo #   - Single nullable column, no values for NOT NULL columns.
--echo #     Expect 4 warnings for each statement.

--echo
INSERT INTO t1(a) SELECT a FROM t1_data;
INSERT INTO v1(a) SELECT a * 100 FROM t1_data;

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
REPLACE INTO t1(a) SELECT a FROM t1_data;
REPLACE INTO v1(a) SELECT a * 100 FROM t1_data;

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
INSERT INTO t2(a) SELECT a FROM t2_data;
INSERT INTO v2(a) SELECT a * 100 FROM t2_data;

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
REPLACE INTO t2(a) SELECT a FROM t2_data;
REPLACE INTO v2(a) SELECT a * 100 FROM t2_data;

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
--echo #------------------------------------------------------------------
--echo # Checking LOAD DATA INFILE ...
--echo #------------------------------------------------------------------

--echo
LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE t2 FIELDS
TERMINATED BY ',' ENCLOSED BY '"';

--echo
SELECT * FROM t2;

--echo
DELETE FROM t2;

LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE v2 FIELDS
TERMINATED BY ',' ENCLOSED BY '"';

--echo
SELECT * FROM t2;

--echo
DELETE FROM t2;

--echo
--echo ###################################################################
--echo # Checking strict SQL_MODE.
--echo ###################################################################
--echo

SET sql_mode = 'traditional';

--echo
--echo #------------------------------------------------------------------
--echo # Checking INSERT INTO ... VALUES ...
--echo #------------------------------------------------------------------

--echo
--echo #   - No column list (all columns) + NULL-value for NOT NULL column.

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
INSERT INTO v1 VALUES (1, NULL);

--echo
SELECT * FROM t1;

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t1 VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
REPLACE INTO v1 VALUES (1, NULL);

--echo
SELECT * FROM t1;

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t2 VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
INSERT INTO v2 VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t2 VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
REPLACE INTO v2 VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--echo #   - All columns + NULL-value for NOT NULL column.

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO v1(a, b) VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
INSERT INTO t1(a, b) VALUES (1, NULL);

--echo
SELECT * FROM t1;

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO v1(a, b) VALUES (1, NULL);
--error ER_BAD_NULL_ERROR
REPLACE INTO t1(a, b) VALUES (1, NULL);

--echo
SELECT * FROM t1;

--echo
--error ER_BAD_NULL_ERROR
INSERT INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
INSERT INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--error ER_BAD_NULL_ERROR
REPLACE INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
--error ER_BAD_NULL_ERROR
REPLACE INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);

--echo
SELECT * FROM t2;

--echo
--echo #   - Single nullable column, no values for NOT NULL columns.

--echo
--error ER_NO_DEFAULT_FOR_FIELD
INSERT INTO t1(a) VALUES (1);
--error ER_NO_DEFAULT_FOR_FIELD
INSERT INTO t1(a) VALUES (2), (3), (4);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v1(a) VALUES (5);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v1(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
--error ER_NO_DEFAULT_FOR_FIELD
REPLACE INTO t1(a) VALUES (1);
--error ER_NO_DEFAULT_FOR_FIELD
REPLACE INTO t1(a) VALUES (2), (3), (4);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
REPLACE INTO v1(a) VALUES (5);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
REPLACE INTO v1(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t1;
DELETE FROM t1;

--echo
--error ER_NO_DEFAULT_FOR_FIELD
INSERT INTO t2(a) VALUES (1);
--error ER_NO_DEFAULT_FOR_FIELD
INSERT INTO t2(a) VALUES (2), (3), (4);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v2(a) VALUES (5);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v2(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
--error ER_NO_DEFAULT_FOR_FIELD
REPLACE INTO t2(a) VALUES (1);
--error ER_NO_DEFAULT_FOR_FIELD
REPLACE INTO t2(a) VALUES (2), (3), (4);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
REPLACE INTO v2(a) VALUES (5);
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
REPLACE INTO v2(a) VALUES (6), (7), (8);

--echo
SELECT * FROM t2;
DELETE FROM t2;

--echo
--echo #------------------------------------------------------------------
--echo # Checking INSERT INTO ... SELECT ...
--echo #------------------------------------------------------------------

--echo
--echo #   - No column list (all columns) + NULL-value for NOT NULL column.

--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.
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.
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.
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.
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.
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.
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.
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.
SELECT * FROM t2;
DELETE FROM t2;

--echo
--echo #   - Single nullable column, no values for NOT NULL columns.

--echo
--error ER_NO_DEFAULT_FOR_FIELD
INSERT INTO t1(a) SELECT a FROM t1_data;
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v1(a) SELECT a * 100 FROM t1_data;

--echo
--echo # The following SELECT output should have 0 rows.
SELECT * FROM t1;
DELETE FROM t1;

--echo
--error ER_NO_DEFAULT_FOR_FIELD
REPLACE INTO t1(a) SELECT a FROM t1_data;
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
REPLACE INTO v1(a) SELECT a * 100 FROM t1_data;

--echo
--echo # The following SELECT output should have 0 rows.
SELECT * FROM t1;
DELETE FROM t1;

--echo
--error ER_NO_DEFAULT_FOR_FIELD
INSERT INTO t2(a) SELECT a FROM t2_data;
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
INSERT INTO v2(a) SELECT a * 100 FROM t2_data;

--echo
--echo # The following SELECT output should have 0 rows.
SELECT * FROM t2;
DELETE FROM t2;

--echo
--error ER_NO_DEFAULT_FOR_FIELD
REPLACE INTO t2(a) SELECT a FROM t2_data;
--error ER_NO_DEFAULT_FOR_VIEW_FIELD
REPLACE INTO v2(a) SELECT a * 100 FROM t2_data;

--echo
--echo # The following SELECT output should have 0 rows.
SELECT * FROM t2;
DELETE FROM t2;

--echo
--echo #------------------------------------------------------------------
--echo # Checking LOAD DATA INFILE ...
--echo #------------------------------------------------------------------

--error ER_WARN_NULL_TO_NOTNULL
LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE t2 FIELDS
TERMINATED BY ',' ENCLOSED BY '"';

--echo
SELECT * FROM t2;

--echo
DELETE FROM t2;

--error ER_WARN_NULL_TO_NOTNULL
LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE v2 FIELDS
TERMINATED BY ',' ENCLOSED BY '"';

--echo
SELECT * FROM t2;

--echo
SET sql_mode = @sql_mode_saved;

DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t1_data;
DROP TABLE t2_data;
DROP VIEW v1;
DROP VIEW v2;

--echo
--echo #------------------------------------------------------------------
--echo # The following tests were suggested by QA
--echo #------------------------------------------------------------------
--echo

--echo "Test UPDATE SET inside trigger body"
CREATE TABLE t1(a1 INT NOT NULL);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
UPDATE t1 SET NEW.a1 = 1 WHERE a1 IS NULL;

--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
INSERT INTO t1 VALUES (NULL);

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for recursive trigger"
CREATE TABLE t1(a1 INT NOT NULL);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
UPDATE t1 SET NEW.a1 = 1;

--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG
INSERT INTO t1 VALUES (NULL);

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for IFNULL inside trigger body"
CREATE TABLE t1(a1 INT NOT NULL, a2 INT);
INSERT INTO t1 VALUES (1, 2);
delimiter |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
BEGIN
  SET NEW.a1 = IFNULL(NEW.a1, 10);
  SET NEW.a2 = IFNULL(NEW.a2, 20);
END;
|
delimiter ;|
INSERT INTO t1 VALUES (NULL, 1);
# expect here the row (10, 1);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for COALESCE Inside trigger body"
CREATE TABLE t1(a1 INT NOT NULL, a2 INT);
INSERT INTO t1 VALUES (1, 1);
DELIMITER |;
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
BEGIN
 SET NEW.a1 = COALESCE(NEW.a1, 5);
 SET NEW.a2 = COALESCE(NEW.a2, 7);
END;
|
DELIMITER ;|
INSERT INTO t1 VALUES (NULL, 3);
# expect here the row (5, 3)
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for PRIMARY KEY"
CREATE TABLE t1 (a1 INT PRIMARY KEY); 
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = 2;
INSERT INTO t1 VALUES (NULL);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for PRIMARY KEY (constraint violation)"
CREATE TABLE t1 (a1 INT PRIMARY KEY); 
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = 1;

INSERT INTO t1 VALUES (NULL);
SELECT * FROM t1;
--error ER_DUP_ENTRY
INSERT INTO t1 VALUES (NULL);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for UNIQUE column"
CREATE TABLE t1(a1 INT UNIQUE);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = 1;

INSERT INTO t1 VALUES (NULL);
SELECT * FROM t1;
--error ER_DUP_ENTRY
INSERT INTO t1 VALUES (NULL);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for date/timestamp datatype"
CREATE TABLE t1(a1 DATE NOT NULL, a2 TIMESTAMP NOT NULL);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = '2012-03-03', NEW.a2 = '2001-01-01 09:01:00';
INSERT INTO t1 VALUES (NULL, NULL);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for CHAR/VARCHAR datatype"
CREATE TABLE t1(a1 CHAR(10) NOT NULL, a2 VARCHAR(255) NOT NULL);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = 'MySQL' , NEW.a2 = 'Includes testing of MySQL';
INSERT INTO t1 VALUES (NULL, NULL);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for BINARY/VARBINARY datatype"
CREATE TABLE t1(a1 BINARY(10) NOT NULL, a2 VARBINARY(255) NOT NULL);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = '0x41', NEW.a2 = '0x42';

INSERT INTO t1 VALUES (NULL, NULL);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for UNIQUE column‚ constraint violation"
CREATE TABLE t1(a1 INT UNIQUE, a2 INT);
INSERT INTO t1 VALUES (1, 1);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = 1;
--error ER_DUP_ENTRY
INSERT INTO t1 VALUES (NULL, 2);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for UPDATE .. SET .. SELECT"
CREATE TABLE t1(a1 INT NOT NULL, a2 INT);
CREATE TABLE t2(a1 INT NOT NULL, a2 INT);
INSERT INTO t1 VALUES (1, NULL);
INSERT INTO t2 VALUES (1, NULL);

CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = 2;

UPDATE t1 SET a1 = (SELECT a2 FROM t2);
SELECT * FROM t1;

DROP TRIGGER t1_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, 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 update on PRIMARY KEY"
CREATE TABLE t1(a1 INT PRIMARY KEY, a2 INT);
INSERT INTO t1 VALUES (1, 1);
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = 2;
UPDATE t1 SET a1 =  NULL;
SELECT * FROM t1;

DROP TRIGGER t1_bu;
DROP TABLE t1;

--echo "Test for update on UNIQUE column"
CREATE TABLE t1(a1 INT UNIQUE NOT NULL, a2 INT);
INSERT INTO t1 VALUES (1, 1);
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = 2;
UPDATE t1 SET a1 =  NULL;
SELECT * FROM t1;

DROP TRIGGER t1_bu;
DROP TABLE t1;

--echo "INSERT NOT NULL into NOT NULL column if BEFORE INSERT trigger sets it to NULL."

--echo "Test for PRIMARY KEY"
CREATE TABLE t1(a1 INT PRIMARY KEY, a2 INT);
INSERT INTO t1 VALUES (1, 1);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = NULL;

--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES (2, 2);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for UNIQUE column"
CREATE TABLE t1(a1 INT UNIQUE NOT NULL, a2 INT);
INSERT INTO t1 VALUES (1, 1);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = NULL;
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES (2, 2),(3,3);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
--echo "Test for timestamp"
CREATE TABLE t1(a1 DATE NOT NULL, a2 TIMESTAMP NOT NULL, a3 TIMESTAMP NOT NULL);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = NULL , NEW.a2 = NULL , NEW.a3 = NULL;
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES ('2012-12-12','2012-12-12 12:12:12','1980-01-01 01:01:01');

DROP TRIGGER t1_bi;
DROP TABLE t1;
SET sql_mode = default;
--echo "Test for CHAR/VARCHAR datatype"
CREATE TABLE t1(a1 CHAR(10) NOT NULL, a2 VARCHAR(255) NOT NULL, a3 INT);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = NULL , NEW.a2 = NULL;
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES ('MySQL','MySQL Testing', 1);

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "Test for BINARY/VARBINARY datatype"
CREATE TABLE t1(a1 BINARY(10) NOT NULL, a2 VARBINARY(255) NOT NULL, a3 INT);
CREATE TRIGGER t1_bi BEFORE INSERT ON t1
FOR EACH ROW
SET NEW.a1 = NULL , NEW.a2 = NULL;
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES ('0x101','0x101', 1);
SELECT * FROM t1;

DROP TRIGGER t1_bi;
DROP TABLE t1;

--echo "UPDATE NOT NULL into NOT NULL column if BEFORE UPDATE trigger sets it to NULL."

--echo "Test for UPDATE .. SET .. SELECT"
CREATE TABLE t1(a1 INT NOT NULL, a2 INT) ;
CREATE TABLE t2(a1 INT NOT NULL, a2 INT) ;
INSERT INTO t1 VALUES (1, 1);
INSERT INTO t2 VALUES (1, 1);

CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = NULL;
--error ER_BAD_NULL_ERROR
UPDATE t1 SET a1 = (SELECT MAX(a2) FROM t2);
SELECT * FROM t1;
SELECT * FROM t2;

DROP TRIGGER t1_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;
SELECT * FROM t2;

DROP TRIGGER t1_bu;
DROP TABLE t1, t2;

--echo "Test for update on PRIMARY KEY"
CREATE TABLE t1(a1 INT PRIMARY KEY, a2 INT);
INSERT INTO t1 VALUES (1, 1);
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = NULL;
--error ER_BAD_NULL_ERROR
UPDATE t1 SET a1 = 2;
SELECT * FROM t1;

DROP TRIGGER t1_bu;
DROP TABLE t1;

--echo "Test for update on UNIQUE column"
CREATE TABLE t1(a1 INT UNIQUE NOT NULL, a2 INT);
INSERT INTO t1 VALUES (1, 1),(2, 2);
CREATE TRIGGER t1_bu BEFORE UPDATE ON t1
FOR EACH ROW
SET NEW.a1 = NULL;
--error ER_BAD_NULL_ERROR
UPDATE t1 SET a1 = 3; 
SELECT * FROM t1;

DROP TRIGGER t1_bu;
DROP TABLE t1;

#
# Bug#19182009 - 5.7 TRIGGERS HANDLE NOT NULL DIFFERENTLY TO OLDER VERSIONS; BREAKS COMPATIBILITY
#

SET @sql_mode_saved = @@sql_mode;
SET sql_mode='';

CREATE TABLE t1(a INT, b INT NOT NULL);
INSERT INTO t1(a) VALUES (1);
SHOW WARNINGS;
CREATE TRIGGER t1_trg_after_del AFTER DELETE ON t1 FOR EACH ROW SET @a := 1;
INSERT INTO t1(a) VALUES (1);
SHOW WARNINGS;

SET sql_mode = @sql_mode_saved;
DROP TABLE t1;

#
# BUG#22202665 - ADDING A TRIGGER TO A TABLE CHANGES THE BEHAVIOUR OF NULL DETECTION
#

--disable_warnings
SET @sql_mode_saved = @@sql_mode;
SET sql_mode='';
--enable_warnings
CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL);
INSERT INTO t1(a) VALUES (1);
SHOW WARNINGS;
CREATE TRIGGER t1_trg_before_ins BEFORE INSERT ON t1 FOR EACH ROW SET NEW.a=2;
INSERT INTO t1(a) VALUES (1);
SHOW WARNINGS;

--disable_warnings
SET sql_mode = @sql_mode_saved;
--enable_warnings
DROP TABLE t1;

Man Man