@@ -64,37 +64,46 @@ protected function buildOnUpdate(string $onUpdate): string
6464
6565 protected function getDbType (ColumnInterface $ column ): string
6666 {
67+ $ dbType = $ column ->getDbType ();
6768 $ size = $ column ->getSize ();
69+ $ scale = $ column ->getScale ();
6870
6971 /** @psalm-suppress DocblockTypeContradiction */
70- return $ column ->getDbType () ?? match ($ column ->getType ()) {
71- ColumnType::BOOLEAN => 'number(1) ' ,
72- ColumnType::BIT => match (true ) {
73- $ size === null => 'number(38) ' ,
74- $ size <= 126 => 'number( ' . ceil (log10 (2 ** $ size )) . ') ' ,
75- default => 'raw( ' . ceil ($ size / 8 ) . ') ' ,
72+ return match ($ dbType ) {
73+ default => $ dbType ,
74+ null => match ($ column ->getType ()) {
75+ ColumnType::BOOLEAN => 'number(1) ' ,
76+ ColumnType::BIT => match (true ) {
77+ $ size === null => 'number(38) ' ,
78+ $ size <= 126 => 'number( ' . ceil (log10 (2 ** $ size )) . ') ' ,
79+ default => 'raw( ' . ceil ($ size / 8 ) . ') ' ,
80+ },
81+ ColumnType::TINYINT => 'number( ' . ($ size ?? 3 ) . ') ' ,
82+ ColumnType::SMALLINT => 'number( ' . ($ size ?? 5 ) . ') ' ,
83+ ColumnType::INTEGER => 'number( ' . ($ size ?? 10 ) . ') ' ,
84+ ColumnType::BIGINT => 'number( ' . ($ size ?? 20 ) . ') ' ,
85+ ColumnType::FLOAT => 'binary_float ' ,
86+ ColumnType::DOUBLE => 'binary_double ' ,
87+ ColumnType::DECIMAL => 'number( ' . ($ size ?? 10 ) . ', ' . ($ scale ?? 0 ) . ') ' ,
88+ ColumnType::MONEY => 'number( ' . ($ size ?? 19 ) . ', ' . ($ scale ?? 4 ) . ') ' ,
89+ ColumnType::CHAR => 'char ' ,
90+ ColumnType::STRING => 'varchar2( ' . ($ size ?? 255 ) . ') ' ,
91+ ColumnType::TEXT => 'clob ' ,
92+ ColumnType::BINARY => 'blob ' ,
93+ ColumnType::UUID => 'raw(16) ' ,
94+ ColumnType::DATETIME => 'timestamp ' ,
95+ ColumnType::TIMESTAMP => 'timestamp ' ,
96+ ColumnType::DATE => 'date ' ,
97+ ColumnType::TIME => 'interval day(0) to second ' ,
98+ ColumnType::ARRAY => 'clob ' ,
99+ ColumnType::STRUCTURED => 'clob ' ,
100+ ColumnType::JSON => 'clob ' ,
101+ default => 'varchar2 ' ,
76102 },
77- ColumnType::TINYINT => 'number( ' . ($ size ?? 3 ) . ') ' ,
78- ColumnType::SMALLINT => 'number( ' . ($ size ?? 5 ) . ') ' ,
79- ColumnType::INTEGER => 'number( ' . ($ size ?? 10 ) . ') ' ,
80- ColumnType::BIGINT => 'number( ' . ($ size ?? 20 ) . ') ' ,
81- ColumnType::FLOAT => 'binary_float ' ,
82- ColumnType::DOUBLE => 'binary_double ' ,
83- ColumnType::DECIMAL => 'number( ' . ($ size ?? 10 ) . ', ' . ($ column ->getScale () ?? 0 ) . ') ' ,
84- ColumnType::MONEY => 'number( ' . ($ size ?? 19 ) . ', ' . ($ column ->getScale () ?? 4 ) . ') ' ,
85- ColumnType::CHAR => 'char ' ,
86- ColumnType::STRING => 'varchar2( ' . ($ size ?? 255 ) . ') ' ,
87- ColumnType::TEXT => 'clob ' ,
88- ColumnType::BINARY => 'blob ' ,
89- ColumnType::UUID => 'raw(16) ' ,
90- ColumnType::DATETIME => 'timestamp ' ,
91- ColumnType::TIMESTAMP => 'timestamp ' ,
92- ColumnType::DATE => 'date ' ,
93- ColumnType::TIME => 'interval day(0) to second ' ,
94- ColumnType::ARRAY => 'clob ' ,
95- ColumnType::STRUCTURED => 'clob ' ,
96- ColumnType::JSON => 'clob ' ,
97- default => 'varchar2 ' ,
103+ 'timestamp with time zone ' => 'timestamp ' . ($ size !== null ? "( $ size) " : '' ) . ' with time zone ' ,
104+ 'timestamp with local time zone ' => 'timestamp ' . ($ size !== null ? "( $ size) " : '' ) . ' with local time zone ' ,
105+ 'interval day to second ' => 'interval day ' . ($ scale !== null ? "( $ scale) " : '' ) . ' to second ' . ($ size !== null ? "( $ size) " : '' ),
106+ 'interval year to month ' => 'interval year ' . ($ scale !== null ? "( $ scale) " : '' ) . ' to month ' ,
98107 };
99108 }
100109
0 commit comments