Skip to content

Commit 8e3b9da

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

File tree

2 files changed

+67
-5
lines changed

2 files changed

+67
-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: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,67 @@ 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+
bulkCopy.WriteToServer(dt);
1176+
1177+
cmd.CommandText = "SELECT COUNT(*) FROM bulk_copy_year WHERE int_value IN (1, 2) AND year_value IS NULL";
1178+
Assert.Equal(2, Convert.ToInt32(cmd.ExecuteScalar()));
1179+
}
1180+
1181+
[Fact]
1182+
public void BulkCopyToTableWithYearNotSupported()
1183+
{
1184+
using var connection = new MySqlConnection(GetLocalConnectionString());
1185+
connection.Open();
1186+
1187+
using var cmd = connection.CreateCommand();
1188+
cmd.CommandText = """
1189+
DROP TABLE IF EXISTS bulk_copy_year;
1190+
CREATE TABLE bulk_copy_year(int_value int NULL, year_value year NULL)
1191+
""";
1192+
cmd.ExecuteNonQuery();
1193+
1194+
var bulkCopy = new MySqlBulkCopy(connection)
1195+
{
1196+
DestinationTableName = "bulk_copy_year",
1197+
};
1198+
1199+
var dt = new DataTable();
1200+
dt.Columns.Add("numbers");
1201+
dt.Columns.Add("year");
1202+
dt.Rows.Add(1, 2000);
1203+
dt.Rows.Add(2, 2001);
1204+
1205+
var exception = Assert.Throws<NotSupportedException>(() => bulkCopy.WriteToServer(dt));
1206+
Assert.Equal("'YEAR' columns are not supported by MySqlBulkCopy.", exception.Message);
1207+
}
1208+
11481209
[Fact]
11491210
public void BulkCopyDoesNotInsertAllRows()
11501211
{

0 commit comments

Comments
 (0)