From acc83e070371d8e53a967ed63cb7d8165ea659e3 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Wed, 1 Dec 2021 11:40:10 +0500 Subject: [PATCH 1/2] Change DATEDIFF to DATEDIFF_BIG for Sql Server v13+ --- .../Sql.Drivers.SqlServer/v09/Compiler.cs | 4 +- .../Sql.Drivers.SqlServer/v13/Compiler.cs | 41 +++++++++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs index afa56e569f..a427260840 100644 --- a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs +++ b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs @@ -379,12 +379,12 @@ public override void Visit(SqlCreateIndex node, IndexColumn item) #region Static helpers - private static SqlCast CastToLong(SqlExpression arg) + protected static SqlCast CastToLong(SqlExpression arg) { return SqlDml.Cast(arg, SqlType.Int64); } - private static SqlCast CastToDecimal(SqlExpression arg, short precision, short scale) + protected static SqlCast CastToDecimal(SqlExpression arg, short precision, short scale) { return SqlDml.Cast(arg, SqlType.Decimal, precision, scale); } diff --git a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v13/Compiler.cs b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v13/Compiler.cs index f345f33f0b..0c94d57e43 100644 --- a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v13/Compiler.cs +++ b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v13/Compiler.cs @@ -1,13 +1,48 @@ -// Copyright (C) 2018 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2018-2021 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2018.09.21 +using Xtensive.Sql.Dml; + namespace Xtensive.Sql.Drivers.SqlServer.v13 { internal class Compiler : v12.Compiler { + protected const string DayPart = "DAY"; + protected const string MillisecondPart = "MS"; + protected const string NanosecondPart = "NS"; + protected const string ZeroTime = "'00:00:00.0000000'"; + + /// + public override void Visit(SqlFunctionCall node) + { + if (node.FunctionType == SqlFunctionType.DateTimeOffsetTimeOfDay) { + DateTimeOffsetTimeOfDay(node.Arguments[0]).AcceptVisitor(this); + } + else { + base.Visit(node); + } + } + + protected override SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2) + { + return DateDiffBigNanosecond(date2, date1); + } + + #region Static Helpers + + protected static SqlUserFunctionCall DateDiffBigNanosecond(SqlExpression date1, SqlExpression date2) => + SqlDml.FunctionCall("DATEDIFF_BIG", SqlDml.Native(NanosecondPart), date1, date2); + + private static SqlExpression DateTimeOffsetTimeOfDay(SqlExpression dateTimeOffset) => + DateDiffBigNanosecond( + SqlDml.Native(ZeroTime), + SqlDml.Cast(dateTimeOffset, new SqlValueType("time"))); + + #endregion + public Compiler(SqlDriver driver) : base(driver) { From 17b009949634ad47fff2d8711b94d22f3a10a138 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Fri, 3 Dec 2021 14:56:42 +0500 Subject: [PATCH 2/2] Revert accessors change --- .../Sql.Drivers.SqlServer/v09/Compiler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs index a427260840..afa56e569f 100644 --- a/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs +++ b/Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/v09/Compiler.cs @@ -379,12 +379,12 @@ public override void Visit(SqlCreateIndex node, IndexColumn item) #region Static helpers - protected static SqlCast CastToLong(SqlExpression arg) + private static SqlCast CastToLong(SqlExpression arg) { return SqlDml.Cast(arg, SqlType.Int64); } - protected static SqlCast CastToDecimal(SqlExpression arg, short precision, short scale) + private static SqlCast CastToDecimal(SqlExpression arg, short precision, short scale) { return SqlDml.Cast(arg, SqlType.Decimal, precision, scale); }