diff --git a/packages/http-routes/src/routes/shared-routes.test.ts b/packages/http-routes/src/routes/shared-routes.test.ts index a750b60e..cc4a970e 100644 --- a/packages/http-routes/src/routes/shared-routes.test.ts +++ b/packages/http-routes/src/routes/shared-routes.test.ts @@ -262,6 +262,33 @@ describe('registerSharedRoutes smoke tests', () => { assert.equal(countRow.count, 3) }) + it('POST /_web/sessions/:id/sql returns rows in the SQL Lab columnar shape', async () => { + const db = createSessionDb() + const routeApp = Fastify() + registerSharedRoutes(routeApp, createTestContext(new Map([['chat-1', db]]))) + await routeApp.ready() + + const resp = await routeApp.inject({ + method: 'POST', + url: '/_web/sessions/chat-1/sql', + payload: { sql: 'SELECT id, content FROM message ORDER BY id LIMIT 2' }, + }) + + await routeApp.close() + db.close() + + assert.equal(resp.statusCode, 200) + const body = resp.json() + assert.deepEqual(body.columns, ['id', 'content']) + assert.deepEqual(body.rows, [ + [1, 'alpha first'], + [2, 'alpha from bob'], + ]) + assert.equal(body.rowCount, 2) + assert.equal(body.limited, false) + assert.equal(typeof body.duration, 'number') + }) + it('PATCH /_web/sessions/:id/name updates the shared session metadata', async () => { const db = createSessionDb() const routeApp = Fastify() diff --git a/packages/http-routes/src/routes/web/sql.ts b/packages/http-routes/src/routes/web/sql.ts index 679cf5a7..3b70bd68 100644 --- a/packages/http-routes/src/routes/web/sql.ts +++ b/packages/http-routes/src/routes/web/sql.ts @@ -12,7 +12,14 @@ export function registerSqlRoutes(server: FastifyInstance, ctx: HttpRouteContext return reply.code(400).send({ error: 'Missing sql parameter' }) } try { - return executeSql(db, sql, { timing: true }) + const result = executeSql(db, sql, { columnar: true, timing: true, maxRows: 0 }) + return { + columns: result.columns, + rows: result.rows, + rowCount: result.rowCount, + duration: result.duration ?? 0, + limited: result.truncated, + } } catch (err: unknown) { const message = err instanceof Error ? err.message : 'SQL execution error' return reply.code(400).send({ error: message })