TemporaryTableTest.php 3.83 KB
Newer Older
1 2
<?php

3
namespace Doctrine\DBAL\Tests\Functional;
4

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

10
class TemporaryTableTest extends FunctionalTestCase
11
{
12
    protected function setUp(): void
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(): void
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
    }

    /**
Sergei Morozov's avatar
Sergei Morozov committed
35
     * @group DDC-1337
36
     */
37
    public function testDropTemporaryTableNotAutoCommitTransaction(): void
38
    {
39 40
        if ($this->connection->getDatabasePlatform()->getName() === 'oracle') {
            self::markTestSkipped('Test does not work on Oracle.');
41 42
        }

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

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

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

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

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

Sergei Morozov's avatar
Sergei Morozov committed
62
        $this->connection->rollBack();
63

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

    /**
Sergei Morozov's avatar
Sergei Morozov committed
69
     * @group DDC-1337
70
     */
71
    public function testCreateTemporaryTableNotAutoCommitTransaction(): void
72
    {
73 74
        if ($this->connection->getDatabasePlatform()->getName() === 'oracle') {
            self::markTestSkipped('Test does not work on Oracle.');
75 76
        }

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

81
        $createTempTableSQL = $platform->getCreateTemporaryTableSnippetSQL() . ' ' . $tempTable . ' ('
82 83
                . $platform->getColumnDeclarationListSQL($columnDefinitions) . ')';

Sergei Morozov's avatar
Sergei Morozov committed
84 85 86
        $table = new Table('nontemporary');
        $table->addColumn('id', 'integer');
        $table->setPrimaryKey(['id']);
87

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

Sergei Morozov's avatar
Sergei Morozov committed
90 91
        $this->connection->beginTransaction();
        $this->connection->insert('nontemporary', ['id' => 1]);
92

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

Sergei Morozov's avatar
Sergei Morozov committed
96
        $this->connection->rollBack();
97 98

        try {
Sergei Morozov's avatar
Sergei Morozov committed
99
            $this->connection->exec($platform->getDropTemporaryTableSQL($tempTable));
Sergei Morozov's avatar
Sergei Morozov committed
100
        } catch (Throwable $e) {
101 102
        }

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