Skip to content

Commit

Permalink
Merge branch 'hotfix/2.1.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
roji committed Jul 1, 2018
2 parents 84ecb43 + 2a26f2c commit 21d5532
Show file tree
Hide file tree
Showing 30 changed files with 317 additions and 220 deletions.
11 changes: 6 additions & 5 deletions .appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
image: Visual Studio 2017
version: 2.1.0-{build}
version: 2.1.1-{build}
services:
- postgresql101
environment:
Expand All @@ -17,10 +17,11 @@ cache:
clone_depth: 10
install:
- powershell .build\setup_appveyor.ps1
# Install .NET Core 2.0
- ps: Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1" -OutFile "install-dotnet.ps1"
- ps: .\install-dotnet.ps1 -Version 2.1.300-rc1-008673
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
# The following can be used to install a custom version of .NET Core
# - ps: Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dotnet/cli/master/scripts/obtain/dotnet-install.ps1" -OutFile "install-dotnet.ps1"
# - ps: .\install-dotnet.ps1 -Version 2.1.300-rc1-008673
#
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
before_build:
- appveyor-retry dotnet restore -v Minimal
build_script:
Expand Down
17 changes: 15 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,22 @@ solution: EFCore.PG.sln
dist: trusty
sudo: false
mono: none
dotnet: 2.1.300-rc1-008673
dotnet: 2.1.300

services:
- postgresql
addons:
postgresql: "9.6"

env:
- Test__Npgsql__DefaultConnection: '"Host=localhost;Database=postgres;Username=postgres;Password="'
global:
- Test__Npgsql__DefaultConnection: '"Host=localhost;Port=5433;Database=postgres;Username=travis;Password=travis"'
- PGPORT: 5433

before_script:
- psql -c "ALTER USER travis WITH PASSWORD 'travis'" # For PG 10 hack
- psql -c 'CREATE EXTENSION hstore'
- psql -c 'CREATE EXTENSION postgis'
- dotnet restore -v Minimal
script:
- dotnet test test/EFCore.PG.Tests/EFCore.PG.Tests.csproj
Expand All @@ -24,3 +28,12 @@ cache:
directories:
- $HOME/.nuget/packages

# The following is necessary because of https://github.com/travis-ci/travis-ci/issues/6972
addons:
apt:
packages:
- postgresql-10
- postgresql-client-10
- postgresql-10-postgis-2.4
- postgresql-10-postgis-2.4-scripts
postgresql: 10
4 changes: 2 additions & 2 deletions src/EFCore.PG.NTS/EFCore.PG.NTS.csproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<VersionPrefix>2.1.0</VersionPrefix>
<VersionPrefix>2.1.1</VersionPrefix>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<AssemblyName>Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite</AssemblyName>
<RootNamespace>Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite</RootNamespace>
Expand All @@ -27,6 +27,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Npgsql.NetTopologySuite" Version="1.0.1" />
<PackageReference Include="Npgsql" Version="4.0.0" />
<PackageReference Include="Npgsql" Version="4.0.1" />
</ItemGroup>
</Project>
4 changes: 2 additions & 2 deletions src/EFCore.PG.NodaTime/EFCore.PG.NodaTime.csproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<VersionPrefix>2.1.0</VersionPrefix>
<VersionPrefix>2.1.1</VersionPrefix>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<AssemblyName>Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime</AssemblyName>
<RootNamespace>Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime</RootNamespace>
Expand All @@ -26,7 +26,7 @@
<ProjectReference Include="..\EFCore.PG\EFCore.PG.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Npgsql" Version="4.0.0" />
<PackageReference Include="Npgsql" Version="4.0.1" />
<PackageReference Include="Npgsql.NodaTime" Version="1.0.0" />
</ItemGroup>
</Project>
43 changes: 42 additions & 1 deletion src/EFCore.PG.NodaTime/NodaTimePlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
using Npgsql.EntityFrameworkCore.PostgreSQL.Infrastructure;
using Npgsql.EntityFrameworkCore.PostgreSQL.Query.ExpressionTranslators.Internal;
using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal;
using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping;
using NpgsqlTypes;

