@@ -660,6 +660,16 @@ public void QueryDate(string column, string dataTypeName, object[] expected)
660
660
#endif
661
661
}
662
662
663
+ #if NET6_0_OR_GREATER && ! BASELINE
664
+ [ Theory ]
665
+ [ InlineData ( "`Date`" , "DATE" , new object [ ] { null , "1000 01 01" , "9999 12 31" , null , "2016 04 05" } ) ]
666
+ public void QueryDateOnly ( string column , string dataTypeName , object [ ] expected )
667
+ {
668
+ DoQuery ( "times" , column , dataTypeName , ConvertToDateOnly ( expected ) , reader => reader . GetDateOnly ( column . Replace ( "`" , "" ) ) ,
669
+ matchesDefaultType : false , assertEqual : ( x , y ) => Assert . Equal ( ( DateOnly ) x , y is DateTime dt ? DateOnly . FromDateTime ( dt ) : ( DateOnly ) y ) ) ;
670
+ }
671
+ #endif
672
+
663
673
[ SkippableTheory ( ServerFeatures . ZeroDateTime ) ]
664
674
[ InlineData ( false ) ]
665
675
[ InlineData ( true ) ]
@@ -772,9 +782,23 @@ insert into date_time_kind(d, dt0, dt1, dt2, dt3, dt4, dt5, dt6) values(?, ?, ?,
772
782
[ InlineData ( "`Time`" , "TIME" , new object [ ] { null , "-838 -59 -59" , "838 59 59" , "0 0 0" , "0 14 3 4 567890" } ) ]
773
783
public void QueryTime ( string column , string dataTypeName , object [ ] expected )
774
784
{
775
- DoQuery ( "times" , column , dataTypeName , ConvertToTimeSpan ( expected ) , reader => reader . GetTimeSpan ( 0 ) ) ;
785
+ DoQuery ( "times" , column , dataTypeName , ConvertToTimeSpan ( expected ) , reader => reader . GetTimeSpan ( 0 )
786
+ #if BASELINE // https://bugs.mysql.com/bug.php?id=103801
787
+ , omitWherePrepareTest : true
788
+ #endif
789
+ ) ;
776
790
}
777
791
792
+ #if NET6_0_OR_GREATER && ! BASELINE
793
+ [ Theory ]
794
+ [ InlineData ( "TimeOnly" , "TIME" , new object [ ] { null , "0 0 0" , "0 23 59 59 999999" , "0 0 0" , "0 14 3 4 567890" } ) ]
795
+ public void QueryTimeOnly ( string column , string dataTypeName , object [ ] expected )
796
+ {
797
+ DoQuery ( "times" , column , dataTypeName , ConvertToTimeOnly ( expected ) , reader => reader . GetTimeOnly ( 0 ) ,
798
+ matchesDefaultType : false , assertEqual : ( x , y ) => Assert . Equal ( ( TimeOnly ) x , y is TimeSpan ts ? TimeOnly . FromTimeSpan ( ts ) : ( TimeOnly ) y ) ) ;
799
+ }
800
+ #endif
801
+
778
802
[ Theory ]
779
803
[ InlineData ( "`Year`" , "YEAR" , new object [ ] { null , 1901 , 2155 , 0 , 2016 } ) ]
780
804
public void QueryYear ( string column , string dataTypeName , object [ ] expected )
@@ -1543,13 +1567,14 @@ private void DoQuery(
1543
1567
Func < MySqlDataReader , object > getValue ,
1544
1568
object baselineCoercedNullValue = null ,
1545
1569
bool omitWhereTest = false ,
1570
+ bool omitWherePrepareTest = false ,
1546
1571
bool matchesDefaultType = true ,
1547
1572
MySqlConnection connection = null ,
1548
1573
Action < object , object > assertEqual = null ,
1549
1574
Type getFieldValueType = null ,
1550
1575
bool omitGetFieldValueTest = false )
1551
1576
{
1552
- DoQuery < GetValueWhenNullException > ( table , column , dataTypeName , expected , getValue , baselineCoercedNullValue , omitWhereTest , matchesDefaultType , connection , assertEqual , getFieldValueType , omitGetFieldValueTest ) ;
1577
+ DoQuery < GetValueWhenNullException > ( table , column , dataTypeName , expected , getValue , baselineCoercedNullValue , omitWhereTest , omitWherePrepareTest , matchesDefaultType , connection , assertEqual , getFieldValueType , omitGetFieldValueTest ) ;
1553
1578
}
1554
1579
1555
1580
// NOTE: baselineCoercedNullValue is to work around inconsistencies in mysql-connector-net; DBNull.Value will
@@ -1562,6 +1587,7 @@ private void DoQuery<TException>(
1562
1587
Func < MySqlDataReader , object > getValue ,
1563
1588
object baselineCoercedNullValue = null ,
1564
1589
bool omitWhereTest = false ,
1590
+ bool omitWherePrepareTest = false ,
1565
1591
bool matchesDefaultType = true ,
1566
1592
MySqlConnection connection = null ,
1567
1593
Action < object , object > assertEqual = null ,
@@ -1639,8 +1665,31 @@ private void DoQuery<TException>(
1639
1665
cmd . Parameters . Add ( p ) ;
1640
1666
var result = cmd . ExecuteScalar ( ) ;
1641
1667
Assert . Equal ( Array . IndexOf ( expected , p . Value ) + 1 , result ) ;
1668
+
1669
+ if ( ! omitWherePrepareTest )
1670
+ {
1671
+ cmd . Prepare ( ) ;
1672
+ result = cmd . ExecuteScalar ( ) ;
1673
+ Assert . Equal ( Array . IndexOf ( expected , p . Value ) + 1 , result ) ;
1674
+ }
1675
+ }
1676
+ }
1677
+
1678
+ #if NET6_0_OR_GREATER
1679
+ private static object [ ] ConvertToDateOnly ( object [ ] input )
1680
+ {
1681
+ var output = new object [ input . Length ] ;
1682
+ for ( int i = 0 ; i < input . Length ; i ++ )
1683
+ {
1684
+ var value = SplitAndParse ( input [ i ] ) ;
1685
+ if ( value ? . Length == 3 )
1686
+ output [ i ] = new DateOnly ( value [ 0 ] , value [ 1 ] , value [ 2 ] ) ;
1687
+ else if ( value is not null )
1688
+ throw new NotSupportedException ( "Can't convert to DateOnly" ) ;
1642
1689
}
1690
+ return output ;
1643
1691
}
1692
+ #endif
1644
1693
1645
1694
private static object [ ] ConvertToDateTime ( object [ ] input , DateTimeKind kind )
1646
1695
{
@@ -1670,6 +1719,27 @@ private static object[] ConvertToDateTimeOffset(object[] input)
1670
1719
return output ;
1671
1720
}
1672
1721
1722
+ #if NET6_0_OR_GREATER
1723
+ private static object [ ] ConvertToTimeOnly ( object [ ] input )
1724
+ {
1725
+ var output = new object [ input . Length ] ;
1726
+ for ( int i = 0 ; i < input . Length ; i ++ )
1727
+ {
1728
+ var value = SplitAndParse ( input [ i ] ) ;
1729
+ if ( value ? . Length == 3 )
1730
+ {
1731
+ output [ i ] = new TimeOnly ( value [ 0 ] , value [ 1 ] , value [ 2 ] ) ;
1732
+ }
1733
+ else if ( value ? . Length == 5 )
1734
+ {
1735
+ Assert . Equal ( 0 , value [ 0 ] ) ;
1736
+ output [ i ] = new TimeOnly ( value [ 1 ] , value [ 2 ] , value [ 3 ] , value [ 4 ] / 1000 ) . Add ( TimeSpan . FromTicks ( value [ 4 ] % 1000 * 10 ) ) ;
1737
+ }
1738
+ }
1739
+ return output ;
1740
+ }
1741
+ #endif
1742
+
1673
1743
private static object [ ] ConvertToTimeSpan ( object [ ] input )
1674
1744
{
1675
1745
var output = new object [ input . Length ] ;
0 commit comments