From 091cead332d72aafca3ec286035c928381f476e3 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sun, 5 Oct 2025 23:02:17 +0200 Subject: [PATCH 1/2] Depend on Npgsql 10.0.0-rc.1 --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index a698e8a4a..a09269894 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -2,7 +2,7 @@ 10.0.0-rc.2.25502.106 10.0.0-rc.2.25502.106 - 9.0.3 + 10.0.0-rc.1 From 766429a9c69e2a59bc3ad3d59716fa87fd709a0b Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Sun, 27 Oct 2024 23:08:36 +0100 Subject: [PATCH 2/2] Map IPNetwork <-> cidr Closes #3321 --- .../NpgsqlNetworkDbFunctionsExtensions.cs | 37 +- .../Internal/NpgsqlNetworkTranslator.cs | 4 +- .../Query/Internal/NpgsqlQuerySqlGenerator.cs | 4 +- .../NpgsqlSqlTranslatingExpressionVisitor.cs | 6 +- .../Mapping/NpgsqlCidrLegacyTypeMapping.cs | 127 ++ .../Internal/Mapping/NpgsqlCidrTypeMapping.cs | 24 +- .../Internal/NpgsqlTypeMappingSource.cs | 10 +- .../NetworkTranslationsNpgsqlTest.cs | 1041 +++++++++++++---- .../Storage/NpgsqlTypeMappingSourceTest.cs | 9 + .../Storage/NpgsqlTypeMappingTest.cs | 16 +- 10 files changed, 1029 insertions(+), 249 deletions(-) create mode 100644 src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrLegacyTypeMapping.cs diff --git a/src/EFCore.PG/Extensions/DbFunctionsExtensions/NpgsqlNetworkDbFunctionsExtensions.cs b/src/EFCore.PG/Extensions/DbFunctionsExtensions/NpgsqlNetworkDbFunctionsExtensions.cs index 570f8c67e..c9eb4a688 100644 --- a/src/EFCore.PG/Extensions/DbFunctionsExtensions/NpgsqlNetworkDbFunctionsExtensions.cs +++ b/src/EFCore.PG/Extensions/DbFunctionsExtensions/NpgsqlNetworkDbFunctionsExtensions.cs @@ -372,6 +372,21 @@ public static int Subtract(this DbFunctions _, NpgsqlInet inet, NpgsqlInet other public static string Abbreviate(this DbFunctions _, NpgsqlInet inet) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(Abbreviate))); + /// + /// Returns the abbreviated display format as text. + /// + /// The instance. + /// The cidr to abbreviate. + /// + /// The abbreviated display format as text. + /// + /// + /// This method is only intended for use via SQL translation as part of an EF Core LINQ query. + /// + public static string Abbreviate(this DbFunctions _, IPNetwork cidr) + => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(Abbreviate))); + +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork /// /// Returns the abbreviated display format as text. /// @@ -385,6 +400,7 @@ public static string Abbreviate(this DbFunctions _, NpgsqlInet inet) /// public static string Abbreviate(this DbFunctions _, NpgsqlCidr cidr) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(Abbreviate))); +#pragma warning restore CS0618 /// /// Returns the broadcast address for a network. @@ -481,7 +497,7 @@ public static NpgsqlInet Netmask(this DbFunctions _, NpgsqlInet inet) /// /// This method is only intended for use via SQL translation as part of an EF Core LINQ query. /// - public static NpgsqlCidr Network(this DbFunctions _, NpgsqlInet inet) + public static IPNetwork Network(this DbFunctions _, NpgsqlInet inet) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(Network))); /// @@ -499,6 +515,22 @@ public static NpgsqlCidr Network(this DbFunctions _, NpgsqlInet inet) public static NpgsqlInet SetMaskLength(this DbFunctions _, NpgsqlInet inet, int length) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(SetMaskLength))); + /// + /// Sets the length of the subnet mask. + /// + /// The instance. + /// The cidr to modify. + /// The subnet mask length to set. + /// + /// The network with a subnet mask of the specified length. + /// + /// + /// This method is only intended for use via SQL translation as part of an EF Core LINQ query. + /// + public static IPNetwork SetMaskLength(this DbFunctions _, IPNetwork cidr, int length) + => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(SetMaskLength))); + +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork /// /// Sets the length of the subnet mask. /// @@ -513,6 +545,7 @@ public static NpgsqlInet SetMaskLength(this DbFunctions _, NpgsqlInet inet, int /// public static NpgsqlCidr SetMaskLength(this DbFunctions _, NpgsqlCidr cidr, int length) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(SetMaskLength))); +#pragma warning restore CS0618 /// /// Extracts the IP address and subnet mask as text. @@ -555,7 +588,7 @@ public static bool SameFamily(this DbFunctions _, NpgsqlInet inet, NpgsqlInet ot /// /// This method is only intended for use via SQL translation as part of an EF Core LINQ query. /// - public static NpgsqlCidr Merge(this DbFunctions _, NpgsqlInet inet, NpgsqlInet other) + public static IPNetwork Merge(this DbFunctions _, NpgsqlInet inet, NpgsqlInet other) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(Merge))); /// diff --git a/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlNetworkTranslator.cs b/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlNetworkTranslator.cs index 3f607894f..5dedf94da 100644 --- a/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlNetworkTranslator.cs +++ b/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlNetworkTranslator.cs @@ -70,10 +70,12 @@ public NpgsqlNetworkTranslator( return TranslateInetExtensionMethod(method, arguments); } - if (paramType == typeof(NpgsqlCidr)) +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork + if (paramType == typeof(IPNetwork) || paramType == typeof(NpgsqlCidr)) { return TranslateCidrExtensionMethod(method, arguments); } +#pragma warning restore CS0618 if (paramType == typeof(PhysicalAddress)) { diff --git a/src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs b/src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs index bc7e0380b..924642d08 100644 --- a/src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs +++ b/src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs @@ -496,11 +496,11 @@ protected virtual Expression VisitPgBinary(PgBinaryExpression binaryExpression) binaryExpression.OperatorType switch { PgExpressionType.Contains - when binaryExpression.Left.TypeMapping is NpgsqlInetTypeMapping or NpgsqlCidrTypeMapping + when binaryExpression.Left.TypeMapping is NpgsqlInetTypeMapping or NpgsqlCidrTypeMapping or NpgsqlLegacyCidrTypeMapping => ">>", PgExpressionType.ContainedBy - when binaryExpression.Left.TypeMapping is NpgsqlInetTypeMapping or NpgsqlCidrTypeMapping + when binaryExpression.Left.TypeMapping is NpgsqlInetTypeMapping or NpgsqlCidrTypeMapping or NpgsqlLegacyCidrTypeMapping => "<<", PgExpressionType.Contains => "@>", diff --git a/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs b/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs index fbfdfbe78..6ebab68b2 100644 --- a/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs +++ b/src/EFCore.PG/Query/Internal/NpgsqlSqlTranslatingExpressionVisitor.cs @@ -188,7 +188,11 @@ protected override Expression VisitUnary(UnaryExpression unaryExpression) // implicit conversion operator to NpgsqlInet. So remove that cast as well. case ExpressionType.Convert when unaryExpression.Type == typeof(NpgsqlInet) - && (unaryExpression.Operand.Type == typeof(IPAddress) || unaryExpression.Operand.Type == typeof(NpgsqlCidr)): + && (unaryExpression.Operand.Type == typeof(IPAddress) + || unaryExpression.Operand.Type == typeof(IPNetwork) +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork + || unaryExpression.Operand.Type == typeof(NpgsqlCidr)): +#pragma warning restore CS0618 return Visit(unaryExpression.Operand); } diff --git a/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrLegacyTypeMapping.cs b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrLegacyTypeMapping.cs new file mode 100644 index 000000000..9e2f79743 --- /dev/null +++ b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrLegacyTypeMapping.cs @@ -0,0 +1,127 @@ +using System.Net; +using System.Text.Json; +using Microsoft.EntityFrameworkCore.Storage.Json; + +namespace Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping; + +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork + +/// +/// The type mapping for the PostgreSQL cidr type. +/// +/// +/// See: https://www.postgresql.org/docs/current/static/datatype-net-types.html#DATATYPE-CIDR +/// +public class NpgsqlLegacyCidrTypeMapping : NpgsqlTypeMapping +{ + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public static NpgsqlLegacyCidrTypeMapping Default { get; } = new(); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public NpgsqlLegacyCidrTypeMapping() + : base("cidr", typeof(NpgsqlCidr), NpgsqlDbType.Cidr, JsonCidrLegacyReaderWriter.Instance) + { + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected NpgsqlLegacyCidrTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters, NpgsqlDbType.Cidr) + { + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new NpgsqlLegacyCidrTypeMapping(parameters); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected override string GenerateNonNullSqlLiteral(object value) + { + var cidr = (NpgsqlCidr)value; + return $"CIDR '{cidr.Address}/{cidr.Netmask}'"; + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override Expression GenerateCodeLiteral(object value) + { + var cidr = (NpgsqlCidr)value; + return Expression.New( + NpgsqlCidrConstructor, + Expression.Call(ParseMethod, Expression.Constant(cidr.Address.ToString())), + Expression.Constant(cidr.Netmask)); + } + + private static readonly MethodInfo ParseMethod = typeof(IPAddress).GetMethod("Parse", [typeof(string)])!; + + private static readonly ConstructorInfo NpgsqlCidrConstructor = + typeof(NpgsqlCidr).GetConstructor([typeof(IPAddress), typeof(byte)])!; + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public sealed class JsonCidrLegacyReaderWriter : JsonValueReaderWriter + { + private static readonly PropertyInfo InstanceProperty = typeof(JsonCidrLegacyReaderWriter).GetProperty(nameof(Instance))!; + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public static JsonCidrLegacyReaderWriter Instance { get; } = new(); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override NpgsqlCidr FromJsonTyped(ref Utf8JsonReaderManager manager, object? existingObject = null) + => new(manager.CurrentReader.GetString()!); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override void ToJsonTyped(Utf8JsonWriter writer, NpgsqlCidr value) + => writer.WriteStringValue(value.ToString()); + + /// + public override Expression ConstructorExpression => Expression.Property(null, InstanceProperty); + } +} diff --git a/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrTypeMapping.cs b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrTypeMapping.cs index 7a943d887..86c4c6ef2 100644 --- a/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrTypeMapping.cs +++ b/src/EFCore.PG/Storage/Internal/Mapping/NpgsqlCidrTypeMapping.cs @@ -27,7 +27,7 @@ public class NpgsqlCidrTypeMapping : NpgsqlTypeMapping /// doing so can result in application failures when updating to a new Entity Framework Core release. /// public NpgsqlCidrTypeMapping() - : base("cidr", typeof(NpgsqlCidr), NpgsqlDbType.Cidr, JsonCidrReaderWriter.Instance) + : base("cidr", typeof(IPNetwork), NpgsqlDbType.Cidr, JsonCidrReaderWriter.Instance) { } @@ -59,8 +59,8 @@ protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters p /// protected override string GenerateNonNullSqlLiteral(object value) { - var cidr = (NpgsqlCidr)value; - return $"CIDR '{cidr.Address}/{cidr.Netmask}'"; + var ipNetwork = (IPNetwork)value; + return $"CIDR '{ipNetwork.BaseAddress}/{ipNetwork.PrefixLength}'"; } /// @@ -71,17 +71,17 @@ protected override string GenerateNonNullSqlLiteral(object value) /// public override Expression GenerateCodeLiteral(object value) { - var cidr = (NpgsqlCidr)value; + var cidr = (IPNetwork)value; return Expression.New( NpgsqlCidrConstructor, - Expression.Call(ParseMethod, Expression.Constant(cidr.Address.ToString())), - Expression.Constant(cidr.Netmask)); + Expression.Call(ParseMethod, Expression.Constant(cidr.BaseAddress.ToString())), + Expression.Constant(cidr.PrefixLength)); } private static readonly MethodInfo ParseMethod = typeof(IPAddress).GetMethod("Parse", [typeof(string)])!; private static readonly ConstructorInfo NpgsqlCidrConstructor = - typeof(NpgsqlCidr).GetConstructor([typeof(IPAddress), typeof(byte)])!; + typeof(IPNetwork).GetConstructor([typeof(IPAddress), typeof(int)])!; /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -89,7 +89,7 @@ public override Expression GenerateCodeLiteral(object value) /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public sealed class JsonCidrReaderWriter : JsonValueReaderWriter + public sealed class JsonCidrReaderWriter : JsonValueReaderWriter { private static readonly PropertyInfo InstanceProperty = typeof(JsonCidrReaderWriter).GetProperty(nameof(Instance))!; @@ -107,8 +107,8 @@ public sealed class JsonCidrReaderWriter : JsonValueReaderWriter /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public override NpgsqlCidr FromJsonTyped(ref Utf8JsonReaderManager manager, object? existingObject = null) - => new(manager.CurrentReader.GetString()!); + public override IPNetwork FromJsonTyped(ref Utf8JsonReaderManager manager, object? existingObject = null) + => IPNetwork.Parse(manager.CurrentReader.GetString()!); /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to @@ -116,8 +116,8 @@ public override NpgsqlCidr FromJsonTyped(ref Utf8JsonReaderManager manager, obje /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public override void ToJsonTyped(Utf8JsonWriter writer, NpgsqlCidr value) - => writer.WriteStringValue(value.ToString()); + public override void ToJsonTyped(Utf8JsonWriter writer, IPNetwork ipNetwork) + => writer.WriteStringValue(ipNetwork.ToString()); /// public override Expression ConstructorExpression => Expression.Property(null, InstanceProperty); diff --git a/src/EFCore.PG/Storage/Internal/NpgsqlTypeMappingSource.cs b/src/EFCore.PG/Storage/Internal/NpgsqlTypeMappingSource.cs index 51c977c57..ca7140f19 100644 --- a/src/EFCore.PG/Storage/Internal/NpgsqlTypeMappingSource.cs +++ b/src/EFCore.PG/Storage/Internal/NpgsqlTypeMappingSource.cs @@ -115,7 +115,8 @@ static NpgsqlTypeMappingSource() private readonly NpgsqlMacaddr8TypeMapping _macaddr8 = NpgsqlMacaddr8TypeMapping.Default; private readonly NpgsqlInetTypeMapping _inetAsIPAddress = NpgsqlInetTypeMapping.Default; private readonly NpgsqlInetTypeMapping _inetAsNpgsqlInet = new(typeof(NpgsqlInet)); - private readonly NpgsqlCidrTypeMapping _cidr = NpgsqlCidrTypeMapping.Default; + private readonly NpgsqlCidrTypeMapping _cidrAsIPNetwork = NpgsqlCidrTypeMapping.Default; + private readonly NpgsqlLegacyCidrTypeMapping _cidrAsNpgsqlCidr = NpgsqlLegacyCidrTypeMapping.Default; // Built-in geometric types private readonly NpgsqlPointTypeMapping _point = NpgsqlPointTypeMapping.Default; @@ -261,7 +262,7 @@ public NpgsqlTypeMappingSource( { "macaddr", [_macaddr] }, { "macaddr8", [_macaddr8] }, { "inet", [_inetAsIPAddress, _inetAsNpgsqlInet] }, - { "cidr", [_cidr] }, + { "cidr", [_cidrAsIPNetwork, _cidrAsNpgsqlCidr] }, { "point", [_point] }, { "box", [_box] }, { "line", [_line] }, @@ -324,7 +325,10 @@ public NpgsqlTypeMappingSource( { typeof(PhysicalAddress), _macaddr }, { typeof(IPAddress), _inetAsIPAddress }, { typeof(NpgsqlInet), _inetAsNpgsqlInet }, - { typeof(NpgsqlCidr), _cidr }, + { typeof(IPNetwork), _cidrAsIPNetwork }, +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork + { typeof(NpgsqlCidr), _cidrAsNpgsqlCidr }, +#pragma warning restore CS0618 { typeof(BitArray), _varbit }, { typeof(ImmutableDictionary), _immutableHstore }, { typeof(Dictionary), _hstore }, diff --git a/test/EFCore.PG.FunctionalTests/Query/Translations/NetworkTranslationsNpgsqlTest.cs b/test/EFCore.PG.FunctionalTests/Query/Translations/NetworkTranslationsNpgsqlTest.cs index 8379693af..99bddfe48 100644 --- a/test/EFCore.PG.FunctionalTests/Query/Translations/NetworkTranslationsNpgsqlTest.cs +++ b/test/EFCore.PG.FunctionalTests/Query/Translations/NetworkTranslationsNpgsqlTest.cs @@ -31,11 +31,11 @@ public NetworkTranslationsNpgsqlTest(NetworkAddressQueryNpgsqlFixture fixture, I public void Demonstrate_ValueTypeParametersAreDuplicated() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); + var cidr = new IPNetwork(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.ContainsOrEqual(x.Cidr, cidr)) - .Select(x => x.Cidr.Equals(cidr)) + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrEqual(x.IPNetwork, cidr)) + .Select(x => x.IPNetwork.Equals(cidr)) .ToArray(); AssertSql( @@ -43,9 +43,9 @@ public void Demonstrate_ValueTypeParametersAreDuplicated() @cidr='0.0.0.0/0' (DbType = Object) @p='0.0.0.0/0' (DbType = Object) -SELECT n."Cidr" = @cidr +SELECT n."IPNetwork" = @cidr FROM "NetTestEntities" AS n -WHERE n."Cidr" >>= @p +WHERE n."IPNetwork" >>= @p """); } @@ -153,21 +153,21 @@ WHERE n."Inet" < INET '192.168.1.7' } [Fact] - public void LessThan_NpgsqlCidr() + public void LessThan_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.LessThan(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.LessThan(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" < @p +WHERE n."IPNetwork" < @p """); } @@ -218,21 +218,21 @@ SELECT count(*)::int } [Fact] - public void LessThanOrEqual_NpgsqlCidr() + public void LessThanOrEqual_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.LessThanOrEqual(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.LessThanOrEqual(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" <= @p +WHERE n."IPNetwork" <= @p """); } @@ -284,21 +284,21 @@ SELECT count(*)::int } [Fact] - public void GreaterThanOrEqual_NpgsqlCidr() + public void GreaterThanOrEqual_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.GreaterThanOrEqual(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.GreaterThanOrEqual(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" >= @p +WHERE n."IPNetwork" >= @p """); } @@ -351,21 +351,21 @@ WHERE n."Inet" > INET '192.168.1.7' } [Fact] - public void GreaterThan_NpgsqlCidr() + public void GreaterThan_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.GreaterThan(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.GreaterThan(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" > @p +WHERE n."IPNetwork" > @p """); } @@ -410,7 +410,7 @@ public void ContainedBy_IPAddress_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Where(x => EF.Functions.ContainedBy(x.Inet, inet)) .ToArray(); @@ -418,18 +418,18 @@ public void ContainedBy_IPAddress_and_IPAddress() """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" << @p """); } [Fact] - public void ContainedBy_IPAddress_and_NpgsqlCidr() + public void ContainedBy_IPAddress_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities .Where(x => EF.Functions.ContainedBy(x.Inet, cidr)) .ToArray(); @@ -437,28 +437,28 @@ public void ContainedBy_IPAddress_and_NpgsqlCidr() """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" << @p """); } [Fact] - public void ContainedBy_NpgsqlCidr_and_NpgsqlCidr() + public void ContainedBy_IPNetwork_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.ContainedBy(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainedBy(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" << @p +WHERE n."IPNetwork" << @p """); } @@ -467,7 +467,7 @@ public void ContainedByOrEqual_IPAddress_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Where(x => EF.Functions.ContainedByOrEqual(x.Inet, inet)) .ToArray(); @@ -475,18 +475,18 @@ public void ContainedByOrEqual_IPAddress_and_IPAddress() """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" <<= @p """); } [Fact] - public void ContainedByOrEqual_IPAddress_and_NpgsqlCidr() + public void ContainedByOrEqual_IPAddress_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities .Where(x => EF.Functions.ContainedByOrEqual(x.Inet, cidr)) .ToArray(); @@ -494,28 +494,28 @@ public void ContainedByOrEqual_IPAddress_and_NpgsqlCidr() """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" <<= @p """); } [Fact] - public void ContainedByOrEqual_NpgsqlCidr_and_NpgsqlCidr() + public void ContainedByOrEqual_IPNetwork_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.ContainedByOrEqual(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainedByOrEqual(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" <<= @p +WHERE n."IPNetwork" <<= @p """); } @@ -524,7 +524,7 @@ public void Contains_IPAddress_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Where(x => EF.Functions.Contains(x.Inet, inet)) .ToArray(); @@ -532,47 +532,47 @@ public void Contains_IPAddress_and_IPAddress() """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" >> @p """); } [Fact] - public void Contains_NpgsqlCidr_and_IPAddress() + public void Contains_IPNetwork_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities - .Where(x => EF.Functions.Contains(x.Cidr, inet)) + _ = context.NetTestEntities + .Where(x => EF.Functions.Contains(x.IPNetwork, inet)) .ToArray(); AssertSql( """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" >> @p +WHERE n."IPNetwork" >> @p """); } [Fact] - public void Contains_NpgsqlCidr_and_NpgsqlCidr() + public void Contains_IPNetwork_and_IPNetworks() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.Contains(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.Contains(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" >> @p +WHERE n."IPNetwork" >> @p """); } @@ -581,7 +581,7 @@ public void ContainsOrEqual_IPAddress_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Where(x => EF.Functions.ContainsOrEqual(x.Inet, inet)) .ToArray(); @@ -589,47 +589,47 @@ public void ContainsOrEqual_IPAddress_and_IPAddress() """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" >>= @p """); } [Fact] - public void ContainsOrEqual_NpgsqlCidr_and_IPAddress() + public void ContainsOrEqual_IPNetwork_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities - .Where(x => EF.Functions.ContainsOrEqual(x.Cidr, inet)) + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrEqual(x.IPNetwork, inet)) .ToArray(); AssertSql( """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" >>= @p +WHERE n."IPNetwork" >>= @p """); } [Fact] - public void ContainsOrEqual_NpgsqlCidr_and_NpgsqlCidr() + public void ContainsOrEqual_IPNetwork_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.ContainsOrEqual(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrEqual(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" >>= @p +WHERE n."IPNetwork" >>= @p """); } @@ -638,7 +638,7 @@ public void ContainsOrContainedBy_IPAddress_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Where(x => EF.Functions.ContainsOrContainedBy(x.Inet, inet)) .ToArray(); @@ -646,18 +646,18 @@ public void ContainsOrContainedBy_IPAddress_and_IPAddress() """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" && @p """); } [Fact] - public void ContainsOrContainedBy_IPAddress_and_NpgsqlCidr() + public void ContainsOrContainedBy_IPAddress_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities .Where(x => EF.Functions.ContainsOrContainedBy(x.Inet, cidr)) .ToArray(); @@ -665,47 +665,47 @@ public void ContainsOrContainedBy_IPAddress_and_NpgsqlCidr() """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" && @p """); } [Fact] - public void ContainsOrContainedBy_NpgsqlCidr_and_IPAddress() + public void ContainsOrContainedBy_IPNetwork_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities - .Where(x => EF.Functions.ContainsOrContainedBy(x.Cidr, inet)) + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrContainedBy(x.IPNetwork, inet)) .ToArray(); AssertSql( """ @p='0.0.0.0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" && @p +WHERE n."IPNetwork" && @p """); } [Fact] - public void ContainsOrContainedBy_NpgsqlCidr_and_NpgsqlCidr() + public void ContainsOrContainedBy_IPNetwork_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Where(x => EF.Functions.ContainsOrContainedBy(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrContainedBy(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n -WHERE n."Cidr" && @p +WHERE n."IPNetwork" && @p """); } @@ -717,7 +717,7 @@ WHERE n."Cidr" && @p public void BitwiseNot_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseNot(x.Inet)) .ToArray(); @@ -729,16 +729,16 @@ public void BitwiseNot_IPAddress() } [Fact] - public void BitwiseNot_NpgsqlCidr() + public void BitwiseNot_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.BitwiseNot(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.BitwiseNot(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT ~n."Cidr" +SELECT ~n."IPNetwork" FROM "NetTestEntities" AS n """); } @@ -747,7 +747,7 @@ public void BitwiseNot_NpgsqlCidr() public void BitwiseNot_PhysicalAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseNot(x.Macaddr)) .ToArray(); @@ -763,7 +763,7 @@ public void BitwiseNot_PhysicalAddress() public void BitwiseNot_PhysicalAddress_macaddr8() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseNot(x.Macaddr8)) .ToArray(); @@ -793,19 +793,19 @@ SELECT count(*)::int } [Fact] - public void BitwiseAnd_NpgsqlCidr() + public void BitwiseAnd_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Select(x => EF.Functions.BitwiseAnd(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.BitwiseAnd(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Cidr" & @p +SELECT n."IPNetwork" & @p FROM "NetTestEntities" AS n """); } @@ -815,7 +815,7 @@ public void BitwiseAnd_PhysicalAddress() { using var context = CreateContext(); var macaddr = new PhysicalAddress(new byte[6]); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseAnd(x.Macaddr, macaddr)) .ToArray(); @@ -833,7 +833,7 @@ SELECT n."Macaddr" & @macaddr public void BitwiseAnd_PhysicalAddress_macaddr8() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseAnd(x.Macaddr8, x.Macaddr8)) .ToArray(); @@ -849,7 +849,7 @@ public void BitwiseOr_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseOr(x.Inet, inet)) .ToArray(); @@ -863,19 +863,19 @@ SELECT n."Inet" | @p } [Fact] - public void BitwiseOr_NpgsqlCidr() + public void BitwiseOr_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Select(x => EF.Functions.BitwiseOr(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.BitwiseOr(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Cidr" | @p +SELECT n."IPNetwork" | @p FROM "NetTestEntities" AS n """); } @@ -885,7 +885,7 @@ public void BitwiseOr_PhysicalAddress() { using var context = CreateContext(); var macaddr = new PhysicalAddress(new byte[6]); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseOr(x.Macaddr, macaddr)) .ToArray(); @@ -903,7 +903,7 @@ SELECT n."Macaddr" | @macaddr public void BitwiseOr_PhysicalAddress_macaddr8() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.BitwiseOr(x.Macaddr8, x.Macaddr8)) .ToArray(); @@ -927,7 +927,7 @@ public void Add_IPAddress_and_int() Assert.Equal(actual, IPAddress.Parse("192.168.1.1")); AssertSql( """ -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" + 1 = INET '192.168.1.2' LIMIT 2 @@ -935,16 +935,16 @@ LIMIT 2 } [Fact] - public void Add_NpgsqlCidr_and_int() + public void Add_IPNetwork_and_int() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Add(x.Cidr, 1)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Add(x.IPNetwork, 1)) .ToArray(); AssertSql( """ -SELECT n."Cidr" + 1 +SELECT n."IPNetwork" + 1 FROM "NetTestEntities" AS n """); } @@ -958,7 +958,7 @@ public void Subtract_IPAddress_and_int() Assert.Equal(actual, IPAddress.Parse("192.168.1.2")); AssertSql( """ -SELECT n."Id", n."Cidr", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" FROM "NetTestEntities" AS n WHERE n."Inet" - 1 = INET '192.168.1.1' LIMIT 2 @@ -966,16 +966,16 @@ LIMIT 2 } [Fact] - public void Subtract_NpgsqlCidr_and_int() + public void Subtract_IPNetwork_and_int() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Subtract(x.Cidr, 1)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Subtract(x.IPNetwork, 1)) .ToArray(); AssertSql( """ -SELECT n."Cidr" - 1 +SELECT n."IPNetwork" - 1 FROM "NetTestEntities" AS n """); } @@ -985,7 +985,7 @@ public void Subtract_IPAddress_and_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Subtract(x.Inet, inet)) .ToArray(); @@ -999,19 +999,19 @@ SELECT n."Inet" - @p } [Fact] - public void Subtract_NpgsqlCidr_and_NpgsqlCidr() + public void Subtract_IPNetwork_and_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Subtract(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.Subtract(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT n."Cidr" - @p +SELECT n."IPNetwork" - @p FROM "NetTestEntities" AS n """); } @@ -1024,7 +1024,7 @@ SELECT n."Cidr" - @p public void Abbreviate_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Abbreviate(x.Inet)) .ToArray(); @@ -1036,16 +1036,16 @@ SELECT abbrev(n."Inet") } [Fact] - public void Abbreviate_NpgsqlCidr() + public void Abbreviate_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Abbreviate(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Abbreviate(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT abbrev(n."Cidr") +SELECT abbrev(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1054,7 +1054,7 @@ SELECT abbrev(n."Cidr") public void Broadcast_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Broadcast(x.Inet)) .ToArray(); @@ -1066,16 +1066,16 @@ SELECT broadcast(n."Inet") } [Fact] - public void Broadcast_NpgsqlCidr() + public void Broadcast_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Broadcast(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Broadcast(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT broadcast(n."Cidr") +SELECT broadcast(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1084,7 +1084,7 @@ SELECT broadcast(n."Cidr") public void Family_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Family(x.Inet)) .ToArray(); @@ -1096,16 +1096,16 @@ SELECT family(n."Inet") } [Fact] - public void Family_NpgsqlCidr() + public void Family_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Family(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Family(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT family(n."Cidr") +SELECT family(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1114,7 +1114,7 @@ SELECT family(n."Cidr") public void Host_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Host(x.Inet)) .ToArray(); @@ -1126,16 +1126,16 @@ SELECT host(n."Inet") } [Fact] - public void Host_NpgsqlCidr() + public void Host_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Host(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Host(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT host(n."Cidr") +SELECT host(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1144,7 +1144,7 @@ SELECT host(n."Cidr") public void HostMask_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.HostMask(x.Inet)) .ToArray(); @@ -1156,16 +1156,16 @@ SELECT hostmask(n."Inet") } [Fact] - public void HostMask_NpgsqlCidr() + public void HostMask_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.HostMask(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.HostMask(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT hostmask(n."Cidr") +SELECT hostmask(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1174,7 +1174,7 @@ SELECT hostmask(n."Cidr") public void MaskLength_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.MaskLength(x.Inet)) .ToArray(); @@ -1186,16 +1186,16 @@ SELECT masklen(n."Inet") } [Fact] - public void MaskLength_NpgsqlCidr() + public void MaskLength_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.MaskLength(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.MaskLength(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT masklen(n."Cidr") +SELECT masklen(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1204,7 +1204,7 @@ SELECT masklen(n."Cidr") public void Netmask_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Netmask(x.Inet)) .ToArray(); @@ -1216,16 +1216,16 @@ SELECT netmask(n."Inet") } [Fact] - public void Netmask_NpgsqlCidr() + public void Netmask_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Netmask(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Netmask(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT netmask(n."Cidr") +SELECT netmask(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1234,7 +1234,7 @@ SELECT netmask(n."Cidr") public void Network_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Network(x.Inet)) .ToArray(); @@ -1246,16 +1246,16 @@ SELECT network(n."Inet") } [Fact] - public void Network_NpgsqlCidr() + public void Network_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Network(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Network(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT network(n."Cidr") +SELECT network(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1264,7 +1264,7 @@ SELECT network(n."Cidr") public void SetMaskLength_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.SetMaskLength(x.Inet, default)) .ToArray(); @@ -1276,16 +1276,16 @@ SELECT set_masklen(n."Inet", 0) } [Fact] - public void SetMaskLength_NpgsqlCidr() + public void SetMaskLength_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.SetMaskLength(x.Cidr, default)) + _ = context.NetTestEntities + .Select(x => EF.Functions.SetMaskLength(x.IPNetwork, default)) .ToArray(); AssertSql( """ -SELECT set_masklen(n."Cidr", 0) +SELECT set_masklen(n."IPNetwork", 0) FROM "NetTestEntities" AS n """); } @@ -1294,7 +1294,7 @@ SELECT set_masklen(n."Cidr", 0) public void Text_IPAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Text(x.Inet)) .ToArray(); @@ -1306,16 +1306,16 @@ SELECT text(n."Inet") } [Fact] - public void Text_NpgsqlCidr() + public void Text_IPNetwork() { using var context = CreateContext(); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Text(x.Cidr)) + _ = context.NetTestEntities + .Select(x => EF.Functions.Text(x.IPNetwork)) .ToArray(); AssertSql( """ -SELECT text(n."Cidr") +SELECT text(n."IPNetwork") FROM "NetTestEntities" AS n """); } @@ -1325,7 +1325,7 @@ public void SameFamily_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.SameFamily(x.Inet, inet)) .ToArray(); @@ -1339,19 +1339,19 @@ SELECT inet_same_family(n."Inet", @p) } [Fact] - public void SameFamily_NpgsqlCidr() + public void SameFamily_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Select(x => EF.Functions.SameFamily(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.SameFamily(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT inet_same_family(n."Cidr", @p) +SELECT inet_same_family(n."IPNetwork", @p) FROM "NetTestEntities" AS n """); } @@ -1361,7 +1361,7 @@ public void Merge_IPAddress() { using var context = CreateContext(); var inet = IPAddress.Any; - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Merge(x.Inet, inet)) .ToArray(); @@ -1375,19 +1375,19 @@ SELECT inet_merge(n."Inet", @p) } [Fact] - public void Merge_NpgsqlCidr() + public void Merge_IPNetwork() { using var context = CreateContext(); - var cidr = new NpgsqlCidr(IPAddress.Any, default); - var _ = context.NetTestEntities - .Select(x => EF.Functions.Merge(x.Cidr, cidr)) + var cidr = new IPNetwork(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.Merge(x.IPNetwork, cidr)) .ToArray(); AssertSql( """ @p='0.0.0.0/0' (DbType = Object) -SELECT inet_merge(n."Cidr", @p) +SELECT inet_merge(n."IPNetwork", @p) FROM "NetTestEntities" AS n """); } @@ -1396,7 +1396,7 @@ SELECT inet_merge(n."Cidr", @p) public void Truncate_PhysicalAddress() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Truncate(x.Macaddr)) .ToArray(); @@ -1412,7 +1412,7 @@ SELECT trunc(n."Macaddr") public void Truncate_PhysicalAddress_macaddr8() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Truncate(x.Macaddr8)) .ToArray(); @@ -1428,7 +1428,7 @@ SELECT trunc(n."Macaddr8") public void Set7BitMac8_PhysicalAddress_macaddr8() { using var context = CreateContext(); - var _ = context.NetTestEntities + _ = context.NetTestEntities .Select(x => EF.Functions.Set7BitMac8(x.Macaddr8)) .ToArray(); @@ -1441,46 +1441,630 @@ SELECT macaddr8_set7bit(n."Macaddr8") #endregion - #region Fixtures + #region Obsolete (NpgsqlCidr) - /// - /// Represents a fixture suitable for testing network address operators. - /// - public class NetworkAddressQueryNpgsqlFixture : SharedStoreFixtureBase +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork + + [Fact] + public void LessThan_NpgsqlCidr() { - protected override string StoreName - => "NetworkQueryTest"; + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.LessThan(x.Cidr, cidr)) + .ToArray(); - protected override ITestStoreFactory TestStoreFactory - => NpgsqlTestStoreFactory.Instance; + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) - public TestSqlLoggerFactory TestSqlLoggerFactory - => (TestSqlLoggerFactory)ListLoggerFactory; +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" < @p +"""); + } - protected override Task SeedAsync(NetContext context) - => NetContext.SeedAsync(context); + [Fact] + public void LessThanOrEqual_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.LessThanOrEqual(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" <= @p +"""); } - /// - /// Represents an entity suitable for testing network address operators. - /// - public class NetTestEntity + [Fact] + public void GreaterThanOrEqual_NpgsqlCidr() { - // ReSharper disable once UnusedMember.Global - /// - /// The primary key. - /// - [Key] - public int Id { get; set; } + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.GreaterThanOrEqual(x.Cidr, cidr)) + .ToArray(); - /// - /// The network address. - /// - public IPAddress Inet { get; set; } = null!; + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" >= @p +"""); + } + + [Fact] + public void GreaterThan_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.GreaterThan(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" > @p +"""); + } + + [Fact] + public void ContainedBy_IPAddress_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainedBy(x.Inet, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Inet" << @p +"""); + } + + [Fact] + public void ContainedBy_NpgsqlCidr_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainedBy(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" << @p +"""); + } + + [Fact] + public void ContainedByOrEqual_IPAddress_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainedByOrEqual(x.Inet, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Inet" <<= @p +"""); + } + + [Fact] + public void ContainedByOrEqual_NpgsqlCidr_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainedByOrEqual(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" <<= @p +"""); + } + + [Fact] + public void Contains_NpgsqlCidr_and_IPAddress() + { + using var context = CreateContext(); + var inet = IPAddress.Any; + _ = context.NetTestEntities + .Where(x => EF.Functions.Contains(x.Cidr, inet)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" >> @p +"""); + } + + [Fact] + public void Contains_NpgsqlCidr_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.Contains(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" >> @p +"""); + } + + [Fact] + public void ContainsOrEqual_NpgsqlCidr_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrEqual(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" >>= @p +"""); + } + + [Fact] + public void ContainsOrEqual_NpgsqlCidr_and_IPAddress() + { + using var context = CreateContext(); + var inet = IPAddress.Any; + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrEqual(x.Cidr, inet)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" >>= @p +"""); + } + + [Fact] + public void ContainsOrContainedBy_IPAddress_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrContainedBy(x.Inet, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Inet" && @p +"""); + } + + [Fact] + public void ContainsOrContainedBy_NpgsqlCidr_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrContainedBy(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" && @p +"""); + } + + [Fact] + public void ContainsOrContainedBy_NpgsqlCidr_and_IPAddress() + { + using var context = CreateContext(); + var inet = IPAddress.Any; + _ = context.NetTestEntities + .Where(x => EF.Functions.ContainsOrContainedBy(x.Cidr, inet)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0' (DbType = Object) + +SELECT n."Id", n."Cidr", n."IPNetwork", n."Inet", n."Macaddr", n."Macaddr8", n."TextInet", n."TextMacaddr" +FROM "NetTestEntities" AS n +WHERE n."Cidr" && @p +"""); + } + + [Fact] + public void BitwiseAnd_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.BitwiseAnd(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Cidr" & @p +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void BitwiseOr_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.BitwiseOr(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Cidr" | @p +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Subtract_NpgsqlCidr_and_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.Subtract(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT n."Cidr" - @p +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void SameFamily_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.SameFamily(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT inet_same_family(n."Cidr", @p) +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Merge_NpgsqlCidr() + { + using var context = CreateContext(); + var cidr = new NpgsqlCidr(IPAddress.Any, default); + _ = context.NetTestEntities + .Select(x => EF.Functions.Merge(x.Cidr, cidr)) + .ToArray(); + + AssertSql( + """ +@p='0.0.0.0/0' (DbType = Object) + +SELECT inet_merge(n."Cidr", @p) +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void BitwiseNot_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.BitwiseNot(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT ~n."Cidr" +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Add_NpgsqlCidr_and_int() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Add(x.Cidr, 1)) + .ToArray(); + + AssertSql( + """ +SELECT n."Cidr" + 1 +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Subtract_NpgsqlCidr_and_int() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Subtract(x.Cidr, 1)) + .ToArray(); + + AssertSql( + """ +SELECT n."Cidr" - 1 +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Abbreviate_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Abbreviate(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT abbrev(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Broadcast_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Broadcast(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT broadcast(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Family_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Family(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT family(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Host_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Host(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT host(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void HostMask_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.HostMask(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT hostmask(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void MaskLength_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.MaskLength(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT masklen(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Netmask_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Netmask(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT netmask(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Network_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Network(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT network(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void SetMaskLength_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.SetMaskLength(x.Cidr, default)) + .ToArray(); + + AssertSql( + """ +SELECT set_masklen(n."Cidr", 0) +FROM "NetTestEntities" AS n +"""); + } + + [Fact] + public void Text_NpgsqlCidr() + { + using var context = CreateContext(); + _ = context.NetTestEntities + .Select(x => EF.Functions.Text(x.Cidr)) + .ToArray(); + + AssertSql( + """ +SELECT text(n."Cidr") +FROM "NetTestEntities" AS n +"""); + } + +#pragma warning restore CS0618 + + #endregion Obsolete (NpgsqlCidr) + + #region Fixtures + + /// + /// Represents a fixture suitable for testing network address operators. + /// + public class NetworkAddressQueryNpgsqlFixture : SharedStoreFixtureBase + { + protected override string StoreName + => "NetworkQueryTest"; + + protected override ITestStoreFactory TestStoreFactory + => NpgsqlTestStoreFactory.Instance; + + public TestSqlLoggerFactory TestSqlLoggerFactory + => (TestSqlLoggerFactory)ListLoggerFactory; + + protected override Task SeedAsync(NetContext context) + => NetContext.SeedAsync(context); + } + + /// + /// Represents an entity suitable for testing network address operators. + /// + public class NetTestEntity + { + // ReSharper disable once UnusedMember.Global + /// + /// The primary key. + /// + [Key] + public int Id { get; set; } + + /// + /// The network address. + /// + public IPAddress Inet { get; set; } = null!; + + /// + /// The network address. + /// + public IPNetwork IPNetwork { get; set; } /// /// The network address. /// + [Obsolete("NpgsqlCidr is obsolete, replaced by .NET IPNetwork")] public NpgsqlCidr Cidr { get; set; } /// @@ -1548,7 +2132,10 @@ public static async Task SeedAsync(NetContext context) { Id = i, Inet = ip, +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork Cidr = new NpgsqlCidr(IPAddress.Parse("192.168.1.0"), 24), +#pragma warning restore CS0618 + IPNetwork = new IPNetwork(IPAddress.Parse("192.168.1.0"), 24), Macaddr = macaddr, Macaddr8 = macaddr8, TextInet = ip.ToString(), diff --git a/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs b/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs index a347e04c1..d31012889 100644 --- a/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs +++ b/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingSourceTest.cs @@ -1,3 +1,5 @@ +using System.Net; +using System.Net.NetworkInformation; using Microsoft.EntityFrameworkCore.Storage.Json; using NetTopologySuite.Geometries; using Npgsql.EntityFrameworkCore.PostgreSQL.Infrastructure; @@ -47,6 +49,7 @@ public class NpgsqlTypeMappingSourceTest [InlineData("xid", typeof(uint), null, null, null, false)] [InlineData("xid8", typeof(ulong), null, null, null, false)] [InlineData("jsonpath", typeof(string), null, null, null, false)] + [InlineData("cidr", typeof(IPNetwork), null, null, null, false)] public void By_StoreType(string typeName, Type type, int? size, int? precision, int? scale, bool fixedLength) { var mapping = CreateTypeMappingSource().FindMapping(typeName); @@ -124,6 +127,12 @@ public void Timestamp_without_time_zone_Array_5() [InlineData(typeof(List>), "int4multirange")] [InlineData(typeof(Geometry), "geometry")] [InlineData(typeof(Point), "geometry")] + [InlineData(typeof(IPAddress), "inet")] + [InlineData(typeof(IPNetwork), "cidr")] +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork + [InlineData(typeof(NpgsqlCidr), "cidr")] // legacy +#pragma warning restore CS0618 + [InlineData(typeof(PhysicalAddress), "macaddr")] public void By_ClrType(Type clrType, string expectedStoreType) { var mapping = CreateTypeMappingSource().FindMapping(clrType); diff --git a/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingTest.cs b/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingTest.cs index d7a16e870..bfefb835a 100644 --- a/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingTest.cs +++ b/test/EFCore.PG.Tests/Storage/NpgsqlTypeMappingTest.cs @@ -282,13 +282,27 @@ public void GenerateCodeLiteral_returns_inet_literal() [Fact] public void GenerateSqlLiteral_returns_cidr_literal() - => Assert.Equal("CIDR '192.168.1.0/24'", GetMapping("cidr").GenerateSqlLiteral(new NpgsqlCidr(IPAddress.Parse("192.168.1.0"), 24))); + => Assert.Equal("CIDR '192.168.1.0/24'", GetMapping("cidr").GenerateSqlLiteral(new IPNetwork(IPAddress.Parse("192.168.1.0"), 24))); [Fact] public void GenerateCodeLiteral_returns_cidr_literal() + => Assert.Equal( + """new System.Net.IPNetwork(System.Net.IPAddress.Parse("192.168.1.0"), 24)""", + CodeLiteral(new IPNetwork(IPAddress.Parse("192.168.1.0"), 24))); + +#pragma warning disable CS0618 // NpgsqlCidr is obsolete, replaced by .NET IPNetwork + [Fact] + public void GenerateSqlLiteral_returns_legacy_cidr_literal() + => Assert.Equal( + "CIDR '192.168.1.0/24'", + GetMapping(typeof(NpgsqlCidr), "cidr").GenerateSqlLiteral(new NpgsqlCidr(IPAddress.Parse("192.168.1.0"), 24))); + + [Fact] + public void GenerateCodeLiteral_returns_legacy_cidr_literal() => Assert.Equal( """new NpgsqlTypes.NpgsqlCidr(System.Net.IPAddress.Parse("192.168.1.0"), (byte)24)""", CodeLiteral(new NpgsqlCidr(IPAddress.Parse("192.168.1.0"), 24))); +#pragma warning restore CS0618 #endregion Networking