Skip to content

Commit 8772228

Browse files
pikselrwasef1830
authored andcommitted
Add quotes to schema and table names (#74)
* Fixes #72
1 parent ce6c4d7 commit 8772228

File tree

2 files changed

+90
-19
lines changed

2 files changed

+90
-19
lines changed

src/EntityFramework6.Npgsql/NpgsqlMigrationSqlGenerator.cs

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,11 @@ void CreateSchema(string schemaName)
202202
return;
203203
_addedSchemas.Add(schemaName);
204204
if (_serverVersion.Major > 9 || (_serverVersion.Major == 9 && _serverVersion.Minor >= 3))
205-
AddStatment("CREATE SCHEMA IF NOT EXISTS " + schemaName);
205+
AddStatment("CREATE SCHEMA IF NOT EXISTS " + QuoteIdentifier(schemaName));
206206
else
207207
{
208208
//TODO: CREATE PROCEDURE that checks if schema already exists on servers < 9.3
209-
AddStatment("CREATE SCHEMA " + schemaName);
209+
AddStatment("CREATE SCHEMA " + QuoteIdentifier(schemaName));
210210
}
211211
}
212212

@@ -230,7 +230,7 @@ protected virtual void Convert(MoveTableOperation moveTableOperation)
230230
sql.Append("ALTER TABLE ");
231231
AppendTableName(moveTableOperation.Name, sql);
232232
sql.Append(" SET SCHEMA ");
233-
sql.Append(newSchema);
233+
AppendQuotedIdentifier(newSchema, sql);
234234
AddStatment(sql);
235235
}
236236

@@ -499,6 +499,53 @@ protected virtual void Convert(DropPrimaryKeyOperation dropPrimaryKeyOperation)
499499

500500
#region Misc functions
501501

502+
/// <summary>
503+
/// Quotes an identifier for Postgres SQL and appends it to a <see cref="StringBuilder" />
504+
/// </summary>
505+
/// <param name="identifier">The identifier to be quoted.</param>
506+
/// <param name="builder">The <see cref="StringBuilder"/> used for building the query.</param>
507+
/// <returns>The quoted identifier.</returns>
508+
void AppendQuotedIdentifier(string identifier, StringBuilder builder)
509+
{
510+
if (String.IsNullOrEmpty(identifier))
511+
{
512+
throw new ArgumentException("Value cannot be null or empty", nameof(identifier));
513+
}
514+
515+
if (identifier[identifier.Length - 1] == '"' && identifier[0] == '"')
516+
{
517+
builder.Append(identifier);
518+
}
519+
else
520+
{
521+
builder.Append('"');
522+
builder.Append(identifier);
523+
builder.Append('"');
524+
}
525+
}
526+
527+
/// <summary>
528+
/// Quotes an identifier for Postgres SQL
529+
/// </summary>
530+
/// <param name="identifier">The identifier to be quoted.</param>
531+
/// <returns>The quoted identifier.</returns>
532+
string QuoteIdentifier(string identifier)
533+
{
534+
if (String.IsNullOrEmpty(identifier))
535+
{
536+
throw new ArgumentException("Value cannot be null or empty", nameof(identifier));
537+
}
538+
539+
if (identifier[identifier.Length - 1] == '"' && identifier[0] == '"')
540+
{
541+
return identifier;
542+
}
543+
else
544+
{
545+
return '"' + identifier + '"';
546+
}
547+
}
548+
502549
void AppendColumn(ColumnModel column, StringBuilder sql)
503550
{
504551
sql.Append('"');
@@ -689,17 +736,13 @@ void AppendTableName(string tableName, StringBuilder sql)
689736
var dotIndex = tableName.IndexOf('.');
690737
if (dotIndex == -1)
691738
{
692-
sql.Append('"');
693-
sql.Append(tableName);
694-
sql.Append('"');
739+
AppendQuotedIdentifier(tableName, sql);
695740
}
696741
else
697742
{
698-
sql.Append('"');
699-
sql.Append(tableName.Remove(dotIndex));
700-
sql.Append("\".\"");
701-
sql.Append(tableName.Substring(dotIndex + 1));
702-
sql.Append('"');
743+
AppendQuotedIdentifier(tableName.Remove(dotIndex), sql);
744+
sql.Append('.');
745+
AppendQuotedIdentifier(tableName.Substring(dotIndex + 1), sql);
703746
}
704747
}
705748

