Skip to content

Commit d7c1603

Browse files
authored
fix codegen error in value-type multimap #2005 (#2022)
in horizontal multi-map, don't "returnValueLocal = null" for value-types (invalid IL) fix #2005
1 parent 4160c9f commit d7c1603

File tree

11 files changed

+47
-27
lines changed

11 files changed

+47
-27
lines changed

Dapper/SqlMapper.cs

+7-4
Original file line numberDiff line numberDiff line change
@@ -1944,7 +1944,7 @@ private static Func<DbDataReader, object> GetDeserializer(Type type, DbDataReade
19441944
}
19451945
return GetTypeDeserializer(type, reader, startBound, length, returnNullIfFirstMissing);
19461946
}
1947-
return GetStructDeserializer(type, underlyingType ?? type, startBound, useGetFieldValue);
1947+
return GetSimpleValueDeserializer(type, underlyingType ?? type, startBound, useGetFieldValue);
19481948
}
19491949

19501950
private static Func<DbDataReader, object> GetHandlerDeserializer(ITypeHandler handler, Type type, int startBound)
@@ -3049,7 +3049,7 @@ private static DbDataReader ExecuteReaderImpl(IDbConnection cnn, ref CommandDefi
30493049
return paramReader;
30503050
}
30513051

3052-
private static Func<DbDataReader, object> GetStructDeserializer(Type type, Type effectiveType, int index, bool useGetFieldValue)
3052+
private static Func<DbDataReader, object> GetSimpleValueDeserializer(Type type, Type effectiveType, int index, bool useGetFieldValue)
30533053
{
30543054
// no point using special per-type handling here; it boils down to the same, plus not all are supported anyway (see: SqlDataReader.GetChar - not supported!)
30553055
#pragma warning disable 618
@@ -3578,8 +3578,11 @@ private static void GenerateDeserializerFromMap(Type type, DbDataReader reader,
35783578
if (first && returnNullIfFirstMissing)
35793579
{
35803580
il.Emit(OpCodes.Pop);
3581-
il.Emit(OpCodes.Ldnull); // stack is now [null]
3582-
il.Emit(OpCodes.Stloc, returnValueLocal);
3581+
if (!type.IsValueType) // for struct, the retval is already initialized as default
3582+
{
3583+
il.Emit(OpCodes.Ldnull); // stack is now [null]
3584+
il.Emit(OpCodes.Stloc, returnValueLocal);
3585+
}
35833586
il.Emit(OpCodes.Br, allDone);
35843587
}
35853588

Directory.Build.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<IncludeSymbols>false</IncludeSymbols>
2222
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
2323
<PublishRepositoryUrl>true</PublishRepositoryUrl>
24-
<LangVersion>11</LangVersion>
24+
<LangVersion>12</LangVersion>
2525
<CheckEolTargetFramework>false</CheckEolTargetFramework>
2626
<SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
2727
<PackageReadmeFile>readme.md</PackageReadmeFile>

Directory.Packages.props

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,46 @@
11
<Project>
22
<ItemGroup>
33
<!-- note: 6.2.0 has regressions; don't force the update -->
4-
<PackageVersion Include="DuckDB.NET.Data.Full" Version="0.9.0.3" />
54
<PackageVersion Include="EntityFramework" Version="6.1.3" />
65
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
76
<PackageVersion Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
8-
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" />
7+
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
98
<PackageVersion Include="Microsoft.SqlServer.Types" Version="14.0.1016.290" />
109
<PackageVersion Include="Nerdbank.GitVersioning" Version="3.6.133" />
1110
<PackageVersion Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.3.4" />
1211
<PackageVersion Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
1312

1413
<!-- tests -->
1514
<PackageVersion Include="Belgrade.Sql.Client" Version="1.1.4" />
16-
<PackageVersion Include="BenchmarkDotNet" Version="0.13.7" />
15+
<PackageVersion Include="BenchmarkDotNet" Version="0.13.11" />
1716
<PackageVersion Include="Dashing" Version="2.10.0" />
1817
<PackageVersion Include="Dapper.Contrib" Version="2.0.78" />
19-
<PackageVersion Include="DevExpress.Xpo" Version="23.1.4" />
20-
<PackageVersion Include="FirebirdSql.Data.FirebirdClient" Version="9.1.1" />
21-
<PackageVersion Include="GitHubActionsTestLogger" Version="2.3.2" />
18+
<PackageVersion Include="DuckDB.NET.Data.Full" Version="0.9.2" />
19+
<PackageVersion Include="DevExpress.Xpo" Version="23.2.3" />
20+
<PackageVersion Include="FirebirdSql.Data.FirebirdClient" Version="10.0.0" />
21+
<PackageVersion Include="GitHubActionsTestLogger" Version="2.3.3" />
2222
<PackageVersion Include="Iesi.Collections" Version="4.0.5" />
2323
<PackageVersion Include="linq2db.SqlServer" Version="3.7.0" />
24-
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.1.1" />
24+
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.1.2" />
2525
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.0" />
2626
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0" />
27-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.7.1" />
27+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
2828
<PackageVersion Include="Mighty" Version="3.2.0" />
29-
<PackageVersion Include="MySqlConnector" Version="2.2.7" />
30-
<PackageVersion Include="NHibernate" Version="5.4.5" />
31-
<PackageVersion Include="Norm.net" Version="5.3.7" />
32-
<PackageVersion Include="Npgsql" Version="7.0.4" />
29+
<PackageVersion Include="MySqlConnector" Version="2.3.3" />
30+
<PackageVersion Include="NHibernate" Version="5.5.0" />
31+
<PackageVersion Include="Norm.net" Version="5.4.0" />
32+
<PackageVersion Include="Npgsql" Version="8.0.1" />
3333
<PackageVersion Include="PetaPoco" Version="5.1.306" />
3434
<PackageVersion Include="RepoDb.SqlServer" Version="1.13.1" />
3535
<PackageVersion Include="ServiceStack.OrmLite.SqlServer" Version="6.10.0" />
36-
<PackageVersion Include="Snowflake.Data" Version="2.1.0" />
36+
<PackageVersion Include="Snowflake.Data" Version="2.1.5" />
3737
<PackageVersion Include="SqlMarshal" Version="0.4.4" />
3838
<PackageVersion Include="SubSonic" Version="3.0.0.4" />
3939
<PackageVersion Include="Susanoo.SqlServer" Version="1.2.4.2" />
4040
<PackageVersion Include="System.Data.SqlClient" Version="4.8.5" />
4141
<PackageVersion Include="System.Data.SQLite" Version="1.0.118" />
4242
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
43-
<PackageVersion Include="xunit" Version="2.5.0" />
44-
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.0" />
43+
<PackageVersion Include="xunit" Version="2.6.4" />
44+
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.6" />
4545
</ItemGroup>
4646
</Project>

appveyor.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ skip_commits:
77
- '**/*.md'
88

99
install:
10-
- choco install dotnet-sdk --version 7.0.402
10+
- choco install dotnet-sdk --version 8.0.100
1111

1212
environment:
1313
Appveyor: true

benchmarks/Dapper.Tests.Performance/DapperCacheImpact.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class DapperCacheImpact : BenchmarkBase
1010
[GlobalSetup]
1111
public void Setup() => BaseSetup();
1212

13-
private object args = new { Id = 42, Name = "abc" };
13+
private readonly object args = new { Id = 42, Name = "abc" };
1414

1515
public class Foo
1616
{

benchmarks/Dapper.Tests.Performance/LegacyTests.cs

+1
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ private static void Try(Action action, string blame)
128128
}
129129
}
130130

131+
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1806:Do not ignore method results", Justification = "Intentional - just make sure we have something")]
131132
public async Task RunAsync(int iterations)
132133
{
133134
using (var connection = GetOpenConnection())

global.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"sdk": {
3+
"version": "8.0.100"
4+
}
5+
}

tests/Dapper.Tests/Dapper.Tests.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
<PropertyGroup>
33
<AssemblyName>Dapper.Tests</AssemblyName>
44
<Description>Dapper Core Test Suite</Description>
5-
<TargetFrameworks>net472;net6.0;net7.0</TargetFrameworks>
5+
<TargetFrameworks>net472;net6.0;net8.0</TargetFrameworks>
66
<DefineConstants>$(DefineConstants);MSSQLCLIENT</DefineConstants>
7-
<NoWarn>$(NoWarn);IDE0017;IDE0034;IDE0037;IDE0039;IDE0042;IDE0044;IDE0051;IDE0052;IDE0059;IDE0060;IDE0063;IDE1006;xUnit1004;CA1806;CA1816;CA1822;CA1825;CA2208</NoWarn>
7+
<NoWarn>$(NoWarn);IDE0017;IDE0034;IDE0037;IDE0039;IDE0042;IDE0044;IDE0051;IDE0052;IDE0059;IDE0060;IDE0063;IDE1006;xUnit1004;CA1806;CA1816;CA1822;CA1825;CA2208;CA1861</NoWarn>
88
<Nullable>enable</Nullable>
99
</PropertyGroup>
1010

tests/Dapper.Tests/MiscTests.cs

+11
Original file line numberDiff line numberDiff line change
@@ -1310,5 +1310,16 @@ public HazGetOnlyAndCtor(int idProperty, string nameProperty)
13101310
NameProperty = nameProperty;
13111311
}
13121312
}
1313+
1314+
internal record struct One(int OID);
1315+
internal record struct Two(int OID, string Name);
1316+
1317+
[Fact]
1318+
public async Task QuerySplitStruct() // https://github.com/DapperLib/Dapper/issues/2005
1319+
{
1320+
var results = await connection.QueryAsync<One, Two, (One,Two)>(@"SELECT 1 AS OID, 2 AS OID, 'Name' AS Name", (x,y) => (x,y), splitOn: "OID");
1321+
1322+
Assert.Single(results);
1323+
}
13131324
}
13141325
}

