TemporaryTableTest.php 4.02 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() : 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
    {
Sergei Morozov's avatar
Sergei Morozov committed
39 40
        if ($this->connection->getDatabasePlatform()->getName() === 'sqlanywhere' ||
            $this->connection->getDatabasePlatform()->getName() === 'oracle') {
Sergei Morozov's avatar
Sergei Morozov committed
41
            $this->markTestSkipped('Test does not work on Oracle and SQL Anywhere.');
42 43
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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