Skip to content

Commit 19eeaea

Browse files
authored
Merge pull request #31 from HuaweiCloudDeveloper/copilot/fix-107914163-935255308-db418157-4484-4b8f-9756-befc7b1bf9f4
Add VARCHAR2/NVARCHAR2 type support for Oracle migration compatibility
2 parents e4514c9 + 347e323 commit 19eeaea

File tree

12 files changed

+130
-14
lines changed

12 files changed

+130
-14
lines changed

.github/workflows/test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ jobs:
2222
test:
2323
runs-on: "ubuntu-latest"
2424
env:
25+
# do not specify IncludeErrorDetail=true in connection string directly, it would affect the unit tests
2526
NPGSQL_TEST_DB: "Host=localhost;Port=5432;Username=gaussdb;Password=Password@1234;Database=gaussdb_tests;"
2627

2728
# Service containers to run with `container-job`
@@ -45,6 +46,7 @@ jobs:
4546
--health-retries 10
4647
4748
strategy:
49+
max-parallel: 1
4850
matrix:
4951
include:
5052
- config: Release

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project>
22
<PropertyGroup>
3-
<VersionPrefix>0.1.0</VersionPrefix>
3+
<VersionPrefix>0.1.1</VersionPrefix>
44
<LangVersion>latest</LangVersion>
55
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
66
<Nullable>enable</Nullable>

example/GetStarted/Program.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@
1717

1818
await ConnectionTest();
1919