namespace Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime
{
Expand All @@ -24,6 +26,29 @@ public class NodaTimePlugin : NpgsqlEntityFrameworkPlugin
readonly TimeTzMapping _timetz = new TimeTzMapping();
readonly IntervalMapping _period = new IntervalMapping();

readonly NpgsqlRangeTypeMapping<LocalDateTime> _timestampLocalDateTimeRange;
readonly NpgsqlRangeTypeMapping<Instant> _timestampInstantRange;
readonly NpgsqlRangeTypeMapping<Instant> _timestamptzInstantRange;
readonly NpgsqlRangeTypeMapping<ZonedDateTime> _timestamptzZonedDateTimeRange;
readonly NpgsqlRangeTypeMapping<OffsetDateTime> _timestamptzOffsetDateTimeRange;
readonly NpgsqlRangeTypeMapping<LocalDate> _dateRange;

public NodaTimePlugin()
{
_timestampLocalDateTimeRange = new NpgsqlRangeTypeMapping<LocalDateTime>(
"tsrange", typeof(NpgsqlRange<LocalDateTime>), _timestampLocalDateTime, NpgsqlDbType.Range | NpgsqlDbType.Timestamp);
_timestampInstantRange = new NpgsqlRangeTypeMapping<Instant>(
"tsrange", typeof(NpgsqlRange<Instant>), _timestampInstant, NpgsqlDbType.Range | NpgsqlDbType.Timestamp);
_timestamptzInstantRange = new NpgsqlRangeTypeMapping<Instant>(
"tstzrange", typeof(NpgsqlRange<Instant>), _timestamptzInstant, NpgsqlDbType.Range | NpgsqlDbType.TimestampTz);
_timestamptzZonedDateTimeRange = new NpgsqlRangeTypeMapping<ZonedDateTime>(
"tstzrange", typeof(NpgsqlRange<ZonedDateTime>), _timestamptzZonedDateTime, NpgsqlDbType.Range | NpgsqlDbType.TimestampTz);
_timestamptzOffsetDateTimeRange = new NpgsqlRangeTypeMapping<OffsetDateTime>(
"tstzrange", typeof(NpgsqlRange<OffsetDateTime>), _timestamptzOffsetDateTime, NpgsqlDbType.Range | NpgsqlDbType.TimestampTz);
_dateRange = new NpgsqlRangeTypeMapping<LocalDate>(
"daterange", typeof(NpgsqlRange<LocalDate>), _date, NpgsqlDbType.Range | NpgsqlDbType.Date);;
}

public override void AddMappings(NpgsqlTypeMappingSource typeMappingSource)
{
typeMappingSource.ClrTypeMappings[typeof(Instant)] = _timestampInstant;
Expand All @@ -38,7 +63,7 @@ public override void AddMappings(NpgsqlTypeMappingSource typeMappingSource)

typeMappingSource.StoreTypeMappings["timestamptz"] =
typeMappingSource.StoreTypeMappings["timestamp with time zone"] =
new RelationalTypeMapping[] { _timestamptzInstant, _timestamptzOffsetDateTime, _timestamptzZonedDateTime };
new RelationalTypeMapping[] { _timestamptzInstant, _timestamptzZonedDateTime, _timestamptzOffsetDateTime };

typeMappingSource.ClrTypeMappings[typeof(LocalDate)] = _date;
typeMappingSource.StoreTypeMappings["date"] = new RelationalTypeMapping[] { _date };
Expand All @@ -51,6 +76,22 @@ public override void AddMappings(NpgsqlTypeMappingSource typeMappingSource)

typeMappingSource.ClrTypeMappings[typeof(Period)] = _period;
typeMappingSource.StoreTypeMappings["interval"] = new RelationalTypeMapping[] { _period };

// Ranges
typeMappingSource.ClrTypeMappings[typeof(NpgsqlRange<Instant>)] = _timestampInstantRange;
typeMappingSource.ClrTypeMappings[typeof(NpgsqlRange<LocalDateTime>)] = _timestampLocalDateTimeRange;

typeMappingSource.StoreTypeMappings["tsrange"] =
new RelationalTypeMapping[] { _timestampInstantRange, _timestampLocalDateTimeRange };

typeMappingSource.ClrTypeMappings[typeof(NpgsqlRange<ZonedDateTime>)] = _timestamptzZonedDateTimeRange;
typeMappingSource.ClrTypeMappings[typeof(NpgsqlRange<OffsetDateTime>)] = _timestamptzOffsetDateTimeRange;

typeMappingSource.StoreTypeMappings["tstzrange"] =
new RelationalTypeMapping[] { _timestamptzInstantRange, _timestamptzZonedDateTimeRange, _timestamptzOffsetDateTimeRange };

typeMappingSource.ClrTypeMappings[typeof(NpgsqlRange<LocalDate>)] = _dateRange;
typeMappingSource.StoreTypeMappings["daterange"] = new RelationalTypeMapping[] { _dateRange };
}

static readonly IMemberTranslator[] MemberTranslators =
Expand Down
10 changes: 5 additions & 5 deletions src/EFCore.PG/EFCore.PG.csproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<VersionPrefix>2.1.0</VersionPrefix>
<VersionPrefix>2.1.1</VersionPrefix>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<AssemblyName>Npgsql.EntityFrameworkCore.PostgreSQL</AssemblyName>
<RootNamespace>Npgsql.EntityFrameworkCore.PostgreSQL</RootNamespace>
Expand All @@ -22,10 +22,10 @@
<ItemGroup>
<!-- PrivateAssets="none" is set to flow the EF Core analyzer to users referencing this package
https://github.com/aspnet/EntityFrameworkCore/pull/11350 -->
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0" PrivateAssets="none" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0" PrivateAssets="none" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="2.1.0" PrivateAssets="none" />
<PackageReference Include="Npgsql" Version="4.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" PrivateAssets="none" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.1" PrivateAssets="none" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="2.1.1" PrivateAssets="none" />
<PackageReference Include="Npgsql" Version="4.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="Properties\NpgsqlStrings.Designer.tt">
Expand Down
13 changes: 11 additions & 2 deletions src/EFCore.PG/Migrations/NpgsqlMigrationsSqlGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,13 @@ namespace Npgsql.EntityFrameworkCore.PostgreSQL.Migrations
public class NpgsqlMigrationsSqlGenerator : MigrationsSqlGenerator
{
readonly NpgsqlSqlGenerationHelper _sqlGenerationHelper;
readonly NpgsqlTypeMappingSource _typeMappingSource;

public NpgsqlMigrationsSqlGenerator([NotNull] MigrationsSqlGeneratorDependencies dependencies)
: base(dependencies)
{
_sqlGenerationHelper = (NpgsqlSqlGenerationHelper)dependencies.SqlGenerationHelper;
_typeMappingSource = (NpgsqlTypeMappingSource)dependencies.TypeMappingSource;
}

protected override void Generate(MigrationOperation operation, [CanBeNull] IModel model, MigrationCommandListBuilder builder)
Expand Down Expand Up @@ -430,7 +432,8 @@ protected override void Generate(AlterColumnOperation operation, IModel model, M
.Append(" OWNED BY ")
.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table))
.Append('.')
.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name));
.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name))
.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator);
}

