diff --git a/Tests/Sqlite/SqliteDriverTest.php b/Tests/Sqlite/SqliteDriverTest.php index 927156e0..c9717294 100644 --- a/Tests/Sqlite/SqliteDriverTest.php +++ b/Tests/Sqlite/SqliteDriverTest.php @@ -630,4 +630,45 @@ public function testQuoteAndDecodeBinary() $this->assertEquals($expected, $result); } + + #[TestDox('The custom ROW_NUMBER function correctly numbers rows')] + public function testRowNumberCustomFunction() + { + $this->loadExampleData(); + + static::$connection->setQuery('SELECT ROW_NUMBER(0)')->execute(); + + $query = static::$connection->createQuery() + ->select('ROW_NUMBER() AS row_num, title') + ->from('#__dbtest'); + + $results = static::$connection->setQuery($query)->loadObjectList(); + + $this->assertCount(4, $results); + $this->assertEquals(1, $results[0]->row_num); + $this->assertEquals(2, $results[1]->row_num); + $this->assertEquals(3, $results[2]->row_num); + $this->assertEquals(4, $results[3]->row_num); + + $query = static::$connection->createQuery() + ->update('#__dbtest') + ->set('start_date = ' . static::$connection->quote('2019-10-19 00:00:00')) + ->where('id = 4'); + + static::$connection->setQuery($query)->execute(); + + static::$connection->setQuery('SELECT ROW_NUMBER(0)')->execute(); + + $query = static::$connection->createQuery() + ->select('ROW_NUMBER(NULL, start_date) AS row_num, title') + ->from('#__dbtest'); + + $results = static::$connection->setQuery($query)->loadObjectList(); + + $this->assertCount(4, $results); + $this->assertEquals(1, $results[0]->row_num); + $this->assertEquals(2, $results[1]->row_num); + $this->assertEquals(3, $results[2]->row_num); + $this->assertEquals(1, $results[3]->row_num); + } } diff --git a/src/Pdo/PdoDriver.php b/src/Pdo/PdoDriver.php index cfb3d109..71d90e1e 100644 --- a/src/Pdo/PdoDriver.php +++ b/src/Pdo/PdoDriver.php @@ -361,12 +361,21 @@ public function connect() $connectionString = str_replace($replace, $with, $format); try { - $this->connection = new \PDO( - $connectionString, - $this->options['user'], - $this->options['password'], - $this->options['driverOptions'] - ); + if (PHP_VERSION_ID >= 80400) { + $this->connection = \PDO::connect( + $connectionString, + $this->options['user'], + $this->options['password'], + $this->options['driverOptions'] + ); + } else { + $this->connection = new \PDO( + $connectionString, + $this->options['user'], + $this->options['password'], + $this->options['driverOptions'] + ); + } } catch (\PDOException $e) { throw new ConnectionFailureException('Could not connect to PDO: ' . $e->getMessage(), $e->getCode(), $e); } diff --git a/src/Sqlite/SqliteDriver.php b/src/Sqlite/SqliteDriver.php index eac39f70..100b9317 100644 --- a/src/Sqlite/SqliteDriver.php +++ b/src/Sqlite/SqliteDriver.php @@ -79,33 +79,42 @@ public function connect() parent::connect(); - $this->connection->sqliteCreateFunction( - 'ROW_NUMBER', - function ($init = null) { - static $rownum, $partition; + $rownumberfn = function ($init = null) { + static $rownum, $partition; - if ($init !== null) { - $rownum = $init; - $partition = null; + if ($init !== null) { + $rownum = $init; + $partition = null; - return $rownum; - } - - $args = \func_get_args(); - array_shift($args); + return $rownum; + } - $partitionBy = $args ? implode(',', $args) : null; + $args = \func_get_args(); + array_shift($args); - if ($partitionBy === null || $partitionBy === $partition) { - $rownum++; - } else { - $rownum = 1; - $partition = $partitionBy; - } + $partitionBy = $args ? implode(',', $args) : null; - return $rownum; + if ($partitionBy === null || $partitionBy === $partition) { + $rownum++; + } else { + $rownum = 1; + $partition = $partitionBy; } - ); + + return $rownum; + }; + + if ($this->connection instanceof \Pdo\Sqlite) { + $this->connection->createFunction( + 'ROW_NUMBER', + $rownumberfn + ); + } else { + $this->connection->sqliteCreateFunction( + 'ROW_NUMBER', + $rownumberfn + ); + } } /**