From 454f536e1c8ac13ca9b4b87147bed022abaca160 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sat, 30 Aug 2025 19:39:26 +0200 Subject: [PATCH] fix: support Postgres JSON data types without cast and in batch insert --- Drivers/DbDriver.cs | 17 ---- Drivers/MySqlConnectorDriver.cs | 17 ++++ Drivers/NpgsqlDriver.cs | 25 +++++- docs/04_Postgres.md | 4 +- end2end/EndToEndScaffold/Config.cs | 2 + .../Templates/PostgresTests.cs | 47 +++++++++++ .../NpgsqlDapperTester.generated.cs | 34 ++++++++ .../EndToEndTests/NpgsqlTester.generated.cs | 34 ++++++++ .../NpgsqlDapperTester.generated.cs | 34 ++++++++ .../NpgsqlTester.generated.cs | 34 ++++++++ examples/NpgsqlDapperExample/QuerySql.cs | 16 ++-- examples/NpgsqlDapperExample/Utils.cs | 2 +- examples/NpgsqlDapperExample/request.json | 81 ++++++++++++++++--- examples/NpgsqlDapperExample/request.message | 73 +++++++++++------ .../NpgsqlDapperLegacyExample/QuerySql.cs | 16 ++-- examples/NpgsqlDapperLegacyExample/Utils.cs | 2 +- .../NpgsqlDapperLegacyExample/request.json | 81 ++++++++++++++++--- .../NpgsqlDapperLegacyExample/request.message | 73 +++++++++++------ examples/NpgsqlExample/QuerySql.cs | 28 ++++--- examples/NpgsqlExample/request.json | 81 ++++++++++++++++--- examples/NpgsqlExample/request.message | 73 +++++++++++------ examples/NpgsqlLegacyExample/QuerySql.cs | 28 ++++--- examples/NpgsqlLegacyExample/request.json | 81 ++++++++++++++++--- examples/NpgsqlLegacyExample/request.message | 73 +++++++++++------ examples/config/postgresql/types/query.sql | 37 ++++++--- sqlc.ci.yaml | 32 ++++++++ sqlc.local.generated.yaml | 32 ++++++++ sqlc.request.generated.yaml | 32 ++++++++ 28 files changed, 880 insertions(+), 209 deletions(-) diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index 1b95baa3..f0fe9089 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -57,23 +57,6 @@ public abstract class DbDriver protected abstract Dictionary ColumnMappings { get; } - protected const string JsonElementTypeHandler = """ - private class JsonElementTypeHandler : SqlMapper.TypeHandler - { - public override JsonElement Parse(object value) - { - if (value is string s) - return JsonDocument.Parse(s).RootElement; - throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); - } - - 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) { diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index f43f2574..f50c181a 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -156,6 +156,23 @@ public sealed partial class MySqlConnectorDriver( public override string TransactionClassName => "MySqlTransaction"; + private const string JsonElementTypeHandler = """ + private class JsonElementTypeHandler : SqlMapper.TypeHandler + { + public override JsonElement Parse(object value) + { + if (value is string s) + return JsonDocument.Parse(s).RootElement; + throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); + } + + public override void SetValue(IDbDataParameter parameter, JsonElement value) + { + parameter.Value = value.GetRawText(); + } + } + """; + public MemberDeclarationSyntax OneDeclare(string queryTextConstant, string argInterface, string returnInterface, Query query) { diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index 7ca821f5..6744aabe 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -143,16 +143,16 @@ public NpgsqlDriver( ["JsonElement"] = new( new() { - { "json", new() }, - { "jsonb", new() } + { "json", new(NpgsqlTypeOverride: "NpgsqlDbType.Json") }, + { "jsonb", new(NpgsqlTypeOverride: "NpgsqlDbType.Jsonb") } }, readerFn: ordinal => $"JsonSerializer.Deserialize(reader.GetString({ordinal}))", writerFn: (el, notNull, isDapper) => { if (notNull) - return $"{el}.GetRawText()"; + return $"{el}"; var nullValue = isDapper ? "null" : "(object)DBNull.Value"; - return $"{el}.HasValue ? {el}.Value.GetRawText() : {nullValue}"; + return $"{el}.HasValue ? (object) {el}.Value : {nullValue}"; }, usingDirective: "System.Text.Json", sqlMapper: "SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler());", @@ -345,6 +345,23 @@ public NpgsqlDriver( public override string TransactionClassName => "NpgsqlTransaction"; + private const string JsonElementTypeHandler = """ + private class JsonElementTypeHandler : SqlMapper.TypeHandler + { + public override JsonElement Parse(object value) + { + if (value is string s) + return JsonDocument.Parse(s).RootElement; + throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); + } + + public override void SetValue(IDbDataParameter parameter, JsonElement value) + { + parameter.Value = value; + } + } + """; + private const string XmlDocumentTypeHandler = """ private class XmlDocumentTypeHandler : SqlMapper.TypeHandler diff --git a/docs/04_Postgres.md b/docs/04_Postgres.md index fa0389a4..55354226 100644 --- a/docs/04_Postgres.md +++ b/docs/04_Postgres.md @@ -62,8 +62,8 @@ we consider support for the different data types separately for batch inserts an | tsvector | ✅ | ❌ | | tsquery | ✅ | ❌ | | uuid | ✅ | ✅ | -| json | ✅ | ⚠️ | -| jsonb | ✅ | ⚠️ | +| json | ✅ | ✅ | +| jsonb | ✅ | ✅ | | jsonpath | ✅ | ⚠️ | | xml | ✅ | ⚠️ | | enum | ✅ | ⚠️ | diff --git a/end2end/EndToEndScaffold/Config.cs b/end2end/EndToEndScaffold/Config.cs index f87f7d72..3d734c95 100644 --- a/end2end/EndToEndScaffold/Config.cs +++ b/end2end/EndToEndScaffold/Config.cs @@ -63,6 +63,7 @@ public enum KnownTestType PostgresFloatingPointCopyFrom, PostgresDateTimeCopyFrom, PostgresGuidCopyFrom, + PostgresJsonCopyFrom, PostgresNetworkCopyFrom, PostgresArrayCopyFrom, PostgresGeoCopyFrom, @@ -179,6 +180,7 @@ internal static class Config KnownTestType.PostgresFloatingPointCopyFrom, KnownTestType.PostgresDateTimeCopyFrom, KnownTestType.PostgresGuidCopyFrom, + KnownTestType.PostgresJsonCopyFrom, KnownTestType.PostgresArrayCopyFrom, KnownTestType.PostgresNetworkCopyFrom ]; diff --git a/end2end/EndToEndScaffold/Templates/PostgresTests.cs b/end2end/EndToEndScaffold/Templates/PostgresTests.cs index 1ed3c7dd..2f39564d 100644 --- a/end2end/EndToEndScaffold/Templates/PostgresTests.cs +++ b/end2end/EndToEndScaffold/Templates/PostgresTests.cs @@ -509,6 +509,53 @@ void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesRow x, QuerySql.GetPos } """ }, + [KnownTestType.PostgresJsonCopyFrom] = new TestImpl + { + Impl = $$""" + [Test] + [TestCase(100, "{\"song\": \"Pinball Wizard\", \"album\": \"Tommy\", \"artist\": \"The Who\"}")] + [TestCase(10, null)] + public async Task TestPostgresJsonCopyFrom(int batchSize, string cJson) + { + JsonElement? cParsedJson = null; + if (cJson != null) + cParsedJson = JsonDocument.Parse(cJson).RootElement; + + var batchArgs = Enumerable.Range(0, batchSize) + .Select(_ => new QuerySql.InsertPostgresSpecialTypesBatchArgs + { + CJson = cParsedJson, + CJsonb = cParsedJson + }) + .ToList(); + await QuerySql.InsertPostgresSpecialTypesBatch(batchArgs); + + var expected = new QuerySql.GetPostgresSpecialTypesCntRow + { + Cnt = batchSize, + CJson = cParsedJson, + CJsonb = cParsedJson + }; + var actual = await QuerySql.GetPostgresSpecialTypesCnt(); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.GetPostgresSpecialTypesCntRow y) + { + var options = new JsonSerializerOptions + { + WriteIndented = false + }; + Assert.That(y.Cnt, Is.EqualTo(x.Cnt)); + Assert.That(y.CJson.HasValue, Is.EqualTo(x.CJson.HasValue)); + if (y.CJson.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJson.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJson.Value, options))); + Assert.That(y.CJsonb.HasValue, Is.EqualTo(x.CJsonb.HasValue)); + if (y.CJsonb.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJsonb.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJsonb.Value, options))); + } + } + """ + }, [KnownTestType.PostgresInvalidJson] = new TestImpl { Impl = $$""" diff --git a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs index d46e473f..9846951f 100644 --- a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs @@ -892,6 +892,40 @@ void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.Get } } + [Test] + [TestCase(100, "{\"song\": \"Pinball Wizard\", \"album\": \"Tommy\", \"artist\": \"The Who\"}")] + [TestCase(10, null)] + public async Task TestPostgresJsonCopyFrom(int batchSize, string cJson) + { + JsonElement? cParsedJson = null; + if (cJson != null) + cParsedJson = JsonDocument.Parse(cJson).RootElement; + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresSpecialTypesBatchArgs { CJson = cParsedJson, CJsonb = cParsedJson }).ToList(); + await QuerySql.InsertPostgresSpecialTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresSpecialTypesCntRow + { + Cnt = batchSize, + CJson = cParsedJson, + CJsonb = cParsedJson + }; + var actual = await QuerySql.GetPostgresSpecialTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.GetPostgresSpecialTypesCntRow y) + { + var options = new JsonSerializerOptions + { + WriteIndented = false + }; + Assert.That(y.Cnt, Is.EqualTo(x.Cnt)); + Assert.That(y.CJson.HasValue, Is.EqualTo(x.CJson.HasValue)); + if (y.CJson.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJson.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJson.Value, options))); + Assert.That(y.CJsonb.HasValue, Is.EqualTo(x.CJsonb.HasValue)); + if (y.CJsonb.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJsonb.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJsonb.Value, options))); + } + } + private static IEnumerable PostgresNetworkCopyFromTestCases { get diff --git a/end2end/EndToEndTests/NpgsqlTester.generated.cs b/end2end/EndToEndTests/NpgsqlTester.generated.cs index fad87b7a..4986884b 100644 --- a/end2end/EndToEndTests/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlTester.generated.cs @@ -892,6 +892,40 @@ void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.Get } } + [Test] + [TestCase(100, "{\"song\": \"Pinball Wizard\", \"album\": \"Tommy\", \"artist\": \"The Who\"}")] + [TestCase(10, null)] + public async Task TestPostgresJsonCopyFrom(int batchSize, string cJson) + { + JsonElement? cParsedJson = null; + if (cJson != null) + cParsedJson = JsonDocument.Parse(cJson).RootElement; + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresSpecialTypesBatchArgs { CJson = cParsedJson, CJsonb = cParsedJson }).ToList(); + await QuerySql.InsertPostgresSpecialTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresSpecialTypesCntRow + { + Cnt = batchSize, + CJson = cParsedJson, + CJsonb = cParsedJson + }; + var actual = await QuerySql.GetPostgresSpecialTypesCnt(); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.GetPostgresSpecialTypesCntRow y) + { + var options = new JsonSerializerOptions + { + WriteIndented = false + }; + Assert.That(y.Cnt, Is.EqualTo(x.Cnt)); + Assert.That(y.CJson.HasValue, Is.EqualTo(x.CJson.HasValue)); + if (y.CJson.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJson.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJson.Value, options))); + Assert.That(y.CJsonb.HasValue, Is.EqualTo(x.CJsonb.HasValue)); + if (y.CJsonb.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJsonb.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJsonb.Value, options))); + } + } + private static IEnumerable PostgresNetworkCopyFromTestCases { get diff --git a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs index 3ff92ed6..b7d6db63 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs @@ -892,6 +892,40 @@ void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.Get } } + [Test] + [TestCase(100, "{\"song\": \"Pinball Wizard\", \"album\": \"Tommy\", \"artist\": \"The Who\"}")] + [TestCase(10, null)] + public async Task TestPostgresJsonCopyFrom(int batchSize, string cJson) + { + JsonElement? cParsedJson = null; + if (cJson != null) + cParsedJson = JsonDocument.Parse(cJson).RootElement; + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresSpecialTypesBatchArgs { CJson = cParsedJson, CJsonb = cParsedJson }).ToList(); + await QuerySql.InsertPostgresSpecialTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresSpecialTypesCntRow + { + Cnt = batchSize, + CJson = cParsedJson, + CJsonb = cParsedJson + }; + var actual = await QuerySql.GetPostgresSpecialTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.GetPostgresSpecialTypesCntRow y) + { + var options = new JsonSerializerOptions + { + WriteIndented = false + }; + Assert.That(y.Cnt, Is.EqualTo(x.Cnt)); + Assert.That(y.CJson.HasValue, Is.EqualTo(x.CJson.HasValue)); + if (y.CJson.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJson.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJson.Value, options))); + Assert.That(y.CJsonb.HasValue, Is.EqualTo(x.CJsonb.HasValue)); + if (y.CJsonb.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJsonb.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJsonb.Value, options))); + } + } + private static IEnumerable PostgresNetworkCopyFromTestCases { get diff --git a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs index 2f985f5e..74db6e76 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs @@ -892,6 +892,40 @@ void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.Get } } + [Test] + [TestCase(100, "{\"song\": \"Pinball Wizard\", \"album\": \"Tommy\", \"artist\": \"The Who\"}")] + [TestCase(10, null)] + public async Task TestPostgresJsonCopyFrom(int batchSize, string cJson) + { + JsonElement? cParsedJson = null; + if (cJson != null) + cParsedJson = JsonDocument.Parse(cJson).RootElement; + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresSpecialTypesBatchArgs { CJson = cParsedJson, CJsonb = cParsedJson }).ToList(); + await QuerySql.InsertPostgresSpecialTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresSpecialTypesCntRow + { + Cnt = batchSize, + CJson = cParsedJson, + CJsonb = cParsedJson + }; + var actual = await QuerySql.GetPostgresSpecialTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresSpecialTypesCntRow x, QuerySql.GetPostgresSpecialTypesCntRow y) + { + var options = new JsonSerializerOptions + { + WriteIndented = false + }; + Assert.That(y.Cnt, Is.EqualTo(x.Cnt)); + Assert.That(y.CJson.HasValue, Is.EqualTo(x.CJson.HasValue)); + if (y.CJson.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJson.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJson.Value, options))); + Assert.That(y.CJsonb.HasValue, Is.EqualTo(x.CJsonb.HasValue)); + if (y.CJsonb.HasValue) + Assert.That(JsonSerializer.Serialize(y.CJsonb.Value, options), Is.EqualTo(JsonSerializer.Serialize(x.CJsonb.Value, options))); + } + } + private static IEnumerable PostgresNetworkCopyFromTestCases { get diff --git a/examples/NpgsqlDapperExample/QuerySql.cs b/examples/NpgsqlDapperExample/QuerySql.cs index 69d2337f..3d5ad031 100644 --- a/examples/NpgsqlDapperExample/QuerySql.cs +++ b/examples/NpgsqlDapperExample/QuerySql.cs @@ -1148,7 +1148,7 @@ public async Task InsertPostgresNetworkTypesBatch(List(); - queryParams.Add("c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : null); + queryParams.Add("c_json", args.CJson.HasValue ? (object)args.CJson.Value : null); queryParams.Add("c_json_string_override", args.CJsonStringOverride); - queryParams.Add("c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : null); + queryParams.Add("c_jsonb", args.CJsonb.HasValue ? (object)args.CJsonb.Value : null); queryParams.Add("c_jsonpath", args.CJsonpath); queryParams.Add("c_xml", args.CXml != null ? args.CXml.OuterXml : null); queryParams.Add("c_xml_string_override", args.CXmlStringOverride); @@ -1226,10 +1226,12 @@ public async Task TruncatePostgresSpecialTypes() await this.Transaction.Connection.ExecuteAsync(TruncatePostgresSpecialTypesSql, transaction: this.Transaction); } - private const string InsertPostgresSpecialTypesBatchSql = "COPY postgres_special_types (c_uuid) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresSpecialTypesBatchSql = "COPY postgres_special_types (c_uuid, c_json, c_jsonb) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresSpecialTypesBatchArgs { public Guid? CUuid { get; init; } + public JsonElement? CJson { get; init; } + public JsonElement? CJsonb { get; init; } }; public async Task InsertPostgresSpecialTypesBatch(List args) { @@ -1242,6 +1244,8 @@ public async Task InsertPostgresSpecialTypesBatch(List GetPostgresSpecialTypesCnt() diff --git a/examples/NpgsqlDapperExample/Utils.cs b/examples/NpgsqlDapperExample/Utils.cs index b44b6de3..24f86433 100644 --- a/examples/NpgsqlDapperExample/Utils.cs +++ b/examples/NpgsqlDapperExample/Utils.cs @@ -22,7 +22,7 @@ public override JsonElement Parse(object value) public override void SetValue(IDbDataParameter parameter, JsonElement value) { - parameter.Value = value.GetRawText(); + parameter.Value = value; } } diff --git a/examples/NpgsqlDapperExample/request.json b/examples/NpgsqlDapperExample/request.json index 5b1759e1..adda0828 100644 --- a/examples/NpgsqlDapperExample/request.json +++ b/examples/NpgsqlDapperExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/NpgsqlDapperExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXQ4LjAiLCJ1c2VEYXBwZXIiOnRydWV9", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNTcGVjaWFsVHlwZXNDbnQ6Y19qc29uIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJKc29uRWxlbWVudCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzU3BlY2lhbFR5cGVzQ250OmNfanNvbmIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6Ikpzb25FbGVtZW50In19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXQ4LjAiLCJ1c2VEYXBwZXIiOnRydWV9", "process": { "cmd": "./dist/LocalRunner" } @@ -35032,7 +35032,7 @@ } }, { - "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1::json, \n $2::json, \n $3::jsonb,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", + "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1, \n $2::json, \n $3,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", "name": "InsertPostgresSpecialTypes", "cmd": ":exec", "parameters": [ @@ -35041,9 +35041,15 @@ "column": { "name": "c_json", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "json" - } + }, + "originalName": "c_json" } }, { @@ -35061,9 +35067,15 @@ "column": { "name": "c_jsonb", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "jsonb" - } + }, + "originalName": "c_jsonb" } }, { @@ -35234,7 +35246,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_special_types\n(\n c_uuid\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_special_types\n(\n c_uuid,\n c_json,\n c_jsonb\n)\nVALUES (\n $1,\n $2,\n $3\n)", "name": "InsertPostgresSpecialTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -35252,6 +35264,36 @@ }, "originalName": "c_uuid" } + }, + { + "number": 2, + "column": { + "name": "c_json", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "json" + }, + "originalName": "c_json" + } + }, + { + "number": 3, + "column": { + "name": "c_jsonb", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "jsonb" + }, + "originalName": "c_jsonb" + } } ], "filename": "query.sql", @@ -35260,7 +35302,7 @@ } }, { - "text": "SELECT\n c_uuid,\n COUNT(*) AS cnt\nFROM postgres_special_types\nGROUP BY\n c_uuid\nLIMIT 1", + "text": "WITH grouped_json_types AS (\n SELECT\n c_uuid,\n c_json::text AS c_json,\n c_jsonb::text AS c_jsonb,\n COUNT(*) AS cnt\n FROM postgres_special_types\n GROUP BY\n c_uuid,\n c_json::text,\n c_jsonb::text\n)\n\nSELECT \n c_uuid, \n c_json::json AS c_json, \n c_jsonb::jsonb AS c_jsonb, \n cnt\nFROM grouped_json_types\nLIMIT 1", "name": "GetPostgresSpecialTypesCnt", "cmd": ":one", "columns": [ @@ -35268,21 +35310,40 @@ "name": "c_uuid", "length": -1, "table": { - "name": "postgres_special_types" + "name": "grouped_json_types" }, "type": { "name": "uuid" }, "originalName": "c_uuid" }, + { + "name": "c_json", + "notNull": true, + "length": -1, + "type": { + "name": "json" + } + }, + { + "name": "c_jsonb", + "notNull": true, + "length": -1, + "type": { + "name": "jsonb" + } + }, { "name": "cnt", "notNull": true, "length": -1, - "isFuncCall": true, + "table": { + "name": "grouped_json_types" + }, "type": { "name": "bigint" - } + }, + "originalName": "cnt" } ], "filename": "query.sql" @@ -36061,5 +36122,5 @@ } ], "sqlc_version": "v1.27.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6Ik5wZ3NxbERhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6Ik5wZ3NxbERhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNTcGVjaWFsVHlwZXNDbnQ6Y19qc29uIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6Ikpzb25FbGVtZW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzU3BlY2lhbFR5cGVzQ250OmNfanNvbmIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiSnNvbkVsZW1lbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" } \ No newline at end of file diff --git a/examples/NpgsqlDapperExample/request.message b/examples/NpgsqlDapperExample/request.message index 76a9fa7f..2e17c374 100644 --- a/examples/NpgsqlDapperExample/request.message +++ b/examples/NpgsqlDapperExample/request.message @@ -1,8 +1,8 @@ - + 2 -postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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_xml_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":true}* +postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_xml_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 authors) id0R authorsb  bigserial& @@ -10670,8 +10670,8 @@ LIMIT 1GetPostgresNetworkTypesCnt:one"= ) VALUES ($1, $2, $3)InsertPostgresNetworkTypesBatch :copyfrom*IE c_cidr0R publicpostgres_network_typesbcidrzc_cidr*IE c_inet0R publicpostgres_network_typesbinetzc_inet*RN - c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types - + c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types + INSERT INTO postgres_special_types ( c_json, @@ -10684,18 +10684,18 @@ INSERT INTO postgres_special_types c_enum ) VALUES ( - $1::json, + $1, $2::json, - $3::jsonb, + $3, $4::jsonpath, $5::xml, $6::xml, $7, $8::c_enum -)InsertPostgresSpecialTypes:exec* -c_json0bjson*/+ -c_json_string_override0bjson*! -c_jsonb0bjsonb*'# +)InsertPostgresSpecialTypes:exec*KG +c_json08R publicpostgres_special_typesbjsonzc_json*/+ +c_json_string_override0bjson*NJ +c_jsonb08R publicpostgres_special_typesbjsonbzc_jsonb*'# c_jsonpath0b jsonpath* @@ -10725,24 +10725,45 @@ c_jsonpath": c_xml_string_override0Rpostgres_special_typesbxmlzc_xml_string_override"= c_uuid0Rpostgres_special_typesbuuidzc_uuid"? c_enum0Rpostgres_special_typesbc_enumzc_enum: query.sqlW -%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql -CINSERT INTO postgres_special_types +%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql +lINSERT INTO postgres_special_types ( - c_uuid + c_uuid, + c_json, + c_jsonb ) VALUES ( - $1 + $1, + $2, + $3 )InsertPostgresSpecialTypesBatch :copyfrom*IE -c_uuid0R publicpostgres_special_typesbuuidzc_uuid: query.sqlBpostgres_special_types -^SELECT - c_uuid, - COUNT(*) AS cnt -FROM postgres_special_types -GROUP BY - c_uuid -LIMIT 1GetPostgresSpecialTypesCnt:one"= -c_uuid0Rpostgres_special_typesbuuidzc_uuid" -cnt0@bbigint: query.sql +c_uuid0R publicpostgres_special_typesbuuidzc_uuid*IE +c_json0R publicpostgres_special_typesbjsonzc_json*LH +c_jsonb0R publicpostgres_special_typesbjsonbzc_jsonb: query.sqlBpostgres_special_types +WITH grouped_json_types AS ( + SELECT + c_uuid, + c_json::text AS c_json, + c_jsonb::text AS c_jsonb, + COUNT(*) AS cnt + FROM postgres_special_types + GROUP BY + c_uuid, + c_json::text, + c_jsonb::text +) + +SELECT + c_uuid, + c_json::json AS c_json, + c_jsonb::jsonb AS c_jsonb, + cnt +FROM grouped_json_types +LIMIT 1GetPostgresSpecialTypesCnt:one"9 +c_uuid0Rgrouped_json_typesbuuidzc_uuid" +c_json0bjson" +c_jsonb0bjsonb"7 +cnt0Rgrouped_json_typesbbigintzcnt: query.sql  INSERT INTO postgres_array_types ( @@ -10868,4 +10889,4 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_path0Rpostgres_geometric_typesbpathzc_path"H c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: 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_xml_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"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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_xml_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/QuerySql.cs b/examples/NpgsqlDapperLegacyExample/QuerySql.cs index 73dda028..710e5997 100644 --- a/examples/NpgsqlDapperLegacyExample/QuerySql.cs +++ b/examples/NpgsqlDapperLegacyExample/QuerySql.cs @@ -1149,7 +1149,7 @@ public async Task InsertPostgresNetworkTypesBatch(List(); - queryParams.Add("c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : null); + queryParams.Add("c_json", args.CJson.HasValue ? (object)args.CJson.Value : null); queryParams.Add("c_json_string_override", args.CJsonStringOverride); - queryParams.Add("c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : null); + queryParams.Add("c_jsonb", args.CJsonb.HasValue ? (object)args.CJsonb.Value : null); queryParams.Add("c_jsonpath", args.CJsonpath); queryParams.Add("c_xml", args.CXml != null ? args.CXml.OuterXml : null); queryParams.Add("c_xml_string_override", args.CXmlStringOverride); @@ -1227,10 +1227,12 @@ public async Task TruncatePostgresSpecialTypes() await this.Transaction.Connection.ExecuteAsync(TruncatePostgresSpecialTypesSql, transaction: this.Transaction); } - private const string InsertPostgresSpecialTypesBatchSql = "COPY postgres_special_types (c_uuid) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresSpecialTypesBatchSql = "COPY postgres_special_types (c_uuid, c_json, c_jsonb) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresSpecialTypesBatchArgs { public Guid? CUuid { get; set; } + public JsonElement? CJson { get; set; } + public JsonElement? CJsonb { get; set; } }; public async Task InsertPostgresSpecialTypesBatch(List args) { @@ -1243,6 +1245,8 @@ public async Task InsertPostgresSpecialTypesBatch(List GetPostgresSpecialTypesCnt() diff --git a/examples/NpgsqlDapperLegacyExample/Utils.cs b/examples/NpgsqlDapperLegacyExample/Utils.cs index 5ec33447..6aa1fd35 100644 --- a/examples/NpgsqlDapperLegacyExample/Utils.cs +++ b/examples/NpgsqlDapperLegacyExample/Utils.cs @@ -23,7 +23,7 @@ public override JsonElement Parse(object value) public override void SetValue(IDbDataParameter parameter, JsonElement value) { - parameter.Value = value.GetRawText(); + parameter.Value = value; } } diff --git a/examples/NpgsqlDapperLegacyExample/request.json b/examples/NpgsqlDapperLegacyExample/request.json index 17f34e7c..58fb083d 100644 --- a/examples/NpgsqlDapperLegacyExample/request.json +++ b/examples/NpgsqlDapperLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/NpgsqlDapperLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXRzdGFuZGFyZDIuMCIsInVzZURhcHBlciI6dHJ1ZX0=", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNTcGVjaWFsVHlwZXNDbnQ6Y19qc29uIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJKc29uRWxlbWVudCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzU3BlY2lhbFR5cGVzQ250OmNfanNvbmIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6Ikpzb25FbGVtZW50In19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXRzdGFuZGFyZDIuMCIsInVzZURhcHBlciI6dHJ1ZX0=", "process": { "cmd": "./dist/LocalRunner" } @@ -35032,7 +35032,7 @@ } }, { - "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1::json, \n $2::json, \n $3::jsonb,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", + "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1, \n $2::json, \n $3,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", "name": "InsertPostgresSpecialTypes", "cmd": ":exec", "parameters": [ @@ -35041,9 +35041,15 @@ "column": { "name": "c_json", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "json" - } + }, + "originalName": "c_json" } }, { @@ -35061,9 +35067,15 @@ "column": { "name": "c_jsonb", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "jsonb" - } + }, + "originalName": "c_jsonb" } }, { @@ -35234,7 +35246,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_special_types\n(\n c_uuid\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_special_types\n(\n c_uuid,\n c_json,\n c_jsonb\n)\nVALUES (\n $1,\n $2,\n $3\n)", "name": "InsertPostgresSpecialTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -35252,6 +35264,36 @@ }, "originalName": "c_uuid" } + }, + { + "number": 2, + "column": { + "name": "c_json", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "json" + }, + "originalName": "c_json" + } + }, + { + "number": 3, + "column": { + "name": "c_jsonb", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "jsonb" + }, + "originalName": "c_jsonb" + } } ], "filename": "query.sql", @@ -35260,7 +35302,7 @@ } }, { - "text": "SELECT\n c_uuid,\n COUNT(*) AS cnt\nFROM postgres_special_types\nGROUP BY\n c_uuid\nLIMIT 1", + "text": "WITH grouped_json_types AS (\n SELECT\n c_uuid,\n c_json::text AS c_json,\n c_jsonb::text AS c_jsonb,\n COUNT(*) AS cnt\n FROM postgres_special_types\n GROUP BY\n c_uuid,\n c_json::text,\n c_jsonb::text\n)\n\nSELECT \n c_uuid, \n c_json::json AS c_json, \n c_jsonb::jsonb AS c_jsonb, \n cnt\nFROM grouped_json_types\nLIMIT 1", "name": "GetPostgresSpecialTypesCnt", "cmd": ":one", "columns": [ @@ -35268,21 +35310,40 @@ "name": "c_uuid", "length": -1, "table": { - "name": "postgres_special_types" + "name": "grouped_json_types" }, "type": { "name": "uuid" }, "originalName": "c_uuid" }, + { + "name": "c_json", + "notNull": true, + "length": -1, + "type": { + "name": "json" + } + }, + { + "name": "c_jsonb", + "notNull": true, + "length": -1, + "type": { + "name": "jsonb" + } + }, { "name": "cnt", "notNull": true, "length": -1, - "isFuncCall": true, + "table": { + "name": "grouped_json_types" + }, "type": { "name": "bigint" - } + }, + "originalName": "cnt" } ], "filename": "query.sql" @@ -36061,5 +36122,5 @@ } ], "sqlc_version": "v1.27.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF90aW1lc3RhbXAiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOmNfanNvbl9zdHJpbmdfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y194bWxfc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfbWFjYWRkcjgiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF90aW1lc3RhbXAiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc1NwZWNpYWxUeXBlc0NudDpjX2pzb24iLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiSnNvbkVsZW1lbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNTcGVjaWFsVHlwZXNDbnQ6Y19qc29uYiIsImNzaGFycF90eXBlIjp7InR5cGUiOiJKc29uRWxlbWVudCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfanNvbl9zdHJpbmdfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y194bWxfc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfbWFjYWRkcjgiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" } \ No newline at end of file diff --git a/examples/NpgsqlDapperLegacyExample/request.message b/examples/NpgsqlDapperLegacyExample/request.message index 44b9c189..a0ac81db 100644 --- a/examples/NpgsqlDapperLegacyExample/request.message +++ b/examples/NpgsqlDapperLegacyExample/request.message @@ -1,8 +1,8 @@ - + 2 -postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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_xml_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":true}* +postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_xml_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 authors) id0R authorsb  bigserial& @@ -10670,8 +10670,8 @@ LIMIT 1GetPostgresNetworkTypesCnt:one"= ) VALUES ($1, $2, $3)InsertPostgresNetworkTypesBatch :copyfrom*IE c_cidr0R publicpostgres_network_typesbcidrzc_cidr*IE c_inet0R publicpostgres_network_typesbinetzc_inet*RN - c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types - + c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types + INSERT INTO postgres_special_types ( c_json, @@ -10684,18 +10684,18 @@ INSERT INTO postgres_special_types c_enum ) VALUES ( - $1::json, + $1, $2::json, - $3::jsonb, + $3, $4::jsonpath, $5::xml, $6::xml, $7, $8::c_enum -)InsertPostgresSpecialTypes:exec* -c_json0bjson*/+ -c_json_string_override0bjson*! -c_jsonb0bjsonb*'# +)InsertPostgresSpecialTypes:exec*KG +c_json08R publicpostgres_special_typesbjsonzc_json*/+ +c_json_string_override0bjson*NJ +c_jsonb08R publicpostgres_special_typesbjsonbzc_jsonb*'# c_jsonpath0b jsonpath* @@ -10725,24 +10725,45 @@ c_jsonpath": c_xml_string_override0Rpostgres_special_typesbxmlzc_xml_string_override"= c_uuid0Rpostgres_special_typesbuuidzc_uuid"? c_enum0Rpostgres_special_typesbc_enumzc_enum: query.sqlW -%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql -CINSERT INTO postgres_special_types +%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql +lINSERT INTO postgres_special_types ( - c_uuid + c_uuid, + c_json, + c_jsonb ) VALUES ( - $1 + $1, + $2, + $3 )InsertPostgresSpecialTypesBatch :copyfrom*IE -c_uuid0R publicpostgres_special_typesbuuidzc_uuid: query.sqlBpostgres_special_types -^SELECT - c_uuid, - COUNT(*) AS cnt -FROM postgres_special_types -GROUP BY - c_uuid -LIMIT 1GetPostgresSpecialTypesCnt:one"= -c_uuid0Rpostgres_special_typesbuuidzc_uuid" -cnt0@bbigint: query.sql +c_uuid0R publicpostgres_special_typesbuuidzc_uuid*IE +c_json0R publicpostgres_special_typesbjsonzc_json*LH +c_jsonb0R publicpostgres_special_typesbjsonbzc_jsonb: query.sqlBpostgres_special_types +WITH grouped_json_types AS ( + SELECT + c_uuid, + c_json::text AS c_json, + c_jsonb::text AS c_jsonb, + COUNT(*) AS cnt + FROM postgres_special_types + GROUP BY + c_uuid, + c_json::text, + c_jsonb::text +) + +SELECT + c_uuid, + c_json::json AS c_json, + c_jsonb::jsonb AS c_jsonb, + cnt +FROM grouped_json_types +LIMIT 1GetPostgresSpecialTypesCnt:one"9 +c_uuid0Rgrouped_json_typesbuuidzc_uuid" +c_json0bjson" +c_jsonb0bjsonb"7 +cnt0Rgrouped_json_typesbbigintzcnt: query.sql  INSERT INTO postgres_array_types ( @@ -10868,4 +10889,4 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_path0Rpostgres_geometric_typesbpathzc_path"H c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: 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_xml_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"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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_xml_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/QuerySql.cs b/examples/NpgsqlExample/QuerySql.cs index 2e689fbf..9db523e5 100644 --- a/examples/NpgsqlExample/QuerySql.cs +++ b/examples/NpgsqlExample/QuerySql.cs @@ -1679,7 +1679,7 @@ public async Task InsertPostgresNetworkTypesBatch(List args) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -1832,6 +1832,8 @@ public async Task InsertPostgresSpecialTypesBatch(List GetPostgresSpecialTypesCnt() { if (this.Transaction == null) @@ -1858,7 +1860,9 @@ public async Task InsertPostgresSpecialTypesBatch(List(0), - Cnt = reader.GetInt64(1) + CJson = reader.IsDBNull(1) ? null : JsonSerializer.Deserialize(reader.GetString(1)), + CJsonb = reader.IsDBNull(2) ? null : JsonSerializer.Deserialize(reader.GetString(2)), + Cnt = reader.GetInt64(3) }; } } @@ -1881,7 +1885,9 @@ public async Task InsertPostgresSpecialTypesBatch(List(0), - Cnt = reader.GetInt64(1) + CJson = reader.IsDBNull(1) ? null : JsonSerializer.Deserialize(reader.GetString(1)), + CJsonb = reader.IsDBNull(2) ? null : JsonSerializer.Deserialize(reader.GetString(2)), + Cnt = reader.GetInt64(3) }; } } diff --git a/examples/NpgsqlExample/request.json b/examples/NpgsqlExample/request.json index 570cc70b..4eef92eb 100644 --- a/examples/NpgsqlExample/request.json +++ b/examples/NpgsqlExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/NpgsqlExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXQ4LjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNTcGVjaWFsVHlwZXNDbnQ6Y19qc29uIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJKc29uRWxlbWVudCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzU3BlY2lhbFR5cGVzQ250OmNfanNvbmIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6Ikpzb25FbGVtZW50In19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXQ4LjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", "process": { "cmd": "./dist/LocalRunner" } @@ -35032,7 +35032,7 @@ } }, { - "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1::json, \n $2::json, \n $3::jsonb,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", + "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1, \n $2::json, \n $3,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", "name": "InsertPostgresSpecialTypes", "cmd": ":exec", "parameters": [ @@ -35041,9 +35041,15 @@ "column": { "name": "c_json", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "json" - } + }, + "originalName": "c_json" } }, { @@ -35061,9 +35067,15 @@ "column": { "name": "c_jsonb", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "jsonb" - } + }, + "originalName": "c_jsonb" } }, { @@ -35234,7 +35246,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_special_types\n(\n c_uuid\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_special_types\n(\n c_uuid,\n c_json,\n c_jsonb\n)\nVALUES (\n $1,\n $2,\n $3\n)", "name": "InsertPostgresSpecialTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -35252,6 +35264,36 @@ }, "originalName": "c_uuid" } + }, + { + "number": 2, + "column": { + "name": "c_json", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "json" + }, + "originalName": "c_json" + } + }, + { + "number": 3, + "column": { + "name": "c_jsonb", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "jsonb" + }, + "originalName": "c_jsonb" + } } ], "filename": "query.sql", @@ -35260,7 +35302,7 @@ } }, { - "text": "SELECT\n c_uuid,\n COUNT(*) AS cnt\nFROM postgres_special_types\nGROUP BY\n c_uuid\nLIMIT 1", + "text": "WITH grouped_json_types AS (\n SELECT\n c_uuid,\n c_json::text AS c_json,\n c_jsonb::text AS c_jsonb,\n COUNT(*) AS cnt\n FROM postgres_special_types\n GROUP BY\n c_uuid,\n c_json::text,\n c_jsonb::text\n)\n\nSELECT \n c_uuid, \n c_json::json AS c_json, \n c_jsonb::jsonb AS c_jsonb, \n cnt\nFROM grouped_json_types\nLIMIT 1", "name": "GetPostgresSpecialTypesCnt", "cmd": ":one", "columns": [ @@ -35268,21 +35310,40 @@ "name": "c_uuid", "length": -1, "table": { - "name": "postgres_special_types" + "name": "grouped_json_types" }, "type": { "name": "uuid" }, "originalName": "c_uuid" }, + { + "name": "c_json", + "notNull": true, + "length": -1, + "type": { + "name": "json" + } + }, + { + "name": "c_jsonb", + "notNull": true, + "length": -1, + "type": { + "name": "jsonb" + } + }, { "name": "cnt", "notNull": true, "length": -1, - "isFuncCall": true, + "table": { + "name": "grouped_json_types" + }, "type": { "name": "bigint" - } + }, + "originalName": "cnt" } ], "filename": "query.sql" @@ -36061,5 +36122,5 @@ } ], "sqlc_version": "v1.27.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6Ik5wZ3NxbEV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X3RpbWVzdGFtcCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6Y19qc29uX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX3htbF9zdHJpbmdfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19tYWNhZGRyOCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6Ik5wZ3NxbEV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X3RpbWVzdGFtcCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzU3BlY2lhbFR5cGVzQ250OmNfanNvbiIsImNzaGFycF90eXBlIjp7InR5cGUiOiJKc29uRWxlbWVudCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc1NwZWNpYWxUeXBlc0NudDpjX2pzb25iIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6Ikpzb25FbGVtZW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19qc29uX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX3htbF9zdHJpbmdfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19tYWNhZGRyOCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/NpgsqlExample/request.message b/examples/NpgsqlExample/request.message index 37e54019..b33d2047 100644 --- a/examples/NpgsqlExample/request.message +++ b/examples/NpgsqlExample/request.message @@ -1,8 +1,8 @@ - + 2 -postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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_xml_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":false}* +postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_xml_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 authors) id0R authorsb  bigserial& @@ -10670,8 +10670,8 @@ LIMIT 1GetPostgresNetworkTypesCnt:one"= ) VALUES ($1, $2, $3)InsertPostgresNetworkTypesBatch :copyfrom*IE c_cidr0R publicpostgres_network_typesbcidrzc_cidr*IE c_inet0R publicpostgres_network_typesbinetzc_inet*RN - c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types - + c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types + INSERT INTO postgres_special_types ( c_json, @@ -10684,18 +10684,18 @@ INSERT INTO postgres_special_types c_enum ) VALUES ( - $1::json, + $1, $2::json, - $3::jsonb, + $3, $4::jsonpath, $5::xml, $6::xml, $7, $8::c_enum -)InsertPostgresSpecialTypes:exec* -c_json0bjson*/+ -c_json_string_override0bjson*! -c_jsonb0bjsonb*'# +)InsertPostgresSpecialTypes:exec*KG +c_json08R publicpostgres_special_typesbjsonzc_json*/+ +c_json_string_override0bjson*NJ +c_jsonb08R publicpostgres_special_typesbjsonbzc_jsonb*'# c_jsonpath0b jsonpath* @@ -10725,24 +10725,45 @@ c_jsonpath": c_xml_string_override0Rpostgres_special_typesbxmlzc_xml_string_override"= c_uuid0Rpostgres_special_typesbuuidzc_uuid"? c_enum0Rpostgres_special_typesbc_enumzc_enum: query.sqlW -%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql -CINSERT INTO postgres_special_types +%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql +lINSERT INTO postgres_special_types ( - c_uuid + c_uuid, + c_json, + c_jsonb ) VALUES ( - $1 + $1, + $2, + $3 )InsertPostgresSpecialTypesBatch :copyfrom*IE -c_uuid0R publicpostgres_special_typesbuuidzc_uuid: query.sqlBpostgres_special_types -^SELECT - c_uuid, - COUNT(*) AS cnt -FROM postgres_special_types -GROUP BY - c_uuid -LIMIT 1GetPostgresSpecialTypesCnt:one"= -c_uuid0Rpostgres_special_typesbuuidzc_uuid" -cnt0@bbigint: query.sql +c_uuid0R publicpostgres_special_typesbuuidzc_uuid*IE +c_json0R publicpostgres_special_typesbjsonzc_json*LH +c_jsonb0R publicpostgres_special_typesbjsonbzc_jsonb: query.sqlBpostgres_special_types +WITH grouped_json_types AS ( + SELECT + c_uuid, + c_json::text AS c_json, + c_jsonb::text AS c_jsonb, + COUNT(*) AS cnt + FROM postgres_special_types + GROUP BY + c_uuid, + c_json::text, + c_jsonb::text +) + +SELECT + c_uuid, + c_json::json AS c_json, + c_jsonb::jsonb AS c_jsonb, + cnt +FROM grouped_json_types +LIMIT 1GetPostgresSpecialTypesCnt:one"9 +c_uuid0Rgrouped_json_typesbuuidzc_uuid" +c_json0bjson" +c_jsonb0bjsonb"7 +cnt0Rgrouped_json_typesbbigintzcnt: query.sql  INSERT INTO postgres_array_types ( @@ -10868,4 +10889,4 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_path0Rpostgres_geometric_typesbpathzc_path"H c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: 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_xml_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"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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_xml_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/QuerySql.cs b/examples/NpgsqlLegacyExample/QuerySql.cs index e52ec5c5..aab3edac 100644 --- a/examples/NpgsqlLegacyExample/QuerySql.cs +++ b/examples/NpgsqlLegacyExample/QuerySql.cs @@ -1934,7 +1934,7 @@ public async Task InsertPostgresNetworkTypesBatch(List args) { @@ -2110,6 +2112,8 @@ public async Task InsertPostgresSpecialTypesBatch(List GetPostgresSpecialTypesCnt() @@ -2140,7 +2146,9 @@ public async Task GetPostgresSpecialTypesCnt() return new GetPostgresSpecialTypesCntRow { CUuid = reader.IsDBNull(0) ? (Guid? )null : reader.GetFieldValue(0), - Cnt = reader.GetInt64(1) + CJson = reader.IsDBNull(1) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(1)), + CJsonb = reader.IsDBNull(2) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(2)), + Cnt = reader.GetInt64(3) }; } } @@ -2163,7 +2171,9 @@ public async Task GetPostgresSpecialTypesCnt() return new GetPostgresSpecialTypesCntRow { CUuid = reader.IsDBNull(0) ? (Guid? )null : reader.GetFieldValue(0), - Cnt = reader.GetInt64(1) + CJson = reader.IsDBNull(1) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(1)), + CJsonb = reader.IsDBNull(2) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(2)), + Cnt = reader.GetInt64(3) }; } } diff --git a/examples/NpgsqlLegacyExample/request.json b/examples/NpgsqlLegacyExample/request.json index 8e122bc0..4a4c93e1 100644 --- a/examples/NpgsqlLegacyExample/request.json +++ b/examples/NpgsqlLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/NpgsqlLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXRzdGFuZGFyZDIuMCIsInVzZURhcHBlciI6ZmFsc2V9", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNTcGVjaWFsVHlwZXNDbnQ6Y19qc29uIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJKc29uRWxlbWVudCJ9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzU3BlY2lhbFR5cGVzQ250OmNfanNvbmIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6Ikpzb25FbGVtZW50In19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOmZhbHNlLCJ0eXBlIjoic3RyaW5nIn19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJzdHJpbmcifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXRzdGFuZGFyZDIuMCIsInVzZURhcHBlciI6ZmFsc2V9", "process": { "cmd": "./dist/LocalRunner" } @@ -35032,7 +35032,7 @@ } }, { - "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1::json, \n $2::json, \n $3::jsonb,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", + "text": "\nINSERT INTO postgres_special_types\n(\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_xml_string_override,\n c_uuid,\n c_enum\n)\nVALUES (\n $1, \n $2::json, \n $3,\n $4::jsonpath,\n $5::xml,\n $6::xml,\n $7,\n $8::c_enum\n)", "name": "InsertPostgresSpecialTypes", "cmd": ":exec", "parameters": [ @@ -35041,9 +35041,15 @@ "column": { "name": "c_json", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "json" - } + }, + "originalName": "c_json" } }, { @@ -35061,9 +35067,15 @@ "column": { "name": "c_jsonb", "length": -1, + "isNamedParam": true, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, "type": { "name": "jsonb" - } + }, + "originalName": "c_jsonb" } }, { @@ -35234,7 +35246,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_special_types\n(\n c_uuid\n)\nVALUES (\n $1\n)", + "text": "INSERT INTO postgres_special_types\n(\n c_uuid,\n c_json,\n c_jsonb\n)\nVALUES (\n $1,\n $2,\n $3\n)", "name": "InsertPostgresSpecialTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -35252,6 +35264,36 @@ }, "originalName": "c_uuid" } + }, + { + "number": 2, + "column": { + "name": "c_json", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "json" + }, + "originalName": "c_json" + } + }, + { + "number": 3, + "column": { + "name": "c_jsonb", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_special_types" + }, + "type": { + "name": "jsonb" + }, + "originalName": "c_jsonb" + } } ], "filename": "query.sql", @@ -35260,7 +35302,7 @@ } }, { - "text": "SELECT\n c_uuid,\n COUNT(*) AS cnt\nFROM postgres_special_types\nGROUP BY\n c_uuid\nLIMIT 1", + "text": "WITH grouped_json_types AS (\n SELECT\n c_uuid,\n c_json::text AS c_json,\n c_jsonb::text AS c_jsonb,\n COUNT(*) AS cnt\n FROM postgres_special_types\n GROUP BY\n c_uuid,\n c_json::text,\n c_jsonb::text\n)\n\nSELECT \n c_uuid, \n c_json::json AS c_json, \n c_jsonb::jsonb AS c_jsonb, \n cnt\nFROM grouped_json_types\nLIMIT 1", "name": "GetPostgresSpecialTypesCnt", "cmd": ":one", "columns": [ @@ -35268,21 +35310,40 @@ "name": "c_uuid", "length": -1, "table": { - "name": "postgres_special_types" + "name": "grouped_json_types" }, "type": { "name": "uuid" }, "originalName": "c_uuid" }, + { + "name": "c_json", + "notNull": true, + "length": -1, + "type": { + "name": "json" + } + }, + { + "name": "c_jsonb", + "notNull": true, + "length": -1, + "type": { + "name": "jsonb" + } + }, { "name": "cnt", "notNull": true, "length": -1, - "isFuncCall": true, + "table": { + "name": "grouped_json_types" + }, "type": { "name": "bigint" - } + }, + "originalName": "cnt" } ], "filename": "query.sql" @@ -36061,5 +36122,5 @@ } ], "sqlc_version": "v1.27.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiTnBnc3FsTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0UG9zdGdyZXNGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRQb3N0Z3Jlc0Z1bmN0aW9uczptYXhfdGltZXN0YW1wIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiR2V0UG9zdGdyZXNTcGVjaWFsVHlwZXNDbnQ6Y19qc29uIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6Ikpzb25FbGVtZW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFBvc3RncmVzU3BlY2lhbFR5cGVzQ250OmNfanNvbmIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiSnNvbkVsZW1lbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2pzb25fc3RyaW5nX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfeG1sX3N0cmluZ19vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX21hY2FkZHI4IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" } \ No newline at end of file diff --git a/examples/NpgsqlLegacyExample/request.message b/examples/NpgsqlLegacyExample/request.message index de7cc006..08313b85 100644 --- a/examples/NpgsqlLegacyExample/request.message +++ b/examples/NpgsqlLegacyExample/request.message @@ -1,8 +1,8 @@ - + 2 -postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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_xml_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":false}* +postgresql-examples/config/postgresql/authors/schema.sql+examples/config/postgresql/types/schema.sql",examples/config/postgresql/authors/query.sql"*examples/config/postgresql/types/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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"notNull":false,"type":"JsonElement"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_xml_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 authors) id0R authorsb  bigserial& @@ -10670,8 +10670,8 @@ LIMIT 1GetPostgresNetworkTypesCnt:one"= ) VALUES ($1, $2, $3)InsertPostgresNetworkTypesBatch :copyfrom*IE c_cidr0R publicpostgres_network_typesbcidrzc_cidr*IE c_inet0R publicpostgres_network_typesbinetzc_inet*RN - c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types - + c_macaddr0R publicpostgres_network_typesb macaddrz c_macaddr: query.sqlBpostgres_network_types + INSERT INTO postgres_special_types ( c_json, @@ -10684,18 +10684,18 @@ INSERT INTO postgres_special_types c_enum ) VALUES ( - $1::json, + $1, $2::json, - $3::jsonb, + $3, $4::jsonpath, $5::xml, $6::xml, $7, $8::c_enum -)InsertPostgresSpecialTypes:exec* -c_json0bjson*/+ -c_json_string_override0bjson*! -c_jsonb0bjsonb*'# +)InsertPostgresSpecialTypes:exec*KG +c_json08R publicpostgres_special_typesbjsonzc_json*/+ +c_json_string_override0bjson*NJ +c_jsonb08R publicpostgres_special_typesbjsonbzc_jsonb*'# c_jsonpath0b jsonpath* @@ -10725,24 +10725,45 @@ c_jsonpath": c_xml_string_override0Rpostgres_special_typesbxmlzc_xml_string_override"= c_uuid0Rpostgres_special_typesbuuidzc_uuid"? c_enum0Rpostgres_special_typesbc_enumzc_enum: query.sqlW -%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql -CINSERT INTO postgres_special_types +%TRUNCATE TABLE postgres_special_typesTruncatePostgresSpecialTypes:exec: query.sql +lINSERT INTO postgres_special_types ( - c_uuid + c_uuid, + c_json, + c_jsonb ) VALUES ( - $1 + $1, + $2, + $3 )InsertPostgresSpecialTypesBatch :copyfrom*IE -c_uuid0R publicpostgres_special_typesbuuidzc_uuid: query.sqlBpostgres_special_types -^SELECT - c_uuid, - COUNT(*) AS cnt -FROM postgres_special_types -GROUP BY - c_uuid -LIMIT 1GetPostgresSpecialTypesCnt:one"= -c_uuid0Rpostgres_special_typesbuuidzc_uuid" -cnt0@bbigint: query.sql +c_uuid0R publicpostgres_special_typesbuuidzc_uuid*IE +c_json0R publicpostgres_special_typesbjsonzc_json*LH +c_jsonb0R publicpostgres_special_typesbjsonbzc_jsonb: query.sqlBpostgres_special_types +WITH grouped_json_types AS ( + SELECT + c_uuid, + c_json::text AS c_json, + c_jsonb::text AS c_jsonb, + COUNT(*) AS cnt + FROM postgres_special_types + GROUP BY + c_uuid, + c_json::text, + c_jsonb::text +) + +SELECT + c_uuid, + c_json::json AS c_json, + c_jsonb::jsonb AS c_jsonb, + cnt +FROM grouped_json_types +LIMIT 1GetPostgresSpecialTypesCnt:one"9 +c_uuid0Rgrouped_json_typesbuuidzc_uuid" +c_json0bjson" +c_jsonb0bjsonb"7 +cnt0Rgrouped_json_typesbbigintzcnt: query.sql  INSERT INTO postgres_array_types ( @@ -10868,4 +10889,4 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_path0Rpostgres_geometric_typesbpathzc_path"H c_polygon0Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0Rpostgres_geometric_typesbcirclezc_circle: 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_xml_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"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":"GetPostgresSpecialTypesCnt:c_json","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"GetPostgresSpecialTypesCnt:c_jsonb","csharp_type":{"type":"JsonElement","notNull":false}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_xml_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/types/query.sql b/examples/config/postgresql/types/query.sql index 2738dc59..d43a9e2f 100644 --- a/examples/config/postgresql/types/query.sql +++ b/examples/config/postgresql/types/query.sql @@ -243,9 +243,9 @@ INSERT INTO postgres_special_types c_enum ) VALUES ( - sqlc.narg('c_json')::json, + sqlc.narg('c_json'), sqlc.narg('c_json_string_override')::json, - sqlc.narg('c_jsonb')::jsonb, + sqlc.narg('c_jsonb'), sqlc.narg('c_jsonpath')::jsonpath, sqlc.narg('c_xml')::xml, sqlc.narg('c_xml_string_override')::xml, @@ -272,19 +272,36 @@ TRUNCATE TABLE postgres_special_types; -- name: InsertPostgresSpecialTypesBatch :copyfrom INSERT INTO postgres_special_types ( - c_uuid + c_uuid, + c_json, + c_jsonb ) VALUES ( - $1 + $1, + $2, + $3 ); -- name: GetPostgresSpecialTypesCnt :one -SELECT - c_uuid, - COUNT(*) AS cnt -FROM postgres_special_types -GROUP BY - c_uuid +WITH grouped_json_types AS ( + SELECT + c_uuid, + c_json::text AS c_json, + c_jsonb::text AS c_jsonb, + COUNT(*) AS cnt + FROM postgres_special_types + GROUP BY + c_uuid, + c_json::text, + c_jsonb::text +) + +SELECT + c_uuid, + c_json::json AS c_json, + c_jsonb::jsonb AS c_jsonb, + cnt +FROM grouped_json_types LIMIT 1; /* Array types */ diff --git a/sqlc.ci.yaml b/sqlc.ci.yaml index 53c95a6d..63ddb063 100644 --- a/sqlc.ci.yaml +++ b/sqlc.ci.yaml @@ -30,6 +30,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -66,6 +74,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -102,6 +118,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -138,6 +162,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" diff --git a/sqlc.local.generated.yaml b/sqlc.local.generated.yaml index b597ca71..221cbdb5 100644 --- a/sqlc.local.generated.yaml +++ b/sqlc.local.generated.yaml @@ -29,6 +29,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -65,6 +73,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -101,6 +117,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -137,6 +161,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" diff --git a/sqlc.request.generated.yaml b/sqlc.request.generated.yaml index c657d96c..9c8049a3 100644 --- a/sqlc.request.generated.yaml +++ b/sqlc.request.generated.yaml @@ -29,6 +29,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -66,6 +74,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -103,6 +119,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string" @@ -140,6 +164,14 @@ sql: csharp_type: type: "DateTime" notNull: true + - column: "GetPostgresSpecialTypesCnt:c_json" + csharp_type: + type: "JsonElement" + notNull: false + - column: "GetPostgresSpecialTypesCnt:c_jsonb" + csharp_type: + type: "JsonElement" + notNull: false - column: "*:c_json_string_override" csharp_type: type: "string"