Skip to content

Commit 92fad9b

Browse files
authored
Fix building range-type columns (#484)
1 parent 9d292ab commit 92fad9b

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- Enh #482: Improve performance of `SqlParser::getNextPlaceholder()` method (@Tigrov)
66
- Chg #483: Bump `yiisoft/db` version to `^2.0.1` (@vjik)
7+
- Bug #484: Fix building range-type column definitions (@Tigrov)
78

89
## 2.0.1 February 07, 2026
910

src/Column/ColumnDefinitionBuilder.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Yiisoft\Db\Constant\ColumnType;
88
use Yiisoft\Db\Exception\NotSupportedException;
9+
use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
910
use Yiisoft\Db\QueryBuilder\AbstractColumnDefinitionBuilder;
1011
use Yiisoft\Db\Schema\Column\AbstractArrayColumn;
1112
use Yiisoft\Db\Schema\Column\CollatableColumnInterface;
@@ -123,6 +124,18 @@ protected function getDbType(ColumnInterface $column): string
123124
ColumnType::STRUCTURED => 'jsonb',
124125
ColumnType::JSON => 'jsonb',
125126
ColumnType::ENUM => 'varchar',
127+
PgsqlColumnType::INT4RANGE => 'int4range',
128+
PgsqlColumnType::INT8RANGE => 'int8range',
129+
PgsqlColumnType::NUMRANGE => 'numrange',
130+
PgsqlColumnType::TSRANGE => 'tsrange',
131+
PgsqlColumnType::TSTZRANGE => 'tstzrange',
132+
PgsqlColumnType::DATERANGE => 'daterange',
133+
PgsqlColumnType::INT4MULTIRANGE => 'int4multirange',
134+
PgsqlColumnType::INT8MULTIRANGE => 'int8multirange',
135+
PgsqlColumnType::NUMMULTIRANGE => 'nummultirange',
136+
PgsqlColumnType::TSMULTIRANGE => 'tsmultirange',
137+
PgsqlColumnType::TSTZMULTIRANGE => 'tstzmultirange',
138+
PgsqlColumnType::DATEMULTIRANGE => 'datemultirange',
126139
default => 'varchar',
127140
},
128141
'timestamp without time zone' => 'timestamp',

tests/Provider/QueryBuilderProvider.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,9 @@ public static function buildColumnDefinition(): array
455455
ColumnBuilder::string()->collation('C'),
456456
];
457457

458-
if (version_compare(TestConnection::getServerVersion(), '13', '<')) {
458+
$serverVersion = TestConnection::getServerVersion();
459+
460+
if (version_compare($serverVersion, '13', '<')) {
459461
$uuidExpression = "uuid_in(overlay(overlay(md5(now()::text || random()::text) placing '4' from 13) placing"
460462
. ' to_hex(floor(4 * random() + 8)::int)::text from 17)::cstring)';
461463

@@ -464,6 +466,19 @@ public static function buildColumnDefinition(): array
464466
$values['uuidPrimaryKey()'][0] = "uuid PRIMARY KEY DEFAULT $uuidExpression";
465467
}
466468

469+
if (version_compare($serverVersion, '14', '>=')) {
470+
$multiRangeTypes = [
471+
['int4multirange', ColumnBuilder::int4MultiRange()],
472+
['int8multirange', ColumnBuilder::int8MultiRange()],
473+
['nummultirange', ColumnBuilder::numMultiRange()],
474+
['tsmultirange', ColumnBuilder::tsMultiRange()],
475+
['tstzmultirange', ColumnBuilder::tsTzMultiRange()],
476+
['datemultirange', ColumnBuilder::dateMultiRange()],
477+
];
478+
} else {
479+
$multiRangeTypes = [];
480+
}
481+
467482
return [
468483
...$values,
469484
['text[]', ColumnBuilder::array()->dbType('text[]')],
@@ -474,6 +489,13 @@ public static function buildColumnDefinition(): array
474489
['timestamptz', 'timestamp with time zone'],
475490
['time(3)', 'time(3) without time zone'],
476491
['timetz(0)', 'time(0) with time zone'],
492+
['int4range', ColumnBuilder::int4Range()],
493+
['int8range', ColumnBuilder::int8Range()],
494+
['numrange', ColumnBuilder::numRange()],
495+
['tsrange', ColumnBuilder::tsRange()],
496+
['tstzrange', ColumnBuilder::tsTzRange()],
497+
['daterange', ColumnBuilder::dateRange()],
498+
...$multiRangeTypes,
477499
];
478500
}
479501

0 commit comments

Comments
 (0)