Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update SQL Server Ce Generator to use SELECT UNION ALL syntax to supp… #682

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 16 additions & 10 deletions src/FluentMigrator.Runner/Generators/Generic/GenericGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -250,28 +250,34 @@ public override string Generate(InsertDataExpression expression)
string errors = ValidateAdditionalFeatureCompatibility(expression.AdditionalFeatures);
if (!string.IsNullOrEmpty(errors)) return errors;

List<string> columnNames = new List<string>();
List<string> columnValues = new List<string>();
List<string> insertStrings = new List<string>();
var insertStrings = GenerateColumnNamesAndValues(expression).Select(x => String.Format(InsertData, Quoter.QuoteTableName(expression.TableName),x.Key, x.Value));
return String.Join("; ", insertStrings.ToArray());
}

protected List<KeyValuePair<string,string>> GenerateColumnNamesAndValues(InsertDataExpression expression)
{
var insertStrings = new List<KeyValuePair<string, string>>();

foreach (InsertionDataDefinition row in expression.Rows)
{
columnNames.Clear();
columnValues.Clear();
var columnNames = new List<string>();
var columnValues = new List<string>();
foreach (KeyValuePair<string, object> item in row)
{
columnNames.Add(Quoter.QuoteColumnName(item.Key));
columnValues.Add(Quoter.QuoteValue(item.Value));
}

string columns = String.Join(", ", columnNames.ToArray());
string values = String.Join(", ", columnValues.ToArray());
insertStrings.Add(String.Format(InsertData, Quoter.QuoteTableName(expression.TableName), columns, values));
var columns = String.Join(", ", columnNames.ToArray());
var values = String.Join(", ", columnValues.ToArray());
insertStrings.Add(new KeyValuePair<string, string>(columns, values));
}
return String.Join("; ", insertStrings.ToArray());

return insertStrings;
}

private string ValidateAdditionalFeatureCompatibility(IEnumerable<KeyValuePair<string, object>> features)

protected string ValidateAdditionalFeatureCompatibility(IEnumerable<KeyValuePair<string, object>> features)
{
if (compatabilityMode == CompatabilityMode.STRICT) {
List<string> unsupportedFeatures =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ public SqlServerCeGenerator()
{
}

public override string InsertData
{
get { return "INSERT INTO {0} ({1}) {2}"; }
}

public override string GetClusterTypeString(CreateIndexExpression column)
{
// Only nonclusterd
Expand Down Expand Up @@ -95,5 +100,25 @@ public override string Generate(DeleteDefaultConstraintExpression expression)
{
throw new DatabaseOperationNotSupportedException();
}

public override string Generate(InsertDataExpression expression)
{
var errors = ValidateAdditionalFeatureCompatibility(expression.AdditionalFeatures);
if (!string.IsNullOrEmpty(errors)) return errors;

var columnNamesValues = GenerateColumnNamesAndValues(expression);
var selectStrings = columnNamesValues.Select(kv => "SELECT " + kv.Value);

var sql = String.Format(InsertData, Quoter.QuoteTableName(expression.TableName), columnNamesValues.FirstOrDefault().Key, String.Join(" UNION ALL ", selectStrings.ToArray()));

if (IsUsingIdentityInsert(expression))
{
return string.Format("{0}; {1}; {2}",
string.Format(IdentityInsert, Quoter.QuoteTableName(expression.TableName), "ON"),
sql,
string.Format(IdentityInsert, Quoter.QuoteTableName(expression.TableName), "OFF"));
}
return sql;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ public override void CanInsertDataWithCustomSchema()
var expression = GeneratorTestHelper.GetInsertDataExpression();
expression.SchemaName = "TestSchema";

var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');";
expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org')";
var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'";
expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org'";

var result = Generator.Generate(expression);
result.ShouldBe(expected);
Expand All @@ -91,8 +91,8 @@ public override void CanInsertDataWithDefaultSchema()
{
var expression = GeneratorTestHelper.GetInsertDataExpression();

var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');";
expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org')";
var expected = "INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'";
expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org'";

var result = Generator.Generate(expression);
result.ShouldBe(expected);
Expand All @@ -105,7 +105,7 @@ public override void CanInsertGuidDataWithCustomSchema()
expression.SchemaName = "TestSchema";

var result = Generator.Generate(expression);
result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) VALUES ('{0}')", GeneratorTestHelper.TestGuid.ToString()));
result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) SELECT '{0}'", GeneratorTestHelper.TestGuid.ToString()));
}

[Test]
Expand All @@ -114,7 +114,7 @@ public override void CanInsertGuidDataWithDefaultSchema()
var expression = GeneratorTestHelper.GetInsertGUIDExpression();

var result = Generator.Generate(expression);
result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) VALUES ('{0}')", GeneratorTestHelper.TestGuid.ToString()));
result.ShouldBe(System.String.Format("INSERT INTO [TestTable1] ([guid]) SELECT '{0}'", GeneratorTestHelper.TestGuid.ToString()));
}

[Test]
Expand Down Expand Up @@ -162,8 +162,8 @@ public void CanInsertDataWithIdentityInsert()
expression.AdditionalFeatures.Add(SqlServerExtensions.IdentityInsert, true);

var expected = "SET IDENTITY_INSERT [TestTable1] ON;";
expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');";
expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org');";
expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'";
expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org';";
expected += " SET IDENTITY_INSERT [TestTable1] OFF";

var result = Generator.Generate(expression);
Expand All @@ -178,8 +178,8 @@ public void CanInsertDataWithIdentityInsertInStrictMode()
Generator.compatabilityMode = Runner.CompatabilityMode.STRICT;

var expected = "SET IDENTITY_INSERT [TestTable1] ON;";
expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (1, 'Just''in', 'codethinked.com');";
expected += @" INSERT INTO [TestTable1] ([Id], [Name], [Website]) VALUES (2, 'Na\te', 'kohari.org');";
expected += " INSERT INTO [TestTable1] ([Id], [Name], [Website]) SELECT 1, 'Just''in', 'codethinked.com'";
expected += @" UNION ALL SELECT 2, 'Na\te', 'kohari.org';";
expected += " SET IDENTITY_INSERT [TestTable1] OFF";

var result = Generator.Generate(expression);
Expand Down