2 using System.Collections.Generic;
4 using System.Threading.Tasks;
15 [Trait(
"Category",
"Integration")]
16 [Trait(
"Category",
"Async")]
19 #region Boolean Type Tests 25 var tableName = ctx.QualifiedTable(
"bool_test");
27 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, active BOOLEAN, PRIMARY KEY(id))");
28 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, TRUE), (2, FALSE)");
30 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName} ORDER BY id");
32 Assert.Equal(2, response.total_number_of_records);
34 var record1 = response.data[0];
35 record1.TryGetValue(
"active", out var active1);
36 Assert.Equal(1, Convert.ToInt32(active1));
37 Assert.True(Convert.ToBoolean(active1));
39 var record2 = response.data[1];
40 record2.TryGetValue(
"active", out var active2);
41 Assert.Equal(0, Convert.ToInt32(active2));
42 Assert.False(Convert.ToBoolean(active2));
47 #region Array Type Tests 53 var tableName = ctx.QualifiedTable(
"array_int_test");
56 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, int_values INTEGER[5], PRIMARY KEY(id))");
58 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, '[1, 2, 3, 4, 5]')");
60 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
62 Assert.Equal(1, response.total_number_of_records);
64 var record = response.data[0];
65 record.TryGetValue(
"int_values", out var valuesObj);
68 var valuesStr = valuesObj?.ToString();
69 Assert.NotNull(valuesStr);
72 var values = JsonConvert.DeserializeObject<
int[]>(valuesStr!);
73 Assert.NotNull(values);
74 Assert.Equal(5, values!.Length);
75 Assert.Equal(
new[] { 1, 2, 3, 4, 5 }, values);
81 using var ctx =
new TestContext(
"async_array_double");
82 var tableName = ctx.QualifiedTable(
"array_double_test");
85 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, double_values DOUBLE[3], PRIMARY KEY(id))");
87 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, '[1.1, 2.2, 3.3]')");
89 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
91 Assert.Equal(1, response.total_number_of_records);
93 var record = response.data[0];
94 record.TryGetValue(
"double_values", out var valuesObj);
96 var valuesStr = valuesObj?.ToString();
97 Assert.NotNull(valuesStr);
99 var values = JsonConvert.DeserializeObject<
double[]>(valuesStr!);
100 Assert.NotNull(values);
101 Assert.Equal(3, values!.Length);
102 Assert.Equal(1.1, values[0], 5);
103 Assert.Equal(2.2, values[1], 5);
104 Assert.Equal(3.3, values[2], 5);
109 #region Decimal Type Tests 114 using var ctx =
new TestContext(
"async_decimal_8byte");
115 var tableName = ctx.QualifiedTable(
"decimal_8byte_test");
118 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, amount DECIMAL(18,4), PRIMARY KEY(id))");
119 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, 12345.6789)");
121 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
123 Assert.Equal(1, response.total_number_of_records);
125 var record = response.data[0];
126 record.TryGetValue(
"amount", out var amountObj);
129 var amountStr = amountObj?.ToString();
130 Assert.NotNull(amountStr);
132 var amount = decimal.Parse(amountStr!);
134 Assert.Equal(12345.6789m, amount);
140 using var ctx =
new TestContext(
"async_decimal_8byte_custom");
141 var tableName = ctx.QualifiedTable(
"decimal_custom_test");
144 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, price DECIMAL(10,2), PRIMARY KEY(id))");
145 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, 99999999.99)");
147 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
149 Assert.Equal(1, response.total_number_of_records);
151 var record = response.data[0];
152 record.TryGetValue(
"price", out var priceObj);
154 var priceStr = priceObj?.ToString();
155 Assert.NotNull(priceStr);
157 var price = decimal.Parse(priceStr!);
158 Assert.Equal(99999999.99m, price);
164 using var ctx =
new TestContext(
"async_decimal_12byte");
165 var tableName = ctx.QualifiedTable(
"decimal_12byte_test");
168 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, big_amount DECIMAL(26,13), PRIMARY KEY(id))");
169 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, 1234567890123.1234567890123)");
171 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
173 Assert.Equal(1, response.total_number_of_records);
175 var record = response.data[0];
176 record.TryGetValue(
"big_amount", out var amountObj);
178 var amountStr = amountObj?.ToString();
179 Assert.NotNull(amountStr);
181 var amount = decimal.Parse(amountStr!);
183 Assert.True(Math.Abs(amount - 1234567890123.1234567890123m) < 0.0000000001m);
189 using var ctx =
new TestContext(
"async_decimal_12byte_max");
190 var tableName = ctx.QualifiedTable(
"decimal_max_test");
193 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, big_val DECIMAL(26,13), PRIMARY KEY(id))");
194 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, 9999999999999.9999999999999)");
196 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
198 Assert.Equal(1, response.total_number_of_records);
200 var record = response.data[0];
201 record.TryGetValue(
"big_val", out var valObj);
203 var valStr = valObj?.ToString();
204 Assert.NotNull(valStr);
206 var val = decimal.Parse(valStr!);
207 Assert.True(Math.Abs(val - 9999999999999.9999999999999m) < 0.0000000001m);
213 using var ctx =
new TestContext(
"async_decimal_12byte_neg");
214 var tableName = ctx.QualifiedTable(
"decimal_neg_test");
217 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, neg_val DECIMAL(26,13), PRIMARY KEY(id))");
218 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, -1234567890123.1234567890123)");
220 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
222 Assert.Equal(1, response.total_number_of_records);
224 var record = response.data[0];
225 record.TryGetValue(
"neg_val", out var valObj);
227 var valStr = valObj?.ToString();
228 Assert.NotNull(valStr);
230 var val = decimal.Parse(valStr!);
231 Assert.True(Math.Abs(val - (-1234567890123.1234567890123m)) < 0.0000000001m);
237 using var ctx =
new TestContext(
"async_decimal_typeinfo");
238 var tableName = ctx.QualifiedTable(
"decimal_typeinfo_test");
241 await ctx.Kinetica.ExecuteSqlAsync($
@"CREATE TABLE {tableName} ( 243 small_decimal DECIMAL(10,2), 244 default_decimal DECIMAL(18,4), 245 big_decimal DECIMAL(26,13), 252 var smallDecCol = columns.FirstOrDefault(c => c.getName() ==
"small_decimal");
253 Assert.NotNull(smallDecCol);
254 Assert.True(smallDecCol!.isDecimal());
255 Assert.Equal(10, smallDecCol.getDecimalPrecision());
256 Assert.Equal(2, smallDecCol.getDecimalScale());
257 Assert.Equal(8, smallDecCol.getDecimalByteSize());
260 var defaultDecCol = columns.FirstOrDefault(c => c.getName() ==
"default_decimal");
261 Assert.NotNull(defaultDecCol);
262 Assert.True(defaultDecCol!.isDecimal());
263 Assert.Equal(18, defaultDecCol.getDecimalPrecision());
264 Assert.Equal(4, defaultDecCol.getDecimalScale());
265 Assert.Equal(8, defaultDecCol.getDecimalByteSize());
268 var bigDecCol = columns.FirstOrDefault(c => c.getName() ==
"big_decimal");
269 Assert.NotNull(bigDecCol);
270 Assert.True(bigDecCol!.isDecimal());
271 Assert.Equal(26, bigDecCol.getDecimalPrecision());
272 Assert.Equal(13, bigDecCol.getDecimalScale());
273 Assert.Equal(12, bigDecCol.getDecimalByteSize());
287 #region WKT Geometry Type Tests 292 using var ctx =
new TestContext(
"async_wkt_point");
293 var tableName = ctx.QualifiedTable(
"wkt_point_test");
295 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, location GEOMETRY, PRIMARY KEY(id))");
296 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, ST_GEOMFROMTEXT('POINT(-122.4194 37.7749)'))");
298 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT id, ST_ASTEXT(location) as location_wkt FROM {tableName}");
300 Assert.Equal(1, response.total_number_of_records);
302 var record = response.data[0];
303 record.TryGetValue(
"location_wkt", out var wktObj);
305 var wkt = wktObj?.ToString();
307 Assert.Contains(
"POINT", wkt!);
313 using var ctx =
new TestContext(
"async_wkt_polygon");
314 var tableName = ctx.QualifiedTable(
"wkt_polygon_test");
316 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, area GEOMETRY, PRIMARY KEY(id))");
317 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, ST_GEOMFROMTEXT('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'))");
319 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT id, ST_ASTEXT(area) as area_wkt FROM {tableName}");
321 Assert.Equal(1, response.total_number_of_records);
323 var record = response.data[0];
324 record.TryGetValue(
"area_wkt", out var wktObj);
326 var wkt = wktObj?.ToString();
328 Assert.Contains(
"POLYGON", wkt!);
333 #region Other Type Tests 339 var tableName = ctx.QualifiedTable(
"uuid_test");
341 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, uid UUID, PRIMARY KEY(id))");
343 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, '550e8400-e29b-41d4-a716-446655440000')");
345 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
347 Assert.Equal(1, response.total_number_of_records);
349 var record = response.data[0];
350 record.TryGetValue(
"uid", out var uidObj);
352 var uidStr = uidObj?.ToString();
353 Assert.NotNull(uidStr);
355 Assert.Matches(
@"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", uidStr!.ToLower());
362 var tableName = ctx.QualifiedTable(
"json_test");
364 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, metadata JSON, PRIMARY KEY(id))");
366 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, '{{\"name\":\"test\",\"value\":123}}')");
368 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
370 Assert.Equal(1, response.total_number_of_records);
372 var record = response.data[0];
373 record.TryGetValue(
"metadata", out var jsonObj);
375 var jsonStr = jsonObj?.ToString();
376 Assert.NotNull(jsonStr);
379 var parsed = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonStr!);
380 Assert.NotNull(parsed);
381 Assert.True(parsed!.ContainsKey(
"name"));
388 var tableName = ctx.QualifiedTable(
"ulong_test");
391 await ctx.Kinetica.ExecuteSqlAsync($
"CREATE TABLE {tableName} (id INT, big_number LONG, PRIMARY KEY(id))");
392 await ctx.Kinetica.ExecuteSqlAsync($
"INSERT INTO {tableName} VALUES (1, 9223372036854775807)");
394 var response = await ctx.Kinetica.ExecuteSqlAsync($
"SELECT * FROM {tableName}");
396 Assert.Equal(1, response.total_number_of_records);
398 var record = response.data[0];
399 record.TryGetValue(
"big_number", out var numberObj);
401 Assert.NotNull(numberObj);
402 Assert.Equal(9223372036854775807L, Convert.ToInt64(numberObj));
408 using var ctx =
new TestContext(
"async_type_from_table");
409 var tableName = ctx.QualifiedTable(
"type_identification_test");
411 await ctx.Kinetica.ExecuteSqlAsync($
@"CREATE TABLE {tableName} ( 422 Assert.Equal(5, columns.Count);
424 var idCol = columns.FirstOrDefault(c => c.getName() ==
"id");
425 Assert.NotNull(idCol);
427 var nameCol = columns.FirstOrDefault(c => c.getName() ==
"name");
428 Assert.NotNull(nameCol);
430 var valueCol = columns.FirstOrDefault(c => c.getName() ==
"value");
431 Assert.NotNull(valueCol);
async Task TypeFromTable_CorrectlyIdentifiesColumnTypesAsync()
async Task ULONG_ReadsCorrectlyAsync()
async Task Decimal_12Byte_NegativeValue_ReadsCorrectlyAsync()
async Task WKT_Polygon_ReadsCorrectlyAsync()
Async tests for various data type handling in Kinetica.
async Task Decimal_TypeFromTable_ExtractsPrecisionAndScaleAsync()
async Task Decimal_8Byte_DefaultPrecision_ReadsCorrectlyAsync()
Test context that manages schema and cleanup for integration tests.
async Task Boolean_StoredAsInteger_ReadsCorrectlyAsync()
async Task UUID_ReadsCorrectlyAsync()
static KineticaType fromTable(Kinetica kinetica, string tableName)
Create a KineticaType object based on an existing table in the database.
async Task WKT_Point_ReadsCorrectlyAsync()
async Task JSON_ReadsCorrectlyAsync()
IList< Column > getColumns()
void Decimal_ColumnConstants_AreCorrect()
async Task Array_DoubleArray_ReadsCorrectlyAsync()
async Task Decimal_12Byte_NearMaxValue_ReadsCorrectlyAsync()
async Task Array_IntegerArray_ReadsCorrectlyAsync()
async Task Decimal_12Byte_HighPrecision_ReadsCorrectlyAsync()
async Task Decimal_8Byte_CustomPrecisionScale_ReadsCorrectlyAsync()