Skip to content

Commit c319c6b

Browse files
feat: support uuid Postgres data type in :copyfrom
1 parent 58880ae commit c319c6b

20 files changed

Lines changed: 361 additions & 56 deletions

File tree

docs/04_Postgres.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ we consider support for the different data types separately for batch inserts an
5353
| macaddr8 |||
5454
| tsvector |||
5555
| tsquery |||
56-
| uuid || |
56+
| uuid || |
5757
| json |||
5858
| jsonb |||
5959
| jsonpath |||

end2end/EndToEndScaffold/Config.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public enum KnownTestType
4848
PostgresIntegerCopyFrom,
4949
PostgresFloatingPointCopyFrom,
5050
PostgresDateTimeCopyFrom,
51+
PostgresGuidCopyFrom,
5152
PostgresArrayCopyFrom,
5253
PostgresGeoDataTypes,
5354
PostgresGeoCopyFrom,
@@ -203,6 +204,7 @@ internal static class Config
203204
KnownTestType.PostgresIntegerCopyFrom,
204205
KnownTestType.PostgresFloatingPointCopyFrom,
205206
KnownTestType.PostgresDateTimeCopyFrom,
207+
KnownTestType.PostgresGuidCopyFrom,
206208
KnownTestType.PostgresArrayCopyFrom,
207209
]
208210
}
@@ -243,6 +245,7 @@ internal static class Config
243245
KnownTestType.PostgresIntegerCopyFrom,
244246
KnownTestType.PostgresFloatingPointCopyFrom,
245247
KnownTestType.PostgresDateTimeCopyFrom,
248+
KnownTestType.PostgresGuidCopyFrom,
246249
KnownTestType.PostgresArrayCopyFrom,
247250
]
248251
}

