MySqlPlatformTest.php 9.01 KB
Newer Older
1 2 3 4 5 6
<?php

namespace Doctrine\Tests\DBAL\Platforms;

use Doctrine\DBAL\Platforms\MySqlPlatform;
use Doctrine\DBAL\Types\Type;
7
use Doctrine\DBAL\Schema\Table;
8
use Doctrine\DBAL\Schema\TableDiff;
9
use Doctrine\DBAL\Schema\Schema;
10
use Doctrine\DBAL\Schema\Index;
11

12
class MySqlPlatformTest extends AbstractPlatformTestCase
13
{
14
    public function createPlatform()
15
    {
16
        return new MysqlPlatform;
17 18
    }

19 20
    public function testGenerateMixedCaseTableCreate()
    {
21
        $table = new Table("Foo");
22
        $table->addColumn("Bar", "integer");
23

24
        $sql = $this->_platform->getCreateTableSQL($table);
VladanStef's avatar
VladanStef committed
25
        $this->assertEquals('CREATE TABLE Foo (Bar INT NOT NULL) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB', array_shift($sql));
26 27
    }

28
    public function getGenerateTableSql()
29
    {
VladanStef's avatar
VladanStef committed
30
        return 'CREATE TABLE test (id INT AUTO_INCREMENT NOT NULL, test VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB';
31 32
    }

33 34 35
    public function getGenerateTableWithMultiColumnUniqueIndexSql()
    {
        return array(
VladanStef's avatar
VladanStef committed
36
            'CREATE TABLE test (foo VARCHAR(255) DEFAULT NULL, bar VARCHAR(255) DEFAULT NULL, UNIQUE INDEX UNIQ_D87F7E0C8C73652176FF8CAA (foo, bar)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'
37 38 39
        );
    }

40
    public function getGenerateAlterTableSql()
41
    {
42
        return array(
43
            "ALTER TABLE mytable RENAME TO userlist, ADD quota INT DEFAULT NULL, DROP foo, CHANGE bar baz VARCHAR(255) DEFAULT 'def' NOT NULL, CHANGE bloo bloo TINYINT(1) DEFAULT '0' NOT NULL"
44 45 46
        );
    }

47
    public function testGeneratesSqlSnippets()
48
    {
49 50 51
        $this->assertEquals('RLIKE', $this->_platform->getRegexpExpression(), 'Regular expression operator is not correct');
        $this->assertEquals('`', $this->_platform->getIdentifierQuoteCharacter(), 'Quote character is not correct');
        $this->assertEquals('CONCAT(column1, column2, column3)', $this->_platform->getConcatExpression('column1', 'column2', 'column3'), 'Concatenation function is not correct');
52 53
    }

54
    public function testGeneratesTransactionsCommands()
55 56 57
    {
        $this->assertEquals(
            'SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED',
58
            $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_UNCOMMITTED),
59
            ''
60 61 62
        );
        $this->assertEquals(
            'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
63
            $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_READ_COMMITTED)
64 65 66
        );
        $this->assertEquals(
            'SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ',
67
            $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_REPEATABLE_READ)
68 69 70
        );
        $this->assertEquals(
            'SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE',
71
            $this->_platform->getSetTransactionIsolationSQL(\Doctrine\DBAL\Connection::TRANSACTION_SERIALIZABLE)
72 73 74
        );
    }

75 76

    public function testGeneratesDDLSnippets()
77
    {
78 79 80 81
        $this->assertEquals('SHOW DATABASES', $this->_platform->getShowDatabasesSQL());
        $this->assertEquals('CREATE DATABASE foobar', $this->_platform->getCreateDatabaseSQL('foobar'));
        $this->assertEquals('DROP DATABASE foobar', $this->_platform->getDropDatabaseSQL('foobar'));
        $this->assertEquals('DROP TABLE foobar', $this->_platform->getDropTableSQL('foobar'));
82 83
    }

84
    public function testGeneratesTypeDeclarationForIntegers()
85 86 87
    {
        $this->assertEquals(
            'INT',
88
            $this->_platform->getIntegerTypeDeclarationSQL(array())
89 90 91
        );
        $this->assertEquals(
            'INT AUTO_INCREMENT',
92
            $this->_platform->getIntegerTypeDeclarationSQL(array('autoincrement' => true)
93 94 95
        ));
        $this->assertEquals(
            'INT AUTO_INCREMENT',
96
            $this->_platform->getIntegerTypeDeclarationSQL(
97 98
                array('autoincrement' => true, 'primary' => true)
        ));
99 100 101 102
    }

    public function testGeneratesTypeDeclarationForStrings()
    {
103 104
        $this->assertEquals(
            'CHAR(10)',
105
            $this->_platform->getVarcharTypeDeclarationSQL(
106 107 108 109
                array('length' => 10, 'fixed' => true)
        ));
        $this->assertEquals(
            'VARCHAR(50)',
110
            $this->_platform->getVarcharTypeDeclarationSQL(array('length' => 50)),
111
            'Variable string declaration is not correct'
112 113
        );
        $this->assertEquals(
114
            'VARCHAR(255)',
115
            $this->_platform->getVarcharTypeDeclarationSQL(array()),
116
            'Long string declaration is not correct'
117 118 119
        );
    }

