Skip to content

Commit 917fd32

Browse files
authored
Fixed double/real + added timestamp, numeric, date & json (#338)
1 parent 5463a8d commit 917fd32

File tree

5 files changed

+94
-4
lines changed

5 files changed

+94
-4
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 3.2.1
4+
5+
- Added or fixed decoders support for `QueryMode.simple`:
6+
`double`, `real`, `timestampWithTimezone`, `timestampWithoutTimezone`,
7+
`date`, `numeric`, `json`, `jsonb` [#338](https://github.com/isoos/postgresql-dart/pull/338) by [pst9354](https://github.com/pst9354).
8+
39
## 3.2.0
410

511
- Support for `tsvector` and `tsquery` types.

lib/src/types/text_codec.dart

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ class PostgresTextDecoder {
240240
return int.parse(di.asText);
241241
case TypeOid.real:
242242
case TypeOid.double:
243-
return num.parse(di.asText);
243+
return double.parse(di.asText);
244244
case TypeOid.boolean:
245245
// In text data format when using simple query protocol, "true" & "false"
246246
// are represented as `t` and `f`, respectively.
@@ -255,12 +255,31 @@ class PostgresTextDecoder {
255255

256256
case TypeOid.timestampWithTimezone:
257257
case TypeOid.timestampWithoutTimezone:
258-
case TypeOid.interval:
258+
final raw = DateTime.parse(di.asText);
259+
return DateTime.utc(
260+
raw.year,
261+
raw.month,
262+
raw.day,
263+
raw.hour,
264+
raw.minute,
265+
raw.second,
266+
raw.millisecond,
267+
raw.microsecond,
268+
);
269+
259270
case TypeOid.numeric:
260-
case TypeOid.byteArray:
271+
return di.asText;
272+
261273
case TypeOid.date:
274+
final raw = DateTime.parse(di.asText);
275+
return DateTime.utc(raw.year, raw.month, raw.day);
276+
262277
case TypeOid.json:
263278
case TypeOid.jsonb:
279+
return jsonDecode(di.asText);
280+
281+
case TypeOid.interval:
282+
case TypeOid.byteArray:
264283
case TypeOid.uuid:
265284
case TypeOid.point:
266285
case TypeOid.booleanArray:

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: postgres
22
description: PostgreSQL database driver. Supports statement reuse and binary protocol and connection pooling.
3-
version: 3.2.0
3+
version: 3.2.1
44
homepage: https://github.com/isoos/postgresql-dart
55
topics:
66
- sql

test/decode_test.dart

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,69 @@ import 'package:test/test.dart';
44
import 'docker.dart';
55

66
void main() {
7+
withPostgresServer('simple query protocol decode', (server) {
8+
late Connection conn;
9+
setUp(() async {
10+
conn = await server.newConnection(queryMode: QueryMode.simple);
11+
});
12+
tearDown(() async {
13+
await conn.close();
14+
});
15+
16+
test('double', () async {
17+
final rs = await conn.execute('SELECT 3.14::DOUBLE PRECISION');
18+
expect(rs.single.single, 3.14);
19+
});
20+
21+
test('timestamp with time zones', () async {
22+
final rs = await conn.execute(
23+
"SELECT '1999-01-08 04:05:06 -8:00'::TIMESTAMP WITH TIME ZONE");
24+
final item = rs.single.single as DateTime;
25+
expect(item.toIso8601String(), '1999-01-08T12:05:06.000Z');
26+
});
27+
28+
test('timestamp without time zones', () async {
29+
final rs = await conn
30+
.execute("SELECT '1999-01-08 04:05:06'::TIMESTAMP WITHOUT TIME ZONE");
31+
final item = rs.single.single as DateTime;
32+
expect(item.toIso8601String(), '1999-01-08T04:05:06.000Z');
33+
});
34+
35+
test('interval', () async {
36+
final rs = await conn.execute(
37+
"SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::INTERVAL");
38+
final item = rs.single.single;
39+
expect((item as UndecodedBytes).asString,
40+
'3 years 3 mons 700 days 133:17:36.789');
41+
// should be:
42+
// expect(item, Interval(months: 39, days: 700, microseconds: 479856789000));
43+
});
44+
45+
test('numeric', () async {
46+
final rs = await conn.execute('SELECT 3.141::NUMERIC(5,2)');
47+
final item = rs.single.single;
48+
expect(item, '3.14');
49+
});
50+
51+
test('date', () async {
52+
final rs = await conn.execute("SELECT '1999-01-08'::DATE");
53+
final item = rs.single.single as DateTime;
54+
expect(item.toIso8601String(), '1999-01-08T00:00:00.000Z');
55+
});
56+
57+
test('json', () async {
58+
final rs = await conn.execute("SELECT '{\"a\": 1}'::JSON");
59+
final item = rs.single.single;
60+
expect(item, {'a': 1});
61+
});
62+
63+
test('jsonb', () async {
64+
final rs = await conn.execute("SELECT '{\"a\": 1}'::JSONB");
65+
final item = rs.single.single;
66+
expect(item, {'a': 1});
67+
});
68+
});
69+
770
withPostgresServer('decode', (server) {
871
late Connection connection;
972
setUp(() async {

test/docker.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class PostgresServer {
6262
Future<Connection> newConnection({
6363
ReplicationMode replicationMode = ReplicationMode.none,
6464
SslMode? sslMode,
65+
QueryMode? queryMode,
6566
}) async {
6667
return Connection.open(
6768
await endpoint(),
@@ -71,6 +72,7 @@ class PostgresServer {
7172
replicationMode: replicationMode,
7273
transformer: loggingTransformer('conn'),
7374
sslMode: sslMode,
75+
queryMode: queryMode,
7476
),
7577
);
7678
}

0 commit comments

Comments
 (0)