Skip to content

Commit

Permalink
Recreate prepared statements if invalidated (#195)
Browse files Browse the repository at this point in the history
fixes #120

...
  • Loading branch information
porsager authored Aug 13, 2021
1 parent 8e675a3 commit 591d47a
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 2 deletions.
14 changes: 13 additions & 1 deletion lib/connection.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const tls = require('tls')
const frontend = require('./frontend.js')
const Backend = require('./backend.js')
const Queue = require('./queue.js')
const { END } = require('./types.js')
const { END, retryRoutines } = require('./types.js')
const { errors } = require('./errors.js')

module.exports = Connection
Expand Down Expand Up @@ -128,8 +128,17 @@ function Connection(options = {}) {
q.reject(err)
}

function retry(query) {
query.retried = true
delete statements[query.sig]
ready = true
backend.query = backend.error = null
send(query, { sig: query.sig, str: query.str, args: query.args })
}

function send(query, { sig, str, args = [] }) {
try {
query.sig = sig
query.str = str
query.args = args
query.result = []
Expand Down Expand Up @@ -204,6 +213,9 @@ function Connection(options = {}) {
clearTimeout(connect_timer)
if (err) {
if (backend.query) {
if (!backend.query.retried && retryRoutines[err.routine])
return retry(backend.query)

err.stack += backend.query.origin.replace(/.*\n/, '\n')
Object.defineProperty(err, 'query', {
value: backend.query.str,
Expand Down
6 changes: 6 additions & 0 deletions lib/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,9 @@ module.exports.errorFields = entries({
L: 'line',
R: 'routine'
}).reduce(char, {})

module.exports.retryRoutines = {
FetchPreparedStatement: true,
RevalidateCachedQuery: true,
transformAssignedExpr: true
}
30 changes: 29 additions & 1 deletion tests/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -1421,6 +1421,7 @@ t('Copy from works in transaction', async() => {
})

t('Copy from abort works', async() => {
const sql = postgres(options)
const controller = new AbortController()
const readable = fs.createReadStream('copy.csv')

Expand All @@ -1438,5 +1439,32 @@ t('Copy from abort works', async() => {
controller.abort()
await sql.end()

return [aborted, true]
return [
aborted,
true,
await postgres(options)`drop table test`
]
})

t('Recreate prepared statements on transformAssignedExpr error', async() => {
const insert = () => sql`insert into test (name) values (${ '1' }) returning name`
await sql`create table test (name text)`
await insert()
await sql`alter table test alter column name type int using name::integer`
return [
1, (await insert())[0].name,
await sql`drop table test`
]
})

t('Recreate prepared statements on RevalidateCachedQuery error', async() => {
const select = () => sql`select name from test`
await sql`create table test (name text)`
await sql`insert into test values ('1')`
await select()
await sql`alter table test alter column name type int using name::integer`
return [
1, (await select())[0].name,
await sql`drop table test`
]
})

0 comments on commit 591d47a

Please sign in to comment.