120
    public function testPrefersIdentityColumns()
121 122
    {
        $this->assertTrue($this->_platform->prefersIdentityColumns());
123 124 125 126
    }

    public function testSupportsIdentityColumns()
    {
127 128 129
        $this->assertTrue($this->_platform->supportsIdentityColumns());
    }

130
    public function testDoesSupportSavePoints()
131
    {
132
        $this->assertTrue($this->_platform->supportsSavepoints());
133 134
    }

135
    public function getGenerateIndexSql()
136
    {
137
        return 'CREATE INDEX my_idx ON mytable (user_name, last_login)';
138 139
    }

140
    public function getGenerateUniqueIndexSql()
141
    {
142
        return 'CREATE UNIQUE INDEX index_name ON test (test, test2)';
143 144
    }

145
    public function getGenerateForeignKeySql()
146
    {
147
        return 'ALTER TABLE test ADD FOREIGN KEY (fk_name_id) REFERENCES other_table (id)';
148
    }
149

150 151 152 153
    /**
     * @group DBAL-126
     */
    public function testUniquePrimaryKey()
154
    {
155 156 157 158 159
        $keyTable = new Table("foo");
        $keyTable->addColumn("bar", "integer");
        $keyTable->addColumn("baz", "string");
        $keyTable->setPrimaryKey(array("bar"));
        $keyTable->addUniqueIndex(array("baz"));
160

161 162 163
        $oldTable = new Table("foo");
        $oldTable->addColumn("bar", "integer");
        $oldTable->addColumn("baz", "string");
164

165 166
        $c = new \Doctrine\DBAL\Schema\Comparator;
        $diff = $c->diffTable($oldTable, $keyTable);
167

168
        $sql = $this->_platform->getAlterTableSQL($diff);
169

170 171 172 173 174
        $this->assertEquals(array(
            "ALTER TABLE foo ADD PRIMARY KEY (bar)",
            "CREATE UNIQUE INDEX UNIQ_8C73652178240498 ON foo (baz)",
        ), $sql);
    }
175 176 177 178

    public function testModifyLimitQuery()
    {
        $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10, 0);
179
        $this->assertEquals('SELECT * FROM user LIMIT 10 OFFSET 0', $sql);
180 181 182 183 184 185 186
    }

    public function testModifyLimitQueryWithEmptyOffset()
    {
        $sql = $this->_platform->modifyLimitQuery('SELECT * FROM user', 10);
        $this->assertEquals('SELECT * FROM user LIMIT 10', $sql);
    }
187 188 189 190 191 192

    /**
     * @group DDC-118
     */
    public function testGetDateTimeTypeDeclarationSql()
    {
193 194 195
        $this->assertEquals("DATETIME", $this->_platform->getDateTimeTypeDeclarationSQL(array('version' => false)));
        $this->assertEquals("TIMESTAMP", $this->_platform->getDateTimeTypeDeclarationSQL(array('version' => true)));
        $this->assertEquals("DATETIME", $this->_platform->getDateTimeTypeDeclarationSQL(array()));
196
    }
197 198 199

    public function getCreateTableColumnCommentsSQL()
    {
VladanStef's avatar
VladanStef committed
200
        return array("CREATE TABLE test (id INT NOT NULL COMMENT 'This is a comment', PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB");
201 202 203 204 205 206
    }

    public function getAlterTableColumnCommentsSQL()
    {
        return array("ALTER TABLE mytable ADD quota INT NOT NULL COMMENT 'A comment', CHANGE bar baz VARCHAR(255) NOT NULL COMMENT 'B comment'");
    }
207 208 209

    public function getCreateTableColumnTypeCommentsSQL()
    {
VladanStef's avatar
VladanStef committed
210
        return array("CREATE TABLE test (id INT NOT NULL, data LONGTEXT NOT NULL COMMENT '(DC2Type:array)', PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB");
211
    }
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228

    /**
     * @group DBAL-237
     */
    public function testChangeIndexWithForeignKeys()
    {
        $index = new Index("idx", array("col"), false);
        $unique = new Index("uniq", array("col"), true);

        $diff = new TableDiff("test", array(), array(), array(), array($unique), array(), array($index));
        $sql = $this->_platform->getAlterTableSQL($diff);
        $this->assertEquals(array("ALTER TABLE test DROP INDEX idx, ADD UNIQUE INDEX uniq (col)"), $sql);

        $diff = new TableDiff("test", array(), array(), array(), array($index), array(), array($unique));
        $sql = $this->_platform->getAlterTableSQL($diff);
        $this->assertEquals(array("ALTER TABLE test DROP INDEX uniq, ADD INDEX idx (col)"), $sql);
    }
229 230 231 232 233 234 235 236 237 238 239 240 241 242

    protected function getQuotedColumnInPrimaryKeySQL()
    {
        return array(
            'CREATE TABLE `quoted` (`key` VARCHAR(255) NOT NULL, PRIMARY KEY(`key`)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'
        );
    }

    protected function getQuotedColumnInIndexSQL()
    {
        return array(
            'CREATE TABLE `quoted` (`key` VARCHAR(255) NOT NULL, INDEX IDX_22660D028A90ABA9 (`key`)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'
        );
    }
243
}