1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-6880 Can't define CURRENT_TIMESTAMP as default value for added column

ALTER TABLE: don't fill default values per row, do it once.
And do it in two places - for copy_data_between_tables() and for online ALTER.

Also, run function_defaults test both for MyISAM and for InnoDB.
This commit is contained in:
Sergei Golubchik
2014-11-18 22:25:33 +01:00
parent 5cfc62f9c6
commit 303eec5774
8 changed files with 3186 additions and 29 deletions

View File

@ -1434,13 +1434,13 @@ drop table t1;
SET TIME_ZONE = "+03:00";
# 1970-01-01 03:16:40
SET TIMESTAMP = 1000.123456;
CREATE TABLE t1 ( a INT, b TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE = INNODB;
CREATE TABLE t1 ( a INT, b TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO t1 ( a ) VALUES ( 1 );
SELECT * FROM t1;
a b
@ -1490,9 +1490,9 @@ a INT,
b INT,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY ( a, ts )
) ENGINE = INNODB;
);
INSERT INTO t1( a, b, ts ) VALUES ( 1, 0, '2000-09-28 17:44:34' );
CREATE TABLE t2 ( a INT ) ENGINE = INNODB;
CREATE TABLE t2 ( a INT );
INSERT INTO t2 VALUES ( 1 );
UPDATE t1 STRAIGHT_JOIN t2
SET t1.b = t1.b + 1
@ -1521,8 +1521,19 @@ ALTER TABLE t1 ADD COLUMN c4 DATETIME ON UPDATE NOW() AFTER c3;
ALTER TABLE t1 ADD COLUMN c5 DATETIME DEFAULT NOW() AFTER c4;
ALTER TABLE t1 ADD COLUMN c6 DATETIME DEFAULT NOW() ON UPDATE NOW() AFTER c5;
SELECT * FROM t1;
a1 a2 a3 a4 a5 a6 b c1 c2 c3 c4 c5 c6
0000-00-00 00:00:00 1970-01-01 03:16:40 1970-01-01 03:16:40 NULL 1970-01-01 03:16:40 1970-01-01 03:16:40 1 0000-00-00 00:00:00 1970-01-01 03:16:40 1970-01-01 03:16:40 NULL 1970-01-01 03:16:40 1970-01-01 03:16:40
a1 0000-00-00 00:00:00
a2 1970-01-01 03:16:40
a3 1970-01-01 03:16:40
a4 NULL
a5 1970-01-01 03:16:40
a6 1970-01-01 03:16:40
b 1
c1 0000-00-00 00:00:00
c2 1970-01-01 03:16:40
c3 1970-01-01 03:16:40
c4 NULL
c5 1970-01-01 03:16:40
c6 1970-01-01 03:16:40
DROP TABLE t1;
CREATE TABLE t1 ( a TIMESTAMP NOT NULL DEFAULT NOW() ON UPDATE CURRENT_TIMESTAMP, b DATETIME DEFAULT NOW() );
INSERT INTO t1 VALUES ();
@ -2979,13 +2990,13 @@ drop table t1;
SET TIME_ZONE = "+03:00";
# 1970-01-01 03:16:40
SET TIMESTAMP = 1000.123456;
CREATE TABLE t1 ( a INT, b TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)) ENGINE = INNODB;
CREATE TABLE t1 ( a INT, b TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6));
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
) ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO t1 ( a ) VALUES ( 1 );
SELECT * FROM t1;
a b
@ -3035,9 +3046,9 @@ a INT,
b INT,
ts TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY ( a, ts )
) ENGINE = INNODB;
);
INSERT INTO t1( a, b, ts ) VALUES ( 1, 0, '2000-09-28 17:44:34' );
CREATE TABLE t2 ( a INT ) ENGINE = INNODB;
CREATE TABLE t2 ( a INT );
INSERT INTO t2 VALUES ( 1 );
UPDATE t1 STRAIGHT_JOIN t2
SET t1.b = t1.b + 1
@ -3066,8 +3077,19 @@ ALTER TABLE t1 ADD COLUMN c4 DATETIME(6) ON UPDATE NOW(6) AFTER c3;
ALTER TABLE t1 ADD COLUMN c5 DATETIME(6) DEFAULT NOW(6) AFTER c4;
ALTER TABLE t1 ADD COLUMN c6 DATETIME(6) DEFAULT NOW(6) ON UPDATE NOW(6) AFTER c5;
SELECT * FROM t1;
a1 a2 a3 a4 a5 a6 b c1 c2 c3 c4 c5 c6
0000-00-00 00:00:00.000000 1970-01-01 03:16:40.000000 1970-01-01 03:16:40.000000 NULL 1970-01-01 03:16:40.000000 1970-01-01 03:16:40.000000 1 0000-00-00 00:00:00.000000 1970-01-01 03:16:40.000000 1970-01-01 03:16:40.000000 NULL 1970-01-01 03:16:40.000000 1970-01-01 03:16:40.000000
a1 0000-00-00 00:00:00.000000
a2 1970-01-01 03:16:40.000000
a3 1970-01-01 03:16:40.000000
a4 NULL
a5 1970-01-01 03:16:40.000000
a6 1970-01-01 03:16:40.000000
b 1
c1 0000-00-00 00:00:00.000000
c2 1970-01-01 03:16:40.000000
c3 1970-01-01 03:16:40.000000
c4 NULL
c5 1970-01-01 03:16:40.000000
c6 1970-01-01 03:16:40.000000
DROP TABLE t1;
CREATE TABLE t1 ( a TIMESTAMP(6) NOT NULL DEFAULT NOW(6) ON UPDATE CURRENT_TIMESTAMP(6), b DATETIME(6) DEFAULT NOW(6) );
INSERT INTO t1 VALUES ();