Skip to content

Commit a865efb

Browse files
committed
Set MySqlParameter.Size in DeriveParameters. Fixes #1125
1 parent 69e8353 commit a865efb

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

src/MySqlConnector/Core/CachedParameter.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ public CachedParameter(int ordinalPosition, string? mode, string name, string da
1515
Direction = ParameterDirection.Output;
1616
Name = name;
1717
MySqlDbType = TypeMapper.Instance.GetMySqlDbType(dataType, unsigned, length);
18+
Length = length;
1819
}
1920

2021
public int Position { get; }
2122
public ParameterDirection Direction { get; }
2223
public string Name { get; }
2324
public MySqlDbType MySqlDbType { get; }
25+
public int Length { get; }
2426
}

src/MySqlConnector/MySqlCommandBuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ private static async Task DeriveParametersAsync(IOBehavior ioBehavior, MySqlComm
3535
{
3636
var parameter = command.Parameters.Add("@" + cachedParameter.Name, cachedParameter.MySqlDbType);
3737
parameter.Direction = cachedParameter.Direction;
38+
parameter.Size = cachedParameter.Length;
3839
}
3940
}
4041

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,75 @@ OUT param2 VARCHAR(100))
663663
}
664664
}
665665

666+
[Theory]
667+
[InlineData("bit(1)", 1)]
668+
[InlineData("bit(10)", 10)]
669+
#if !BASELINE
670+
[InlineData("bool", 1)]
671+
[InlineData("tinyint(1)", 1)]
672+
#endif
673+
[InlineData("char(30)", 30)]
674+
[InlineData("mediumtext", 0)]
675+
[InlineData("varchar(50)", 50)]
676+
// These return nonzero sizes for some versions of MySQL Server 8.0
677+
// [InlineData("bit", 0)]
678+
// [InlineData("tinyint", 0)]
679+
// [InlineData("bigint", 0)]
680+
// [InlineData("bigint unsigned", 0)]
681+
public void DeriveParametersParameterSize(string parameterType, int expectedSize)
682+
{
683+
var csb = AppConfig.CreateConnectionStringBuilder();
684+
csb.Pooling = false;
685+
using var connection = new MySqlConnection(csb.ConnectionString);
686+
connection.Open();
687+
688+
using (var cmd = new MySqlCommand($"drop procedure if exists parameter_size; create procedure parameter_size(in param1 {parameterType}) begin end;", connection))
689+
cmd.ExecuteNonQuery();
690+
691+
using (var cmd = new MySqlCommand("parameter_size", connection))
692+
{
693+
cmd.CommandType = CommandType.StoredProcedure;
694+
MySqlCommandBuilder.DeriveParameters(cmd);
695+
var parameter = (MySqlParameter) Assert.Single(cmd.Parameters);
696+
Assert.Equal(expectedSize, parameter.Size);
697+
}
698+
}
699+
700+
[Theory]
701+
[InlineData("bit", MySqlDbType.Bit)]
702+
[InlineData("bit(1)", MySqlDbType.Bit)]
703+
#if BASELINE
704+
[InlineData("bool", MySqlDbType.Byte)]
705+
[InlineData("tinyint(1)", MySqlDbType.Byte)]
706+
#else
707+
[InlineData("bool", MySqlDbType.Bool)]
708+
[InlineData("tinyint(1)", MySqlDbType.Bool)]
709+
#endif
710+
[InlineData("tinyint", MySqlDbType.Byte)]
711+
[InlineData("bigint", MySqlDbType.Int64)]
712+
[InlineData("bigint unsigned", MySqlDbType.UInt64)]
713+
[InlineData("char(30)", MySqlDbType.String)]
714+
[InlineData("mediumtext", MySqlDbType.MediumText)]
715+
[InlineData("varchar(50)", MySqlDbType.VarChar)]
716+
public void DeriveParametersParameterType(string parameterType, MySqlDbType expectedType)
717+
{
718+
var csb = AppConfig.CreateConnectionStringBuilder();
719+
csb.Pooling = false;
720+
using var connection = new MySqlConnection(csb.ConnectionString);
721+
connection.Open();
722+
723+
using (var cmd = new MySqlCommand($"drop procedure if exists parameter_size; create procedure parameter_size(in param1 {parameterType}) begin end;", connection))
724+
cmd.ExecuteNonQuery();
725+
726+
using (var cmd = new MySqlCommand("parameter_size", connection))
727+
{
728+
cmd.CommandType = CommandType.StoredProcedure;
729+
MySqlCommandBuilder.DeriveParameters(cmd);
730+
var parameter = (MySqlParameter) Assert.Single(cmd.Parameters);
731+
Assert.Equal(expectedType, parameter.MySqlDbType);
732+
}
733+
}
734+
666735
[SkippableFact(ServerFeatures.Json, Baseline = "https://bugs.mysql.com/bug.php?id=89335")]
667736
public void DeriveParametersSetJson()
668737
{

0 commit comments

Comments
 (0)