drizzle-team / drizzle-team/drizzle-orm

[BUG]: Parameters passed but seemingly not recognized as used

Open
#4,129 0 comments 0 reactions 0 assignees View on GitHub
bug priority qb/crud
Dominant language
TypeScript
Stars
35.8k
Forks
1.6k
Avg merge
2d 7h
Merged PRs (30d)
4

Description

### Report hasn't been filed before.

- [x] I have verified that the bug I'm about to report hasn't been filed before.

### What version of `drizzle-orm` are you using?

0.39.1

### What version of `drizzle-kit` are you using?

0.30.4

### Other packages

_No response_

### Describe the Bug

### Database Schemas
```
export const roadmapsTable = pgTable(
"roadmaps",
{
id: varchar("id", { length: 25 }).primaryKey(),
userId: varchar("user_id", { length: 25 }).references(
() => usersTable.id,
{ onDelete: "set null" }
),
name: varchar("name", { length: 100 }).notNull(),
budget: real("budget").default(0).notNull(),
commitment: smallint("commitment").notNull(),
goals: jsonb("goals").$type().notNull(),
prerequisite: varchar("prerequisite", { length: 25 }),
startedOn: date("started_on"),
createdAt: timestamp("created_at", { withTimezone: true, mode: "date" })
.default(sql`now()`)
.notNull(),
},
(table) => [
foreignKey({
name: "roadmap_prerequisite_fk",
columns: [table.prerequisite],
foreignColumns: [table.id],
}).onDelete("set null"),
]
);

export const milestonesTable = pgTable("milestones", {
id: varchar("id", { length: 25 }).primaryKey(),
userId: varchar("user_id", { length: 25 }).references(() => usersTable.id, {
onDelete: "set null",
}),
target: varchar("target", { length: 100 }).notNull(),
estTime: smallint("est_time").notNull(),
description: text("description"),
updatedAt: timestamp("updated_at", { withTimezone: true, mode: "date" })
.default(sql`now()`)
.notNull(),
});

export const roadmapToMilestone = pgTable(
"roadmap_to_milestone",
{
id: serial("id").primaryKey(),
roadmapId: varchar("roadmap_id", { length: 25 })
.notNull()
.references(() => roadmapsTable.id, { onDelete: "cascade" }),
milestoneId: varchar("milestone_id", { length: 25 })
.notNull()
.references(() => milestonesTable.id, { onDelete: "cascade" }),
order: smallint("order").notNull(),
},
(table) => [
unique("unique_roadmap_milestone").on(
table.roadmapId,
table.milestoneId,
table.order
),
]
);
```

### Query 1
```
const sq = db.$with("select_max_order").as(
db
.select({
order: sql`coalesce(${max(roadmapToMilestone.order)}, 0) + 1`.as(
"order"
),
})
.from(roadmapToMilestone)
.where(eq(roadmapToMilestone.roadmapId, id))
);

await db
.with(sq)
.insert(roadmapToMilestone)
.values({
roadmapId: id,
milestoneId,
order: sql`(select ${sq.order} from ${sq})`,
})
```

### Produced SQL Query 1
```
with "select_max_order" as (select coalesce(max("roadmap_to_milestone"."order"), 0) + 1 as "order" from "roadmap_to_milestone" where "roadmap_to_milestone"."roadmap_id" = $1) insert into "roadmap_to_milestone" ("id", "roadmap_id", "milestone_id", "order") values (default, $2, $3, (select "order" from "select_max_order")) -- params: ["j_XKiPb0v6AaL2mpMuXzb4zMc", "j_XKiPb0v6AaL2mpMuXzb4zMc", "LteGEWNbuEqEEPt-oXObJWOvN"]
```

### Query 2
```
await db.execute(sql`
insert into ${milestonesTable} ("id", "user_id", "target", "est_time", "description")
select * from
(values (${milestoneId}, ${userId}, ${payload.target}, (${payload.estTime})::smallint, ${payload.description})) as "t"("id", "user_id", "target", "est_time", "description")
where ${validRoadmap}
`);
```

### Produced SQL Query 2
```
insert into "milestones" ("id", "user_id", "target", "est_time", "description")
select * from
(values ($1, $2, $3, cast($4 as integer), $5)) as "t"("id", "user_id", "target", "est_time", "description")
where exists (select 1 from "roadmaps" where ("roadmaps"."id" = $6 and "roadmaps"."user_id" = $7))
-- params: ["ZdNNA0H06_T5vNu7_93TE9wa-", "7Yfjwyrz-qT8tKU9P5gXW_7Ab", "Complete the frontend and the backend of the project", 15, "Initial minimal viable application release. More extensions in the future", "j_XKiPb0v6AaL2mpMuXzb4zMc", "7Yfjwyrz-qT8tKU9P5gXW_7Ab"]
```

### What database driver are you using?
"pg": "^8.13.1"

### Are you using a specific cloud provider?
Xata.io PostgreSQL

### What database client are you using?
drizzle-orm/xata-http

### What is the undesired behavior?
The query builder correctly produces SQL query for PostgreSQL, as I've tested those queries in Xata Query panel and they executed perfectly fine. However, when executing them in Cloudflare Workers, the queries always return this error:
`FetcherError: invalid SQL: unused parameters: used of parameters`
where x is less than y by 1.
In the first query, I suspect that the error is caused because the WITH clause doesn't recognize the first parameter ($1) as used. While in the second query, the error seems to appear because of type casting being applied on the forth parameter ($4) and the engine somehow doesn't pick up type casted params as used.

### What is the desired result?
Both queries are expected to execute correctly and recognize all parameters as used.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.