diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsDefaultValueTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsDefaultValueTests.cs index fc5f1931..826001ec 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsDefaultValueTests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsDefaultValueTests.cs @@ -28,8 +28,10 @@ public void GetColumns_DefaultValues_Succeeds() const string booleanColumnName1 = "booleancolumn1"; const string int32ColumnName1 = "int32column1"; const string int64ColumnName1 = "int64column1"; + const string int64ColumnName2 = "int64column2"; const string stringColumnName1 = "stringcolumn1"; const string binaryColumnName1 = "binarycolumn1"; + const string doubleColumnName1 = "doublecolumn1"; // Should be extended by remaining types Provider.AddTable(testTableName, @@ -43,8 +45,10 @@ public void GetColumns_DefaultValues_Succeeds() new Column(int32ColumnName1, DbType.Int32, defaultValue: 43), new Column(int64ColumnName1, DbType.Int64, defaultValue: 88), + new Column(int64ColumnName2, DbType.Int64, defaultValue: 0), new Column(stringColumnName1, DbType.String, defaultValue: "Hello"), - new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }) + new Column(binaryColumnName1, DbType.Binary, defaultValue: new byte[] { 12, 32, 34 }), + new Column(doubleColumnName1, DbType.Double, defaultValue: 84.874596565) ); // Act @@ -58,8 +62,10 @@ public void GetColumns_DefaultValues_Succeeds() var booleanColumn1 = columns.Single(x => x.Name == booleanColumnName1); var int32Column1 = columns.Single(x => x.Name == int32ColumnName1); var int64Column1 = columns.Single(x => x.Name == int64ColumnName1); + var int64Column2 = columns.Single(x => x.Name == int64ColumnName2); var stringColumn1 = columns.Single(x => x.Name == stringColumnName1); var binarycolumn1 = columns.Single(x => x.Name == binaryColumnName1); + var doubleColumn1 = columns.Single(x => x.Name == doubleColumnName1); Assert.That(dateTimeColumn1.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); Assert.That(dateTimeColumn2.DefaultValue, Is.EqualTo(dateTimeDefaultValue)); @@ -70,6 +76,7 @@ public void GetColumns_DefaultValues_Succeeds() Assert.That(int64Column1.DefaultValue, Is.EqualTo(88)); Assert.That(stringColumn1.DefaultValue, Is.EqualTo("Hello")); Assert.That(binarycolumn1.DefaultValue, Is.EqualTo(new byte[] { 12, 32, 34 })); + Assert.That(doubleColumn1.DefaultValue, Is.EqualTo(84.874596565)); } // 1 will coerce to true on inserts but not for default values in Postgre SQL - same for 0 to false diff --git a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsTypeTests.cs b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsTypeTests.cs index 8c169b08..aeaff598 100644 --- a/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsTypeTests.cs +++ b/src/Migrator.Tests/Providers/PostgreSQL/PostgreSQLTransformationProvider_GetColumnsTypeTests.cs @@ -24,6 +24,7 @@ public void GetColumns_DataTypeResolveSucceeds() const string stringColumnName1 = "stringcolumn1"; const string stringColumnName2 = "stringcolumn2"; const string binaryColumnName1 = "binarycolumn"; + const string doubleColumnName1 = "doublecolumn"; // Should be extended by remaining types Provider.AddTable(testTableName, @@ -36,7 +37,8 @@ public void GetColumns_DataTypeResolveSucceeds() new Column(int64ColumnName1, DbType.Int64), new Column(stringColumnName1, DbType.String), new Column(stringColumnName2, DbType.String) { Size = 30 }, - new Column(binaryColumnName1, DbType.Binary) + new Column(binaryColumnName1, DbType.Binary), + new Column(doubleColumnName1, DbType.Double) ); // Act @@ -52,6 +54,7 @@ public void GetColumns_DataTypeResolveSucceeds() var stringColumn1 = columns.Single(x => x.Name == stringColumnName1); var stringColumn2 = columns.Single(x => x.Name == stringColumnName2); var binaryColumn1 = columns.Single(x => x.Name == binaryColumnName1); + var doubleColumn1 = columns.Single(x => x.Name == doubleColumnName1); // Assert @@ -70,5 +73,6 @@ public void GetColumns_DataTypeResolveSucceeds() Assert.That(stringColumn2.Type, Is.EqualTo(DbType.String)); Assert.That(stringColumn2.Size, Is.EqualTo(30)); Assert.That(binaryColumn1.Type, Is.EqualTo(DbType.Binary)); + Assert.That(doubleColumn1.Type, Is.EqualTo(DbType.Double)); } } diff --git a/src/Migrator/Providers/Dialect.cs b/src/Migrator/Providers/Dialect.cs index 7a8d9e49..ac15af49 100644 --- a/src/Migrator/Providers/Dialect.cs +++ b/src/Migrator/Providers/Dialect.cs @@ -368,6 +368,10 @@ public virtual string Default(object defaultValue) var convertedString = BitConverter.ToString(byteArray).Replace("-", "").ToLower(); defaultValue = $"'\\x{convertedString}'"; } + else if (defaultValue is double doubleValue) + { + defaultValue = Convert.ToString(doubleValue, CultureInfo.InvariantCulture); + } return string.Format("DEFAULT {0}", defaultValue); } diff --git a/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs b/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs index 9cc1a855..b6698201 100644 --- a/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs +++ b/src/Migrator/Providers/Impl/PostgreSQL/PostgreSQLTransformationProvider.cs @@ -17,6 +17,7 @@ using System.Data; using System.Globalization; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using Index = DotNetProjects.Migrator.Framework.Index; @@ -295,6 +296,12 @@ public override Column[] GetColumns(string table) dbType = DbType.DateTimeOffset; precision = dateTimePrecision; } + else if (dataTypeString == "double precision") + { + dbType = DbType.Double; + scale = numericScale; + precision = numericPrecision; + } else if (dataTypeString == "timestamp" || dataTypeString == "timestamp without time zone") { // 6 is the maximum in PostgreSQL @@ -403,12 +410,12 @@ public override Column[] GetColumns(string table) } else if (column.Type == DbType.Double || column.Type == DbType.Single) { - column.DefaultValue = double.Parse(defaultValueString.ToString()); + column.DefaultValue = double.Parse(defaultValueString.ToString(), CultureInfo.InvariantCulture); } else if (column.Type == DbType.Boolean) { - var truthy = new[] { "1", "TRUE", "YES", "'true'", "on", "'on'", "t", "'t'" }; - var falsy = new[] { "0", "FALSE", "NO", "'false'", "off", "'off'", "f", "'f'" }; + var truthy = new[] { "TRUE", "YES", "'true'", "on", "'on'", "t", "'t'" }; + var falsy = new[] { "FALSE", "NO", "'false'", "off", "'off'", "f", "'f'" }; if (truthy.Any(x => x.Equals(defaultValueString.Trim(), StringComparison.OrdinalIgnoreCase))) {