drizzle-team / drizzle-orm

Headless TypeScript ORM with a head. Runs on Node, Bun and Deno. Lives on the Edge and yes, it's a JavaScript ORM too 😅
https://orm.drizzle.team
Apache License 2.0
23.54k stars 578 forks source link

[BUG]: AWS Data API error when getting relation with where clause #2374

Open edgarssilva opened 4 months ago

edgarssilva commented 4 months ago

What version of drizzle-orm are you using?

^0.30.9

What version of drizzle-kit are you using?

^0.21.2

Describe the Bug

Currently, I'm trying to retrieve all the records of a table (trucks) where a relation in another table (truckAvailability) exists.

A simplified schema is as follows:

export const trucks = pgTable("trucks", {
    id: serial("id").primaryKey(),
  //...
});
export const truckRelations = relations(trucks, ({ one, many }) => ({
    //...
    availabilities: many(truckAvailability),
}));

export const truckAvailability = pgTable("truck_availability", {
    id: serial("id").primaryKey(),
    truckId: integer("truck_id")
        .references(() => trucks.id)
        .notNull(),
available: boolean("available").notNull().default(true),
    //...
});
export const truckAvailabilityRelations = relations(truckAvailability, ({ one }) => ({
    truck: one(trucks, { fields: [truckAvailability.truckId], references: [trucks.id] }),
    //...
}));

Running a query where I findMany trucks with the availabilities relation where available is true, returns the following error:

TypeError: Cannot read properties of undefined (reading 'map')
        at mapColumnsInSQLToAlias (/var/task/node_modules/drizzle-orm/alias.cjs:120:48)
        at AwsPgDialect.buildRelationalQueryWithoutPK (/var/task/node_modules/drizzle-orm/pg-core/dialect.cjs:906:69)
        at AwsPgDialect.buildRelationalQueryWithoutPK (/var/task/node_modules/drizzle-orm/pg-core/dialect.cjs:986:36)
        at QueryPromise._getQuery (/var/task/node_modules/drizzle-orm/pg-core/query-builders/query.cjs:106:25)
        at QueryPromise._toSQL (/var/task/node_modules/drizzle-orm/pg-core/query-builders/query.cjs:121:24)
        at /var/task/node_modules/drizzle-orm/pg-core/query-builders/query.cjs:84:42
        at Object.startActiveSpan (/var/task/node_modules/drizzle-orm/tracing.cjs:31:14)
        at QueryPromise._prepare (/var/task/node_modules/drizzle-orm/pg-core/query-builders/query.cjs:83:34)
        at /var/task/node_modules/drizzle-orm/pg-core/query-builders/query.cjs:130:19
        at Object.startActiveSpan (/var/task/node_modules/drizzle-orm/tracing.cjs:31:14)

Expected behavior

The query executed was the following:

const trucks = await db.query.trucks.findMany({ with: { availabilities: { where: (availability) => availability.available } } });

This should return a valid list of trucks and their available availabilities (I know it's not the best naming).

For testing purposes I tried the following query:

const trucks = await db.query.trucks.findMany({ with: { availabilities: true } });

It works correctly, but adding any condition results in the previous error.

const trucks = await db.query.trucks.findMany({ with: { availabilities: { where: () => true } } });

Environment & setup

The code was run on an AWS Lambda using Node18.x using the Serverless Framework.