Bug #68367 | Portion of ALTER TABLE statement ignored when COMMENT quoted with backslash | ||
---|---|---|---|
Submitted: | 13 Feb 2013 16:53 | Modified: | 7 Oct 2013 18:30 |
Reporter: | Rasmus Schultz | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Parser | Severity: | S2 (Serious) |
Version: | 5.5 | OS: | Windows (Windows 8) |
Assigned to: | CPU Architecture: | Any |
[13 Feb 2013 16:53]
Rasmus Schultz
[13 Feb 2013 18:32]
Rasmus Schultz
Corrected the version number.
[14 Feb 2013 8:09]
Mike Lischke
Changed version. The WB version was used to report a server bug.
[14 Feb 2013 10:20]
MySQL Verification Team
Hello Rasmus, Thank you for the report. Verified as described on reported and later versions. Thanks, Umesh
[14 Feb 2013 10:29]
MySQL Verification Team
Test case and the workarounds. mysql> select version(); +------------+ | version() | +------------+ | 5.5.30-log | +------------+ mysql> USE `test`; mysql> DROP TABLE IF EXISTS `person`; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE IF NOT EXISTS `person` ( -> `id` int(10) unsigned NOT NULL AUTO_INCREMENT, -> `email` varchar(128) DEFAULT NULL COMMENT 'This Person''s unique, private e-mail address - this is used when logging in.', -> `password_salt` char(40) DEFAULT NULL COMMENT '40-character string used as salt when computing password_hash.', -> `password_hash` char(40) DEFAULT NULL COMMENT '40-character SHA1 of the user''s password and password_salt.', -> `first_name` varchar(64) DEFAULT NULL, -> `last_name` varchar(64) DEFAULT NULL, -> `region_id` int(10) unsigned DEFAULT NULL, -> PRIMARY KEY (`id`), -> UNIQUE KEY `email_UNIQUE` (`email`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='A Person is any individual known to the CHESS organization.'; DROP TABLE IF EXISTS `region`; Query OK, 0 rows affected (0.01 sec) mysql> mysql> DROP TABLE IF EXISTS `region`; Query OK, 0 rows affected (0.01 sec) mysql> mysql> CREATE TABLE IF NOT EXISTS `region` ( -> `id` int(10) unsigned NOT NULL, -> `name` varchar(50) NOT NULL, -> PRIMARY KEY (`id`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec) mysql> ALTER TABLE `test`.`person` -> -> CHANGE COLUMN `password_hash` `password_hash` CHAR(40) NULL DEFAULT NULL COMMENT '40-character SHA1 of the user\'s password and password_salt.' , -> -> ADD CONSTRAINT `person_region_fk` -> FOREIGN KEY (`region_id` ) -> REFERENCES `test`.`region` (`id` ) -> ON DELETE SET NULL -> ON UPDATE RESTRICT; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 ^^ No warnings, error reported mysql> SHOW CREATE TABLE person\G *************************** 1. row *************************** Table: person Create Table: CREATE TABLE `person` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(128) DEFAULT NULL COMMENT 'This Person''s unique, private e-mail address - this is used when logging in.', `password_salt` char(40) DEFAULT NULL COMMENT '40-character string used as salt when computing password_hash.', `password_hash` char(40) DEFAULT NULL COMMENT '40-character SHA1 of the user''s password and password_salt.', `first_name` varchar(64) DEFAULT NULL, `last_name` varchar(64) DEFAULT NULL, `region_id` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email_UNIQUE` (`email`), KEY `person_region_fk` (`region_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='A Person is any individual known to the CHESS organization.' 1 row in set (0.00 sec) mysql> ^^ Foreign key definition is lost #### Workaround - I ### escaped with single quote(') instead of back slash(\) mysql> DROP TABLE IF EXISTS `region`; Query OK, 0 rows affected (0.01 sec) mysql> mysql> CREATE TABLE IF NOT EXISTS `region` ( -> `id` int(10) unsigned NOT NULL, -> `name` varchar(50) NOT NULL, -> PRIMARY KEY (`id`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec) mysql> ALTER TABLE `test`.`person` -> -> CHANGE COLUMN `password_hash` `password_hash` CHAR(40) NULL DEFAULT NULL COMMENT '40-character SHA1 of the user''s password and password_salt.' , -> -> ADD CONSTRAINT `person_region_fk` -> FOREIGN KEY (`region_id` ) -> REFERENCES `test`.`region` (`id` ) -> ON DELETE SET NULL -> ON UPDATE RESTRICT; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE person\G *************************** 1. row *************************** Table: person Create Table: CREATE TABLE `person` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(128) DEFAULT NULL COMMENT 'This Person''s unique, private e-mail address - this is used when logging in.', `password_salt` char(40) DEFAULT NULL COMMENT '40-character string used as salt when computing password_hash.', `password_hash` char(40) DEFAULT NULL COMMENT '40-character SHA1 of the user''s password and password_salt.', `first_name` varchar(64) DEFAULT NULL, `last_name` varchar(64) DEFAULT NULL, `region_id` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email_UNIQUE` (`email`), KEY `person_region_fk` (`region_id`), CONSTRAINT `person_region_fk` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='A Person is any individual known to the CHESS organization.' 1 row in set (0.00 sec) mysql> ^^ FK definition created when single quote is escaped with another single quote..
[14 Feb 2013 10:29]
MySQL Verification Team
#### Workaround - II ## Break the alter in 2 parts - ALTER TABLE `test`.`person` CHANGE COLUMN...., & ALTER TABLE `test`.`person`...ADD CONSTRAINT mysql> mysql> use test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> DROP TABLE IF EXISTS `person`; Query OK, 0 rows affected (0.01 sec) mysql> mysql> CREATE TABLE IF NOT EXISTS `person` ( -> `id` int(10) unsigned NOT NULL AUTO_INCREMENT, -> `email` varchar(128) DEFAULT NULL COMMENT 'This Person''s unique, private e-mail address - this is used when logging in.', -> `password_salt` char(40) DEFAULT NULL COMMENT '40-character string used as salt when computing password_hash.', -> `password_hash` char(40) DEFAULT NULL COMMENT '40-character SHA1 of the user''s password and password_salt.', -> `first_name` varchar(64) DEFAULT NULL, -> `last_name` varchar(64) DEFAULT NULL, -> `region_id` int(10) unsigned DEFAULT NULL, -> PRIMARY KEY (`id`), -> UNIQUE KEY `email_UNIQUE` (`email`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='A Person is any individual known to the CHESS organization.'; DROP TABLE IF EXISTS `region`; Query OK, 0 rows affected (0.01 sec) mysql> mysql> DROP TABLE IF EXISTS `region`; Query OK, 0 rows affected (0.01 sec) mysql> mysql> CREATE TABLE IF NOT EXISTS `region` ( -> `id` int(10) unsigned NOT NULL, -> `name` varchar(50) NOT NULL, -> PRIMARY KEY (`id`) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.01 sec) mysql> mysql> mysql> ALTER TABLE `test`.`person` -> -> CHANGE COLUMN `password_hash` `password_hash` CHAR(40) NULL DEFAULT NULL COMMENT '40-character SHA1 of the user\'s password and password_salt.'; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE `test`.`person` ADD CONSTRAINT `person_region_fk` -> FOREIGN KEY (`region_id` ) -> REFERENCES `test`.`region` (`id` ) -> ON DELETE SET NULL -> ON UPDATE RESTRICT; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE person\G *************************** 1. row *************************** Table: person Create Table: CREATE TABLE `person` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(128) DEFAULT NULL COMMENT 'This Person''s unique, private e-mail address - this is used when logging in.', `password_salt` char(40) DEFAULT NULL COMMENT '40-character string used as salt when computing password_hash.', `password_hash` char(40) DEFAULT NULL COMMENT '40-character SHA1 of the user''s password and password_salt.', `first_name` varchar(64) DEFAULT NULL, `last_name` varchar(64) DEFAULT NULL, `region_id` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email_UNIQUE` (`email`), KEY `person_region_fk` (`region_id`), CONSTRAINT `person_region_fk` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='A Person is any individual known to the CHESS organization.' 1 row in set (0.00 sec) mysql> ^^ FK definition exists when ALTER is split into two statements
[14 Feb 2013 14:00]
Rasmus Schultz
I know about these work-arounds, but they're only useful to someone who can actually even identify the problem - figuring out precisely what was happening took me almost half a day. There is no work-around for that.
[13 Mar 2013 15:17]
Daniƫl van Eeden
Isn't this bug a duplicate of Bug #67881 ?
[7 Oct 2013 18:30]
Paul DuBois
Fixed by Bug#61656.