Skip to content

Commit

Permalink
Merge pull request #179 from Soremwar/add_types
Browse files Browse the repository at this point in the history
Add json array and jsonb array type
  • Loading branch information
hayd committed Oct 5, 2020
2 parents a04cd67 + 2e41990 commit c71cc2c
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 13 deletions.
2 changes: 1 addition & 1 deletion connection.ts
Expand Up @@ -30,7 +30,7 @@ import { BufReader, BufWriter } from "./deps.ts";
import { PacketWriter } from "./packet_writer.ts";
import { hashMd5Password, readUInt32BE } from "./utils.ts";
import { PacketReader } from "./packet_reader.ts";
import { QueryConfig, QueryResult, Query } from "./query.ts";
import { Query, QueryConfig, QueryResult } from "./query.ts";
import { parseError } from "./error.ts";
import type { ConnectionParams } from "./connection_params.ts";
import { DeferredStack } from "./deferred.ts";
Expand Down
7 changes: 7 additions & 0 deletions decode.ts
Expand Up @@ -195,6 +195,10 @@ function decodeIntArray(value: string): any {
return parseArray(value, decodeBaseTenInt);
}

function decodeJsonArray(value: string): unknown[] {
return parseArray(value, JSON.parse);
}

// deno-lint-ignore no-explicit-any
function decodeText(value: Uint8Array, typeOid: number): any {
const strValue = decoder.decode(value);
Expand Down Expand Up @@ -253,6 +257,9 @@ function decodeText(value: Uint8Array, typeOid: number): any {
case Oid.json:
case Oid.jsonb:
return JSON.parse(strValue);
case Oid.json_array:
case Oid.jsonb_array:
return decodeJsonArray(strValue);
case Oid.bytea:
return decodeBytea(strValue);
default:
Expand Down
5 changes: 1 addition & 4 deletions deps.ts
@@ -1,7 +1,4 @@
export {
BufReader,
BufWriter,
} from "https://deno.land/std@0.69.0/io/bufio.ts";
export { BufReader, BufWriter } from "https://deno.land/std@0.69.0/io/bufio.ts";
export { copyBytes } from "https://deno.land/std@0.67.0/bytes/mod.ts";
export { deferred } from "https://deno.land/std@0.69.0/async/deferred.ts";
export type { Deferred } from "https://deno.land/std@0.69.0/async/deferred.ts";
Expand Down
4 changes: 2 additions & 2 deletions oid.ts
Expand Up @@ -23,7 +23,7 @@ export const Oid = {
xml: 142,
_xml: 143,
pg_node_tree: 194,
_json: 199,
json_array: 199,
smgr: 210,
index_am_handler: 325,
point: 600,
Expand Down Expand Up @@ -146,7 +146,7 @@ export const Oid = {
regdictionary: 3769,
_regdictionary: 3770,
jsonb: 3802,
_jsonb: 3807,
jsonb_array: 3807,
anyrange: 3831,
event_trigger: 3838,
int4range: 3904,
Expand Down
34 changes: 34 additions & 0 deletions tests/data_types.ts
Expand Up @@ -267,3 +267,37 @@ testClient(async function bpcharNestedArray() {
);
assertEquals(result.rows[0], [[["AB1234"], ["4321BA"]]]);
});

testClient(async function jsonArray() {
const json_array = await CLIENT.query(
`SELECT ARRAY_AGG(A) FROM (
SELECT JSON_BUILD_OBJECT( 'X', '1' ) AS A
UNION ALL
SELECT JSON_BUILD_OBJECT( 'Y', '2' ) AS A
) A`,
);

assertEquals(json_array.rows[0][0], [{ X: "1" }, { Y: "2" }]);

const json_array_nested = await CLIENT.query(
`SELECT ARRAY[ARRAY[ARRAY_AGG(A), ARRAY_AGG(A)], ARRAY[ARRAY_AGG(A), ARRAY_AGG(A)]] FROM (
SELECT JSON_BUILD_OBJECT( 'X', '1' ) AS A
UNION ALL
SELECT JSON_BUILD_OBJECT( 'Y', '2' ) AS A
) A`,
);

assertEquals(
json_array_nested.rows[0][0],
[
[
[{ X: "1" }, { Y: "2" }],
[{ X: "1" }, { Y: "2" }],
],
[
[{ X: "1" }, { Y: "2" }],
[{ X: "1" }, { Y: "2" }],
],
],
);
});
7 changes: 2 additions & 5 deletions tests/pool.ts
@@ -1,10 +1,7 @@
import {
assertEquals,
assertThrowsAsync,
} from "../test_deps.ts";
import { assertEquals, assertThrowsAsync } from "../test_deps.ts";
import { Pool } from "../pool.ts";
import { delay } from "../utils.ts";
import { TEST_CONNECTION_PARAMS, DEFAULT_SETUP } from "./constants.ts";
import { DEFAULT_SETUP, TEST_CONNECTION_PARAMS } from "./constants.ts";

async function testPool(
t: (pool: Pool) => void | Promise<void>,
Expand Down
2 changes: 1 addition & 1 deletion tests/utils.ts
@@ -1,6 +1,6 @@
const { test } = Deno;
import { assertEquals } from "../test_deps.ts";
import { parseDsn, DsnResult } from "../utils.ts";
import { DsnResult, parseDsn } from "../utils.ts";

test("testParseDsn", function () {
let c: DsnResult;
Expand Down

0 comments on commit c71cc2c

Please sign in to comment.