test/EntityFramework6.Npgsql.Tests/EntityFrameworkMigrationTests.cs

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,9 @@ public void CreateTableOperation()
355355
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
356356
Assert.AreEqual(2, statments.Count());
357357
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
358-
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS someSchema", statments.ElementAt(0).Sql);
358+
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"someSchema\"", statments.ElementAt(0).Sql);
359359
else
360-
Assert.AreEqual("CREATE SCHEMA someSchema", statments.ElementAt(0).Sql);
360+
Assert.AreEqual("CREATE SCHEMA \"someSchema\"", statments.ElementAt(0).Sql);
361361
Assert.AreEqual("CREATE TABLE \"someSchema\".\"someTable\"(\"SomeString\" varchar(233) NOT NULL DEFAULT '',\"AnotherString\" text,\"SomeBytes\" bytea,\"SomeLong\" serial8,\"SomeDateTime\" timestamp)", statments.ElementAt(1).Sql);
362362
}
363363

@@ -503,10 +503,10 @@ public void MoveTableOperation()
503503
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
504504
Assert.AreEqual(2, statments.Count());
505505
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
506-
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS someNewSchema", statments.ElementAt(0).Sql);
506+
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"someNewSchema\"", statments.ElementAt(0).Sql);
507507
else
508-
Assert.AreEqual("CREATE SCHEMA someNewSchema", statments.ElementAt(0).Sql);
509-
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA someNewSchema", statments.ElementAt(1).Sql);
508+
Assert.AreEqual("CREATE SCHEMA \"someNewSchema\"", statments.ElementAt(0).Sql);
509+
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA \"someNewSchema\"", statments.ElementAt(1).Sql);
510510
}
511511

512512
[Test]
@@ -517,10 +517,38 @@ public void MoveTableOperationNewSchemaIsNull()
517517
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
518518
Assert.AreEqual(2, statments.Count());
519519
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
520-
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS dbo", statments.ElementAt(0).Sql);
520+
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"dbo\"", statments.ElementAt(0).Sql);
521521
else
522-
Assert.AreEqual("CREATE SCHEMA dbo", statments.ElementAt(0).Sql);
523-
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA dbo", statments.ElementAt(1).Sql);
522+
Assert.AreEqual("CREATE SCHEMA \"dbo\"", statments.ElementAt(0).Sql);
523+
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA \"dbo\"", statments.ElementAt(1).Sql);
524+
}
525+
526+
[Test]
527+
public void MoveTableOperationPrequotedNewSchema()
528+
{
529+
var operations = new List<MigrationOperation>();
530+
operations.Add(new MoveTableOperation("someOldSchema.someTable", "\"prequotedNewSchema\""));
531+
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
532+
Assert.AreEqual(2, statments.Count());
533+
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
534+
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"prequotedNewSchema\"", statments.ElementAt(0).Sql);
535+
else
536+
Assert.AreEqual("CREATE SCHEMA \"prequotedNewSchema\"", statments.ElementAt(0).Sql);
537+
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA \"prequotedNewSchema\"", statments.ElementAt(1).Sql);
538+
}
539+
540+
[Test]
541+
public void MoveTableOperationPrequotedOldSchema()
542+
{
543+
var operations = new List<MigrationOperation>();
544+
operations.Add(new MoveTableOperation("\"prequotedOldSchema\".\"someTable\"", "newSchema"));
545+
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
546+
Assert.AreEqual(2, statments.Count());
547+
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
548+
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"newSchema\"", statments.ElementAt(0).Sql);
549+
else
550+
Assert.AreEqual("CREATE SCHEMA \"newSchema\"", statments.ElementAt(0).Sql);
551+
Assert.AreEqual("ALTER TABLE \"prequotedOldSchema\".\"someTable\" SET SCHEMA \"newSchema\"", statments.ElementAt(1).Sql);
524552
}
525553

526554
[Test]

0 commit comments

Comments
 (0)