tests/Dapper.Tests/Providers/FirebirdTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void Issue178_Firebird()
3333
connection.Execute("insert into Issue178(id) values(42)");
3434
// raw ADO.net
3535
using (var sqlCmd = new FbCommand(sql, connection))
36-
using (IDataReader reader1 = sqlCmd.ExecuteReader())
36+
using (var reader1 = sqlCmd.ExecuteReader())
3737
{
3838
Assert.True(reader1.Read());
3939
Assert.Equal(1, reader1.GetInt32(0));

tests/Dapper.Tests/Providers/PostgresqlTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void TestPostgresqlArrayParameters()
4949
{
5050
using var conn = GetOpenNpgsqlConnection();
5151

52-
IDbTransaction transaction = conn.BeginTransaction();
52+
var transaction = conn.BeginTransaction();
5353
conn.Execute("create table tcat ( id serial not null, breed character varying(20) not null, name character varying (20) not null);");
5454
conn.Execute("insert into tcat(breed, name) values(:Breed, :Name) ", Cats);
5555

@@ -66,7 +66,7 @@ public void TestPostgresqlListParameters()
6666
{
6767
using var conn = GetOpenNpgsqlConnection();
6868

69-
IDbTransaction transaction = conn.BeginTransaction();
69+
var transaction = conn.BeginTransaction();
7070
conn.Execute("create table tcat ( id serial not null, breed character varying(20) not null, name character varying (20) not null);");
7171
conn.Execute("insert into tcat(breed, name) values(:Breed, :Name) ", new List<Cat>(Cats));
7272

0 commit comments

Comments
 (0)