SQLServerPlatformTest.php 3.64 KB
Newer Older
1 2 3 4
<?php

namespace Doctrine\Tests\DBAL\Platforms;

5
use Doctrine\DBAL\LockMode;
6
use Doctrine\DBAL\Platforms\AbstractPlatform;
7
use Doctrine\DBAL\Platforms\SQLServerPlatform;
8

9
class SQLServerPlatformTest extends AbstractSQLServerPlatformTestCase
10
{
11
    public function createPlatform(): AbstractPlatform
12
    {
Sergei Morozov's avatar
Sergei Morozov committed
13
        return new SQLServerPlatform();
14 15
    }

16
    /**
17 18
     * @param int|bool|null $lockMode
     *
19 20
     * @dataProvider getLockHints
     */
21
    public function testAppendsLockHint($lockMode, string $lockHint): void
22 23 24 25
    {
        $fromClause     = 'FROM users';
        $expectedResult = $fromClause . $lockHint;

Sergei Morozov's avatar
Sergei Morozov committed
26
        self::assertSame($expectedResult, $this->platform->appendLockHint($fromClause, $lockMode));
27 28
    }

29 30 31
    /**
     * @dataProvider getModifyLimitQueries
     */
32
    public function testScrubInnerOrderBy(string $query, int $limit, ?int $offset, string $expectedResult): void
33
    {
Sergei Morozov's avatar
Sergei Morozov committed
34
        self::assertSame($expectedResult, $this->platform->modifyLimitQuery($query, $limit, $offset));
35 36
    }

37 38 39
    /**
     * @return mixed[][]
     */
40
    public static function getLockHints(): iterable
41
    {
Sergei Morozov's avatar
Sergei Morozov committed
42 43 44 45 46 47 48 49 50
        return [
            [null, ''],
            [false, ''],
            [true, ''],
            [LockMode::NONE, ' WITH (NOLOCK)'],
            [LockMode::OPTIMISTIC, ''],
            [LockMode::PESSIMISTIC_READ, ' WITH (HOLDLOCK, ROWLOCK)'],
            [LockMode::PESSIMISTIC_WRITE, ' WITH (UPDLOCK, ROWLOCK)'],
        ];
51
    }
52

53 54 55
    /**
     * @return mixed[][]
     */
56
    public static function getModifyLimitQueries(): iterable
57
    {
58
        return [
59
            // Test re-ordered query with correctly-scrubbed ORDER BY clause
60
            [
Sergei Morozov's avatar
Sergei Morozov committed
61 62 63 64
                'SELECT id_0, MIN(sclr_2) AS dctrn_minrownum FROM ('
                    . 'SELECT c0_.id AS id_0, c0_.title AS title_1, '
                    . 'ROW_NUMBER() OVER(ORDER BY c0_.title ASC) AS sclr_2 FROM TestTable c0_ ORDER BY c0_.title ASC) '
                    . 'dctrn_result GROUP BY id_0 ORDER BY dctrn_minrownum ASC',
65 66
                30,
                null,
Sergei Morozov's avatar
Sergei Morozov committed
67 68 69 70 71 72 73
                'WITH dctrn_cte AS (SELECT TOP 30 id_0, MIN(sclr_2) AS dctrn_minrownum FROM ('
                    . 'SELECT c0_.id AS id_0, c0_.title AS title_1, ROW_NUMBER() '
                    . 'OVER(ORDER BY c0_.title ASC) AS sclr_2 FROM TestTable c0_) dctrn_result '
                    . 'GROUP BY id_0 ORDER BY dctrn_minrownum ASC) '
                    . 'SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 0)) '
                    . 'AS doctrine_rownum FROM dctrn_cte) AS doctrine_tbl WHERE doctrine_rownum <= 30 '
                    . 'ORDER BY doctrine_rownum ASC',
74
            ],
75 76

            // Test re-ordered query with no scrubbed ORDER BY clause
77
            [
Sergei Morozov's avatar
Sergei Morozov committed
78 79 80 81
                'SELECT id_0, MIN(sclr_2) AS dctrn_minrownum FROM ('
                    . 'SELECT c0_.id AS id_0, c0_.title AS title_1, '
                    . 'ROW_NUMBER() OVER(ORDER BY c0_.title ASC) AS sclr_2 FROM TestTable c0_) dctrn_result '
                    . 'GROUP BY id_0 ORDER BY dctrn_minrownum ASC',
82 83
                30,
                null,
Sergei Morozov's avatar
Sergei Morozov committed
84 85 86 87 88 89 90
                'WITH dctrn_cte AS (SELECT TOP 30 id_0, MIN(sclr_2) AS dctrn_minrownum FROM ('
                    . 'SELECT c0_.id AS id_0, c0_.title AS title_1, ROW_NUMBER() '
                    . 'OVER(ORDER BY c0_.title ASC) AS sclr_2 FROM TestTable c0_) dctrn_result '
                    . 'GROUP BY id_0 ORDER BY dctrn_minrownum ASC) '
                    . 'SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 0)) '
                    . 'AS doctrine_rownum FROM dctrn_cte) AS doctrine_tbl WHERE doctrine_rownum <= 30 '
                    . 'ORDER BY doctrine_rownum ASC',
91 92
            ],
        ];
93
    }
94
}