Skip to content

Commit 0a78bc1

Browse files
committed
Allow all decimals to be converted to ints. Fixes #832
1 parent 2be473e commit 0a78bc1

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/MySqlConnector/Core/Row.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,20 +213,23 @@ public int GetInt32(int ordinal)
213213
throw new InvalidCastException();
214214

215215
var columnDefinition = ResultSet.ColumnDefinitions[ordinal];
216-
if (columnDefinition.ColumnType != ColumnType.Tiny &&
216+
if (columnDefinition.ColumnType == ColumnType.Decimal || columnDefinition.ColumnType == ColumnType.NewDecimal)
217+
{
218+
return (int) (decimal) GetValue(ordinal);
219+
}
220+
else if (columnDefinition.ColumnType != ColumnType.Tiny &&
217221
columnDefinition.ColumnType != ColumnType.Short &&
218222
columnDefinition.ColumnType != ColumnType.Int24 &&
219223
columnDefinition.ColumnType != ColumnType.Long &&
220224
columnDefinition.ColumnType != ColumnType.Longlong &&
221225
columnDefinition.ColumnType != ColumnType.Bit &&
222-
columnDefinition.ColumnType != ColumnType.Year &&
223-
columnDefinition.ColumnType != ColumnType.Decimal &&
224-
columnDefinition.ColumnType != ColumnType.NewDecimal)
226+
columnDefinition.ColumnType != ColumnType.Year)
225227
{
226228
throw new InvalidCastException("Can't convert {0} to Int32".FormatInvariant(ResultSet.ColumnTypes![ordinal]));
227229
}
228230

229231
var data = m_data.Slice(m_dataOffsets[ordinal], m_dataLengths[ordinal]).Span;
232+
System.Console.WriteLine(System.Text.Encoding.UTF8.GetString(data));
230233

231234
if (columnDefinition.ColumnType == ColumnType.Bit)
232235
return checked((int) ReadBit(data, columnDefinition));

tests/SideBySide/QueryTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,34 @@ public void SumInts(bool prepareCommand)
633633
Assert.Equal(4294967296L, reader.GetInt64(0));
634634
}
635635

636+
[Theory]
637+
[InlineData(false)]
638+
[InlineData(true)]
639+
public void DivideInts(bool prepareCommand)
640+
{
641+
var csb = AppConfig.CreateConnectionStringBuilder();
642+
csb.IgnorePrepare = !prepareCommand;
643+
using var connection = new MySqlConnection(csb.ConnectionString);
644+
connection.Open();
645+
646+
using var cmd = new MySqlCommand("select 2 / 1;", connection);
647+
cmd.Prepare();
648+
using var reader = cmd.ExecuteReader();
649+
Assert.True(reader.Read());
650+
Assert.Equal(2.000m, reader.GetValue(0));
651+
Assert.Equal(2.000m, reader.GetDecimal(0));
652+
#if !BASELINE
653+
Assert.Equal((byte) 2, reader.GetByte(0));
654+
Assert.Equal((sbyte) 2, reader.GetSByte(0));
655+
#endif
656+
Assert.Equal((short) 2, reader.GetInt16(0));
657+
Assert.Equal((ushort) 2, reader.GetUInt16(0));
658+
Assert.Equal(2, reader.GetInt32(0));
659+
Assert.Equal(2u, reader.GetUInt32(0));
660+
Assert.Equal(2L, reader.GetInt64(0));
661+
Assert.Equal(2ul, reader.GetUInt64(0));
662+
}
663+
636664
[Fact]
637665
public void UseReaderWithoutDisposing()
638666
{

0 commit comments

Comments
 (0)