diff --git a/src/MySqlConnector/MySqlBulkCopy.cs b/src/MySqlConnector/MySqlBulkCopy.cs index 09e37a567..1babc5dab 100644 --- a/src/MySqlConnector/MySqlBulkCopy.cs +++ b/src/MySqlConnector/MySqlBulkCopy.cs @@ -265,7 +265,7 @@ private async ValueTask WriteToServerAsync(IOBehavior ioBeh { if (columnMapping.DestinationColumn.Length == 0) throw new InvalidOperationException($"MySqlBulkCopyColumnMapping.DestinationName is not set for SourceOrdinal {columnMapping.SourceOrdinal}"); - if (columnMapping.DestinationColumn[0] == '@') + if (columnMapping.DestinationColumn[0] == '@' && columnMapping.Expression is not null) bulkLoader.Columns.Add(columnMapping.DestinationColumn); else bulkLoader.Columns.Add(QuoteIdentifier(columnMapping.DestinationColumn)); diff --git a/tests/IntegrationTests/BulkLoaderSync.cs b/tests/IntegrationTests/BulkLoaderSync.cs index c141eb688..7c40a36bc 100644 --- a/tests/IntegrationTests/BulkLoaderSync.cs +++ b/tests/IntegrationTests/BulkLoaderSync.cs @@ -530,7 +530,6 @@ public void BulkCopyNullDataTable() Assert.Throws(() => bulkCopy.WriteToServer(default(DataTable))); } -#if !MYSQL_DATA [Fact] public void BulkCopyDataTableWithMySqlDecimal() { @@ -655,7 +654,6 @@ public void BulkCopyDataTableWithTimeOnly() Assert.Equal(new TimeOnly(1, 2, 3, 456), reader.GetTimeOnly(2)); } } -#endif #endif public static IEnumerable GetBulkCopyData() => @@ -713,6 +711,50 @@ public void BulkCopyDataTable(string columnType, object[] rows) } } + [Fact] + public void BulkCopyToColumnNeedingQuoting() + { + var dataTable = new DataTable() + { + Columns = + { + new DataColumn("id", typeof(int)), + new DataColumn("@a", typeof(string)), + }, + }; + dataTable.Rows.Add(2, "two"); + + using var connection = new MySqlConnection(GetLocalConnectionString()); + connection.Open(); + using (var cmd = new MySqlCommand($""" + drop table if exists bulk_load_quoted_identifier; + create table bulk_load_quoted_identifier(id int, `@a` text); + insert into bulk_load_quoted_identifier values (1, 'one'); + """, connection)) + { + cmd.ExecuteNonQuery(); + } + + var bulkCopy = new MySqlBulkCopy(connection) + { + DestinationTableName = "bulk_load_quoted_identifier", + }; + var result = bulkCopy.WriteToServer(dataTable); + Assert.Equal(1, result.RowsInserted); + Assert.Empty(result.Warnings); + + using (var cmd = new MySqlCommand(@"select `@a` from bulk_load_quoted_identifier order by id;", connection)) + { + using var reader = cmd.ExecuteReader(); + Assert.True(reader.Read()); + Assert.Equal("one", reader.GetString(0)); + Assert.True(reader.Read()); + Assert.Equal("two", reader.GetString(0)); + Assert.False(reader.Read()); + Assert.False(reader.NextResult()); + } + } + [Fact] public void BulkCopyDataTableWithLongBlob() {