2178 lines
52 KiB
Plaintext
2178 lines
52 KiB
Plaintext
#
|
||
# WL#6030: Triggers are not processed for NOT NULL columns.
|
||
#
|
||
CREATE TABLE t2(a INT, b INT, c INT);
|
||
|
||
###################################################################
|
||
# Test 1: BEFORE INSERT, NOT NULL.
|
||
# - Test 1.1: SET to NOT NULL.
|
||
###################################################################
|
||
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);
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
1 20 30
|
||
1 200 300
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
1 20 30
|
||
1 200 300
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
1 2 3
|
||
1 2 3
|
||
1 20 30
|
||
1 20 30
|
||
1 20 30
|
||
1 200 300
|
||
1 200 300
|
||
1 200 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
1 2 3
|
||
1 2 3
|
||
1 20 30
|
||
1 20 30
|
||
1 20 30
|
||
1 200 300
|
||
1 200 300
|
||
1 200 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
1 2 3
|
||
1 2 3
|
||
1 20 30
|
||
1 20 30
|
||
1 20 30
|
||
1 200 300
|
||
1 200 300
|
||
1 200 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
1 2 3
|
||
1 2 3
|
||
1 20 30
|
||
1 20 30
|
||
1 20 30
|
||
1 200 300
|
||
1 200 300
|
||
1 200 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
DELETE FROM t2;
|
||
DROP TRIGGER t1_bi;
|
||
|
||
###################################################################
|
||
# - Test 1.2: SET to NULL.
|
||
###################################################################
|
||
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET NEW.a = NULL;
|
||
INSERT INTO t2 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
|
||
# Single INSERT ... VALUES.
|
||
INSERT INTO t1 VALUES (1, 2, 3);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(a, b, c) VALUES (1, 2, 3);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(b, c) VALUES (2, 3);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(a) VALUES (1);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
|
||
DELETE FROM t1;
|
||
|
||
# Single REPLACE ... VALUES.
|
||
REPLACE INTO t1 VALUES (1, 2, 3);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(a, b, c) VALUES (1, 2, 3);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(b, c) VALUES (2, 3);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(a) VALUES (1);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
|
||
DELETE FROM t1;
|
||
|
||
# Multi INSERT ... VALUES.
|
||
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(a) VALUES (1), (10), (100);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
|
||
DELETE FROM t1;
|
||
|
||
# Multi REPLACE ... VALUES.
|
||
REPLACE INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(b, c) VALUES (2, 3), (20, 30), (200, 300);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(a) VALUES (1), (10), (100);
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
|
||
DELETE FROM t1;
|
||
|
||
# INSERT ... SELECT.
|
||
INSERT INTO t1 SELECT * FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(a, b, c) SELECT * FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(b, c) SELECT b, c FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
INSERT INTO t1(a) SELECT a FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
|
||
DELETE FROM t1;
|
||
|
||
# REPLACE ... SELECT.
|
||
REPLACE INTO t1 SELECT * FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(a, b, c) SELECT * FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(b, c) SELECT b, c FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
REPLACE INTO t1(a) SELECT a FROM t2;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
|
||
DELETE FROM t1;
|
||
DROP TRIGGER t1_bi;
|
||
|
||
###################################################################
|
||
# Test 2: BEFORE UPDATE, NOT NULL.
|
||
# - Test 2.1: SET to NOT NULL.
|
||
###################################################################
|
||
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);
|
||
|
||
# Regular UPDATE.
|
||
UPDATE t1 SET a = NULL WHERE a = 1;
|
||
UPDATE t1 SET a = NULL, c = NULL WHERE a = 100;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
10 20 30
|
||
999 2 3
|
||
999 200 NULL
|
||
|
||
DELETE FROM t1;
|
||
INSERT INTO t1 VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
100 200 300
|
||
999 20 30
|
||
|
||
SELECT * FROM t3;
|
||
a b
|
||
-20 -10
|
||
|
||
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;
|
||
a b c
|
||
-20 20 30
|
||
1 2 3
|
||
100 200 300
|
||
SELECT * FROM t3;
|
||
a b
|
||
999 -10
|
||
DROP TRIGGER t3_bu;
|
||
DROP TABLE t3;
|
||
|
||
# - 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);
|
||
|
||
# Regular UPDATE.
|
||
UPDATE t1 SET a = 99 WHERE a = 1;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
UPDATE t1 SET a = 99, b = 99 WHERE a = 1;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
10 20 30
|
||
100 200 300
|
||
|
||
# Multiple UPDATE.
|
||
CREATE TABLE t3(a INT, b INT);
|
||
INSERT INTO t3 VALUES (10, -10);
|
||
UPDATE t1, t3 SET t1.a = 99, t3.a = -10 WHERE t1.a = t3.a AND t3.a = 10;
|
||
ERROR 23000: Column 'a' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 2 3
|
||
10 20 30
|
||
100 200 300
|
||
|
||
SELECT * FROM t3;
|
||
a b
|
||
10 -10
|
||
|
||
DELETE FROM t1;
|
||
DELETE FROM t2;
|
||
DROP TABLE t3;
|
||
DROP TRIGGER t1_bu;
|
||
|
||
###################################################################
|
||
# Test 3: Using illegal NULL-value as r-value.
|
||
# - Test 3.1: using NULL.
|
||
###################################################################
|
||
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
||
BEGIN
|
||
SET NEW.b = NEW.a;
|
||
SET NEW.a = 1;
|
||
END|
|
||
INSERT INTO t2 VALUES (1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 NULL 3
|
||
1 NULL 30
|
||
1 NULL 300
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 NULL 3
|
||
1 NULL 30
|
||
1 NULL 300
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 -1 3
|
||
1 -2 3
|
||
1 -3 NULL
|
||
1 NULL 3
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 -1 3
|
||
1 -2 3
|
||
1 -3 NULL
|
||
1 NULL 3
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 1 3
|
||
1 1 3
|
||
1 1 NULL
|
||
1 NULL 3
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
1 1 3
|
||
1 1 3
|
||
1 1 NULL
|
||
1 NULL 3
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 30
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL 300
|
||
1 NULL NULL
|
||
1 NULL NULL
|
||
|
||
DELETE FROM t1;
|
||
DROP TRIGGER t1_bi;
|
||
|
||
###################################################################
|
||
# - Test 3.2: using NOT NULL.
|
||
###################################################################
|
||
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
||
BEGIN
|
||
SET NEW.a = 99;
|
||
SET NEW.b = NEW.a;
|
||
END|
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
99 99 3
|
||
99 99 30
|
||
99 99 300
|
||
99 99 NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
99 99 3
|
||
99 99 30
|
||
99 99 300
|
||
99 99 NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
99 99 3
|
||
99 99 3
|
||
99 99 3
|
||
99 99 30
|
||
99 99 30
|
||
99 99 30
|
||
99 99 300
|
||
99 99 300
|
||
99 99 300
|
||
99 99 NULL
|
||
99 99 NULL
|
||
99 99 NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
99 99 3
|
||
99 99 3
|
||
99 99 3
|
||
99 99 30
|
||
99 99 30
|
||
99 99 30
|
||
99 99 300
|
||
99 99 300
|
||
99 99 300
|
||
99 99 NULL
|
||
99 99 NULL
|
||
99 99 NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
99 99 3
|
||
99 99 3
|
||
99 99 3
|
||
99 99 30
|
||
99 99 30
|
||
99 99 30
|
||
99 99 300
|
||
99 99 300
|
||
99 99 300
|
||
99 99 NULL
|
||
99 99 NULL
|
||
99 99 NULL
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c
|
||
99 99 3
|
||
99 99 3
|
||
99 99 3
|
||
99 99 30
|
||
99 99 30
|
||
99 99 30
|
||
99 99 300
|
||
99 99 300
|
||
99 99 300
|
||
99 99 NULL
|
||
99 99 NULL
|
||
99 99 NULL
|
||
|
||
DELETE FROM t1;
|
||
DELETE FROM t2;
|
||
DROP TRIGGER t1_bi;
|
||
|
||
###################################################################
|
||
# Test 4: Temporarily setting to illegal NULL-value in trigger
|
||
# (here we only check that it's possible to temporarily assign
|
||
# NULL in triggers).
|
||
###################################################################
|
||
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|
|
||
|
||
# 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;
|
||
a b c
|
||
99 NULL 3
|
||
99 NULL 3
|
||
99 NULL 30
|
||
99 NULL 300
|
||
|
||
# Checking BEFORE UPDATE trigger.
|
||
UPDATE t1 SET b = 999 WHERE c = 300;
|
||
SELECT * FROM t1;
|
||
a b c
|
||
199 NULL 300
|
||
99 NULL 3
|
||
99 NULL 3
|
||
99 NULL 30
|
||
|
||
DROP TRIGGER t1_bi;
|
||
DROP TRIGGER t1_bu;
|
||
DELETE FROM t1;
|
||
|
||
###################################################################
|
||
# Test 5: Using IS NULL inside trigger.
|
||
# - Test 5.1: BEFORE INSERT trigger.
|
||
###################################################################
|
||
ALTER TABLE t1 ADD COLUMN a_new_is_null BOOLEAN DEFAULT NULL;
|
||
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|
|
||
INSERT INTO t2 VALUES (1, 2, 3), (NULL, 20, 30), (NULL, 200, 300);
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null
|
||
99 2 3 1
|
||
99 20 30 1
|
||
99 200 300 1
|
||
99 NULL NULL 1
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null
|
||
99 2 3 1
|
||
99 20 30 1
|
||
99 200 300 1
|
||
99 NULL NULL 1
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null
|
||
99 2 3 0
|
||
99 2 3 0
|
||
99 2 3 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 NULL NULL 0
|
||
99 NULL NULL 1
|
||
99 NULL NULL 1
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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);
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null
|
||
99 2 3 0
|
||
99 2 3 0
|
||
99 2 3 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 NULL NULL 0
|
||
99 NULL NULL 1
|
||
99 NULL NULL 1
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null
|
||
99 2 3 0
|
||
99 2 3 0
|
||
99 2 3 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 NULL NULL 0
|
||
99 NULL NULL 1
|
||
99 NULL NULL 1
|
||
|
||
DELETE FROM t1;
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null
|
||
99 2 3 0
|
||
99 2 3 0
|
||
99 2 3 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 20 30 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 200 300 1
|
||
99 NULL NULL 0
|
||
99 NULL NULL 1
|
||
99 NULL NULL 1
|
||
|
||
DELETE FROM t1;
|
||
DROP TRIGGER t1_bi;
|
||
|
||
###################################################################
|
||
# - Test 5.2: BEFORE UPDATE trigger.
|
||
###################################################################
|
||
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;
|
||
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|
|
||
INSERT INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null a_old_is_null b_new_is_null b_old_is_null
|
||
99 2 3 1 0 0 0
|
||
99 20 NULL 1 0 0 0
|
||
99 NULL 300 0 0 1 0
|
||
|
||
DELETE FROM t1;
|
||
INSERT INTO t1(a, b, c) VALUES (1, 2, 3), (10, 20, 30), (100, 200, 300);
|
||
|
||
# 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;
|
||
|
||
SELECT * FROM t1;
|
||
a b c a_new_is_null a_old_is_null b_new_is_null b_old_is_null
|
||
1 2 3 NULL NULL NULL NULL
|
||
100 200 300 NULL NULL NULL NULL
|
||
99 20 30 1 0 0 0
|
||
|
||
SELECT * FROM t3;
|
||
a b
|
||
-20 -10
|
||
|
||
DROP TABLE t3;
|
||
DROP TRIGGER t1_bu;
|
||
DROP TABLE t1;
|
||
DROP TABLE t2;
|
||
|
||
###################################################################
|
||
# Test 6: Nullability of non-updated columns.
|
||
###################################################################
|
||
CREATE TABLE t1(a INT, b INT NOT NULL);
|
||
|
||
# - Unconditional SET in a trigger.
|
||
|
||
CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
|
||
SET NEW.b = NULL;
|
||
|
||
INSERT INTO t1(a) VALUES (1);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
REPLACE INTO t1(a) VALUES (1);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
DROP TRIGGER t1_bi;
|
||
|
||
# - Conditional SET in a trigger, which is executed for every row.
|
||
|
||
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|
|
||
|
||
INSERT INTO t1(a) VALUES (NULL);
|
||
|
||
REPLACE INTO t1(a) VALUES (NULL);
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
NULL 1
|
||
NULL 1
|
||
DELETE FROM t1;
|
||
DROP TRIGGER t1_bi;
|
||
|
||
# - Conditional SET in a trigger, which is NOT executed for every row.
|
||
|
||
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||
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|
|
||
|
||
INSERT INTO t1(a) VALUES (1), (2), (3), (4), (5), (6);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
|
||
REPLACE INTO t1(a) VALUES (1), (2), (3), (4), (5), (6);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
1 0
|
||
1 0
|
||
2 1
|
||
2 1
|
||
3 0
|
||
3 0
|
||
4 3
|
||
4 3
|
||
5 0
|
||
5 0
|
||
6 5
|
||
6 5
|
||
DROP TABLE t1;
|
||
SET sql_mode = default;
|
||
|
||
###################################################################
|
||
# Test 7: Nullability of column being copied as result of INSERT SELECT.
|
||
###################################################################
|
||
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;
|
||
|
||
INSERT INTO t1 SELECT * FROM t2;
|
||
REPLACE INTO t1 SELECT * FROM t2;
|
||
|
||
SELECT * FROM t1;
|
||
a
|
||
1
|
||
1
|
||
|
||
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);
|
||
|
||
UPDATE t1, t2 SET t1.a = t2.a;
|
||
|
||
SELECT * FROM t1;
|
||
a
|
||
2
|
||
|
||
DROP TRIGGER t1_bu;
|
||
DROP TABLE t1,t2;
|
||
|
||
###################################################################
|
||
# Test 8: Nullability of column being copied as result of
|
||
# LOAD DATA INFILE.
|
||
###################################################################
|
||
CREATE TABLE t1 (a INT NOT NULL, b VARCHAR(10) NOT NULL);
|
||
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 |
|
||
LOAD DATA INFILE '../../std_data/wl6030.dat' INTO TABLE t1 FIELDS
|
||
TERMINATED BY ',' ENCLOSED BY '"';
|
||
SELECT * FROM t1;
|
||
a b
|
||
457 123
|
||
321 text
|
||
579 123
|
||
789
|
||
|
||
987 123
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
|
||
###################################################################
|
||
# Misc tests.
|
||
###################################################################
|
||
|
||
CREATE TABLE t1(a INT, b INT NOT NULL);
|
||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||
CREATE TABLE t2(a INT, b INT NOT NULL, c INT NOT NULL, d INT NOT NULL);
|
||
CREATE VIEW v2 AS SELECT * FROM t2;
|
||
CREATE TABLE t1_data(a INT, b INT);
|
||
INSERT INTO t1_data VALUES
|
||
(11, 12),
|
||
(NULL, 22),
|
||
(31, NULL),
|
||
(NULL, NULL);
|
||
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;
|
||
|
||
###################################################################
|
||
# Checking permissive SQL_MODE.
|
||
###################################################################
|
||
|
||
SET sql_mode = '';
|
||
|
||
#------------------------------------------------------------------
|
||
# Checking INSERT INTO ... VALUES ...
|
||
#------------------------------------------------------------------
|
||
|
||
# - No column list (all columns) + NULL-value for NOT NULL column.
|
||
|
||
INSERT INTO t1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO v1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
REPLACE INTO t1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO v1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
INSERT INTO t2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
INSERT INTO v2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
REPLACE INTO t2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
REPLACE INTO v2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
# - All columns + NULL-value for NOT NULL column.
|
||
|
||
INSERT INTO v1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO t1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
REPLACE INTO v1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO t1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
INSERT INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
INSERT INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
REPLACE INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
REPLACE INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
# - Single nullable column, no values for NOT NULL columns.
|
||
# Expect exactly 4 warnings and 8 rows being inserted into t1.
|
||
|
||
INSERT INTO t1(a) VALUES (1);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
INSERT INTO t1(a) VALUES (2), (3), (4);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
INSERT INTO v1(a) VALUES (5);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
|
||
INSERT INTO v1(a) VALUES (6), (7), (8);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
1 0
|
||
2 0
|
||
3 0
|
||
4 0
|
||
5 0
|
||
6 0
|
||
7 0
|
||
8 0
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1(a) VALUES (1);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
REPLACE INTO t1(a) VALUES (2), (3), (4);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
REPLACE INTO v1(a) VALUES (5);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
|
||
REPLACE INTO v1(a) VALUES (6), (7), (8);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
1 0
|
||
2 0
|
||
3 0
|
||
4 0
|
||
5 0
|
||
6 0
|
||
7 0
|
||
8 0
|
||
DELETE FROM t1;
|
||
|
||
INSERT INTO t2(a) VALUES (1);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
Warning 1364 Field 'c' doesn't have a default value
|
||
Warning 1364 Field 'd' doesn't have a default value
|
||
INSERT INTO t2(a) VALUES (2), (3), (4);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
Warning 1364 Field 'c' doesn't have a default value
|
||
Warning 1364 Field 'd' doesn't have a default value
|
||
INSERT INTO v2(a) VALUES (5);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
INSERT INTO v2(a) VALUES (6), (7), (8);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
1 0 0 0
|
||
2 0 0 0
|
||
3 0 0 0
|
||
4 0 0 0
|
||
5 0 0 0
|
||
6 0 0 0
|
||
7 0 0 0
|
||
8 0 0 0
|
||
DELETE FROM t2;
|
||
|
||
REPLACE INTO t2(a) VALUES (1);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
Warning 1364 Field 'c' doesn't have a default value
|
||
Warning 1364 Field 'd' doesn't have a default value
|
||
REPLACE INTO t2(a) VALUES (2), (3), (4);
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
Warning 1364 Field 'c' doesn't have a default value
|
||
Warning 1364 Field 'd' doesn't have a default value
|
||
REPLACE INTO v2(a) VALUES (5);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
REPLACE INTO v2(a) VALUES (6), (7), (8);
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
1 0 0 0
|
||
2 0 0 0
|
||
3 0 0 0
|
||
4 0 0 0
|
||
5 0 0 0
|
||
6 0 0 0
|
||
7 0 0 0
|
||
8 0 0 0
|
||
DELETE FROM t2;
|
||
|
||
#------------------------------------------------------------------
|
||
# Checking INSERT INTO ... SELECT ...
|
||
#------------------------------------------------------------------
|
||
|
||
# - No column list (all columns) + NULL-value for NOT NULL column.
|
||
# Expect 4 warnings for each statement.
|
||
|
||
INSERT INTO t1 SELECT * FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
INSERT INTO v1 SELECT a * 10, b * 10 FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
11 12
|
||
110 120
|
||
31 0
|
||
310 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 22
|
||
NULL 220
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1 SELECT * FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
REPLACE INTO v1 SELECT a * 10, b * 10 FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
11 12
|
||
110 120
|
||
31 0
|
||
310 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 22
|
||
NULL 220
|
||
DELETE FROM t1;
|
||
|
||
# - No column list (all columns) + NULL-value for NOT NULL column.
|
||
# Expect 4 warnings for each statement.
|
||
|
||
INSERT INTO t2 SELECT * FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
INSERT INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 12 13 14
|
||
110 120 130 140
|
||
31 0 33 34
|
||
310 0 330 340
|
||
41 42 0 44
|
||
410 420 0 440
|
||
51 52 53 0
|
||
510 520 530 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 22 23 24
|
||
NULL 220 230 240
|
||
DELETE FROM t2;
|
||
|
||
REPLACE INTO t2 SELECT * FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
REPLACE INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 12 13 14
|
||
110 120 130 140
|
||
31 0 33 34
|
||
310 0 330 340
|
||
41 42 0 44
|
||
410 420 0 440
|
||
51 52 53 0
|
||
510 520 530 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 22 23 24
|
||
NULL 220 230 240
|
||
DELETE FROM t2;
|
||
|
||
# - All columns + NULL-value for NOT NULL column.
|
||
# Expect 4 warnings for each statement.
|
||
|
||
INSERT INTO t1(a, b) SELECT * FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
INSERT INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
11 12
|
||
110 120
|
||
31 0
|
||
310 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 22
|
||
NULL 220
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1(a, b) SELECT * FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
REPLACE INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
11 12
|
||
110 120
|
||
31 0
|
||
310 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 22
|
||
NULL 220
|
||
DELETE FROM t1;
|
||
|
||
INSERT INTO t2(a, b, c, d) SELECT * FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
INSERT INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 12 13 14
|
||
110 120 130 140
|
||
31 0 33 34
|
||
310 0 330 340
|
||
41 42 0 44
|
||
410 420 0 440
|
||
51 52 53 0
|
||
510 520 530 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 22 23 24
|
||
NULL 220 230 240
|
||
DELETE FROM t2;
|
||
|
||
REPLACE INTO t2(a, b, c, d) SELECT * FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
REPLACE INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
Warnings:
|
||
Warning 1048 Column 'b' cannot be null
|
||
Warning 1048 Column 'c' cannot be null
|
||
Warning 1048 Column 'd' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 12 13 14
|
||
110 120 130 140
|
||
31 0 33 34
|
||
310 0 330 340
|
||
41 42 0 44
|
||
410 420 0 440
|
||
51 52 53 0
|
||
510 520 530 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 22 23 24
|
||
NULL 220 230 240
|
||
DELETE FROM t2;
|
||
|
||
# - Single nullable column, no values for NOT NULL columns.
|
||
# Expect 4 warnings for each statement.
|
||
|
||
INSERT INTO t1(a) SELECT a FROM t1_data;
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
INSERT INTO v1(a) SELECT a * 100 FROM t1_data;
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
11 0
|
||
1100 0
|
||
31 0
|
||
3100 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 0
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1(a) SELECT a FROM t1_data;
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
REPLACE INTO v1(a) SELECT a * 100 FROM t1_data;
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
11 0
|
||
1100 0
|
||
31 0
|
||
3100 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 0
|
||
NULL 0
|
||
DELETE FROM t1;
|
||
|
||
INSERT INTO t2(a) SELECT a FROM t2_data;
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
Warning 1364 Field 'c' doesn't have a default value
|
||
Warning 1364 Field 'd' doesn't have a default value
|
||
INSERT INTO v2(a) SELECT a * 100 FROM t2_data;
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 0 0 0
|
||
1100 0 0 0
|
||
31 0 0 0
|
||
3100 0 0 0
|
||
41 0 0 0
|
||
4100 0 0 0
|
||
51 0 0 0
|
||
5100 0 0 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
DELETE FROM t2;
|
||
|
||
REPLACE INTO t2(a) SELECT a FROM t2_data;
|
||
Warnings:
|
||
Warning 1364 Field 'b' doesn't have a default value
|
||
Warning 1364 Field 'c' doesn't have a default value
|
||
Warning 1364 Field 'd' doesn't have a default value
|
||
REPLACE INTO v2(a) SELECT a * 100 FROM t2_data;
|
||
Warnings:
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
Warning 1423 Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 0 0 0
|
||
1100 0 0 0
|
||
31 0 0 0
|
||
3100 0 0 0
|
||
41 0 0 0
|
||
4100 0 0 0
|
||
51 0 0 0
|
||
5100 0 0 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
NULL 0 0 0
|
||
DELETE FROM t2;
|
||
|
||
#------------------------------------------------------------------
|
||
# Checking LOAD DATA INFILE ...
|
||
#------------------------------------------------------------------
|
||
|
||
LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE t2 FIELDS
|
||
TERMINATED BY ',' ENCLOSED BY '"';
|
||
Warnings:
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'b' at row 3
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'c' at row 4
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'd' at row 5
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'b' at row 6
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'c' at row 6
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'd' at row 6
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'b' at row 7
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'c' at row 8
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'd' at row 9
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 12 13 14
|
||
31 0 33 34
|
||
41 42 0 44
|
||
51 52 53 0
|
||
NULL 0 0 0
|
||
NULL 0 73 74
|
||
NULL 22 23 24
|
||
NULL 82 0 84
|
||
NULL 92 93 0
|
||
|
||
DELETE FROM t2;
|
||
LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE v2 FIELDS
|
||
TERMINATED BY ',' ENCLOSED BY '"';
|
||
Warnings:
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'b' at row 3
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'c' at row 4
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'd' at row 5
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'b' at row 6
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'c' at row 6
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'd' at row 6
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'b' at row 7
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'c' at row 8
|
||
Warning 1263 Column set to default value; NULL supplied to NOT NULL column 'd' at row 9
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
11 12 13 14
|
||
31 0 33 34
|
||
41 42 0 44
|
||
51 52 53 0
|
||
NULL 0 0 0
|
||
NULL 0 73 74
|
||
NULL 22 23 24
|
||
NULL 82 0 84
|
||
NULL 92 93 0
|
||
|
||
DELETE FROM t2;
|
||
|
||
###################################################################
|
||
# Checking strict SQL_MODE.
|
||
###################################################################
|
||
|
||
SET sql_mode = 'traditional';
|
||
|
||
#------------------------------------------------------------------
|
||
# Checking INSERT INTO ... VALUES ...
|
||
#------------------------------------------------------------------
|
||
|
||
# - No column list (all columns) + NULL-value for NOT NULL column.
|
||
|
||
INSERT INTO t1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO v1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
REPLACE INTO t1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO v1 VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
INSERT INTO t2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
INSERT INTO v2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
REPLACE INTO t2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
REPLACE INTO v2 VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
# - All columns + NULL-value for NOT NULL column.
|
||
|
||
INSERT INTO v1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO t1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
REPLACE INTO v1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO t1(a, b) VALUES (1, NULL);
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
|
||
INSERT INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
INSERT INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
REPLACE INTO t2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
REPLACE INTO v2(a, b, c, d) VALUES (1, 2, NULL, 4);
|
||
ERROR 23000: Column 'c' cannot be null
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
# - Single nullable column, no values for NOT NULL columns.
|
||
|
||
INSERT INTO t1(a) VALUES (1);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
INSERT INTO t1(a) VALUES (2), (3), (4);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
INSERT INTO v1(a) VALUES (5);
|
||
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
|
||
INSERT INTO v1(a) VALUES (6), (7), (8);
|
||
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1(a) VALUES (1);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
REPLACE INTO t1(a) VALUES (2), (3), (4);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
REPLACE INTO v1(a) VALUES (5);
|
||
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
|
||
REPLACE INTO v1(a) VALUES (6), (7), (8);
|
||
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
INSERT INTO t2(a) VALUES (1);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
INSERT INTO t2(a) VALUES (2), (3), (4);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
INSERT INTO v2(a) VALUES (5);
|
||
ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default value
|
||
INSERT INTO v2(a) VALUES (6), (7), (8);
|
||
ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
|
||
REPLACE INTO t2(a) VALUES (1);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
REPLACE INTO t2(a) VALUES (2), (3), (4);
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
REPLACE INTO v2(a) VALUES (5);
|
||
ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default value
|
||
REPLACE INTO v2(a) VALUES (6), (7), (8);
|
||
ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
DROP TABLE t1;
|
||
DROP TABLE t2;
|
||
DROP TABLE t1_data;
|
||
DROP TABLE t2_data;
|
||
DROP VIEW v1;
|
||
DROP VIEW v2;
|
||
CREATE TABLE t1(a INT, b INT NOT NULL) ;
|
||
CREATE VIEW v1 AS SELECT * FROM t1;
|
||
CREATE TABLE t2(a INT, b INT NOT NULL, c INT NOT NULL, d INT NOT NULL) ;
|
||
CREATE VIEW v2 AS SELECT * FROM t2;
|
||
CREATE TABLE t1_data(a INT, b INT) ;
|
||
INSERT INTO t1_data VALUES
|
||
(11, 12),
|
||
(NULL, 22),
|
||
(31, NULL),
|
||
(NULL, NULL);
|
||
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);
|
||
|
||
# - Single nullable column, no values for NOT NULL columns.
|
||
|
||
INSERT INTO t1(a) SELECT a FROM t1_data;
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
INSERT INTO v1(a) SELECT a * 100 FROM t1_data;
|
||
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1(a) SELECT a FROM t1_data;
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
REPLACE INTO v1(a) SELECT a * 100 FROM t1_data;
|
||
ERROR HY000: Field of view 'test.v1' underlying table doesn't have a default value
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
INSERT INTO t2(a) SELECT a FROM t2_data;
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
INSERT INTO v2(a) SELECT a * 100 FROM t2_data;
|
||
ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
|
||
REPLACE INTO t2(a) SELECT a FROM t2_data;
|
||
ERROR HY000: Field 'b' doesn't have a default value
|
||
REPLACE INTO v2(a) SELECT a * 100 FROM t2_data;
|
||
ERROR HY000: Field of view 'test.v2' underlying table doesn't have a default value
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
|
||
#------------------------------------------------------------------
|
||
# Checking LOAD DATA INFILE ...
|
||
#------------------------------------------------------------------
|
||
LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE t2 FIELDS
|
||
TERMINATED BY ',' ENCLOSED BY '"';
|
||
ERROR 22004: Column set to default value; NULL supplied to NOT NULL column 'b' at row 3
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
DELETE FROM t2;
|
||
LOAD DATA INFILE '../../std_data/wl6030_2.dat' INTO TABLE v2 FIELDS
|
||
TERMINATED BY ',' ENCLOSED BY '"';
|
||
ERROR 22004: Column set to default value; NULL supplied to NOT NULL column 'b' at row 3
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
SET sql_mode = @sql_mode_saved;
|
||
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
|
||
SET sql_mode = @sql_mode_saved;
|
||
|
||
#------------------------------------------------------------------
|
||
# Checking INSERT INTO ... SELECT ...
|
||
#------------------------------------------------------------------
|
||
|
||
# - No column list (all columns) + NULL-value for NOT NULL column.
|
||
|
||
INSERT INTO t1 SELECT * FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO v1 SELECT a * 10, b * 10 FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t1's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1 SELECT * FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO v1 SELECT a * 10, b * 10 FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t1's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
# - No column list (all columns) + NULL-value for NOT NULL column.
|
||
INSERT INTO t2 SELECT * FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t2's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
|
||
# - No column list (all columns) + NULL-value for NOT NULL column.
|
||
REPLACE INTO t2 SELECT * FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO v2 SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t2's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
|
||
# - All columns + NULL-value for NOT NULL column.
|
||
|
||
INSERT INTO t1(a, b) SELECT * FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t1's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
REPLACE INTO t1(a, b) SELECT * FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO v1(a, b) SELECT a * 10, b * 10 FROM t1_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t1's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t1;
|
||
a b
|
||
DELETE FROM t1;
|
||
|
||
INSERT INTO t2(a, b, c, d) SELECT * FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
INSERT INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t2's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
|
||
REPLACE INTO t2(a, b, c, d) SELECT * FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
REPLACE INTO v2(a, b, c, d) SELECT a * 10, b * 10, c * 10, d * 10 FROM t2_data;
|
||
ERROR 23000: Column 'b' cannot be null
|
||
|
||
# The following SELECT output should have 0 rows.
|
||
# t2's engine is InnoDB, so the whole transaction is rolled back.
|
||
SELECT * FROM t2;
|
||
a b c d
|
||
DELETE FROM t2;
|
||
DROP TABLE t1;
|
||
DROP TABLE t2;
|
||
DROP TABLE t1_data;
|
||
DROP TABLE t2_data;
|
||
DROP VIEW v1;
|
||
DROP VIEW v2;
|
||
|
||
#------------------------------------------------------------------
|
||
# The following tests were suggested by QA
|
||
#------------------------------------------------------------------
|
||
|
||
"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;
|
||
INSERT INTO t1 VALUES (NULL);
|
||
ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"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;
|
||
INSERT INTO t1 VALUES (NULL);
|
||
ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"Test for IFNULL inside trigger body"
|
||
CREATE TABLE t1(a1 INT NOT NULL, a2 INT);
|
||
INSERT INTO t1 VALUES (1, 2);
|
||
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;
|
||
|
|
||
INSERT INTO t1 VALUES (NULL, 1);
|
||
SELECT * FROM t1;
|
||
a1 a2
|
||
1 2
|
||
10 1
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"Test for COALESCE Inside trigger body"
|
||
CREATE TABLE t1(a1 INT NOT NULL, a2 INT);
|
||
INSERT INTO t1 VALUES (1, 1);
|
||
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;
|
||
|
|
||
INSERT INTO t1 VALUES (NULL, 3);
|
||
SELECT * FROM t1;
|
||
a1 a2
|
||
1 1
|
||
5 3
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"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;
|
||
a1
|
||
2
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"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;
|
||
a1
|
||
1
|
||
INSERT INTO t1 VALUES (NULL);
|
||
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
||
SELECT * FROM t1;
|
||
a1
|
||
1
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"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;
|
||
a1
|
||
1
|
||
INSERT INTO t1 VALUES (NULL);
|
||
ERROR 23000: Duplicate entry '1' for key 'a1'
|
||
SELECT * FROM t1;
|
||
a1
|
||
1
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"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;
|
||
a1 a2
|
||
2012-03-03 2001-01-01 09:01:00
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"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;
|
||
a1 a2
|
||
MySQL Includes testing of MySQL
|
||
DROP TRIGGER t1_bi;
|
||
DROP TABLE t1;
|
||
"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;
|
||
a1 a2
|
||
0x41 |