Skip to content

Commit 32b6976

Browse files
committed
removed support for SQLServer < 2012, PostgreSQL < 9.3
1 parent f484630 commit 32b6976

File tree

7 files changed

+76
-121
lines changed

7 files changed

+76
-121
lines changed

src/Dibi/Drivers/PdoDriver.php

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,12 @@
2424
* - password (or pass)
2525
* - options (array) => driver specific options {@see PDO::__construct}
2626
* - resource (PDO) => existing connection
27-
* - version
2827
*/
2928
class PdoDriver implements Dibi\Driver
3029
{
3130
private ?PDO $connection;
3231
private ?int $affectedRows;
3332
private string $driverName;
34-
private string $serverVersion = '';
3533

3634

3735
/** @throws Dibi\NotSupportedException */
@@ -66,7 +64,6 @@ public function __construct(array $config)
6664
}
6765

6866
$this->driverName = $this->connection->getAttribute(PDO::ATTR_DRIVER_NAME);
69-
$this->serverVersion = (string) ($config['version'] ?? @$this->connection->getAttribute(PDO::ATTR_SERVER_VERSION)); // @ - may be not supported
7067
}
7168

7269

@@ -180,7 +177,7 @@ public function getReflector(): Dibi\Reflector
180177
return match ($this->driverName) {
181178
'mysql' => new MySqlReflector($this),
182179
'oci' => new OracleReflector($this),
183-
'pgsql' => new PostgreReflector($this, $this->connection->getAttribute(PDO::ATTR_SERVER_VERSION)),
180+
'pgsql' => new PostgreReflector($this),
184181
'sqlite' => new SqliteReflector($this),
185182
'mssql', 'dblib', 'sqlsrv' => new SqlsrvReflector($this),
186183
default => throw new Dibi\NotSupportedException,
@@ -360,17 +357,15 @@ public function applyLimit(string &$sql, ?int $limit, ?int $offset): void
360357
case 'mssql':
361358
case 'sqlsrv':
362359
case 'dblib':
363-
if (version_compare($this->serverVersion, '11.0') >= 0) { // 11 == SQL Server 2012
364-
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
365-
if ($limit !== null) {
366-
$sql = sprintf('%s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', rtrim($sql), $offset, $limit);
367-
} elseif ($offset) {
368-
$sql = sprintf('%s OFFSET %d ROWS', rtrim($sql), $offset);
369-
}
370-
371-
break;
360+
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
361+
if ($limit !== null) {
362+
$sql = sprintf('%s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', rtrim($sql), $offset, $limit);
363+
} elseif ($offset) {
364+
$sql = sprintf('%s OFFSET %d ROWS', rtrim($sql), $offset);
372365
}
373-
// break omitted
366+
367+
break;
368+
374369
case 'odbc':
375370
if ($offset) {
376371
throw new Dibi\NotSupportedException('Offset is not supported by this database.');

src/Dibi/Drivers/PostgreDriver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ public function getResource(): PgSql\Connection
234234
*/
235235
public function getReflector(): Dibi\Reflector
236236
{
237-
return new PostgreReflector($this, pg_parameter_status($this->connection, 'server_version'));
237+
return new PostgreReflector($this);
238238
}
239239

240240

src/Dibi/Drivers/PostgreReflector.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class PostgreReflector implements Dibi\Reflector
1919
{
2020
public function __construct(
2121
private readonly Dibi\Driver $driver,
22-
private readonly string $version,
2322
) {
2423
}
2524

@@ -39,18 +38,15 @@ public function getTables(): array
3938
FROM
4039
information_schema.tables
4140
WHERE
42-
table_schema = ANY (current_schemas(false))";
41+
table_schema = ANY (current_schemas(false))
4342
44-
if ($this->version >= 9.3) {
45-
$query .= '
46-
UNION ALL
47-
SELECT
48-
matviewname, 1
49-
FROM
50-
pg_matviews
51-
WHERE
52-
schemaname = ANY (current_schemas(false))';
53-
}
43+
UNION ALL
44+
SELECT
45+
matviewname, 1
46+
FROM
47+
pg_matviews
48+
WHERE
49+
schemaname = ANY (current_schemas(false))";
5450

5551
$res = $this->driver->query($query);
5652
$tables = [];

src/Dibi/Drivers/SqliteDriver.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,7 @@ public function __construct(array $config)
5656
}
5757

5858
// enable foreign keys support (defaultly disabled; if disabled then foreign key constraints are not enforced)
59-
$version = SQLite3::version();
60-
if ($version['versionNumber'] >= '3006019') {
61-
$this->query('PRAGMA foreign_keys = ON');
62-
}
59+
$this->query('PRAGMA foreign_keys = ON');
6360
}
6461

6562

src/Dibi/Drivers/SqlsrvDriver.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class SqlsrvDriver implements Dibi\Driver
3131
/** @var resource */
3232
private $connection;
3333
private ?int $affectedRows;
34-
private string $version = '';
3534

3635

3736
/** @throws Dibi\NotSupportedException */
@@ -69,8 +68,6 @@ public function __construct(array $config)
6968

7069
sqlsrv_configure('WarningsReturnAsErrors', 1);
7170
}
72-
73-
$this->version = sqlsrv_server_info($this->connection)['SQLServerVersion'];
7471
}
7572

