From dbe9caedc83881ace0f34339e88661742cacad47 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Thu, 7 Aug 2025 23:29:43 +0200 Subject: [PATCH 1/9] feat: support set data type in mysql --- CodeGenerator/Generators/EnumsGen.cs | 9 +- Drivers/DbDriver.cs | 54 +++-- Drivers/Generators/CommonGen.cs | 15 +- Drivers/MySqlConnectorDriver.cs | 72 +++++- docs/05_MySql.md | 2 +- .../EndToEndScaffold/Templates/MySqlTests.cs | 22 +- .../MySqlConnectorDapperTester.generated.cs | 18 +- .../MySqlConnectorTester.generated.cs | 18 +- .../MySqlConnectorDapperTester.generated.cs | 18 +- .../MySqlConnectorTester.generated.cs | 18 +- .../MySqlConnectorDapperExample/Models.cs | 72 +++++- .../MySqlConnectorDapperExample/QuerySql.cs | 28 ++- examples/MySqlConnectorDapperExample/Utils.cs | 16 ++ .../MySqlConnectorDapperExample/request.json | 208 ++++++++++++------ .../request.message | Bin 20687 -> 21055 bytes .../Models.cs | 72 +++++- .../QuerySql.cs | 28 ++- .../Utils.cs | 16 ++ .../request.json | 208 ++++++++++++------ .../request.message | Bin 20721 -> 21089 bytes examples/MySqlConnectorExample/Models.cs | 41 +++- examples/MySqlConnectorExample/QuerySql.cs | 125 ++++++----- examples/MySqlConnectorExample/request.json | 208 ++++++++++++------ .../MySqlConnectorExample/request.message | Bin 20671 -> 21039 bytes .../MySqlConnectorLegacyExample/Models.cs | 42 +++- .../MySqlConnectorLegacyExample/QuerySql.cs | 129 ++++++----- .../MySqlConnectorLegacyExample/request.json | 208 ++++++++++++------ .../request.message | Bin 20705 -> 21073 bytes examples/NpgsqlDapperExample/Models.cs | 1 + examples/NpgsqlDapperLegacyExample/Models.cs | 1 + examples/NpgsqlExample/Models.cs | 1 + examples/NpgsqlLegacyExample/Models.cs | 1 + examples/SqliteDapperExample/Models.cs | 2 + examples/SqliteDapperLegacyExample/Models.cs | 2 + examples/SqliteExample/Models.cs | 2 + examples/SqliteLegacyExample/Models.cs | 2 + examples/config/mysql/query.sql | 16 +- examples/config/mysql/schema.sql | 25 ++- 38 files changed, 1204 insertions(+), 496 deletions(-) diff --git a/CodeGenerator/Generators/EnumsGen.cs b/CodeGenerator/Generators/EnumsGen.cs index 04dd6617..f4649b85 100644 --- a/CodeGenerator/Generators/EnumsGen.cs +++ b/CodeGenerator/Generators/EnumsGen.cs @@ -21,10 +21,6 @@ public enum {{name}} {{enumValuesDef}} } """)!; - - if (dbDriver.Options.UseDapper) - return [enumType]; - var enumExtensions = ParseMemberDeclaration($$""" public static class {{name}}Extensions { @@ -40,6 +36,11 @@ public static class {{name}}Extensions { return StringToEnum[me]; } + + public static {{name}}[] To{{name}}Arr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } """)!; return [enumType, enumExtensions]; diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index 01c0fb95..e0e68d4c 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -21,7 +21,7 @@ public abstract class DbDriver public Dictionary> Enums { get; } - private IList Queries { get; } + protected IList Queries { get; } private HashSet NullableTypesInDotnetCore { get; } = [ @@ -148,7 +148,7 @@ private ISet GetUsingDirectivesForColumnMappings() public virtual ISet GetUsingDirectivesForUtils() { - return new HashSet() + return new HashSet { "System.Linq" } @@ -158,20 +158,24 @@ public virtual ISet GetUsingDirectivesForUtils() public virtual ISet GetUsingDirectivesForModels() { - return GetUsingDirectivesForColumnMappings(); + return new HashSet + { + "System.Linq" + } + .AddRangeExcludeNulls(GetUsingDirectivesForColumnMappings()); } - public virtual string[] GetConstructorStatements() + public string[] GetConstructorStatements() { return [$"this.{Variable.ConnectionString.AsPropertyName()} = {Variable.ConnectionString.AsVarName()};"]; } - public virtual string[] GetTransactionConstructorStatements() + public string[] GetTransactionConstructorStatements() { return [$"this.{Variable.Transaction.AsPropertyName()} = {Variable.Transaction.AsVarName()};"]; } - protected ISet GetConfigureSqlMappings() + protected virtual ISet GetConfigureSqlMappings() { return ColumnMappings .Where(m => TypeExistsInQueries(m.Key) && m.Value.SqlMapper is not null) @@ -218,6 +222,16 @@ public string GetCsharpType(Column column, Query? query) return AddNullableSuffixIfNeeded(csharpType, IsColumnNotNull(column, query)); } + public string GetColumnSchema(Column column) + { + return column.Table.Schema == DefaultSchema ? string.Empty : column.Table.Schema; + } + + public virtual string GetEnumTypeAsCsharpType(Column column, Plugin.Enum enumType) + { + return column.Type.Name.ToModelName(GetColumnSchema(column), DefaultSchema); + } + public string GetCsharpTypeWithoutNullableSuffix(Column column, Query? query) { if (column.EmbedTable != null) @@ -226,8 +240,8 @@ public string GetCsharpTypeWithoutNullableSuffix(Column column, Query? query) if (string.IsNullOrEmpty(column.Type.Name)) return "object"; - if (IsEnumType(column)) - return column.Type.Name.ToModelName(column.Table.Schema, DefaultSchema); + if (GetEnumType(column) is { } enumType) + return GetEnumTypeAsCsharpType(column, enumType); if (FindOverrideForQueryColumn(query, column) is { CsharpType: var csharpType }) return csharpType.Type; @@ -242,14 +256,14 @@ public string GetCsharpTypeWithoutNullableSuffix(Column column, Query? query) throw new NotSupportedException($"Column {column.Name} has unsupported column type: {column.Type.Name}"); } - private bool IsEnumType(Column column) + public Plugin.Enum? GetEnumType(Column column) { if (column.Table is null) - return false; - var enumSchema = column.Table.Schema == DefaultSchema ? string.Empty : column.Table.Schema; - if (!Enums.TryGetValue(enumSchema, value: out var enumsInSchema)) - return false; - return enumsInSchema.ContainsKey(column.Type.Name); + return null; + var schemaName = GetColumnSchema(column); + if (!Enums.TryGetValue(schemaName, value: out var enumsInSchema)) + return null; + return enumsInSchema.GetValueOrDefault(column.Type.Name); } private static bool DoesColumnMappingApply(ColumnMapping columnMapping, Column column) @@ -269,16 +283,20 @@ private string GetColumnReader(CsharpTypeOption csharpTypeOption, int ordinal) throw new NotSupportedException($"Could not find column mapping for type override: {csharpTypeOption.Type}"); } - private string GetEnumReader(Column column, int ordinal) + private string GetEnumReader(Column column, int ordinal, Plugin.Enum enumType) { var enumName = column.Type.Name.ToModelName(column.Table.Schema, DefaultSchema); - return $"{Variable.Reader.AsVarName()}.GetString({ordinal}).To{enumName}()"; + var fullEnumType = GetEnumTypeAsCsharpType(column, enumType); + var readStmt = $"{Variable.Reader.AsVarName()}.GetString({ordinal})"; + if (fullEnumType.EndsWith("[]")) + return $"{readStmt}.To{enumName}Arr()"; + return $"{readStmt}.To{enumName}()"; } public string GetColumnReader(Column column, int ordinal, Query? query) { - if (IsEnumType(column)) - return GetEnumReader(column, ordinal); + if (GetEnumType(column) is { } enumType) + return GetEnumReader(column, ordinal, enumType); if (FindOverrideForQueryColumn(query, column) is { CsharpType: var csharpType }) return GetColumnReader(csharpType, ordinal); diff --git a/Drivers/Generators/CommonGen.cs b/Drivers/Generators/CommonGen.cs index 1f6ff72d..75872894 100644 --- a/Drivers/Generators/CommonGen.cs +++ b/Drivers/Generators/CommonGen.cs @@ -21,8 +21,19 @@ public static string GetMethodParameterList(string argInterface, IEnumerable notNull ? el : $"{el} ?? (object)DBNull.Value"; - return dbDriver.Options.UseDapper ? null : defaultWriterFn; + if (dbDriver.GetEnumType(column) is { } enumType) + if (dbDriver.GetEnumTypeAsCsharpType(column, enumType).EndsWith("[]")) + return (el, notNull, isDapper) => + { + var stringJoinStmt = $"string.Join(\",\", {el})"; + var nullValue = isDapper ? "null" : "(object)DBNull.Value"; + return notNull + ? stringJoinStmt + : $"{el} != null ? {stringJoinStmt} : {nullValue}"; + }; + + string DefaultWriterFn(string el, bool notNull, bool isDapper) => notNull ? el : $"{el} ?? (object)DBNull.Value"; + return dbDriver.Options.UseDapper ? null : DefaultWriterFn; } public string AddParametersToCommand(Query query) diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index b02177a2..65948fa9 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -128,7 +128,7 @@ public partial class MySqlConnectorDriver( if (notNull) return $"{el}.GetRawText()"; var nullValue = isDapper ? "null" : "(object)DBNull.Value"; - return $"{el}.HasValue ? {el}.Value.GetRawText() : {nullValue}"; + return $"{el}?.GetRawText() ?? {nullValue}"; }, usingDirective: "System.Text.Json", sqlMapper: "SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler());", @@ -145,6 +145,24 @@ public partial class MySqlConnectorDriver( public override string TransactionClassName => "MySqlTransaction"; + private readonly Func _setTypeHandlerFunc = x => + $$""" + public class {{x}}TypeHandler : SqlMapper.TypeHandler<{{x}}[]> + { + public override {{x}}[] Parse(object value) + { + if (value is string s) + return s.To{{x}}Arr(); + throw new DataException($"Cannot convert {value?.GetType()} to {{x}}[]"); + } + + public override void SetValue(IDbDataParameter parameter, {{x}}[] value) + { + parameter.Value = string.Join(",", value); + } + } + """; + public override ISet GetUsingDirectivesForQueries() { return base @@ -193,11 +211,48 @@ public override ISet GetUsingDirectivesForUtils() ); } + protected override ISet GetConfigureSqlMappings() + { + var setSqlMappings = Queries + .SelectMany(q => q.Columns) + .Where(c => + { + var enumType = GetEnumType(c); + return enumType is not null && IsEnumOfTypeSet(c, enumType); + }) + .Select(c => + { + var enumName = c.Type.Name.ToModelName(GetColumnSchema(c), DefaultSchema); + return $"SqlMapper.AddTypeHandler(typeof({enumName}[]), new {enumName}TypeHandler());"; + }) + .Distinct(); + + return base + .GetConfigureSqlMappings() + .AddRangeExcludeNulls(setSqlMappings); + } + + private MemberDeclarationSyntax[] GetSetTypeHandlers() + { + return Queries + .SelectMany(q => q.Columns) + .Where(c => + { + var enumType = GetEnumType(c); + return enumType is not null && IsEnumOfTypeSet(c, enumType); + }) + .Select(c => _setTypeHandlerFunc(c.Type.Name.ToModelName(GetColumnSchema(c), DefaultSchema))) + .Distinct() + .Select(m => ParseMemberDeclaration(m)!) + .ToArray(); + } + public override MemberDeclarationSyntax[] GetMemberDeclarationsForUtils() { var memberDeclarations = base .GetMemberDeclarationsForUtils() - .AddRangeIf([ParseMemberDeclaration(TransformQueryForSliceArgsImpl)!], SliceQueryExists()); + .AddRangeIf([ParseMemberDeclaration(TransformQueryForSliceArgsImpl)!], SliceQueryExists()) + .AddRangeIf(GetSetTypeHandlers(), Options.UseDapper); if (!CopyFromQueryExists()) return [.. memberDeclarations]; @@ -439,4 +494,17 @@ private ISet GetBoolAndByteConverters() TypeExistsInQueries("byte[]") ); } + + private bool IsEnumOfTypeSet(Column column, Plugin.Enum enumType) + { + return column.Length > enumType.Vals.Select(v => v.Length).Sum(); + } + + public override string GetEnumTypeAsCsharpType(Column column, Plugin.Enum enumType) + { + var enumName = column.Type.Name.ToModelName(GetColumnSchema(column), DefaultSchema); + if (this is not MySqlConnectorDriver) + return enumName; + return IsEnumOfTypeSet(column, enumType) ? $"{enumName}[]" : enumName; + } } \ No newline at end of file diff --git a/docs/05_MySql.md b/docs/05_MySql.md index dac6800b..7d6c92f1 100644 --- a/docs/05_MySql.md +++ b/docs/05_MySql.md @@ -70,7 +70,7 @@ we consider support for the different data types separately for batch inserts an | mediumblob | ✅ | ✅ | | longblob | ✅ | ✅ | | enum | ✅ | ✅ | -| set | ❌ | ❌ | +| set | ✅ | ❌ | | json | ✅ | ✅ | | geometry | ❌ | ❌ | | point | ❌ | ❌ | diff --git a/end2end/EndToEndScaffold/Templates/MySqlTests.cs b/end2end/EndToEndScaffold/Templates/MySqlTests.cs index d8c7fd81..34606f19 100644 --- a/end2end/EndToEndScaffold/Templates/MySqlTests.cs +++ b/end2end/EndToEndScaffold/Templates/MySqlTests.cs @@ -250,21 +250,31 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow { Impl = $$""" [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes( + MysqlTypesCEnum? cEnum, + MysqlTypesCSet[] cSet) { await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } """ }, diff --git a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs index 41ed65a2..4e36b2e9 100644 --- a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] diff --git a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs index 039ec10d..b8228eca 100644 --- a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.Value.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs index 96096318..d3057b2c 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs index 90cf6073..e333fea4 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] diff --git a/examples/MySqlConnectorDapperExample/Models.cs b/examples/MySqlConnectorDapperExample/Models.cs index a3892826..55296158 100644 --- a/examples/MySqlConnectorDapperExample/Models.cs +++ b/examples/MySqlConnectorDapperExample/Models.cs @@ -1,6 +1,7 @@ // auto-generated by sqlc - do not edit using System; using System.Collections.Generic; +using System.Linq; using System.Text.Json; namespace MySqlConnectorDapperExampleGen; @@ -47,9 +48,10 @@ public class MysqlType public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public JsonElement? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public byte? CBit { get; init; } public byte[]? CBinary { get; init; } public byte[]? CVarbinary { get; init; } @@ -72,10 +74,78 @@ public enum MysqlTypesCEnum Big = 3 } +public static class MysqlTypesCEnumExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCEnum.Invalid, + ["small"] = MysqlTypesCEnum.Small, + ["medium"] = MysqlTypesCEnum.Medium, + ["big"] = MysqlTypesCEnum.Big + }; + public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + +public enum MysqlTypesCSet +{ + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 +} + +public static class MysqlTypesCSetExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + public enum ExtendedBiosBioType { Invalid = 0, // reserved for invalid enum value Autobiography = 1, Biography = 2, Memoir = 3 +} + +public static class ExtendedBiosBioTypeExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosBioType.Invalid, + ["Autobiography"] = ExtendedBiosBioType.Autobiography, + ["Biography"] = ExtendedBiosBioType.Biography, + ["Memoir"] = ExtendedBiosBioType.Memoir + }; + public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } \ No newline at end of file diff --git a/examples/MySqlConnectorDapperExample/QuerySql.cs b/examples/MySqlConnectorDapperExample/QuerySql.cs index e8dd0a40..e4c9ef05 100644 --- a/examples/MySqlConnectorDapperExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperExample/QuerySql.cs @@ -528,7 +528,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; public class InsertMysqlTypesArgs { public byte? CBit { get; init; } @@ -555,9 +555,10 @@ public class InsertMysqlTypesArgs public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public short? CYear { get; init; } public DateTime? CDate { get; init; } public DateTime? CDatetime { get; init; } @@ -596,9 +597,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) queryParams.Add("c_mediumtext", args.CMediumtext); queryParams.Add("c_text", args.CText); queryParams.Add("c_longtext", args.CLongtext); - queryParams.Add("c_enum", args.CEnum); - queryParams.Add("c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : null); + queryParams.Add("c_json", args.CJson?.GetRawText() ?? null); queryParams.Add("c_json_string_override", args.CJsonStringOverride); + queryParams.Add("c_enum", args.CEnum); + queryParams.Add("c_set", args.CSet != null ? string.Join(",", args.CSet) : null); queryParams.Add("c_year", args.CYear); queryParams.Add("c_date", args.CDate); queryParams.Add("c_datetime", args.CDatetime); @@ -653,9 +655,10 @@ public class InsertMysqlTypesBatchArgs public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public short? CYear { get; init; } public DateTime? CDate { get; init; } public DateTime? CDatetime { get; init; } @@ -700,8 +703,9 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -720,13 +724,13 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; public class GetMysqlTypesRow { public bool? CBool { get; init; } @@ -757,9 +761,10 @@ public class GetMysqlTypesRow public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public byte? CBit { get; init; } public byte[]? CBinary { get; init; } public byte[]? CVarbinary { get; init; } @@ -787,7 +792,7 @@ public class GetMysqlTypesRow return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetMysqlTypesSql, transaction: this.Transaction); } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; public class GetMysqlTypesCntRow { public required long Cnt { get; init; } @@ -815,9 +820,10 @@ public class GetMysqlTypesCntRow public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public short? CYear { get; init; } public DateTime? CDate { get; init; } public DateTime? CDatetime { get; init; } diff --git a/examples/MySqlConnectorDapperExample/Utils.cs b/examples/MySqlConnectorDapperExample/Utils.cs index 97309842..5d4cdb4d 100644 --- a/examples/MySqlConnectorDapperExample/Utils.cs +++ b/examples/MySqlConnectorDapperExample/Utils.cs @@ -30,6 +30,7 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(MysqlTypesCSet[]), new MysqlTypesCSetTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -38,6 +39,21 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + public class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler + { + public override MysqlTypesCSet[] Parse(object value) + { + if (value is string s) + return s.ToMysqlTypesCSetArr(); + throw new DataException($"Cannot convert {value?.GetType()} to MysqlTypesCSet[]"); + } + + public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value) + { + parameter.Value = string.Join(",", value); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorDapperExample/request.json b/examples/MySqlConnectorDapperExample/request.json index ecaebaf5..c812158e 100644 --- a/examples/MySqlConnectorDapperExample/request.json +++ b/examples/MySqlConnectorDapperExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -1269,7 +1287,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1654,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1678,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1727,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1742,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1757,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1772,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1787,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1802,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1817,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1832,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1847,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1868,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2235,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2259,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2308,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2323,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2338,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2353,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2368,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2383,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2398,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2413,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2428,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2449,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2762,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2781,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2886,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3164,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3183,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", diff --git a/examples/MySqlConnectorDapperExample/request.message b/examples/MySqlConnectorDapperExample/request.message index 324a9d972caae1ec46e7826bca81e65f0cd72eee..d85ceefd4ce8a07818ac080b9b7be64a196ed4f7 100644 GIT binary patch delta 800 zcmX@Vka7PK#tl=Lcw2;p*a}LMax#;ZE(&g5$YjIF)W^5^J~JCDqt;|W8?DKXoVJYm zlW$n-8w%-iu_nhCr(WS5B^$UctyUInQ31J2kH~ zS4RPC?Brg1-N_X)yEhxiwy-hVaY#i!C{R@&PsV$^EwcY+3;vszN@K7uZTozMy8xtS00(xra+)vVyuN%N|LtU7K^& z6&bO5LTmB^jlGi%WLY=Q*X$VF9_bV1I=cCRu^Hp!LVE?|xY%rEI+ty-fKA8b>(-X0 zCh!m^CV4;ue{!9Z=H>%71&l2JB)Il&HnB6sw58X6Gln2A85nP#?s$e3X1zIC)+-rJ Z7Bm!@eBM=Pvb`bCWDQHx%{?B@900(8`%VA= delta 472 zcmdnLgz@}B#tl=Lc-IOEu@#gitlYKc28MP*#v(cI? zz-haAEoV04W(RIj0hSjMTpK3~XjD$VB)x(yIX*S7GlUY7UaBbKuprOc!?4%UU$D6&hx(2{G7e%=CZ9Z>e#>fH=A4W5k%_e3u z*%-|y`*G?|-eAZv`HW2`quS(kobsEW*j6yI?2_PGzd6C)6iLGohxG^^FnIMhUvxUd Vie`k-WJgtzNmjv||9Coc001XDkZ%A0 diff --git a/examples/MySqlConnectorDapperLegacyExample/Models.cs b/examples/MySqlConnectorDapperLegacyExample/Models.cs index 3d12c5a7..5afa5757 100644 --- a/examples/MySqlConnectorDapperLegacyExample/Models.cs +++ b/examples/MySqlConnectorDapperLegacyExample/Models.cs @@ -3,6 +3,7 @@ namespace MySqlConnectorDapperLegacyExampleGen { using System; using System.Collections.Generic; + using System.Linq; using System.Text.Json; public class Author @@ -48,9 +49,10 @@ public class MysqlType public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public JsonElement? CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -73,6 +75,54 @@ public enum MysqlTypesCEnum Big = 3 } + public static class MysqlTypesCEnumExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCEnum.Invalid, + ["small"] = MysqlTypesCEnum.Small, + ["medium"] = MysqlTypesCEnum.Medium, + ["big"] = MysqlTypesCEnum.Big + }; + public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + + public enum MysqlTypesCSet + { + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 + } + + public static class MysqlTypesCSetExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + public enum ExtendedBiosBioType { Invalid = 0, // reserved for invalid enum value @@ -80,4 +130,24 @@ public enum ExtendedBiosBioType Biography = 2, Memoir = 3 } + + public static class ExtendedBiosBioTypeExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosBioType.Invalid, + ["Autobiography"] = ExtendedBiosBioType.Autobiography, + ["Biography"] = ExtendedBiosBioType.Biography, + ["Memoir"] = ExtendedBiosBioType.Memoir + }; + public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } } \ No newline at end of file diff --git a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs index 12a09c9a..54c559b2 100644 --- a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs @@ -529,7 +529,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; public class InsertMysqlTypesArgs { public byte? CBit { get; set; } @@ -556,9 +556,10 @@ public class InsertMysqlTypesArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -597,9 +598,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) queryParams.Add("c_mediumtext", args.CMediumtext); queryParams.Add("c_text", args.CText); queryParams.Add("c_longtext", args.CLongtext); - queryParams.Add("c_enum", args.CEnum); - queryParams.Add("c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : null); + queryParams.Add("c_json", args.CJson?.GetRawText() ?? null); queryParams.Add("c_json_string_override", args.CJsonStringOverride); + queryParams.Add("c_enum", args.CEnum); + queryParams.Add("c_set", args.CSet != null ? string.Join(",", args.CSet) : null); queryParams.Add("c_year", args.CYear); queryParams.Add("c_date", args.CDate); queryParams.Add("c_datetime", args.CDatetime); @@ -654,9 +656,10 @@ public class InsertMysqlTypesBatchArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -700,8 +703,9 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -720,13 +724,13 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; public class GetMysqlTypesRow { public bool? CBool { get; set; } @@ -757,9 +761,10 @@ public class GetMysqlTypesRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -787,7 +792,7 @@ public async Task GetMysqlTypes() return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetMysqlTypesSql, transaction: this.Transaction); } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; public class GetMysqlTypesCntRow { public long Cnt { get; set; } @@ -815,9 +820,10 @@ public class GetMysqlTypesCntRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } diff --git a/examples/MySqlConnectorDapperLegacyExample/Utils.cs b/examples/MySqlConnectorDapperLegacyExample/Utils.cs index 22bcd6cb..472ea6e4 100644 --- a/examples/MySqlConnectorDapperLegacyExample/Utils.cs +++ b/examples/MySqlConnectorDapperLegacyExample/Utils.cs @@ -31,6 +31,7 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(MysqlTypesCSet[]), new MysqlTypesCSetTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -39,6 +40,21 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + public class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler + { + public override MysqlTypesCSet[] Parse(object value) + { + if (value is string s) + return s.ToMysqlTypesCSetArr(); + throw new DataException($"Cannot convert {value?.GetType()} to MysqlTypesCSet[]"); + } + + public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value) + { + parameter.Value = string.Join(",", value); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorDapperLegacyExample/request.json b/examples/MySqlConnectorDapperLegacyExample/request.json index 182684f1..2a6ffc20 100644 --- a/examples/MySqlConnectorDapperLegacyExample/request.json +++ b/examples/MySqlConnectorDapperLegacyExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -1269,7 +1287,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1654,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1678,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1727,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1742,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1757,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1772,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1787,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1802,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1817,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1832,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1847,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1868,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2235,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2259,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2308,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2323,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2338,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2353,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2368,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2383,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2398,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2413,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2428,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2449,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2762,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2781,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2886,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3164,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3183,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", diff --git a/examples/MySqlConnectorDapperLegacyExample/request.message b/examples/MySqlConnectorDapperLegacyExample/request.message index 23c0ca6f7e89a57abd34f49258e317b000a4e93c..73aadd7d0d2d6d9bf0288f5aa1abe2ad9ab5f76f 100644 GIT binary patch delta 808 zcmeykkn!OX#tkc&cw2;p*a}LMax#;ZE(&hm%4EaH)W^5^Gcy}2qt@h&?pl*WIc*vB zC%>`Q*B8>|Voi=OPAxIu58{>L&aEsi%!x0lEJ!U*5|$D~;>LqjZJx-P!>F#tg()M% zT#}k7#Fm_&mX?|-#FCqtlfC&5mzV&{7D=w%lN;45C-+OQm~1bj!kwB|nyaG#Hg57l zd)>)BGP^gs$hNRC+i^%v7ErNgl$so%63gt&AwAj7z=_X+Lq^C3?#RiE3KH_zTvi3~ zhL#N6(&D3bY)bWtYc)us5Cj#$dyrf@_Hk0W)&f;$qlw5 zljo^vGOG&tO#bL81!Rj)R#4`gTy8ANtS00(c>$LMSZsqb`(zC}>B$d_1z7e-a_!pO zsIJI}#Xnk;zi8~;yiT)s==g`bPn7E@bFizAt8>U?LkF?RzS4G+{Y`F9ZnalHj;+mp zrgPaQZ*cFJ{My>m)C3+U#3USO^lV;jGn0|!p9I(5%^r59jFX*ZP;FRfzZpXim`IE_ VuXa4cN}1J@IV>|bFYpND000Zk1&jay delta 526 zcmaF3gz@7-#tkc&c-IOEu@#giqjzd<+ zYVrj(5wN-gszQu%lP{|}G0IOCQ*&ihm>i>K!>BlUCXlT(`M#Prqw-{Jb$ezNA)m>K z-cplH#3wr#a86#XF3PAnd9Qjh%LfUr4U==FD<{v@Sb^$PwaN1|_im2U>Ka7O<-RDw zwU0U2)yLI2WOAQ$$YeXy+pM7A)tTHcqs)?&S)wy}zNX9O31)$8lQV5CCqK05n0(e* zW0PG0Bg-xcuJxNs>`fUFI)E{vIr+X5+h%sh1~lQ#_nj`W!p-<^nXy^GE06;K&3UJ< diff --git a/examples/MySqlConnectorExample/Models.cs b/examples/MySqlConnectorExample/Models.cs index 1918eae8..407ba0d7 100644 --- a/examples/MySqlConnectorExample/Models.cs +++ b/examples/MySqlConnectorExample/Models.cs @@ -1,12 +1,13 @@ // auto-generated by sqlc - do not edit using System; using System.Collections.Generic; +using System.Linq; using System.Text.Json; namespace MySqlConnectorExampleGen; public readonly record struct Author(long Id, string Name, string? Bio); public readonly record struct Book(long Id, string Name, long AuthorId, string? Description); -public readonly record struct MysqlType(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, JsonElement? CJsonStringOverride, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); +public readonly record struct MysqlType(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, JsonElement? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public readonly record struct ExtendedBio(string? AuthorName, string? Name, ExtendedBiosBioType? BioType); public enum MysqlTypesCEnum { @@ -29,6 +30,39 @@ public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) { return StringToEnum[me]; } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + +public enum MysqlTypesCSet +{ + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 +} + +public static class MysqlTypesCSetExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } public enum ExtendedBiosBioType @@ -52,4 +86,9 @@ public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) { return StringToEnum[me]; } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } \ No newline at end of file diff --git a/examples/MySqlConnectorExample/QuerySql.cs b/examples/MySqlConnectorExample/QuerySql.cs index 6991ec60..b9c36f55 100644 --- a/examples/MySqlConnectorExample/QuerySql.cs +++ b/examples/MySqlConnectorExample/QuerySql.cs @@ -654,8 +654,8 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; - public readonly record struct InsertMysqlTypesArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CFloat, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + public readonly record struct InsertMysqlTypesArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CFloat, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) { if (this.Transaction == null) @@ -689,9 +689,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -742,9 +743,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -759,7 +761,7 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) } } - public readonly record struct InsertMysqlTypesBatchArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + public readonly record struct InsertMysqlTypesBatchArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task InsertMysqlTypesBatch(List args) { const string supportedDateTimeFormat = "yyyy-MM-dd H:mm:ss"; @@ -793,8 +795,9 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -813,14 +816,14 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; - public readonly record struct GetMysqlTypesRow(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + public readonly record struct GetMysqlTypesRow(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task GetMysqlTypes() { if (this.Transaction == null) @@ -864,16 +867,17 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -926,16 +930,17 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -944,8 +949,8 @@ public async Task InsertMysqlTypesBatch(List args) return null; } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; - public readonly record struct GetMysqlTypesCntRow(long Cnt, bool? CBool, bool? CBoolean, byte? CBit, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + public readonly record struct GetMysqlTypesCntRow(long Cnt, bool? CBool, bool? CBoolean, byte? CBit, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task GetMysqlTypesCnt() { if (this.Transaction == null) @@ -986,19 +991,20 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1048,19 +1054,20 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } diff --git a/examples/MySqlConnectorExample/request.json b/examples/MySqlConnectorExample/request.json index 04a6f3da..a3b7fb5d 100644 --- a/examples/MySqlConnectorExample/request.json +++ b/examples/MySqlConnectorExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -1269,7 +1287,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1654,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1678,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1727,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1742,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1757,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1772,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1787,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1802,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1817,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1832,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1847,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1868,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2235,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2259,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2308,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2323,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2338,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2353,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2368,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2383,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2398,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2413,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2428,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2449,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2762,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2781,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2886,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3164,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3183,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", diff --git a/examples/MySqlConnectorExample/request.message b/examples/MySqlConnectorExample/request.message index 25147ddea2ae6af2810515220f35480c0319b196..cbc83b712bc52c406fe43ee8ca6d836055a8472c 100644 GIT binary patch delta 772 zcmdnLka7JI#tofJye+~)Yz3uBIhn~y7X>#@W3pjn>f_sdg_(_YGB;-iqyFTx*7}A* zx?HTu@x`en2K+(1Qrx+f#f3TXC6xuK#Yw_af=JwWuqq+>$$d8RnJHr6wDy#4+RdHN=#mF&$hY8@eC_vPMG}CB6D-2haCq1 Dr#kfa delta 527 zcmZ3#gmM2u#tofJylaJo*a}LMax#;ZehF-z#$?0Dbf0(g6=pWp$xfVxlW%ckY+l5f z&A8c=TU3DMg#_2e&3@8~jBLsAsd=TjlXGR%CNGkCvbj^Xk&W4zLvr$36(?pp4ynn! zD)ubWLQ!0k0}aI|%X9Kf{;MQD`5y=Sq|}E;K{?LWyc{4 z6xzrp0#=w{B*Z8;d5fwOqx|IWs;-O*lWo;(7!@a1skt&LO+KLJ&8R$?N8O%TMaXCJ zK|3k1o_cjTM%Bsl)RS30NN{bK>?d70xlUsRszcQ#*K6+GY_HWdXdKIZQG{zBbFizA zt8>WYeCd$M@}{?0K|!lCxj;slB`LE+XL5t4%jQC}K(@(Vww99**>p@^=d7_g$*X{o xWtRlk`pu#Cri=(J!06DNe87oq^9zRtG~vw$oG!7#4S8UhF}c{P5NOa@b^te=sGk4; diff --git a/examples/MySqlConnectorLegacyExample/Models.cs b/examples/MySqlConnectorLegacyExample/Models.cs index 2391ced1..e823cafa 100644 --- a/examples/MySqlConnectorLegacyExample/Models.cs +++ b/examples/MySqlConnectorLegacyExample/Models.cs @@ -3,6 +3,7 @@ namespace MySqlConnectorLegacyExampleGen { using System; using System.Collections.Generic; + using System.Linq; using System.Text.Json; public class Author @@ -48,9 +49,10 @@ public class MysqlType public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public JsonElement? CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -86,6 +88,39 @@ public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) { return StringToEnum[me]; } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + + public enum MysqlTypesCSet + { + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 + } + + public static class MysqlTypesCSetExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } public enum ExtendedBiosBioType @@ -109,5 +144,10 @@ public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) { return StringToEnum[me]; } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } } \ No newline at end of file diff --git a/examples/MySqlConnectorLegacyExample/QuerySql.cs b/examples/MySqlConnectorLegacyExample/QuerySql.cs index 4f500e5c..07c3ea99 100644 --- a/examples/MySqlConnectorLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorLegacyExample/QuerySql.cs @@ -741,7 +741,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; public class InsertMysqlTypesArgs { public byte? CBit { get; set; } @@ -768,9 +768,10 @@ public class InsertMysqlTypesArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -815,9 +816,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -868,9 +870,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -911,9 +914,10 @@ public class InsertMysqlTypesBatchArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -957,8 +961,9 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -977,13 +982,13 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; public class GetMysqlTypesRow { public bool? CBool { get; set; } @@ -1014,9 +1019,10 @@ public class GetMysqlTypesRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -1068,16 +1074,17 @@ public async Task GetMysqlTypes() CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? (MysqlTypesCEnum? )null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? (byte? )null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? (MysqlTypesCEnum? )null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? (byte? )null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1130,16 +1137,17 @@ public async Task GetMysqlTypes() CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? (MysqlTypesCEnum? )null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? (byte? )null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? (MysqlTypesCEnum? )null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? (byte? )null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1148,7 +1156,7 @@ public async Task GetMysqlTypes() return null; } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; public class GetMysqlTypesCntRow { public long Cnt { get; set; } @@ -1176,9 +1184,10 @@ public class GetMysqlTypesCntRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -1230,19 +1239,20 @@ public async Task GetMysqlTypesCnt() CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? (MysqlTypesCEnum? )null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? (short? )null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? (DateTime? )null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? (MysqlTypesCEnum? )null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? (short? )null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? (DateTime? )null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1292,19 +1302,20 @@ public async Task GetMysqlTypesCnt() CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? (MysqlTypesCEnum? )null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? (short? )null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? (DateTime? )null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? (MysqlTypesCEnum? )null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? (short? )null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? (DateTime? )null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } diff --git a/examples/MySqlConnectorLegacyExample/request.json b/examples/MySqlConnectorLegacyExample/request.json index 791be11e..e151f94a 100644 --- a/examples/MySqlConnectorLegacyExample/request.json +++ b/examples/MySqlConnectorLegacyExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -1269,7 +1287,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1654,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1678,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1727,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1742,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1757,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1772,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1787,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1802,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1817,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1832,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1847,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1868,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2235,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2259,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2308,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2323,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2338,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2353,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2368,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2383,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2398,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2413,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2428,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2449,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2762,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2781,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2886,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3164,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3183,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", diff --git a/examples/MySqlConnectorLegacyExample/request.message b/examples/MySqlConnectorLegacyExample/request.message index e7aadc4e452772f9b50c9a334085e10f470da5e3..2a349a1834b8170e4f95b05c33c11d430a099e8f 100644 GIT binary patch delta 770 zcmaF3kn!RY#tn0scw2;p*a}LMax#;ZE(&g5#bm?C)W^5^1v4A#WO>dEM*YbTt@RCs zbh%iQi<>!XnRH zlA0*QmYkoKmYOQWlAD>6z4;@Tm;lQbNv_?Sxuq2uC(qYV;ZDsf&DBu=n>cyDhSuad znSGlrWn0)-?KmWbtR^dPicIb^&}5bpikj?aqcZuPfjP4?hxFtF%1(R^95O;Sa5qm* zl#`Ih=FlpLue9tqWG71)+B3>cjsTMKlV=z@F)B>HZRpCVI9buihEZv9oRKS|@?=9b zZ$_2LAB^l7RVN!52QsQn=2uT<*(1rdYcjWV<>dG3E3i2H`R2u%y@SrteWF}PH@`GC zW1PHLLqQlRs6io~lv$!Pd7-1r=6=&aHbx_0P-{)T;2t~qfwiTn2|QSdNea*q-n_tO wCL_x~39h}HZS73KcA`h`<^%SfSS2POu;<*o!0`+#H5@YeuSMqOsUAKY0Mf_!$N&HU delta 434 zcmcb(gz@1*#tn0sc-IOEu@#giZ^q4@+@b<3FC@4&PL|ZDoP1k)1zU1_YF=sXh_E(lM~bf8C542nk2J)kl@;|SyDrh5!vos z&BvRAwYq3%FZV?eu6@kGu0F2LA(I>J#U=-6*iAMzz0C^pzs_W9P36tDW;59)$Jtsk z8clxBp*5M&Hg@tMXN}EYZ3`G#c1dup-<)Z0%7~=?tiyUFE-?J`H{WtP!-{Ie=DD6* FH~>!|h@Jod diff --git a/examples/NpgsqlDapperExample/Models.cs b/examples/NpgsqlDapperExample/Models.cs index 2f20b05f..822af4fc 100644 --- a/examples/NpgsqlDapperExample/Models.cs +++ b/examples/NpgsqlDapperExample/Models.cs @@ -1,6 +1,7 @@ // auto-generated by sqlc - do not edit using NpgsqlTypes; using System; +using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; diff --git a/examples/NpgsqlDapperLegacyExample/Models.cs b/examples/NpgsqlDapperLegacyExample/Models.cs index df908aea..e1176817 100644 --- a/examples/NpgsqlDapperLegacyExample/Models.cs +++ b/examples/NpgsqlDapperLegacyExample/Models.cs @@ -3,6 +3,7 @@ namespace NpgsqlDapperLegacyExampleGen { using NpgsqlTypes; using System; + using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; diff --git a/examples/NpgsqlExample/Models.cs b/examples/NpgsqlExample/Models.cs index 7391c3d4..b6b850b2 100644 --- a/examples/NpgsqlExample/Models.cs +++ b/examples/NpgsqlExample/Models.cs @@ -1,6 +1,7 @@ // auto-generated by sqlc - do not edit using NpgsqlTypes; using System; +using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; diff --git a/examples/NpgsqlLegacyExample/Models.cs b/examples/NpgsqlLegacyExample/Models.cs index 3d9f5cbc..d421c425 100644 --- a/examples/NpgsqlLegacyExample/Models.cs +++ b/examples/NpgsqlLegacyExample/Models.cs @@ -3,6 +3,7 @@ namespace NpgsqlLegacyExampleGen { using NpgsqlTypes; using System; + using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; diff --git a/examples/SqliteDapperExample/Models.cs b/examples/SqliteDapperExample/Models.cs index 16cd98fa..8518a279 100644 --- a/examples/SqliteDapperExample/Models.cs +++ b/examples/SqliteDapperExample/Models.cs @@ -1,4 +1,6 @@ // auto-generated by sqlc - do not edit +using System.Linq; + namespace SqliteDapperExampleGen; public class Author { diff --git a/examples/SqliteDapperLegacyExample/Models.cs b/examples/SqliteDapperLegacyExample/Models.cs index e45fabdc..ae820a09 100644 --- a/examples/SqliteDapperLegacyExample/Models.cs +++ b/examples/SqliteDapperLegacyExample/Models.cs @@ -1,6 +1,8 @@ // auto-generated by sqlc - do not edit namespace SqliteDapperLegacyExampleGen { + using System.Linq; + public class Author { public int Id { get; set; } diff --git a/examples/SqliteExample/Models.cs b/examples/SqliteExample/Models.cs index 1947bb76..e266ada0 100644 --- a/examples/SqliteExample/Models.cs +++ b/examples/SqliteExample/Models.cs @@ -1,4 +1,6 @@ // auto-generated by sqlc - do not edit +using System.Linq; + namespace SqliteExampleGen; public readonly record struct Author(int Id, string Name, string? Bio); public readonly record struct Book(int Id, string Name, int AuthorId, string? Description); diff --git a/examples/SqliteLegacyExample/Models.cs b/examples/SqliteLegacyExample/Models.cs index 0a3112f3..b27dbdf1 100644 --- a/examples/SqliteLegacyExample/Models.cs +++ b/examples/SqliteLegacyExample/Models.cs @@ -1,6 +1,8 @@ // auto-generated by sqlc - do not edit namespace SqliteLegacyExampleGen { + using System.Linq; + public class Author { public int Id { get; set; } diff --git a/examples/config/mysql/query.sql b/examples/config/mysql/query.sql index 33ad29d4..df7002e7 100644 --- a/examples/config/mysql/query.sql +++ b/examples/config/mysql/query.sql @@ -60,19 +60,19 @@ WHERE books.name = ?; INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, - c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, - c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) -VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); -- name: InsertMysqlTypesBatch :copyfrom INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, - c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, - c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) -VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); -- name: GetMysqlTypes :one SELECT * FROM mysql_types LIMIT 1; @@ -81,13 +81,13 @@ SELECT * FROM mysql_types LIMIT 1; SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, - c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, - c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1; diff --git a/examples/config/mysql/schema.sql b/examples/config/mysql/schema.sql index cfcd816b..9651053c 100644 --- a/examples/config/mysql/schema.sql +++ b/examples/config/mysql/schema.sql @@ -42,18 +42,21 @@ CREATE TABLE mysql_types ( c_timestamp TIMESTAMP, /* String data types */ - c_char CHAR, - c_nchar NCHAR, - c_national_char NATIONAL CHAR, - c_varchar VARCHAR(100), - c_tinytext TINYTEXT, - c_mediumtext MEDIUMTEXT, - c_text TEXT, - c_longtext LONGTEXT, - c_enum ENUM ('small', 'medium', 'big'), + c_char CHAR, + c_nchar NCHAR, + c_national_char NATIONAL CHAR, + c_varchar VARCHAR(100), + c_tinytext TINYTEXT, + c_mediumtext MEDIUMTEXT, + c_text TEXT, + c_longtext LONGTEXT, c_json JSON, - c_json_string_override JSON, - + c_json_string_override JSON, + + /* Pre-defined types */ + c_enum ENUM ('small', 'medium', 'big'), + c_set SET ('tea', 'coffee', 'milk'), + /* Binary data types */ c_bit BIT(8), c_binary BINARY(3), From ef4cafbc6efa1a594a10d68e528200eacd246ece Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sat, 9 Aug 2025 12:03:00 +0200 Subject: [PATCH 2/9] feat: support set data type in mysql batch insert --- CodegenTests/CodegenUtilsTests.cs | 3 - Drivers/DbDriver.cs | 20 +-- Drivers/MySqlConnectorDriver.cs | 132 ++++++++++++------ Drivers/Variable.cs | 1 + docs/05_MySql.md | 2 +- .../EndToEndScaffold/Templates/MySqlTests.cs | 26 +++- .../MySqlConnectorDapperTester.generated.cs | 21 ++- .../MySqlConnectorTester.generated.cs | 21 ++- .../MySqlConnectorDapperTester.generated.cs | 21 ++- .../MySqlConnectorTester.generated.cs | 21 ++- .../MySqlConnectorDapperExample/QuerySql.cs | 3 +- examples/MySqlConnectorDapperExample/Utils.cs | 18 ++- .../QuerySql.cs | 2 +- .../Utils.cs | 18 ++- examples/MySqlConnectorExample/QuerySql.cs | 3 +- examples/MySqlConnectorExample/Utils.cs | 12 ++ .../MySqlConnectorLegacyExample/QuerySql.cs | 2 +- examples/MySqlConnectorLegacyExample/Utils.cs | 12 ++ examples/NpgsqlDapperExample/Utils.cs | 4 +- examples/NpgsqlDapperLegacyExample/Utils.cs | 4 +- 20 files changed, 242 insertions(+), 104 deletions(-) diff --git a/CodegenTests/CodegenUtilsTests.cs b/CodegenTests/CodegenUtilsTests.cs index 377f67bd..3890e9e4 100644 --- a/CodegenTests/CodegenUtilsTests.cs +++ b/CodegenTests/CodegenUtilsTests.cs @@ -145,9 +145,6 @@ public void TestMysqlCopyFromGenerateUtilsMembers() var expected = new HashSet { MySqlConnectorDriver.NullToStringCsvConverter, - MySqlConnectorDriver.BoolToBitCsvConverter, - MySqlConnectorDriver.ByteCsvConverter, - MySqlConnectorDriver.ByteArrayCsvConverter }; var actual = members .FindAll(m => m is ClassDeclarationSyntax) diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index e0e68d4c..1225266d 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -59,15 +59,13 @@ public abstract class DbDriver public abstract Dictionary ColumnMappings { get; } protected const string JsonElementTypeHandler = - """ - public class JsonElementTypeHandler : SqlMapper.TypeHandler + """ + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -76,7 +74,7 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) parameter.Value = value.GetRawText(); } } - """; + """; protected const string TransformQueryForSliceArgsImpl = """ public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -204,9 +202,15 @@ public static void ConfigureSqlMapper() protected bool TypeExistsInQueries(string csharpType) { - return Queries - .SelectMany(query => query.Columns) - .Any(column => csharpType == GetCsharpTypeWithoutNullableSuffix(column, null)); + return Queries.Any(q => TypeExistsInQuery(csharpType, q)); + } + + protected bool TypeExistsInQuery(string csharpType, Query query) + { + return query.Columns + .Any(column => csharpType == GetCsharpTypeWithoutNullableSuffix(column, query)) || + query.Params + .Any(p => csharpType == GetCsharpTypeWithoutNullableSuffix(p.Column, query)); } public string AddNullableSuffixIfNeeded(string csharpType, bool notNull) diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index 65948fa9..da4f25ce 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -146,22 +146,22 @@ public partial class MySqlConnectorDriver( public override string TransactionClassName => "MySqlTransaction"; private readonly Func _setTypeHandlerFunc = x => - $$""" - public class {{x}}TypeHandler : SqlMapper.TypeHandler<{{x}}[]> - { - public override {{x}}[] Parse(object value) - { - if (value is string s) - return s.To{{x}}Arr(); - throw new DataException($"Cannot convert {value?.GetType()} to {{x}}[]"); - } - - public override void SetValue(IDbDataParameter parameter, {{x}}[] value) - { - parameter.Value = string.Join(",", value); - } - } - """; + $$""" + private class {{x}}TypeHandler : SqlMapper.TypeHandler<{{x}}[]> + { + public override {{x}}[] Parse(object value) + { + if (value is string s) + return s.To{{x}}Arr(); + throw new DataException($"Cannot convert {value?.GetType()} to {{x}}[]"); + } + + public override void SetValue(IDbDataParameter parameter, {{x}}[] value) + { + parameter.Value = string.Join(",", value); + } + } + """; public override ISet GetUsingDirectivesForQueries() { @@ -211,15 +211,17 @@ public override ISet GetUsingDirectivesForUtils() ); } + private bool IsSetType(Column column) + { + var enumType = GetEnumType(column); + return enumType is not null && IsEnumOfTypeSet(column, enumType); + } + protected override ISet GetConfigureSqlMappings() { var setSqlMappings = Queries .SelectMany(q => q.Columns) - .Where(c => - { - var enumType = GetEnumType(c); - return enumType is not null && IsEnumOfTypeSet(c, enumType); - }) + .Where(IsSetType) .Select(c => { var enumName = c.Type.Name.ToModelName(GetColumnSchema(c), DefaultSchema); @@ -255,11 +257,24 @@ public override MemberDeclarationSyntax[] GetMemberDeclarationsForUtils() .AddRangeIf(GetSetTypeHandlers(), Options.UseDapper); if (!CopyFromQueryExists()) - return [.. memberDeclarations]; + return memberDeclarations.ToArray(); - var csvConverters = new List + foreach (var query in Queries) { - ParseMemberDeclaration($$""" + if (query.Cmd != ":copyfrom") + continue; + foreach (var p in query.Params) + { + if (!IsSetType(p.Column)) + continue; + var enumName = p.Column.Type.Name.ToModelName(GetColumnSchema(p.Column), DefaultSchema); + memberDeclarations = memberDeclarations.AddRangeExcludeNulls([ParseMemberDeclaration(SetCsvConverterFunc(enumName))!]); + } + } + + return memberDeclarations + .AddRangeIf([ + ParseMemberDeclaration($$""" public class {{NullToStringCsvConverter}} : DefaultTypeConverter { public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( @@ -269,6 +284,8 @@ public class {{NullToStringCsvConverter}} : DefaultTypeConverter } } """)!, + ], CopyFromQueryExists()) + .AddRangeIf([ ParseMemberDeclaration($$""" public class BoolToBitCsvConverter : DefaultTypeConverter { @@ -287,7 +304,9 @@ public class BoolToBitCsvConverter : DefaultTypeConverter } } """)!, - ParseMemberDeclaration($$""" + ], CopyFromQueryExists() && TypeExistsInQueries("bool")) + .AddRangeIf([ + ParseMemberDeclaration($$""" public class ByteCsvConverter : DefaultTypeConverter { public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( @@ -301,7 +320,9 @@ public class ByteCsvConverter : DefaultTypeConverter } } """)!, - ParseMemberDeclaration($$""" + ], CopyFromQueryExists() && TypeExistsInQueries("byte")) + .AddRangeIf([ + ParseMemberDeclaration($$""" public class ByteArrayCsvConverter : DefaultTypeConverter { public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( @@ -314,10 +335,25 @@ public class ByteArrayCsvConverter : DefaultTypeConverter return base.ConvertToString(value, row, memberMapData); } } - """)! - }; + """)!, + ], CopyFromQueryExists() && TypeExistsInQueries("byte[]")) + .ToArray(); - return [.. memberDeclarations, .. csvConverters]; + string SetCsvConverterFunc(string x) => + $$""" + public class {{x}}CsvConverter : DefaultTypeConverter + { + public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( + {{AddNullableSuffixIfNeeded("object", false)}} value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is {{x}}[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + """; } public override ConnectionGenCommands EstablishConnection(Query query) @@ -419,7 +455,7 @@ public string GetCopyFromImpl(Query query, string queryTextConstant) var {{optionsVar}} = new TypeConverterOptions { Formats = new[] { supportedDateTimeFormat } }; {{csvWriterVar}}.Context.TypeConverterOptionsCache.AddOptions({{optionsVar}}); {{csvWriterVar}}.Context.TypeConverterOptionsCache.AddOptions({{optionsVar}}); - {{GetBoolAndByteConverters().JoinByNewLine()}} + {{GetBoolAndByteConverters(query).JoinByNewLine()}} {{GetCsvNullConverters(query).JoinByNewLine()}} await {{csvWriterVar}}.WriteRecordsAsync({{Variable.Args.AsVarName()}}); } @@ -459,7 +495,10 @@ private ISet GetCsvNullConverters(Query query) foreach (var p in query.Params) { var csharpType = GetCsharpTypeWithoutNullableSuffix(p.Column, query); - if (!BoolAndByteTypes.Contains(csharpType) && TypeExistsInQueries(csharpType)) + if ( + !BoolAndByteTypes.Contains(csharpType) && + !IsSetType(p.Column) && + TypeExistsInQuery(csharpType, query)) { var nullableCsharpType = AddNullableSuffixIfNeeded(csharpType, false); converters.Add($"{Variable.CsvWriter.AsVarName()}.Context.TypeConverterCache.AddConverter<{nullableCsharpType}>({nullConverterFn});"); @@ -468,7 +507,7 @@ private ISet GetCsvNullConverters(Query query) return converters; } - private ISet GetBoolAndByteConverters() + private ISet GetBoolAndByteConverters(Query query) { var csvWriterVar = Variable.CsvWriter.AsVarName(); return new HashSet() @@ -477,25 +516,42 @@ private ISet GetBoolAndByteConverters() $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("bool", true)}>(new Utils.{BoolToBitCsvConverter}());", $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("bool", false)}>(new Utils.{BoolToBitCsvConverter}());" ], - TypeExistsInQueries("bool") + TypeExistsInQuery("bool", query) ) .AddRangeIf( [ $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte", true)}>(new Utils.{ByteCsvConverter}());", $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte", false)}>(new Utils.{ByteCsvConverter}());", ], - TypeExistsInQueries("byte") + TypeExistsInQuery("byte", query) ) .AddRangeIf( [ $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte[]", true)}>(new Utils.{ByteArrayCsvConverter}());", $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte[]", false)}>(new Utils.{ByteArrayCsvConverter}());", ], - TypeExistsInQueries("byte[]") - ); + TypeExistsInQuery("byte[]", query) + ) + .AddRangeExcludeNulls(GetSetConverters(query)); + } + + private ISet GetSetConverters(Query query) + { + var converters = new HashSet(); + foreach (var p in query.Params) + { + if (!IsSetType(p.Column)) + continue; + + var enumName = p.Column.Type.Name.ToModelName(GetColumnSchema(p.Column), DefaultSchema); + var csvWriterVar = Variable.CsvWriter.AsVarName(); + converters.Add($"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded($"{enumName}[]", true)}>(new Utils.{enumName}CsvConverter());"); + converters.Add($"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded($"{enumName}[]", false)}>(new Utils.{enumName}CsvConverter());"); + } + return converters; } - private bool IsEnumOfTypeSet(Column column, Plugin.Enum enumType) + private static bool IsEnumOfTypeSet(Column column, Plugin.Enum enumType) { return column.Length > enumType.Vals.Select(v => v.Length).Sum(); } @@ -503,8 +559,6 @@ private bool IsEnumOfTypeSet(Column column, Plugin.Enum enumType) public override string GetEnumTypeAsCsharpType(Column column, Plugin.Enum enumType) { var enumName = column.Type.Name.ToModelName(GetColumnSchema(column), DefaultSchema); - if (this is not MySqlConnectorDriver) - return enumName; return IsEnumOfTypeSet(column, enumType) ? $"{enumName}[]" : enumName; } } \ No newline at end of file diff --git a/Drivers/Variable.cs b/Drivers/Variable.cs index 1fbcc8ab..b6fd98d6 100644 --- a/Drivers/Variable.cs +++ b/Drivers/Variable.cs @@ -14,6 +14,7 @@ public enum Variable Loader, CsvWriter, NullConverterFn, + SetConverterFn, Args, QueryParams, diff --git a/docs/05_MySql.md b/docs/05_MySql.md index 7d6c92f1..9284b56b 100644 --- a/docs/05_MySql.md +++ b/docs/05_MySql.md @@ -70,7 +70,7 @@ we consider support for the different data types separately for batch inserts an | mediumblob | ✅ | ✅ | | longblob | ✅ | ✅ | | enum | ✅ | ✅ | -| set | ✅ | ❌ | +| set | ✅ | ✅ | | json | ✅ | ✅ | | geometry | ❌ | ❌ | | point | ❌ | ❌ | diff --git a/end2end/EndToEndScaffold/Templates/MySqlTests.cs b/end2end/EndToEndScaffold/Templates/MySqlTests.cs index 34606f19..4a73ed1b 100644 --- a/end2end/EndToEndScaffold/Templates/MySqlTests.cs +++ b/end2end/EndToEndScaffold/Templates/MySqlTests.cs @@ -602,25 +602,37 @@ public async Task TestMySqlTransactionRollback() { Impl = $$""" [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom( + int batchSize, + MysqlTypesCEnum? cEnum, + MysqlTypesCSet[] cSet) { var batchArgs = Enumerable.Range(0, batchSize) .Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }) .ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } """ }, diff --git a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs index 4e36b2e9..736682df 100644 --- a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs @@ -744,20 +744,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs index b8228eca..81d5858c 100644 --- a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs @@ -744,20 +744,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.Value.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs index d3057b2c..531d776c 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs @@ -744,20 +744,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs index e333fea4..3aab8f05 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs @@ -744,20 +744,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/examples/MySqlConnectorDapperExample/QuerySql.cs b/examples/MySqlConnectorDapperExample/QuerySql.cs index e4c9ef05..bbb1372a 100644 --- a/examples/MySqlConnectorDapperExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperExample/QuerySql.cs @@ -697,6 +697,8 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); @@ -705,7 +707,6 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } diff --git a/examples/MySqlConnectorDapperExample/Utils.cs b/examples/MySqlConnectorDapperExample/Utils.cs index 5d4cdb4d..7286b29a 100644 --- a/examples/MySqlConnectorDapperExample/Utils.cs +++ b/examples/MySqlConnectorDapperExample/Utils.cs @@ -10,14 +10,12 @@ namespace MySqlConnectorDapperExampleGen; public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -39,7 +37,7 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } - public class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler + private class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler { public override MysqlTypesCSet[] Parse(object value) { @@ -54,6 +52,18 @@ public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value } } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs index 54c559b2..c8d67697 100644 --- a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs @@ -697,6 +697,7 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); @@ -705,7 +706,6 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } diff --git a/examples/MySqlConnectorDapperLegacyExample/Utils.cs b/examples/MySqlConnectorDapperLegacyExample/Utils.cs index 472ea6e4..2a099303 100644 --- a/examples/MySqlConnectorDapperLegacyExample/Utils.cs +++ b/examples/MySqlConnectorDapperLegacyExample/Utils.cs @@ -11,14 +11,12 @@ namespace MySqlConnectorDapperLegacyExampleGen public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -40,7 +38,7 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } - public class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler + private class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler { public override MysqlTypesCSet[] Parse(object value) { @@ -55,6 +53,18 @@ public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value } } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorExample/QuerySql.cs b/examples/MySqlConnectorExample/QuerySql.cs index b9c36f55..8c465c7a 100644 --- a/examples/MySqlConnectorExample/QuerySql.cs +++ b/examples/MySqlConnectorExample/QuerySql.cs @@ -789,6 +789,8 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); @@ -797,7 +799,6 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } diff --git a/examples/MySqlConnectorExample/Utils.cs b/examples/MySqlConnectorExample/Utils.cs index add93409..741d29f7 100644 --- a/examples/MySqlConnectorExample/Utils.cs +++ b/examples/MySqlConnectorExample/Utils.cs @@ -13,6 +13,18 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorLegacyExample/QuerySql.cs b/examples/MySqlConnectorLegacyExample/QuerySql.cs index 07c3ea99..bdce0262 100644 --- a/examples/MySqlConnectorLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorLegacyExample/QuerySql.cs @@ -955,6 +955,7 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); @@ -963,7 +964,6 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } diff --git a/examples/MySqlConnectorLegacyExample/Utils.cs b/examples/MySqlConnectorLegacyExample/Utils.cs index 351b629b..2912c7ea 100644 --- a/examples/MySqlConnectorLegacyExample/Utils.cs +++ b/examples/MySqlConnectorLegacyExample/Utils.cs @@ -14,6 +14,18 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/NpgsqlDapperExample/Utils.cs b/examples/NpgsqlDapperExample/Utils.cs index 625c2e08..f0dd0dff 100644 --- a/examples/NpgsqlDapperExample/Utils.cs +++ b/examples/NpgsqlDapperExample/Utils.cs @@ -10,14 +10,12 @@ namespace NpgsqlDapperExampleGen; public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } diff --git a/examples/NpgsqlDapperLegacyExample/Utils.cs b/examples/NpgsqlDapperLegacyExample/Utils.cs index 8d3d27be..46c4093c 100644 --- a/examples/NpgsqlDapperLegacyExample/Utils.cs +++ b/examples/NpgsqlDapperLegacyExample/Utils.cs @@ -11,14 +11,12 @@ namespace NpgsqlDapperLegacyExampleGen public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } From cc9babecfa60978d736e3c9de0037fb57c061392 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sat, 9 Aug 2025 12:06:26 +0200 Subject: [PATCH 3/9] fix: update mysql doc to reflect the missing SQLC support for mysql geometries --- docs/03_Usage.md | 1 + docs/05_MySql.md | 78 ++++++++++++++++++++++++------------------------ 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/docs/03_Usage.md b/docs/03_Usage.md index 23df9433..208c31a2 100644 --- a/docs/03_Usage.md +++ b/docs/03_Usage.md @@ -31,6 +31,7 @@ overrides: ## Supported Features - ✅ means the feature is fully supported. +- ⚠️ means SQLC does not yet support this feature, so it cannot be supported by the plugin yet. - 🚫 means the database does not support the feature. - ❌ means the feature is not supported by the plugin (but could be supported by the database). diff --git a/docs/05_MySql.md b/docs/05_MySql.md index 9284b56b..6aef8aaa 100644 --- a/docs/05_MySql.md +++ b/docs/05_MySql.md @@ -41,45 +41,45 @@ Since in batch insert the data is not validated by the SQL itself but written an we consider support for the different data types separately for batch inserts and everything else. | DB Type | Supported? | Supported in Batch? | -|---------------------------|------------|---------------------| -| bool, boolean, tinyint(1) | ✅ | ✅ | -| bit | ✅ | ✅ | -| tinyint | ✅ | ✅ | -| smallint | ✅ | ✅ | -| mediumint | ✅ | ✅ | -| integer, int | ✅ | ✅ | -| bigint | ✅ | ✅ | -| real | ✅ | ✅ | -| numeric | ✅ | ✅ | -| decimal | ✅ | ✅ | -| double precision | ✅ | ✅ | -| year | ✅ | ✅ | -| date | ✅ | ✅ | -| timestamp | ✅ | ✅ | -| char | ✅ | ✅ | -| nchar, national char | ✅ | ✅ | -| varchar | ✅ | ✅ | -| tinytext | ✅ | ✅ | -| mediumtext | ✅ | ✅ | -| text | ✅ | ✅ | -| longtext | ✅ | ✅ | -| binary | ✅ | ✅ | -| varbinary | ✅ | ✅ | -| tinyblob | ✅ | ✅ | -| blob | ✅ | ✅ | -| mediumblob | ✅ | ✅ | -| longblob | ✅ | ✅ | -| enum | ✅ | ✅ | -| set | ✅ | ✅ | -| json | ✅ | ✅ | -| geometry | ❌ | ❌ | -| point | ❌ | ❌ | -| linestring | ❌ | ❌ | -| polygon | ❌ | ❌ | -| multipoint | ❌ | ❌ | -| multilinestring | ❌ | ❌ | -| multipolygon | ❌ | ❌ | -| geometrycollection | ❌ | ❌ | +|---------------------------|----|-------------| +| bool, boolean, tinyint(1) | ✅ | ✅ | +| bit | ✅ | ✅ | +| tinyint | ✅ | ✅ | +| smallint | ✅ | ✅ | +| mediumint | ✅ | ✅ | +| integer, int | ✅ | ✅ | +| bigint | ✅ | ✅ | +| real | ✅ | ✅ | +| numeric | ✅ | ✅ | +| decimal | ✅ | ✅ | +| double precision | ✅ | ✅ | +| year | ✅ | ✅ | +| date | ✅ | ✅ | +| timestamp | ✅ | ✅ | +| char | ✅ | ✅ | +| nchar, national char | ✅ | ✅ | +| varchar | ✅ | ✅ | +| tinytext | ✅ | ✅ | +| mediumtext | ✅ | ✅ | +| text | ✅ | ✅ | +| longtext | ✅ | ✅ | +| binary | ✅ | ✅ | +| varbinary | ✅ | ✅ | +| tinyblob | ✅ | ✅ | +| blob | ✅ | ✅ | +| mediumblob | ✅ | ✅ | +| longblob | ✅ | ✅ | +| enum | ✅ | ✅ | +| set | ✅ | ✅ | +| json | ✅ | ✅ | +| geometry | ⚠️ | ⚠️ | +| point | ⚠️ | ⚠️ | +| linestring | ⚠️ | ⚠️ | +| polygon | ⚠️ | ⚠️ | +| multipoint | ⚠️ | ⚠️ | +| multilinestring | ⚠️ | ⚠️ | +| multipolygon | ⚠️ | ⚠️ | +| geometrycollection | ⚠️ | ⚠️ | From 0295c5bb13695ffa6e1ba31a6581a3642a951b0d Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sat, 9 Aug 2025 17:47:58 +0200 Subject: [PATCH 4/9] fix: add test for scoped schema set --- .../EndToEndScaffold/Templates/MySqlTests.cs | 15 ++++-- .../MySqlConnectorDapperTester.generated.cs | 18 +++++-- .../MySqlConnectorTester.generated.cs | 18 +++++-- .../MySqlConnectorDapperTester.generated.cs | 18 +++++-- .../MySqlConnectorTester.generated.cs | 18 +++++-- .../MySqlConnectorDapperExample/Models.cs | 29 ++++++++++ .../MySqlConnectorDapperExample/QuerySql.cs | 7 ++- examples/MySqlConnectorDapperExample/Utils.cs | 16 ++++++ .../MySqlConnectorDapperExample/request.json | 50 +++++++++++++++++- .../request.message | Bin 21055 -> 21327 bytes .../Models.cs | 29 ++++++++++ .../QuerySql.cs | 7 ++- .../Utils.cs | 16 ++++++ .../request.json | 50 +++++++++++++++++- .../request.message | Bin 21089 -> 21361 bytes examples/MySqlConnectorExample/Models.cs | 30 ++++++++++- examples/MySqlConnectorExample/QuerySql.cs | 16 +++--- examples/MySqlConnectorExample/request.json | 50 +++++++++++++++++- .../MySqlConnectorExample/request.message | Bin 21039 -> 21311 bytes .../MySqlConnectorLegacyExample/Models.cs | 29 ++++++++++ .../MySqlConnectorLegacyExample/QuerySql.cs | 14 +++-- .../MySqlConnectorLegacyExample/request.json | 50 +++++++++++++++++- .../request.message | Bin 21073 -> 21345 bytes examples/config/mysql/query.sql | 2 +- examples/config/mysql/schema.sql | 1 + 25 files changed, 434 insertions(+), 49 deletions(-) diff --git a/end2end/EndToEndScaffold/Templates/MySqlTests.cs b/end2end/EndToEndScaffold/Templates/MySqlTests.cs index 4a73ed1b..76dbcf15 100644 --- a/end2end/EndToEndScaffold/Templates/MySqlTests.cs +++ b/end2end/EndToEndScaffold/Templates/MySqlTests.cs @@ -646,25 +646,30 @@ await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = {{Consts.BojackAuthor}}, Name = {{Consts.BojackBookTitle}}, - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = {{Consts.BojackAuthor}}, Name = {{Consts.BojackBookTitle}}, - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}})); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } """ }, diff --git a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs index 736682df..bbd69996 100644 --- a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs @@ -519,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual)); + AssertSingularEquals(expected, actual); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] diff --git a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs index 81d5858c..97605d41 100644 --- a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs @@ -519,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual.Value)); + AssertSingularEquals(expected, actual.Value); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs index 531d776c..02515ada 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs @@ -519,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual)); + AssertSingularEquals(expected, actual); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs index 3aab8f05..b47d9870 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs @@ -519,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual)); + AssertSingularEquals(expected, actual); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] diff --git a/examples/MySqlConnectorDapperExample/Models.cs b/examples/MySqlConnectorDapperExample/Models.cs index 55296158..299063de 100644 --- a/examples/MySqlConnectorDapperExample/Models.cs +++ b/examples/MySqlConnectorDapperExample/Models.cs @@ -65,6 +65,7 @@ public class ExtendedBio public string? AuthorName { get; init; } public string? Name { get; init; } public ExtendedBiosBioType? BioType { get; init; } + public ExtendedBiosAuthorType[]? AuthorType { get; init; } }; public enum MysqlTypesCEnum { @@ -148,4 +149,32 @@ public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) { return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); } +} + +public enum ExtendedBiosAuthorType +{ + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 +} + +public static class ExtendedBiosAuthorTypeExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } \ No newline at end of file diff --git a/examples/MySqlConnectorDapperExample/QuerySql.cs b/examples/MySqlConnectorDapperExample/QuerySql.cs index bbb1372a..bbf56feb 100644 --- a/examples/MySqlConnectorDapperExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperExample/QuerySql.cs @@ -902,12 +902,13 @@ public async Task TruncateMysqlTypes() await this.Transaction.Connection.ExecuteAsync(TruncateMysqlTypesSql, transaction: this.Transaction); } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; public class CreateExtendedBioArgs { public string? AuthorName { get; init; } public string? Name { get; init; } public ExtendedBiosBioType? BioType { get; init; } + public ExtendedBiosAuthorType[]? AuthorType { get; init; } }; public async Task CreateExtendedBio(CreateExtendedBioArgs args) { @@ -915,6 +916,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) queryParams.Add("author_name", args.AuthorName); queryParams.Add("name", args.Name); queryParams.Add("bio_type", args.BioType); + queryParams.Add("author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : null); if (this.Transaction == null) { using (var connection = new MySqlConnection(ConnectionString)) @@ -933,12 +935,13 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) await this.Transaction.Connection.ExecuteAsync(CreateExtendedBioSql, queryParams, transaction: this.Transaction); } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; public class GetFirstExtendedBioByTypeRow { public string? AuthorName { get; init; } public string? Name { get; init; } public ExtendedBiosBioType? BioType { get; init; } + public ExtendedBiosAuthorType[]? AuthorType { get; init; } }; public class GetFirstExtendedBioByTypeArgs { diff --git a/examples/MySqlConnectorDapperExample/Utils.cs b/examples/MySqlConnectorDapperExample/Utils.cs index 7286b29a..b2b76e0f 100644 --- a/examples/MySqlConnectorDapperExample/Utils.cs +++ b/examples/MySqlConnectorDapperExample/Utils.cs @@ -29,6 +29,7 @@ public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); SqlMapper.AddTypeHandler(typeof(MysqlTypesCSet[]), new MysqlTypesCSetTypeHandler()); + SqlMapper.AddTypeHandler(typeof(ExtendedBiosAuthorType[]), new ExtendedBiosAuthorTypeTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -52,6 +53,21 @@ public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value } } + private class ExtendedBiosAuthorTypeTypeHandler : SqlMapper.TypeHandler + { + public override ExtendedBiosAuthorType[] Parse(object value) + { + if (value is string s) + return s.ToExtendedBiosAuthorTypeArr(); + throw new DataException($"Cannot convert {value?.GetType()} to ExtendedBiosAuthorType[]"); + } + + public override void SetValue(IDbDataParameter parameter, ExtendedBiosAuthorType[] value) + { + parameter.Value = string.Join(",", value); + } + } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter { public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorDapperExample/request.json b/examples/MySqlConnectorDapperExample/request.json index c812158e..c9ba1e68 100644 --- a/examples/MySqlConnectorDapperExample/request.json +++ b/examples/MySqlConnectorDapperExample/request.json @@ -534,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -578,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -3362,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3410,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3419,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3458,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorDapperExample/request.message b/examples/MySqlConnectorDapperExample/request.message index d85ceefd4ce8a07818ac080b9b7be64a196ed4f7..124f5e87f46195b43bba573dac76c6347d9f8f52 100644 GIT binary patch delta 312 zcmdnLgz@|`#tl=LcwY+(u@#gijNS&YD$URd~$drp4NxOl> z$!31aEE}1*VkgJ?DRIDTm|W%eT~LWsvo`1WUuFUTd3$Nz delta 95 zcmV-l0HFWRrUAdC0kD(;4TKXC25@y^Y-wX6(Gjzu0@4T$r2!HMWq5RDZe(R-8km!@ z3z@Tl3=Ba8umTE5laWm}lhjQSlju##lfY05lLb!`1mFS+P?H=_B9lu`^0R?Z&H{@u BBUb StringToEnum[v]).ToArray(); } } + + public enum ExtendedBiosAuthorType + { + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 + } + + public static class ExtendedBiosAuthorTypeExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } } \ No newline at end of file diff --git a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs index c8d67697..80f6df60 100644 --- a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs @@ -901,12 +901,13 @@ public async Task TruncateMysqlTypes() await this.Transaction.Connection.ExecuteAsync(TruncateMysqlTypesSql, transaction: this.Transaction); } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; public class CreateExtendedBioArgs { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public async Task CreateExtendedBio(CreateExtendedBioArgs args) { @@ -914,6 +915,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) queryParams.Add("author_name", args.AuthorName); queryParams.Add("name", args.Name); queryParams.Add("bio_type", args.BioType); + queryParams.Add("author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : null); if (this.Transaction == null) { using (var connection = new MySqlConnection(ConnectionString)) @@ -932,12 +934,13 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) await this.Transaction.Connection.ExecuteAsync(CreateExtendedBioSql, queryParams, transaction: this.Transaction); } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; public class GetFirstExtendedBioByTypeRow { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public class GetFirstExtendedBioByTypeArgs { diff --git a/examples/MySqlConnectorDapperLegacyExample/Utils.cs b/examples/MySqlConnectorDapperLegacyExample/Utils.cs index 2a099303..0bc1ed4a 100644 --- a/examples/MySqlConnectorDapperLegacyExample/Utils.cs +++ b/examples/MySqlConnectorDapperLegacyExample/Utils.cs @@ -30,6 +30,7 @@ public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); SqlMapper.AddTypeHandler(typeof(MysqlTypesCSet[]), new MysqlTypesCSetTypeHandler()); + SqlMapper.AddTypeHandler(typeof(ExtendedBiosAuthorType[]), new ExtendedBiosAuthorTypeTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -53,6 +54,21 @@ public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value } } + private class ExtendedBiosAuthorTypeTypeHandler : SqlMapper.TypeHandler + { + public override ExtendedBiosAuthorType[] Parse(object value) + { + if (value is string s) + return s.ToExtendedBiosAuthorTypeArr(); + throw new DataException($"Cannot convert {value?.GetType()} to ExtendedBiosAuthorType[]"); + } + + public override void SetValue(IDbDataParameter parameter, ExtendedBiosAuthorType[] value) + { + parameter.Value = string.Join(",", value); + } + } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorDapperLegacyExample/request.json b/examples/MySqlConnectorDapperLegacyExample/request.json index 2a6ffc20..3e1218db 100644 --- a/examples/MySqlConnectorDapperLegacyExample/request.json +++ b/examples/MySqlConnectorDapperLegacyExample/request.json @@ -534,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -578,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -3362,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3410,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3419,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3458,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorDapperLegacyExample/request.message b/examples/MySqlConnectorDapperLegacyExample/request.message index 73aadd7d0d2d6d9bf0288f5aa1abe2ad9ab5f76f..2ab67f13acd7fd315999caa5e38a62dc539ec4fd 100644 GIT binary patch delta 340 zcmaF3gz@7t#tkc&cwY+(u@#gijNS&WNm3yXFQLfFvf_uXEJGLttq_&;O<0F-`osQ>@~ delta 98 zcmV-o0G StringToEnum[v]).ToArray(); } +} + +public enum ExtendedBiosAuthorType +{ + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 +} + +public static class ExtendedBiosAuthorTypeExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } \ No newline at end of file diff --git a/examples/MySqlConnectorExample/QuerySql.cs b/examples/MySqlConnectorExample/QuerySql.cs index 8c465c7a..378f5ff2 100644 --- a/examples/MySqlConnectorExample/QuerySql.cs +++ b/examples/MySqlConnectorExample/QuerySql.cs @@ -1162,8 +1162,8 @@ public async Task TruncateMysqlTypes() } } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; - public readonly record struct CreateExtendedBioArgs(string? AuthorName, string? Name, ExtendedBiosBioType? BioType); + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; + public readonly record struct CreateExtendedBioArgs(string? AuthorName, string? Name, ExtendedBiosBioType? BioType, ExtendedBiosAuthorType[]? AuthorType); public async Task CreateExtendedBio(CreateExtendedBioArgs args) { if (this.Transaction == null) @@ -1176,6 +1176,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -1195,12 +1196,13 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; - public readonly record struct GetFirstExtendedBioByTypeRow(string? AuthorName, string? Name, ExtendedBiosBioType? BioType); + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + public readonly record struct GetFirstExtendedBioByTypeRow(string? AuthorName, string? Name, ExtendedBiosBioType? BioType, ExtendedBiosAuthorType[]? AuthorType); public readonly record struct GetFirstExtendedBioByTypeArgs(ExtendedBiosBioType? BioType); public async Task GetFirstExtendedBioByType(GetFirstExtendedBioByTypeArgs args) { @@ -1220,7 +1222,8 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } @@ -1248,7 +1251,8 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } diff --git a/examples/MySqlConnectorExample/request.json b/examples/MySqlConnectorExample/request.json index a3b7fb5d..8097883f 100644 --- a/examples/MySqlConnectorExample/request.json +++ b/examples/MySqlConnectorExample/request.json @@ -534,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -578,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -3362,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3410,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3419,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3458,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorExample/request.message b/examples/MySqlConnectorExample/request.message index cbc83b712bc52c406fe43ee8ca6d836055a8472c..603ba7f50bcdbf4450a1490b418a7e87413be251 100644 GIT binary patch delta 305 zcmZ3#gmM2e#tofJysw3Y*a}LMax#;Z8ih7bW4gp)r^h9bl$l=~pIBOwkzW*FQdy8H z#O4U*2(h`QWR~O?32}uKCFT|9Bm&t=cNm2@QY%VQ^HNe%q|Q$+jq}@Pb z@W2s*NKFmpvrmiIN|&{2SBm>l3MHaXe%tf-b72aAvs7IUOg%>g^G q3ToYCZ9ir1jm%uJ!LB~8&LIkut$d{sM(6u|7gQqE$jyoV=a>Ljf@aeI delta 98 zcmV-o0G{0kDYz4TKXC25@y^Y-wX6(Gjzj0@4T$r2!HMWq5RDZe(R-8km!& z3z@Ta3=Ba8umTE5lZH(;3Mn8~K}=OeQy?gl)=klq?@k^B-~tLzlMzoMlR!`MvvyF) E0-=l|y8r+H diff --git a/examples/MySqlConnectorLegacyExample/Models.cs b/examples/MySqlConnectorLegacyExample/Models.cs index e823cafa..83f58691 100644 --- a/examples/MySqlConnectorLegacyExample/Models.cs +++ b/examples/MySqlConnectorLegacyExample/Models.cs @@ -66,6 +66,7 @@ public class ExtendedBio public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public enum MysqlTypesCEnum { @@ -150,4 +151,32 @@ public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); } } + + public enum ExtendedBiosAuthorType + { + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 + } + + public static class ExtendedBiosAuthorTypeExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } } \ No newline at end of file diff --git a/examples/MySqlConnectorLegacyExample/QuerySql.cs b/examples/MySqlConnectorLegacyExample/QuerySql.cs index bdce0262..0357dd17 100644 --- a/examples/MySqlConnectorLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorLegacyExample/QuerySql.cs @@ -1414,12 +1414,13 @@ public async Task TruncateMysqlTypes() } } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; public class CreateExtendedBioArgs { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public async Task CreateExtendedBio(CreateExtendedBioArgs args) { @@ -1433,6 +1434,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -1452,16 +1454,18 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; public class GetFirstExtendedBioByTypeRow { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public class GetFirstExtendedBioByTypeArgs { @@ -1485,7 +1489,8 @@ public async Task GetFirstExtendedBioByType(GetFir { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } @@ -1513,7 +1518,8 @@ public async Task GetFirstExtendedBioByType(GetFir { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } diff --git a/examples/MySqlConnectorLegacyExample/request.json b/examples/MySqlConnectorLegacyExample/request.json index e151f94a..7c97aba4 100644 --- a/examples/MySqlConnectorLegacyExample/request.json +++ b/examples/MySqlConnectorLegacyExample/request.json @@ -534,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -578,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -3362,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3410,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3419,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3458,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorLegacyExample/request.message b/examples/MySqlConnectorLegacyExample/request.message index 2a349a1834b8170e4f95b05c33c11d430a099e8f..1fd01367d7f1472049eae1d9cd8c77dc6732b298 100644 GIT binary patch delta 375 zcmcb(gz@1r#tn0scwY+(u@#gijNS&YD#XZwV$drp4NxOkW zkN}bz7Lf5tLQ=@qY?k8@bY$sZ=8BkX>}w{aqkyDcQz6XJC)71qLBn20VREtWMQ1HH z4i+INQtbeHr3&h>$@YHA+#8v>VuM|MT%AJ{Cj0qHbHJ>f-0b(=Q;9MQz_w}Gaxe-_ NcJQ~_ywiUM69Bd$eV_mU delta 111 zcmV-#0FeLTrUB8U0kE9{4TKXC25@y^Y-wX6(Gjz%0@4T$r2!HMWq5RDZe(R-8km#1 z3z@Tu3=Ba8umTE5lbTI73Mn8~K}=OeQy?gl>P^v;$xsWE4o?#V-~tLzlO<0glT=Ug R1S&lU0h54EJG049m;#{ACY=BP diff --git a/examples/config/mysql/query.sql b/examples/config/mysql/query.sql index df7002e7..570f4a33 100644 --- a/examples/config/mysql/query.sql +++ b/examples/config/mysql/query.sql @@ -99,7 +99,7 @@ FROM mysql_types; TRUNCATE TABLE mysql_types; -- name: CreateExtendedBio :exec -INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?); +INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?); -- name: GetFirstExtendedBioByType :one SELECT * FROM extended.bios WHERE bio_type = ? LIMIT 1; diff --git a/examples/config/mysql/schema.sql b/examples/config/mysql/schema.sql index 9651053c..9094a7d8 100644 --- a/examples/config/mysql/schema.sql +++ b/examples/config/mysql/schema.sql @@ -73,5 +73,6 @@ CREATE TABLE extended.bios ( author_name VARCHAR(100), name VARCHAR(100), bio_type ENUM ('Autobiography', 'Biography', 'Memoir'), + author_type SET ('Author', 'Editor', 'Translator'), PRIMARY KEY (author_name, name) ); From 26e26286c4c07c80421b938d3a2c2a9398cff167 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sun, 10 Aug 2025 11:04:38 +0200 Subject: [PATCH 5/9] feat: add support for postgres XML data type --- Drivers/Generators/CommonGen.cs | 1 + Drivers/NpgsqlDriver.cs | 46 +++++++++++++ docs/04_Postgres.md | 2 +- end2end/EndToEndScaffold/Config.cs | 3 + end2end/EndToEndScaffold/Program.cs | 4 +- .../Templates/PostgresTests.cs | 37 ++++++++++ .../NpgsqlDapperTester.generated.cs | 28 ++++++++ .../EndToEndTests/NpgsqlTester.generated.cs | 28 ++++++++ .../NpgsqlDapperTester.generated.cs | 28 ++++++++ .../NpgsqlTester.generated.cs | 28 ++++++++ examples/NpgsqlDapperExample/Models.cs | 2 + examples/NpgsqlDapperExample/QuerySql.cs | 8 ++- examples/NpgsqlDapperExample/Utils.cs | 22 ++++++ examples/NpgsqlDapperExample/request.json | 55 +++++++++++---- examples/NpgsqlDapperExample/request.message | 60 +++++++++-------- examples/NpgsqlDapperLegacyExample/Models.cs | 2 + .../NpgsqlDapperLegacyExample/QuerySql.cs | 8 ++- examples/NpgsqlDapperLegacyExample/Utils.cs | 22 ++++++ .../NpgsqlDapperLegacyExample/request.json | 55 +++++++++++---- .../NpgsqlDapperLegacyExample/request.message | 60 +++++++++-------- examples/NpgsqlExample/Models.cs | 3 +- examples/NpgsqlExample/QuerySql.cs | 67 ++++++++++++------- examples/NpgsqlExample/request.json | 55 +++++++++++---- examples/NpgsqlExample/request.message | 60 +++++++++-------- examples/NpgsqlLegacyExample/Models.cs | 2 + examples/NpgsqlLegacyExample/QuerySql.cs | 65 +++++++++++------- examples/NpgsqlLegacyExample/request.json | 55 +++++++++++---- examples/NpgsqlLegacyExample/request.message | 60 +++++++++-------- examples/config/postgresql/query.sql | 3 + examples/config/postgresql/schema.sql | 1 + 30 files changed, 657 insertions(+), 213 deletions(-) diff --git a/Drivers/Generators/CommonGen.cs b/Drivers/Generators/CommonGen.cs index 75872894..4a4a8892 100644 --- a/Drivers/Generators/CommonGen.cs +++ b/Drivers/Generators/CommonGen.cs @@ -36,6 +36,7 @@ public static string GetMethodParameterList(string argInterface, IEnumerable diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index cb9837b8..2c60ebe6 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -177,6 +177,30 @@ public NpgsqlDriver( readerFn: ordinal => $"reader.GetBoolean({ordinal})", readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" ), + ["XmlDocument"] = new( + new() + { + { "xml", new(NpgsqlTypeOverride: "NpgsqlDbType.Xml") } + }, + readerFn: ordinal => $$""" + (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))({{Variable.Reader.AsVarName()}}, {{ordinal}}) + """, + writerFn: (el, notNull, isDapper) => + { + if (notNull) + return $"{el}.OuterXml"; + var nullValue = isDapper ? "null" : "(object)DBNull.Value"; + return $"{el} != null ? {el}.OuterXml : {nullValue}"; + }, + usingDirective: "System.Xml", + sqlMapper: "SqlMapper.AddTypeHandler(typeof(XmlDocument), new XmlDocumentTypeHandler());", + sqlMapperImpl: XmlDocumentTypeHandler + ), ["NpgsqlPoint"] = new( new() { @@ -288,6 +312,28 @@ public NpgsqlDriver( public override string TransactionClassName => "NpgsqlTransaction"; + protected const string XmlDocumentTypeHandler = + """ + private class XmlDocumentTypeHandler : SqlMapper.TypeHandler + { + public override XmlDocument Parse(object value) + { + if (value is string s) + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(s); + return xmlDoc; + } + throw new DataException($"Cannot convert {value?.GetType()} to XmlDocument"); + } + + public override void SetValue(IDbDataParameter parameter, XmlDocument value) + { + parameter.Value = value.OuterXml; + } + } + """; + public override ISet GetUsingDirectivesForQueries() { return base.GetUsingDirectivesForQueries().AddRangeExcludeNulls( diff --git a/docs/04_Postgres.md b/docs/04_Postgres.md index 24534496..8ff1cd31 100644 --- a/docs/04_Postgres.md +++ b/docs/04_Postgres.md @@ -65,7 +65,7 @@ we consider support for the different data types separately for batch inserts an | json | ✅ | ❌ | | jsonb | ✅ | ❌ | | jsonpath | ✅ | ❌ | -| xml | ❌ | ❌ | +| xml | ✅ | ❌ | | enum | ❌ | ❌ | *** `time with time zone` is not useful and not recommended to use by Postgres themselves - diff --git a/end2end/EndToEndScaffold/Config.cs b/end2end/EndToEndScaffold/Config.cs index 880bdd8c..c624b156 100644 --- a/end2end/EndToEndScaffold/Config.cs +++ b/end2end/EndToEndScaffold/Config.cs @@ -56,6 +56,7 @@ public enum KnownTestType PostgresNetworkDataTypes, PostgresJsonDataTypes, PostgresInvalidJson, + PostgresXmlDataTypes, ArrayAsParam, MultipleArraysAsParams, @@ -202,6 +203,7 @@ internal static class Config KnownTestType.PostgresJsonDataTypes, KnownTestType.PostgresInvalidJson, KnownTestType.PostgresNetworkDataTypes, + KnownTestType.PostgresXmlDataTypes, KnownTestType.PostgresStringCopyFrom, KnownTestType.PostgresIntegerCopyFrom, @@ -244,6 +246,7 @@ internal static class Config KnownTestType.PostgresJsonDataTypes, KnownTestType.PostgresInvalidJson, KnownTestType.PostgresNetworkDataTypes, + KnownTestType.PostgresXmlDataTypes, KnownTestType.PostgresStringCopyFrom, KnownTestType.PostgresIntegerCopyFrom, diff --git a/end2end/EndToEndScaffold/Program.cs b/end2end/EndToEndScaffold/Program.cs index 469ffab3..1e3c3d1a 100644 --- a/end2end/EndToEndScaffold/Program.cs +++ b/end2end/EndToEndScaffold/Program.cs @@ -42,8 +42,9 @@ private static string GetFileContents(string testClassName, bool isLegacyDotnet) var optionalUsingPostgresTypes = config.TestNamespace.Contains("Npgsql") ? "using NpgsqlTypes;" : string.Empty; var optionalUsingSystemNet = config.TestNamespace.Contains("Npgsql") ? "using System.Net;" : string.Empty; var optionalUsingSystemNetNetworkInformation = config.TestNamespace.Contains("Npgsql") ? "using System.Net.NetworkInformation;" : string.Empty; - var namespaceToTest = isLegacyDotnet ? config.LegacyTestNamespace : config.TestNamespace; var optionalUsingSystemTextJson = config.TestNamespace.Contains("MySqlConnector") || config.TestNamespace.Contains("Npgsql") ? "using System.Text.Json;" : string.Empty; + var optionalUsingSystemXml = config.TestNamespace.Contains("Npgsql") ? "using System.Xml;" : string.Empty; + var namespaceToTest = isLegacyDotnet ? config.LegacyTestNamespace : config.TestNamespace; return ParseCompilationUnit( $$""" @@ -52,6 +53,7 @@ private static string GetFileContents(string testClassName, bool isLegacyDotnet) {{optionalUsingSystemNet}} {{optionalUsingSystemNetNetworkInformation}} {{optionalUsingSystemTextJson}} + {{optionalUsingSystemXml}} using NUnit.Framework; using NUnit.Framework.Legacy; using System; diff --git a/end2end/EndToEndScaffold/Templates/PostgresTests.cs b/end2end/EndToEndScaffold/Templates/PostgresTests.cs index 30c25be6..af9cf384 100644 --- a/end2end/EndToEndScaffold/Templates/PostgresTests.cs +++ b/end2end/EndToEndScaffold/Templates/PostgresTests.cs @@ -954,6 +954,43 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } """ + }, + [KnownTestType.PostgresXmlDataTypes] = new TestImpl + { + Impl = $$""" + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs + { + CXml = parsedXml + }); + + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + """ } }; } \ No newline at end of file diff --git a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs index 10e8eeef..32a89e3e 100644 --- a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -825,6 +826,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/end2end/EndToEndTests/NpgsqlTester.generated.cs b/end2end/EndToEndTests/NpgsqlTester.generated.cs index e4cae233..5fe89c9b 100644 --- a/end2end/EndToEndTests/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -825,6 +826,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs index 9ecb0435..0eb07bad 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -825,6 +826,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs index 2060aa5c..2b65c9f5 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -825,6 +826,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/examples/NpgsqlDapperExample/Models.cs b/examples/NpgsqlDapperExample/Models.cs index 822af4fc..1a7d2df9 100644 --- a/examples/NpgsqlDapperExample/Models.cs +++ b/examples/NpgsqlDapperExample/Models.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; namespace NpgsqlDapperExampleGen; public class Author @@ -46,6 +47,7 @@ public class PostgresType public JsonElement? CJsonStringOverride { get; init; } public JsonElement? CJsonb { get; init; } public string? CJsonpath { get; init; } + public XmlDocument? CXml { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } diff --git a/examples/NpgsqlDapperExample/QuerySql.cs b/examples/NpgsqlDapperExample/QuerySql.cs index 4fa8985d..0915b09d 100644 --- a/examples/NpgsqlDapperExample/QuerySql.cs +++ b/examples/NpgsqlDapperExample/QuerySql.cs @@ -14,6 +14,7 @@ using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; +using System.Xml; namespace NpgsqlDapperExampleGen; public class QuerySql @@ -528,7 +529,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; init; } @@ -556,6 +557,7 @@ public class InsertPostgresTypesArgs public string? CJsonStringOverride { get; init; } public JsonElement? CJsonb { get; init; } public string? CJsonpath { get; init; } + public XmlDocument? CXml { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } @@ -596,6 +598,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) queryParams.Add("c_json_string_override", args.CJsonStringOverride); queryParams.Add("c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : null); queryParams.Add("c_jsonpath", args.CJsonpath); + queryParams.Add("c_xml", args.CXml != null ? args.CXml.OuterXml : null); queryParams.Add("c_cidr", args.CCidr); queryParams.Add("c_inet", args.CInet); queryParams.Add("c_macaddr", args.CMacaddr); @@ -690,7 +693,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; init; } @@ -718,6 +721,7 @@ public class GetPostgresTypesRow public string? CJsonStringOverride { get; init; } public JsonElement? CJsonb { get; init; } public string? CJsonpath { get; init; } + public XmlDocument? CXml { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } diff --git a/examples/NpgsqlDapperExample/Utils.cs b/examples/NpgsqlDapperExample/Utils.cs index f0dd0dff..0c800aac 100644 --- a/examples/NpgsqlDapperExample/Utils.cs +++ b/examples/NpgsqlDapperExample/Utils.cs @@ -6,6 +6,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; namespace NpgsqlDapperExampleGen; public static class Utils @@ -25,9 +26,30 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) } } + private class XmlDocumentTypeHandler : SqlMapper.TypeHandler + { + public override XmlDocument Parse(object value) + { + if (value is string s) + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(s); + return xmlDoc; + } + + throw new DataException($"Cannot convert {value?.GetType()} to XmlDocument"); + } + + public override void SetValue(IDbDataParameter parameter, XmlDocument value) + { + parameter.Value = value.OuterXml; + } + } + public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(XmlDocument), new XmlDocumentTypeHandler()); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); diff --git a/examples/NpgsqlDapperExample/request.json b/examples/NpgsqlDapperExample/request.json index d4b220e6..5a8dad3f 100644 --- a/examples/NpgsqlDapperExample/request.json +++ b/examples/NpgsqlDapperExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -33190,7 +33200,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33582,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33607,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33623,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33633,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33623,7 +33643,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_bytea", "length": -1, @@ -33639,7 +33659,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_boolean_array", "isArray": true, @@ -33657,7 +33677,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_text_array", "isArray": true, @@ -33675,7 +33695,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_integer_array", "isArray": true, @@ -33693,7 +33713,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_decimal_array", "isArray": true, @@ -33711,7 +33731,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_date_array", "isArray": true, @@ -33729,7 +33749,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_timestamp_array", "isArray": true, @@ -34079,7 +34099,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34394,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, diff --git a/examples/NpgsqlDapperExample/request.message b/examples/NpgsqlDapperExample/request.message index d7603cf5..13684845 100644 --- a/examples/NpgsqlDapperExample/request.message +++ b/examples/NpgsqlDapperExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb examples/NpgsqlDapperExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlDapperExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":true}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -58,7 +58,8 @@ pg_catalogvarchar1 c_jsonb0Rpostgres_typesbjsonb5 c_jsonpath0Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0Rpostgres_typesbxml- c_cidr0Rpostgres_typesbcidr- c_inet0Rpostgres_typesbinet3 c_macaddr0Rpostgres_typesb macaddr5 @@ -10296,8 +10297,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,6 +10325,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10362,17 +10364,18 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, + $28, + $29::macaddr, + $30::macaddr8, + $31, + $32, + $33, $34, $35, - $36 + $36, + $37 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,19 +10408,20 @@ c_interval*PL c_jsonb0bjsonb*'# c_jsonpath0b -jsonpath*C? -c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet08Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0b macaddr*'# +jsonpath* +c_xml0bxml*C? +c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet08Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e!a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h"d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T#P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n$j +macaddr8*FB +c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a +c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P + c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a +c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d +c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P + c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types INSERT INTO postgres_types ( @@ -10491,8 +10495,8 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types -SELECT +c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10518,6 +10522,7 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10578,7 +10583,8 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0Rpostgres_typesbxmlzc_xml"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! diff --git a/examples/NpgsqlDapperLegacyExample/Models.cs b/examples/NpgsqlDapperLegacyExample/Models.cs index e1176817..972f76b6 100644 --- a/examples/NpgsqlDapperLegacyExample/Models.cs +++ b/examples/NpgsqlDapperLegacyExample/Models.cs @@ -7,6 +7,7 @@ namespace NpgsqlDapperLegacyExampleGen using System.Net; using System.Net.NetworkInformation; using System.Text.Json; + using System.Xml; public class Author { @@ -47,6 +48,7 @@ public class PostgresType public JsonElement? CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } diff --git a/examples/NpgsqlDapperLegacyExample/QuerySql.cs b/examples/NpgsqlDapperLegacyExample/QuerySql.cs index 740a5a21..b4f33113 100644 --- a/examples/NpgsqlDapperLegacyExample/QuerySql.cs +++ b/examples/NpgsqlDapperLegacyExample/QuerySql.cs @@ -16,6 +16,7 @@ namespace NpgsqlDapperLegacyExampleGen using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; + using System.Xml; public class QuerySql { @@ -529,7 +530,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; set; } @@ -557,6 +558,7 @@ public class InsertPostgresTypesArgs public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } @@ -597,6 +599,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) queryParams.Add("c_json_string_override", args.CJsonStringOverride); queryParams.Add("c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : null); queryParams.Add("c_jsonpath", args.CJsonpath); + queryParams.Add("c_xml", args.CXml != null ? args.CXml.OuterXml : null); queryParams.Add("c_cidr", args.CCidr); queryParams.Add("c_inet", args.CInet); queryParams.Add("c_macaddr", args.CMacaddr); @@ -691,7 +694,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; set; } @@ -719,6 +722,7 @@ public class GetPostgresTypesRow public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } diff --git a/examples/NpgsqlDapperLegacyExample/Utils.cs b/examples/NpgsqlDapperLegacyExample/Utils.cs index 46c4093c..585d0584 100644 --- a/examples/NpgsqlDapperLegacyExample/Utils.cs +++ b/examples/NpgsqlDapperLegacyExample/Utils.cs @@ -8,6 +8,7 @@ namespace NpgsqlDapperLegacyExampleGen using System.Net; using System.Net.NetworkInformation; using System.Text.Json; + using System.Xml; public static class Utils { @@ -26,9 +27,30 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) } } + private class XmlDocumentTypeHandler : SqlMapper.TypeHandler + { + public override XmlDocument Parse(object value) + { + if (value is string s) + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(s); + return xmlDoc; + } + + throw new DataException($"Cannot convert {value?.GetType()} to XmlDocument"); + } + + public override void SetValue(IDbDataParameter parameter, XmlDocument value) + { + parameter.Value = value.OuterXml; + } + } + public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(XmlDocument), new XmlDocumentTypeHandler()); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); diff --git a/examples/NpgsqlDapperLegacyExample/request.json b/examples/NpgsqlDapperLegacyExample/request.json index f1505a5c..4093edc9 100644 --- a/examples/NpgsqlDapperLegacyExample/request.json +++ b/examples/NpgsqlDapperLegacyExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -33190,7 +33200,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33582,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33607,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33623,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33633,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33623,7 +33643,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_bytea", "length": -1, @@ -33639,7 +33659,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_boolean_array", "isArray": true, @@ -33657,7 +33677,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_text_array", "isArray": true, @@ -33675,7 +33695,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_integer_array", "isArray": true, @@ -33693,7 +33713,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_decimal_array", "isArray": true, @@ -33711,7 +33731,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_date_array", "isArray": true, @@ -33729,7 +33749,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_timestamp_array", "isArray": true, @@ -34079,7 +34099,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34394,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, diff --git a/examples/NpgsqlDapperLegacyExample/request.message b/examples/NpgsqlDapperLegacyExample/request.message index 1eeedbbc..bb7dab36 100644 --- a/examples/NpgsqlDapperLegacyExample/request.message +++ b/examples/NpgsqlDapperLegacyExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb "examples/NpgsqlDapperLegacyExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlDapperLegacyExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":true}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -58,7 +58,8 @@ pg_catalogvarchar1 c_jsonb0Rpostgres_typesbjsonb5 c_jsonpath0Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0Rpostgres_typesbxml- c_cidr0Rpostgres_typesbcidr- c_inet0Rpostgres_typesbinet3 c_macaddr0Rpostgres_typesb macaddr5 @@ -10296,8 +10297,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,6 +10325,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10362,17 +10364,18 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, + $28, + $29::macaddr, + $30::macaddr8, + $31, + $32, + $33, $34, $35, - $36 + $36, + $37 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,19 +10408,20 @@ c_interval*PL c_jsonb0bjsonb*'# c_jsonpath0b -jsonpath*C? -c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet08Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0b macaddr*'# +jsonpath* +c_xml0bxml*C? +c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet08Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e!a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h"d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T#P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n$j +macaddr8*FB +c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a +c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P + c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a +c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d +c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P + c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types INSERT INTO postgres_types ( @@ -10491,8 +10495,8 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types -SELECT +c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10518,6 +10522,7 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10578,7 +10583,8 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0Rpostgres_typesbxmlzc_xml"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! diff --git a/examples/NpgsqlExample/Models.cs b/examples/NpgsqlExample/Models.cs index b6b850b2..142869b2 100644 --- a/examples/NpgsqlExample/Models.cs +++ b/examples/NpgsqlExample/Models.cs @@ -5,9 +5,10 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; namespace NpgsqlExampleGen; public readonly record struct Author(long Id, string Name, string? Bio); public readonly record struct Book(Guid Id, string Name, long AuthorId, string? Description); -public readonly record struct PostgresType(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CNumeric, float? CReal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, JsonElement? CJson, JsonElement? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, Guid? CUuid, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); +public readonly record struct PostgresType(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CNumeric, float? CReal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, JsonElement? CJson, JsonElement? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, Guid? CUuid, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); public readonly record struct PostgresGeometricType(NpgsqlPoint? CPoint, NpgsqlLine? CLine, NpgsqlLSeg? CLseg, NpgsqlBox? CBox, NpgsqlPath? CPath, NpgsqlPolygon? CPolygon, NpgsqlCircle? CCircle); \ No newline at end of file diff --git a/examples/NpgsqlExample/QuerySql.cs b/examples/NpgsqlExample/QuerySql.cs index 84a720b7..c151ed4d 100644 --- a/examples/NpgsqlExample/QuerySql.cs +++ b/examples/NpgsqlExample/QuerySql.cs @@ -13,6 +13,7 @@ using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; +using System.Xml; namespace NpgsqlExampleGen; public class QuerySql @@ -653,8 +654,8 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; - public readonly record struct InsertPostgresTypesArgs(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public readonly record struct InsertPostgresTypesArgs(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { if (this.Transaction == null) @@ -688,6 +689,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); @@ -740,6 +742,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); @@ -797,8 +800,8 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; - public readonly record struct GetPostgresTypesRow(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + public readonly record struct GetPostgresTypesRow(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); public async Task GetPostgresTypes() { if (this.Transaction == null) @@ -838,17 +841,23 @@ public async Task InsertPostgresTypesBatch(List ar CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), + CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), + CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), + CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) }; } } @@ -898,17 +907,23 @@ public async Task InsertPostgresTypesBatch(List ar CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), + CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), + CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), + CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) }; } } diff --git a/examples/NpgsqlExample/request.json b/examples/NpgsqlExample/request.json index a5bd3436..02628db0 100644 --- a/examples/NpgsqlExample/request.json +++ b/examples/NpgsqlExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -33190,7 +33200,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33582,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33607,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33623,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33633,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33623,7 +33643,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_bytea", "length": -1, @@ -33639,7 +33659,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_boolean_array", "isArray": true, @@ -33657,7 +33677,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_text_array", "isArray": true, @@ -33675,7 +33695,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_integer_array", "isArray": true, @@ -33693,7 +33713,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_decimal_array", "isArray": true, @@ -33711,7 +33731,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_date_array", "isArray": true, @@ -33729,7 +33749,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_timestamp_array", "isArray": true, @@ -34079,7 +34099,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34394,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, diff --git a/examples/NpgsqlExample/request.message b/examples/NpgsqlExample/request.message index ff950149..3bc2f31b 100644 --- a/examples/NpgsqlExample/request.message +++ b/examples/NpgsqlExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb examples/NpgsqlExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":false}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -58,7 +58,8 @@ pg_catalogvarchar1 c_jsonb0Rpostgres_typesbjsonb5 c_jsonpath0Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0Rpostgres_typesbxml- c_cidr0Rpostgres_typesbcidr- c_inet0Rpostgres_typesbinet3 c_macaddr0Rpostgres_typesb macaddr5 @@ -10296,8 +10297,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,6 +10325,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10362,17 +10364,18 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, + $28, + $29::macaddr, + $30::macaddr8, + $31, + $32, + $33, $34, $35, - $36 + $36, + $37 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,19 +10408,20 @@ c_interval*PL c_jsonb0bjsonb*'# c_jsonpath0b -jsonpath*C? -c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet08Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0b macaddr*'# +jsonpath* +c_xml0bxml*C? +c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet08Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e!a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h"d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T#P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n$j +macaddr8*FB +c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a +c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P + c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a +c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d +c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P + c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types INSERT INTO postgres_types ( @@ -10491,8 +10495,8 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types -SELECT +c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10518,6 +10522,7 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10578,7 +10583,8 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0Rpostgres_typesbxmlzc_xml"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! diff --git a/examples/NpgsqlLegacyExample/Models.cs b/examples/NpgsqlLegacyExample/Models.cs index d421c425..e99ce2e4 100644 --- a/examples/NpgsqlLegacyExample/Models.cs +++ b/examples/NpgsqlLegacyExample/Models.cs @@ -7,6 +7,7 @@ namespace NpgsqlLegacyExampleGen using System.Net; using System.Net.NetworkInformation; using System.Text.Json; + using System.Xml; public class Author { @@ -47,6 +48,7 @@ public class PostgresType public JsonElement? CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } diff --git a/examples/NpgsqlLegacyExample/QuerySql.cs b/examples/NpgsqlLegacyExample/QuerySql.cs index f865bfb3..9f5c1155 100644 --- a/examples/NpgsqlLegacyExample/QuerySql.cs +++ b/examples/NpgsqlLegacyExample/QuerySql.cs @@ -15,6 +15,7 @@ namespace NpgsqlLegacyExampleGen using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; + using System.Xml; public class QuerySql { @@ -751,7 +752,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; set; } @@ -779,6 +780,7 @@ public class InsertPostgresTypesArgs public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } @@ -824,6 +826,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); @@ -876,6 +879,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); @@ -956,7 +960,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; set; } @@ -984,6 +988,7 @@ public class GetPostgresTypesRow public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } @@ -1035,17 +1040,23 @@ public async Task GetPostgresTypes() CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? (NpgsqlCidr? )null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? (NpgsqlCidr? )null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), + CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), + CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), + CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) }; } } @@ -1095,17 +1106,23 @@ public async Task GetPostgresTypes() CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? (NpgsqlCidr? )null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? (NpgsqlCidr? )null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), + CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), + CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), + CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) }; } } diff --git a/examples/NpgsqlLegacyExample/request.json b/examples/NpgsqlLegacyExample/request.json index 152879cd..e64051a6 100644 --- a/examples/NpgsqlLegacyExample/request.json +++ b/examples/NpgsqlLegacyExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -33190,7 +33200,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33582,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33607,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33623,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33633,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33623,7 +33643,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_bytea", "length": -1, @@ -33639,7 +33659,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_boolean_array", "isArray": true, @@ -33657,7 +33677,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_text_array", "isArray": true, @@ -33675,7 +33695,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_integer_array", "isArray": true, @@ -33693,7 +33713,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_decimal_array", "isArray": true, @@ -33711,7 +33731,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_date_array", "isArray": true, @@ -33729,7 +33749,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_timestamp_array", "isArray": true, @@ -34079,7 +34099,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34394,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, diff --git a/examples/NpgsqlLegacyExample/request.message b/examples/NpgsqlLegacyExample/request.message index e6aa12d9..cedc4a18 100644 --- a/examples/NpgsqlLegacyExample/request.message +++ b/examples/NpgsqlLegacyExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb examples/NpgsqlLegacyExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlLegacyExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":false}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -58,7 +58,8 @@ pg_catalogvarchar1 c_jsonb0Rpostgres_typesbjsonb5 c_jsonpath0Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0Rpostgres_typesbxml- c_cidr0Rpostgres_typesbcidr- c_inet0Rpostgres_typesbinet3 c_macaddr0Rpostgres_typesb macaddr5 @@ -10296,8 +10297,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,6 +10325,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10362,17 +10364,18 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, + $28, + $29::macaddr, + $30::macaddr8, + $31, + $32, + $33, $34, $35, - $36 + $36, + $37 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,19 +10408,20 @@ c_interval*PL c_jsonb0bjsonb*'# c_jsonpath0b -jsonpath*C? -c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet08Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0b macaddr*'# +jsonpath* +c_xml0bxml*C? +c_cidr08Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet08Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e!a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h"d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T#P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n$j +macaddr8*FB +c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a +c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P + c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a +c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d +c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P + c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types INSERT INTO postgres_types ( @@ -10491,8 +10495,8 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types -SELECT +c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10518,6 +10522,7 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -10578,7 +10583,8 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0Rpostgres_typesbxmlzc_xml"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! diff --git a/examples/config/postgresql/query.sql b/examples/config/postgresql/query.sql index 670850cb..f0072985 100644 --- a/examples/config/postgresql/query.sql +++ b/examples/config/postgresql/query.sql @@ -98,6 +98,7 @@ INSERT INTO postgres_types c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, @@ -136,6 +137,7 @@ VALUES ( sqlc.narg('c_json_string_override')::json, sqlc.narg('c_jsonb')::jsonb, sqlc.narg('c_jsonpath')::jsonpath, + sqlc.narg('c_xml')::xml, sqlc.narg('c_cidr'), sqlc.narg('c_inet'), sqlc.narg('c_macaddr')::macaddr, @@ -225,6 +227,7 @@ SELECT c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, diff --git a/examples/config/postgresql/schema.sql b/examples/config/postgresql/schema.sql index 7f7c3890..ca9efe3a 100644 --- a/examples/config/postgresql/schema.sql +++ b/examples/config/postgresql/schema.sql @@ -46,6 +46,7 @@ CREATE TABLE postgres_types ( c_json_string_override JSON, c_jsonb JSONB, c_jsonpath JSONPATH, + c_xml XML, /* Network Address Data Types */ c_cidr CIDR, From 7528429180e1bf2ab36a15d7ad071ad1684eebc1 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sun, 10 Aug 2025 14:38:03 +0200 Subject: [PATCH 6/9] feat: support postgres network data types in batch insert --- Drivers/NpgsqlDriver.cs | 4 +- docs/04_Postgres.md | 6 +- end2end/EndToEndScaffold/Config.cs | 3 + .../Templates/PostgresTests.cs | 61 +++++++++++++- .../NpgsqlDapperTester.generated.cs | 33 ++++++++ .../EndToEndTests/NpgsqlTester.generated.cs | 33 ++++++++ .../NpgsqlDapperTester.generated.cs | 33 ++++++++ .../NpgsqlTester.generated.cs | 33 ++++++++ examples/NpgsqlDapperExample/QuerySql.cs | 13 ++- examples/NpgsqlDapperExample/request.json | 82 ++++++++++++++++++- examples/NpgsqlDapperExample/request.message | 36 ++++++-- .../NpgsqlDapperLegacyExample/QuerySql.cs | 13 ++- .../NpgsqlDapperLegacyExample/request.json | 82 ++++++++++++++++++- .../NpgsqlDapperLegacyExample/request.message | 36 ++++++-- examples/NpgsqlExample/QuerySql.cs | 21 +++-- examples/NpgsqlExample/request.json | 82 ++++++++++++++++++- examples/NpgsqlExample/request.message | 36 ++++++-- examples/NpgsqlLegacyExample/QuerySql.cs | 23 +++++- examples/NpgsqlLegacyExample/request.json | 82 ++++++++++++++++++- examples/NpgsqlLegacyExample/request.message | 36 ++++++-- examples/config/postgresql/query.sql | 18 +++- 21 files changed, 699 insertions(+), 67 deletions(-) diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index 2c60ebe6..837359ba 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -69,8 +69,8 @@ public NpgsqlDriver( { "bpchar", new() }, { "tinytext", new() }, { "varchar", new() }, - { "jsonpath", new(NpgsqlTypeOverride: "NpgsqlDbType.JsonPath") }, - { "macaddr8", new(NpgsqlTypeOverride: "NpgsqlDbType.MacAddr8") } + { "jsonpath", new() }, + { "macaddr8", new() } }, readerFn: ordinal => $"reader.GetString({ordinal})", readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" diff --git a/docs/04_Postgres.md b/docs/04_Postgres.md index 8ff1cd31..2f980017 100644 --- a/docs/04_Postgres.md +++ b/docs/04_Postgres.md @@ -55,9 +55,9 @@ we consider support for the different data types separately for batch inserts an | path | ✅ | ✅ | | polygon | ✅ | ✅ | | circle | ✅ | ✅ | -| cidr | ✅ | ❌ | -| inet | ✅ | ❌ | -| macaddr | ✅ | ❌ | +| cidr | ✅ | ✅ | +| inet | ✅ | ✅ | +| macaddr | ✅ | ✅ | | macaddr8 | ✅ | ❌ | | tsvector | ❌ | ❌ | | tsquery | ❌ | ❌ | diff --git a/end2end/EndToEndScaffold/Config.cs b/end2end/EndToEndScaffold/Config.cs index c624b156..9fcca5fb 100644 --- a/end2end/EndToEndScaffold/Config.cs +++ b/end2end/EndToEndScaffold/Config.cs @@ -50,6 +50,7 @@ public enum KnownTestType PostgresFloatingPointCopyFrom, PostgresDateTimeCopyFrom, PostgresGuidCopyFrom, + PostgresNetworkCopyFrom, PostgresArrayCopyFrom, PostgresGeoDataTypes, PostgresGeoCopyFrom, @@ -211,6 +212,7 @@ internal static class Config KnownTestType.PostgresDateTimeCopyFrom, KnownTestType.PostgresGuidCopyFrom, KnownTestType.PostgresArrayCopyFrom, + KnownTestType.PostgresNetworkCopyFrom, ] } }, @@ -254,6 +256,7 @@ internal static class Config KnownTestType.PostgresDateTimeCopyFrom, KnownTestType.PostgresGuidCopyFrom, KnownTestType.PostgresArrayCopyFrom, + KnownTestType.PostgresNetworkCopyFrom ] } }, diff --git a/end2end/EndToEndScaffold/Templates/PostgresTests.cs b/end2end/EndToEndScaffold/Templates/PostgresTests.cs index af9cf384..91df06db 100644 --- a/end2end/EndToEndScaffold/Templates/PostgresTests.cs +++ b/end2end/EndToEndScaffold/Templates/PostgresTests.cs @@ -525,7 +525,6 @@ public void TestPostgresInvalidJson() } """ }, - [KnownTestType.PostgresNetworkDataTypes] = new TestImpl { Impl = $$""" @@ -991,6 +990,66 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTy } } """ + }, + [KnownTestType.PostgresNetworkCopyFrom] = new TestImpl + { + Impl = $$""" + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData( + 200, + new NpgsqlCidr("192.168.1.0/24"), + new IPAddress(new byte[] { 192, 168, 1, 1 }), + new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }) + ).SetName("Valid Network Copy From"); + yield return new TestCaseData( + 10, + null, + null, + null + ).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom( + int batchSize, + NpgsqlCidr? cCidr, + IPAddress cInet, + PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize) + .Select(_ => new QuerySql.InsertPostgresTypesBatchArgs + { + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }) + .ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + """ } }; } \ No newline at end of file diff --git a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs index 32a89e3e..690e12c7 100644 --- a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs @@ -661,6 +661,39 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] diff --git a/end2end/EndToEndTests/NpgsqlTester.generated.cs b/end2end/EndToEndTests/NpgsqlTester.generated.cs index 5fe89c9b..cde9b950 100644 --- a/end2end/EndToEndTests/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlTester.generated.cs @@ -661,6 +661,39 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] diff --git a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs index 0eb07bad..094cc5c9 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs @@ -661,6 +661,39 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] diff --git a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs index 2b65c9f5..78cf4a3c 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs @@ -661,6 +661,39 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] diff --git a/examples/NpgsqlDapperExample/QuerySql.cs b/examples/NpgsqlDapperExample/QuerySql.cs index 0915b09d..2749ed1d 100644 --- a/examples/NpgsqlDapperExample/QuerySql.cs +++ b/examples/NpgsqlDapperExample/QuerySql.cs @@ -628,7 +628,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) await this.Transaction.Connection.ExecuteAsync(InsertPostgresTypesSql, queryParams, transaction: this.Transaction); } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; init; } @@ -652,6 +652,9 @@ public class InsertPostgresTypesBatchArgs public string? CText { get; init; } public Guid? CUuid { get; init; } public byte[]? CBytea { get; init; } + public NpgsqlCidr? CCidr { get; init; } + public IPAddress? CInet { get; init; } + public PhysicalAddress? CMacaddr { get; init; } }; public async Task InsertPostgresTypesBatch(List args) { @@ -684,6 +687,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CText); await writer.WriteAsync(row.CUuid); await writer.WriteAsync(row.CBytea); + await writer.WriteAsync(row.CCidr); + await writer.WriteAsync(row.CInet); + await writer.WriteAsync(row.CMacaddr); } await writer.CompleteAsync(); @@ -753,7 +759,7 @@ public class GetPostgresTypesRow return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresTypesSql, transaction: this.Transaction); } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; init; } @@ -777,6 +783,9 @@ public class GetPostgresTypesCntRow public string? CText { get; init; } public Guid? CUuid { get; init; } public byte[]? CBytea { get; init; } + public NpgsqlCidr? CCidr { get; init; } + public IPAddress? CInet { get; init; } + public PhysicalAddress? CMacaddr { get; init; } public required long Cnt { get; init; } }; public async Task GetPostgresTypesCnt() diff --git a/examples/NpgsqlDapperExample/request.json b/examples/NpgsqlDapperExample/request.json index 5a8dad3f..c5c66463 100644 --- a/examples/NpgsqlDapperExample/request.json +++ b/examples/NpgsqlDapperExample/request.json @@ -33773,7 +33773,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34091,6 +34091,51 @@ }, "originalName": "c_bytea" } + }, + { + "number": 22, + "column": { + "name": "c_cidr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + } + }, + { + "number": 23, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 24, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + } } ], "filename": "query.sql", @@ -34543,7 +34588,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34793,6 +34838,39 @@ }, "originalName": "c_bytea" }, + { + "name": "c_cidr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + }, { "name": "cnt", "notNull": true, diff --git a/examples/NpgsqlDapperExample/request.message b/examples/NpgsqlDapperExample/request.message index 13684845..031fadb1 100644 --- a/examples/NpgsqlDapperExample/request.message +++ b/examples/NpgsqlDapperExample/request.message @@ -10422,8 +10422,8 @@ c_macaddr80 c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10445,10 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10468,7 +10471,10 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23, + $24 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10495,7 +10501,10 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types SELECT c_boolean, c_bit, @@ -10600,8 +10609,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"F c_date_array 0Rpostgres_typesbdatez c_date_array"a c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +pg_catalog timestampzc_timestamp_array: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10623,6 +10632,9 @@ pg_catalog timestampzc_timestamp_array c_text, c_uuid, c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10646,7 +10658,10 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0Rpostgres_typesb @@ -10687,7 +10702,10 @@ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea" +c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_cidr0Rpostgres_typesbcidrzc_cidr"5 +c_inet0Rpostgres_typesbinetzc_inet"> + c_macaddr0Rpostgres_typesb macaddrz c_macaddr" cnt0@bbigint: query.sql SELECT MAX(c_integer) AS max_integer, diff --git a/examples/NpgsqlDapperLegacyExample/QuerySql.cs b/examples/NpgsqlDapperLegacyExample/QuerySql.cs index b4f33113..c3a0341d 100644 --- a/examples/NpgsqlDapperLegacyExample/QuerySql.cs +++ b/examples/NpgsqlDapperLegacyExample/QuerySql.cs @@ -629,7 +629,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) await this.Transaction.Connection.ExecuteAsync(InsertPostgresTypesSql, queryParams, transaction: this.Transaction); } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; set; } @@ -653,6 +653,9 @@ public class InsertPostgresTypesBatchArgs public string CText { get; set; } public Guid? CUuid { get; set; } public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } }; public async Task InsertPostgresTypesBatch(List args) { @@ -685,6 +688,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CText); await writer.WriteAsync(row.CUuid); await writer.WriteAsync(row.CBytea); + await writer.WriteAsync(row.CCidr); + await writer.WriteAsync(row.CInet); + await writer.WriteAsync(row.CMacaddr); } await writer.CompleteAsync(); @@ -754,7 +760,7 @@ public async Task GetPostgresTypes() return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresTypesSql, transaction: this.Transaction); } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; set; } @@ -778,6 +784,9 @@ public class GetPostgresTypesCntRow public string CText { get; set; } public Guid? CUuid { get; set; } public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } public long Cnt { get; set; } }; public async Task GetPostgresTypesCnt() diff --git a/examples/NpgsqlDapperLegacyExample/request.json b/examples/NpgsqlDapperLegacyExample/request.json index 4093edc9..2fc813ff 100644 --- a/examples/NpgsqlDapperLegacyExample/request.json +++ b/examples/NpgsqlDapperLegacyExample/request.json @@ -33773,7 +33773,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34091,6 +34091,51 @@ }, "originalName": "c_bytea" } + }, + { + "number": 22, + "column": { + "name": "c_cidr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + } + }, + { + "number": 23, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 24, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + } } ], "filename": "query.sql", @@ -34543,7 +34588,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34793,6 +34838,39 @@ }, "originalName": "c_bytea" }, + { + "name": "c_cidr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + }, { "name": "cnt", "notNull": true, diff --git a/examples/NpgsqlDapperLegacyExample/request.message b/examples/NpgsqlDapperLegacyExample/request.message index bb7dab36..d452e4e6 100644 --- a/examples/NpgsqlDapperLegacyExample/request.message +++ b/examples/NpgsqlDapperLegacyExample/request.message @@ -10422,8 +10422,8 @@ c_macaddr80 c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10445,10 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10468,7 +10471,10 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23, + $24 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10495,7 +10501,10 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types SELECT c_boolean, c_bit, @@ -10600,8 +10609,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"F c_date_array 0Rpostgres_typesbdatez c_date_array"a c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +pg_catalog timestampzc_timestamp_array: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10623,6 +10632,9 @@ pg_catalog timestampzc_timestamp_array c_text, c_uuid, c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10646,7 +10658,10 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0Rpostgres_typesb @@ -10687,7 +10702,10 @@ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea" +c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_cidr0Rpostgres_typesbcidrzc_cidr"5 +c_inet0Rpostgres_typesbinetzc_inet"> + c_macaddr0Rpostgres_typesb macaddrz c_macaddr" cnt0@bbigint: query.sql SELECT MAX(c_integer) AS max_integer, diff --git a/examples/NpgsqlExample/QuerySql.cs b/examples/NpgsqlExample/QuerySql.cs index c151ed4d..fbfab25f 100644 --- a/examples/NpgsqlExample/QuerySql.cs +++ b/examples/NpgsqlExample/QuerySql.cs @@ -758,8 +758,8 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) } } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; - public readonly record struct InsertPostgresTypesBatchArgs(bool? CBoolean, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea); + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; + public readonly record struct InsertPostgresTypesBatchArgs(bool? CBoolean, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr); public async Task InsertPostgresTypesBatch(List args) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -791,6 +791,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CText ?? (object)DBNull.Value); await writer.WriteAsync(row.CUuid ?? (object)DBNull.Value); await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + await writer.WriteAsync(row.CCidr ?? (object)DBNull.Value); + await writer.WriteAsync(row.CInet ?? (object)DBNull.Value); + await writer.WriteAsync(row.CMacaddr ?? (object)DBNull.Value); } await writer.CompleteAsync(); @@ -932,8 +935,8 @@ public async Task InsertPostgresTypesBatch(List ar return null; } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; - public readonly record struct GetPostgresTypesCntRow(short? CSmallint, bool? CBoolean, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea, long Cnt); + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; + public readonly record struct GetPostgresTypesCntRow(short? CSmallint, bool? CBoolean, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, long Cnt); public async Task GetPostgresTypesCnt() { if (this.Transaction == null) @@ -969,7 +972,10 @@ public async Task InsertPostgresTypesBatch(List ar CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? null : reader.GetFieldValue(19), CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), + Cnt = reader.GetInt64(24) }; } } @@ -1015,7 +1021,10 @@ public async Task InsertPostgresTypesBatch(List ar CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? null : reader.GetFieldValue(19), CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), + Cnt = reader.GetInt64(24) }; } } diff --git a/examples/NpgsqlExample/request.json b/examples/NpgsqlExample/request.json index 02628db0..560c3443 100644 --- a/examples/NpgsqlExample/request.json +++ b/examples/NpgsqlExample/request.json @@ -33773,7 +33773,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34091,6 +34091,51 @@ }, "originalName": "c_bytea" } + }, + { + "number": 22, + "column": { + "name": "c_cidr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + } + }, + { + "number": 23, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 24, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + } } ], "filename": "query.sql", @@ -34543,7 +34588,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34793,6 +34838,39 @@ }, "originalName": "c_bytea" }, + { + "name": "c_cidr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + }, { "name": "cnt", "notNull": true, diff --git a/examples/NpgsqlExample/request.message b/examples/NpgsqlExample/request.message index 3bc2f31b..55aca1e9 100644 --- a/examples/NpgsqlExample/request.message +++ b/examples/NpgsqlExample/request.message @@ -10422,8 +10422,8 @@ c_macaddr80 c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10445,10 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10468,7 +10471,10 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23, + $24 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10495,7 +10501,10 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types SELECT c_boolean, c_bit, @@ -10600,8 +10609,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"F c_date_array 0Rpostgres_typesbdatez c_date_array"a c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +pg_catalog timestampzc_timestamp_array: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10623,6 +10632,9 @@ pg_catalog timestampzc_timestamp_array c_text, c_uuid, c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10646,7 +10658,10 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0Rpostgres_typesb @@ -10687,7 +10702,10 @@ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea" +c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_cidr0Rpostgres_typesbcidrzc_cidr"5 +c_inet0Rpostgres_typesbinetzc_inet"> + c_macaddr0Rpostgres_typesb macaddrz c_macaddr" cnt0@bbigint: query.sql SELECT MAX(c_integer) AS max_integer, diff --git a/examples/NpgsqlLegacyExample/QuerySql.cs b/examples/NpgsqlLegacyExample/QuerySql.cs index 9f5c1155..6f19d0f4 100644 --- a/examples/NpgsqlLegacyExample/QuerySql.cs +++ b/examples/NpgsqlLegacyExample/QuerySql.cs @@ -895,7 +895,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) } } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; set; } @@ -919,6 +919,9 @@ public class InsertPostgresTypesBatchArgs public string CText { get; set; } public Guid? CUuid { get; set; } public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } }; public async Task InsertPostgresTypesBatch(List args) { @@ -951,6 +954,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CText ?? (object)DBNull.Value); await writer.WriteAsync(row.CUuid ?? (object)DBNull.Value); await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + await writer.WriteAsync(row.CCidr ?? (object)DBNull.Value); + await writer.WriteAsync(row.CInet ?? (object)DBNull.Value); + await writer.WriteAsync(row.CMacaddr ?? (object)DBNull.Value); } await writer.CompleteAsync(); @@ -1131,7 +1137,7 @@ public async Task GetPostgresTypes() return null; } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; set; } @@ -1155,6 +1161,9 @@ public class GetPostgresTypesCntRow public string CText { get; set; } public Guid? CUuid { get; set; } public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } public long Cnt { get; set; } }; public async Task GetPostgresTypesCnt() @@ -1192,7 +1201,10 @@ public async Task GetPostgresTypesCnt() CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? (Guid? )null : reader.GetFieldValue(19), CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(21) ? (NpgsqlCidr? )null : reader.GetFieldValue(21), + CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), + Cnt = reader.GetInt64(24) }; } } @@ -1238,7 +1250,10 @@ public async Task GetPostgresTypesCnt() CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? (Guid? )null : reader.GetFieldValue(19), CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(21) ? (NpgsqlCidr? )null : reader.GetFieldValue(21), + CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), + Cnt = reader.GetInt64(24) }; } } diff --git a/examples/NpgsqlLegacyExample/request.json b/examples/NpgsqlLegacyExample/request.json index e64051a6..1a262b90 100644 --- a/examples/NpgsqlLegacyExample/request.json +++ b/examples/NpgsqlLegacyExample/request.json @@ -33773,7 +33773,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34091,6 +34091,51 @@ }, "originalName": "c_bytea" } + }, + { + "number": 22, + "column": { + "name": "c_cidr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + } + }, + { + "number": 23, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 24, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + } } ], "filename": "query.sql", @@ -34543,7 +34588,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34793,6 +34838,39 @@ }, "originalName": "c_bytea" }, + { + "name": "c_cidr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "cidr" + }, + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" + }, { "name": "cnt", "notNull": true, diff --git a/examples/NpgsqlLegacyExample/request.message b/examples/NpgsqlLegacyExample/request.message index cedc4a18..2539857c 100644 --- a/examples/NpgsqlLegacyExample/request.message +++ b/examples/NpgsqlLegacyExample/request.message @@ -10422,8 +10422,8 @@ c_macaddr80 c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10445,10 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10468,7 +10471,10 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23, + $24 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10495,7 +10501,10 @@ c_interval*NJ c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types +c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types SELECT c_boolean, c_bit, @@ -10600,8 +10609,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"F c_date_array 0Rpostgres_typesbdatez c_date_array"a c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +pg_catalog timestampzc_timestamp_array: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10623,6 +10632,9 @@ pg_catalog timestampzc_timestamp_array c_text, c_uuid, c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10646,7 +10658,10 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0Rpostgres_typesb @@ -10687,7 +10702,10 @@ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea" +c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_cidr0Rpostgres_typesbcidrzc_cidr"5 +c_inet0Rpostgres_typesbinetzc_inet"> + c_macaddr0Rpostgres_typesb macaddrz c_macaddr" cnt0@bbigint: query.sql SELECT MAX(c_integer) AS max_integer, diff --git a/examples/config/postgresql/query.sql b/examples/config/postgresql/query.sql index f0072985..53dc81bb 100644 --- a/examples/config/postgresql/query.sql +++ b/examples/config/postgresql/query.sql @@ -174,7 +174,10 @@ INSERT INTO postgres_types c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -197,7 +200,10 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23, + $24 ); -- name: GetPostgresTypes :one @@ -265,6 +271,9 @@ SELECT c_text, c_uuid, c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -288,7 +297,10 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_bytea, + c_cidr, + c_inet, + c_macaddr LIMIT 1; -- name: GetPostgresFunctions :one From 4340797c076ecdea206b6945072e32ebf4dd3299 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sun, 10 Aug 2025 15:05:07 +0200 Subject: [PATCH 7/9] fix: re-organize type mappings in DB drivers --- Drivers/MySqlConnectorDriver.cs | 63 +++++++----- Drivers/NpgsqlDriver.cs | 165 +++++++++++++++++--------------- 2 files changed, 126 insertions(+), 102 deletions(-) diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index da4f25ce..4d9afabf 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -26,6 +26,7 @@ public partial class MySqlConnectorDriver( public override Dictionary ColumnMappings { get; } = new() { + /* Numeric data types */ ["bool"] = new( new() { @@ -42,6 +43,16 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetInt16({ordinal})" ), + ["int"] = new( + new() + { + { "int", new() }, + { "integer", new() }, + { "mediumint", new() } + }, + ordinal => $"reader.GetInt32({ordinal})", + convertFunc: x => $"Convert.ToInt32{x}" + ), ["long"] = new( new() { @@ -50,7 +61,24 @@ public partial class MySqlConnectorDriver( ordinal => $"reader.GetInt64({ordinal})", convertFunc: x => $"Convert.ToInt64{x}" ), - ["byte"] = new ColumnMapping( + ["double"] = new( + new() + { + { "double", new() }, + { "float", new() } + }, + ordinal => $"reader.GetDouble({ordinal})" + ), + ["decimal"] = new( + new() + { + { "decimal", new() } + }, + ordinal => $"reader.GetDecimal({ordinal})" + ), + + /* Binary data types */ + ["byte"] = new( new() { { "bit", new() } @@ -69,6 +97,8 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetFieldValue({ordinal})" ), + + /* String data types */ ["string"] = new( new() { @@ -83,6 +113,8 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetString({ordinal})" ), + + /* Date and time data types */ ["DateTime"] = new( new() { @@ -92,31 +124,8 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetDateTime({ordinal})" ), - ["int"] = new( - new() - { - { "int", new() }, - { "integer", new() }, - { "mediumint", new() } - }, - ordinal => $"reader.GetInt32({ordinal})", - convertFunc: x => $"Convert.ToInt32{x}" - ), - ["double"] = new( - new() - { - { "double", new() }, - { "float", new() } - }, - ordinal => $"reader.GetDouble({ordinal})" - ), - ["decimal"] = new( - new() - { - { "decimal", new() } - }, - ordinal => $"reader.GetDecimal({ordinal})" - ), + + /* Unstructured data types */ ["JsonElement"] = new( new() { @@ -134,6 +143,8 @@ public partial class MySqlConnectorDriver( sqlMapper: "SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler());", sqlMapperImpl: JsonElementTypeHandler ), + + /* Other data types */ ["object"] = new( new() { diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index 837359ba..a707ac46 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -34,6 +34,37 @@ public NpgsqlDriver( public sealed override Dictionary ColumnMappings { get; } = new() { + /* Numeric data types */ + ["bool"] = new( + new() + { + { "bool", new() }, + { "boolean", new() } + }, + readerFn: ordinal => $"reader.GetBoolean({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), + ["short"] = new( + new() + { + { "int2", new() } + }, + readerFn: ordinal => $"reader.GetInt16({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + convertFunc: x => $"Convert.ToInt16({x})" + ), + ["int"] = new( + new() + { + { "integer", new() }, + { "int", new() }, + { "int4", new() }, + { "serial", new() } + }, + readerFn: ordinal => $"reader.GetInt32({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + convertFunc: x => $"Convert.ToInt32({x})" + ), ["long"] = new( new() { @@ -45,21 +76,34 @@ public NpgsqlDriver( readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", convertFunc: x => $"Convert.ToInt64({x})" ), - ["byte[]"] = new( + ["float"] = new( new() { - { "binary", new() }, - { "bit", new() }, - { "bytea", new() }, - { "blob", new() }, - { "longblob", new() }, - { "mediumblob", new() }, - { "tinyblob", new() }, - { "varbinary", new() } + { "float4", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: ordinal => $"reader.GetFloat({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), + ["decimal"] = new( + new() + { + { "numeric", new() }, + { "decimal", new() }, + { "money", new(NpgsqlTypeOverride: "NpgsqlDbType.Money") } + }, + readerFn: ordinal => $"reader.GetDecimal({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" ), + ["double"] = new( + new() + { + { "float8", new() } + }, + readerFn: ordinal => $"reader.GetDouble({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), + + /* String data types */ ["string"] = new( new() { @@ -75,15 +119,8 @@ public NpgsqlDriver( readerFn: ordinal => $"reader.GetString({ordinal})", readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" ), - ["Guid"] = new( - new() - { - { "uuid", new() } - }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", - convertFunc: x => $"Guid.Parse({x}?.ToString())" - ), + + /* Date and time data types */ ["TimeSpan"] = new( new() { @@ -103,6 +140,8 @@ public NpgsqlDriver( readerFn: ordinal => $"reader.GetDateTime({ordinal})", readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" ), + + /* Unstructured data types */ ["JsonElement"] = new( new() { @@ -121,62 +160,6 @@ public NpgsqlDriver( sqlMapper: "SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler());", sqlMapperImpl: JsonElementTypeHandler ), - ["short"] = new( - new() - { - { "int2", new() } - }, - readerFn: ordinal => $"reader.GetInt16({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", - convertFunc: x => $"Convert.ToInt16({x})" - ), - ["int"] = new( - new() - { - { "integer", new() }, - { "int", new() }, - { "int4", new() }, - { "serial", new() } - }, - readerFn: ordinal => $"reader.GetInt32({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", - convertFunc: x => $"Convert.ToInt32({x})" - ), - ["float"] = new( - new() - { - { "float4", new() } - }, - readerFn: ordinal => $"reader.GetFloat({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" - ), - ["decimal"] = new( - new() - { - { "numeric", new() }, - { "decimal", new() }, - { "money", new(NpgsqlTypeOverride: "NpgsqlDbType.Money") } - }, - readerFn: ordinal => $"reader.GetDecimal({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" - ), - ["double"] = new( - new() - { - { "float8", new() } - }, - readerFn: ordinal => $"reader.GetDouble({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" - ), - ["bool"] = new( - new() - { - { "bool", new() }, - { "boolean", new() } - }, - readerFn: ordinal => $"reader.GetBoolean({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" - ), ["XmlDocument"] = new( new() { @@ -201,6 +184,8 @@ public NpgsqlDriver( sqlMapper: "SqlMapper.AddTypeHandler(typeof(XmlDocument), new XmlDocumentTypeHandler());", sqlMapperImpl: XmlDocumentTypeHandler ), + + /* Geometric data types */ ["NpgsqlPoint"] = new( new() { @@ -271,6 +256,8 @@ public NpgsqlDriver( usingDirective: "NpgsqlTypes", sqlMapper: "RegisterNpgsqlTypeHandler();" ), + + /* Network data types */ ["NpgsqlCidr"] = new( new() { @@ -301,6 +288,32 @@ public NpgsqlDriver( usingDirective: "System.Net.NetworkInformation", sqlMapper: "RegisterNpgsqlTypeHandler();" ), + + /* Other data types */ + ["Guid"] = new( + new() + { + { "uuid", new() } + }, + readerFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + convertFunc: x => $"Guid.Parse({x}?.ToString())" + ), + ["byte[]"] = new( + new() + { + { "binary", new() }, + { "bit", new() }, + { "bytea", new() }, + { "blob", new() }, + { "longblob", new() }, + { "mediumblob", new() }, + { "tinyblob", new() }, + { "varbinary", new() } + }, + readerFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), ["object"] = new( new() { From 4ed56b1dfd36f61fe0e819b28ecb3f5c25fa94a4 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Mon, 11 Aug 2025 12:30:53 +0200 Subject: [PATCH 8/9] fix: seaparate array data types to their own table --- .../Templates/PostgresTests.cs | 24 +- end2end/EndToEndTests/NpgsqlDapperTester.cs | 1 + .../NpgsqlDapperTester.generated.cs | 23 +- end2end/EndToEndTests/NpgsqlTester.cs | 1 + .../EndToEndTests/NpgsqlTester.generated.cs | 23 +- .../EndToEndTestsLegacy/NpgsqlDapperTester.cs | 1 + .../NpgsqlDapperTester.generated.cs | 23 +- end2end/EndToEndTestsLegacy/NpgsqlTester.cs | 1 + .../NpgsqlTester.generated.cs | 23 +- examples/NpgsqlDapperExample/Models.cs | 17 +- examples/NpgsqlDapperExample/QuerySql.cs | 172 ++++- examples/NpgsqlDapperExample/request.json | 695 ++++++++++-------- examples/NpgsqlDapperExample/request.message | 157 ++-- examples/NpgsqlDapperLegacyExample/Models.cs | 17 +- .../NpgsqlDapperLegacyExample/QuerySql.cs | 172 ++++- .../NpgsqlDapperLegacyExample/request.json | 695 ++++++++++-------- .../NpgsqlDapperLegacyExample/request.message | 157 ++-- examples/NpgsqlExample/Models.cs | 5 +- examples/NpgsqlExample/QuerySql.cs | 276 +++++-- examples/NpgsqlExample/request.json | 695 ++++++++++-------- examples/NpgsqlExample/request.message | 157 ++-- examples/NpgsqlLegacyExample/Models.cs | 17 +- examples/NpgsqlLegacyExample/QuerySql.cs | 309 ++++++-- examples/NpgsqlLegacyExample/request.json | 695 ++++++++++-------- examples/NpgsqlLegacyExample/request.message | 157 ++-- examples/config/postgresql/query.sql | 64 +- examples/config/postgresql/schema.sql | 21 +- 27 files changed, 2728 insertions(+), 1870 deletions(-) diff --git a/end2end/EndToEndScaffold/Templates/PostgresTests.cs b/end2end/EndToEndScaffold/Templates/PostgresTests.cs index 91df06db..52cbc6c3 100644 --- a/end2end/EndToEndScaffold/Templates/PostgresTests.cs +++ b/end2end/EndToEndScaffold/Templates/PostgresTests.cs @@ -225,7 +225,7 @@ public async Task TestPostgresArrayTypes( DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -236,7 +236,7 @@ await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -246,10 +246,10 @@ await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -597,21 +597,25 @@ public async Task TestArrayCopyFrom( byte[] cBytea) { var batchArgs = Enumerable.Range(0, batchSize) - .Select(_ => new QuerySql.InsertPostgresTypesBatchArgs + .Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }) .ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); + + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.CBytea, Is.EqualTo(expected.CBytea)); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } """ }, diff --git a/end2end/EndToEndTests/NpgsqlDapperTester.cs b/end2end/EndToEndTests/NpgsqlDapperTester.cs index 2a702193..425855b6 100644 --- a/end2end/EndToEndTests/NpgsqlDapperTester.cs +++ b/end2end/EndToEndTests/NpgsqlDapperTester.cs @@ -16,5 +16,6 @@ public async Task EmptyTestsTable() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } \ No newline at end of file diff --git a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs index 690e12c7..7acfb102 100644 --- a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs @@ -406,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -417,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -700,16 +700,19 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases diff --git a/end2end/EndToEndTests/NpgsqlTester.cs b/end2end/EndToEndTests/NpgsqlTester.cs index 2eb7aa13..39093f3e 100644 --- a/end2end/EndToEndTests/NpgsqlTester.cs +++ b/end2end/EndToEndTests/NpgsqlTester.cs @@ -16,5 +16,6 @@ public async Task EmptyTestsTables() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } \ No newline at end of file diff --git a/end2end/EndToEndTests/NpgsqlTester.generated.cs b/end2end/EndToEndTests/NpgsqlTester.generated.cs index cde9b950..0bf4630a 100644 --- a/end2end/EndToEndTests/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlTester.generated.cs @@ -406,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -417,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual.Value); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -700,16 +700,19 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Value.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.Value.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases diff --git a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs index afd0968b..faf30835 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs @@ -16,6 +16,7 @@ public async Task EmptyTestsTable() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } } \ No newline at end of file diff --git a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs index 094cc5c9..c96eab8b 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs @@ -406,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -417,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -700,16 +700,19 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases diff --git a/end2end/EndToEndTestsLegacy/NpgsqlTester.cs b/end2end/EndToEndTestsLegacy/NpgsqlTester.cs index 0bdc3dbb..202843f4 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlTester.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlTester.cs @@ -16,6 +16,7 @@ public async Task EmptyTestsTable() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } } \ No newline at end of file diff --git a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs index 78cf4a3c..233f3dcd 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs @@ -406,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -417,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -700,16 +700,19 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases diff --git a/examples/NpgsqlDapperExample/Models.cs b/examples/NpgsqlDapperExample/Models.cs index 1a7d2df9..17307005 100644 --- a/examples/NpgsqlDapperExample/Models.cs +++ b/examples/NpgsqlDapperExample/Models.cs @@ -53,13 +53,6 @@ public class PostgresType public PhysicalAddress? CMacaddr { get; init; } public string? CMacaddr8 { get; init; } public Guid? CUuid { get; init; } - public byte[]? CBytea { get; init; } - public bool[]? CBooleanArray { get; init; } - public string[]? CTextArray { get; init; } - public int[]? CIntegerArray { get; init; } - public decimal[]? CDecimalArray { get; init; } - public DateTime[]? CDateArray { get; init; } - public DateTime[]? CTimestampArray { get; init; } }; public class PostgresGeometricType { @@ -70,4 +63,14 @@ public class PostgresGeometricType public NpgsqlPath? CPath { get; init; } public NpgsqlPolygon? CPolygon { get; init; } public NpgsqlCircle? CCircle { get; init; } +}; +public class PostgresArrayType +{ + public byte[]? CBytea { get; init; } + public bool[]? CBooleanArray { get; init; } + public string[]? CTextArray { get; init; } + public int[]? CIntegerArray { get; init; } + public decimal[]? CDecimalArray { get; init; } + public DateTime[]? CDateArray { get; init; } + public DateTime[]? CTimestampArray { get; init; } }; \ No newline at end of file diff --git a/examples/NpgsqlDapperExample/QuerySql.cs b/examples/NpgsqlDapperExample/QuerySql.cs index 2749ed1d..9aa99e01 100644 --- a/examples/NpgsqlDapperExample/QuerySql.cs +++ b/examples/NpgsqlDapperExample/QuerySql.cs @@ -529,7 +529,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; init; } @@ -562,13 +562,6 @@ public class InsertPostgresTypesArgs public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } public string? CMacaddr8 { get; init; } - public byte[]? CBytea { get; init; } - public bool[]? CBooleanArray { get; init; } - public string[]? CTextArray { get; init; } - public int[]? CIntegerArray { get; init; } - public decimal[]? CDecimalArray { get; init; } - public DateTime[]? CDateArray { get; init; } - public DateTime[]? CTimestampArray { get; init; } }; public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { @@ -603,13 +596,6 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) queryParams.Add("c_inet", args.CInet); queryParams.Add("c_macaddr", args.CMacaddr); queryParams.Add("c_macaddr8", args.CMacaddr8); - queryParams.Add("c_bytea", args.CBytea); - queryParams.Add("c_boolean_array", args.CBooleanArray); - queryParams.Add("c_text_array", args.CTextArray); - queryParams.Add("c_integer_array", args.CIntegerArray); - queryParams.Add("c_decimal_array", args.CDecimalArray); - queryParams.Add("c_date_array", args.CDateArray); - queryParams.Add("c_timestamp_array", args.CTimestampArray); if (this.Transaction == null) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -628,7 +614,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) await this.Transaction.Connection.ExecuteAsync(InsertPostgresTypesSql, queryParams, transaction: this.Transaction); } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; init; } @@ -651,7 +637,6 @@ public class InsertPostgresTypesBatchArgs public string? CBpchar { get; init; } public string? CText { get; init; } public Guid? CUuid { get; init; } - public byte[]? CBytea { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } @@ -686,7 +671,6 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar); await writer.WriteAsync(row.CText); await writer.WriteAsync(row.CUuid); - await writer.WriteAsync(row.CBytea); await writer.WriteAsync(row.CCidr); await writer.WriteAsync(row.CInet); await writer.WriteAsync(row.CMacaddr); @@ -699,7 +683,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; init; } @@ -732,13 +716,6 @@ public class GetPostgresTypesRow public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } public string? CMacaddr8 { get; init; } - public byte[]? CBytea { get; init; } - public bool[]? CBooleanArray { get; init; } - public string[]? CTextArray { get; init; } - public int[]? CIntegerArray { get; init; } - public decimal[]? CDecimalArray { get; init; } - public DateTime[]? CDateArray { get; init; } - public DateTime[]? CTimestampArray { get; init; } }; public async Task GetPostgresTypes() { @@ -759,7 +736,7 @@ public class GetPostgresTypesRow return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresTypesSql, transaction: this.Transaction); } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; init; } @@ -782,7 +759,6 @@ public class GetPostgresTypesCntRow public string? CBpchar { get; init; } public string? CText { get; init; } public Guid? CUuid { get; init; } - public byte[]? CBytea { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } @@ -980,4 +956,144 @@ public async Task TruncatePostgresGeoTypes() await this.Transaction.Connection.ExecuteAsync(TruncatePostgresGeoTypesSql, transaction: this.Transaction); } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public class InsertPostgresArrayTypesArgs + { + public byte[]? CBytea { get; init; } + public bool[]? CBooleanArray { get; init; } + public string[]? CTextArray { get; init; } + public int[]? CIntegerArray { get; init; } + public decimal[]? CDecimalArray { get; init; } + public DateTime[]? CDateArray { get; init; } + public DateTime[]? CTimestampArray { get; init; } + }; + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + var queryParams = new Dictionary(); + queryParams.Add("c_bytea", args.CBytea); + queryParams.Add("c_boolean_array", args.CBooleanArray); + queryParams.Add("c_text_array", args.CTextArray); + queryParams.Add("c_integer_array", args.CIntegerArray); + queryParams.Add("c_decimal_array", args.CDecimalArray); + queryParams.Add("c_date_array", args.CDateArray); + queryParams.Add("c_timestamp_array", args.CTimestampArray); + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams, transaction: this.Transaction); + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public class GetPostgresArrayTypesRow + { + public byte[]? CBytea { get; init; } + public bool[]? CBooleanArray { get; init; } + public string[]? CTextArray { get; init; } + public int[]? CIntegerArray { get; init; } + public decimal[]? CDecimalArray { get; init; } + public DateTime[]? CDateArray { get; init; } + public DateTime[]? CTimestampArray { get; init; } + }; + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql, transaction: this.Transaction); + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public class InsertPostgresArrayTypesBatchArgs + { + public byte[]? CBytea { get; init; } + }; + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public class GetPostgresArrayTypesCntRow + { + public byte[]? CBytea { get; init; } + public required long Cnt { get; init; } + }; + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql, transaction: this.Transaction); + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(TruncatePostgresArrayTypesSql); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(TruncatePostgresArrayTypesSql, transaction: this.Transaction); + } } \ No newline at end of file diff --git a/examples/NpgsqlDapperExample/request.json b/examples/NpgsqlDapperExample/request.json index c5c66463..01395abb 100644 --- a/examples/NpgsqlDapperExample/request.json +++ b/examples/NpgsqlDapperExample/request.json @@ -433,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33200,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33641,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 31, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 32, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 37, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33773,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34079,21 +33962,6 @@ }, { "number": 21, - "column": { - "name": "c_bytea", - "length": -1, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 22, "column": { "name": "c_cidr", "length": -1, @@ -34108,7 +33976,7 @@ } }, { - "number": 23, + "number": 22, "column": { "name": "c_inet", "length": -1, @@ -34123,7 +33991,7 @@ } }, { - "number": 24, + "number": 23, "column": { "name": "c_macaddr", "length": -1, @@ -34144,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34490,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34827,17 +34602,6 @@ }, "originalName": "c_uuid" }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, { "name": "c_cidr", "length": -1, @@ -35246,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlDapperExample/request.message b/examples/NpgsqlDapperExample/request.message index 031fadb1..03c0b07e 100644 --- a/examples/NpgsqlDapperExample/request.message +++ b/examples/NpgsqlDapperExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb examples/NpgsqlDapperExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlDapperExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":true}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -66,18 +66,7 @@ c_jsonpath0 c_macaddr80Rpostgres_typesb macaddr8- -c_uuid0Rpostgres_typesbuuid/ -c_bytea0Rpostgres_typesbbyteaG -c_boolean_array 0Rpostgres_typesb -pg_catalogbool8 - c_text_array 0Rpostgres_typesbtextG -c_integer_array 0Rpostgres_typesb -pg_catalogint4J -c_decimal_array 0Rpostgres_typesb -pg_catalognumeric8 - c_date_array 0Rpostgres_typesbdateN -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestamp +c_uuid0Rpostgres_typesbuuid postgres_geometric_types9 c_point0Rpostgres_geometric_typesbpoint7 c_line0Rpostgres_geometric_typesbline7 @@ -85,7 +74,19 @@ pg_catalog timestamp c_box0Rpostgres_geometric_typesbbox7 c_path0Rpostgres_geometric_typesbpath= c_polygon0Rpostgres_geometric_typesb polygon; -c_circle0Rpostgres_geometric_typesbcircle" pg_temp" +c_circle0Rpostgres_geometric_typesbcircle +postgres_array_types5 +c_bytea0Rpostgres_array_typesbbyteaM +c_boolean_array 0Rpostgres_array_typesb +pg_catalogbool> + c_text_array 0Rpostgres_array_typesbtextM +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4P +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumeric> + c_date_array 0Rpostgres_array_typesbdateT +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestamp" pg_temp" pg_catalog & @@ -10297,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10329,14 +10330,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10368,14 +10362,7 @@ VALUES ( $27, $28, $29::macaddr, - $30::macaddr8, - $31, - $32, - $33, - $34, - $35, - $36, - $37 + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10415,15 +10402,8 @@ c_jsonpath0 c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10425,6 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10473,8 +10452,7 @@ VALUES ( $20, $21, $22, - $23, - $24 + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10500,12 +10478,11 @@ c_interval*NJ c_character_varying0Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= -c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= -c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= -c_inet0Rpublicpostgres_typesbinetzc_inet*JF - c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types -SELECT +c_uuid0Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10535,14 +10512,7 @@ c_interval*NJ c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0Rpostgres_typesb @@ -10598,19 +10568,8 @@ c_jsonpath"2 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80btext"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0Rpostgres_typesb -pg_catalogboolzc_boolean_array"F - c_text_array 0Rpostgres_typesbtextz c_text_array"X -c_integer_array 0Rpostgres_typesb -pg_catalogint4zc_integer_array"[ -c_decimal_array 0Rpostgres_typesb -pg_catalognumericzc_decimal_array"F - c_date_array 0Rpostgres_typesbdatez c_date_array"a -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +c_macaddr80btext: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10631,7 +10590,6 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr, @@ -10658,7 +10616,6 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10701,8 +10658,7 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 -c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_uuid0Rpostgres_typesbuuidzc_uuid"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr" @@ -10749,4 +10705,51 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlDapperExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql +INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_array*XT + c_text_array 0Rpublicpostgres_array_typesbtextz c_text_array*ie +c_integer_array 0Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_array*lh +c_decimal_array 0Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_array*XT + c_date_array 0Rpublicpostgres_array_typesbdatez c_date_array*rn +c_timestamp_array 0Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_array_types +SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0Rpostgres_array_typesb +pg_catalogboolzc_boolean_array"L + c_text_array 0Rpostgres_array_typesbtextz c_text_array"^ +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4zc_integer_array"a +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumericzc_decimal_array"L + c_date_array 0Rpostgres_array_typesbdatez c_date_array"g +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_array: query.sql +BINSERT INTO postgres_array_types ( + c_bytea +) +VALUES ( + $1 +)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea" +cnt0@bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlDapperExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/NpgsqlDapperLegacyExample/Models.cs b/examples/NpgsqlDapperLegacyExample/Models.cs index 972f76b6..b495a364 100644 --- a/examples/NpgsqlDapperLegacyExample/Models.cs +++ b/examples/NpgsqlDapperLegacyExample/Models.cs @@ -54,13 +54,6 @@ public class PostgresType public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public class PostgresGeometricType { @@ -72,4 +65,14 @@ public class PostgresGeometricType public NpgsqlPolygon? CPolygon { get; set; } public NpgsqlCircle? CCircle { get; set; } }; + public class PostgresArrayType + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; } \ No newline at end of file diff --git a/examples/NpgsqlDapperLegacyExample/QuerySql.cs b/examples/NpgsqlDapperLegacyExample/QuerySql.cs index c3a0341d..782d4024 100644 --- a/examples/NpgsqlDapperLegacyExample/QuerySql.cs +++ b/examples/NpgsqlDapperLegacyExample/QuerySql.cs @@ -530,7 +530,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; set; } @@ -563,13 +563,6 @@ public class InsertPostgresTypesArgs public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { @@ -604,13 +597,6 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) queryParams.Add("c_inet", args.CInet); queryParams.Add("c_macaddr", args.CMacaddr); queryParams.Add("c_macaddr8", args.CMacaddr8); - queryParams.Add("c_bytea", args.CBytea); - queryParams.Add("c_boolean_array", args.CBooleanArray); - queryParams.Add("c_text_array", args.CTextArray); - queryParams.Add("c_integer_array", args.CIntegerArray); - queryParams.Add("c_decimal_array", args.CDecimalArray); - queryParams.Add("c_date_array", args.CDateArray); - queryParams.Add("c_timestamp_array", args.CTimestampArray); if (this.Transaction == null) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -629,7 +615,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) await this.Transaction.Connection.ExecuteAsync(InsertPostgresTypesSql, queryParams, transaction: this.Transaction); } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; set; } @@ -652,7 +638,6 @@ public class InsertPostgresTypesBatchArgs public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } @@ -687,7 +672,6 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar); await writer.WriteAsync(row.CText); await writer.WriteAsync(row.CUuid); - await writer.WriteAsync(row.CBytea); await writer.WriteAsync(row.CCidr); await writer.WriteAsync(row.CInet); await writer.WriteAsync(row.CMacaddr); @@ -700,7 +684,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; set; } @@ -733,13 +717,6 @@ public class GetPostgresTypesRow public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task GetPostgresTypes() { @@ -760,7 +737,7 @@ public async Task GetPostgresTypes() return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresTypesSql, transaction: this.Transaction); } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; set; } @@ -783,7 +760,6 @@ public class GetPostgresTypesCntRow public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } @@ -981,5 +957,145 @@ public async Task TruncatePostgresGeoTypes() await this.Transaction.Connection.ExecuteAsync(TruncatePostgresGeoTypesSql, transaction: this.Transaction); } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public class InsertPostgresArrayTypesArgs + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + var queryParams = new Dictionary(); + queryParams.Add("c_bytea", args.CBytea); + queryParams.Add("c_boolean_array", args.CBooleanArray); + queryParams.Add("c_text_array", args.CTextArray); + queryParams.Add("c_integer_array", args.CIntegerArray); + queryParams.Add("c_decimal_array", args.CDecimalArray); + queryParams.Add("c_date_array", args.CDateArray); + queryParams.Add("c_timestamp_array", args.CTimestampArray); + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams, transaction: this.Transaction); + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public class GetPostgresArrayTypesRow + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql, transaction: this.Transaction); + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public class InsertPostgresArrayTypesBatchArgs + { + public byte[] CBytea { get; set; } + }; + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public class GetPostgresArrayTypesCntRow + { + public byte[] CBytea { get; set; } + public long Cnt { get; set; } + }; + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql, transaction: this.Transaction); + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(TruncatePostgresArrayTypesSql); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(TruncatePostgresArrayTypesSql, transaction: this.Transaction); + } } } \ No newline at end of file diff --git a/examples/NpgsqlDapperLegacyExample/request.json b/examples/NpgsqlDapperLegacyExample/request.json index 2fc813ff..785e3883 100644 --- a/examples/NpgsqlDapperLegacyExample/request.json +++ b/examples/NpgsqlDapperLegacyExample/request.json @@ -433,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33200,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33641,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 31, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 32, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 37, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33773,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34079,21 +33962,6 @@ }, { "number": 21, - "column": { - "name": "c_bytea", - "length": -1, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 22, "column": { "name": "c_cidr", "length": -1, @@ -34108,7 +33976,7 @@ } }, { - "number": 23, + "number": 22, "column": { "name": "c_inet", "length": -1, @@ -34123,7 +33991,7 @@ } }, { - "number": 24, + "number": 23, "column": { "name": "c_macaddr", "length": -1, @@ -34144,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34490,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34827,17 +34602,6 @@ }, "originalName": "c_uuid" }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, { "name": "c_cidr", "length": -1, @@ -35246,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlDapperLegacyExample/request.message b/examples/NpgsqlDapperLegacyExample/request.message index d452e4e6..8970afdc 100644 --- a/examples/NpgsqlDapperLegacyExample/request.message +++ b/examples/NpgsqlDapperLegacyExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb "examples/NpgsqlDapperLegacyExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlDapperLegacyExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":true}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -66,18 +66,7 @@ c_jsonpath0 c_macaddr80Rpostgres_typesb macaddr8- -c_uuid0Rpostgres_typesbuuid/ -c_bytea0Rpostgres_typesbbyteaG -c_boolean_array 0Rpostgres_typesb -pg_catalogbool8 - c_text_array 0Rpostgres_typesbtextG -c_integer_array 0Rpostgres_typesb -pg_catalogint4J -c_decimal_array 0Rpostgres_typesb -pg_catalognumeric8 - c_date_array 0Rpostgres_typesbdateN -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestamp +c_uuid0Rpostgres_typesbuuid postgres_geometric_types9 c_point0Rpostgres_geometric_typesbpoint7 c_line0Rpostgres_geometric_typesbline7 @@ -85,7 +74,19 @@ pg_catalog timestamp c_box0Rpostgres_geometric_typesbbox7 c_path0Rpostgres_geometric_typesbpath= c_polygon0Rpostgres_geometric_typesb polygon; -c_circle0Rpostgres_geometric_typesbcircle" pg_temp" +c_circle0Rpostgres_geometric_typesbcircle +postgres_array_types5 +c_bytea0Rpostgres_array_typesbbyteaM +c_boolean_array 0Rpostgres_array_typesb +pg_catalogbool> + c_text_array 0Rpostgres_array_typesbtextM +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4P +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumeric> + c_date_array 0Rpostgres_array_typesbdateT +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestamp" pg_temp" pg_catalog & @@ -10297,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10329,14 +10330,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10368,14 +10362,7 @@ VALUES ( $27, $28, $29::macaddr, - $30::macaddr8, - $31, - $32, - $33, - $34, - $35, - $36, - $37 + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10415,15 +10402,8 @@ c_jsonpath0 c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10425,6 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10473,8 +10452,7 @@ VALUES ( $20, $21, $22, - $23, - $24 + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10500,12 +10478,11 @@ c_interval*NJ c_character_varying0Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= -c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= -c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= -c_inet0Rpublicpostgres_typesbinetzc_inet*JF - c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types -SELECT +c_uuid0Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10535,14 +10512,7 @@ c_interval*NJ c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0Rpostgres_typesb @@ -10598,19 +10568,8 @@ c_jsonpath"2 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80btext"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0Rpostgres_typesb -pg_catalogboolzc_boolean_array"F - c_text_array 0Rpostgres_typesbtextz c_text_array"X -c_integer_array 0Rpostgres_typesb -pg_catalogint4zc_integer_array"[ -c_decimal_array 0Rpostgres_typesb -pg_catalognumericzc_decimal_array"F - c_date_array 0Rpostgres_typesbdatez c_date_array"a -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +c_macaddr80btext: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10631,7 +10590,6 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr, @@ -10658,7 +10616,6 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10701,8 +10658,7 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 -c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_uuid0Rpostgres_typesbuuidzc_uuid"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr" @@ -10749,4 +10705,51 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlDapperLegacyExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql +INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_array*XT + c_text_array 0Rpublicpostgres_array_typesbtextz c_text_array*ie +c_integer_array 0Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_array*lh +c_decimal_array 0Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_array*XT + c_date_array 0Rpublicpostgres_array_typesbdatez c_date_array*rn +c_timestamp_array 0Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_array_types +SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0Rpostgres_array_typesb +pg_catalogboolzc_boolean_array"L + c_text_array 0Rpostgres_array_typesbtextz c_text_array"^ +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4zc_integer_array"a +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumericzc_decimal_array"L + c_date_array 0Rpostgres_array_typesbdatez c_date_array"g +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_array: query.sql +BINSERT INTO postgres_array_types ( + c_bytea +) +VALUES ( + $1 +)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea" +cnt0@bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlDapperLegacyExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/NpgsqlExample/Models.cs b/examples/NpgsqlExample/Models.cs index 142869b2..ead0cb95 100644 --- a/examples/NpgsqlExample/Models.cs +++ b/examples/NpgsqlExample/Models.cs @@ -10,5 +10,6 @@ namespace NpgsqlExampleGen; public readonly record struct Author(long Id, string Name, string? Bio); public readonly record struct Book(Guid Id, string Name, long AuthorId, string? Description); -public readonly record struct PostgresType(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CNumeric, float? CReal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, JsonElement? CJson, JsonElement? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, Guid? CUuid, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); -public readonly record struct PostgresGeometricType(NpgsqlPoint? CPoint, NpgsqlLine? CLine, NpgsqlLSeg? CLseg, NpgsqlBox? CBox, NpgsqlPath? CPath, NpgsqlPolygon? CPolygon, NpgsqlCircle? CCircle); \ No newline at end of file +public readonly record struct PostgresType(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CNumeric, float? CReal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, JsonElement? CJson, JsonElement? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, Guid? CUuid); +public readonly record struct PostgresGeometricType(NpgsqlPoint? CPoint, NpgsqlLine? CLine, NpgsqlLSeg? CLseg, NpgsqlBox? CBox, NpgsqlPath? CPath, NpgsqlPolygon? CPolygon, NpgsqlCircle? CCircle); +public readonly record struct PostgresArrayType(byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); \ No newline at end of file diff --git a/examples/NpgsqlExample/QuerySql.cs b/examples/NpgsqlExample/QuerySql.cs index fbfab25f..8034e3f0 100644 --- a/examples/NpgsqlExample/QuerySql.cs +++ b/examples/NpgsqlExample/QuerySql.cs @@ -654,8 +654,8 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; - public readonly record struct InsertPostgresTypesArgs(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; + public readonly record struct InsertPostgresTypesArgs(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8); public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { if (this.Transaction == null) @@ -694,13 +694,6 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -747,19 +740,12 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; - public readonly record struct InsertPostgresTypesBatchArgs(bool? CBoolean, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr); + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; + public readonly record struct InsertPostgresTypesBatchArgs(bool? CBoolean, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr); public async Task InsertPostgresTypesBatch(List args) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -790,7 +776,6 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar ?? (object)DBNull.Value); await writer.WriteAsync(row.CText ?? (object)DBNull.Value); await writer.WriteAsync(row.CUuid ?? (object)DBNull.Value); - await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); await writer.WriteAsync(row.CCidr ?? (object)DBNull.Value); await writer.WriteAsync(row.CInet ?? (object)DBNull.Value); await writer.WriteAsync(row.CMacaddr ?? (object)DBNull.Value); @@ -803,8 +788,8 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; - public readonly record struct GetPostgresTypesRow(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; + public readonly record struct GetPostgresTypesRow(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8); public async Task GetPostgresTypes() { if (this.Transaction == null) @@ -853,14 +838,7 @@ public async Task InsertPostgresTypesBatch(List ar CCidr = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), - CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), - CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -919,14 +897,7 @@ public async Task InsertPostgresTypesBatch(List ar CCidr = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), - CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), - CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -935,8 +906,8 @@ public async Task InsertPostgresTypesBatch(List ar return null; } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; - public readonly record struct GetPostgresTypesCntRow(short? CSmallint, bool? CBoolean, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, long Cnt); + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; + public readonly record struct GetPostgresTypesCntRow(short? CSmallint, bool? CBoolean, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, long Cnt); public async Task GetPostgresTypesCnt() { if (this.Transaction == null) @@ -971,11 +942,10 @@ public async Task InsertPostgresTypesBatch(List ar CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - CCidr = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), - CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), - CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), - Cnt = reader.GetInt64(24) + CCidr = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -1020,11 +990,10 @@ public async Task InsertPostgresTypesBatch(List ar CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - CCidr = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), - CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), - CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), - Cnt = reader.GetInt64(24) + CCidr = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -1278,4 +1247,213 @@ public async Task TruncatePostgresGeoTypes() await command.ExecuteNonQueryAsync(); } } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public readonly record struct InsertPostgresArrayTypesArgs(byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(InsertPostgresArrayTypesSql)) + { + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = InsertPostgresArrayTypesSql; + command.Transaction = this.Transaction; + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public readonly record struct GetPostgresArrayTypesRow(byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + + return null; + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public readonly record struct InsertPostgresArrayTypesBatchArgs(byte[]? CBytea); + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public readonly record struct GetPostgresArrayTypesCntRow(byte[]? CBytea, long Cnt); + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesCntSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesCntSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + + return null; + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(TruncatePostgresArrayTypesSql)) + { + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = TruncatePostgresArrayTypesSql; + command.Transaction = this.Transaction; + await command.ExecuteNonQueryAsync(); + } + } } \ No newline at end of file diff --git a/examples/NpgsqlExample/request.json b/examples/NpgsqlExample/request.json index 560c3443..0bc60d39 100644 --- a/examples/NpgsqlExample/request.json +++ b/examples/NpgsqlExample/request.json @@ -433,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33200,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33641,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 31, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 32, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 37, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33773,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34079,21 +33962,6 @@ }, { "number": 21, - "column": { - "name": "c_bytea", - "length": -1, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 22, "column": { "name": "c_cidr", "length": -1, @@ -34108,7 +33976,7 @@ } }, { - "number": 23, + "number": 22, "column": { "name": "c_inet", "length": -1, @@ -34123,7 +33991,7 @@ } }, { - "number": 24, + "number": 23, "column": { "name": "c_macaddr", "length": -1, @@ -34144,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34490,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34827,17 +34602,6 @@ }, "originalName": "c_uuid" }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, { "name": "c_cidr", "length": -1, @@ -35246,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlExample/request.message b/examples/NpgsqlExample/request.message index 55aca1e9..9be3a219 100644 --- a/examples/NpgsqlExample/request.message +++ b/examples/NpgsqlExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb examples/NpgsqlExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":false}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -66,18 +66,7 @@ c_jsonpath0 c_macaddr80Rpostgres_typesb macaddr8- -c_uuid0Rpostgres_typesbuuid/ -c_bytea0Rpostgres_typesbbyteaG -c_boolean_array 0Rpostgres_typesb -pg_catalogbool8 - c_text_array 0Rpostgres_typesbtextG -c_integer_array 0Rpostgres_typesb -pg_catalogint4J -c_decimal_array 0Rpostgres_typesb -pg_catalognumeric8 - c_date_array 0Rpostgres_typesbdateN -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestamp +c_uuid0Rpostgres_typesbuuid postgres_geometric_types9 c_point0Rpostgres_geometric_typesbpoint7 c_line0Rpostgres_geometric_typesbline7 @@ -85,7 +74,19 @@ pg_catalog timestamp c_box0Rpostgres_geometric_typesbbox7 c_path0Rpostgres_geometric_typesbpath= c_polygon0Rpostgres_geometric_typesb polygon; -c_circle0Rpostgres_geometric_typesbcircle" pg_temp" +c_circle0Rpostgres_geometric_typesbcircle +postgres_array_types5 +c_bytea0Rpostgres_array_typesbbyteaM +c_boolean_array 0Rpostgres_array_typesb +pg_catalogbool> + c_text_array 0Rpostgres_array_typesbtextM +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4P +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumeric> + c_date_array 0Rpostgres_array_typesbdateT +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestamp" pg_temp" pg_catalog & @@ -10297,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10329,14 +10330,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10368,14 +10362,7 @@ VALUES ( $27, $28, $29::macaddr, - $30::macaddr8, - $31, - $32, - $33, - $34, - $35, - $36, - $37 + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10415,15 +10402,8 @@ c_jsonpath0 c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10425,6 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10473,8 +10452,7 @@ VALUES ( $20, $21, $22, - $23, - $24 + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10500,12 +10478,11 @@ c_interval*NJ c_character_varying0Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= -c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= -c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= -c_inet0Rpublicpostgres_typesbinetzc_inet*JF - c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types -SELECT +c_uuid0Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10535,14 +10512,7 @@ c_interval*NJ c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0Rpostgres_typesb @@ -10598,19 +10568,8 @@ c_jsonpath"2 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80btext"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0Rpostgres_typesb -pg_catalogboolzc_boolean_array"F - c_text_array 0Rpostgres_typesbtextz c_text_array"X -c_integer_array 0Rpostgres_typesb -pg_catalogint4zc_integer_array"[ -c_decimal_array 0Rpostgres_typesb -pg_catalognumericzc_decimal_array"F - c_date_array 0Rpostgres_typesbdatez c_date_array"a -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +c_macaddr80btext: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10631,7 +10590,6 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr, @@ -10658,7 +10616,6 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10701,8 +10658,7 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 -c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_uuid0Rpostgres_typesbuuidzc_uuid"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr" @@ -10749,4 +10705,51 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql +INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_array*XT + c_text_array 0Rpublicpostgres_array_typesbtextz c_text_array*ie +c_integer_array 0Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_array*lh +c_decimal_array 0Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_array*XT + c_date_array 0Rpublicpostgres_array_typesbdatez c_date_array*rn +c_timestamp_array 0Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_array_types +SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0Rpostgres_array_typesb +pg_catalogboolzc_boolean_array"L + c_text_array 0Rpostgres_array_typesbtextz c_text_array"^ +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4zc_integer_array"a +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumericzc_decimal_array"L + c_date_array 0Rpostgres_array_typesbdatez c_date_array"g +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_array: query.sql +BINSERT INTO postgres_array_types ( + c_bytea +) +VALUES ( + $1 +)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea" +cnt0@bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/NpgsqlLegacyExample/Models.cs b/examples/NpgsqlLegacyExample/Models.cs index e99ce2e4..3778fa9f 100644 --- a/examples/NpgsqlLegacyExample/Models.cs +++ b/examples/NpgsqlLegacyExample/Models.cs @@ -54,13 +54,6 @@ public class PostgresType public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public class PostgresGeometricType { @@ -72,4 +65,14 @@ public class PostgresGeometricType public NpgsqlPolygon? CPolygon { get; set; } public NpgsqlCircle? CCircle { get; set; } }; + public class PostgresArrayType + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; } \ No newline at end of file diff --git a/examples/NpgsqlLegacyExample/QuerySql.cs b/examples/NpgsqlLegacyExample/QuerySql.cs index 6f19d0f4..c7df7495 100644 --- a/examples/NpgsqlLegacyExample/QuerySql.cs +++ b/examples/NpgsqlLegacyExample/QuerySql.cs @@ -752,7 +752,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; set; } @@ -785,13 +785,6 @@ public class InsertPostgresTypesArgs public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { @@ -831,13 +824,6 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -884,18 +870,11 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; set; } @@ -918,7 +897,6 @@ public class InsertPostgresTypesBatchArgs public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } @@ -953,7 +931,6 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar ?? (object)DBNull.Value); await writer.WriteAsync(row.CText ?? (object)DBNull.Value); await writer.WriteAsync(row.CUuid ?? (object)DBNull.Value); - await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); await writer.WriteAsync(row.CCidr ?? (object)DBNull.Value); await writer.WriteAsync(row.CInet ?? (object)DBNull.Value); await writer.WriteAsync(row.CMacaddr ?? (object)DBNull.Value); @@ -966,7 +943,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; set; } @@ -999,13 +976,6 @@ public class GetPostgresTypesRow public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task GetPostgresTypes() { @@ -1055,14 +1025,7 @@ public async Task GetPostgresTypes() CCidr = reader.IsDBNull(26) ? (NpgsqlCidr? )null : reader.GetFieldValue(26), CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), - CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), - CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -1121,14 +1084,7 @@ public async Task GetPostgresTypes() CCidr = reader.IsDBNull(26) ? (NpgsqlCidr? )null : reader.GetFieldValue(26), CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), - CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29), - CBytea = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CBooleanArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CTextArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CIntegerArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDecimalArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CDateArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CTimestampArray = reader.IsDBNull(36) ? null : reader.GetFieldValue(36) + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -1137,7 +1093,7 @@ public async Task GetPostgresTypes() return null; } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, c_cidr, c_inet, c_macaddr LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; set; } @@ -1160,7 +1116,6 @@ public class GetPostgresTypesCntRow public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } @@ -1200,11 +1155,10 @@ public async Task GetPostgresTypesCnt() CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? (Guid? )null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - CCidr = reader.IsDBNull(21) ? (NpgsqlCidr? )null : reader.GetFieldValue(21), - CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), - CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), - Cnt = reader.GetInt64(24) + CCidr = reader.IsDBNull(20) ? (NpgsqlCidr? )null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -1249,11 +1203,10 @@ public async Task GetPostgresTypesCnt() CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? (Guid? )null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - CCidr = reader.IsDBNull(21) ? (NpgsqlCidr? )null : reader.GetFieldValue(21), - CInet = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), - CMacaddr = reader.IsDBNull(23) ? null : reader.GetFieldValue(23), - Cnt = reader.GetInt64(24) + CCidr = reader.IsDBNull(20) ? (NpgsqlCidr? )null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -1539,5 +1492,239 @@ public async Task TruncatePostgresGeoTypes() await command.ExecuteNonQueryAsync(); } } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public class InsertPostgresArrayTypesArgs + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(InsertPostgresArrayTypesSql)) + { + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = InsertPostgresArrayTypesSql; + command.Transaction = this.Transaction; + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public class GetPostgresArrayTypesRow + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + + return null; + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public class InsertPostgresArrayTypesBatchArgs + { + public byte[] CBytea { get; set; } + }; + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public class GetPostgresArrayTypesCntRow + { + public byte[] CBytea { get; set; } + public long Cnt { get; set; } + }; + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesCntSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesCntSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + + return null; + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(TruncatePostgresArrayTypesSql)) + { + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = TruncatePostgresArrayTypesSql; + command.Transaction = this.Transaction; + await command.ExecuteNonQueryAsync(); + } + } } } \ No newline at end of file diff --git a/examples/NpgsqlLegacyExample/request.json b/examples/NpgsqlLegacyExample/request.json index 1a262b90..48b90128 100644 --- a/examples/NpgsqlLegacyExample/request.json +++ b/examples/NpgsqlLegacyExample/request.json @@ -433,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33200,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8,\n $31, \n $32,\n $33, \n $34,\n $35,\n $36,\n $37\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33641,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 31, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 32, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 37, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33773,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23,\n $24\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34079,21 +33962,6 @@ }, { "number": 21, - "column": { - "name": "c_bytea", - "length": -1, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 22, "column": { "name": "c_cidr", "length": -1, @@ -34108,7 +33976,7 @@ } }, { - "number": 23, + "number": 22, "column": { "name": "c_inet", "length": -1, @@ -34123,7 +33991,7 @@ } }, { - "number": 24, + "number": 23, "column": { "name": "c_macaddr", "length": -1, @@ -34144,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34490,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34827,17 +34602,6 @@ }, "originalName": "c_uuid" }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, { "name": "c_cidr", "length": -1, @@ -35246,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlLegacyExample/request.message b/examples/NpgsqlLegacyExample/request.message index 2539857c..afce44f5 100644 --- a/examples/NpgsqlLegacyExample/request.message +++ b/examples/NpgsqlLegacyExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb examples/NpgsqlLegacyExamplecsharp{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlLegacyExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":false}* -./dist/LocalRunner public"public +./dist/LocalRunner public"public authors) id0R authorsb  bigserial& name0R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0Rbooksbtext5 author_id0Rbooksb pg_catalogint8) - description0Rbooksbtext + description0Rbooksbtext postgres_types< c_boolean0Rpostgres_typesb pg_catalogbool7 @@ -66,18 +66,7 @@ c_jsonpath0 c_macaddr80Rpostgres_typesb macaddr8- -c_uuid0Rpostgres_typesbuuid/ -c_bytea0Rpostgres_typesbbyteaG -c_boolean_array 0Rpostgres_typesb -pg_catalogbool8 - c_text_array 0Rpostgres_typesbtextG -c_integer_array 0Rpostgres_typesb -pg_catalogint4J -c_decimal_array 0Rpostgres_typesb -pg_catalognumeric8 - c_date_array 0Rpostgres_typesbdateN -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestamp +c_uuid0Rpostgres_typesbuuid postgres_geometric_types9 c_point0Rpostgres_geometric_typesbpoint7 c_line0Rpostgres_geometric_typesbline7 @@ -85,7 +74,19 @@ pg_catalog timestamp c_box0Rpostgres_geometric_typesbbox7 c_path0Rpostgres_geometric_typesbpath= c_polygon0Rpostgres_geometric_typesb polygon; -c_circle0Rpostgres_geometric_typesbcircle" pg_temp" +c_circle0Rpostgres_geometric_typesbcircle +postgres_array_types5 +c_bytea0Rpostgres_array_typesbbyteaM +c_boolean_array 0Rpostgres_array_typesb +pg_catalogbool> + c_text_array 0Rpostgres_array_typesbtextM +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4P +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumeric> + c_date_array 0Rpostgres_array_typesbdateT +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestamp" pg_temp" pg_catalog & @@ -10297,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0R authorsbtextzname"( bio0R authorsbtextzbio" books0brbooks*.* -name0Rbooksbtextzname: query.sql -INSERT INTO postgres_types +name0Rbooksbtextzname: query.sql +INSERT INTO postgres_types ( c_boolean, c_bit, @@ -10329,14 +10330,7 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10368,14 +10362,7 @@ VALUES ( $27, $28, $29::macaddr, - $30::macaddr8, - $31, - $32, - $33, - $34, - $35, - $36, - $37 + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean08Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit08Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10415,15 +10402,8 @@ c_jsonpath0 c_macaddr0b macaddr*'# c_macaddr80b -macaddr8*FB -c_bytea08Rpublicpostgres_typesbbyteazc_bytea*e a -c_boolean_array 08Rpublicpostgres_typesbpg_catalog.boolzc_boolean_array*T!P - c_text_array 08Rpublicpostgres_typesbtextz c_text_array*e"a -c_integer_array 08Rpublicpostgres_typesbpg_catalog.int4zc_integer_array*h#d -c_decimal_array 08Rpublicpostgres_typesbpg_catalog.numericzc_decimal_array*T$P - c_date_array 08Rpublicpostgres_typesbdatez c_date_array*n%j -c_timestamp_array 08Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_types -INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_types +INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10445,7 +10425,6 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10473,8 +10452,7 @@ VALUES ( $20, $21, $22, - $23, - $24 + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10500,12 +10478,11 @@ c_interval*NJ c_character_varying0Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0Rpublicpostgres_typesbtextzc_text*A= -c_uuid0Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0Rpublicpostgres_typesbbyteazc_bytea*A= -c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= -c_inet0Rpublicpostgres_typesbinetzc_inet*JF - c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types -SELECT +c_uuid0Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_types +SELECT c_boolean, c_bit, c_smallint, @@ -10535,14 +10512,7 @@ c_interval*NJ c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0Rpostgres_typesb @@ -10598,19 +10568,8 @@ c_jsonpath"2 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80btext"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0Rpostgres_typesb -pg_catalogboolzc_boolean_array"F - c_text_array 0Rpostgres_typesbtextz c_text_array"X -c_integer_array 0Rpostgres_typesb -pg_catalogint4zc_integer_array"[ -c_decimal_array 0Rpostgres_typesb -pg_catalognumericzc_decimal_array"F - c_date_array 0Rpostgres_typesbdatez c_date_array"a -c_timestamp_array 0Rpostgres_typesb -pg_catalog timestampzc_timestamp_array: query.sql -SELECT +c_macaddr80btext: query.sql +SELECT c_smallint, c_boolean, c_integer, @@ -10631,7 +10590,6 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr, @@ -10658,7 +10616,6 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -10701,8 +10658,7 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0Rpostgres_typesbbpcharzc_bpchar"5 c_text0Rpostgres_typesbtextzc_text"5 -c_uuid0Rpostgres_typesbuuidzc_uuid"8 -c_bytea0Rpostgres_typesbbyteazc_bytea"5 +c_uuid0Rpostgres_typesbuuidzc_uuid"5 c_cidr0Rpostgres_typesbcidrzc_cidr"5 c_inet0Rpostgres_typesbinetzc_inet"> c_macaddr0Rpostgres_typesb macaddrz c_macaddr" @@ -10749,4 +10705,51 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlLegacyExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql +INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_array*XT + c_text_array 0Rpublicpostgres_array_typesbtextz c_text_array*ie +c_integer_array 0Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_array*lh +c_decimal_array 0Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_array*XT + c_date_array 0Rpublicpostgres_array_typesbdatez c_date_array*rn +c_timestamp_array 0Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_array: query.sqlBpostgres_array_types +SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0Rpostgres_array_typesb +pg_catalogboolzc_boolean_array"L + c_text_array 0Rpostgres_array_typesbtextz c_text_array"^ +c_integer_array 0Rpostgres_array_typesb +pg_catalogint4zc_integer_array"a +c_decimal_array 0Rpostgres_array_typesb +pg_catalognumericzc_decimal_array"L + c_date_array 0Rpostgres_array_typesbdatez c_date_array"g +c_timestamp_array 0Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_array: query.sql +BINSERT INTO postgres_array_types ( + c_bytea +) +VALUES ( + $1 +)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0Rpostgres_array_typesbbyteazc_bytea" +cnt0@bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0*{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlLegacyExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/config/postgresql/query.sql b/examples/config/postgresql/query.sql index 53dc81bb..085d6390 100644 --- a/examples/config/postgresql/query.sql +++ b/examples/config/postgresql/query.sql @@ -102,14 +102,7 @@ INSERT INTO postgres_types c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( sqlc.narg('c_boolean'), @@ -141,14 +134,7 @@ VALUES ( sqlc.narg('c_cidr'), sqlc.narg('c_inet'), sqlc.narg('c_macaddr')::macaddr, - sqlc.narg('c_macaddr8')::macaddr8, - sqlc.narg('c_bytea'), - sqlc.narg('c_boolean_array'), - sqlc.narg('c_text_array'), - sqlc.narg('c_integer_array'), - sqlc.narg('c_decimal_array'), - sqlc.narg('c_date_array'), - sqlc.narg('c_timestamp_array') + sqlc.narg('c_macaddr8')::macaddr8 ); -- name: InsertPostgresTypesBatch :copyfrom @@ -174,7 +160,6 @@ INSERT INTO postgres_types c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -202,8 +187,7 @@ VALUES ( $20, $21, $22, - $23, - $24 + $23 ); -- name: GetPostgresTypes :one @@ -237,14 +221,7 @@ SELECT c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1; @@ -270,7 +247,6 @@ SELECT c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr, @@ -297,7 +273,6 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea, c_cidr, c_inet, c_macaddr @@ -330,3 +305,34 @@ TRUNCATE TABLE postgres_types; -- name: TruncatePostgresGeoTypes :exec TRUNCATE TABLE postgres_geometric_types; + +-- name: InsertPostgresArrayTypes :exec +INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7); + +-- name: GetPostgresArrayTypes :one +SELECT * FROM postgres_array_types LIMIT 1; + +-- name: InsertPostgresArrayTypesBatch :copyfrom +INSERT INTO postgres_array_types (c_bytea) VALUES ($1); + +-- name: GetPostgresArrayTypesCnt :one +SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1; + +-- name: TruncatePostgresArrayTypes :exec +TRUNCATE TABLE postgres_array_types; \ No newline at end of file diff --git a/examples/config/postgresql/schema.sql b/examples/config/postgresql/schema.sql index ca9efe3a..62b03f38 100644 --- a/examples/config/postgresql/schema.sql +++ b/examples/config/postgresql/schema.sql @@ -55,16 +55,7 @@ CREATE TABLE postgres_types ( c_macaddr8 MACADDR8, /* Special Data Types */ - c_uuid UUID, - - /* Array Data Types */ - c_bytea BYTEA, - c_boolean_array BOOLEAN [], - c_text_array TEXT [], - c_integer_array INTEGER [], - c_decimal_array DECIMAL(10, 7) [], - c_date_array DATE [], - c_timestamp_array TIMESTAMP [] + c_uuid UUID ); CREATE TABLE postgres_geometric_types ( @@ -76,3 +67,13 @@ CREATE TABLE postgres_geometric_types ( c_polygon POLYGON, c_circle CIRCLE ); + +CREATE TABLE postgres_array_types ( + c_bytea BYTEA, + c_boolean_array BOOLEAN [], + c_text_array TEXT [], + c_integer_array INTEGER [], + c_decimal_array DECIMAL(10, 7) [], + c_date_array DATE [], + c_timestamp_array TIMESTAMP [] +); \ No newline at end of file From 741095fc0919209519ad220ddda2104976c56c75 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Mon, 11 Aug 2025 14:05:08 +0200 Subject: [PATCH 9/9] fix: regenerate code --- examples/NpgsqlDapperExample/request.json | 2 +- examples/NpgsqlDapperExample/request.message | 9 ++------- examples/NpgsqlDapperLegacyExample/request.json | 2 +- examples/NpgsqlDapperLegacyExample/request.message | 9 ++------- examples/NpgsqlExample/request.json | 2 +- examples/NpgsqlExample/request.message | 9 ++------- examples/NpgsqlLegacyExample/request.json | 2 +- examples/NpgsqlLegacyExample/request.message | 9 ++------- 8 files changed, 12 insertions(+), 32 deletions(-) diff --git a/examples/NpgsqlDapperExample/request.json b/examples/NpgsqlDapperExample/request.json index 01395abb..c7520d91 100644 --- a/examples/NpgsqlDapperExample/request.json +++ b/examples/NpgsqlDapperExample/request.json @@ -35241,7 +35241,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", "name": "InsertPostgresArrayTypesBatch", "cmd": ":copyfrom", "parameters": [ diff --git a/examples/NpgsqlDapperExample/request.message b/examples/NpgsqlDapperExample/request.message index 03c0b07e..8b05217a 100644 --- a/examples/NpgsqlDapperExample/request.message +++ b/examples/NpgsqlDapperExample/request.message @@ -10735,13 +10735,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"L c_date_array 0Rpostgres_array_typesbdatez c_date_array"g c_timestamp_array 0Rpostgres_array_typesb -pg_catalog timestampzc_timestamp_array: query.sql -BINSERT INTO postgres_array_types ( - c_bytea -) -VALUES ( - $1 -)InsertPostgresArrayTypesBatch :copyfrom*JF +pg_catalog timestampzc_timestamp_array: query.sql +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types ^SELECT c_bytea, diff --git a/examples/NpgsqlDapperLegacyExample/request.json b/examples/NpgsqlDapperLegacyExample/request.json index 785e3883..3360c681 100644 --- a/examples/NpgsqlDapperLegacyExample/request.json +++ b/examples/NpgsqlDapperLegacyExample/request.json @@ -35241,7 +35241,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", "name": "InsertPostgresArrayTypesBatch", "cmd": ":copyfrom", "parameters": [ diff --git a/examples/NpgsqlDapperLegacyExample/request.message b/examples/NpgsqlDapperLegacyExample/request.message index 8970afdc..0bf7eb12 100644 --- a/examples/NpgsqlDapperLegacyExample/request.message +++ b/examples/NpgsqlDapperLegacyExample/request.message @@ -10735,13 +10735,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"L c_date_array 0Rpostgres_array_typesbdatez c_date_array"g c_timestamp_array 0Rpostgres_array_typesb -pg_catalog timestampzc_timestamp_array: query.sql -BINSERT INTO postgres_array_types ( - c_bytea -) -VALUES ( - $1 -)InsertPostgresArrayTypesBatch :copyfrom*JF +pg_catalog timestampzc_timestamp_array: query.sql +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types ^SELECT c_bytea, diff --git a/examples/NpgsqlExample/request.json b/examples/NpgsqlExample/request.json index 0bc60d39..e9e6d63f 100644 --- a/examples/NpgsqlExample/request.json +++ b/examples/NpgsqlExample/request.json @@ -35241,7 +35241,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", "name": "InsertPostgresArrayTypesBatch", "cmd": ":copyfrom", "parameters": [ diff --git a/examples/NpgsqlExample/request.message b/examples/NpgsqlExample/request.message index 9be3a219..3d5a7604 100644 --- a/examples/NpgsqlExample/request.message +++ b/examples/NpgsqlExample/request.message @@ -10735,13 +10735,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"L c_date_array 0Rpostgres_array_typesbdatez c_date_array"g c_timestamp_array 0Rpostgres_array_typesb -pg_catalog timestampzc_timestamp_array: query.sql -BINSERT INTO postgres_array_types ( - c_bytea -) -VALUES ( - $1 -)InsertPostgresArrayTypesBatch :copyfrom*JF +pg_catalog timestampzc_timestamp_array: query.sql +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types ^SELECT c_bytea, diff --git a/examples/NpgsqlLegacyExample/request.json b/examples/NpgsqlLegacyExample/request.json index 48b90128..54141e9d 100644 --- a/examples/NpgsqlLegacyExample/request.json +++ b/examples/NpgsqlLegacyExample/request.json @@ -35241,7 +35241,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_array_types (\n c_bytea\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", "name": "InsertPostgresArrayTypesBatch", "cmd": ":copyfrom", "parameters": [ diff --git a/examples/NpgsqlLegacyExample/request.message b/examples/NpgsqlLegacyExample/request.message index afce44f5..f5579efe 100644 --- a/examples/NpgsqlLegacyExample/request.message +++ b/examples/NpgsqlLegacyExample/request.message @@ -10735,13 +10735,8 @@ pg_catalogint4zc_integer_array pg_catalognumericzc_decimal_array"L c_date_array 0Rpostgres_array_typesbdatez c_date_array"g c_timestamp_array 0Rpostgres_array_typesb -pg_catalog timestampzc_timestamp_array: query.sql -BINSERT INTO postgres_array_types ( - c_bytea -) -VALUES ( - $1 -)InsertPostgresArrayTypesBatch :copyfrom*JF +pg_catalog timestampzc_timestamp_array: query.sql +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF c_bytea0Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_types ^SELECT c_bytea,