// Comment
Expand All @@ -447,7 +450,8 @@ protected override void Generate(AlterColumnOperation operation, IModel model, M
.Append('.')
.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name))
.Append(" IS ")
.Append(stringTypeMapping.GenerateSqlLiteral(newComment));
.Append(stringTypeMapping.GenerateSqlLiteral(newComment))
.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator);
}

EndStatement(builder);
Expand Down Expand Up @@ -800,6 +804,11 @@ protected override void ColumnDefinition(
if (type == null)
type = GetColumnType(schema, table, name, clrType, unicode, maxLength, rowVersion, model);

// User-defined type names are quoted if they contain uppercase letters. Other types are never quoted
// since users sometimes prefer to write TEXT instead of text.
if (_typeMappingSource.IsUserDefinedType(type))
type = _sqlGenerationHelper.DelimitIdentifier(type);

CheckForOldValueGenerationAnnotation(annotatable);
var valueGenerationStrategy = annotatable[NpgsqlAnnotationNames.ValueGenerationStrategy] as NpgsqlValueGenerationStrategy?;
if (valueGenerationStrategy == NpgsqlValueGenerationStrategy.SerialColumn)
Expand Down
4 changes: 2 additions & 2 deletions src/EFCore.PG/Query/Expressions/Internal/ILikeExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,10 @@ public override bool Equals(object obj)
return true;
}

return obj.GetType() == GetType() && Equals((LikeExpression)obj);
return obj.GetType() == GetType() && Equals((ILikeExpression)obj);
}

private bool Equals(LikeExpression other)
bool Equals(ILikeExpression other)
=> Equals(Match, other.Match)
&& Equals(Pattern, other.Pattern)
&& Equals(EscapeChar, other.EscapeChar);
Expand Down
12 changes: 11 additions & 1 deletion src/EFCore.PG/Scaffolding/Internal/NpgsqlDatabaseModelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public virtual DatabaseModel Create(DbConnection dbConnection, IEnumerable<strin
continue;
}

// We may have dropped columns. We load these because constraints take them into
// We may have dropped or skipped columns. We load these because constraints take them into
// account when referencing columns, but must now get rid of them before returning
// the database model.
while (table.Columns.Remove(null)) {}
Expand Down Expand Up @@ -318,6 +318,9 @@ nspname NOT IN ('pg_catalog', 'information_schema') AND
if (_enums.Contains(formattedTypeName) || _enums.Contains(formattedBaseTypeName))
{
_logger.EnumColumnSkippedWarning(DisplayName(tableSchema, tableName) + '.' + column.Name);
// We need to know about skipped columns because constraints take them into
// account when referencing columns. We'll get rid of them before returning the model.
table.Columns.Add(null);
continue;
}

Expand Down Expand Up @@ -701,6 +704,13 @@ FROM information_schema.sequences
var ownerDatabaseTable = tables
.FirstOrDefault(t => t.Name == ownerTable && t.Schema == ownerSchema);

