Skip to content

Commit c5e5ea8

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

File tree

3 files changed

+225
-0
lines changed

3 files changed

+225
-0
lines changed

by-language/csharp-npgsql/DemoProgram.cs

+1
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

+190
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
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+
//public string[]? SummaryWords { get; set; }
56+
}
57+
58+
public class DatabaseWorkloadsMore
59+
{
60+
61+
public static async Task<DataTable> AllTypesExample(NpgsqlConnection conn)
62+
{
63+
Console.WriteLine("Running AllTypesExample");
64+
65+
// Submit DDL, create database schema.
66+
await using (var cmd = new NpgsqlCommand("DROP TABLE IF EXISTS testdrive.example", conn))
67+
{
68+
cmd.ExecuteNonQuery();
69+
}
70+
71+
await using (var cmd = new NpgsqlCommand(@"
72+
CREATE TABLE testdrive.example (
73+
-- Numeric types
74+
null_integer INT,
75+
integer INT,
76+
bigint BIGINT,
77+
float FLOAT,
78+
double DOUBLE,
79+
decimal DECIMAL(8, 2),
80+
-- Other scalar types
81+
bit BIT(8),
82+
bool BOOLEAN,
83+
text TEXT,
84+
char CHARACTER(5),
85+
timestamp_tz TIMESTAMP WITH TIME ZONE,
86+
timestamp_notz TIMESTAMP WITHOUT TIME ZONE,
87+
ip IP,
88+
-- Container types
89+
""array"" ARRAY(STRING),
90+
""object"" OBJECT(DYNAMIC),
91+
-- Geospatial types
92+
geopoint GEO_POINT,
93+
geoshape GEO_SHAPE,
94+
-- Vector type
95+
""float_vector"" FLOAT_VECTOR(3)
96+
);
97+
", conn))
98+
{
99+
cmd.ExecuteNonQuery();
100+
}
101+
102+
// Insert single data point.
103+
await using (var cmd = new NpgsqlCommand(@"
104+
INSERT INTO testdrive.example (
105+
null_integer,
106+
integer,
107+
bigint,
108+
float,
109+
double,
110+
decimal,
111+
bit,
112+
bool,
113+
text,
114+
char,
115+
timestamp_tz,
116+
timestamp_notz,
117+
ip,
118+
""array"",
119+
-- ""object"",
120+
geopoint,
121+
-- geoshape,
122+
float_vector
123+
) VALUES (
124+
@null_integer,
125+
@integer,
126+
@bigint,
127+
@float,
128+
@double,
129+
@decimal,
130+
@bit,
131+
@bool,
132+
@text,
133+
@char,
134+
@timestamp_tz,
135+
@timestamp_notz,
136+
@ip,
137+
@array,
138+
-- @object,
139+
@geopoint,
140+
-- @egoshape,
141+
@float_vector
142+
);
143+
", conn))
144+
{
145+
Console.WriteLine(cmd);
146+
cmd.Parameters.AddWithValue("null_integer", DBNull.Value);
147+
cmd.Parameters.AddWithValue("integer", 42);
148+
cmd.Parameters.AddWithValue("bigint", 42);
149+
cmd.Parameters.AddWithValue("float", 42.42);
150+
cmd.Parameters.AddWithValue("double", 42.42);
151+
cmd.Parameters.AddWithValue("decimal", 42.42);
152+
cmd.Parameters.AddWithValue("bit", "01010101");
153+
cmd.Parameters.AddWithValue("bool", true);
154+
cmd.Parameters.AddWithValue("text", "foobar");
155+
cmd.Parameters.AddWithValue("char", "foo");
156+
cmd.Parameters.AddWithValue("timestamp_tz", "1970-01-02T00:00:00+01:00");
157+
cmd.Parameters.AddWithValue("timestamp_notz", "1970-01-02T00:00:00");
158+
cmd.Parameters.AddWithValue("ip", "127.0.0.1");
159+
cmd.Parameters.AddWithValue("array", new List<string>{"foo", "bar"});
160+
// FIXME: System.NotSupportedException: Cannot resolve 'hstore' to a fully qualified datatype name. The datatype was not found in the current database info.
161+
// cmd.Parameters.AddWithValue("object", new Dictionary<string, string>(){{"foo", "bar"}});
162+
cmd.Parameters.AddWithValue("geopoint", new List<double>{85.43, 66.23});
163+
// FIXME: Npgsql.PostgresException : XX000: line 38:9: no viable alternative at input 'VALUES
164+
// cmd.Parameters.AddWithValue("geoshape", "POLYGON ((5 5, 10 5, 10 10, 5 10, 5 5))");
165+
cmd.Parameters.AddWithValue("float_vector", new List<double> {1.1, 2.2, 3.3});
166+
cmd.ExecuteNonQuery();
167+
}
168+
169+
// Flush data.
170+
await using (var cmd = new NpgsqlCommand("REFRESH TABLE testdrive.example", conn))
171+
{
172+
cmd.ExecuteNonQuery();
173+
}
174+
175+
// Query back data.
176+
await using (var cmd = new NpgsqlCommand("SELECT * FROM testdrive.example", conn))
177+
await using (var reader = cmd.ExecuteReader())
178+
{
179+
var dataTable = new DataTable();
180+
dataTable.Load(reader);
181+
var payload = JsonConvert.SerializeObject(dataTable);
182+
Console.WriteLine(payload);
183+
return (DataTable) dataTable;
184+
}
185+
186+
}
187+
188+
}
189+
190+
}

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

+34
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)