-
-
Notifications
You must be signed in to change notification settings - Fork 480
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BUG]: Broken shifted columns with leftJoin and same column name (on D1) #555
Comments
Does this bug reproducible using raw driver for d1 without drizzle? |
This is d1 raw results. $ pnpm wrangler d1 execute dzltest --command='select "users"."id", "posts"."id", "posts"."ownerId", "posts"."title", "posts"."content" from "users" left join "posts" on "posts"."ownerId" = "users"."id";'
┌────┬─────────┬───────┬───────────┐
│ id │ ownerId │ title │ content │
├────┼─────────┼───────┼───────────┤
│ 2 │ 1 │ test │ 111111111 │
├────┼─────────┼───────┼───────────┤
│ 3 │ 1 │ ueoau │ ueueu │
├────┼─────────┼───────┼───────────┤
│ 1 │ 1 │ xxx │ yyy │
└────┴─────────┴───────┴───────────┘ |
Seems like this is an issue on d1 side. I’ll create an issue on their repo and will pin it here to track the progress |
@mizchi could you please share wrangler version you are using? And OS |
$ sw_vers
ProductName: macOS
ProductVersion: 13.3.1
ProductVersionExtra: (a)
BuildVersion: 22E772610a |
tracking issue on d1 side |
This seems like an outdated issue. Can anybody check? seems like the underlying issue was resolved? |
The problem is that d1 overwrites columns if they share the same key. As it can be seen here const userAndPosts = await db
.select({
user: {
id: users.id, // "users"."id"
},
post: {
id: posts.id, // "posts"."id"
ownerId: posts.ownerId,
title: posts.title,
content: posts.content
}
})
.from(users)
.leftJoin(posts, eq(posts.ownerId, users.id))
.all(); Both const userAndPosts = await db
.select({
user: {
id: sql<type>`${users.id}`.as('u_id')
},
post: {
id: sql<type>`${posts.id}`.as('p_id'),
ownerId: posts.ownerId,
title: posts.title,
content: posts.content
}
})
.from(users)
.leftJoin(posts, eq(posts.ownerId, users.id))
.all(); This works as then d1 does not overwrite the data. However this solution is very ugly and it removes type inference for the affected columns |
I am still getting the issue on joins with Drizzle ORM and wrangler. |
On further testing using select compared to findmany I am not sure if this is a drizzle or D1 issue? I have data tables with some of the same common field column names like create_at, updated_at, id etc When using select const userEvents = await db
.select()
.from(event)
.innerJoin(eventInvite, eq(event.id, eventInvite.eventId))
.innerJoin(user, eq(eventInvite.userId, user.id))
.where(
sql`events.id IN (SELECT event_id FROM event_invites WHERE user_id = ${userId})`,
); I get the column data results shift bug and users createdAt and updatedAt fields missing {
"userEvents": [
{
"events": {
"id": "EventId1",
"name": "Event One",
"location": "Location A",
"createdAt": "2024-01-03 08:58:31",
"updatedAt": "2024-01-03 09:19:29"
},
"event_invites": {
"eventId": "EventId1",
"userId": "UserId1",
"inviteStatus": "No Response",
"responseDate": null,
"createdAt": "UserId1",
"updatedAt": "FirstName1test"
},
"users": {
"id": "LastName1",
"firstName": "User1",
"lastName": "user1@example.com",
"username": "password1"
}
},
{
"events": {
"id": "EventId1",
"name": "Event One",
"location": "Location A",
"createdAt": "2024-01-03 08:58:31",
"updatedAt": "2024-01-03 08:58:31"
},
"event_invites": {
"eventId": "EventId1",
"userId": "UserId2",
"inviteStatus": "No Response",
"responseDate": null,
"createdAt": "UserId2",
"updatedAt": "FirstName2"
},
"users": {
"id": "LastName2",
"firstName": "User2",
"lastName": "user2@example.com",
"username": "password2"
}
}
]
} However when using findmany const invitedEventsSubquery = db
.select({ data: eventInvite.eventId })
.from(eventInvite)
.where(eq(eventInvite.userId, userId));
const userEvents = await db.query.event.findMany({
where: inArray(event.id, invitedEventsSubquery),
with: {
eventInvite: {
with: {
user: true,
},
},
},
}); I don't get the bug. Every column is returned where it should be in nicely nested json. {
"userEvents": [
{
"id": "EventId1",
"name": "Event One",
"location": "Location A",
"createdAt": "2024-01-03 09:35:52",
"updatedAt": "2024-01-03 09:35:52",
"eventInvite": [
{
"eventId": "EventId1",
"userId": "UserId1",
"inviteStatus": "No Response",
"responseDate": null,
"createdAt": "2024-01-03 10:14:40",
"updatedAt": "2024-01-03 10:14:40",
"user": {
"id": "UserId1",
"firstName": "FirstName1test",
"lastName": "LastName1",
"username": "User1",
"email": "user1@example.com",
"password": "password1",
"createdAt": "2024-01-03 08:58:31",
"updatedAt": "2024-01-03 09:19:29"
}
},
{
"eventId": "EventId1",
"userId": "UserId2",
"inviteStatus": "No Response",
"responseDate": null,
"createdAt": "2024-01-03 10:14:40",
"updatedAt": "2024-01-03 10:14:40",
"user": {
"id": "UserId2",
"firstName": "FirstName2",
"lastName": "LastName2",
"username": "User2",
"email": "user2@example.com",
"password": "password2",
"createdAt": "2024-01-03 08:58:31",
"updatedAt": "2024-01-03 08:58:31"
}
},
{
"eventId": "EventId1",
"userId": "UserId3",
"inviteStatus": "No Response",
"responseDate": null,
"createdAt": "2024-01-03 10:14:40",
"updatedAt": "2024-01-03 10:14:40",
"user": {
"id": "UserId3",
"firstName": "FirstName3",
"lastName": "LastName3",
"username": "User3",
"email": "user3@example.com",
"password": "password3",
"createdAt": "2024-01-03 08:58:31",
"updatedAt": "2024-01-03 08:58:31"
}
}
]
},
{
"id": "EventId3",
"name": "Event Three",
"location": "Location C",
"createdAt": "2024-01-03 09:35:52",
"updatedAt": "2024-01-03 09:35:52",
"eventInvite": [
{
"eventId": "EventId3",
"userId": "UserId1",
"inviteStatus": "No Response",
"responseDate": null,
"createdAt": "2024-01-03 10:14:40",
"updatedAt": "2024-01-03 10:14:40",
"user": {
"id": "UserId1",
"firstName": "FirstName1test",
"lastName": "LastName1",
"username": "User1",
"email": "user1@example.com",
"password": "password1",
"createdAt": "2024-01-03 08:58:31",
"updatedAt": "2024-01-03 09:19:29"
}
}
]
}
]
} |
Thanks for the workaround @WcaleNieWolny, this works for me while maintaining type support it seems:
|
It happens with SQLite too. This query:
Generate with SQL query:
And due to how SQLite itself run the query, rows returns like this: I think the problem is on drizzle side(and aliasing will fix it) |
Is this repo available to test? I tried testing just Sqlite using the Drizzle SQLite example repo I also added an extra table for a many to many join. I couldn't reproduce it in SQLite. However the issue still exists using D1 |
@AndriiSherman or @Angelelz have you got any more insights on this issue? It seems like D1 is expecting duplicate columns to have aliases? If this is the case is this something that needs to happen on the drizzle side? When running a join query directly with wrangler without alias on duplicate columns, it only returns one of the duplicate columns, however the values are wrong. Compared to using drizzle it returns all the columns but the values shifted. When using aliases in wrangler it works as expected. Using DB browser for SQLite connecting directly to the local D1 Sqlite database, all columns and values return correctly without aliases. |
Is there a way to auto-alias columns, or maybe nest them like My workaround for this is to implement a utility that auto-prefixes all columns from the table (I'm selecting all columns, would need to adjust to select a subset):
|
Seems like it was fixed on the D1 side, so we need to run tests and check it. The issue with aliasing is a D1 problem that should be addressed on the D1 side. As a standard practice in any driver library, D1 should have the capability to respond with an array of arrays without any isues. If they don't, it's a bug on their side. I hope this cloudflare/workerd#696 fixed the problem. If not, we will need to create another issue for D1 |
Also seems like this original issue is still open cloudflare/workers-sdk#3160 |
The D1 fix is now live. |
it seems like the types have been released in |
I created a reproduction before searching for similar issues. I might as well share it, maybe it can help. |
@cyco130 thank you for the reproduction, looks like there's still an issue on D1 side. I've reported it back to their team: cloudflare/workers-sdk#3160 (comment) |
did you managed to fix it? I'm having the same problem |
Good news, my fix landed with @AndriiSherman @dankochetov, you can close the issue! |
FWIW, also getting this issue with the Bun sqlite driver |
What version of
drizzle-orm
are you using?0.25.4
What version of
drizzle-kit
are you using?0.17.6
Describe the Bug
I got broken results with leftJoin with same columns.
Details
My schema (partial)
... and run next query to reduce has many pattern.
I got broken results.
Running query is here.
I think that duplicate id columns have been executed without
as
, causing the ORM to be misaligned when it repackages them into the object.If one id is not referenced, this bug is resolved.
Expected behavior
I expect I can use both id and correct columns.
Environment & setup
I'm using pnpm.
D1 setup
The text was updated successfully, but these errors were encountered: