Skip to content

Commit 09be112

Browse files
committed
Only prohibit 'YEAR' in default mappings. Fixes #1605
1 parent 5483513 commit 09be112

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

src/MySqlConnector/MySqlBulkCopy.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,6 @@ private async ValueTask<MySqlBulkCopyResult> WriteToServerAsync(IOBehavior ioBeh
238238
{
239239
AddColumnMapping(m_logger, columnMappings, addDefaultMappings, i, destinationColumn, $"@`\uE002\bcol{i}`", $"%COL% = CAST(%VAR% AS UNSIGNED)");
240240
}
241-
else if (schema[i].DataTypeName == "YEAR")
242-
{
243-
// the current code can't distinguish between 0 = 0000 and 0 = 2000
244-
throw new NotSupportedException("'YEAR' columns are not supported by MySqlBulkLoader.");
245-
}
246241
else
247242
{
248243
var type = schema[i].DataType;
@@ -252,6 +247,12 @@ private async ValueTask<MySqlBulkCopyResult> WriteToServerAsync(IOBehavior ioBeh
252247
}
253248
else if (addDefaultMappings)
254249
{
250+
if (schema[i].DataTypeName == "YEAR")
251+
{
252+
// the current code can't distinguish between 0 = 0000 and 0 = 2000
253+
throw new NotSupportedException("'YEAR' columns are not supported by MySqlBulkCopy.");
254+
}
255+
255256
Log.AddingDefaultColumnMapping(m_logger, i, destinationColumn);
256257
columnMappings.Add(new(i, destinationColumn));
257258
}

tests/IntegrationTests/BulkLoaderSync.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,66 @@ public void BulkCopyColumnMappingsInvalidDestinationColumn()
11451145
Assert.Throws<InvalidOperationException>(() => bulkCopy.WriteToServer(dataTable));
11461146
}
11471147

1148+
[Fact]
1149+
public void BulkCopyToTableWithYear()
1150+
{
1151+
using var connection = new MySqlConnection(GetLocalConnectionString());
1152+
connection.Open();
1153+
1154+
using var cmd = connection.CreateCommand();
1155+
cmd.CommandText = """
1156+
DROP TABLE IF EXISTS bulk_copy_year;
1157+
CREATE TABLE bulk_copy_year(int_value int NULL, year_value year NULL)
1158+
""";
1159+
cmd.ExecuteNonQuery();
1160+
1161+
var bulkCopy = new MySqlBulkCopy(connection)
1162+
{
1163+
DestinationTableName = "bulk_copy_year",
1164+
ColumnMappings =
1165+
{
1166+
new MySqlBulkCopyColumnMapping(0, "int_value", null),
1167+
},
1168+
};
1169+
1170+
var dt = new DataTable();
1171+
dt.Columns.Add("numbers");
1172+
dt.Rows.Add(1);
1173+
dt.Rows.Add(2);
1174+
1175+
var result = bulkCopy.WriteToServer(dt);
1176+
Assert.Equal(2, result.RowsInserted);
1177+
Assert.Empty(result.Warnings);
1178+
}
1179+
1180+
[Fact]
1181+
public void BulkCopyToTableWithYearNotSupported()
1182+
{
1183+
using var connection = new MySqlConnection(GetLocalConnectionString());
1184+
connection.Open();
1185+
1186+
using var cmd = connection.CreateCommand();
1187+
cmd.CommandText = """
1188+
DROP TABLE IF EXISTS bulk_copy_year;
1189+
CREATE TABLE bulk_copy_year(int_value int NULL, year_value year NULL)
1190+
""";
1191+
cmd.ExecuteNonQuery();
1192+
1193+
var bulkCopy = new MySqlBulkCopy(connection)
1194+
{
1195+
DestinationTableName = "bulk_copy_year",
1196+
};
1197+
1198+
var dt = new DataTable();
1199+
dt.Columns.Add("numbers");
1200+
dt.Columns.Add("year");
1201+
dt.Rows.Add(1, 2000);
1202+
dt.Rows.Add(2, 2001);
1203+
1204+
var exception = Assert.Throws<NotSupportedException>(() => bulkCopy.WriteToServer(dt));
1205+
Assert.Equal("'YEAR' columns are not supported by MySqlBulkCopy.", exception.Message);
1206+
}
1207+
11481208
[Fact]
11491209
public void BulkCopyDoesNotInsertAllRows()
11501210
{

0 commit comments

Comments
 (0)