This is an automated email from the ASF dual-hosted git repository.

ptupitsyn pushed a commit to branch ignite-27278
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 583afbd7921673ac4970e958faa711f838ef7440
Author: Pavel Tupitsyn <[email protected]>
AuthorDate: Tue Dec 23 15:35:18 2025 +0200

    Propagate rowReaderArg
---
 .../Internal/Linq/IgniteQueryExecutor.cs           |  3 +-
 .../dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs | 11 ++++--
 .../dotnet/Apache.Ignite/Internal/Sql/RowReader.cs |  3 +-
 .../Apache.Ignite/Internal/Sql/RowReaderFactory.cs |  3 +-
 .../dotnet/Apache.Ignite/Internal/Sql/Sql.cs       | 45 ++++++++++------------
 5 files changed, 33 insertions(+), 32 deletions(-)

diff --git 
a/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs 
b/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs
index e17fa47d80f..f332f41578a 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite/Internal/Linq/IgniteQueryExecutor.cs
@@ -139,7 +139,8 @@ internal sealed class IgniteQueryExecutor : IQueryExecutor
         IResultSet<T> resultSet = await _sql.ExecuteAsyncInternal(
             _transaction,
             statement,
-            cols => ResultSelector.Get<T>(cols, 
queryModel.SelectClause.Selector, selectorOptions),
+            meta => ResultSelector.Get<T>(meta.Columns, 
queryModel.SelectClause.Selector, selectorOptions),
+            rowReaderArg: null,
             queryData.Parameters,
             CancellationToken.None)
             .ConfigureAwait(false);
diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs 
b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs
index 91f081900b4..798079578b1 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/ResultSet.cs
@@ -48,6 +48,8 @@ namespace Apache.Ignite.Internal.Sql
 
         private readonly RowReader<T>? _rowReader;
 
+        private readonly object? _rowReaderArg;
+
         private readonly CancellationToken _cancellationToken;
 
         private bool _resourceClosed;
@@ -62,13 +64,13 @@ namespace Apache.Ignite.Internal.Sql
         /// <param name="socket">Socket.</param>
         /// <param name="buf">Buffer to read initial data from.</param>
         /// <param name="rowReaderFactory">Row reader factory.</param>
