Skip to content

Commit de92f46

Browse files
committed
Firebird: support for TimeOnly(ticks)
1 parent 5845d50 commit de92f46

1 file changed

Lines changed: 52 additions & 13 deletions

File tree

  • Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5

Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Compiler.cs

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Xtensive.Sql.Ddl;
1111
using Xtensive.Sql.Dml;
1212
using Xtensive.Core;
13+
using System.Collections.Generic;
1314

1415
namespace Xtensive.Sql.Drivers.Firebird.v2_5
1516
{
@@ -228,10 +229,7 @@ public override void Visit(SqlFunctionCall node)
228229
Visit(DateAddYear(arguments[0], arguments[1]));
229230
return;
230231
case SqlFunctionType.DateTimeConstruct:
231-
Visit(DateAddDay(DateAddMonth(DateAddYear(SqlDml.Cast(SqlDml.Literal(new DateTime(2001, 1, 1)), SqlType.DateTime),
232-
arguments[0] - 2001),
233-
arguments[1] - 1),
234-
arguments[2] - 1));
232+
ConstructDateTime(arguments).AcceptVisitor(this);
235233
return;
236234
#if NET6_0_OR_GREATER
237235
case SqlFunctionType.DateAddYears:
@@ -244,10 +242,7 @@ public override void Visit(SqlFunctionCall node)
244242
Visit(DateAddDay(arguments[0], arguments[1]));
245243
return;
246244
case SqlFunctionType.DateConstruct:
247-
Visit(DateAddDay(DateAddMonth(DateAddYear(SqlDml.Cast(SqlDml.Literal(new DateOnly(2001, 1, 1)), SqlType.Date),
248-
arguments[0] - 2001),
249-
arguments[1] - 1),
250-
arguments[2] - 1));
245+
ConstructDate(arguments).AcceptVisitor(this);
251246
return;
252247
case SqlFunctionType.TimeAddHours:
253248
Visit(DateAddHour(node.Arguments[0], node.Arguments[1]));
@@ -256,11 +251,7 @@ public override void Visit(SqlFunctionCall node)
256251
Visit(DateAddMinute(node.Arguments[0], node.Arguments[1]));
257252
return;
258253
case SqlFunctionType.TimeConstruct:
259-
Visit(DateAddMillisecond(DateAddSecond(DateAddMinute(DateAddHour(SqlDml.Cast(SqlDml.Literal(new TimeOnly(0, 0, 0)), SqlType.Time),
260-
arguments[0]),
261-
arguments[1]),
262-
arguments[2]),
263-
arguments[3]));
254+
ConstructTime(arguments).AcceptVisitor(this);
264255
return;
265256
case SqlFunctionType.DateToString:
266257
Visit(DateToString(arguments[0]));
@@ -299,6 +290,54 @@ public override void Visit(SqlAlterSequence node)
299290
translator.Translate(context, node, NodeSection.Exit);
300291
}
301292

293+
protected virtual SqlExpression ConstructDateTime(IReadOnlyList<SqlExpression> arguments)
294+
{
295+
return DateAddDay(
296+
DateAddMonth(
297+
DateAddYear(
298+
SqlDml.Cast(SqlDml.Literal(new DateTime(2001, 1, 1)), SqlType.DateTime),
299+
arguments[0] - 2001),
300+
arguments[1] - 1),
301+
arguments[2] - 1);
302+
}
303+
#if NET6_0_OR_GREATER
304+
305+
protected virtual SqlExpression ConstructDate(IReadOnlyList<SqlExpression> arguments)
306+
{
307+
return DateAddDay(
308+
DateAddMonth(
309+
DateAddYear(
310+
SqlDml.Cast(SqlDml.Literal(new DateOnly(2001, 1, 1)), SqlType.Date),
311+
arguments[0] - 2001),
312+
arguments[1] - 1),
313+
arguments[2] - 1);
314+
}
315+
316+
protected virtual SqlExpression ConstructTime(IReadOnlyList<SqlExpression> arguments)
317+
{
318+
if (arguments.Count == 4) {
319+
return DateAddMillisecond(
320+
DateAddSecond(
321+
DateAddMinute(
322+
DateAddHour(
323+
SqlDml.Cast(SqlDml.Literal(new TimeOnly(0, 0, 0)), SqlType.Time),
324+
arguments[0]),
325+
arguments[1]),
326+
arguments[2]),
327+
arguments[3]);
328+
}
329+
else if (arguments.Count == 1) {
330+
var ticks = arguments[0];
331+
return TimeAddInterval(
332+
SqlDml.Cast(SqlDml.Literal(new TimeOnly(0, 0, 0, 0)), SqlType.Time),
333+
SqlHelper.IsTimeSpanTicks(ticks, out var sourceInterval) ? sourceInterval : ticks * 100);
334+
}
335+
else {
336+
throw new InvalidOperationException("Unsupported count of parameters");
337+
}
338+
}
339+
#endif
340+
302341
#region Static helpers
303342

304343
protected static SqlExpression DateTimeSubtractDateTime(SqlExpression date1, SqlExpression date2)

0 commit comments

Comments
 (0)