protected function copyAll(Driver $src, Driver $dst)
 {
     foreach ($src->getDatabaseNames() as $db) {
         if ($db != 'test') {
             continue;
         }
         $dst->createDatabase($db);
         foreach ($src->getSchemaNames($db) as $schema) {
             $dst->createSchema($db, $schema);
             foreach ($src->getTableNames($db, $schema) as $table) {
                 $dst->setTable($db, $schema, $src->getTable($db, $schema, $table));
             }
         }
     }
 }
    public function testSetTable()
    {
        $pdo = $this->getPDOPassthrough(self::$describeTableData, 1);
        $drv = new MySQLDriver(['pdo' => $pdo]);
        $tbl = $drv->getTable('testDB1', 'ignored', 'testTbl1');
        $drv->setTable('ignored', 'ignored', $tbl);
        // Above should do nothing; No exec should happen.
        $this->assertNull($this->lastExecSQL);
        /* Trigger a create */
        $drv = new MySQLDriver(['pdo' => $this->getPDOPassthrough(false, 1)]);
        $drv->setTable('testDB2', 'ignored', $tbl);
        $this->assertEquals('CREATE TABLE `testDB2`.`testTbl1` (
`Id` INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
`Name` VARCHAR(9) NOT NULL DEFAULT "",
`Country` CHAR(8) NOT NULL DEFAULT "",
`District` TINYBLOB DEFAULT "",
`Population` DECIMAL(10, 2) NOT NULL DEFAULT "0",
`Average` FLOAT DEFAULT "",
`Update` TIMESTAMP NOT NULL DEFAULT "",
`Type` ENUM("foo") NOT NULL DEFAULT "foo"
) ENGINE=InnoDB DEFAULT CHARSET=utf8', $this->lastExecSQL);
        $drv = new MySQLDriver(['pdo' => $this->getPDOPassthrough(self::$describeTableData, 1)]);
        /* Drop a column and create a new */
        $tbl->columns[2]->name = "blah";
        /* Trigger a modification */
        $tbl->columns[3]->null = false;
        $tbl->columns[3]->type = new String(255, true, false);
        $tbl->columns[3]->default = "foo";
        /* Create a whole lot of columns. */
        $tbl->columns[] = new Column('tinyblob', new String(255, true, true));
        $tbl->columns[] = new Column('blob', new String(10000, true, true));
        $tbl->columns[] = new Column('mediumtext', new String(65537, true, false));
        $tbl->columns[] = new Column('longblob', new String(pow(2, 28), true, true));
        $tbl->columns[] = new Column('int7', new Integer(7));
        $tbl->columns[] = new Column('float7', new Float(7));
        $tbl->columns[] = new Column('dt1', new DateTime(true, false, false));
        $tbl->columns[] = new Column('dt2', new DateTime(false, true, true));
        $tbl->columns[] = new Column('bool', new Boolean());
        $tbl->columns[] = new Column('enum', new Enum('a', 'b', 'c'));
        /* The above columns produce the SQL below, which I believe match up. */
        // ALTER TABLE `testDB3`.`testTbl1`
        // DROP COLUMN `Country`,
        // ADD COLUMN `blah` CHAR(8) NOT NULL DEFAULT "",
        // ADD COLUMN `tinyblob` TINYBLOB,
        // ADD COLUMN `blob` BLOB,
        // ADD COLUMN `mediumtext` MEDIUMTEXT,
        // ADD COLUMN `longblob` LONGBLOB,
        // ADD COLUMN `int7` BIGINT,
        // ADD COLUMN `float7` DOUBLE,
        // ADD COLUMN `dt1` DATE,
        // ADD COLUMN `dt2` TIME,
        // ADD COLUMN `bool` TINYINT(1) UNSIGNED,
        // ADD COLUMN `enum` ENUM("a","b","c"),
        // MODIFY `District` TINYTEXT NOT NULL DEFAULT "foo"
        $drv->setTable('testDB3', 'ignored', $tbl);
        // Assert that a bunch of SQL happened.
        $this->assertEquals('ALTER TABLE `testDB3`.`testTbl1` DROP COLUMN `Country`,ADD COLUMN `blah` CHAR(8) NOT NULL DEFAULT "",ADD COLUMN `tinyblob` TINYBLOB,ADD COLUMN `blob` BLOB,ADD COLUMN `mediumtext` MEDIUMTEXT,ADD COLUMN `longblob` LONGBLOB,ADD COLUMN `int7` BIGINT,ADD COLUMN `float7` DOUBLE,ADD COLUMN `dt1` DATE,ADD COLUMN `dt2` TIME,ADD COLUMN `bool` TINYINT(1) UNSIGNED,ADD COLUMN `enum` ENUM("a","b","c"),MODIFY `District` TINYTEXT NOT NULL DEFAULT "foo"', $this->lastExecSQL);
        $tbl->columns = [new Column('invalid', null)];
        try {
            $drv->setTable('ignored', 'ignored', $tbl);
            $this->fail("Creating a column without a type should not work");
        } catch (DriverException $e) {
            /* Ignored */
        }
    }