Skip to content

Commit c02028f

Browse files
committed
Npgsql: Add test validating (almost) all data types of CrateDB
1 parent 2f2c533 commit c02028f

File tree

3 files changed

+223
-0
lines changed

3 files changed

+223
-0
lines changed

by-language/csharp-npgsql/DemoProgram.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ await Parser.Default.ParseArguments<Options>(args)
2323
await DatabaseWorkloads.SystemQueryExample(conn);
2424
await DatabaseWorkloads.BasicConversationExample(conn);
2525
await DatabaseWorkloads.UnnestExample(conn);
26+
await DatabaseWorkloadsMore.AllTypesExample(conn);
2627
conn.Close();
2728
});
2829

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
#nullable enable
2+
using System;
3+
using System.Collections;
4+
using System.Collections.Generic;
5+
using System.Data;
6+
using System.Reflection;
7+
using System.Threading.Tasks;
8+
using Newtonsoft.Json;
9+
using Npgsql;
10+
using NpgsqlTypes;
11+
12+
namespace demo
13+
{
14+
15+
public class AllTypesRecord
16+
{
17+
[JsonProperty("null_integer", NullValueHandling = NullValueHandling.Ignore)]
18+
public int? NullInteger { get; set; }
19+
[JsonProperty("integer")]
20+
public int? Integer { get; set; }
21+
[JsonProperty("bigint")]
22+
public long? Bigint { get; set; }
23+
[JsonProperty("float")]
24+
public float? Float { get; set; }
25+
[JsonProperty("double")]
26+
public double? Double { get; set; }
27+
[JsonProperty("decimal")]
28+
public decimal? Decimal { get; set; }
29+
//[JsonProperty("bit")]
30+
//public BitArray Bit { get; set; }
31+
[JsonProperty("bool")]
32+
public bool? Bool { get; set; }
33+
[JsonProperty("text")]
34+
public string? Text { get; set; }
35+
[JsonProperty("char")]
36+
public string? Char { get; set; }
37+
[JsonProperty("timestamp_tz")]
38+
public string? Timestamp { get; set; }
39+
[JsonProperty("timestamp_notz")]
40+
public string? TimestampNoTz { get; set; }
41+
[JsonProperty("ip")]
42+
public string? Ip { get; set; }
43+
44+
[JsonProperty("array")]
45+
public IList<string>? Array { get; set; }
46+
[JsonProperty("object")]
47+
public Dictionary<string, string>? Object { get; set; }
48+
[JsonProperty("geopoint")]
49+
public Dictionary<string, double>? Geopoint { get; set; }
50+
[JsonProperty("geoshape")]
51+
public Dictionary<string, string>? Geoshape { get; set; }
52+
[JsonProperty("float_vector")]
53+
public IList<string>? FloatVector { get; set; }
54+
}
55+
56+
public class DatabaseWorkloadsMore
57+
{
58+
59+
public static async Task<DataTable> AllTypesExample(NpgsqlConnection conn)
60+
{
61+
Console.WriteLine("Running AllTypesExample");
62+
63+
// Submit DDL, create database schema.
64+
await using (var cmd = new NpgsqlCommand("DROP TABLE IF EXISTS testdrive.example", conn))
65+
{
66+
cmd.ExecuteNonQuery();
67+
}
68+
69+
await using (var cmd = new NpgsqlCommand(@"
70+
CREATE TABLE testdrive.example (
71+
-- Numeric types
72+
null_integer INT,
73+
integer INT,
74+
bigint BIGINT,
75+
float FLOAT,
76+
double DOUBLE,
77+
decimal DECIMAL(8, 2),
78+
-- Other scalar types
79+
bit BIT(8),
80+
bool BOOLEAN,
81+
text TEXT,
82+
char CHARACTER(5),
83+
timestamp_tz TIMESTAMP WITH TIME ZONE,
84+
timestamp_notz TIMESTAMP WITHOUT TIME ZONE,
85+
ip IP,
86+
-- Container types
87+
""array"" ARRAY(STRING),
88+
""object"" OBJECT(DYNAMIC),
89+
-- Geospatial types
90+
geopoint GEO_POINT,
91+
geoshape GEO_SHAPE,
92+
-- Vector type
93+
""float_vector"" FLOAT_VECTOR(3)
94+
);
95+
", conn))
96+
{
97+
cmd.ExecuteNonQuery();
98+
}
99+
100+
// Insert single data point.
101+
await using (var cmd = new NpgsqlCommand(@"
102+
INSERT INTO testdrive.example (
103+
null_integer,
104+
integer,
105+
bigint,
106+
float,
107+
double,
108+
decimal,
109+
bit,
110+
bool,
111+
text,
112+
char,
113+
timestamp_tz,
114+
timestamp_notz,
115+
ip,
116+
""array"",
117+
-- ""object"",
118+
geopoint,
119+
-- geoshape,
120+
float_vector
121+
) VALUES (
122+
@null_integer,
123+
@integer,
124+
@bigint,
125+
@float,
126+
@double,
127+
@decimal,
128+
@bit,
129+
@bool,
130+
@text,
131+
@char,
132+
@timestamp_tz,
133+
@timestamp_notz,
134+
@ip,
135+
@array,
136+
-- @object,
137+
@geopoint,
138+
-- @egoshape,
139+
@float_vector
140+
);
141+
", conn))
142+
{
143+
Console.WriteLine(cmd);
144+
cmd.Parameters.AddWithValue("null_integer", DBNull.Value);
145+
cmd.Parameters.AddWithValue("integer", 42);
146+
cmd.Parameters.AddWithValue("bigint", 42);
147+
cmd.Parameters.AddWithValue("float", 42.42);
148+
cmd.Parameters.AddWithValue("double", 42.42);
149+
cmd.Parameters.AddWithValue("decimal", 42.42);
150+
cmd.Parameters.AddWithValue("bit", "01010101");
151+
cmd.Parameters.AddWithValue("bool", true);
152+
cmd.Parameters.AddWithValue("text", "foobar");
153+
cmd.Parameters.AddWithValue("char", "foo");
154+
cmd.Parameters.AddWithValue("timestamp_tz", "1970-01-02T00:00:00+01:00");
155+
cmd.Parameters.AddWithValue("timestamp_notz", "1970-01-02T00:00:00");
156+
cmd.Parameters.AddWithValue("ip", "127.0.0.1");
157+
cmd.Parameters.AddWithValue("array", new List<string>{"foo", "bar"});
158+
// FIXME: System.NotSupportedException: Cannot resolve 'hstore' to a fully qualified datatype name. The datatype was not found in the current database info.
159+
// cmd.Parameters.AddWithValue("object", new Dictionary<string, string>(){{"foo", "bar"}});
160+
cmd.Parameters.AddWithValue("geopoint", new List<double>{85.43, 66.23});
161+
// FIXME: Npgsql.PostgresException : XX000: line 38:9: no viable alternative at input 'VALUES
162+
// cmd.Parameters.AddWithValue("geoshape", "POLYGON ((5 5, 10 5, 10 10, 5 10, 5 5))");
163+
cmd.Parameters.AddWithValue("float_vector", new List<double> {1.1, 2.2, 3.3});
164+
cmd.ExecuteNonQuery();
165+
}
166+
167+
// Flush data.
168+
await using (var cmd = new NpgsqlCommand("REFRESH TABLE testdrive.example", conn))
169+
{
170+
cmd.ExecuteNonQuery();
171+
}
172+
173+
// Query back data.
174+
await using (var cmd = new NpgsqlCommand("SELECT * FROM testdrive.example", conn))
175+
await using (var reader = cmd.ExecuteReader())
176+
{
177+
var dataTable = new DataTable();
178+
dataTable.Load(reader);
179+
var payload = JsonConvert.SerializeObject(dataTable);
180+
Console.WriteLine(payload);
181+
return (DataTable) dataTable;
182+
}
183+
184+
}
185+
186+
}
187+
188+
}

by-language/csharp-npgsql/tests/DemoProgramTest.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Threading.Tasks;
45
using Npgsql;
56
using Xunit;
@@ -79,5 +80,38 @@ public async Task TestUnnestExample()
7980
// Check results.
8081
Assert.Equal(10, resultCount);
8182
}
83+
84+
[Fact]
85+
public async Task TestAllTypesExample()
86+
{
87+
var conn = fixture.Db;
88+
89+
// Invoke database workload.
90+
var task = DatabaseWorkloadsMore.AllTypesExample(conn);
91+
var dt = await task.WaitAsync(TimeSpan.FromSeconds(0.5));
92+
93+
// Check results.
94+
var row = dt.Rows[0];
95+
Assert.Equal(DBNull.Value, row["null_integer"]);
96+
Assert.Equal(42, row["integer"]);
97+
Assert.Equal((Int64) 42, row["bigint"]);
98+
//Assert.Equal(42.42, (float) row["float"], 0.01);
99+
//Assert.Equal(42.42, (double) row["double"], 0.01);
100+
Assert.Equal(new decimal(42.42), row["decimal"]);
101+
Assert.Equal(new List<bool> { false, true, false, true, false, true, false, true }, row["bit"]);
102+
Assert.True((bool) row["bool"]);
103+
Assert.Equal("foobar", row["text"]);
104+
Assert.Equal("foo ", row["char"]);
105+
Assert.Equal(DateTime.Parse("1970-01-01T23:00:00.0000000"), row["timestamp_tz"]);
106+
Assert.Equal(DateTime.Parse("1970-01-02T00:00:00"), row["timestamp_notz"]);
107+
Assert.Equal("127.0.0.1", row["ip"]);
108+
Assert.Equal(new List<string>{"foo", "bar"}, row["array"]);
109+
Assert.Equal(DBNull.Value, row["object"]); // FIXME
110+
// Assert.Equal(new List<double>{85.43, 66.23}, row["geopoint"]); // TODO
111+
Assert.Equal("(85.42999997735023,66.22999997343868)", row["geopoint"].ToString()); // FIXME
112+
Assert.Equal(DBNull.Value, row["geoshape"]); // FIXME
113+
Assert.Equal((new List<double>{1.1, 2.2, 3.3}).Select(d => (float) d).ToArray(), row["float_vector"]);
114+
}
115+
82116
}
83117
}

0 commit comments

Comments
 (0)