if (ownerDatabaseTable == null)
{
// The sequence is owned by a table that isn't being scaffolded because it was excluded
// from the table selection set. Skip the sequence.
continue;
}

var ownerDatabaseColumn = ownerDatabaseTable
.Columns
.FirstOrDefault(t => t.Name == ownerColumn);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@ protected override string GenerateNonNullSqlLiteral(object value)
sb.Append(",");
}

sb.Append("]");
sb.Append("]::");
sb.Append(ElementMapping.StoreType);
sb.Append("[]");
return sb.ToString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public override CoreTypeMapping Clone(ValueConverter converter)
=> new NpgsqlTimestampTypeMapping(Parameters.WithComposedConverter(converter), NpgsqlDbType);

protected override string GenerateNonNullSqlLiteral(object value)
=> $"TIMESTAMP '{(DateTime)value:yyyy-MM-dd HH:mm:ss.FFF}'";
=> $"TIMESTAMP '{(DateTime)value:yyyy-MM-dd HH:mm:ss.FFFFFF}'";
}

public class NpgsqlTimestampTzTypeMapping : NpgsqlTypeMapping
Expand All @@ -44,10 +44,10 @@ protected override string GenerateNonNullSqlLiteral(object value)
? $"{dt:zzz}"
: " UTC";

return $"TIMESTAMPTZ '{dt:yyyy-MM-dd HH:mm:ss.FFF}{tz}'";
return $"TIMESTAMPTZ '{dt:yyyy-MM-dd HH:mm:ss.FFFFFF}{tz}'";

case DateTimeOffset dto:
return $"TIMESTAMPTZ '{dto:yyyy-MM-dd HH:mm:ss.FFFzzz}'";
return $"TIMESTAMPTZ '{dto:yyyy-MM-dd HH:mm:ss.FFFFFFzzz}'";

default:
throw new InvalidCastException(
Expand Down Expand Up @@ -90,9 +90,9 @@ public override CoreTypeMapping Clone(ValueConverter converter)
protected override string GenerateNonNullSqlLiteral(object value)
{
var ts = (TimeSpan)value;
return ts.Milliseconds == 0
return ts.Ticks % 10000000 == 0
? $@"TIME '{(TimeSpan)value:hh\:mm\:ss}'"
: $@"TIME '{(TimeSpan)value:hh\:mm\:ss\.FFF}'";
: $@"TIME '{(TimeSpan)value:hh\:mm\:ss\.FFFFFF}'";
}
}

Expand All @@ -110,7 +110,7 @@ public override CoreTypeMapping Clone(ValueConverter converter)
=> new NpgsqlTimeTzTypeMapping(Parameters.WithComposedConverter(converter), NpgsqlDbType);

protected override string GenerateNonNullSqlLiteral(object value)
=> $"TIMETZ '{(DateTimeOffset)value:HH:mm:ss.FFFz}'";
=> $"TIMETZ '{(DateTimeOffset)value:HH:mm:ss.FFFFFFz}'";
}

public class NpgsqlIntervalTypeMapping : NpgsqlTypeMapping
Expand All @@ -129,7 +129,7 @@ public override CoreTypeMapping Clone(ValueConverter converter)
protected override string GenerateNonNullSqlLiteral(object value)
{
var ts = (TimeSpan)value;
return $"INTERVAL '{ts.ToString($@"{(ts < TimeSpan.Zero ? "\\-" : "")}{(ts.Days == 0 ? "" : "d\\ ")}hh\:mm\:ss{(ts.Milliseconds == 0 ? "" : $"\\.FFF")}")}'";
return $"INTERVAL '{ts.ToString($@"{(ts < TimeSpan.Zero ? "\\-" : "")}{(ts.Days == 0 ? "" : "d\\ ")}hh\:mm\:ss{(ts.Ticks % 10000000 == 0 ? "" : $"\\.FFFFFF")}")}'";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ public override CoreTypeMapping Clone(ValueConverter converter)
=> new NpgsqlEnumTypeMapping(Parameters.WithComposedConverter(converter), _nameTranslator);

protected override string GenerateNonNullSqlLiteral(object value)
=> $"'{_nameTranslator.TranslateMemberName(value.ToString())}'::{StoreType}";
=> $"'{_nameTranslator.TranslateMemberName(value.ToString())}'::{_sqlGenerationHelper.DelimitIdentifier(StoreType)}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class NpgsqlRangeTypeMapping<T> : NpgsqlTypeMapping
{
public RelationalTypeMapping SubtypeMapping { get; }

internal NpgsqlRangeTypeMapping(
public NpgsqlRangeTypeMapping(
[NotNull] string storeType,
[NotNull] Type clrType,
RelationalTypeMapping subtypeMapping,
Expand Down

This file was deleted.

Loading

0 comments on commit 21d5532

Please sign in to comment.