Bug #87684 On a table rename, workbench generates additional alter sql for wrong table name
Submitted: 6 Sep 2017 18:49 Modified: 7 Sep 2017 8:44
Reporter: Jonathon Lamon Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Workbench: Modeling Severity:S3 (Non-critical)
Version:6.3.9 OS:Any
Assigned to: CPU Architecture:Any
Tags: MySQL Workbench Synchronization, Synchronize Any Source, synchronize model

[6 Sep 2017 18:49] Jonathon Lamon
Description:
When synchronizing a model, and a table is renamed and then manually targeted, workbench is generating two alter statements. One to generate the table rename and the other to generate a foreign key constraint.  The first alter command correctly renames the table.  The second alter command to add the foreign key constraint ignores the table rename and uses the original table name to generate the foreign key addition.

How to repeat:
Using two script files below (init1.0.sql, init2.0.sql):
1. From mysql workben in an open model run synchronize with any source.
On Select sources screen:
2. Source: init2.0.sql
3. Destination: init1.0.sql
4. Updates to: update1.0-2.0.sql
On schema screen :
5. Make sure schema is checked
On differences screen:
6. Select updated_join table
7. Click Table Mapping
8. Select updated_join table
9. Change desired target table to original_join table
10. Click OK
11. Click Execute
12. See incorrect alter script generated, which has "ALTER TABLE `mydb`.`original_join`" instead of expected ALTER TABLE `mydb`.`updated_join` after table rename operation.

file init1.0.sql
------
-- MySQL Script generated by MySQL Workbench
-- Wed Sep  6 11:40:15 2017
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`data`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`data` (
  `iddata` INT NOT NULL,
  PRIMARY KEY (`iddata`))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`original_join`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`original_join` (
  `data_iddata` INT NOT NULL,
  `joincol` VARCHAR(45) NULL,
  INDEX `fk_original_join_data_idx` (`data_iddata` ASC),
  PRIMARY KEY (`data_iddata`),
  CONSTRAINT `fk_original_join_data`
    FOREIGN KEY (`data_iddata`)
    REFERENCES `mydb`.`data` (`iddata`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

------

file init2.0.sql
------
-- MySQL Script generated by MySQL Workbench
-- Wed Sep  6 11:44:42 2017
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `mydb` ;

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`data`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`data` ;

CREATE TABLE IF NOT EXISTS `mydb`.`data` (
  `iddata` INT NOT NULL,
  PRIMARY KEY (`iddata`))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`updated_join`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`updated_join` ;

CREATE TABLE IF NOT EXISTS `mydb`.`updated_join` (
  `data_iddata` INT NOT NULL,
  `joincol` VARCHAR(45) NULL,
  `updated_joincol` VARCHAR(45) NULL,
  INDEX `fk_original_join_data_idx` (`data_iddata` ASC),
  PRIMARY KEY (`data_iddata`),
  CONSTRAINT `fk_updated_join_data`
    FOREIGN KEY (`data_iddata`)
    REFERENCES `mydb`.`data` (`iddata`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

------

file update1.0-2.0.sql
------
-- MySQL Workbench Synchronization

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

ALTER TABLE `mydb`.`original_join` 
DROP FOREIGN KEY `fk_original_join_data`;

ALTER TABLE `mydb`.`original_join` 
ADD COLUMN `updated_joincol` VARCHAR(45) NULL DEFAULT NULL AFTER `joincol`, RENAME TO  `mydb`.`updated_join` ;

ALTER TABLE `mydb`.`original_join` 
ADD CONSTRAINT `fk_updated_join_data`
  FOREIGN KEY (`data_iddata`)
  REFERENCES `mydb`.`data` (`iddata`)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

------

Suggested fix:
Correctly account for table rename during script generation.
[6 Sep 2017 18:50] Jonathon Lamon
added tag
[6 Sep 2017 18:50] Jonathon Lamon
mwb file

Attachment: alter_bug.mwb (application/octet-stream, text), 6.79 KiB.

[6 Sep 2017 18:51] Jonathon Lamon
init1.0.sql

Attachment: init1.0.sql (application/octet-stream, text), 1.54 KiB.

[6 Sep 2017 18:51] Jonathon Lamon
init2.0.sql

Attachment: init2.0.sql (application/octet-stream, text), 1.69 KiB.

[6 Sep 2017 18:51] Jonathon Lamon
update1.0-2.0.sql

Attachment: update1.0-2.0.sql (application/octet-stream, text), 750 bytes.

[6 Sep 2017 21:24] Jonathon Lamon
It appears additional trouble may arise for triggers as well.  Triggers for the old-named table are dropped after the rename and after the triggers for the new named table are inserted, if the trigger names are changed.
[7 Sep 2017 8:44] MySQL Verification Team
Hello Jonathon,

Thank you for the report and test case.

Thanks,
Umesh