Signed-off-by: Robin Appelman <robin@icewind.nl>tags/v13.0.0beta2
@@ -1 +1 @@ | |||
Subproject commit ec71700daf6aab080502f67ecfca274dcb0bb3d9 | |||
Subproject commit eaf914b713e27625ec37a8fcc9e46227b8b0500b |
@@ -540,7 +540,6 @@ return array( | |||
'OC\\DB\\Migrator' => $baseDir . '/lib/private/DB/Migrator.php', | |||
'OC\\DB\\MySQLMigrator' => $baseDir . '/lib/private/DB/MySQLMigrator.php', | |||
'OC\\DB\\MySqlTools' => $baseDir . '/lib/private/DB/MySqlTools.php', | |||
'OC\\DB\\OCPostgreSqlPlatform' => $baseDir . '/lib/private/DB/OCPostgreSqlPlatform.php', | |||
'OC\\DB\\OCSqlitePlatform' => $baseDir . '/lib/private/DB/OCSqlitePlatform.php', | |||
'OC\\DB\\OracleConnection' => $baseDir . '/lib/private/DB/OracleConnection.php', | |||
'OC\\DB\\OracleMigrator' => $baseDir . '/lib/private/DB/OracleMigrator.php', |
@@ -570,7 +570,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c | |||
'OC\\DB\\Migrator' => __DIR__ . '/../../..' . '/lib/private/DB/Migrator.php', | |||
'OC\\DB\\MySQLMigrator' => __DIR__ . '/../../..' . '/lib/private/DB/MySQLMigrator.php', | |||
'OC\\DB\\MySqlTools' => __DIR__ . '/../../..' . '/lib/private/DB/MySqlTools.php', | |||
'OC\\DB\\OCPostgreSqlPlatform' => __DIR__ . '/../../..' . '/lib/private/DB/OCPostgreSqlPlatform.php', | |||
'OC\\DB\\OCSqlitePlatform' => __DIR__ . '/../../..' . '/lib/private/DB/OCSqlitePlatform.php', | |||
'OC\\DB\\OracleConnection' => __DIR__ . '/../../..' . '/lib/private/DB/OracleConnection.php', | |||
'OC\\DB\\OracleMigrator' => __DIR__ . '/../../..' . '/lib/private/DB/OracleMigrator.php', |
@@ -139,9 +139,6 @@ class ConnectionFactory { | |||
unset($additionalConnectionParams['host']); | |||
break; | |||
case 'pgsql': | |||
$additionalConnectionParams['platform'] = new OCPostgreSqlPlatform(); | |||
break; | |||
case 'sqlite3': | |||
$journalMode = $additionalConnectionParams['sqlite.journal_mode']; | |||
$additionalConnectionParams['platform'] = new OCSqlitePlatform(); |
@@ -1,95 +0,0 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2017, ownCloud GmbH | |||
* | |||
* @author Joas Schilling <coding@schilljs.com> | |||
* | |||
* @license AGPL-3.0 | |||
* | |||
* This code is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License, version 3, | |||
* as published by the Free Software Foundation. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License, version 3, | |||
* along with this program. If not, see <http://www.gnu.org/licenses/> | |||
* | |||
*/ | |||
namespace OC\DB; | |||
use Doctrine\DBAL\Platforms\PostgreSqlPlatform; | |||
use Doctrine\DBAL\Schema\ColumnDiff; | |||
use Doctrine\DBAL\Schema\TableDiff; | |||
use Doctrine\DBAL\Types\Type; | |||
class OCPostgreSqlPlatform extends PostgreSqlPlatform { | |||
/** | |||
* {@inheritDoc} | |||
*/ | |||
public function getAlterTableSQL(TableDiff $diff){ | |||
$queries = parent::getAlterTableSQL($diff); | |||
foreach ($queries as $index => $sql){ | |||
// BIGSERIAL could not be used in statements altering column type | |||
// That's why we replace it with BIGINT | |||
// see https://github.com/owncloud/core/pull/28364#issuecomment-315006853 | |||
if (preg_match('|(ALTER TABLE\s+\S+\s+ALTER\s+\S+\s+TYPE\s+)(BIGSERIAL)|i', $sql, $matches)) { | |||
$alterTable = $matches[1]; | |||
$queries[$index] = $alterTable . 'BIGINT'; | |||
} | |||
// Changing integer to bigint kills next autoincrement value | |||
// see https://github.com/owncloud/core/pull/28364#issuecomment-315006853 | |||
if (preg_match('|ALTER TABLE\s+(\S+)\s+ALTER\s+(\S+)\s+DROP DEFAULT|i', $sql, $matches)) { | |||
$queryColumnName = $matches[2]; | |||
$columnDiff = $this->findColumnDiffByName($diff, $queryColumnName); | |||
if ($columnDiff && $this->shouldSkipDropDefault($columnDiff)) { | |||
unset($queries[$index]); | |||
continue; | |||
} | |||
} | |||
} | |||
return $queries; | |||
} | |||
/** | |||
* We should NOT drop next sequence value if | |||
* - type was changed from INTEGER to BIGINT | |||
* - column keeps an autoincrement | |||
* - default value is kept NULL | |||
* | |||
* @param ColumnDiff $columnDiff | |||
* @return bool | |||
*/ | |||
private function shouldSkipDropDefault(ColumnDiff $columnDiff) { | |||
$column = $columnDiff->column; | |||
$fromColumn = $columnDiff->fromColumn; | |||
return $fromColumn->getType()->getName() === Type::INTEGER | |||
&& $column->getType()->getName() === Type::BIGINT | |||
&& $fromColumn->getDefault() === null | |||
&& $column->getDefault() === null | |||
&& $fromColumn->getAutoincrement() | |||
&& $column->getAutoincrement(); | |||
} | |||
/** | |||
* @param TableDiff $diff | |||
* @param string $name | |||
* @return ColumnDiff | false | |||
*/ | |||
private function findColumnDiffByName(TableDiff $diff, $name) { | |||
foreach ($diff->changedColumns as $columnDiff) { | |||
$oldColumnName = $columnDiff->getOldColumnName()->getQuotedName($this); | |||
if ($oldColumnName === $name) { | |||
return $columnDiff; | |||
} | |||
} | |||
return false; | |||
} | |||
} |
@@ -18,33 +18,34 @@ | |||
* along with this program. If not, see <http://www.gnu.org/licenses/> | |||
* | |||
*/ | |||
namespace Test\DB; | |||
use Doctrine\DBAL\Platforms\PostgreSqlPlatform; | |||
use Doctrine\DBAL\Schema\Comparator; | |||
use Doctrine\DBAL\Schema\Schema; | |||
use Doctrine\DBAL\Schema\TableDiff; | |||
use Doctrine\DBAL\Types\Type; | |||
use OC\DB\OCPostgreSqlPlatform; | |||
/** | |||
/** | |||
* Class OCPostgreSqlPlatformTest | |||
* | |||
* custom OCPostgreSqlPlatform behavior has been upstreamed, test is left to | |||
* ensure behavior stays correct. | |||
* | |||
* @group DB | |||
* | |||
* @package Test\DB | |||
*/ | |||
class OCPostgreSqlPlatformTest extends \Test\TestCase { | |||
public function testAlterBigint(){ | |||
$platform = new OCPostgreSqlPlatform(); | |||
public function testAlterBigint() { | |||
$platform = new PostgreSqlPlatform(); | |||
$sourceSchema = new Schema(); | |||
$targetSchema = new Schema(); | |||
$this->createTableAndColumn($sourceSchema, Type::INTEGER); | |||
$this->createTableAndColumn($targetSchema, Type::BIGINT); | |||
$comparator = new Comparator(); | |||
$diff = $comparator->compare($sourceSchema, $targetSchema); | |||
$sqlStatements = $diff->toSql($platform); | |||
@@ -53,22 +54,22 @@ class OCPostgreSqlPlatformTest extends \Test\TestCase { | |||
$sqlStatements, | |||
true | |||
); | |||
$this->assertNotContains( | |||
'ALTER TABLE poor_yorick ALTER id DROP DEFAULT', | |||
$sqlStatements, | |||
true | |||
); | |||
} | |||
protected function createTableAndColumn($schema, $type){ | |||
protected function createTableAndColumn($schema, $type) { | |||
$table = $schema->createTable("poor_yorick"); | |||
$table->addColumn('id', $type, [ | |||
'autoincrement' => true, | |||
'unsigned' => true, | |||
'notnull' => true, | |||
'length' => 11, | |||
'unsigned' => true, | |||
'notnull' => true, | |||
'length' => 11, | |||
]); | |||
} | |||
} |