diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/Duckdb/DuckdbCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/Duckdb/DuckdbCodeFirstTest.cs index 5bc66763e..45570334d 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/Duckdb/DuckdbCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/Duckdb/DuckdbCodeFirstTest.cs @@ -21,6 +21,7 @@ namespace FreeSql.Tests.Duckdb public void CompositeTypeCrud() { } + public class test_CompositeTypeCrud { public Dictionary testFieldStruct { get; set; } @@ -50,33 +51,40 @@ namespace FreeSql.Tests.Duckdb var sqlPar = fsql.Insert(item2).ToSql(); var sqlText = fsql.Insert(item2).NoneParameter().ToSql(); - Assert.Equal("INSERT INTO \"test_dateonlytimeonly01\"(\"testfieldtimespan\", \"testfieldtimeonly\", \"testfielddatetime\", \"testfielddateonly\", \"testfieldtimespannullable\", \"testfieldtimeonlynullable\", \"testfielddatetimenullable\", \"testfielddateonlynullable\") VALUES(time '16:0:0.0', time '11:0:0', current_timestamp, date '2024-08-20', time '0:1:30.0', time '0:1:30', current_timestamp, date '2024-08-19')", sqlText); + Assert.Equal( + "INSERT INTO \"test_dateonlytimeonly01\"(\"testfieldtimespan\", \"testfieldtimeonly\", \"testfielddatetime\", \"testfielddateonly\", \"testfieldtimespannullable\", \"testfieldtimeonlynullable\", \"testfielddatetimenullable\", \"testfielddateonlynullable\") VALUES(time '16:0:0.0', time '11:0:0', current_timestamp, date '2024-08-20', time '0:1:30.0', time '0:1:30', current_timestamp, date '2024-08-19')", + sqlText); item2.Id = (int)fsql.Insert(item2).NoneParameter().ExecuteIdentity(); var item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.testFieldDateOnly, item2.testFieldDateOnly); Assert.Equal(item3NP.testFieldDateOnlyNullable, item2.testFieldDateOnlyNullable); Assert.True(Math.Abs((item3NP.testFieldTimeOnly - item2.testFieldTimeOnly).TotalSeconds) < 1); - Assert.True(Math.Abs((item3NP.testFieldTimeOnlyNullable - item2.testFieldTimeOnlyNullable).Value.TotalSeconds) < 1); + Assert.True(Math.Abs((item3NP.testFieldTimeOnlyNullable - item2.testFieldTimeOnlyNullable).Value + .TotalSeconds) < 1); item2.Id = (int)fsql.Insert(item2).ExecuteIdentity(); item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.testFieldDateOnly, item2.testFieldDateOnly); Assert.Equal(item3NP.testFieldDateOnlyNullable, item2.testFieldDateOnlyNullable); Assert.True(Math.Abs((item3NP.testFieldTimeOnly - item2.testFieldTimeOnly).TotalSeconds) < 1); - Assert.True(Math.Abs((item3NP.testFieldTimeOnlyNullable - item2.testFieldTimeOnlyNullable).Value.TotalSeconds) < 1); + Assert.True(Math.Abs((item3NP.testFieldTimeOnlyNullable - item2.testFieldTimeOnlyNullable).Value + .TotalSeconds) < 1); var items = fsql.Select().ToList(); var itemstb = fsql.Select().ToDataTable(); } + class test_DateOnlyTimeOnly01 { [Column(IsIdentity = true, IsPrimary = true)] public int Id { get; set; } + public TimeSpan testFieldTimeSpan { get; set; } public TimeOnly testFieldTimeOnly { get; set; } [Column(ServerTime = DateTimeKind.Local)] public DateTime testFieldDateTime { get; set; } + public DateOnly testFieldDateOnly { get; set; } public TimeSpan? testFieldTimeSpanNullable { get; set; } @@ -84,6 +92,7 @@ namespace FreeSql.Tests.Duckdb [Column(ServerTime = DateTimeKind.Local)] public DateTime? testFieldDateTimeNullable { get; set; } + public DateOnly? testFieldDateOnlyNullable { get; set; } } @@ -101,48 +110,98 @@ namespace FreeSql.Tests.Duckdb testFieldDateTimeArray = new[] { now, now.AddHours(2) }, testFieldDateTimeArrayNullable = new DateTime?[] { now, null, now.AddHours(2) }, testFieldDateOnlyArray = new[] { DateOnly.FromDateTime(now), DateOnly.FromDateTime(now.AddHours(2)) }, - testFieldDateOnlyArrayNullable = new DateOnly?[] { DateOnly.FromDateTime(now), null, DateOnly.FromDateTime(now.AddHours(2)) }, - - testFieldTimeSpanArray = new[] { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, - testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, - testFieldTimeOnlyArray = new[] { TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) }, - testFieldTimeOnlyArrayNullable = new TimeOnly?[] { TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), null, TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) }, + testFieldDateOnlyArrayNullable = new DateOnly?[] + { DateOnly.FromDateTime(now), null, DateOnly.FromDateTime(now.AddHours(2)) }, + + testFieldTimeSpanArray = new[] + { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, + testFieldTimeSpanArrayNullable = new TimeSpan?[] + { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, + testFieldTimeOnlyArray = new[] + { + TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), + TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) + }, + testFieldTimeOnlyArrayNullable = new TimeOnly?[] + { + TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), + null, TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) + }, }; var sqlText = fsql.Insert(item2).NoneParameter().ToSql(); - Assert.Equal("INSERT INTO \"test_dateonlytimeonlyarraytypecrud\"(\"testfieldtimespanarray\", \"testfieldtimeonlyarray\", \"testfielddatetimearray\", \"testfielddateonlyarray\", \"testfieldtimespanarraynullable\", \"testfieldtimeonlyarraynullable\", \"testfielddatetimearraynullable\", \"testfielddateonlyarraynullable\") VALUES([time '11:0:0.0',time '0:0:10.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '2024-08-21'], [time '11:0:0.0',time '0:0:10.0',time '0:0:0.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:0:0',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '0001-01-01 00:00:00.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '0001-01-01',date '2024-08-21'])", sqlText); + Assert.Equal( + "INSERT INTO \"test_dateonlytimeonlyarraytypecrud\"(\"testfieldtimespanarray\", \"testfieldtimeonlyarray\", \"testfielddatetimearray\", \"testfielddateonlyarray\", \"testfieldtimespanarraynullable\", \"testfieldtimeonlyarraynullable\", \"testfielddatetimearraynullable\", \"testfielddateonlyarraynullable\") VALUES([time '11:0:0.0',time '0:0:10.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '2024-08-21'], [time '11:0:0.0',time '0:0:10.0',time '0:0:0.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:0:0',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '0001-01-01 00:00:00.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '0001-01-01',date '2024-08-21'])", + sqlText); item2.Id = (int)fsql.Insert(item2).NoneParameter().ExecuteIdentity(); var item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); - Assert.Equal("2024-08-20 23:00:11, 2024-08-21 01:00:11", string.Join(", ", item3NP.testFieldDateTimeArray.Select(a => a.ToString("yyyy-MM-dd HH:mm:ss")))); - Assert.Equal("2024-08-20 23:00:11, 0001-01-01 00:00:00, 2024-08-21 01:00:11", string.Join(", ", item3NP.testFieldDateTimeArrayNullable.Select(a => a?.ToString("yyyy-MM-dd HH:mm:ss")))); - Assert.Equal("2024-08-20, 2024-08-21", string.Join(", ", item3NP.testFieldDateOnlyArray.Select(a => a.ToString("yyyy-MM-dd")))); - Assert.Equal("2024-08-20, 0001-01-01, 2024-08-21", string.Join(", ", item3NP.testFieldDateOnlyArrayNullable.Select(a => a?.ToString("yyyy-MM-dd")))); + Assert.Equal("2024-08-20 23:00:11, 2024-08-21 01:00:11", + string.Join(", ", item3NP.testFieldDateTimeArray.Select(a => a.ToString("yyyy-MM-dd HH:mm:ss")))); + Assert.Equal("2024-08-20 23:00:11, 0001-01-01 00:00:00, 2024-08-21 01:00:11", + string.Join(", ", + item3NP.testFieldDateTimeArrayNullable.Select(a => a?.ToString("yyyy-MM-dd HH:mm:ss")))); + Assert.Equal("2024-08-20, 2024-08-21", + string.Join(", ", item3NP.testFieldDateOnlyArray.Select(a => a.ToString("yyyy-MM-dd")))); + Assert.Equal("2024-08-20, 0001-01-01, 2024-08-21", + string.Join(", ", item3NP.testFieldDateOnlyArrayNullable.Select(a => a?.ToString("yyyy-MM-dd")))); - Assert.Equal("11:00:00, 00:00:10, 00:01:00", string.Join(", ", item3NP.testFieldTimeSpanArray.Select(a => $"{a.Hours.ToString().PadLeft(2, '0')}:{a.Minutes.ToString().PadLeft(2, '0')}:{a.Seconds.ToString().PadLeft(2, '0')}"))); - Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", string.Join(", ", item3NP.testFieldTimeSpanArrayNullable.Select(a => $"{a?.Hours.ToString().PadLeft(2, '0')}:{a?.Minutes.ToString().PadLeft(2, '0')}:{a?.Seconds.ToString().PadLeft(2, '0')}"))); - Assert.Equal("11:00:00, 00:00:10, 00:01:00", string.Join(", ", item3NP.testFieldTimeOnlyArray.Select(a => $"{a.Hour.ToString().PadLeft(2, '0')}:{a.Minute.ToString().PadLeft(2, '0')}:{a.Second.ToString().PadLeft(2, '0')}"))); - Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", string.Join(", ", item3NP.testFieldTimeOnlyArrayNullable.Select(a => $"{a?.Hour.ToString().PadLeft(2, '0')}:{a?.Minute.ToString().PadLeft(2, '0')}:{a?.Second.ToString().PadLeft(2, '0')}"))); + Assert.Equal("11:00:00, 00:00:10, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeSpanArray.Select(a => + $"{a.Hours.ToString().PadLeft(2, '0')}:{a.Minutes.ToString().PadLeft(2, '0')}:{a.Seconds.ToString().PadLeft(2, '0')}"))); + Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeSpanArrayNullable.Select(a => + $"{a?.Hours.ToString().PadLeft(2, '0')}:{a?.Minutes.ToString().PadLeft(2, '0')}:{a?.Seconds.ToString().PadLeft(2, '0')}"))); + Assert.Equal("11:00:00, 00:00:10, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeOnlyArray.Select(a => + $"{a.Hour.ToString().PadLeft(2, '0')}:{a.Minute.ToString().PadLeft(2, '0')}:{a.Second.ToString().PadLeft(2, '0')}"))); + Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeOnlyArrayNullable.Select(a => + $"{a?.Hour.ToString().PadLeft(2, '0')}:{a?.Minute.ToString().PadLeft(2, '0')}:{a?.Second.ToString().PadLeft(2, '0')}"))); sqlText = fsql.Insert(item2).ToSql(); - Assert.Equal("INSERT INTO \"test_dateonlytimeonlyarraytypecrud\"(\"testfieldtimespanarray\", \"testfieldtimeonlyarray\", \"testfielddatetimearray\", \"testfielddateonlyarray\", \"testfieldtimespanarraynullable\", \"testfieldtimeonlyarraynullable\", \"testfielddatetimearraynullable\", \"testfielddateonlyarraynullable\") VALUES([time '11:0:0.0',time '0:0:10.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '2024-08-21'], [time '11:0:0.0',time '0:0:10.0',time '0:0:0.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:0:0',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '0001-01-01 00:00:00.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '0001-01-01',date '2024-08-21'])", sqlText); + Assert.Equal( + "INSERT INTO \"test_dateonlytimeonlyarraytypecrud\"(\"testfieldtimespanarray\", \"testfieldtimeonlyarray\", \"testfielddatetimearray\", \"testfielddateonlyarray\", \"testfieldtimespanarraynullable\", \"testfieldtimeonlyarraynullable\", \"testfielddatetimearraynullable\", \"testfielddateonlyarraynullable\") VALUES([time '11:0:0.0',time '0:0:10.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '2024-08-21'], [time '11:0:0.0',time '0:0:10.0',time '0:0:0.0',time '0:1:0.0'], [time '11:0:0',time '0:0:10',time '0:0:0',time '0:1:0'], [timestamp '2024-08-20 23:00:11.000000',timestamp '0001-01-01 00:00:00.000000',timestamp '2024-08-21 01:00:11.000000'], [date '2024-08-20',date '0001-01-01',date '2024-08-21'])", + sqlText); item2.Id = (int)fsql.Insert(item2).ExecuteIdentity(); item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); - Assert.Equal("2024-08-20 23:00:11, 2024-08-21 01:00:11", string.Join(", ", item3NP.testFieldDateTimeArray.Select(a => a.ToString("yyyy-MM-dd HH:mm:ss")))); - Assert.Equal("2024-08-20 23:00:11, 0001-01-01 00:00:00, 2024-08-21 01:00:11", string.Join(", ", item3NP.testFieldDateTimeArrayNullable.Select(a => a?.ToString("yyyy-MM-dd HH:mm:ss")))); - Assert.Equal("2024-08-20, 2024-08-21", string.Join(", ", item3NP.testFieldDateOnlyArray.Select(a => a.ToString("yyyy-MM-dd")))); - Assert.Equal("2024-08-20, 0001-01-01, 2024-08-21", string.Join(", ", item3NP.testFieldDateOnlyArrayNullable.Select(a => a?.ToString("yyyy-MM-dd")))); + Assert.Equal("2024-08-20 23:00:11, 2024-08-21 01:00:11", + string.Join(", ", item3NP.testFieldDateTimeArray.Select(a => a.ToString("yyyy-MM-dd HH:mm:ss")))); + Assert.Equal("2024-08-20 23:00:11, 0001-01-01 00:00:00, 2024-08-21 01:00:11", + string.Join(", ", + item3NP.testFieldDateTimeArrayNullable.Select(a => a?.ToString("yyyy-MM-dd HH:mm:ss")))); + Assert.Equal("2024-08-20, 2024-08-21", + string.Join(", ", item3NP.testFieldDateOnlyArray.Select(a => a.ToString("yyyy-MM-dd")))); + Assert.Equal("2024-08-20, 0001-01-01, 2024-08-21", + string.Join(", ", item3NP.testFieldDateOnlyArrayNullable.Select(a => a?.ToString("yyyy-MM-dd")))); + + + Assert.Equal("11:00:00, 00:00:10, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeSpanArray.Select(a => + $"{a.Hours.ToString().PadLeft(2, '0')}:{a.Minutes.ToString().PadLeft(2, '0')}:{a.Seconds.ToString().PadLeft(2, '0')}"))); + Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeSpanArrayNullable.Select(a => + $"{a?.Hours.ToString().PadLeft(2, '0')}:{a?.Minutes.ToString().PadLeft(2, '0')}:{a?.Seconds.ToString().PadLeft(2, '0')}"))); + Assert.Equal("11:00:00, 00:00:10, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeOnlyArray.Select(a => + $"{a.Hour.ToString().PadLeft(2, '0')}:{a.Minute.ToString().PadLeft(2, '0')}:{a.Second.ToString().PadLeft(2, '0')}"))); + Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", + string.Join(", ", + item3NP.testFieldTimeOnlyArrayNullable.Select(a => + $"{a?.Hour.ToString().PadLeft(2, '0')}:{a?.Minute.ToString().PadLeft(2, '0')}:{a?.Second.ToString().PadLeft(2, '0')}"))); - - Assert.Equal("11:00:00, 00:00:10, 00:01:00", string.Join(", ", item3NP.testFieldTimeSpanArray.Select(a => $"{a.Hours.ToString().PadLeft(2, '0')}:{a.Minutes.ToString().PadLeft(2, '0')}:{a.Seconds.ToString().PadLeft(2, '0')}"))); - Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", string.Join(", ", item3NP.testFieldTimeSpanArrayNullable.Select(a => $"{a?.Hours.ToString().PadLeft(2, '0')}:{a?.Minutes.ToString().PadLeft(2, '0')}:{a?.Seconds.ToString().PadLeft(2, '0')}"))); - Assert.Equal("11:00:00, 00:00:10, 00:01:00", string.Join(", ", item3NP.testFieldTimeOnlyArray.Select(a => $"{a.Hour.ToString().PadLeft(2, '0')}:{a.Minute.ToString().PadLeft(2, '0')}:{a.Second.ToString().PadLeft(2, '0')}"))); - Assert.Equal("11:00:00, 00:00:10, 00:00:00, 00:01:00", string.Join(", ", item3NP.testFieldTimeOnlyArrayNullable.Select(a => $"{a?.Hour.ToString().PadLeft(2, '0')}:{a?.Minute.ToString().PadLeft(2, '0')}:{a?.Second.ToString().PadLeft(2, '0')}"))); - var items = fsql.Select().ToList(); var itemstb = fsql.Select().ToDataTable(); } + class test_DateOnlyTimeOnlyArrayTypeCrud { [Column(IsIdentity = true, IsPrimary = true)] @@ -152,7 +211,7 @@ namespace FreeSql.Tests.Duckdb public TimeOnly[] testFieldTimeOnlyArray { get; set; } public DateTime[] testFieldDateTimeArray { get; set; } public DateOnly[] testFieldDateOnlyArray { get; set; } - + public TimeSpan?[] testFieldTimeSpanArrayNullable { get; set; } public TimeOnly?[] testFieldTimeOnlyArrayNullable { get; set; } public DateTime?[] testFieldDateTimeArrayNullable { get; set; } @@ -198,6 +257,7 @@ namespace FreeSql.Tests.Duckdb Assert.Single(find); Assert.Equal("170141183460469231731687303715884105726", find[0].Number.ToString()); } + class tuint256tb_01 { public Guid Id { get; set; } @@ -207,7 +267,7 @@ namespace FreeSql.Tests.Duckdb [Fact] public void NumberTypeCrud() { - var item = new test_NumberTypeCrud { }; + var item = new test_NumberTypeCrud { }; item.Id = (int)fsql.Insert(item).ExecuteIdentity(); var newitem = fsql.Select().Where(a => a.Id == item.Id).ToOne(); @@ -241,7 +301,9 @@ namespace FreeSql.Tests.Duckdb }; var sqlText = fsql.Insert(item2).NoneParameter().ToSql(); - Assert.Equal("INSERT INTO \"test_numbertypecrud\"(\"testfieldsbyte\", \"testfieldshort\", \"testfieldint\", \"testfieldlong\", \"testfieldbyte\", \"testfieldushort\", \"testfielduint\", \"testfieldulong\", \"testfielddouble\", \"testfieldfloat\", \"testfielddecimal\", \"testfieldsbytenullable\", \"testfieldshortnullable\", \"testfieldintnullable\", \"testfieldlongnullable\", \"testfieldbytenullable\", \"testfieldushortnullable\", \"testfielduintnullable\", \"testfieldulongnullable\", \"testfielddoublenullable\", \"testfieldfloatnullable\", \"testfielddecimalnullable\") VALUES(127, 32767, 2147483647, 9223372036854775807, 255, 65535, 4294967295, 18446744073709551615, 888.88, 777.77, 999.99, -128, -32768, -2147483648, -9223372036854775808, 0, 0, 0, 0, 222.22, 333.33, 111.11)", sqlText); + Assert.Equal( + "INSERT INTO \"test_numbertypecrud\"(\"testfieldsbyte\", \"testfieldshort\", \"testfieldint\", \"testfieldlong\", \"testfieldbyte\", \"testfieldushort\", \"testfielduint\", \"testfieldulong\", \"testfielddouble\", \"testfieldfloat\", \"testfielddecimal\", \"testfieldsbytenullable\", \"testfieldshortnullable\", \"testfieldintnullable\", \"testfieldlongnullable\", \"testfieldbytenullable\", \"testfieldushortnullable\", \"testfielduintnullable\", \"testfieldulongnullable\", \"testfielddoublenullable\", \"testfieldfloatnullable\", \"testfielddecimalnullable\") VALUES(127, 32767, 2147483647, 9223372036854775807, 255, 65535, 4294967295, 18446744073709551615, 888.88, 777.77, 999.99, -128, -32768, -2147483648, -9223372036854775808, 0, 0, 0, 0, 222.22, 333.33, 111.11)", + sqlText); item2.Id = (int)fsql.Insert(item2).NoneParameter().ExecuteIdentity(); var item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); @@ -270,7 +332,9 @@ namespace FreeSql.Tests.Duckdb Assert.Equal(item3NP.testFieldDecimalNullable, item2.testFieldDecimalNullable); sqlText = fsql.Insert(item2).ToSql(); - Assert.Equal("INSERT INTO \"test_numbertypecrud\"(\"testfieldsbyte\", \"testfieldshort\", \"testfieldint\", \"testfieldlong\", \"testfieldbyte\", \"testfieldushort\", \"testfielduint\", \"testfieldulong\", \"testfielddouble\", \"testfieldfloat\", \"testfielddecimal\", \"testfieldsbytenullable\", \"testfieldshortnullable\", \"testfieldintnullable\", \"testfieldlongnullable\", \"testfieldbytenullable\", \"testfieldushortnullable\", \"testfielduintnullable\", \"testfieldulongnullable\", \"testfielddoublenullable\", \"testfieldfloatnullable\", \"testfielddecimalnullable\") VALUES(127, 32767, 2147483647, 9223372036854775807, 255, 65535, 4294967295, 18446744073709551615, 888.88, 777.77, 999.99, -128, -32768, -2147483648, -9223372036854775808, 0, 0, 0, 0, 222.22, 333.33, 111.11)", sqlText); + Assert.Equal( + "INSERT INTO \"test_numbertypecrud\"(\"testfieldsbyte\", \"testfieldshort\", \"testfieldint\", \"testfieldlong\", \"testfieldbyte\", \"testfieldushort\", \"testfielduint\", \"testfieldulong\", \"testfielddouble\", \"testfieldfloat\", \"testfielddecimal\", \"testfieldsbytenullable\", \"testfieldshortnullable\", \"testfieldintnullable\", \"testfieldlongnullable\", \"testfieldbytenullable\", \"testfieldushortnullable\", \"testfielduintnullable\", \"testfieldulongnullable\", \"testfielddoublenullable\", \"testfieldfloatnullable\", \"testfielddecimalnullable\") VALUES(127, 32767, 2147483647, 9223372036854775807, 255, 65535, 4294967295, 18446744073709551615, 888.88, 777.77, 999.99, -128, -32768, -2147483648, -9223372036854775808, 0, 0, 0, 0, 222.22, 333.33, 111.11)", + sqlText); item2.Id = (int)fsql.Insert(item2).ExecuteIdentity(); item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); @@ -301,6 +365,7 @@ namespace FreeSql.Tests.Duckdb var items = fsql.Select().ToList(); var itemstb = fsql.Select().ToDataTable(); } + class test_NumberTypeCrud { [Column(IsIdentity = true, IsPrimary = true)] @@ -367,7 +432,9 @@ namespace FreeSql.Tests.Duckdb }; var sqlText = fsql.Insert(item2).NoneParameter().ToSql(); - Assert.Equal("INSERT INTO \"test_numberarraytypecrud\"(\"testfieldsbytearray\", \"testfieldshortarray\", \"testfieldintarray\", \"testfieldlongarray\", \"testfieldushortarray\", \"testfielduintarray\", \"testfieldulongarray\", \"testfielddoublearray\", \"testfieldfloatarray\", \"testfielddecimalarray\", \"testfieldsbytearraynullable\", \"testfieldshortarraynullable\", \"testfieldintarraynullable\", \"testfieldlongarraynullable\", \"testfieldbytearraynullable\", \"testfieldushortarraynullable\", \"testfielduintarraynullable\", \"testfieldulongarraynullable\", \"testfielddoublearraynullable\", \"testfieldfloatarraynullable\", \"testfielddecimalarraynullable\") VALUES([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5], [10,20,30,40,50], [11,12,13,14,15], [1,2,3,4,5], [10,20,30,40,50], [888.81,888.82,888.83], [777.71,777.72,777.73], [999.91,999.92,999.93], [1,2,3,0,4,5], [1,2,3,0,4,5], [1,2,3,0,4,5], [500,600,700,0,999,1000], [0,1,2,3,0,4,5,6], [11,12,13,0,14,15], [1,2,3,0,4,5], [10,20,30,0,40,50], [888.11,888.12,0,888.13], [777.71,777.72,0,777.73], [998.11,998.12,0,998.13])", sqlText); + Assert.Equal( + "INSERT INTO \"test_numberarraytypecrud\"(\"testfieldsbytearray\", \"testfieldshortarray\", \"testfieldintarray\", \"testfieldlongarray\", \"testfieldushortarray\", \"testfielduintarray\", \"testfieldulongarray\", \"testfielddoublearray\", \"testfieldfloatarray\", \"testfielddecimalarray\", \"testfieldsbytearraynullable\", \"testfieldshortarraynullable\", \"testfieldintarraynullable\", \"testfieldlongarraynullable\", \"testfieldbytearraynullable\", \"testfieldushortarraynullable\", \"testfielduintarraynullable\", \"testfieldulongarraynullable\", \"testfielddoublearraynullable\", \"testfieldfloatarraynullable\", \"testfielddecimalarraynullable\") VALUES([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5], [10,20,30,40,50], [11,12,13,14,15], [1,2,3,4,5], [10,20,30,40,50], [888.81,888.82,888.83], [777.71,777.72,777.73], [999.91,999.92,999.93], [1,2,3,0,4,5], [1,2,3,0,4,5], [1,2,3,0,4,5], [500,600,700,0,999,1000], [0,1,2,3,0,4,5,6], [11,12,13,0,14,15], [1,2,3,0,4,5], [10,20,30,0,40,50], [888.11,888.12,0,888.13], [777.71,777.72,0,777.73], [998.11,998.12,0,998.13])", + sqlText); item2.Id = (int)fsql.Insert(item2).NoneParameter().ExecuteIdentity(); var item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); @@ -395,7 +462,9 @@ namespace FreeSql.Tests.Duckdb Assert.Equal("998.11, 998.12, 0, 998.13", string.Join(", ", item3NP.testFieldDecimalArrayNullable)); sqlText = fsql.Insert(item2).ToSql(); - Assert.Equal("INSERT INTO \"test_numberarraytypecrud\"(\"testfieldsbytearray\", \"testfieldshortarray\", \"testfieldintarray\", \"testfieldlongarray\", \"testfieldushortarray\", \"testfielduintarray\", \"testfieldulongarray\", \"testfielddoublearray\", \"testfieldfloatarray\", \"testfielddecimalarray\", \"testfieldsbytearraynullable\", \"testfieldshortarraynullable\", \"testfieldintarraynullable\", \"testfieldlongarraynullable\", \"testfieldbytearraynullable\", \"testfieldushortarraynullable\", \"testfielduintarraynullable\", \"testfieldulongarraynullable\", \"testfielddoublearraynullable\", \"testfieldfloatarraynullable\", \"testfielddecimalarraynullable\") VALUES([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5], [10,20,30,40,50], [11,12,13,14,15], [1,2,3,4,5], [10,20,30,40,50], [888.81,888.82,888.83], [777.71,777.72,777.73], [999.91,999.92,999.93], [1,2,3,0,4,5], [1,2,3,0,4,5], [1,2,3,0,4,5], [500,600,700,0,999,1000], [0,1,2,3,0,4,5,6], [11,12,13,0,14,15], [1,2,3,0,4,5], [10,20,30,0,40,50], [888.11,888.12,0,888.13], [777.71,777.72,0,777.73], [998.11,998.12,0,998.13])", sqlText); + Assert.Equal( + "INSERT INTO \"test_numberarraytypecrud\"(\"testfieldsbytearray\", \"testfieldshortarray\", \"testfieldintarray\", \"testfieldlongarray\", \"testfieldushortarray\", \"testfielduintarray\", \"testfieldulongarray\", \"testfielddoublearray\", \"testfieldfloatarray\", \"testfielddecimalarray\", \"testfieldsbytearraynullable\", \"testfieldshortarraynullable\", \"testfieldintarraynullable\", \"testfieldlongarraynullable\", \"testfieldbytearraynullable\", \"testfieldushortarraynullable\", \"testfielduintarraynullable\", \"testfieldulongarraynullable\", \"testfielddoublearraynullable\", \"testfieldfloatarraynullable\", \"testfielddecimalarraynullable\") VALUES([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5], [10,20,30,40,50], [11,12,13,14,15], [1,2,3,4,5], [10,20,30,40,50], [888.81,888.82,888.83], [777.71,777.72,777.73], [999.91,999.92,999.93], [1,2,3,0,4,5], [1,2,3,0,4,5], [1,2,3,0,4,5], [500,600,700,0,999,1000], [0,1,2,3,0,4,5,6], [11,12,13,0,14,15], [1,2,3,0,4,5], [10,20,30,0,40,50], [888.11,888.12,0,888.13], [777.71,777.72,0,777.73], [998.11,998.12,0,998.13])", + sqlText); item2.Id = (int)fsql.Insert(item2).ExecuteIdentity(); item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); @@ -425,6 +494,7 @@ namespace FreeSql.Tests.Duckdb var items = fsql.Select().ToList(); var itemstb = fsql.Select().ToDataTable(); } + class test_NumberArrayTypeCrud { [Column(IsIdentity = true, IsPrimary = true)] @@ -481,7 +551,9 @@ namespace FreeSql.Tests.Duckdb }; var sqlText = fsql.Insert(item2).NoneParameter().ToSql(); - Assert.Equal("INSERT INTO \"test_othertypecrud\"(\"testfieldbool\", \"testfieldguid\", \"testfieldbytes\", \"testfieldstring\", \"testfieldchar\", \"testfieldbitarray\", \"testfieldboolnullable\", \"testfieldguidnullable\", \"testfieldenum1\", \"testfieldenum1nullable\", \"testfieldenum2\", \"testfieldenum2nullable\") VALUES(true, '9e461804-7ed6-4a66-a609-408b2c195abf', '\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob, '我是中国人string''\\?!@#$%^&*()_+{}}{~?><<>', 'X', bit '011001110001000110001001011001110001100111110101', true, '9e461804-7ed6-4a66-a609-408b2c195abf', 2, 1, 1, 2)", sqlText); + Assert.Equal( + "INSERT INTO \"test_othertypecrud\"(\"testfieldbool\", \"testfieldguid\", \"testfieldbytes\", \"testfieldstring\", \"testfieldchar\", \"testfieldbitarray\", \"testfieldboolnullable\", \"testfieldguidnullable\", \"testfieldenum1\", \"testfieldenum1nullable\", \"testfieldenum2\", \"testfieldenum2nullable\") VALUES(true, '9e461804-7ed6-4a66-a609-408b2c195abf', '\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob, '我是中国人string''\\?!@#$%^&*()_+{}}{~?><<>', 'X', bit '011001110001000110001001011001110001100111110101', true, '9e461804-7ed6-4a66-a609-408b2c195abf', 2, 1, 1, 2)", + sqlText); item2.Id = (int)fsql.Insert(item2).NoneParameter().ExecuteIdentity(); var item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); @@ -501,7 +573,9 @@ namespace FreeSql.Tests.Duckdb Assert.Equal(item3NP.testFieldEnum2Nullable, item2.testFieldEnum2Nullable); sqlText = fsql.Insert(item2).ToSql(); - Assert.Equal("INSERT INTO \"test_othertypecrud\"(\"testfieldbool\", \"testfieldguid\", \"testfieldbytes\", \"testfieldstring\", \"testfieldchar\", \"testfieldbitarray\", \"testfieldboolnullable\", \"testfieldguidnullable\", \"testfieldenum1\", \"testfieldenum1nullable\", \"testfieldenum2\", \"testfieldenum2nullable\") VALUES(true, '9e461804-7ed6-4a66-a609-408b2c195abf', '\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob, '我是中国人string''\\?!@#$%^&*()_+{}}{~?><<>', 'X', bit '011001110001000110001001011001110001100111110101', true, '9e461804-7ed6-4a66-a609-408b2c195abf', 2, 1, 1, 2)", sqlText); + Assert.Equal( + "INSERT INTO \"test_othertypecrud\"(\"testfieldbool\", \"testfieldguid\", \"testfieldbytes\", \"testfieldstring\", \"testfieldchar\", \"testfieldbitarray\", \"testfieldboolnullable\", \"testfieldguidnullable\", \"testfieldenum1\", \"testfieldenum1nullable\", \"testfieldenum2\", \"testfieldenum2nullable\") VALUES(true, '9e461804-7ed6-4a66-a609-408b2c195abf', '\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob, '我是中国人string''\\?!@#$%^&*()_+{}}{~?><<>', 'X', bit '011001110001000110001001011001110001100111110101', true, '9e461804-7ed6-4a66-a609-408b2c195abf', 2, 1, 1, 2)", + sqlText); item2.Id = (int)fsql.Insert(item2).ExecuteIdentity(); item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); @@ -523,12 +597,14 @@ namespace FreeSql.Tests.Duckdb var items = fsql.Select().ToList(); var itemstb = fsql.Select().ToDataTable(); } + string Get1010(BitArray ba) { char[] ba1010 = new char[ba.Length]; for (int a = 0; a < ba.Length; a++) ba1010[a] = ba[a] ? '1' : '0'; return new string(ba1010); } + class test_OtherTypeCrud { [Column(IsIdentity = true, IsPrimary = true)] @@ -567,26 +643,38 @@ namespace FreeSql.Tests.Duckdb testFieldGuidArray = new[] { newGuid, newGuid }, testFieldGuidArrayNullable = new Guid?[] { newGuid, null, newGuid }, testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" }, - testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, + testFieldBitArrayArray = new[] + { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, - testFieldEnum1Array = new[] { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, TableAllTypeEnumType1.e1 }, - testFieldEnum1ArrayNullable = new TableAllTypeEnumType1?[] { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, null, TableAllTypeEnumType1.e1 }, + testFieldEnum1Array = new[] + { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, TableAllTypeEnumType1.e1 }, + testFieldEnum1ArrayNullable = new TableAllTypeEnumType1?[] + { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, null, TableAllTypeEnumType1.e1 }, testFieldEnum2Array = new[] { TableAllTypeEnumType2.f3, TableAllTypeEnumType2.f1 }, - testFieldEnum2ArrayNullable = new TableAllTypeEnumType2?[] { TableAllTypeEnumType2.f3, null, TableAllTypeEnumType2.f1 }, + testFieldEnum2ArrayNullable = new TableAllTypeEnumType2?[] + { TableAllTypeEnumType2.f3, null, TableAllTypeEnumType2.f1 }, }; var sqlText = fsql.Insert(item2).NoneParameter().ToSql(); - Assert.Equal("INSERT INTO \"test_otherarraytypecrud\"(\"testfieldboolarray\", \"testfieldbytesarray\", \"testfieldstringarray\", \"testfieldguidarray\", \"testfieldboolarraynullable\", \"testfieldguidarraynullable\", \"testfieldbitarrayarray\", \"testfieldenum1array\", \"testfieldenum1arraynullable\", \"testfieldenum2array\", \"testfieldenum2arraynullable\") VALUES([true,true,false,false], ['\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob,'\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob], ['我是中国人String1','我是中国人String2',NULL,'我是中国人String3'], ['9e461804-7ed6-4a66-a609-408b2c195abf','9e461804-7ed6-4a66-a609-408b2c195abf'], [true,true,false,false,false], ['9e461804-7ed6-4a66-a609-408b2c195abf','00000000-0000-0000-0000-000000000000','9e461804-7ed6-4a66-a609-408b2c195abf'], [bit '001001110001110110110101101001111101100110111101',bit '101001111010000100110101011001110000110110001001'], [3,1,0], [3,1,0,0], [2,0], [2,0,0])", sqlText); + Assert.Equal( + "INSERT INTO \"test_otherarraytypecrud\"(\"testfieldboolarray\", \"testfieldbytesarray\", \"testfieldstringarray\", \"testfieldguidarray\", \"testfieldboolarraynullable\", \"testfieldguidarraynullable\", \"testfieldbitarrayarray\", \"testfieldenum1array\", \"testfieldenum1arraynullable\", \"testfieldenum2array\", \"testfieldenum2arraynullable\") VALUES([true,true,false,false], ['\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob,'\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob], ['我是中国人String1','我是中国人String2',NULL,'我是中国人String3'], ['9e461804-7ed6-4a66-a609-408b2c195abf','9e461804-7ed6-4a66-a609-408b2c195abf'], [true,true,false,false,false], ['9e461804-7ed6-4a66-a609-408b2c195abf','00000000-0000-0000-0000-000000000000','9e461804-7ed6-4a66-a609-408b2c195abf'], [bit '001001110001110110110101101001111101100110111101',bit '101001111010000100110101011001110000110110001001'], [3,1,0], [3,1,0,0], [2,0], [2,0,0])", + sqlText); item2.Id = (int)fsql.Insert(item2).NoneParameter().ExecuteIdentity(); var item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); Assert.Equal("True, True, False, False", string.Join(", ", item3NP.testFieldBoolArray)); Assert.Equal("True, True, False, False, False", string.Join(", ", item3NP.testFieldBoolArrayNullable)); - Assert.Equal("5oiR5piv5Lit5Zu95Lq6, 5oiR5piv5Lit5Zu95Lq6", string.Join(", ", item3NP.testFieldBytesArray.Select(a => Convert.ToBase64String(a)))); - Assert.Equal("9e461804-7ed6-4a66-a609-408b2c195abf, 9e461804-7ed6-4a66-a609-408b2c195abf", string.Join(", ", item3NP.testFieldGuidArray)); - Assert.Equal("9e461804-7ed6-4a66-a609-408b2c195abf, 00000000-0000-0000-0000-000000000000, 9e461804-7ed6-4a66-a609-408b2c195abf", string.Join(", ", item3NP.testFieldGuidArrayNullable)); + Assert.Equal("5oiR5piv5Lit5Zu95Lq6, 5oiR5piv5Lit5Zu95Lq6", + string.Join(", ", item3NP.testFieldBytesArray.Select(a => Convert.ToBase64String(a)))); + Assert.Equal("9e461804-7ed6-4a66-a609-408b2c195abf, 9e461804-7ed6-4a66-a609-408b2c195abf", + string.Join(", ", item3NP.testFieldGuidArray)); + Assert.Equal( + "9e461804-7ed6-4a66-a609-408b2c195abf, 00000000-0000-0000-0000-000000000000, 9e461804-7ed6-4a66-a609-408b2c195abf", + string.Join(", ", item3NP.testFieldGuidArrayNullable)); Assert.Equal("我是中国人String1, 我是中国人String2, , 我是中国人String3", string.Join(", ", item3NP.testFieldStringArray)); - Assert.Equal("001001110001110110110101101001111101100110111101, 101001111010000100110101011001110000110110001001", string.Join(", ", item3NP.testFieldBitArrayArray.Select(a => Get1010(a)))); + Assert.Equal( + "001001110001110110110101101001111101100110111101, 101001111010000100110101011001110000110110001001", + string.Join(", ", item3NP.testFieldBitArrayArray.Select(a => Get1010(a)))); Assert.Equal("e5, e2, e1", string.Join(", ", item3NP.testFieldEnum1Array)); Assert.Equal("e5, e2, e1, e1", string.Join(", ", item3NP.testFieldEnum1ArrayNullable)); @@ -594,17 +682,25 @@ namespace FreeSql.Tests.Duckdb Assert.Equal("f3, f1, f1", string.Join(", ", item3NP.testFieldEnum2ArrayNullable)); sqlText = fsql.Insert(item2).ToSql(); - Assert.Equal("INSERT INTO \"test_otherarraytypecrud\"(\"testfieldboolarray\", \"testfieldbytesarray\", \"testfieldstringarray\", \"testfieldguidarray\", \"testfieldboolarraynullable\", \"testfieldguidarraynullable\", \"testfieldbitarrayarray\", \"testfieldenum1array\", \"testfieldenum1arraynullable\", \"testfieldenum2array\", \"testfieldenum2arraynullable\") VALUES([true,true,false,false], ['\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob,'\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob], ['我是中国人String1','我是中国人String2',NULL,'我是中国人String3'], ['9e461804-7ed6-4a66-a609-408b2c195abf','9e461804-7ed6-4a66-a609-408b2c195abf'], [true,true,false,false,false], ['9e461804-7ed6-4a66-a609-408b2c195abf','00000000-0000-0000-0000-000000000000','9e461804-7ed6-4a66-a609-408b2c195abf'], [bit '001001110001110110110101101001111101100110111101',bit '101001111010000100110101011001110000110110001001'], [3,1,0], [3,1,0,0], [2,0], [2,0,0])", sqlText); + Assert.Equal( + "INSERT INTO \"test_otherarraytypecrud\"(\"testfieldboolarray\", \"testfieldbytesarray\", \"testfieldstringarray\", \"testfieldguidarray\", \"testfieldboolarraynullable\", \"testfieldguidarraynullable\", \"testfieldbitarrayarray\", \"testfieldenum1array\", \"testfieldenum1arraynullable\", \"testfieldenum2array\", \"testfieldenum2arraynullable\") VALUES([true,true,false,false], ['\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob,'\\xE6\\x88\\x91\\xE6\\x98\\xAF\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'::blob], ['我是中国人String1','我是中国人String2',NULL,'我是中国人String3'], ['9e461804-7ed6-4a66-a609-408b2c195abf','9e461804-7ed6-4a66-a609-408b2c195abf'], [true,true,false,false,false], ['9e461804-7ed6-4a66-a609-408b2c195abf','00000000-0000-0000-0000-000000000000','9e461804-7ed6-4a66-a609-408b2c195abf'], [bit '001001110001110110110101101001111101100110111101',bit '101001111010000100110101011001110000110110001001'], [3,1,0], [3,1,0,0], [2,0], [2,0,0])", + sqlText); item2.Id = (int)fsql.Insert(item2).ExecuteIdentity(); item3NP = fsql.Select().Where(a => a.Id == item2.Id).ToOne(); Assert.Equal(item3NP.Id, item2.Id); Assert.Equal("True, True, False, False", string.Join(", ", item3NP.testFieldBoolArray)); Assert.Equal("True, True, False, False, False", string.Join(", ", item3NP.testFieldBoolArrayNullable)); - Assert.Equal("5oiR5piv5Lit5Zu95Lq6, 5oiR5piv5Lit5Zu95Lq6", string.Join(", ", item3NP.testFieldBytesArray.Select(a => Convert.ToBase64String(a)))); - Assert.Equal("9e461804-7ed6-4a66-a609-408b2c195abf, 9e461804-7ed6-4a66-a609-408b2c195abf", string.Join(", ", item3NP.testFieldGuidArray)); - Assert.Equal("9e461804-7ed6-4a66-a609-408b2c195abf, 00000000-0000-0000-0000-000000000000, 9e461804-7ed6-4a66-a609-408b2c195abf", string.Join(", ", item3NP.testFieldGuidArrayNullable)); + Assert.Equal("5oiR5piv5Lit5Zu95Lq6, 5oiR5piv5Lit5Zu95Lq6", + string.Join(", ", item3NP.testFieldBytesArray.Select(a => Convert.ToBase64String(a)))); + Assert.Equal("9e461804-7ed6-4a66-a609-408b2c195abf, 9e461804-7ed6-4a66-a609-408b2c195abf", + string.Join(", ", item3NP.testFieldGuidArray)); + Assert.Equal( + "9e461804-7ed6-4a66-a609-408b2c195abf, 00000000-0000-0000-0000-000000000000, 9e461804-7ed6-4a66-a609-408b2c195abf", + string.Join(", ", item3NP.testFieldGuidArrayNullable)); Assert.Equal("我是中国人String1, 我是中国人String2, , 我是中国人String3", string.Join(", ", item3NP.testFieldStringArray)); - Assert.Equal("001001110001110110110101101001111101100110111101, 101001111010000100110101011001110000110110001001", string.Join(", ", item3NP.testFieldBitArrayArray.Select(a => Get1010(a)))); + Assert.Equal( + "001001110001110110110101101001111101100110111101, 101001111010000100110101011001110000110110001001", + string.Join(", ", item3NP.testFieldBitArrayArray.Select(a => Get1010(a)))); Assert.Equal("e5, e2, e1", string.Join(", ", item3NP.testFieldEnum1Array)); Assert.Equal("e5, e2, e1, e1", string.Join(", ", item3NP.testFieldEnum1ArrayNullable)); @@ -614,6 +710,7 @@ namespace FreeSql.Tests.Duckdb var items = fsql.Select().ToList(); var itemstb = fsql.Select().ToDataTable(); } + class test_OtherArrayTypeCrud { [Column(IsIdentity = true, IsPrimary = true)] @@ -636,6 +733,7 @@ namespace FreeSql.Tests.Duckdb } #region List 测试代码,暂时不提供该功能,建议使用 T[] + //[Fact] //public void BasicListTypeCrud() //{ @@ -851,6 +949,7 @@ namespace FreeSql.Tests.Duckdb // public List testFieldDateOnlyArrayNullable { get; set; } //} + #endregion IInsert insert => fsql.Insert(); @@ -871,7 +970,8 @@ namespace FreeSql.Tests.Duckdb var item2 = new TableAllType { testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("我是")), - testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, + testFieldBitArrayArray = new[] + { new BitArray(Encoding.UTF8.GetBytes("中国")), new BitArray(Encoding.UTF8.GetBytes("公民")) }, testFieldBool = true, testFieldBoolArray = new[] { true, true, false, false }, testFieldBoolArrayNullable = new bool?[] { true, true, null, false, false }, @@ -886,8 +986,10 @@ namespace FreeSql.Tests.Duckdb testFieldDateTimeArrayNullable = new DateTime?[] { DateTime.Now, null, DateTime.Now.AddHours(2) }, testFieldDateTimeNullable = DateTime.Now.AddDays(-1), testFieldDateOnly = DateOnly.FromDateTime(DateTime.Now), - testFieldDateOnlyArray = new[] { DateOnly.FromDateTime(DateTime.Now), DateOnly.FromDateTime(DateTime.Now.AddHours(2)) }, - testFieldDateOnlyArrayNullable = new DateOnly?[] { DateOnly.FromDateTime(DateTime.Now), null, DateOnly.FromDateTime(DateTime.Now.AddHours(2)) }, + testFieldDateOnlyArray = new[] + { DateOnly.FromDateTime(DateTime.Now), DateOnly.FromDateTime(DateTime.Now.AddHours(2)) }, + testFieldDateOnlyArrayNullable = new DateOnly?[] + { DateOnly.FromDateTime(DateTime.Now), null, DateOnly.FromDateTime(DateTime.Now.AddHours(2)) }, testFieldDateOnlyNullable = DateOnly.FromDateTime(DateTime.Now.AddDays(-1)), testFieldDecimal = 999.99M, testFieldDecimalArray = new[] { 999.91M, 999.92M, 999.93M }, @@ -898,12 +1000,15 @@ namespace FreeSql.Tests.Duckdb testFieldDoubleArrayNullable = new double?[] { 888.11, 888.12, null, 888.13 }, testFieldDoubleNullable = 222.22, testFieldEnum1 = TableAllTypeEnumType1.e3, - testFieldEnum1Array = new[] { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, TableAllTypeEnumType1.e1 }, - testFieldEnum1ArrayNullable = new TableAllTypeEnumType1?[] { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, null, TableAllTypeEnumType1.e1 }, + testFieldEnum1Array = new[] + { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, TableAllTypeEnumType1.e1 }, + testFieldEnum1ArrayNullable = new TableAllTypeEnumType1?[] + { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, null, TableAllTypeEnumType1.e1 }, testFieldEnum1Nullable = TableAllTypeEnumType1.e2, testFieldEnum2 = TableAllTypeEnumType2.f2, testFieldEnum2Array = new[] { TableAllTypeEnumType2.f3, TableAllTypeEnumType2.f1 }, - testFieldEnum2ArrayNullable = new TableAllTypeEnumType2?[] { TableAllTypeEnumType2.f3, null, TableAllTypeEnumType2.f1 }, + testFieldEnum2ArrayNullable = new TableAllTypeEnumType2?[] + { TableAllTypeEnumType2.f3, null, TableAllTypeEnumType2.f1 }, testFieldEnum2Nullable = TableAllTypeEnumType2.f3, testFieldFloat = 777.77F, testFieldFloatArray = new[] { 777.71F, 777.72F, 777.73F }, @@ -913,15 +1018,20 @@ namespace FreeSql.Tests.Duckdb testFieldGuidArray = new[] { Guid.NewGuid(), Guid.NewGuid() }, testFieldGuidArrayNullable = new Guid?[] { Guid.NewGuid(), null, Guid.NewGuid() }, testFieldGuidNullable = Guid.NewGuid(), - testFieldStruct = new Dictionary { { "111", "value111" }, { "222", 222 }, { "333", "value333" } }, - testFieldStructArray = new[] { new Dictionary { { "111", "value111" }, { "222", 222 }, { "333", "value333" } }, new Dictionary { { "444", "value444" }, { "555", 555 }, { "666", "value666" } } }, + testFieldStruct = new Dictionary + { { "111", "value111" }, { "222", 222 }, { "333", "value333" } }, + testFieldStructArray = new[] + { + new Dictionary { { "111", "value111" }, { "222", 222 }, { "333", "value333" } }, + new Dictionary { { "444", "value444" }, { "555", 555 }, { "666", "value666" } } + }, testFieldInt = int.MaxValue, testFieldIntArray = new[] { 1, 2, 3, 4, 5 }, testFieldIntArrayNullable = new int?[] { 1, 2, 3, null, 4, 5 }, testFieldIntNullable = int.MinValue, testFieldLong = long.MaxValue, testFieldLongArray = new long[] { 10, 20, 30, 40, 50 }, - + testFieldSByte = sbyte.MaxValue, testFieldSByteArray = new sbyte[] { 1, 2, 3, 4, 5 }, testFieldSByteArrayNullable = new sbyte?[] { 1, 2, 3, null, 4, 5 }, @@ -934,12 +1044,22 @@ namespace FreeSql.Tests.Duckdb testFieldChar = 'X', testFieldStringArray = new[] { "我是中国人String1", "我是中国人String2", null, "我是中国人String3" }, testFieldTimeSpan = TimeSpan.FromHours(11), - testFieldTimeSpanArray = new[] { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, - testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, + testFieldTimeSpanArray = new[] + { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) }, + testFieldTimeSpanArrayNullable = new TimeSpan?[] + { TimeSpan.FromHours(11), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) }, testFieldTimeSpanNullable = TimeSpan.FromSeconds(90), testFieldTimeOnly = TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), - testFieldTimeOnlyArray = new[] { TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) }, - testFieldTimeOnlyArrayNullable = new TimeOnly?[] { TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), null, TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) }, + testFieldTimeOnlyArray = new[] + { + TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), + TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) + }, + testFieldTimeOnlyArrayNullable = new TimeOnly?[] + { + TimeOnly.FromTimeSpan(TimeSpan.FromHours(11)), TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(10)), + null, TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(60)) + }, testFieldTimeOnlyNullable = TimeOnly.FromTimeSpan(TimeSpan.FromSeconds(90)), testFieldUInt = uint.MaxValue, testFieldUIntArray = new uint[] { 1, 2, 3, 4, 5 }, @@ -993,10 +1113,11 @@ namespace FreeSql.Tests.Duckdb public float testFieldFloat { get; set; } public decimal testFieldDecimal { get; set; } public TimeSpan testFieldTimeSpan { get; set; } - public TimeOnly testFieldTimeOnly{ get; set; } + public TimeOnly testFieldTimeOnly { get; set; } [Column(ServerTime = DateTimeKind.Local)] public DateTime testFieldDateTime { get; set; } + public DateOnly testFieldDateOnly { get; set; } public byte[] testFieldBytes { get; set; } @@ -1021,6 +1142,7 @@ namespace FreeSql.Tests.Duckdb [Column(ServerTime = DateTimeKind.Local)] public DateTime? testFieldDateTimeNullable { get; set; } + public DateOnly? testFieldDateOnlyNullable { get; set; } public Guid? testFieldGuidNullable { get; set; } @@ -1080,7 +1202,85 @@ namespace FreeSql.Tests.Duckdb public TableAllTypeEnumType2?[] testFieldEnum2ArrayNullable { get; set; } } - public enum TableAllTypeEnumType1 { e1, e2, e3, e5 } - [Flags] public enum TableAllTypeEnumType2 { f1, f2, f3 } + [Fact] + public void TestNormalIndex() + { + fsql.CodeFirst.SyncStructure(); + } + + [Fact] + public void TestCompoundIndex() + { + fsql.CodeFirst.SyncStructure(); + } + + [Fact] + public void TestIsIdentity() + { + fsql.CodeFirst.SyncStructure(); + } + + + [Table(Name = "index_normal_test")] + class TableIsIdentityTest + { + [Column(Name = "id")] + public int Id { get; set; } + + [Column(Name = "name")] + public string Name { get; set; } + + [Column(Name = "number")] + public string Number { get; set; } + } + + [Table(Name = "index_normal_test")] + [Index("name_index", "name", false)] + [Index("number_index", "number", true)] + class TableNormalIndexTest + { + [Column(Name = "id",IsIdentity = true)] + public int Id { get; set; } + + [Column(Name = "name")] + public string Name { get; set; } + + [Column(Name = "number")] + public string Number { get; set; } + } + + [Table(Name = "index_compound_test")] + [Index("c_name_index", "name", false)] + [Index("c_number_age_index", "number,age", false)] + class TableCompoundIndexTest + { + [Column( Name = "id")] + public int Id { get; set; } + + [Column(Name = "name")] + public string Name { get; set; } + + [Column(Name = "number")] + public string Number { get; set; } + + [Column(Name = "age")] + public string Age { get; set; } + } + + public enum TableAllTypeEnumType1 + { + e1, + e2, + e3, + e5 + } + + [Flags] + public enum TableAllTypeEnumType2 + { + f1, + f2, + f3 + } } -} +} \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/g.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/g.cs index 2a42216ef..d43cd3c5f 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/g.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Duckdb/g.cs @@ -14,7 +14,7 @@ public class g .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) .UseMonitorCommand( cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前 - //, (cmd, traceLog) => Console.WriteLine(traceLog) + , (cmd, traceLog) => Console.WriteLine(traceLog) ) .Build(); }); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.TDengine/TDengine/TDengineIssue/TDengineIssueTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.TDengine/TDengine/TDengineIssue/TDengineIssueTest.cs index 7a3181e9d..21c7de7c5 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.TDengine/TDengine/TDengineIssue/TDengineIssueTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.TDengine/TDengine/TDengineIssue/TDengineIssueTest.cs @@ -41,12 +41,12 @@ namespace FreeSql.Tests.Provider.TDengine.TDengine.TDengineIssue var insertAffrows = _fsql.Insert(new TDengineProcessMetrics1977() { Timestamp = DateTime.Now, - HostName = "host6" + HostName = "host1", + StartTime = DateTime.Now } ).ExecuteAffrows(); Assert.Equal(1, insertAffrows); } - } public class TDengineProcessMetrics1977 @@ -67,6 +67,6 @@ namespace FreeSql.Tests.Provider.TDengine.TDengine.TDengineIssue /// 进程启动时间 /// [Column(Name = "start_time")] - public DateTime StartTime { get; set; } + public DateTime? StartTime { get; set; } } } \ No newline at end of file diff --git a/Providers/FreeSql.Provider.Duckdb/DuckdbCodeFirst.cs b/Providers/FreeSql.Provider.Duckdb/DuckdbCodeFirst.cs index 54176e6a9..edf72256f 100644 --- a/Providers/FreeSql.Provider.Duckdb/DuckdbCodeFirst.cs +++ b/Providers/FreeSql.Provider.Duckdb/DuckdbCodeFirst.cs @@ -116,6 +116,7 @@ namespace FreeSql.Duckdb { var sb = new StringBuilder(); var seqcols = new List>(); //序列 + var indexSb = new StringBuilder(); foreach (var obj in objects) { if (sb.Length > 0) sb.Append("\r\n"); @@ -167,35 +168,38 @@ namespace FreeSql.Duckdb } sb.Remove(sb.Length - 1, 1); sb.Append("\r\n) \r\n;\r\n"); + ////创建表的索引 + //foreach (var uk in tb.Indexes) + //{ + // sb.Append("CREATE "); + // if (uk.IsUnique) sb.Append("UNIQUE "); + // sb.Append("INDEX "); + // sb.Append(_commonUtils.QuoteSqlName(tbname[0], ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tbname[1]).Append("("); + // foreach (var tbcol in uk.Columns) + // { + // sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); + // if (tbcol.IsDesc) sb.Append(" DESC"); + // sb.Append(", "); + // } + // sb.Remove(sb.Length - 2, 2).Append(");\r\n"); + //} //创建表的索引 foreach (var uk in tb.Indexes) { - sb.Append("CREATE "); - if (uk.IsUnique) sb.Append("UNIQUE "); - sb.Append("INDEX ").Append(_commonUtils.QuoteSqlName(tbname[0], ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(tbname[1]).Append("("); + indexSb.Append("CREATE "); + if (uk.IsUnique) + indexSb.Append("UNIQUE "); + indexSb.Append("INDEX "); + indexSb.Append(uk.Name).Append(" ON ").Append(_commonUtils.QuoteSqlName(ReplaceIndexName(createTableName, tbname[1]))); + indexSb.Append("("); foreach (var tbcol in uk.Columns) { - sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); - if (tbcol.IsDesc) sb.Append(" DESC"); - sb.Append(", "); + indexSb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); + if (tbcol.IsDesc) + indexSb.Append(" DESC"); + indexSb.Append(", "); } - sb.Remove(sb.Length - 2, 2).Append(");\r\n"); - } - //创建表的索引 - foreach (var uk in tb.Indexes) - { - sb.Append("CREATE "); - if (uk.IsUnique) sb.Append("UNIQUE "); - sb.Append("INDEX "); - sb.Append(_commonUtils.QuoteSqlName(ReplaceIndexName(uk.Name, tbname[1]))).Append(" ON ").Append(createTableName); - sb.Append("("); - foreach (var tbcol in uk.Columns) - { - sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); - if (tbcol.IsDesc) sb.Append(" DESC"); - sb.Append(", "); - } - sb.Remove(sb.Length - 2, 2).Append(");\r\n"); + indexSb.Remove(indexSb.Length - 2, 2).Append(");\r\n"); } //备注 foreach (var tbcol in tb.ColumnsByPosition) @@ -218,6 +222,7 @@ namespace FreeSql.Duckdb else tboldname = null; //如果新表已经存在,不走改表名逻辑 } + foreach (var seqcol in seqcols) { var tbname = seqcol.Item2; @@ -233,6 +238,9 @@ namespace FreeSql.Duckdb //sb.Append(" SELECT case when max(").Append(colname2).Append(") is null then 0 else setval('").Append(seqname).Append("', max(").Append(colname2).Append(")) end FROM ").Append(tbname2).Append(";\r\n"); } } + + sb.Append(indexSb); + return sb.Length == 0 ? null : sb.ToString(); } }