Server IP : 185.86.78.101 / Your IP : 216.73.216.213 Web Server : Apache System : Linux 675867-vds-valikoshka1996.gmhost.pp.ua 5.4.0-150-generic #167-Ubuntu SMP Mon May 15 17:35:05 UTC 2023 x86_64 User : www ( 1000) PHP Version : 7.4.33 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /www/server/mysql/mysql-test/r/ |
Upload File : |
DROP TABLE IF EXISTS t1_select; DROP TABLE IF EXISTS t1_aux; DROP TABLE IF EXISTS t1_not_null; DROP VIEW IF EXISTS v1_not_null; DROP VIEW IF EXISTS v1_func; DROP TABLE IF EXISTS t1_fail; DROP FUNCTION IF EXISTS f1_simple_insert; DROP FUNCTION IF EXISTS f1_two_inserts; DROP FUNCTION IF EXISTS f1_insert_select; SET SESSION AUTOCOMMIT=0; SET SESSION sql_mode = ''; Warnings: Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. CREATE TABLE t1_select (f1 BIGINT, f2 BIGINT) ENGINE = MEMORY; INSERT INTO t1_select(f1,f2) VALUES (1,-1),(2,NULL),(3,0),(4,1),(5,2); SELECT * FROM t1_select; f1 f2 1 -1 2 NULL 3 0 4 1 5 2 CREATE TABLE t1_not_null (f1 BIGINT, f2 BIGINT NOT NULL) ENGINE = <transactional_engine>; SELECT * FROM t1_not_null; f1 f2 CREATE TABLE t1_aux (f1 BIGINT, f2 BIGINT) ENGINE = <transactional_engine>; SELECT * FROM t1_aux; f1 f2 COMMIT; CREATE FUNCTION f1_simple_insert(my_f1 INTEGER) RETURNS INTEGER BEGIN INSERT INTO t1_not_null SET f1 = 10, f2 = my_f1; RETURN 1; END// # One f1_simple_insert execution per row, no NOT NULL violation SELECT f1_simple_insert(1); f1_simple_insert(1) 1 SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 10 1 ROLLBACK; SELECT * FROM t1_not_null; f1 f2 SELECT f1_simple_insert(1) FROM t1_select; f1_simple_insert(1) 1 1 1 1 1 SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 10 1 10 1 10 1 10 1 10 1 ROLLBACK; SELECT * FROM t1_not_null; f1 f2 # One f1_simple_insert execution per row, NOT NULL violation when the # SELECT processes the first row. SELECT f1_simple_insert(NULL); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT f1_simple_insert(NULL) FROM t1_select; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT 1 FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1 WHERE f1_simple_insert(NULL) = 1; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # One f1_simple_insert execution per row, NOT NULL violation when the # SELECT processes the non first row SELECT f1_simple_insert(f2) FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT f1_simple_insert(f2) FROM t1_select; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # Two f1_simple_insert executions per row, NOT NULL violation when the # SELECT processes the first row. SELECT f1_simple_insert(1),f1_simple_insert(NULL); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT f1_simple_insert(NULL),f1_simple_insert(1); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # Two f1_simple_insert executions per row, NOT NULL violation when the # SELECT processes the non first row SELECT f1_simple_insert(f1),f1_simple_insert(f2) FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT f1_simple_insert(f2),f1_simple_insert(f1) FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT f1_simple_insert(f1),f1_simple_insert(f2) FROM t1_select; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT f1_simple_insert(f2),f1_simple_insert(f1) FROM t1_select; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT 1 FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1 WHERE 1 = f1_simple_insert(f2) AND 1 = f1_simple_insert(f1); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # Nested functions, the inner fails SELECT f1_simple_insert(f1_simple_insert(NULL)) FROM t1_select; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # Nested functions, the outer fails SELECT f1_simple_insert(f1_simple_insert(1) + NULL) FROM t1_select; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP FUNCTION f1_simple_insert; CREATE FUNCTION f1_insert_select(my_f1 INTEGER) RETURNS INTEGER BEGIN INSERT INTO t1_not_null SELECT * FROM t1_select WHERE f1 = my_f1; RETURN 1; END; # f1_insert_select(2), tries to INSERT SELECT one row containing NULL # The fact that # - SELECT f1_insert_select(2); gives any result set and # - t1_not_null gets a row inserted # is covered by the manual. SELECT f1_insert_select(2); f1_insert_select(2) 1 SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 2 0 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP FUNCTION f1_insert_select; SET SESSION sql_mode = 'traditional'; Warnings: Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. CREATE FUNCTION f1_insert_select(my_f1 INTEGER) RETURNS INTEGER BEGIN INSERT INTO t1_not_null SELECT * FROM t1_select WHERE f1 = my_f1; RETURN 1; END; SELECT f1_insert_select(2); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP FUNCTION f1_insert_select; SET SESSION sql_mode = ''; Warnings: Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. # Function tries to # 1. INSERT statement: Insert one row with NULL -> NOT NULL violation # 2. INSERT statement: Insert one row without NULL CREATE FUNCTION f1_two_inserts() RETURNS INTEGER BEGIN INSERT INTO t1_not_null SET f1 = 10, f2 = NULL; INSERT INTO t1_not_null SET f1 = 10, f2 = 10; RETURN 1; END// SELECT f1_two_inserts(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP FUNCTION f1_two_inserts; # Function tries to # 1. INSERT statement: Insert one row without NULL # 2. INSERT statement: Insert one row with NULL -> NOT NULL violation CREATE FUNCTION f1_two_inserts() RETURNS INTEGER BEGIN INSERT INTO t1_not_null SET f1 = 10, f2 = 10; INSERT INTO t1_not_null SET f1 = 10, f2 = NULL; RETURN 1; END// SELECT f1_two_inserts(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # Function tries to # INSERT statement: Insert two rows # first row without NULL # second row with NULL -> NOT NULL violation # -> NOT NULL violation CREATE FUNCTION f1_insert_with_two_rows() RETURNS INTEGER BEGIN INSERT INTO t1_not_null(f1,f2) VALUES (10,10),(10,NULL); RETURN 1; END; # The fact that # - SELECT f1_insert_with_two_rows(); gives any result set and # - t1_not_null gets a row inserted # is covered by the manual. SELECT f1_insert_with_two_rows(); f1_insert_with_two_rows() 1 SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 10 0 10 10 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP FUNCTION f1_insert_with_two_rows; SET SESSION sql_mode = 'traditional'; Warnings: Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. CREATE FUNCTION f1_insert_with_two_rows() RETURNS INTEGER BEGIN INSERT INTO t1_not_null(f1,f2) VALUES (10,10),(10,NULL); RETURN 1; END; SELECT f1_insert_with_two_rows(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SET SESSION sql_mode = ''; Warnings: Warning 3090 Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. # FUNCTION in Correlated Subquery SELECT 1 FROM t1_select t1 WHERE 1 = (SELECT f1_insert_with_two_rows() FROM t1_select t2 WHERE t2.f1 = t1.f1); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # FUNCTION in JOIN SELECT 1 FROM t1_select t1, t1_select t2 WHERE t1.f1 = t2.f1 AND t2.f1 = f1_insert_with_two_rows(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT STRAIGHT_JOIN * FROM t1_select t2 RIGHT JOIN t1_select t1 ON t1.f1 = t1.f1 WHERE 1 = f1_insert_with_two_rows(); ERROR 23000: Column 'f2' cannot be null DROP FUNCTION f1_insert_with_two_rows; # FUNCTION in UNION SELECT 1 UNION ALL SELECT f1_two_inserts(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # FUNCTION in INSERT INSERT INTO t1_aux SET f1 = 1, f2 = f1_two_inserts(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 INSERT INTO t1_aux SELECT 1, f1_two_inserts(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT * FROM t1_aux ORDER BY f1,f2; f1 f2 INSERT INTO t1_aux VALUES(1,f1_two_inserts()); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT * FROM t1_aux ORDER BY f1,f2; f1 f2 # FUNCTION in DELETE INSERT INTO t1_aux VALUES (1,1); COMMIT; DELETE FROM t1_aux WHERE f1 = f1_two_inserts(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT * FROM t1_aux ORDER BY f1,f2; f1 f2 1 1 # FUNCTION in UPDATE SET UPDATE t1_aux SET f2 = f1_two_inserts() + 1; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 SELECT * FROM t1_aux ORDER BY f1,f2; f1 f2 1 1 # FUNCTION in VIEW definition CREATE VIEW v1_func AS SELECT f1_two_inserts() FROM t1_select; SELECT * FROM v1_func; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP VIEW v1_func; # FUNCTION in CREATE TABLE ... AS SELECT CREATE TABLE t1_fail AS SELECT f1_two_inserts() FROM t1_select; ERROR HY000: Can't update table 't1_not_null' while 't1_fail' is being created. SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 CREATE TABLE t1_fail AS SELECT * FROM t1_select WHERE 1 = f1_two_inserts(); ERROR HY000: Can't update table 't1_not_null' while 't1_fail' is being created. SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # FUNCTION in ORDER BY SELECT * FROM t1_select ORDER BY f1,f1_two_inserts(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # FUNCTION in aggregate function SELECT AVG(f1_two_inserts()) FROM t1_select; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 # FUNCTION in HAVING SELECT 1 FROM t1_select HAVING AVG(f1) = f1_two_inserts() + 2; ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP FUNCTION f1_two_inserts; # FUNCTION modifies Updatable VIEW CREATE VIEW v1_not_null AS SELECT f1,f2 FROM t1_not_null WITH CHECK OPTION; CREATE FUNCTION f1_two_inserts_v1() RETURNS INTEGER BEGIN INSERT INTO v1_not_null SET f1 = 10, f2 = 10; INSERT INTO v1_not_null SET f1 = 10, f2 = NULL; RETURN 1; END// SELECT f1_two_inserts_v1(); ERROR 23000: Column 'f2' cannot be null SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; f1 f2 DROP FUNCTION f1_two_inserts_v1; DROP VIEW v1_not_null; # FUNCTION causes FOREIGN KEY constraint violation CREATE TABLE t1_parent (f1 BIGINT, f2 BIGINT, PRIMARY KEY(f1)) ENGINE = InnoDB; INSERT INTO t1_parent VALUES (1,1); CREATE TABLE t1_child (f1 BIGINT, f2 BIGINT, PRIMARY KEY(f1), FOREIGN KEY (f1) REFERENCES t1_parent(f1)) ENGINE = InnoDB; CREATE FUNCTION f1_two_inserts() RETURNS INTEGER BEGIN INSERT INTO t1_child SET f1 = 1, f2 = 1; INSERT INTO t1_child SET f1 = 2, f2 = 2; RETURN 1; END// SELECT f1_two_inserts(); ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t1_child`, CONSTRAINT `t1_child_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1_parent` (`f1`)) SELECT * FROM t1_child; f1 f2 DROP TABLE t1_child; DROP TABLE t1_parent; DROP FUNCTION f1_two_inserts; DROP TABLE t1_select; DROP TABLE t1_aux; DROP TABLE t1_not_null;