7673

@@ -257,13 +254,6 @@ public function applyLimit(string &$sql, ?int $limit, ?int $offset): void
257254
if ($limit < 0 || $offset < 0) {
258255
throw new Dibi\NotSupportedException('Negative offset or limit.');
259256

260-
} elseif (version_compare($this->version, '11', '<')) { // 11 == SQL Server 2012
261-
if ($offset) {
262-
throw new Dibi\NotSupportedException('Offset is not supported by this database.');
263-
264-
} elseif ($limit !== null) {
265-
$sql = sprintf('SELECT TOP (%d) * FROM (%s) t', $limit, $sql);
266-
}
267257
} elseif ($limit !== null) {
268258
// requires ORDER BY, see https://technet.microsoft.com/en-us/library/gg699618(v=sql.110).aspx
269259
$sql = sprintf('%s OFFSET %d ROWS FETCH NEXT %d ROWS ONLY', rtrim($sql), $offset, $limit);

tests/dibi/Fluent.fetch.limit.mssql.phpt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,45 +57,45 @@ $fluent = $conn->select('*')
5757
->orderBy('customer_id');
5858

5959
Assert::same(
60-
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
60+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
6161
(string) $fluent,
6262
);
6363

6464

6565
$fluent->fetch();
6666
Assert::same(
67-
'SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t',
67+
'SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY',
6868
dibi::$sql,
6969
);
7070
$fluent->fetchSingle();
7171
Assert::same(
72-
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
72+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
7373
dibi::$sql,
7474
);
7575
$fluent->fetchAll(0, 3);
7676
Assert::same(
77-
reformat('SELECT TOP (3) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
77+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY'),
7878
dibi::$sql,
7979
);
8080
Assert::same(
81-
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
81+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
8282
(string) $fluent,
8383
);
8484

8585

8686
$fluent->limit(0);
8787
$fluent->fetch();
8888
Assert::same(
89-
reformat('SELECT TOP (0) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
89+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 0 ROWS ONLY'),
9090
dibi::$sql,
9191
);
9292
$fluent->fetchSingle();
9393
Assert::same(
94-
reformat('SELECT TOP (0) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
94+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 0 ROWS ONLY'),
9595
dibi::$sql,
9696
);
9797
Assert::same(
98-
reformat('SELECT TOP (0) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
98+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 0 ROWS ONLY'),
9999
(string) $fluent,
100100
);
101101

@@ -104,12 +104,12 @@ $fluent->removeClause('limit');
104104
$fluent->removeClause('offset');
105105
$fluent->fetch();
106106
Assert::same(
107-
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
107+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
108108
dibi::$sql,
109109
);
110110
$fluent->fetchSingle();
111111
Assert::same(
112-
reformat('SELECT TOP (1) * FROM (SELECT * FROM [customers] ORDER BY [customer_id]) t'),
112+
reformat('SELECT * FROM [customers] ORDER BY [customer_id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'),
113113
dibi::$sql,
114114
);
115115
Assert::same(

tests/dibi/Sqlsrv.limits.phpt

Lines changed: 47 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -11,82 +11,59 @@ use Tester\Assert;
1111
require __DIR__ . '/bootstrap.php';
1212

1313
$tests = function ($conn) {
14-
$resource = $conn->getDriver()->getResource();
15-
$version = is_resource($resource)
16-
? sqlsrv_server_info($resource)['SQLServerVersion']
17-
: $resource->getAttribute(PDO::ATTR_SERVER_VERSION);
14+
// Limit and offset
15+
Assert::same(
16+
'SELECT 1 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY',
17+
$conn->translate('SELECT 1 %ofs %lmt', 10, 10),
18+
);
1819

19-
// MsSQL2012+
20-
if (version_compare($version, '11.0') >= 0) {
21-
// Limit and offset
22-
Assert::same(
23-
'SELECT 1 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY',
24-
$conn->translate('SELECT 1 %ofs %lmt', 10, 10),
25-
);
20+
// Limit only
21+
Assert::same(
22+
'SELECT 1 OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY',
23+
$conn->translate('SELECT 1 %lmt', 10),
24+
);
2625

27-
// Limit only
28-
Assert::same(
29-
'SELECT 1 OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY',
30-
$conn->translate('SELECT 1 %lmt', 10),
31-
);
26+
// Offset only
27+
Assert::same(
28+
'SELECT 1 OFFSET 10 ROWS',
29+
$conn->translate('SELECT 1 %ofs', 10),
30+
);
3231

33-
// Offset only
34-
Assert::same(
35-
'SELECT 1 OFFSET 10 ROWS',
36-
$conn->translate('SELECT 1 %ofs', 10),
37-
);
32+
// Offset invalid
33+
Assert::error(
34+
function () use ($conn) {
35+
$conn->translate('SELECT 1 %ofs', -10);
36+
},
37+
Dibi\NotSupportedException::class,
38+
'Negative offset or limit.',
39+
);
3840

39-
// Offset invalid
40-
Assert::error(
41-
function () use ($conn) {
42-
$conn->translate('SELECT 1 %ofs', -10);
43-
},
44-
Dibi\NotSupportedException::class,
45-
'Negative offset or limit.',
46-
);
41+
// Limit invalid
42+
Assert::error(
43+
function () use ($conn) {
44+
$conn->translate('SELECT 1 %lmt', -10);
45+
},
46+
Dibi\NotSupportedException::class,
47+
'Negative offset or limit.',
48+
);
4749

48-
// Limit invalid
49-
Assert::error(
50-
function () use ($conn) {
51-
$conn->translate('SELECT 1 %lmt', -10);
52-
},
53-
Dibi\NotSupportedException::class,
54-
'Negative offset or limit.',
55-
);
50+
// Limit invalid, offset valid
51+
Assert::error(
52+
function () use ($conn) {
53+
$conn->translate('SELECT 1 %ofs %lmt', 10, -10);
54+
},
55+
Dibi\NotSupportedException::class,
56+
'Negative offset or limit.',
57+
);
5658

57-
// Limit invalid, offset valid
58-
Assert::error(
59-
function () use ($conn) {
60-
$conn->translate('SELECT 1 %ofs %lmt', 10, -10);
61-
},
62-
Dibi\NotSupportedException::class,
63-
'Negative offset or limit.',
64-
);
65-
66-
// Limit valid, offset invalid
67-
Assert::error(
68-
function () use ($conn) {
69-
$conn->translate('SELECT 1 %ofs %lmt', -10, 10);
70-
},
71-
Dibi\NotSupportedException::class,
72-
'Negative offset or limit.',
73-
);
74-
} else {
75-
Assert::same(
76-
'SELECT TOP (1) * FROM (SELECT 1) t',
77-
$conn->translate('SELECT 1 %lmt', 1),
78-
);
79-
80-
Assert::same(
81-
'SELECT 1',
82-
$conn->translate('SELECT 1 %lmt', -10),
83-
);
84-
85-
Assert::exception(
86-
fn() => $conn->translate('SELECT 1 %ofs %lmt', 10, 10),
87-
Dibi\NotSupportedException::class,
88-
);
89-
}
59+
// Limit valid, offset invalid
60+
Assert::error(
61+
function () use ($conn) {
62+
$conn->translate('SELECT 1 %ofs %lmt', -10, 10);
63+
},
64+
Dibi\NotSupportedException::class,
65+
'Negative offset or limit.',
66+
);
9067
};
9168

9269
$conn = new Dibi\Connection($config);

0 commit comments

Comments
 (0)