Skip to content

Commit

Permalink
Add quotes to schema and table names (#74)
Browse files Browse the repository at this point in the history
* Fixes #72
  • Loading branch information
piksel authored and rwasef1830 committed Sep 10, 2017
1 parent ce6c4d7 commit 8772228
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 19 deletions.
65 changes: 54 additions & 11 deletions src/EntityFramework6.Npgsql/NpgsqlMigrationSqlGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -202,11 +202,11 @@ void CreateSchema(string schemaName)
return;
_addedSchemas.Add(schemaName);
if (_serverVersion.Major > 9 || (_serverVersion.Major == 9 && _serverVersion.Minor >= 3))
AddStatment("CREATE SCHEMA IF NOT EXISTS " + schemaName);
AddStatment("CREATE SCHEMA IF NOT EXISTS " + QuoteIdentifier(schemaName));
else
{
//TODO: CREATE PROCEDURE that checks if schema already exists on servers < 9.3
AddStatment("CREATE SCHEMA " + schemaName);
AddStatment("CREATE SCHEMA " + QuoteIdentifier(schemaName));
}
}

Expand All @@ -230,7 +230,7 @@ protected virtual void Convert(MoveTableOperation moveTableOperation)
sql.Append("ALTER TABLE ");
AppendTableName(moveTableOperation.Name, sql);
sql.Append(" SET SCHEMA ");
sql.Append(newSchema);
AppendQuotedIdentifier(newSchema, sql);
AddStatment(sql);
}

Expand Down Expand Up @@ -499,6 +499,53 @@ protected virtual void Convert(DropPrimaryKeyOperation dropPrimaryKeyOperation)

#region Misc functions

/// <summary>
/// Quotes an identifier for Postgres SQL and appends it to a <see cref="StringBuilder" />
/// </summary>
/// <param name="identifier">The identifier to be quoted.</param>
/// <param name="builder">The <see cref="StringBuilder"/> used for building the query.</param>
/// <returns>The quoted identifier.</returns>
void AppendQuotedIdentifier(string identifier, StringBuilder builder)
{
if (String.IsNullOrEmpty(identifier))
{
throw new ArgumentException("Value cannot be null or empty", nameof(identifier));
}

if (identifier[identifier.Length - 1] == '"' && identifier[0] == '"')
{
builder.Append(identifier);
}
else
{
builder.Append('"');
builder.Append(identifier);
builder.Append('"');
}
}

/// <summary>
/// Quotes an identifier for Postgres SQL
/// </summary>
/// <param name="identifier">The identifier to be quoted.</param>
/// <returns>The quoted identifier.</returns>
string QuoteIdentifier(string identifier)
{
if (String.IsNullOrEmpty(identifier))
{
throw new ArgumentException("Value cannot be null or empty", nameof(identifier));
}

if (identifier[identifier.Length - 1] == '"' && identifier[0] == '"')
{
return identifier;
}
else
{
return '"' + identifier + '"';
}
}

void AppendColumn(ColumnModel column, StringBuilder sql)
{
sql.Append('"');
Expand Down Expand Up @@ -689,17 +736,13 @@ void AppendTableName(string tableName, StringBuilder sql)
var dotIndex = tableName.IndexOf('.');
if (dotIndex == -1)
{
sql.Append('"');
sql.Append(tableName);
sql.Append('"');
AppendQuotedIdentifier(tableName, sql);
}
else
{
sql.Append('"');
sql.Append(tableName.Remove(dotIndex));
sql.Append("\".\"");
sql.Append(tableName.Substring(dotIndex + 1));
sql.Append('"');
AppendQuotedIdentifier(tableName.Remove(dotIndex), sql);
sql.Append('.');
AppendQuotedIdentifier(tableName.Substring(dotIndex + 1), sql);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,9 +355,9 @@ public void CreateTableOperation()
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
Assert.AreEqual(2, statments.Count());
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS someSchema", statments.ElementAt(0).Sql);
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"someSchema\"", statments.ElementAt(0).Sql);
else
Assert.AreEqual("CREATE SCHEMA someSchema", statments.ElementAt(0).Sql);
Assert.AreEqual("CREATE SCHEMA \"someSchema\"", statments.ElementAt(0).Sql);
Assert.AreEqual("CREATE TABLE \"someSchema\".\"someTable\"(\"SomeString\" varchar(233) NOT NULL DEFAULT '',\"AnotherString\" text,\"SomeBytes\" bytea,\"SomeLong\" serial8,\"SomeDateTime\" timestamp)", statments.ElementAt(1).Sql);
}

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

[Test]
Expand All @@ -517,10 +517,38 @@ public void MoveTableOperationNewSchemaIsNull()
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
Assert.AreEqual(2, statments.Count());
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS dbo", statments.ElementAt(0).Sql);
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"dbo\"", statments.ElementAt(0).Sql);
else
Assert.AreEqual("CREATE SCHEMA dbo", statments.ElementAt(0).Sql);
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA dbo", statments.ElementAt(1).Sql);
Assert.AreEqual("CREATE SCHEMA \"dbo\"", statments.ElementAt(0).Sql);
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA \"dbo\"", statments.ElementAt(1).Sql);
}

[Test]
public void MoveTableOperationPrequotedNewSchema()
{
var operations = new List<MigrationOperation>();
operations.Add(new MoveTableOperation("someOldSchema.someTable", "\"prequotedNewSchema\""));
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
Assert.AreEqual(2, statments.Count());
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"prequotedNewSchema\"", statments.ElementAt(0).Sql);
else
Assert.AreEqual("CREATE SCHEMA \"prequotedNewSchema\"", statments.ElementAt(0).Sql);
Assert.AreEqual("ALTER TABLE \"someOldSchema\".\"someTable\" SET SCHEMA \"prequotedNewSchema\"", statments.ElementAt(1).Sql);
}

[Test]
public void MoveTableOperationPrequotedOldSchema()
{
var operations = new List<MigrationOperation>();
operations.Add(new MoveTableOperation("\"prequotedOldSchema\".\"someTable\"", "newSchema"));
var statments = new NpgsqlMigrationSqlGenerator().Generate(operations, _backendVersion.ToString());
Assert.AreEqual(2, statments.Count());
if (_backendVersion.Major > 9 || (_backendVersion.Major == 9 && _backendVersion.Minor > 2))
Assert.AreEqual("CREATE SCHEMA IF NOT EXISTS \"newSchema\"", statments.ElementAt(0).Sql);
else
Assert.AreEqual("CREATE SCHEMA \"newSchema\"", statments.ElementAt(0).Sql);
Assert.AreEqual("ALTER TABLE \"prequotedOldSchema\".\"someTable\" SET SCHEMA \"newSchema\"", statments.ElementAt(1).Sql);
}

[Test]
Expand Down

0 comments on commit 8772228

Please sign in to comment.