Skip to content

Commit 58e3a4c

Browse files
authored
Allowing using SchemaOnly without setting parameter values (#4673)
Fixes #4672
1 parent 4cc77c5 commit 58e3a4c

File tree

4 files changed

+29
-11
lines changed

4 files changed

+29
-11
lines changed

src/Npgsql/NpgsqlCommand.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ Task Prepare(bool async, CancellationToken cancellationToken = default)
634634
{
635635
foreach (var batchCommand in InternalBatchCommands)
636636
{
637-
batchCommand.Parameters.ProcessParameters(connector.TypeMapper, validate: false);
637+
batchCommand.Parameters.ProcessParameters(connector.TypeMapper, validateValues: false);
638638
ProcessRawQuery(connector.SqlQueryParser, connector.UseConformingStrings, batchCommand);
639639

640640
needToPrepare = batchCommand.ExplicitPrepare(connector) || needToPrepare;
@@ -645,7 +645,7 @@ Task Prepare(bool async, CancellationToken cancellationToken = default)
645645
}
646646
else
647647
{
648-
Parameters.ProcessParameters(connector.TypeMapper, validate: false);
648+
Parameters.ProcessParameters(connector.TypeMapper, validateValues: false);
649649
ProcessRawQuery(connector.SqlQueryParser, connector.UseConformingStrings, batchCommand: null);
650650

651651
foreach (var batchCommand in InternalBatchCommands)
@@ -1307,6 +1307,8 @@ internal virtual async ValueTask<NpgsqlDataReader> ExecuteReader(CommandBehavior
13071307

13081308
Task? sendTask;
13091309

1310+
var validateParameterValues = !behavior.HasFlag(CommandBehavior.SchemaOnly);
1311+
13101312
try
13111313
{
13121314
switch (IsExplicitlyPrepared)
@@ -1324,9 +1326,9 @@ internal virtual async ValueTask<NpgsqlDataReader> ExecuteReader(CommandBehavior
13241326

13251327
if (IsWrappedByBatch)
13261328
foreach (var batchCommand in InternalBatchCommands)
1327-
batchCommand.Parameters.ProcessParameters(connector.TypeMapper, validate: true);
1329+
batchCommand.Parameters.ProcessParameters(connector.TypeMapper, validateParameterValues);
13281330
else
1329-
Parameters.ProcessParameters(connector.TypeMapper, validate: true);
1331+
Parameters.ProcessParameters(connector.TypeMapper, validateParameterValues);
13301332

13311333
NpgsqlEventSource.Log.CommandStartPrepared();
13321334
break;
@@ -1340,7 +1342,7 @@ internal virtual async ValueTask<NpgsqlDataReader> ExecuteReader(CommandBehavior
13401342
{
13411343
var batchCommand = InternalBatchCommands[i];
13421344

1343-
batchCommand.Parameters.ProcessParameters(connector.TypeMapper, validate: true);
1345+
batchCommand.Parameters.ProcessParameters(connector.TypeMapper, validateParameterValues);
13441346
ProcessRawQuery(connector.SqlQueryParser, connector.UseConformingStrings, batchCommand);
13451347

13461348
if (connector.Settings.MaxAutoPrepare > 0 && batchCommand.TryAutoPrepare(connector))
@@ -1349,7 +1351,7 @@ internal virtual async ValueTask<NpgsqlDataReader> ExecuteReader(CommandBehavior
13491351
}
13501352
else
13511353
{
1352-
Parameters.ProcessParameters(connector.TypeMapper, validate: true);
1354+
Parameters.ProcessParameters(connector.TypeMapper, validateParameterValues);
13531355
ProcessRawQuery(connector.SqlQueryParser, connector.UseConformingStrings, batchCommand: null);
13541356

13551357
if (connector.Settings.MaxAutoPrepare > 0)
@@ -1441,13 +1443,13 @@ internal virtual async ValueTask<NpgsqlDataReader> ExecuteReader(CommandBehavior
14411443
{
14421444
foreach (var batchCommand in InternalBatchCommands)
14431445
{
1444-
batchCommand.Parameters.ProcessParameters(pool.MultiplexingTypeMapper!, validate: true);
1446+
batchCommand.Parameters.ProcessParameters(pool.MultiplexingTypeMapper!, validateValues: true);
14451447
ProcessRawQuery(null, standardConformingStrings: true, batchCommand);
14461448
}
14471449
}
14481450
else
14491451
{
1450-
Parameters.ProcessParameters(pool.MultiplexingTypeMapper!, validate: true);
1452+
Parameters.ProcessParameters(pool.MultiplexingTypeMapper!, validateValues: true);
14511453
ProcessRawQuery(null, standardConformingStrings: true, batchCommand: null);
14521454
}
14531455

src/Npgsql/NpgsqlParameterCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ internal void CloneTo(NpgsqlParameterCollection other)
679679
}
680680
}
681681

682-
internal void ProcessParameters(ConnectorTypeMapper typeMapper, bool validate)
682+
internal void ProcessParameters(ConnectorTypeMapper typeMapper, bool validateValues)
683683
{
684684
HasOutputParameters = false;
685685
PlaceholderType = PlaceholderType.NoParameters;
@@ -736,7 +736,7 @@ internal void ProcessParameters(ConnectorTypeMapper typeMapper, bool validate)
736736

737737
p.Bind(typeMapper);
738738

739-
if (validate)
739+
if (validateValues)
740740
{
741741
p.LengthCache?.Clear();
742742
p.ValidateAndGetLength();

test/Npgsql.Tests/PrepareTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public void Unprepare()
109109
public Task UnprepareAsync()
110110
=> Unprepare(true);
111111

112-
private async Task Unprepare(bool async)
112+
async Task Unprepare(bool async)
113113
{
114114
using var conn = OpenConnectionAndUnprepare();
115115
AssertNumPreparedStatements(conn, 0);

test/Npgsql.Tests/ReaderNewSchemaTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,22 @@ public async Task IsAliased()
723723
Assert.That(columns[2].IsAliased, Is.Null);
724724
}
725725

726+
[Test] // #4672
727+
public async Task With_parameter_without_value()
728+
{
729+
await using var conn = await OpenConnectionAsync();
730+
await using var _ = await CreateTempTable(conn, "foo INTEGER", out var table);
731+
732+
using var cmd = new NpgsqlCommand($"SELECT foo FROM {table} WHERE foo > @p", conn)
733+
{
734+
Parameters = { new() { ParameterName = "p", NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Integer } }
735+
};
736+
await using var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo);
737+
738+
var columns = await GetColumnSchema(reader);
739+
Assert.That(columns[0].ColumnName, Is.EqualTo("foo"));
740+
}
741+
726742
#region Not supported
727743

728744
[Test]

0 commit comments

Comments
 (0)