From cdfedc6e1a2e45d4eb27738ff21b83853e4d9232 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Sat, 13 Jun 2026 13:32:32 +0700 Subject: [PATCH 1/6] Clarify return type of `phpTypecast()` methods for range columns --- src/Column/DateRangeColumn.php | 5 +++++ src/Column/Int4RangeColumn.php | 5 +++++ src/Column/Int8RangeColumn.php | 5 +++++ src/Column/NumRangeColumn.php | 5 +++++ src/Column/TsRangeColumn.php | 5 +++++ src/Column/TsTzRangeColumn.php | 5 +++++ 6 files changed, 30 insertions(+) diff --git a/src/Column/DateRangeColumn.php b/src/Column/DateRangeColumn.php index b85666ed9..499a38b38 100644 --- a/src/Column/DateRangeColumn.php +++ b/src/Column/DateRangeColumn.php @@ -12,6 +12,11 @@ final class DateRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::DATERANGE; + public function phpTypecast(mixed $value): ?DateRangeValue + { + return parent::phpTypecast($value); + } + protected function getBoundColumn(): DateTimeColumn { return RangeBoundColumnFactory::date(); diff --git a/src/Column/Int4RangeColumn.php b/src/Column/Int4RangeColumn.php index 866c73d30..ff39c9209 100644 --- a/src/Column/Int4RangeColumn.php +++ b/src/Column/Int4RangeColumn.php @@ -11,6 +11,11 @@ final class Int4RangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::INT4RANGE; + public function phpTypecast(mixed $value): ?Int4RangeValue + { + return parent::phpTypecast($value); + } + protected function getBoundColumn(): IntegerColumn { return RangeBoundColumnFactory::int4(); diff --git a/src/Column/Int8RangeColumn.php b/src/Column/Int8RangeColumn.php index 465367f97..1e211bdf7 100644 --- a/src/Column/Int8RangeColumn.php +++ b/src/Column/Int8RangeColumn.php @@ -11,6 +11,11 @@ final class Int8RangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::INT8RANGE; + public function phpTypecast(mixed $value): ?Int8RangeValue + { + return parent::phpTypecast($value); + } + protected function getBoundColumn(): BigIntColumn|IntegerColumn { return RangeBoundColumnFactory::int8(); diff --git a/src/Column/NumRangeColumn.php b/src/Column/NumRangeColumn.php index f0610e9fb..4b594d8ee 100644 --- a/src/Column/NumRangeColumn.php +++ b/src/Column/NumRangeColumn.php @@ -12,6 +12,11 @@ final class NumRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::NUMRANGE; + public function phpTypecast(mixed $value): ?NumRangeValue + { + return parent::phpTypecast($value); + } + protected function getBoundColumn(): DoubleColumn { return RangeBoundColumnFactory::num(); diff --git a/src/Column/TsRangeColumn.php b/src/Column/TsRangeColumn.php index e0595ffe6..e314b866b 100644 --- a/src/Column/TsRangeColumn.php +++ b/src/Column/TsRangeColumn.php @@ -12,6 +12,11 @@ final class TsRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::TSRANGE; + public function phpTypecast(mixed $value): ?TsRangeValue + { + return parent::phpTypecast($value); + } + protected function getBoundColumn(): DateTimeColumn { return RangeBoundColumnFactory::ts(); diff --git a/src/Column/TsTzRangeColumn.php b/src/Column/TsTzRangeColumn.php index a60fa99a5..540f2bcbb 100644 --- a/src/Column/TsTzRangeColumn.php +++ b/src/Column/TsTzRangeColumn.php @@ -12,6 +12,11 @@ final class TsTzRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::TSTZRANGE; + public function phpTypecast(mixed $value): ?TsTzRangeValue + { + return parent::phpTypecast($value); + } + protected function getBoundColumn(): DateTimeColumn { return RangeBoundColumnFactory::tsTz(); From 45e64af175044ee83a878610d884188a270a4ae5 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Sat, 13 Jun 2026 15:59:13 +0700 Subject: [PATCH 2/6] Improve --- src/Column/AbstractMultiRangeColumn.php | 20 +++++++++++++++++++- src/Column/AbstractRangeColumn.php | 20 +++++++++++++++++++- src/Column/DateRangeColumn.php | 1 + src/Column/Int4RangeColumn.php | 1 + src/Column/Int8RangeColumn.php | 1 + src/Column/NumRangeColumn.php | 1 + src/Column/TsRangeColumn.php | 1 + src/Column/TsTzRangeColumn.php | 1 + 8 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/Column/AbstractMultiRangeColumn.php b/src/Column/AbstractMultiRangeColumn.php index 05b1e9a8d..3dca2e509 100644 --- a/src/Column/AbstractMultiRangeColumn.php +++ b/src/Column/AbstractMultiRangeColumn.php @@ -9,6 +9,12 @@ use Yiisoft\Db\Pgsql\Expression\MultiRangeValue; use Yiisoft\Db\Schema\Column\AbstractColumn; use Yiisoft\Db\Schema\Column\ColumnInterface; +use Yiisoft\Db\Pgsql\Expression\DateRangeValue; +use Yiisoft\Db\Pgsql\Expression\Int4RangeValue; +use Yiisoft\Db\Pgsql\Expression\Int8RangeValue; +use Yiisoft\Db\Pgsql\Expression\NumRangeValue; +use Yiisoft\Db\Pgsql\Expression\TsRangeValue; +use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue; use function gettype; use function is_array; @@ -16,6 +22,11 @@ abstract class AbstractMultiRangeColumn extends AbstractColumn { + /** + * @inheritDoc + * + * @return string|ExpressionInterface|MultiRangeValue|null + */ public function dbTypecast(mixed $value): mixed { if ($value === null @@ -42,7 +53,12 @@ public function dbTypecast(mixed $value): mixed return new MultiRangeValue(...$ranges); } - public function phpTypecast(mixed $value): mixed + /** + * @inheritDoc + * + * @return ?(Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue)[] + */ + public function phpTypecast(mixed $value): ?array { /** * @var string|null $value We expect `phpTypecast()` to only receive the value that the database returns, which @@ -64,6 +80,8 @@ public function phpTypecast(mixed $value): mixed preg_match_all('/[\[\(][^,]*,[^\)\]]*[\)\]]/', $value, $matches); $rangeColumn = $this->getRangeColumn(); + + /** @var (Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue)[] */ return array_map( $rangeColumn->phpTypecast(...), $matches[0], diff --git a/src/Column/AbstractRangeColumn.php b/src/Column/AbstractRangeColumn.php index 85a242667..d63ee21e8 100644 --- a/src/Column/AbstractRangeColumn.php +++ b/src/Column/AbstractRangeColumn.php @@ -7,6 +7,12 @@ use InvalidArgumentException; use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionInterface; +use Yiisoft\Db\Pgsql\Expression\DateRangeValue; +use Yiisoft\Db\Pgsql\Expression\Int4RangeValue; +use Yiisoft\Db\Pgsql\Expression\Int8RangeValue; +use Yiisoft\Db\Pgsql\Expression\NumRangeValue; +use Yiisoft\Db\Pgsql\Expression\TsRangeValue; +use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue; use Yiisoft\Db\Schema\Column\AbstractColumn; use Yiisoft\Db\Schema\Column\ColumnInterface; @@ -17,6 +23,11 @@ abstract class AbstractRangeColumn extends AbstractColumn { + /** + * @inheritDoc + * + * @return string|ExpressionInterface|null + */ public function dbTypecast(mixed $value): mixed { if ($value === null @@ -45,6 +56,11 @@ public function dbTypecast(mixed $value): mixed . ']'; } + /** + * @inheritDoc + * + * @return null|Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue + */ public function phpTypecast(mixed $value): mixed { /** @@ -56,7 +72,7 @@ public function phpTypecast(mixed $value): mixed return null; } - if (!preg_match('/^(?P\[|\()(?P[^,]*),(?P[^\)\]]*)(?P\)|\])$/', $value, $matches)) { + if (!preg_match('/^(?P[\[\(])(?P[^,]*),(?P[^\)\]]*)(?P[\)\]])$/', $value, $matches)) { throw new NotSupportedException('Unsupported range format.'); } @@ -72,6 +88,8 @@ abstract protected function getBoundColumn(): ColumnInterface; /** * @throws NotSupportedException + * + * @return Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue */ abstract protected function createRangeValue( ?string $lower, diff --git a/src/Column/DateRangeColumn.php b/src/Column/DateRangeColumn.php index 499a38b38..ea9b6198f 100644 --- a/src/Column/DateRangeColumn.php +++ b/src/Column/DateRangeColumn.php @@ -14,6 +14,7 @@ final class DateRangeColumn extends AbstractRangeColumn public function phpTypecast(mixed $value): ?DateRangeValue { + /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/Int4RangeColumn.php b/src/Column/Int4RangeColumn.php index ff39c9209..862f4dff4 100644 --- a/src/Column/Int4RangeColumn.php +++ b/src/Column/Int4RangeColumn.php @@ -13,6 +13,7 @@ final class Int4RangeColumn extends AbstractRangeColumn public function phpTypecast(mixed $value): ?Int4RangeValue { + /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/Int8RangeColumn.php b/src/Column/Int8RangeColumn.php index 1e211bdf7..84ca3b4e5 100644 --- a/src/Column/Int8RangeColumn.php +++ b/src/Column/Int8RangeColumn.php @@ -13,6 +13,7 @@ final class Int8RangeColumn extends AbstractRangeColumn public function phpTypecast(mixed $value): ?Int8RangeValue { + /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/NumRangeColumn.php b/src/Column/NumRangeColumn.php index 4b594d8ee..b5044db9d 100644 --- a/src/Column/NumRangeColumn.php +++ b/src/Column/NumRangeColumn.php @@ -14,6 +14,7 @@ final class NumRangeColumn extends AbstractRangeColumn public function phpTypecast(mixed $value): ?NumRangeValue { + /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/TsRangeColumn.php b/src/Column/TsRangeColumn.php index e314b866b..558396ec3 100644 --- a/src/Column/TsRangeColumn.php +++ b/src/Column/TsRangeColumn.php @@ -14,6 +14,7 @@ final class TsRangeColumn extends AbstractRangeColumn public function phpTypecast(mixed $value): ?TsRangeValue { + /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/TsTzRangeColumn.php b/src/Column/TsTzRangeColumn.php index 540f2bcbb..e26f422da 100644 --- a/src/Column/TsTzRangeColumn.php +++ b/src/Column/TsTzRangeColumn.php @@ -14,6 +14,7 @@ final class TsTzRangeColumn extends AbstractRangeColumn public function phpTypecast(mixed $value): ?TsTzRangeValue { + /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } From f99e346c720d5ee542468e6020ba4aa31ab6fe70 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Sat, 13 Jun 2026 16:09:49 +0700 Subject: [PATCH 3/6] Fix bc --- src/Column/AbstractMultiRangeColumn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Column/AbstractMultiRangeColumn.php b/src/Column/AbstractMultiRangeColumn.php index 3dca2e509..7ab6773e7 100644 --- a/src/Column/AbstractMultiRangeColumn.php +++ b/src/Column/AbstractMultiRangeColumn.php @@ -58,7 +58,7 @@ public function dbTypecast(mixed $value): mixed * * @return ?(Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue)[] */ - public function phpTypecast(mixed $value): ?array + public function phpTypecast(mixed $value): mixed { /** * @var string|null $value We expect `phpTypecast()` to only receive the value that the database returns, which From 8d89390be05b2fc3aeff5b9cca9eaf2e83911302 Mon Sep 17 00:00:00 2001 From: Tigrov Date: Sat, 13 Jun 2026 21:31:28 +0700 Subject: [PATCH 4/6] Improve --- CHANGELOG.md | 1 + src/Column/AbstractMultiRangeColumn.php | 7 ++++++- src/Column/AbstractRangeColumn.php | 7 +++++++ src/Column/DateMultiRangeColumn.php | 4 ++++ src/Column/DateRangeColumn.php | 12 +++++++++--- src/Column/Int4MultiRangeColumn.php | 4 ++++ src/Column/Int4RangeColumn.php | 4 +++- src/Column/Int8MultiRangeColumn.php | 4 ++++ src/Column/Int8RangeColumn.php | 4 +++- src/Column/NumMultiRangeColumn.php | 4 ++++ src/Column/NumRangeColumn.php | 4 +++- src/Column/TsMultiRangeColumn.php | 4 ++++ src/Column/TsRangeColumn.php | 4 +++- src/Column/TsTzMultiRangeColumn.php | 4 ++++ src/Column/TsTzRangeColumn.php | 4 +++- 15 files changed, 62 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 654e1607d..0eea3494e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Enh #482: Improve performance of `SqlParser::getNextPlaceholder()` method (@Tigrov) - Chg #483: Bump `yiisoft/db` version to `^2.0.1` (@vjik) - Bug #484: Fix building range-type column definitions (@Tigrov) +- Enh #489: Clarify return type of `phpTypecast()` methods for range columns (@Tigrov) ## 2.0.1 February 07, 2026 diff --git a/src/Column/AbstractMultiRangeColumn.php b/src/Column/AbstractMultiRangeColumn.php index 7ab6773e7..1618ea7d3 100644 --- a/src/Column/AbstractMultiRangeColumn.php +++ b/src/Column/AbstractMultiRangeColumn.php @@ -20,6 +20,9 @@ use function is_array; use function is_string; +/** + * @template T of ExpressionInterface + */ abstract class AbstractMultiRangeColumn extends AbstractColumn { /** @@ -57,6 +60,8 @@ public function dbTypecast(mixed $value): mixed * @inheritDoc * * @return ?(Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue)[] + * + * @psalm-return ?T[] */ public function phpTypecast(mixed $value): mixed { @@ -81,7 +86,7 @@ public function phpTypecast(mixed $value): mixed $rangeColumn = $this->getRangeColumn(); - /** @var (Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue)[] */ + /** @psalm-var T[] */ return array_map( $rangeColumn->phpTypecast(...), $matches[0], diff --git a/src/Column/AbstractRangeColumn.php b/src/Column/AbstractRangeColumn.php index d63ee21e8..61dd992e3 100644 --- a/src/Column/AbstractRangeColumn.php +++ b/src/Column/AbstractRangeColumn.php @@ -21,6 +21,9 @@ use function is_string; use function sprintf; +/** + * @template T of ExpressionInterface + */ abstract class AbstractRangeColumn extends AbstractColumn { /** @@ -60,6 +63,8 @@ public function dbTypecast(mixed $value): mixed * @inheritDoc * * @return null|Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue + * + * @psalm-return ?T */ public function phpTypecast(mixed $value): mixed { @@ -90,6 +95,8 @@ abstract protected function getBoundColumn(): ColumnInterface; * @throws NotSupportedException * * @return Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue + * + * @psalm-return T */ abstract protected function createRangeValue( ?string $lower, diff --git a/src/Column/DateMultiRangeColumn.php b/src/Column/DateMultiRangeColumn.php index 138130562..cf1fa217b 100644 --- a/src/Column/DateMultiRangeColumn.php +++ b/src/Column/DateMultiRangeColumn.php @@ -5,8 +5,12 @@ namespace Yiisoft\Db\Pgsql\Column; use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; +use Yiisoft\Db\Pgsql\Expression\DateRangeValue; use Yiisoft\Db\Schema\Column\ColumnInterface; +/** + * @extends AbstractMultiRangeColumn + */ final class DateMultiRangeColumn extends AbstractMultiRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::DATEMULTIRANGE; diff --git a/src/Column/DateRangeColumn.php b/src/Column/DateRangeColumn.php index ea9b6198f..cee81f74d 100644 --- a/src/Column/DateRangeColumn.php +++ b/src/Column/DateRangeColumn.php @@ -8,13 +8,15 @@ use Yiisoft\Db\Pgsql\Expression\DateRangeValue; use Yiisoft\Db\Schema\Column\DateTimeColumn; +/** + * @extends AbstractRangeColumn + */ final class DateRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::DATERANGE; public function phpTypecast(mixed $value): ?DateRangeValue { - /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } @@ -23,8 +25,12 @@ protected function getBoundColumn(): DateTimeColumn return RangeBoundColumnFactory::date(); } - protected function createRangeValue(?string $lower, ?string $upper, bool $includeLower, bool $includeUpper): DateRangeValue - { + protected function createRangeValue( + ?string $lower, + ?string $upper, + bool $includeLower, + bool $includeUpper, + ): DateRangeValue { $column = $this->getBoundColumn(); return new DateRangeValue( $column->phpTypecast($lower), diff --git a/src/Column/Int4MultiRangeColumn.php b/src/Column/Int4MultiRangeColumn.php index 80ecc0a55..3881f83e8 100644 --- a/src/Column/Int4MultiRangeColumn.php +++ b/src/Column/Int4MultiRangeColumn.php @@ -5,8 +5,12 @@ namespace Yiisoft\Db\Pgsql\Column; use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; +use Yiisoft\Db\Pgsql\Expression\Int4RangeValue; use Yiisoft\Db\Schema\Column\ColumnInterface; +/** + * @extends AbstractMultiRangeColumn + */ final class Int4MultiRangeColumn extends AbstractMultiRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::INT4MULTIRANGE; diff --git a/src/Column/Int4RangeColumn.php b/src/Column/Int4RangeColumn.php index 862f4dff4..a9f42f440 100644 --- a/src/Column/Int4RangeColumn.php +++ b/src/Column/Int4RangeColumn.php @@ -7,13 +7,15 @@ use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; use Yiisoft\Db\Pgsql\Expression\Int4RangeValue; +/** + * @extends AbstractRangeColumn + */ final class Int4RangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::INT4RANGE; public function phpTypecast(mixed $value): ?Int4RangeValue { - /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/Int8MultiRangeColumn.php b/src/Column/Int8MultiRangeColumn.php index 5aedc5a68..a289ffed1 100644 --- a/src/Column/Int8MultiRangeColumn.php +++ b/src/Column/Int8MultiRangeColumn.php @@ -5,8 +5,12 @@ namespace Yiisoft\Db\Pgsql\Column; use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; +use Yiisoft\Db\Pgsql\Expression\Int8RangeValue; use Yiisoft\Db\Schema\Column\ColumnInterface; +/** + * @extends AbstractMultiRangeColumn + */ final class Int8MultiRangeColumn extends AbstractMultiRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::INT8MULTIRANGE; diff --git a/src/Column/Int8RangeColumn.php b/src/Column/Int8RangeColumn.php index 84ca3b4e5..2fcad53c1 100644 --- a/src/Column/Int8RangeColumn.php +++ b/src/Column/Int8RangeColumn.php @@ -7,13 +7,15 @@ use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; use Yiisoft\Db\Pgsql\Expression\Int8RangeValue; +/** + * @extends AbstractRangeColumn + */ final class Int8RangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::INT8RANGE; public function phpTypecast(mixed $value): ?Int8RangeValue { - /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/NumMultiRangeColumn.php b/src/Column/NumMultiRangeColumn.php index d0e2381a0..b37410c7f 100644 --- a/src/Column/NumMultiRangeColumn.php +++ b/src/Column/NumMultiRangeColumn.php @@ -5,8 +5,12 @@ namespace Yiisoft\Db\Pgsql\Column; use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; +use Yiisoft\Db\Pgsql\Expression\NumRangeValue; use Yiisoft\Db\Schema\Column\ColumnInterface; +/** + * @extends AbstractMultiRangeColumn + */ final class NumMultiRangeColumn extends AbstractMultiRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::NUMMULTIRANGE; diff --git a/src/Column/NumRangeColumn.php b/src/Column/NumRangeColumn.php index b5044db9d..f564276bf 100644 --- a/src/Column/NumRangeColumn.php +++ b/src/Column/NumRangeColumn.php @@ -8,13 +8,15 @@ use Yiisoft\Db\Pgsql\Expression\NumRangeValue; use Yiisoft\Db\Schema\Column\DoubleColumn; +/** + * @extends AbstractRangeColumn + */ final class NumRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::NUMRANGE; public function phpTypecast(mixed $value): ?NumRangeValue { - /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/TsMultiRangeColumn.php b/src/Column/TsMultiRangeColumn.php index 13333dc56..d6e73225d 100644 --- a/src/Column/TsMultiRangeColumn.php +++ b/src/Column/TsMultiRangeColumn.php @@ -5,8 +5,12 @@ namespace Yiisoft\Db\Pgsql\Column; use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; +use Yiisoft\Db\Pgsql\Expression\TsRangeValue; use Yiisoft\Db\Schema\Column\ColumnInterface; +/** + * @extends AbstractMultiRangeColumn + */ final class TsMultiRangeColumn extends AbstractMultiRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::TSMULTIRANGE; diff --git a/src/Column/TsRangeColumn.php b/src/Column/TsRangeColumn.php index 558396ec3..2ab643128 100644 --- a/src/Column/TsRangeColumn.php +++ b/src/Column/TsRangeColumn.php @@ -8,13 +8,15 @@ use Yiisoft\Db\Pgsql\Expression\TsRangeValue; use Yiisoft\Db\Schema\Column\DateTimeColumn; +/** + * @extends AbstractRangeColumn + */ final class TsRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::TSRANGE; public function phpTypecast(mixed $value): ?TsRangeValue { - /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } diff --git a/src/Column/TsTzMultiRangeColumn.php b/src/Column/TsTzMultiRangeColumn.php index 38019a382..bc6655cc9 100644 --- a/src/Column/TsTzMultiRangeColumn.php +++ b/src/Column/TsTzMultiRangeColumn.php @@ -5,8 +5,12 @@ namespace Yiisoft\Db\Pgsql\Column; use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType; +use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue; use Yiisoft\Db\Schema\Column\ColumnInterface; +/** + * @extends AbstractMultiRangeColumn + */ final class TsTzMultiRangeColumn extends AbstractMultiRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::TSTZMULTIRANGE; diff --git a/src/Column/TsTzRangeColumn.php b/src/Column/TsTzRangeColumn.php index e26f422da..4ce71ef27 100644 --- a/src/Column/TsTzRangeColumn.php +++ b/src/Column/TsTzRangeColumn.php @@ -8,13 +8,15 @@ use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue; use Yiisoft\Db\Schema\Column\DateTimeColumn; +/** + * @extends AbstractRangeColumn + */ final class TsTzRangeColumn extends AbstractRangeColumn { protected const DEFAULT_TYPE = PgsqlColumnType::TSTZRANGE; public function phpTypecast(mixed $value): ?TsTzRangeValue { - /** @psalm-suppress InvalidReturnStatement */ return parent::phpTypecast($value); } From ddfbf5c41045d7570a2886bb8cc7bfe3cb3f267a Mon Sep 17 00:00:00 2001 From: Tigrov Date: Sun, 14 Jun 2026 12:16:14 +0700 Subject: [PATCH 5/6] Improve --- src/Column/AbstractMultiRangeColumn.php | 11 ++++------- src/Column/AbstractRangeColumn.php | 10 +--------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/Column/AbstractMultiRangeColumn.php b/src/Column/AbstractMultiRangeColumn.php index 1618ea7d3..6125d3142 100644 --- a/src/Column/AbstractMultiRangeColumn.php +++ b/src/Column/AbstractMultiRangeColumn.php @@ -9,12 +9,6 @@ use Yiisoft\Db\Pgsql\Expression\MultiRangeValue; use Yiisoft\Db\Schema\Column\AbstractColumn; use Yiisoft\Db\Schema\Column\ColumnInterface; -use Yiisoft\Db\Pgsql\Expression\DateRangeValue; -use Yiisoft\Db\Pgsql\Expression\Int4RangeValue; -use Yiisoft\Db\Pgsql\Expression\Int8RangeValue; -use Yiisoft\Db\Pgsql\Expression\NumRangeValue; -use Yiisoft\Db\Pgsql\Expression\TsRangeValue; -use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue; use function gettype; use function is_array; @@ -59,7 +53,7 @@ public function dbTypecast(mixed $value): mixed /** * @inheritDoc * - * @return ?(Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue)[] + * @return ?ExpressionInterface[] * * @psalm-return ?T[] */ @@ -93,5 +87,8 @@ public function phpTypecast(mixed $value): mixed ); } + /** + * @psalm-return AbstractRangeColumn + */ abstract protected function getRangeColumn(): ColumnInterface; } diff --git a/src/Column/AbstractRangeColumn.php b/src/Column/AbstractRangeColumn.php index 61dd992e3..ba46977c8 100644 --- a/src/Column/AbstractRangeColumn.php +++ b/src/Column/AbstractRangeColumn.php @@ -7,12 +7,6 @@ use InvalidArgumentException; use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\Pgsql\Expression\DateRangeValue; -use Yiisoft\Db\Pgsql\Expression\Int4RangeValue; -use Yiisoft\Db\Pgsql\Expression\Int8RangeValue; -use Yiisoft\Db\Pgsql\Expression\NumRangeValue; -use Yiisoft\Db\Pgsql\Expression\TsRangeValue; -use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue; use Yiisoft\Db\Schema\Column\AbstractColumn; use Yiisoft\Db\Schema\Column\ColumnInterface; @@ -62,7 +56,7 @@ public function dbTypecast(mixed $value): mixed /** * @inheritDoc * - * @return null|Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue + * @return null|ExpressionInterface * * @psalm-return ?T */ @@ -94,8 +88,6 @@ abstract protected function getBoundColumn(): ColumnInterface; /** * @throws NotSupportedException * - * @return Int4RangeValue|Int8RangeValue|NumRangeValue|TsRangeValue|TsTzRangeValue|DateRangeValue - * * @psalm-return T */ abstract protected function createRangeValue( From a2408a10f05473baed9fb8c2e6425d875ff7d64b Mon Sep 17 00:00:00 2001 From: Tigrov Date: Sun, 14 Jun 2026 20:44:46 +0700 Subject: [PATCH 6/6] Update --- src/Column/AbstractRangeColumn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Column/AbstractRangeColumn.php b/src/Column/AbstractRangeColumn.php index ba46977c8..1c4a3fa8e 100644 --- a/src/Column/AbstractRangeColumn.php +++ b/src/Column/AbstractRangeColumn.php @@ -56,7 +56,7 @@ public function dbTypecast(mixed $value): mixed /** * @inheritDoc * - * @return null|ExpressionInterface + * @return ?ExpressionInterface * * @psalm-return ?T */