From f74579dd1cf8f3cc02cfb80c3e7a2e1c0ea52023 Mon Sep 17 00:00:00 2001 From: Magnun A V F Date: Thu, 2 Jul 2026 12:07:33 -0300 Subject: [PATCH 1/4] fix(sql): surface statement-level query errors and prevent debug crash --- packages/sql/src/services/api/index.ts | 31 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/sql/src/services/api/index.ts b/packages/sql/src/services/api/index.ts index 1078c54b..079507fc 100644 --- a/packages/sql/src/services/api/index.ts +++ b/packages/sql/src/services/api/index.ts @@ -184,18 +184,35 @@ const postQueryDatabase = async ( }; } + // The SQL API reports per-statement failures inside the `data` array + // (e.g. `{ error: 'no such table: ...' }`) rather than in `result.errors`. + const statementError = Array.isArray(result.data) + ? result.data.find((statement: any) => statement && statement.error) + : undefined; + + if (statementError) { + return { + error: { message: statementError.error, operation: 'post query' }, + }; + } + const dataResult = result.data; if (debug) { const limitedData: ApiQueryExecutionResponse = { ...result, - data: (result as ApiQueryExecutionResponse)?.data?.map((data) => ({ - ...data, - results: { - ...data.results, - rows: limitArraySize(data.results?.rows, 10), - }, - })), + data: (result as ApiQueryExecutionResponse)?.data?.map((data) => { + if (!data || !data.results) { + return data; + } + return { + ...data, + results: { + ...data.results, + rows: limitArraySize(data.results?.rows, 10), + }, + }; + }), }; console.log('Response Query:', JSON.stringify(limitedData)); } From 9d549cac78215f72e5a42cae053a3955e994ecf1 Mon Sep 17 00:00:00 2001 From: Magnun A V F Date: Thu, 2 Jul 2026 12:09:26 -0300 Subject: [PATCH 2/4] docs(sql): update README --- packages/sql/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/sql/README.md b/packages/sql/README.md index 4b5c12a7..b71ac711 100644 --- a/packages/sql/README.md +++ b/packages/sql/README.md @@ -246,6 +246,10 @@ if (result) { } ``` +> **Note:** Statement-level failures reported by the database (for example querying a +> non-existent table, which returns `no such table: ...`) are surfaced through the +> `error` field of the response, not thrown. Always check `error` before using `data`. + #### Use Execute **JavaScript:** @@ -522,7 +526,7 @@ The response object from a database operation. - `columns: string[]` - `statement: string` - `rows: (number | string)[][]` -- `error?: string` +- `error?: string` — set when the individual statement fails (e.g. `no such table: ...`). When present, the operation also resolves with a top-level `error` object. ### `AzionClientOptions` From 5f1b331f3931acd816a4750aa53153cd45de66bf Mon Sep 17 00:00:00 2001 From: Magnun A V F Date: Thu, 2 Jul 2026 12:35:23 -0300 Subject: [PATCH 3/4] test: fix sql package tests --- packages/sql/src/index.test.ts | 35 ++++++++++------------------------ 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/packages/sql/src/index.test.ts b/packages/sql/src/index.test.ts index 0ac4893b..184ccdfb 100644 --- a/packages/sql/src/index.test.ts +++ b/packages/sql/src/index.test.ts @@ -448,21 +448,12 @@ describe('SQL Module', () => { useQuery('test-db', ['pragma table_list', 'select * from main'], { debug: mockDebug, }), - ).resolves.toEqual( - expect.objectContaining({ - data: expect.objectContaining({ - state: 'executed', - results: expect.arrayContaining([ - expect.anything(), - expect.objectContaining({ error: 'no such table: main' }), - ]), - }), - error: expect.objectContaining({ - message: 'no such table: main', - operation: 'apiQuery', - }), + ).resolves.toEqual({ + error: expect.objectContaining({ + message: 'no such table: main', + operation: 'apiQuery', }), - ); + }); }); it('should return error if useQuery when last statement is invalid', async () => { @@ -526,18 +517,12 @@ describe('SQL Module', () => { useQuery('test-db', ['pragma table_list', 'select * from sqlite_schema', 'select * from main'], { debug: mockDebug, }), - ).resolves.toEqual( - expect.objectContaining({ - data: expect.objectContaining({ - state: 'executed', - results: expect.arrayContaining([ - expect.anything(), - expect.anything(), - expect.objectContaining({ error: 'no such table: main' }), - ]), - }), + ).resolves.toEqual({ + error: expect.objectContaining({ + message: 'no such table: main', + operation: 'apiQuery', }), - ); + }); }); it('should return error if useQuery when data rows is empty', async () => { From 144a225dce9c0e0ff8529546565d5434a7de6ab3 Mon Sep 17 00:00:00 2001 From: Magnun A V F Date: Thu, 2 Jul 2026 13:34:45 -0300 Subject: [PATCH 4/4] chore: add changeset --- .changeset/quiet-ways-pick.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-ways-pick.md diff --git a/.changeset/quiet-ways-pick.md b/.changeset/quiet-ways-pick.md new file mode 100644 index 00000000..748765a6 --- /dev/null +++ b/.changeset/quiet-ways-pick.md @@ -0,0 +1,5 @@ +--- +'@aziontech/sql': patch +--- + +fix surface statement-level query errors