From 5a409925f0f0b47a71cd61d2be131ff1ac9511ae Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 12 Nov 2025 13:23:15 +0300 Subject: [PATCH 1/3] Throw exception on "unsigned" column usage --- CHANGELOG.md | 1 + src/Column/ColumnDefinitionBuilder.php | 5 +++++ src/Column/ColumnFactory.php | 6 ++++++ tests/Provider/ColumnFactoryProvider.php | 11 +++++++++++ tests/Provider/QueryBuilderProvider.php | 7 ++++++- 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00e587c1..bfe834c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ - Chg #365: Update expression namespaces according to changes in `yiisoft/db` package (@Tigrov) - Enh #359: Update `DMLQueryBuilder::update()` method to adapt changes in `yiisoft/db` (@rustamwin) - Enh #373: Adapt to `DQLQueryBuilderInterface::buildWithQueries()` signature changes in `yiisoft/db` package (@vjik) +- Chg #378: Throw exception on "unsigned" column usage (@vjik) ## 1.3.0 March 21, 2024 diff --git a/src/Column/ColumnDefinitionBuilder.php b/src/Column/ColumnDefinitionBuilder.php index cfa673f4..a355bdd9 100644 --- a/src/Column/ColumnDefinitionBuilder.php +++ b/src/Column/ColumnDefinitionBuilder.php @@ -6,6 +6,7 @@ use Yiisoft\Db\Constant\ColumnType; use Yiisoft\Db\Constant\ReferentialAction; +use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\QueryBuilder\AbstractColumnDefinitionBuilder; use Yiisoft\Db\Schema\Column\ColumnInterface; @@ -38,6 +39,10 @@ final class ColumnDefinitionBuilder extends AbstractColumnDefinitionBuilder public function build(ColumnInterface $column): string { + if ($column->isUnsigned()) { + throw new NotSupportedException('The "unsigned" attribute is not supported by Oracle.'); + } + return $this->buildType($column) . $this->buildAutoIncrement($column) . $this->buildDefault($column) diff --git a/src/Column/ColumnFactory.php b/src/Column/ColumnFactory.php index a3b4639b..45ac9586 100644 --- a/src/Column/ColumnFactory.php +++ b/src/Column/ColumnFactory.php @@ -5,6 +5,7 @@ namespace Yiisoft\Db\Oracle\Column; use Yiisoft\Db\Constant\ColumnType; +use Yiisoft\Db\Constant\PseudoType; use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Schema\Column\AbstractColumnFactory; use Yiisoft\Db\Schema\Column\ColumnInterface; @@ -54,6 +55,11 @@ final class ColumnFactory extends AbstractColumnFactory ]; private const DATETIME_REGEX = "/^(?:TIMESTAMP|DATE|INTERVAL|to_timestamp(?:_tz)?\(|to_date\(|to_dsinterval\()\s*'(?:\d )?([^']+)/"; + public function fromPseudoType(string $pseudoType, array $info = []): ColumnInterface + { + return parent::fromPseudoType($pseudoType, $info)->unsigned(false); + } + protected function columnDefinitionParser(): ColumnDefinitionParser { return new ColumnDefinitionParser(); diff --git a/tests/Provider/ColumnFactoryProvider.php b/tests/Provider/ColumnFactoryProvider.php index 467c5f48..efa32a2d 100644 --- a/tests/Provider/ColumnFactoryProvider.php +++ b/tests/Provider/ColumnFactoryProvider.php @@ -18,6 +18,17 @@ final class ColumnFactoryProvider extends \Yiisoft\Db\Tests\Provider\ColumnFactoryProvider { + public static function pseudoTypes(): array + { + $values = parent::pseudoTypes(); + + // Oracle doesn't support unsigned types + $values['upk'][1] = new IntegerColumn(primaryKey: true, autoIncrement: true, unsigned: false); + $values['ubigpk'][1] = new BigIntColumn(primaryKey: true, autoIncrement: true, unsigned: false); + + return $values; + } + public static function dbTypes(): array { return [ diff --git a/tests/Provider/QueryBuilderProvider.php b/tests/Provider/QueryBuilderProvider.php index 856bd8df..ef1e4d41 100644 --- a/tests/Provider/QueryBuilderProvider.php +++ b/tests/Provider/QueryBuilderProvider.php @@ -287,6 +287,12 @@ public static function buildColumnDefinition(): array $values = parent::buildColumnDefinition(); + // SQLite does not support unsigned types + unset( + $values['bigint(15) unsigned'], + $values['unsigned()'], + ); + $values[PseudoType::PK][0] = 'number(10) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY'; $values[PseudoType::UPK][0] = 'number(10) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY'; $values[PseudoType::BIGPK][0] = 'number(20) GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY'; @@ -375,7 +381,6 @@ public static function buildColumnDefinition(): array $values["integer()->defaultValue('')"][0] = 'number(10) DEFAULT NULL'; $values['size(10)'][0] = 'varchar2(10)'; $values['unique()'][0] = 'varchar2(255) UNIQUE'; - $values['unsigned()'][0] = 'number(10)'; $values['scale(2)'][0] = 'number(10,2)'; $values['integer(8)->scale(2)'][0] = 'number(8)'; $values['reference($reference)'][0] = 'number(10) REFERENCES "ref_table" ("id") ON DELETE SET NULL'; From c7dd10f439a975d4e903255d0255f097ea759fbe Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 12 Nov 2025 13:24:48 +0300 Subject: [PATCH 2/3] fix --- tests/Provider/QueryBuilderProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Provider/QueryBuilderProvider.php b/tests/Provider/QueryBuilderProvider.php index ef1e4d41..446fbe19 100644 --- a/tests/Provider/QueryBuilderProvider.php +++ b/tests/Provider/QueryBuilderProvider.php @@ -287,7 +287,7 @@ public static function buildColumnDefinition(): array $values = parent::buildColumnDefinition(); - // SQLite does not support unsigned types + // Oracle does not support unsigned types unset( $values['bigint(15) unsigned'], $values['unsigned()'], From 07de6ceb57d19a1dc4e56cf4bc7e8b5c9a955a7a Mon Sep 17 00:00:00 2001 From: vjik <525501+vjik@users.noreply.github.com> Date: Wed, 12 Nov 2025 10:25:58 +0000 Subject: [PATCH 3/3] Apply PHP CS Fixer and Rector changes (CI) --- src/Column/ColumnFactory.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Column/ColumnFactory.php b/src/Column/ColumnFactory.php index 45ac9586..09d15019 100644 --- a/src/Column/ColumnFactory.php +++ b/src/Column/ColumnFactory.php @@ -5,7 +5,6 @@ namespace Yiisoft\Db\Oracle\Column; use Yiisoft\Db\Constant\ColumnType; -use Yiisoft\Db\Constant\PseudoType; use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Schema\Column\AbstractColumnFactory; use Yiisoft\Db\Schema\Column\ColumnInterface;