@@ -1740,3 +1740,81 @@ func TestCastArrayFunc(t *testing.T) {
1740
1740
}
1741
1741
}
1742
1742
}
1743
+
1744
+ func TestCastAsCharFieldType (t * testing.T ) {
1745
+ type testCase struct {
1746
+ input * Constant
1747
+ resultFlen int
1748
+ }
1749
+ allTestCase := []testCase {
1750
+ // test int
1751
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeTiny ).BuildP (), Value : types .NewIntDatum (0 )}, 4 },
1752
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeShort ).BuildP (), Value : types .NewIntDatum (0 )}, 6 },
1753
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeInt24 ).BuildP (), Value : types .NewIntDatum (0 )}, 9 },
1754
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeLong ).BuildP (), Value : types .NewIntDatum (0 )}, 11 },
1755
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeLonglong ).BuildP (), Value : types .NewIntDatum (0 )}, 20 },
1756
+ // test uint
1757
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeTiny ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewUintDatum (0 )}, 3 },
1758
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeShort ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewUintDatum (1 )}, 5 },
1759
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeInt24 ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewUintDatum (11111 )}, 8 },
1760
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeLong ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewUintDatum (1111111111 )}, 10 },
1761
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeLonglong ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewUintDatum (111111111111111 )}, 20 },
1762
+ // test decimal
1763
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeNewDecimal ).SetFlen (10 ).SetDecimal (5 ).BuildP (), Value : types .NewDecimalDatum (types .NewDecFromStringForTest ("12345" ))}, 12 },
1764
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeNewDecimal ).SetFlen (2 ).SetDecimal (1 ).BuildP (), Value : types .NewDecimalDatum (types .NewDecFromStringForTest ("1" ))}, 4 },
1765
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeNewDecimal ).SetFlen (30 ).SetDecimal (0 ).BuildP (), Value : types .NewDecimalDatum (types .NewDecFromStringForTest ("12345" ))}, 31 },
1766
+ // test unsigned decimal
1767
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeNewDecimal ).SetFlen (10 ).SetDecimal (5 ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewDecimalDatum (types .NewDecFromStringForTest ("12345" ))}, 11 },
1768
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeNewDecimal ).SetFlen (2 ).SetDecimal (1 ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewDecimalDatum (types .NewDecFromStringForTest ("1" ))}, 3 },
1769
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeNewDecimal ).SetFlen (30 ).SetDecimal (0 ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewDecimalDatum (types .NewDecFromStringForTest ("12345" ))}, 30 },
1770
+ // test real
1771
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeFloat ).BuildP (), Value : types .NewFloat64Datum (1.234 )}, 12 },
1772
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDouble ).BuildP (), Value : types .NewFloat64Datum (1.23456789 )}, 22 },
1773
+ // test unsigned real
1774
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeFloat ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewFloat64Datum (1.234 )}, 12 },
1775
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDouble ).SetFlag (mysql .UnsignedFlag ).BuildP (), Value : types .NewFloat64Datum (1.23456789 )}, 22 },
1776
+ // test timestamp
1777
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeTimestamp ).SetFlen (types .UnspecifiedLength ).SetDecimal (0 ).BuildP (), Value : types .NewTimeDatum (types .NewTime (types .FromDate (2020 , 10 , 10 , 10 , 10 , 10 , 110 ), mysql .TypeTimestamp , 0 ))}, 19 },
1778
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeTimestamp ).SetFlen (types .UnspecifiedLength ).SetDecimal (3 ).BuildP (), Value : types .NewTimeDatum (types .NewTime (types .FromDate (2020 , 10 , 10 , 10 , 10 , 10 , 110 ), mysql .TypeTimestamp , 0 ))}, 23 },
1779
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeTimestamp ).SetFlen (types .UnspecifiedLength ).SetDecimal (6 ).BuildP (), Value : types .NewTimeDatum (types .NewTime (types .FromDate (2020 , 10 , 10 , 10 , 10 , 10 , 110 ), mysql .TypeTimestamp , 0 ))}, 26 },
1780
+ // test datetime
1781
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDatetime ).SetFlen (types .UnspecifiedLength ).SetDecimal (0 ).BuildP (), Value : types .NewTimeDatum (types .NewTime (types .FromDate (2020 , 10 , 10 , 10 , 10 , 10 , 110 ), mysql .TypeDatetime , 0 ))}, 19 },
1782
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDatetime ).SetFlen (types .UnspecifiedLength ).SetDecimal (3 ).BuildP (), Value : types .NewTimeDatum (types .NewTime (types .FromDate (2020 , 10 , 10 , 10 , 10 , 10 , 110 ), mysql .TypeDatetime , 0 ))}, 23 },
1783
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDatetime ).SetFlen (types .UnspecifiedLength ).SetDecimal (6 ).BuildP (), Value : types .NewTimeDatum (types .NewTime (types .FromDate (2020 , 10 , 10 , 10 , 10 , 10 , 110 ), mysql .TypeDatetime , 0 ))}, 26 },
1784
+ // test time
1785
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDuration ).SetFlen (types .UnspecifiedLength ).SetDecimal (0 ).BuildP (), Value : types .NewDurationDatum (types .NewDuration (10 , 10 , 10 , 110 , 0 ))}, 10 },
1786
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDuration ).SetFlen (types .UnspecifiedLength ).SetDecimal (3 ).BuildP (), Value : types .NewDurationDatum (types .NewDuration (10 , 10 , 10 , 110 , 3 ))}, 14 },
1787
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDuration ).SetFlen (types .UnspecifiedLength ).SetDecimal (6 ).BuildP (), Value : types .NewDurationDatum (types .NewDuration (10 , 10 , 10 , 110 , 6 ))}, 17 },
1788
+ // test date
1789
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeDate ).SetFlen (types .UnspecifiedLength ).SetDecimal (0 ).BuildP (), Value : types .NewTimeDatum (types .NewTime (types .FromDate (2020 , 10 , 10 , 10 , 10 , 10 , 110 ), mysql .TypeDate , 0 ))}, 10 },
1790
+ // test json
1791
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeJSON ).BuildP (), Value : types .NewJSONDatum (types .CreateBinaryJSON (int64 (1 )))}, 4294967295 },
1792
+ // test string
1793
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeString ).SetFlen (50 ).SetCollate ("binary" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 50 },
1794
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeString ).SetFlen (50 ).SetCollate ("utf8mb4_bin" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 50 },
1795
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeVarString ).SetFlen (50 ).SetCollate ("binary" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 50 },
1796
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeVarString ).SetFlen (50 ).SetCollate ("utf8mb4_bin" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 50 },
1797
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeTinyBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("binary" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 255 },
1798
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeTinyBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("utf8mb4_bin" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 255 },
1799
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("binary" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 262140 },
1800
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("utf8mb4_bin" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 262140 },
1801
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeMediumBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("binary" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 67108860 },
1802
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeMediumBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("utf8mb4_bin" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 67108860 },
1803
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeLongBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("binary" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 4294967295 },
1804
+ {& Constant {RetType : types .NewFieldTypeBuilder ().SetType (mysql .TypeLongBlob ).SetFlen (types .UnspecifiedLength ).SetCollate ("utf8mb4_bin" ).BuildP (), Value : types .NewStringDatum ("abcde" )}, 4294967295 },
1805
+ }
1806
+ ctx := createContext (t )
1807
+ for i , tc := range allTestCase {
1808
+ t .Run (fmt .Sprintf ("case %d" , i ), func (t * testing.T ) {
1809
+ ft := types .NewFieldTypeBuilder ().
1810
+ SetType (mysql .TypeString ).
1811
+ SetFlen (types .UnspecifiedLength ).
1812
+ SetCharset (charset .CharsetUTF8MB4 ).
1813
+ SetCollate (charset .CollationUTF8MB4 ).
1814
+ BuildP ()
1815
+ expr , err := BuildCastFunctionWithCheck (ctx , tc .input , ft , false , false )
1816
+ require .NoError (t , err )
1817
+ require .Equal (t , tc .resultFlen , expr .GetType (ctx ).GetFlen ())
1818
+ })
1819
+ }
1820
+ }
0 commit comments