TemporaryTableTest.php 4.05 KB
Newer Older
1 2 3 4
<?php

namespace Doctrine\Tests\DBAL\Functional;

jeroendedauw's avatar
jeroendedauw committed
5 6
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Types\Type;
Sergei Morozov's avatar
Sergei Morozov committed
7 8
use Doctrine\Tests\DbalFunctionalTestCase;
use Throwable;
9

Sergei Morozov's avatar
Sergei Morozov committed
10
class TemporaryTableTest extends DbalFunctionalTestCase
11
{
12
    protected function setUp()
13 14 15
    {
        parent::setUp();
        try {
Sergei Morozov's avatar
Sergei Morozov committed
16
            $this->connection->exec($this->connection->getDatabasePlatform()->getDropTableSQL('nontemporary'));
Sergei Morozov's avatar
Sergei Morozov committed
17
        } catch (Throwable $e) {
18 19 20
        }
    }

21
    protected function tearDown()
22
    {
Sergei Morozov's avatar
Sergei Morozov committed
23
        if ($this->connection) {
24
            try {
Sergei Morozov's avatar
Sergei Morozov committed
25 26
                $tempTable = $this->connection->getDatabasePlatform()->getTemporaryTableName('my_temporary');
                $this->connection->exec($this->connection->getDatabasePlatform()->getDropTemporaryTableSQL($tempTable));
Sergei Morozov's avatar
Sergei Morozov committed
27 28
            } catch (Throwable $e) {
            }
29
        }
30 31

        parent::tearDown();
32 33 34 35
    }

    /**
     * @return void
Sergei Morozov's avatar
Sergei Morozov committed
36 37
     *
     * @group DDC-1337
38
     */
39
    public function testDropTemporaryTableNotAutoCommitTransaction()
40
    {
Sergei Morozov's avatar
Sergei Morozov committed
41 42
        if ($this->connection->getDatabasePlatform()->getName() === 'sqlanywhere' ||
            $this->connection->getDatabasePlatform()->getName() === 'oracle') {
Sergei Morozov's avatar
Sergei Morozov committed
43
            $this->markTestSkipped('Test does not work on Oracle and SQL Anywhere.');
44 45
        }

Sergei Morozov's avatar
Sergei Morozov committed
46
        $platform          = $this->connection->getDatabasePlatform();
Sergei Morozov's avatar
Sergei Morozov committed
47 48
        $columnDefinitions = ['id' => ['type' => Type::getType('integer'), 'notnull' => true]];
        $tempTable         = $platform->getTemporaryTableName('my_temporary');
49

50
        $createTempTableSQL = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' ('
51
                . $platform->getColumnDeclarationListSQL($columnDefinitions) . ')';
Sergei Morozov's avatar
Sergei Morozov committed
52
        $this->connection->executeUpdate($createTempTableSQL);
53

Sergei Morozov's avatar
Sergei Morozov committed
54 55 56
        $table = new Table('nontemporary');
        $table->addColumn('id', 'integer');
        $table->setPrimaryKey(['id']);
57

Sergei Morozov's avatar
Sergei Morozov committed
58
        $this->connection->getSchemaManager()->createTable($table);
59

Sergei Morozov's avatar
Sergei Morozov committed
60 61 62 63
        $this->connection->beginTransaction();
        $this->connection->insert('nontemporary', ['id' => 1]);
        $this->connection->exec($platform->getDropTemporaryTableSQL($tempTable));
        $this->connection->insert('nontemporary', ['id' => 2]);
64

Sergei Morozov's avatar
Sergei Morozov committed
65
        $this->connection->rollBack();
66

Sergei Morozov's avatar
Sergei Morozov committed
67
        $rows = $this->connection->fetchAll('SELECT * FROM nontemporary');
Sergei Morozov's avatar
Sergei Morozov committed
68
        self::assertEquals([], $rows, 'In an event of an error this result has one row, because of an implicit commit.');
69 70 71 72
    }

    /**
     * @return void
Sergei Morozov's avatar
Sergei Morozov committed
73 74
     *
     * @group DDC-1337
75
     */
76
    public function testCreateTemporaryTableNotAutoCommitTransaction()
77
    {
Sergei Morozov's avatar
Sergei Morozov committed
78 79
        if ($this->connection->getDatabasePlatform()->getName() === 'sqlanywhere' ||
            $this->connection->getDatabasePlatform()->getName() === 'oracle') {
Sergei Morozov's avatar
Sergei Morozov committed
80
            $this->markTestSkipped('Test does not work on Oracle and SQL Anywhere.');
81 82
        }

Sergei Morozov's avatar
Sergei Morozov committed
83
        $platform          = $this->connection->getDatabasePlatform();
Sergei Morozov's avatar
Sergei Morozov committed
84 85
        $columnDefinitions = ['id' => ['type' => Type::getType('integer'), 'notnull' => true]];
        $tempTable         = $platform->getTemporaryTableName('my_temporary');
86

87
        $createTempTableSQL = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' ('
88 89
                . $platform->getColumnDeclarationListSQL($columnDefinitions) . ')';

Sergei Morozov's avatar
Sergei Morozov committed
90 91 92
        $table = new Table('nontemporary');
        $table->addColumn('id', 'integer');
        $table->setPrimaryKey(['id']);
93

Sergei Morozov's avatar
Sergei Morozov committed
94
        $this->connection->getSchemaManager()->createTable($table);
95

Sergei Morozov's avatar
Sergei Morozov committed
96 97
        $this->connection->beginTransaction();
        $this->connection->insert('nontemporary', ['id' => 1]);
98

Sergei Morozov's avatar
Sergei Morozov committed
99 100
        $this->connection->exec($createTempTableSQL);
        $this->connection->insert('nontemporary', ['id' => 2]);
101

Sergei Morozov's avatar
Sergei Morozov committed
102
        $this->connection->rollBack();
103 104

        try {
Sergei Morozov's avatar
Sergei Morozov committed
105
            $this->connection->exec($platform->getDropTemporaryTableSQL($tempTable));
Sergei Morozov's avatar
Sergei Morozov committed
106
        } catch (Throwable $e) {
107 108
        }

Sergei Morozov's avatar
Sergei Morozov committed
109
        $rows = $this->connection->fetchAll('SELECT * FROM nontemporary');
Sergei Morozov's avatar
Sergei Morozov committed
110
        self::assertEquals([], $rows, 'In an event of an error this result has one row, because of an implicit commit.');
111
    }
112
}