@@ -11,6 +11,7 @@ import {
1111 JsonAlterColumnDropNotNullStatement ,
1212 JsonAlterColumnDropOnUpdateStatement ,
1313 JsonAlterColumnDropPrimaryKeyStatement ,
14+ JsonAlterColumnPgTypeStatement ,
1415 JsonAlterColumnSetAutoincrementStatement ,
1516 JsonAlterColumnSetDefaultStatement ,
1617 JsonAlterColumnSetGeneratedStatement ,
@@ -1456,33 +1457,53 @@ class AlterRenameTypeConvertor extends Convertor {
14561457}
14571458
14581459class AlterTypeDropValueConvertor extends Convertor {
1459- can ( statement : JsonStatement ) : boolean {
1460+ can ( statement : JsonDropValueFromEnumStatement ) : boolean {
14601461 return statement . type === 'alter_type_drop_value' ;
14611462 }
14621463
14631464 convert ( st : JsonDropValueFromEnumStatement ) {
1464- const { columnsWithEnum, name, newValues, schema } = st ;
1465+ const { columnsWithEnum, name, newValues, enumSchema } = st ;
14651466
14661467 const statements : string [ ] = [ ] ;
14671468
14681469 for ( const withEnum of columnsWithEnum ) {
1470+ const tableNameWithSchema = withEnum . tableSchema
1471+ ? `"${ withEnum . tableSchema } "."${ withEnum . table } "`
1472+ : `"${ withEnum . table } "` ;
1473+
14691474 statements . push (
1470- `ALTER TABLE " ${ withEnum . schema } "." ${ withEnum . table } " ALTER COLUMN "${ withEnum . column } " SET DATA TYPE text;` ,
1475+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ withEnum . column } " SET DATA TYPE text;` ,
14711476 ) ;
1477+ if ( withEnum . default ) {
1478+ statements . push (
1479+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ withEnum . column } " SET DEFAULT ${ withEnum . default } ::text;` ,
1480+ ) ;
1481+ }
14721482 }
14731483
1474- statements . push ( new DropTypeEnumConvertor ( ) . convert ( { name : name , schema, type : 'drop_type_enum' } ) ) ;
1484+ statements . push ( new DropTypeEnumConvertor ( ) . convert ( { name : name , schema : enumSchema , type : 'drop_type_enum' } ) ) ;
14751485
14761486 statements . push ( new CreateTypeEnumConvertor ( ) . convert ( {
14771487 name : name ,
1478- schema : schema ,
1488+ schema : enumSchema ,
14791489 values : newValues ,
14801490 type : 'create_type_enum' ,
14811491 } ) ) ;
14821492
14831493 for ( const withEnum of columnsWithEnum ) {
1494+ const tableNameWithSchema = withEnum . tableSchema
1495+ ? `"${ withEnum . tableSchema } "."${ withEnum . table } "`
1496+ : `"${ withEnum . table } "` ;
1497+
1498+ const parsedType = parseType ( `"${ enumSchema } ".` , withEnum . columnType ) ;
1499+ if ( withEnum . default ) {
1500+ statements . push (
1501+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ withEnum . column } " SET DEFAULT ${ withEnum . default } ::${ parsedType } ;` ,
1502+ ) ;
1503+ }
1504+
14841505 statements . push (
1485- `ALTER TABLE " ${ withEnum . schema } "." ${ withEnum . table } " ALTER COLUMN "${ withEnum . column } " SET DATA TYPE " ${ schema } "." ${ name } " USING "${ withEnum . column } "::" ${ schema } "." ${ name } " ;` ,
1506+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ withEnum . column } " SET DATA TYPE ${ parsedType } USING "${ withEnum . column } "::${ parsedType } ;` ,
14861507 ) ;
14871508 }
14881509
@@ -1871,19 +1892,71 @@ export class SQLiteAlterTableAddColumnConvertor extends Convertor {
18711892class PgAlterTableAlterColumnSetTypeConvertor extends Convertor {
18721893 can ( statement : JsonStatement , dialect : Dialect ) : boolean {
18731894 return (
1874- statement . type === 'alter_table_alter_column_set_type '
1895+ statement . type === 'pg_alter_table_alter_column_set_type '
18751896 && dialect === 'postgresql'
18761897 ) ;
18771898 }
18781899
1879- convert ( statement : JsonAlterColumnTypeStatement ) {
1880- const { tableName, columnName, newDataType, schema } = statement ;
1900+ convert ( statement : JsonAlterColumnPgTypeStatement ) {
1901+ const { tableName, columnName, newDataType, schema, oldDataType , columnDefault , typeSchema } = statement ;
18811902
18821903 const tableNameWithSchema = schema
18831904 ? `"${ schema } "."${ tableName } "`
18841905 : `"${ tableName } "` ;
18851906
1886- return `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DATA TYPE ${ newDataType } ;` ;
1907+ const statements : string [ ] = [ ] ;
1908+
1909+ const type = parseType ( `"${ typeSchema } ".` , newDataType . name ) ;
1910+
1911+ if ( ! oldDataType . isEnum && ! newDataType . isEnum ) {
1912+ statements . push (
1913+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DATA TYPE ${ type } ;` ,
1914+ ) ;
1915+ if ( columnDefault ) {
1916+ statements . push (
1917+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DEFAULT ${ columnDefault } ;` ,
1918+ ) ;
1919+ }
1920+ }
1921+
1922+ if ( oldDataType . isEnum && ! newDataType . isEnum ) {
1923+ statements . push (
1924+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DATA TYPE ${ type } ;` ,
1925+ ) ;
1926+ if ( columnDefault ) {
1927+ statements . push (
1928+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DEFAULT ${ columnDefault } ;` ,
1929+ ) ;
1930+ }
1931+ }
1932+
1933+ if ( ! oldDataType . isEnum && newDataType . isEnum ) {
1934+ if ( columnDefault ) {
1935+ statements . push (
1936+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DEFAULT ${ columnDefault } ::${ type } ;` ,
1937+ ) ;
1938+ }
1939+ statements . push (
1940+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DATA TYPE ${ type } USING "${ columnName } "::${ type } ;` ,
1941+ ) ;
1942+ }
1943+
1944+ if ( oldDataType . isEnum && newDataType . isEnum ) {
1945+ const alterType =
1946+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DATA TYPE ${ type } USING "${ columnName } "::text::${ type } ;` ;
1947+
1948+ if ( newDataType . name !== oldDataType . name && columnDefault ) {
1949+ statements . push (
1950+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " DROP DEFAULT;` ,
1951+ alterType ,
1952+ `ALTER TABLE ${ tableNameWithSchema } ALTER COLUMN "${ columnName } " SET DEFAULT ${ columnDefault } ;` ,
1953+ ) ;
1954+ } else {
1955+ statements . push ( alterType ) ;
1956+ }
1957+ }
1958+
1959+ return statements ;
18871960 }
18881961}
18891962
0 commit comments