end2end/EndToEndScaffold/Templates/PostgresTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,46 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTy
830830
}
831831
}
832832
"""
833+
},
834+
[KnownTestType.PostgresGuidCopyFrom] = new TestImpl
835+
{
836+
Impl = $$"""
837+
private static IEnumerable<TestCaseData> PostgresGuidCopyFromTestCases
838+
{
839+
get
840+
{
841+
yield return new TestCaseData(200, Guid.NewGuid()).SetName("Valid Guid Copy From");
842+
yield return new TestCaseData(10, null).SetName("Null Guid Copy From");
843+
}
844+
}
845+
846+
[Test]
847+
[TestCaseSource(nameof(PostgresGuidCopyFromTestCases))]
848+
public async Task TestPostgresGuidCopyFrom(int batchSize, Guid? cUuid)
849+
{
850+
var batchArgs = Enumerable.Range(0, batchSize)
851+
.Select(_ => new QuerySql.InsertPostgresTypesBatchArgs
852+
{
853+
CUuid = cUuid
854+
})
855+
.ToList();
856+
await QuerySql.InsertPostgresTypesBatch(batchArgs);
857+
858+
var expected = new QuerySql.GetPostgresTypesCntRow
859+
{
860+
Cnt = batchSize,
861+
CUuid = cUuid
862+
};
863+
var actual = await QuerySql.GetPostgresTypesCnt();
864+
Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.Cnt, Is.EqualTo(expected.Cnt));
865+
866+
void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y)
867+
{
868+
Assert.That(x.Cnt, Is.EqualTo(y.Cnt));
869+
Assert.That(x.CUuid, Is.EqualTo(y.CUuid));
870+
}
871+
}
872+
"""
833873
}
834874
};
835875
}

end2end/EndToEndTests/NpgsqlDapperTester.generated.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,35 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre
619619
}
620620
}
621621

622+
private static IEnumerable<TestCaseData> PostgresGuidCopyFromTestCases
623+
{
624+
get
625+
{
626+
yield return new TestCaseData(200, Guid.NewGuid()).SetName("Valid Guid Copy From");
627+
yield return new TestCaseData(10, null).SetName("Null Guid Copy From");
628+
}
629+
}
630+
631+
[Test]
632+
[TestCaseSource(nameof(PostgresGuidCopyFromTestCases))]
633+
public async Task TestPostgresGuidCopyFrom(int batchSize, Guid? cUuid)
634+
{
635+
var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CUuid = cUuid }).ToList();
636+
await QuerySql.InsertPostgresTypesBatch(batchArgs);
637+
var expected = new QuerySql.GetPostgresTypesCntRow
638+
{
639+
Cnt = batchSize,
640+
CUuid = cUuid
641+
};
642+
var actual = await QuerySql.GetPostgresTypesCnt();
643+
Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt));
644+
void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y)
645+
{
646+
Assert.That(x.Cnt, Is.EqualTo(y.Cnt));
647+
Assert.That(x.CUuid, Is.EqualTo(y.CUuid));
648+
}
649+
}
650+
622651
[Test]
623652
[TestCase(100, new byte[] { 0x53, 0x56 })]
624653
[TestCase(10, new byte[] { })]

end2end/EndToEndTests/NpgsqlTester.generated.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,35 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre
619619
}
620620
}
621621

622+
private static IEnumerable<TestCaseData> PostgresGuidCopyFromTestCases
623+
{
624+
get
625+
{
626+
yield return new TestCaseData(200, Guid.NewGuid()).SetName("Valid Guid Copy From");
627+
yield return new TestCaseData(10, null).SetName("Null Guid Copy From");
628+
}
629+
}
630+
631+
[Test]
632+
[TestCaseSource(nameof(PostgresGuidCopyFromTestCases))]
633+
public async Task TestPostgresGuidCopyFrom(int batchSize, Guid? cUuid)
634+
{
635+
var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CUuid = cUuid }).ToList();
636+
await QuerySql.InsertPostgresTypesBatch(batchArgs);
637+
var expected = new QuerySql.GetPostgresTypesCntRow
638+
{
639+
Cnt = batchSize,
640+
CUuid = cUuid
641+
};
642+
var actual = await QuerySql.GetPostgresTypesCnt();
643+
Assert.That(actual.Value.Cnt, Is.EqualTo(expected.Cnt));
644+
void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y)
645+
{
646+
Assert.That(x.Cnt, Is.EqualTo(y.Cnt));
647+
Assert.That(x.CUuid, Is.EqualTo(y.CUuid));
648+
}
649+
}
650+
622651
[Test]
623652
[TestCase(100, new byte[] { 0x53, 0x56 })]
624653
[TestCase(10, new byte[] { })]

end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,35 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre
619619
}
620620
}
621621

622+
private static IEnumerable<TestCaseData> PostgresGuidCopyFromTestCases
623+
{
624+
get
625+
{
626+
yield return new TestCaseData(200, Guid.NewGuid()).SetName("Valid Guid Copy From");
627+
yield return new TestCaseData(10, null).SetName("Null Guid Copy From");
628+
}
629+
}
630+
631+
[Test]
632+
[TestCaseSource(nameof(PostgresGuidCopyFromTestCases))]
633+
public async Task TestPostgresGuidCopyFrom(int batchSize, Guid? cUuid)
634+
{
635+
var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CUuid = cUuid }).ToList();
636+
await QuerySql.InsertPostgresTypesBatch(batchArgs);
637+
var expected = new QuerySql.GetPostgresTypesCntRow
638+
{
639+
Cnt = batchSize,
640+
CUuid = cUuid
641+
};
642+
var actual = await QuerySql.GetPostgresTypesCnt();
643+
Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt));
644+
void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y)
645+
{
646+
Assert.That(x.Cnt, Is.EqualTo(y.Cnt));
647+
Assert.That(x.CUuid, Is.EqualTo(y.CUuid));
648+
}
649+
}
650+
622651
[Test]
623652
[TestCase(100, new byte[] { 0x53, 0x56 })]
624653
[TestCase(10, new byte[] { })]

end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,35 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre
619619
}
620620
}
621621

622+
private static IEnumerable<TestCaseData> PostgresGuidCopyFromTestCases
623+
{
624+
get
625+
{
626+
yield return new TestCaseData(200, Guid.NewGuid()).SetName("Valid Guid Copy From");
627+
yield return new TestCaseData(10, null).SetName("Null Guid Copy From");
628+
}
629+
}
630+
631+
[Test]
632+
[TestCaseSource(nameof(PostgresGuidCopyFromTestCases))]
633+
public async Task TestPostgresGuidCopyFrom(int batchSize, Guid? cUuid)
634+
{
635+
var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CUuid = cUuid }).ToList();
636+
await QuerySql.InsertPostgresTypesBatch(batchArgs);
637+
var expected = new QuerySql.GetPostgresTypesCntRow
638+
{
639+
Cnt = batchSize,
640+
CUuid = cUuid
641+
};
642+
var actual = await QuerySql.GetPostgresTypesCnt();
643+
Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt));
644+
void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y)
645+
{
646+
Assert.That(x.Cnt, Is.EqualTo(y.Cnt));
647+
Assert.That(x.CUuid, Is.EqualTo(y.CUuid));
648+
}
649+
}
650+
622651
[Test]
623652
[TestCase(100, new byte[] { 0x53, 0x56 })]
624653
[TestCase(10, new byte[] { })]

examples/NpgsqlDapperExample/QuerySql.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args)
603603
await this.Transaction.Connection.ExecuteAsync(InsertPostgresTypesSql, queryParams, transaction: this.Transaction);
604604
}
605605

606-
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_char, c_varchar, c_character_varying, c_bpchar, c_text, c_bytea) FROM STDIN (FORMAT BINARY)";
606+
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_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)";
607607
public class InsertPostgresTypesBatchArgs
608608
{
609609
public bool? CBoolean { get; init; }
@@ -624,6 +624,7 @@ public class InsertPostgresTypesBatchArgs
624624
public string? CCharacterVarying { get; init; }
625625
public string? CBpchar { get; init; }
626626
public string? CText { get; init; }
627+
public Guid? CUuid { get; init; }
627628
public byte[]? CBytea { get; init; }
628629
};
629630
public async Task InsertPostgresTypesBatch(List<InsertPostgresTypesBatchArgs> args)
@@ -654,6 +655,7 @@ public async Task InsertPostgresTypesBatch(List<InsertPostgresTypesBatchArgs> ar
654655
await writer.WriteAsync(row.CCharacterVarying);
655656
await writer.WriteAsync(row.CBpchar);
656657
await writer.WriteAsync(row.CText);
658+
await writer.WriteAsync(row.CUuid, NpgsqlDbType.Uuid);
657659
await writer.WriteAsync(row.CBytea);
658660
}
659661

@@ -717,7 +719,7 @@ public class GetPostgresTypesRow
717719
return await this.Transaction.Connection.QueryFirstOrDefaultAsync<GetPostgresTypesRow?>(GetPostgresTypesSql, transaction: this.Transaction);
718720
}
719721

720-
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_char, c_varchar, c_character_varying, c_bpchar, c_text, 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_char, c_varchar, c_character_varying, c_bpchar, c_text, c_bytea LIMIT 1 ";
722+
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_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_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 ";
721723
public class GetPostgresTypesCntRow
722724
{
723725
public short? CSmallint { get; init; }
@@ -738,6 +740,7 @@ public class GetPostgresTypesCntRow
738740
public string? CCharacterVarying { get; init; }
739741
public string? CBpchar { get; init; }
740742
public string? CText { get; init; }
743+
public Guid? CUuid { get; init; }
741744
public byte[]? CBytea { get; init; }
742745
public required long Cnt { get; init; }
743746
};

examples/NpgsqlDapperExample/request.json

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33588,7 +33588,7 @@
3358833588
}
3358933589
},
3359033590
{
33591-
"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_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\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)",
33591+
"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_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)",
3359233592
"name": "InsertPostgresTypesBatch",
3359333593
"cmd": ":copyfrom",
3359433594
"parameters": [
@@ -33864,6 +33864,21 @@
3386433864
},
3386533865
{
3386633866
"number": 19,
33867+
"column": {
33868+
"name": "c_uuid",
33869+
"length": -1,
33870+
"table": {
33871+
"schema": "public",
33872+
"name": "postgres_types"
33873+
},
33874+
"type": {
33875+
"name": "uuid"
33876+
},
33877+
"originalName": "c_uuid"
33878+
}
33879+
},
33880+
{
33881+
"number": 20,
3386733882
"column": {
3386833883
"name": "c_bytea",
3386933884
"length": -1,
@@ -34253,7 +34268,7 @@
3425334268
"filename": "query.sql"
3425434269
},
3425534270
{
34256-
"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_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\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_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_bytea\nLIMIT 1",
34271+
"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_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_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1",
3425734272
"name": "GetPostgresTypesCnt",
3425834273
"cmd": ":one",
3425934274
"columns": [
@@ -34469,6 +34484,17 @@
3446934484
},
3447034485
"originalName": "c_text"
3447134486
},
34487+
{
34488+
"name": "c_uuid",
34489+
"length": -1,
34490+
"table": {
34491+
"name": "postgres_types"
34492+
},
34493+
"type": {
34494+
"name": "uuid"
34495+
},
34496+
"originalName": "c_uuid"
34497+
},
3447234498
{
3447334499
"name": "c_bytea",
3447434500
"length": -1,

0 commit comments

Comments
 (0)