From ed2f2fc22c5847839b8fd742192fa3b4ad5e78d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Galeran?= Date: Fri, 15 Mar 2024 16:18:00 +0100 Subject: [PATCH] fix(adapter-d1): map more SQLite errors (#23504) --- packages/adapter-d1/src/d1.ts | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/adapter-d1/src/d1.ts b/packages/adapter-d1/src/d1.ts index efbabd2b6fa3..9355336418a3 100644 --- a/packages/adapter-d1/src/d1.ts +++ b/packages/adapter-d1/src/d1.ts @@ -93,25 +93,37 @@ class D1Queryable implements Queryable { return ok([columnNames, rows]) } } catch (e) { - const error = e as Error - console.error('Error in performIO: %O', error) + console.error('Error in performIO: %O', e) + const { message } = e // We only get the error message, not the error code. // "name":"Error","message":"D1_ERROR: UNIQUE constraint failed: User.email" // So we try to match some errors and use the generic error code as a fallback. // https://www.sqlite.org/rescode.html // 1 = The SQLITE_ERROR result code is a generic error code that is used when no other more specific error code is available. + // See quaint https://github.com/prisma/prisma-engines/blob/main/quaint/src/connector/sqlite/error.rs + // some errors are matched by the extended code and others by the message there. let extendedCode = 1 - if (error.message.startsWith('D1_ERROR: UNIQUE constraint failed:')) { + if (message.startsWith('D1_ERROR: UNIQUE constraint failed:')) { extendedCode = 2067 - } else if (error.message.startsWith('D1_ERROR: FOREIGN KEY constraint failed')) { + } else if (message.startsWith('D1_ERROR: FOREIGN KEY constraint failed')) { extendedCode = 787 + } else if (message.startsWith('D1_ERROR: NOT NULL constraint failed')) { + extendedCode = 1299 + } + // These below were added based on + // https://github.com/prisma/prisma-engines/blob/main/quaint/src/connector/sqlite/error.rs + // https://github.com/prisma/prisma-engines/blob/main/quaint/src/connector/sqlite/ffi.rs + else if (message.startsWith('D1_ERROR: CHECK constraint failed')) { + extendedCode = 1811 + } else if (message.startsWith('D1_ERROR: PRIMARY KEY constraint failed')) { + extendedCode = 1555 } return err({ kind: 'Sqlite', extendedCode, - message: error.message, + message, }) } }