-        /// <param name="rowReaderFactoryArg">Row reader factory 
argument.</param>
+        /// <param name="rowReaderArg">Row reader argument.</param>
         /// <param name="cancellationToken">Cancellation token.</param>
         public ResultSet(
             ClientSocket socket,
             PooledBuffer buf,
             RowReaderFactory<T> rowReaderFactory,
-            object? rowReaderFactoryArg,
+            object? rowReaderArg,
             CancellationToken cancellationToken)
         {
             _socket = socket;
@@ -85,7 +87,8 @@ namespace Apache.Ignite.Internal.Sql
             AffectedRows = reader.ReadInt64();
 
             _metadata = HasRowSet ? ReadMeta(ref reader) : null;
-            _rowReader = _metadata != null ? rowReaderFactory(_metadata, 
rowReaderFactoryArg) : null;
+            _rowReader = _metadata != null ? rowReaderFactory(_metadata) : 
null;
+            _rowReaderArg = rowReaderArg;
 
             if (HasRowSet)
             {
@@ -329,7 +332,7 @@ namespace Apache.Ignite.Internal.Sql
         {
             var tupleReader = new BinaryTupleReader(reader.ReadBinary(), 
_metadata!.Columns.Count);
 
-            return _rowReader!(_metadata, ref tupleReader);
+            return _rowReader!(_metadata, ref tupleReader, _rowReaderArg);
         }
 
         private async IAsyncEnumerable<T> EnumerateRows()
diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs 
b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs
index 8072cd8b2b4..37daa714df1 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReader.cs
@@ -24,6 +24,7 @@ using Proto.BinaryTuple;
 /// </summary>
 /// <param name="metadata">Metadata.</param>
 /// <param name="tupleReader">Tuple reader.</param>
+/// <param name="arg">Argument.</param>
 /// <typeparam name="T">Result type.</typeparam>
 /// <returns>Resulting row.</returns>
-internal delegate T RowReader<out T>(ResultSetMetadata metadata, ref 
BinaryTupleReader tupleReader);
+internal delegate T RowReader<out T>(ResultSetMetadata metadata, ref 
BinaryTupleReader tupleReader, object? arg);
diff --git 
a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs 
b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs
index 73ee3548b94..73889c97ec7 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/RowReaderFactory.cs
@@ -21,7 +21,6 @@ namespace Apache.Ignite.Internal.Sql;
 /// Row reader factory.
 /// </summary>
 /// <param name="metadata">Metadata.</param>
-/// <param name="arg">Argument.</param>
 /// <typeparam name="T">Result type.</typeparam>
 /// <returns>Resulting row.</returns>
-internal delegate RowReader<T> RowReaderFactory<out T>(ResultSetMetadata 
metadata, object? arg);
+internal delegate RowReader<T> RowReaderFactory<out T>(ResultSetMetadata 
metadata);
diff --git a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs 
b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs
index da63f07b466..7d1eb0e6a58 100644
--- a/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs
+++ b/modules/platforms/dotnet/Apache.Ignite/Internal/Sql/Sql.cs
@@ -42,9 +42,9 @@ namespace Apache.Ignite.Internal.Sql
     internal sealed class Sql : ISql
     {
         private static readonly RowReader<IIgniteTuple> TupleReader =
-            static (ResultSetMetadata metadata, ref BinaryTupleReader reader) 
=> ReadTuple(metadata.Columns, ref reader);
+            static (ResultSetMetadata metadata, ref BinaryTupleReader reader, 
object? _) => ReadTuple(metadata.Columns, ref reader);
 
-        private static readonly RowReaderFactory<IIgniteTuple> 
TupleReaderFactory = static (_, _) => TupleReader;
+        private static readonly RowReaderFactory<IIgniteTuple> 
TupleReaderFactory = static _ => TupleReader;
 
         /** Underlying connection. */
         private readonly ClientFailoverSocket _socket;
@@ -65,7 +65,7 @@ namespace Apache.Ignite.Internal.Sql
                 transaction,
                 statement,
                 TupleReaderFactory,
-                rowReaderFactoryArg: null,
+                rowReaderArg: null,
                 args,
                 cancellationToken)
                 .ConfigureAwait(false);
@@ -77,8 +77,8 @@ namespace Apache.Ignite.Internal.Sql
             await ExecuteAsyncInternal(
                     transaction,
                     statement,
-                    static (meta, _) => GetReaderFactory<T>(meta),
-                    rowReaderFactoryArg: null,
+                    static meta => GetReaderFactory<T>(meta),
+                    rowReaderArg: null,
                     args,
                     cancellationToken)
                 .ConfigureAwait(false);
@@ -91,26 +91,23 @@ namespace Apache.Ignite.Internal.Sql
             CancellationToken cancellationToken,
             params object?[]? args)
         {
-            // TODO: avoid allocation
-            RowReaderFactory<T> rowReaderFactory = static (meta, arg) =>
-            {
-                return (ResultSetMetadata meta, ref BinaryTupleReader reader) 
=>
-                {
-                    var mapperReader = new RowReader(ref reader, meta);
-                    var mapper = (IMapper<T>)arg!;
-
-                    return mapper.Read(ref mapperReader, meta);
-                };
-            };
-
             return await ExecuteAsyncInternal(
                     transaction,
                     statement,
-                    rowReaderFactory,
-                    rowReaderFactoryArg: mapper,
+                    RowReaderFactory,
+                    rowReaderArg: mapper,
                     args,
                     cancellationToken)
                 .ConfigureAwait(false);
+
+            static RowReader<T> RowReaderFactory(ResultSetMetadata 
resultSetMetadata) =>
+                static (ResultSetMetadata meta, ref BinaryTupleReader reader, 
object? arg) =>
+                {
+                    var mapperReader = new RowReader(ref reader, meta);
+                    var mapper = (IMapper<T>)arg!;
+
+                    return mapper.Read(ref mapperReader, meta);
+                };
         }
 
         /// <inheritdoc/>
@@ -120,8 +117,8 @@ namespace Apache.Ignite.Internal.Sql
             var resultSet = await ExecuteAsyncInternal<object>(
                 transaction,
                 statement,
-                static (_, _) => null!,
-                rowReaderFactoryArg: null,
+                static _ => null!,
+                rowReaderArg: null,
                 args,
                 cancellationToken).ConfigureAwait(false);
 
@@ -259,7 +256,7 @@ namespace Apache.Ignite.Internal.Sql
         /// <param name="transaction">Optional transaction.</param>
         /// <param name="statement">Statement to execute.</param>
         /// <param name="rowReaderFactory">Row reader factory.</param>
-        /// <param name="rowReaderFactoryArg">Row reader factory arg.</param>
+        /// <param name="rowReaderArg">Row reader arg.</param>
         /// <param name="args">Arguments for the statement.</param>
         /// <param name="cancellationToken">Cancellation token.</param>
         /// <typeparam name="T">Row type.</typeparam>
@@ -268,7 +265,7 @@ namespace Apache.Ignite.Internal.Sql
             ITransaction? transaction,
             SqlStatement statement,
             RowReaderFactory<T> rowReaderFactory,
-            object? rowReaderFactoryArg,
+            object? rowReaderArg,
             ICollection<object?>? args,
             CancellationToken cancellationToken)
         {
@@ -288,7 +285,7 @@ namespace Apache.Ignite.Internal.Sql
                     ClientOp.SqlExec, tx, bufferWriter, cancellationToken: 
cancellationToken).ConfigureAwait(false);
 
                 // ResultSet will dispose the pooled buffer.
-                return new ResultSet<T>(socket, buf, rowReaderFactory, 
rowReaderFactoryArg, cancellationToken);
+                return new ResultSet<T>(socket, buf, rowReaderFactory, 
rowReaderArg, cancellationToken);
             }
             catch (SqlException e)
             {

Reply via email to