Skip to content

Commit dd373a0

Browse files
committed
Update UpdateQueryBuilder to use double quotes for table names in SQL queries, ensuring consistency and compatibility with case-sensitive databases.
1 parent b8c5d0b commit dd373a0

File tree

2 files changed

+225
-1
lines changed

2 files changed

+225
-1
lines changed

__tests__/update-builder.test.ts

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
import {SqlExecutor, UpdateQueryBuilder} from "../src";
2+
import {CompositeWhere, SimpleWhere} from "../src/types/query";
3+
4+
// Mock SqlExecutor
5+
const mockExecutor: SqlExecutor = {
6+
executeSQL: jest.fn(),
7+
};
8+
9+
interface User {
10+
id: string;
11+
name: string;
12+
email: string;
13+
age?: number;
14+
roleId?: string;
15+
}
16+
17+
describe("UpdateQueryBuilder", () => {
18+
let builder: UpdateQueryBuilder<User>;
19+
20+
beforeEach(() => {
21+
builder = new UpdateQueryBuilder("users", mockExecutor);
22+
jest.clearAllMocks();
23+
});
24+
25+
describe("Basic Update", () => {
26+
it("should build correct SQL for basic update", () => {
27+
const data = {
28+
name: "John Doe",
29+
30+
};
31+
32+
const result = builder.set(data).build();
33+
34+
expect(result.sql).toContain('UPDATE "users"');
35+
expect(result.sql).toContain('SET "name" = $1, "email" = $2');
36+
expect(result.sql).toContain("RETURNING *");
37+
expect(result.values).toEqual(["John Doe", "[email protected]"]);
38+
});
39+
40+
it("should build correct SQL for update with specific returning columns", () => {
41+
const data = {
42+
name: "John Doe",
43+
44+
};
45+
46+
const result = builder.set(data).returning(["id", "name"]).build();
47+
48+
expect(result.sql).toContain('UPDATE "users"');
49+
expect(result.sql).toContain('SET "name" = $1, "email" = $2');
50+
expect(result.sql).toContain("RETURNING id, name");
51+
expect(result.values).toEqual(["John Doe", "[email protected]"]);
52+
});
53+
});
54+
55+
describe("Where Conditions", () => {
56+
it("should build correct SQL for simple where condition", () => {
57+
const data = {
58+
name: "John Doe",
59+
60+
};
61+
62+
const where: SimpleWhere<User> = {
63+
key: "id",
64+
operator: "=",
65+
value: "123",
66+
};
67+
68+
const result = builder.set(data).where(where).build();
69+
70+
expect(result.sql).toContain('UPDATE "users"');
71+
expect(result.sql).toContain('SET "name" = $2, "email" = $3');
72+
expect(result.sql).toContain('WHERE "users"."id" = $1');
73+
expect(result.sql).toContain("RETURNING *");
74+
expect(result.values).toEqual(["123", "John Doe", "[email protected]"]);
75+
});
76+
77+
it("should build correct SQL for composite AND condition", () => {
78+
const data = {
79+
name: "John Doe",
80+
81+
};
82+
83+
const where: CompositeWhere<User> = {
84+
AND: [
85+
{key: "age", operator: ">", value: 18} as SimpleWhere<User>,
86+
{key: "name", operator: "=", value: "John"} as SimpleWhere<User>,
87+
],
88+
};
89+
90+
const result = builder.set(data).where(where).build();
91+
92+
expect(result.sql).toContain('UPDATE "users"');
93+
expect(result.sql).toContain('SET "name" = $3, "email" = $4');
94+
expect(result.sql).toContain(
95+
'WHERE ("users"."age" > $1 AND "users"."name" = $2)'
96+
);
97+
expect(result.sql).toContain("RETURNING *");
98+
expect(result.values).toEqual([
99+
18,
100+
"John",
101+
"John Doe",
102+
103+
]);
104+
});
105+
106+
it("should build correct SQL for composite OR condition", () => {
107+
const data = {
108+
name: "John Doe",
109+
110+
};
111+
112+
const where: CompositeWhere<User> = {
113+
OR: [
114+
{key: "age", operator: ">", value: 18} as SimpleWhere<User>,
115+
{key: "name", operator: "=", value: "John"} as SimpleWhere<User>,
116+
],
117+
};
118+
119+
const result = builder.set(data).where(where).build();
120+
121+
expect(result.sql).toContain('UPDATE "users"');
122+
expect(result.sql).toContain('SET "name" = $3, "email" = $4');
123+
expect(result.sql).toContain(
124+
'WHERE ("users"."age" > $1 OR "users"."name" = $2)'
125+
);
126+
expect(result.sql).toContain("RETURNING *");
127+
expect(result.values).toEqual([18, 'John', 'John Doe', '[email protected]']);
128+
});
129+
130+
it("should build correct SQL for complex nested conditions", () => {
131+
const data = {
132+
name: "John Doe",
133+
134+
};
135+
136+
const where: CompositeWhere<User> = {
137+
AND: [
138+
{key: "age", operator: ">", value: 18} as SimpleWhere<User>,
139+
{
140+
OR: [
141+
{
142+
key: "name",
143+
operator: "=",
144+
value: "John",
145+
} as SimpleWhere<User>,
146+
{
147+
key: "name",
148+
operator: "=",
149+
value: "Jane",
150+
} as SimpleWhere<User>,
151+
],
152+
} as CompositeWhere<User>,
153+
],
154+
};
155+
156+
const result = builder.set(data).where(where).build();
157+
158+
expect(result.sql).toContain('UPDATE "users"');
159+
expect(result.sql).toContain('SET "name" = $4, "email" = $5');
160+
expect(result.sql).toContain(
161+
'WHERE ("users"."age" > $1 AND ("users"."name" = $2 OR "users"."name" = $3))'
162+
);
163+
expect(result.sql).toContain("RETURNING *");
164+
expect(result.values).toEqual([
165+
18,
166+
"John",
167+
"Jane",
168+
"John Doe",
169+
170+
]);
171+
});
172+
});
173+
174+
describe("Complex Update", () => {
175+
it("should build correct SQL for complex update with all clauses", () => {
176+
const data = {
177+
name: "John Doe",
178+
179+
age: 25,
180+
};
181+
182+
const where: CompositeWhere<User> = {
183+
AND: [
184+
{key: "age", operator: ">", value: 18} as SimpleWhere<User>,
185+
{
186+
OR: [
187+
{
188+
key: "name",
189+
operator: "=",
190+
value: "John",
191+
} as SimpleWhere<User>,
192+
{
193+
key: "name",
194+
operator: "=",
195+
value: "Jane",
196+
} as SimpleWhere<User>,
197+
],
198+
} as CompositeWhere<User>,
199+
],
200+
};
201+
202+
const result = builder
203+
.set(data)
204+
.where(where)
205+
.returning(["id", "name", "email", "age"])
206+
.build();
207+
208+
expect(result.sql).toContain('UPDATE "users"');
209+
expect(result.sql).toContain('SET "name" = $4, "email" = $5, "age" = $6');
210+
expect(result.sql).toContain(
211+
'WHERE ("users"."age" > $1 AND ("users"."name" = $2 OR "users"."name" = $3))'
212+
);
213+
expect(result.sql).toContain("RETURNING id, name, email, age");
214+
expect(result.values).toEqual([
215+
18,
216+
"John",
217+
"Jane",
218+
"John Doe",
219+
220+
25
221+
]);
222+
});
223+
});
224+
});

src/query-builder/update.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class UpdateQueryBuilder<T> extends BaseQueryBuilder<T> {
4545

4646
// Build final SQL query
4747
const sql = `
48-
UPDATE ${this.tableName}
48+
UPDATE "${this.tableName}"
4949
SET ${setClause}
5050
${whereClause ? `WHERE ${whereClause}` : ""}
5151
RETURNING ${returningColumns};

0 commit comments

Comments
 (0)