This PR tries to solve two related issues in relation to custom types.
Allow custom type to be added using type name instead of oid.
Allow custom type to be added after initialisation.
Currently, to add a custom type one must know the oid of the type beforehand on initialisation.
This introduces a chicken and egg problem. In order to get the oid one must have a working instance to query the pg_type table to begin without. In addition, if a type is created on database during a session, there is no way to add a matching type on the client side without recreate a new Sql instance.
To solve this problem, this PR adds an addType function. For example
const sql = postgres(options)
await sql.addType('point', {
serializer: (v) => `(${v.x},${v.y})`,
parser: (v) => {
const [x, y] = v.slice(1, -1).split(',')
return { x: parseFloat(x), y: parseFloat(y) }
}
})
await sql`create table test (p point)`
const data = { x: 1, y: 2 }
await sql`insert into test values(${sql.typed.point(data)})`
const [{ p }] = await sql`select p from test`
const equal = p.x === data.x && p.y === data.y
The idea of this PR is simple. we delay the registration of custom type after sql initialise. then use that connection to query the pg_type to get the oid and use it to add serialiser and parser dynamically.
One problem I am not sure how to solve is how merge the typescript definition of this new custom type into the existing TTypes. Just throw it out first to see what everyone think.
This PR tries to solve two related issues in relation to custom types.
Currently, to add a custom type one must know the oid of the type beforehand on initialisation. This introduces a chicken and egg problem. In order to get the oid one must have a working instance to query the pg_type table to begin without. In addition, if a type is created on database during a session, there is no way to add a matching type on the client side without recreate a new Sql instance.
To solve this problem, this PR adds an addType function. For example
The idea of this PR is simple. we delay the registration of custom type after sql initialise. then use that connection to query the pg_type to get the oid and use it to add serialiser and parser dynamically.
One problem I am not sure how to solve is how merge the typescript definition of this new custom type into the existing
TTypes
. Just throw it out first to see what everyone think.