From 58ff09af96aca33195f670f9457a1b3d229ed9f8 Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Wed, 19 Jan 2022 22:26:34 +1300 Subject: [PATCH] Fix schema validator for Npgsql 5 --- src/NHibernate.Test/NHibernate.Test.csproj | 2 +- .../Dialect/Schema/PostgreSQLMetadata.cs | 38 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index 84d9e58e8ef..e73002ebb6e 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -64,7 +64,7 @@ - + diff --git a/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs b/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs index 74796bc8dbb..f7afe9efb42 100644 --- a/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs +++ b/src/NHibernate/Dialect/Schema/PostgreSQLMetadata.cs @@ -138,7 +138,43 @@ public PostgreSQLColumnMetadata(DataRow rs) this.SetNumericalPrecision(rs["NUMERIC_PRECISION"]); Nullable = Convert.ToString(rs["IS_NULLABLE"]); - TypeName = Convert.ToString(rs["DATA_TYPE"]); + TypeName = NormalizeTypeNames(Convert.ToString(rs["DATA_TYPE"])); + } + + private static string NormalizeTypeNames(string typeName) + { + switch (typeName) + { + case "double precision": + return "float8"; + case "real": + return "float4"; + case "smallint": + return "int2"; + case "integer": + return "int4"; + case "bigint": + return "int8"; + } + + if (typeName.StartsWith("character", StringComparison.Ordinal)) + { + return typeName.Replace("character varying", "varchar").Replace("character", "char"); + } + + if (typeName.EndsWith(" with time zone", StringComparison.Ordinal)) + { + return typeName.StartsWith("timestamp", StringComparison.Ordinal) + ? typeName.Replace(" with time zone", string.Empty).Replace("timestamp", "timestamptz") + : typeName.Replace(" with time zone", string.Empty).Replace("time", "timetz"); + } + + if (typeName.EndsWith(" without time zone", StringComparison.Ordinal)) + { + return typeName.Replace(" without time zone", string.Empty); + } + + return typeName; } }