Skip to content

Commit f0b9e1a

Browse files
committed
PostgreSQL TypeMapper: assign real Min/Max values instead of server version
Server-side version has reduced fractions which can cause problems on comparison with .NET values.
1 parent 9d75199 commit f0b9e1a

1 file changed

Lines changed: 26 additions & 2 deletions

File tree

  • Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0

Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/TypeMapper.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ namespace Xtensive.Sql.Drivers.PostgreSql.v8_0
1818
{
1919
internal class TypeMapper : Sql.TypeMapper
2020
{
21+
// 6 fractions instead of .NET's 7
22+
private const long DateTimeMaxValueAdjustedTicks = 3155378975999999990;
23+
2124
protected readonly bool legacyTimestampBehaviorEnabled;
2225

2326
public override bool IsParameterCastRequired(Type type)
@@ -236,11 +239,34 @@ public override object ReadDecimal(DbDataReader reader, int index)
236239
return nativeReader.GetDecimal(index);
237240
}
238241

242+
public override object ReadDateTime(DbDataReader reader, int index)
243+
{
244+
var value = reader.GetDateTime(index);
245+
if (value.Ticks == 0)
246+
return DateTime.MinValue;
247+
if (value.Ticks == DateTimeMaxValueAdjustedTicks) {
248+
// To not ruin possible comparisons with defined value,
249+
// it is better to return definded value,
250+
// not the 6-digit version from PostgreSQL
251+
return DateTime.MaxValue;
252+
}
253+
return value;
254+
}
255+
239256
[SecuritySafeCritical]
240257
public override object ReadDateTimeOffset(DbDataReader reader, int index)
241258
{
242259
var nativeReader = (NpgsqlDataReader) reader;
243260
var value = nativeReader.GetFieldValue<DateTimeOffset>(index);
261+
if (value.Ticks == DateTimeMaxValueAdjustedTicks) {
262+
// To not ruin possible comparisons with defined values,
263+
// it is better to return definded value,
264+
// not the 6-fractions version from PostgreSQL
265+
return DateTimeOffset.MaxValue;
266+
}
267+
if (value.Ticks == 0)
268+
return DateTimeOffset.MinValue;
269+
244270
if (legacyTimestampBehaviorEnabled) {
245271
// Npgsql 4 or older behavior
246272
return value;
@@ -256,8 +282,6 @@ public override object ReadDateTimeOffset(DbDataReader reader, int index)
256282
// 'SET TIME ZONE' statement :-)
257283
//
258284
// We'll use local time, that's it! SET TIME ZONE will not work!
259-
if (value == DateTimeOffset.MinValue || value == DateTimeOffset.MaxValue)
260-
return value;
261285
return value.ToLocalTime();
262286
}
263287
}

0 commit comments

Comments
 (0)