diff --git a/drizzle-orm/src/aws-data-api/pg/session.ts b/drizzle-orm/src/aws-data-api/pg/session.ts index 97d3dd3c0..5e6f38ab4 100644 --- a/drizzle-orm/src/aws-data-api/pg/session.ts +++ b/drizzle-orm/src/aws-data-api/pg/session.ts @@ -1,4 +1,4 @@ -import type { ExecuteStatementCommandOutput, Field, RDSDataClient } from '@aws-sdk/client-rds-data'; +import type { ColumnMetadata, ExecuteStatementCommandOutput, Field, RDSDataClient } from '@aws-sdk/client-rds-data'; import { BeginTransactionCommand, CommitTransactionCommand, @@ -48,6 +48,7 @@ export class AwsDataApiPreparedQuery extends Prep resourceArn: options.resourceArn, database: options.database, transactionId, + includeResultMetadata: !fields && !customResultMapper, }); } @@ -80,6 +81,9 @@ export class AwsDataApiPreparedQuery extends Prep const { fields, rawQuery, client, customResultMapper } = this; if (!fields && !customResultMapper) { const result = await client.send(rawQuery); + if (result.columnMetadata && result.columnMetadata.length > 0) { + return this.mapResultRows(result.records ?? [], result.columnMetadata); + } return result.records ?? []; } @@ -89,6 +93,18 @@ export class AwsDataApiPreparedQuery extends Prep return row.map((field: Field) => getValueFromDataApi(field)); }); } + + /** @internal */ + mapResultRows(records: Field[][], columnMetadata: ColumnMetadata[]) { + return records.map((record) => { + const row: Record = {}; + for (const [index, field] of record.entries()) { + const { name } = columnMetadata[index]!; + row[name ?? index] = getValueFromDataApi(field); // not what to default if name is undefined + } + return row; + }); + } } export interface AwsDataApiSessionOptions { diff --git a/integration-tests/tests/awsdatapi.test.ts b/integration-tests/tests/awsdatapi.test.ts index 8ed1921d3..8524cbae1 100644 --- a/integration-tests/tests/awsdatapi.test.ts +++ b/integration-tests/tests/awsdatapi.test.ts @@ -835,6 +835,29 @@ test.serial('nested transaction rollback', async (t) => { await db.execute(sql`drop table ${users}`); }); +test.serial('select from raw sql', async (t) => { + const { db } = t.context; + + const result = await db.execute(sql`select 1 as id, 'John' as name`); + + t.deepEqual(result, [ + { id: 1, name: 'John' }, + ]); +}); + +test.serial('select from raw sql with mapped values', async (t) => { + const { db } = t.context; + + const result = await db.select({ + id: sql`id`, + name: sql`name`, + }).from(sql`(select 1 as id, 'John' as name) as users`); + + t.deepEqual(result, [ + { id: 1, name: 'John' }, + ]); +}); + test.after.always(async (t) => { const ctx = t.context; await ctx.db.execute(sql`drop table "users"`);