Skip to content

Commit 0cf04f4

Browse files
test: cover OCI8 limit SQL for Oracle 11g and 12.1+
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 457a1dc commit 0cf04f4

1 file changed

Lines changed: 115 additions & 0 deletions

File tree

‎tests/system/Database/Builder/LimitTest.php‎

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
namespace CodeIgniter\Database\Builder;
1515

1616
use CodeIgniter\Database\BaseBuilder;
17+
use CodeIgniter\Database\OCI8\Builder as OCI8Builder;
1718
use CodeIgniter\Test\CIUnitTestCase;
1819
use CodeIgniter\Test\Mock\MockConnection;
20+
use PHPUnit\Framework\Attributes\DataProvider;
1921
use PHPUnit\Framework\Attributes\Group;
2022

2123
/**
@@ -65,4 +67,117 @@ public function testLimitAndOffsetMethod(): void
6567

6668
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
6769
}
70+
71+
#[DataProvider('provideOracle11gVersions')]
72+
public function testLimitAloneWithOracle11g(string $version): void
73+
{
74+
$builder = new OCI8Builder('user', $this->createOci8Connection($version));
75+
76+
$builder->limit(5);
77+
78+
$expectedSQL = 'SELECT * FROM (SELECT INNER_QUERY.*, ROWNUM RNUM FROM (SELECT * FROM "user" ) INNER_QUERY WHERE ROWNUM < 6)';
79+
80+
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
81+
}
82+
83+
#[DataProvider('provideOracle11gVersions')]
84+
public function testLimitAndOffsetWithOracle11g(string $version): void
85+
{
86+
$builder = new OCI8Builder('user', $this->createOci8Connection($version));
87+
88+
$builder->limit(5, 1);
89+
90+
$expectedSQL = 'SELECT * FROM (SELECT INNER_QUERY.*, ROWNUM RNUM FROM (SELECT * FROM "user" ) INNER_QUERY WHERE ROWNUM < 7) WHERE RNUM >= 1';
91+
92+
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
93+
}
94+
95+
#[DataProvider('provideOracle11gVersions')]
96+
public function testLimitAndOffsetWithOrderByOracle11g(string $version): void
97+
{
98+
$builder = new OCI8Builder('user', $this->createOci8Connection($version));
99+
100+
$builder->orderBy('id', 'ASC')->limit(5, 1);
101+
102+
$expectedSQL = 'SELECT * FROM (SELECT INNER_QUERY.*, ROWNUM RNUM FROM (SELECT * FROM "user" ORDER BY "id" ASC ) INNER_QUERY WHERE ROWNUM < 7) WHERE RNUM >= 1';
103+
104+
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
105+
}
106+
107+
#[DataProvider('provideOracle12_1AndAboveVersions')]
108+
public function testLimitAloneWithOracle12_1AndAbove(string $version): void
109+
{
110+
$builder = new OCI8Builder('user', $this->createOci8Connection($version));
111+
112+
$builder->limit(5);
113+
114+
$expectedSQL = 'SELECT * FROM "user" ORDER BY 1 OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY';
115+
116+
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
117+
}
118+
119+
#[DataProvider('provideOracle12_1AndAboveVersions')]
120+
public function testLimitAndOffsetWithOracle12_1AndAbove(string $version): void
121+
{
122+
$builder = new OCI8Builder('user', $this->createOci8Connection($version));
123+
124+
$builder->limit(5, 1);
125+
126+
$expectedSQL = 'SELECT * FROM "user" ORDER BY 1 OFFSET 1 ROWS FETCH NEXT 5 ROWS ONLY';
127+
128+
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
129+
}
130+
131+
#[DataProvider('provideOracle12_1AndAboveVersions')]
132+
public function testLimitAndOffsetWithOrderByOracle12_1AndAbove(string $version): void
133+
{
134+
$builder = new OCI8Builder('user', $this->createOci8Connection($version));
135+
136+
$builder->orderBy('id', 'ASC')->limit(5, 1);
137+
138+
$expectedSQL = 'SELECT * FROM "user" ORDER BY "id" ASC OFFSET 1 ROWS FETCH NEXT 5 ROWS ONLY';
139+
140+
$this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledSelect()));
141+
}
142+
143+
/**
144+
* @return iterable<string, array{string}>
145+
*/
146+
public static function provideOracle11gVersions(): iterable
147+
{
148+
yield '11.2' => ['11.2.0.4.0'];
149+
150+
yield '11.1' => ['11.1.0.7.0'];
151+
}
152+
153+
/**
154+
* @return iterable<string, array{string}>
155+
*/
156+
public static function provideOracle12_1AndAboveVersions(): iterable
157+
{
158+
yield '12.1' => ['12.1'];
159+
160+
yield '12.1.0.2' => ['12.1.0.2.0'];
161+
162+
yield '19c' => ['19.0.0.0.0'];
163+
}
164+
165+
private function createOci8Connection(string $version): MockConnection
166+
{
167+
return new class (['DBDriver' => 'OCI8'], $version) extends MockConnection {
168+
private readonly string $oracleVersion;
169+
170+
public function __construct(array $params, string $version)
171+
{
172+
parent::__construct($params);
173+
174+
$this->oracleVersion = $version;
175+
}
176+
177+
public function getVersion(): string
178+
{
179+
return $this->oracleVersion;
180+
}
181+
};
182+
}
68183
}

0 commit comments

Comments
 (0)