ModifyLimitQueryTest.php 7.27 KB
Newer Older
1 2 3 4 5 6 7
<?php

namespace Doctrine\Tests\DBAL\Functional;

class ModifyLimitQueryTest extends \Doctrine\Tests\DbalFunctionalTestCase
{
    private static $tableCreated = false;
8

9
    protected function setUp()
10 11 12 13 14 15 16
    {
        parent::setUp();

        if (!self::$tableCreated) {
            /* @var $sm \Doctrine\DBAL\Schema\AbstractSchemaManager */
            $table = new \Doctrine\DBAL\Schema\Table("modify_limit_table");
            $table->addColumn('test_int', 'integer');
17 18
            $table->setPrimaryKey(array('test_int'));

19
            $table2 = new \Doctrine\DBAL\Schema\Table("modify_limit_table2");
20
            $table2->addColumn('id', 'integer', array('autoincrement' => true));
21
            $table2->addColumn('test_int', 'integer');
22
            $table2->setPrimaryKey(array('id'));
23 24 25 26 27 28 29 30 31

            $sm = $this->_conn->getSchemaManager();
            $sm->createTable($table);
            $sm->createTable($table2);
            self::$tableCreated = true;
        }
        $this->_conn->exec($this->_conn->getDatabasePlatform()->getTruncateTableSQL('modify_limit_table'));
        $this->_conn->exec($this->_conn->getDatabasePlatform()->getTruncateTableSQL('modify_limit_table2'));
    }
32

33 34 35 36 37 38
    public function testModifyLimitQuerySimpleQuery()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
39

40
        $sql = "SELECT * FROM modify_limit_table ORDER BY test_int ASC";
41

42 43 44
        $this->assertLimitResult(array(1, 2, 3, 4), $sql, 10, 0);
        $this->assertLimitResult(array(1, 2), $sql, 2, 0);
        $this->assertLimitResult(array(3, 4), $sql, 2, 2);
45
        $this->assertLimitResult(array(2, 3, 4), $sql, null, 1);
46
    }
47

48 49 50 51
    public function testModifyLimitQueryJoinQuery()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
52

53 54 55 56 57
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
58

59
        $sql = "SELECT modify_limit_table.test_int FROM modify_limit_table INNER JOIN modify_limit_table2 ON modify_limit_table.test_int = modify_limit_table2.test_int ORDER BY modify_limit_table.test_int DESC";
60

61 62 63
        $this->assertLimitResult(array(2, 2, 1, 1, 1), $sql, 10, 0);
        $this->assertLimitResult(array(1, 1, 1), $sql, 3, 2);
        $this->assertLimitResult(array(2, 2), $sql, 2, 0);
64
    }
65

66
    public function testModifyLimitQueryNonDeterministic()
67 68 69 70 71
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));
72

73
        $sql = "SELECT * FROM modify_limit_table";
74

75 76 77
        $this->assertLimitResult(array(4, 3, 2, 1), $sql, 10, 0, false);
        $this->assertLimitResult(array(4, 3), $sql, 2, 0, false);
        $this->assertLimitResult(array(2, 1), $sql, 2, 2, false);
78
    }
79

80 81 82 83
    public function testModifyLimitQueryGroupBy()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
84

85 86 87 88 89
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table2', array('test_int' => 2));
90

91 92
        $sql = "SELECT modify_limit_table.test_int FROM modify_limit_table " .
               "INNER JOIN modify_limit_table2 ON modify_limit_table.test_int = modify_limit_table2.test_int ".
93 94
               "GROUP BY modify_limit_table.test_int " .
               "ORDER BY modify_limit_table.test_int ASC";
95 96 97 98
        $this->assertLimitResult(array(1, 2), $sql, 10, 0);
        $this->assertLimitResult(array(1), $sql, 1, 0);
        $this->assertLimitResult(array(2), $sql, 1, 1);
    }
99

100 101 102 103 104 105 106
    public function testModifyLimitQuerySubSelect()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));

107
        $sql = "SELECT modify_limit_table.*, (SELECT COUNT(*) FROM modify_limit_table) AS cnt FROM modify_limit_table ORDER BY test_int DESC";
108

109 110 111
        $this->assertLimitResult(array(4, 3, 2, 1), $sql, 10, 0);
        $this->assertLimitResult(array(4, 3), $sql, 2, 0);
        $this->assertLimitResult(array(2, 1), $sql, 2, 2);
112 113
    }

114 115 116 117 118 119 120
    public function testModifyLimitQueryFromSubSelect()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));
        $this->_conn->insert('modify_limit_table', array('test_int' => 4));

121
        $sql = "SELECT * FROM (SELECT * FROM modify_limit_table) sub ORDER BY test_int DESC";
122

123 124 125
        $this->assertLimitResult(array(4, 3, 2, 1), $sql, 10, 0);
        $this->assertLimitResult(array(4, 3), $sql, 2, 0);
        $this->assertLimitResult(array(2, 1), $sql, 2, 2);
126 127
    }

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
    public function testModifyLimitQueryLineBreaks()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));
        $this->_conn->insert('modify_limit_table', array('test_int' => 3));

        $sql = <<<SQL
SELECT
*
FROM
modify_limit_table
ORDER
BY
test_int
ASC
SQL;

        $this->assertLimitResult(array(2), $sql, 1, 1);
    }

148 149 150 151 152 153 154 155 156 157
    public function testModifyLimitQueryZeroOffsetNoLimit()
    {
        $this->_conn->insert('modify_limit_table', array('test_int' => 1));
        $this->_conn->insert('modify_limit_table', array('test_int' => 2));

        $sql = "SELECT test_int FROM modify_limit_table ORDER BY test_int ASC";

        $this->assertLimitResult(array(1, 2), $sql, null, 0);
    }

158
    public function assertLimitResult($expectedResults, $sql, $limit, $offset, $deterministic = true)
159 160 161
    {
        $p = $this->_conn->getDatabasePlatform();
        $data = array();
jeroendedauw's avatar
jeroendedauw committed
162
        foreach ($this->_conn->fetchAll($p->modifyLimitQuery($sql, $limit, $offset)) as $row) {
163 164
            $row = array_change_key_case($row, CASE_LOWER);
            $data[] = $row['test_int'];
165
        }
166 167 168 169 170

        /**
         * Do not assert the order of results when results are non-deterministic
         */
        if ($deterministic) {
171
            self::assertEquals($expectedResults, $data);
172
        } else {
173
            self::assertCount(count($expectedResults), $data);
174
        }
175
    }
176
}