44
55namespace Yiisoft \Db \Oracle \Column ;
66
7+ use LogicException ;
78use Yiisoft \Db \Constant \ColumnType ;
89use Yiisoft \Db \Constant \ReferentialAction ;
910use Yiisoft \Db \Exception \NotSupportedException ;
1011use Yiisoft \Db \QueryBuilder \AbstractColumnDefinitionBuilder ;
1112use Yiisoft \Db \Schema \Column \ColumnInterface ;
13+ use Yiisoft \Db \Schema \Column \EnumColumn ;
1214
1315use function ceil ;
16+ use function in_array ;
1417use function log10 ;
1518use function strtoupper ;
1619
@@ -61,23 +64,20 @@ protected function buildCheck(ColumnInterface $column): string
6164
6265 if (empty ($ check )) {
6366 $ name = $ column ->getName ();
64-
65- if (empty ($ name )) {
66- return '' ;
67+ if (!empty ($ name )) {
68+ $ type = $ column ->getType ();
69+ if (in_array ($ type , [ColumnType::ARRAY , ColumnType::STRUCTURED , ColumnType::JSON ], true )) {
70+ return version_compare ($ this ->queryBuilder ->getServerInfo ()->getVersion (), '21 ' , '< ' )
71+ ? ' CHECK ( ' . $ this ->queryBuilder ->getQuoter ()->quoteSimpleColumnName ($ name ) . ' IS JSON) '
72+ : '' ;
73+ }
74+ if ($ type === ColumnType::BOOLEAN ) {
75+ return ' CHECK ( ' . $ this ->queryBuilder ->getQuoter ()->quoteSimpleColumnName ($ name ) . ' IN (0,1)) ' ;
76+ }
6777 }
68-
69- return match ($ column ->getType ()) {
70- ColumnType::ARRAY , ColumnType::STRUCTURED , ColumnType::JSON
71- => version_compare ($ this ->queryBuilder ->getServerInfo ()->getVersion (), '21 ' , '< ' )
72- ? ' CHECK ( ' . $ this ->queryBuilder ->getQuoter ()->quoteSimpleColumnName ($ name ) . ' IS JSON) '
73- : '' ,
74- ColumnType::BOOLEAN
75- => ' CHECK ( ' . $ this ->queryBuilder ->getQuoter ()->quoteSimpleColumnName ($ name ) . ' IN (0,1)) ' ,
76- default => '' ,
77- };
7878 }
7979
80- return " CHECK ( $ check ) " ;
80+ return parent :: buildCheck ( $ column ) ;
8181 }
8282
8383 protected function buildOnDelete (string $ onDelete ): string
@@ -133,6 +133,7 @@ protected function getDbType(ColumnInterface $column): string
133133 => version_compare ($ this ->queryBuilder ->getServerInfo ()->getVersion (), '21 ' , '>= ' )
134134 ? 'json '
135135 : 'clob ' ,
136+ ColumnType::ENUM => 'varchar2( ' . $ this ->calcEnumSize ($ column ) . ' BYTE) ' ,
136137 default => 'varchar2 ' ,
137138 },
138139 'timestamp with time zone ' => 'timestamp ' . ($ size !== null ? "( $ size) " : '' ) . ' with time zone ' ,
@@ -146,4 +147,23 @@ protected function getDefaultUuidExpression(): string
146147 {
147148 return 'sys_guid() ' ;
148149 }
150+
151+ private function calcEnumSize (ColumnInterface $ column ): int
152+ {
153+ $ size = $ column ->getSize ();
154+ if ($ size !== null ) {
155+ return $ size ;
156+ }
157+
158+ if ($ column instanceof EnumColumn) {
159+ return max (
160+ array_map (
161+ strlen (...),
162+ $ column ->getValues (),
163+ ),
164+ );
165+ }
166+
167+ throw new LogicException ('Cannot calculate enum size. Set the size explicitly or use `EnumColumn` instance. ' );
168+ }
149169}
0 commit comments