20-
var tableName = "employees";
21-
// id int, name varchar(128), age int
20+
var tableName = $"employees_{Guid.NewGuid():N}";
21+
2222
{
2323
await ExecuteTableScript(async () =>
2424
{
2525
// insert
2626
{
2727
var insertSql = $"""
28-
INSERT INTO {tableName} (id, name, age) VALUES
29-
(1, 'John', 30),
30-
(2, 'Alice', 16),
31-
(3, 'Mike', 24)
28+
INSERT INTO {tableName} (id, name, age, bio, description) VALUES
29+
(1, 'John', 30, 'j', 'Manager'),
30+
(2, 'Alice', 16, 'a', 'Intern'),
31+
(3, 'Mike', 24, 'm', 'Developer')
3232
""";
3333
await using var cmd = new GaussDBCommand(insertSql, conn);
3434
await cmd.ExecuteNonQueryAsync();
@@ -99,6 +99,8 @@ CREATE TABLE {tableName}
9999
(
100100
id INT PRIMARY KEY,
101101
name VARCHAR(128),
102+
bio VARCHAR2(512),
103+
description NVARCHAR2(1024),
102104
age INT
103105
);
104106
""";
@@ -108,6 +110,7 @@ age INT
108110
{
109111
await using var createTableCommand = new GaussDBCommand(createTableSql, conn);
110112
await createTableCommand.ExecuteNonQueryAsync();
113+
Console.WriteLine($@"Table {tableName} created");
111114

112115
await func();
113116
}
@@ -121,6 +124,7 @@ age INT
121124
{
122125
await using var dropTableCommand = new GaussDBCommand(dropTableSql, conn);
123126
await dropTableCommand.ExecuteNonQueryAsync();
127+
Console.WriteLine($@"Table {tableName} dropped");
124128
}
125129
catch (Exception e)
126130
{
@@ -146,8 +150,10 @@ async Task QueryTest(string? condition = null)
146150
var id = reader.GetInt32("id");
147151
var name = reader.GetString("name");
148152
var age = reader.GetInt32("age");
153+
var bio = reader.GetString("bio");
154+
var description = reader.GetString("description");
149155

150-
Console.WriteLine($@"ID: {id}, Name: {name}, Age: {age}");
156+
Console.WriteLine($@"ID: {id}, Name: {name}, Age: {age}, Bio: {bio}, Description: {description}");
151157
}
152158
}
153159
}

src/GaussDB/GaussDB.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<ProjectReference Include="../GaussDB.SourceGenerators/GaussDB.SourceGenerators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
1919
</ItemGroup>
2020

21-
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
21+
<ItemGroup>
2222
<PackageReference Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" PrivateAssets="All" />
2323
</ItemGroup>
2424

src/GaussDB/GaussDBParameter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ void HandleSizeTruncation()
645645
return;
646646

647647
var dataTypeName = TypeInfo!.Options.GetDataTypeName(PgTypeId);
648-
if (dataTypeName == DataTypeNames.Text || dataTypeName == DataTypeNames.Varchar || dataTypeName == DataTypeNames.Bpchar)
648+
if (dataTypeName == DataTypeNames.Text || dataTypeName == DataTypeNames.Varchar || dataTypeName == DataTypeNames.Varchar2 || dataTypeName == DataTypeNames.NVarchar2 || dataTypeName == DataTypeNames.Bpchar)
649649
{
650650
if (value is string s && s.Length > _size)
651651
Value = s.Substring(0, _size);

src/GaussDB/GaussDBSchema.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,8 @@ static void PopulateHardcodedDataTypeInfo(DataRow row, PostgresType type)
945945
switch (type.Name)
946946
{
947947
case "varchar":
948+
case "varchar2":
949+
case "nvarchar2":
948950
case "char":
949951
row["DataType"] = "String";
950952
row["IsBestMatch"] = false;

src/GaussDB/GaussDBTypes/GaussDBDbType.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,16 @@ public enum GaussDBDbType
145145
/// <remarks>See https://www.postgresql.org/docs/current/static/datatype-character.html</remarks>
146146
Varchar = 22,
147147

148+
/// <summary>
149+
/// Variable-length string. For Oracle compatibility.
150+
/// </summary>
151+
Varchar2 = 2223,
152+
153+
/// <summary>
154+
/// Variable-length string. For Oracle compatibility.
155+
/// </summary>
156+
NVarchar2 = 2224,
157+
148158
/// <summary>
149159
/// Corresponds to the PostgreSQL internal "name" type.
150160
/// </summary>
@@ -624,6 +634,8 @@ public static DbType ToDbType(this GaussDBDbType gaussdbDbType)
624634
GaussDBDbType.Text => DbType.String,
625635
GaussDBDbType.Xml => DbType.Xml,
626636
GaussDBDbType.Varchar => DbType.String,
637+
GaussDBDbType.Varchar2 => DbType.String,
638+
GaussDBDbType.NVarchar2 => DbType.String,
627639
GaussDBDbType.Char => DbType.String,
628640
GaussDBDbType.Name => DbType.String,
629641
GaussDBDbType.Citext => DbType.String,
@@ -665,6 +677,8 @@ public static DbType ToDbType(this GaussDBDbType gaussdbDbType)
665677
GaussDBDbType.Text => "text",
666678
GaussDBDbType.Xml => "xml",
667679
GaussDBDbType.Varchar => "varchar",
680+
GaussDBDbType.Varchar2 => "varchar2",
681+
GaussDBDbType.NVarchar2 => "nvarchar2",
668682
GaussDBDbType.Char => "bpchar",
669683
GaussDBDbType.Name => "name",
670684
GaussDBDbType.Refcursor => "refcursor",
@@ -782,6 +796,8 @@ internal static string ToUnqualifiedDataTypeNameOrThrow(this GaussDBDbType gauss
782796
GaussDBDbType.Text => DataTypeNames.Text,
783797
GaussDBDbType.Xml => DataTypeNames.Xml,
784798
GaussDBDbType.Varchar => DataTypeNames.Varchar,
799+
GaussDBDbType.Varchar2 => DataTypeNames.Varchar2,
800+
GaussDBDbType.NVarchar2 => DataTypeNames.NVarchar2,
785801
GaussDBDbType.Char => DataTypeNames.Bpchar,
786802
GaussDBDbType.Name => DataTypeNames.Name,
787803
GaussDBDbType.Refcursor => DataTypeNames.RefCursor,
@@ -890,6 +906,8 @@ _ when gaussdbDbType.HasFlag(GaussDBDbType.Multirange)
890906
"text" => GaussDBDbType.Text,
891907
"xml" => GaussDBDbType.Xml,
892908
"varchar" => GaussDBDbType.Varchar,
909+
"varchar2" => GaussDBDbType.Varchar2,
910+
"nvarchar2" => GaussDBDbType.NVarchar2,
893911
"bpchar" => GaussDBDbType.Char,
894912
"name" => GaussDBDbType.Name,
895913
"refcursor" => GaussDBDbType.Refcursor,

src/GaussDB/Internal/Postgres/DataTypeNames.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ static class DataTypeNames
3434
public static DataTypeName Bpchar => ValidatedName("pg_catalog.bpchar");
3535
public static DataTypeName Text => ValidatedName("pg_catalog.text");
3636
public static DataTypeName Varchar => ValidatedName("pg_catalog.varchar");
37+
public static DataTypeName Varchar2 => ValidatedName("pg_catalog.varchar2");
38+
public static DataTypeName NVarchar2 => ValidatedName("pg_catalog.nvarchar2");
3739
public static DataTypeName Char => ValidatedName("pg_catalog.char");
3840
public static DataTypeName Name => ValidatedName("pg_catalog.name");
3941
public static DataTypeName Bytea => ValidatedName("pg_catalog.bytea");

src/GaussDB/Internal/ResolverFactories/AdoTypeInfoResolverFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
9898
MatchRequirement.DataTypeName);
9999

100100
// Alternative text types
101-
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar,
101+
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar, DataTypeNames.Varchar2, DataTypeNames.NVarchar2,
102102
DataTypeNames.Bpchar, DataTypeNames.Json,
103103
DataTypeNames.Xml, DataTypeNames.Name, DataTypeNames.RefCursor })
104104
{
@@ -375,7 +375,7 @@ static TypeInfoMappingCollection AddMappings(TypeInfoMappingCollection mappings)
375375
mappings.AddArrayType<Stream>(DataTypeNames.Text);
376376

377377
// Alternative text types
378-
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar,
378+
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar, DataTypeNames.Varchar2, DataTypeNames.NVarchar2,
379379
DataTypeNames.Bpchar, DataTypeNames.Json,
380380
DataTypeNames.Xml, DataTypeNames.Name, DataTypeNames.RefCursor })
381381
{

src/GaussDB/Internal/ResolverFactories/ExtraConversionsTypeInfoResolverFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static TypeInfoMappingCollection AddInfos(TypeInfoMappingCollection mappings)
113113
static (options, mapping, _) => mapping.CreateInfo(options, new CharArraySegmentTextConverter(options.TextEncoding), preferredFormat: DataFormat.Text));
114114

115115
// Alternative text types
116-
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar,
116+
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar, DataTypeNames.Varchar2, DataTypeNames.NVarchar2,
117117
DataTypeNames.Bpchar, DataTypeNames.Json,
118118
DataTypeNames.Xml, DataTypeNames.Name, DataTypeNames.RefCursor })
119119
{
@@ -211,7 +211,7 @@ static TypeInfoMappingCollection AddArrayInfos(TypeInfoMappingCollection mapping
211211
mappings.AddStructArrayType<ArraySegment<char>>(DataTypeNames.Text);
212212

213213
// Alternative text types
214-
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar,
214+
foreach(var dataTypeName in new[] { "citext", DataTypeNames.Varchar, DataTypeNames.Varchar2, DataTypeNames.NVarchar2,
215215
DataTypeNames.Bpchar, DataTypeNames.Json,
216216
DataTypeNames.Xml, DataTypeNames.Name, DataTypeNames.RefCursor })
217217
{

0 commit comments

Comments
 (0)