1010using Xtensive . Sql . Ddl ;
1111using Xtensive . Sql . Dml ;
1212using Xtensive . Core ;
13+ using System . Collections . Generic ;
1314
1415namespace 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