Skip to content

Commit 05313fc

Browse files
committed
Quote column names
Literal expressions are now made with `init(literal:)`: Expression<Int>(literal: "1 + 1") By default, `init(_:)` is for identifiers, like column names: Expression<Int>("id") // returns quoted identifier: \"id\" This makes things a bit safer and more flexible. Signed-off-by: Stephen Celis <[email protected]>
1 parent 0a22008 commit 05313fc

File tree

8 files changed

+389
-386
lines changed

8 files changed

+389
-386
lines changed

Documentation/Index.md

Lines changed: 74 additions & 74 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,18 @@ db.create(table: users) { t in
4545
t.column(email, unique: true)
4646
}
4747
// CREATE TABLE "users" (
48-
// id INTEGER PRIMARY KEY NOT NULL,
49-
// name TEXT,
50-
// email TEXT NOT NULL UNIQUE
48+
// "id" INTEGER PRIMARY KEY NOT NULL,
49+
// "name" TEXT,
50+
// "email" TEXT NOT NULL UNIQUE
5151
// )
5252

5353
var alice: Query?
5454
if let insertedID = users.insert(name <- "Alice", email <- "[email protected]") {
55-
println("inserted id: \(insertedID)")
56-
// inserted id: 1
57-
alice = users.filter(id == insertedID)
55+
println("inserted id: \(insertedID)")
56+
// inserted id: 1
57+
alice = users.filter(id == insertedID)
5858
}
59-
// INSERT INTO "users" (name, email) VALUES ('Alice', '[email protected]')
59+
// INSERT INTO "users" ("name", "email") VALUES ('Alice', '[email protected]')
6060

6161
for user in users {
6262
println("id: \(user[id]), name: \(user[name]), email: \(user[email])"
@@ -65,10 +65,10 @@ for user in users {
6565
// SELECT * FROM "users"
6666

6767
alice?.update(email <- replace(email, "mac.com", "me.com"))?
68-
// UPDATE "users" SET email = replace(email, "mac.com", "me.com") WHERE (id = 1)
68+
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') WHERE ("id" = 1)
6969

7070
alice?.delete()?
71-
// DELETE FROM "users" WHERE (id = 1)
71+
// DELETE FROM "users" WHERE ("id" = 1)
7272

7373
users.count
7474
// SELECT count(*) FROM "users"

SQLite Common Tests/ExpressionTests.swift

Lines changed: 148 additions & 148 deletions
Large diffs are not rendered by default.

SQLite Common Tests/QueryTests.swift

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ class QueryTests: XCTestCase {
2222
func test_select_withExpression_compilesSelectClause() {
2323
let query = users.select(email)
2424

25-
let SQL = "SELECT email FROM \"users\""
25+
let SQL = "SELECT \"email\" FROM \"users\""
2626
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
2727
}
2828

2929
func test_select_withVariadicExpressions_compilesSelectClause() {
3030
let query = users.select(email, count(*))
3131

32-
let SQL = "SELECT email, count(*) FROM \"users\""
32+
let SQL = "SELECT \"email\", count(*) FROM \"users\""
3333
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
3434
}
3535

@@ -43,7 +43,7 @@ class QueryTests: XCTestCase {
4343
func test_selectDistinct_withExpression_compilesSelectClause() {
4444
let query = users.select(distinct: age)
4545

46-
let SQL = "SELECT DISTINCT age FROM \"users\""
46+
let SQL = "SELECT DISTINCT \"age\" FROM \"users\""
4747
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
4848
}
4949

@@ -60,7 +60,7 @@ class QueryTests: XCTestCase {
6060
let query = users.join(managers, on: managers[id] == users[manager_id])
6161

6262
let SQL = "SELECT * FROM \"users\" " +
63-
"INNER JOIN \"users\" AS \"managers\" ON (\"managers\".id = \"users\".manager_id)"
63+
"INNER JOIN \"users\" AS \"managers\" ON (\"managers\".\"id\" = \"users\".\"manager_id\")"
6464
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
6565
}
6666

@@ -70,7 +70,7 @@ class QueryTests: XCTestCase {
7070
let query = users.join(.LeftOuter, managers, on: managers[id] == users[manager_id])
7171

7272
let SQL = "SELECT * FROM \"users\" " +
73-
"LEFT OUTER JOIN \"users\" AS \"managers\" ON (\"managers\".id = \"users\".manager_id)"
73+
"LEFT OUTER JOIN \"users\" AS \"managers\" ON (\"managers\".\"id\" = \"users\".\"manager_id\")"
7474
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
7575
}
7676

@@ -82,8 +82,8 @@ class QueryTests: XCTestCase {
8282

8383
let SQL = "SELECT * FROM \"users\" " +
8484
"INNER JOIN \"users\" AS \"managers\" " +
85-
"ON ((\"managers\".id = \"users\".manager_id) " +
86-
"AND \"managers\".admin)"
85+
"ON ((\"managers\".\"id\" = \"users\".\"manager_id\") " +
86+
"AND \"managers\".\"admin\")"
8787
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
8888
}
8989

@@ -96,8 +96,8 @@ class QueryTests: XCTestCase {
9696
.join(managed, on: managed[manager_id] == users[id])
9797

9898
let SQL = "SELECT * FROM \"users\" " +
99-
"INNER JOIN \"users\" AS \"managers\" ON (\"managers\".id = \"users\".manager_id) " +
100-
"INNER JOIN \"users\" AS \"managed\" ON (\"managed\".manager_id = \"users\".id)"
99+
"INNER JOIN \"users\" AS \"managers\" ON (\"managers\".\"id\" = \"users\".\"manager_id\") " +
100+
"INNER JOIN \"users\" AS \"managed\" ON (\"managed\".\"manager_id\" = \"users\".\"id\")"
101101
ExpectExecutions(db, [SQL: 1]) { _ in for _ in middleManagers {} }
102102
}
103103

@@ -118,7 +118,7 @@ class QueryTests: XCTestCase {
118118
func test_filter_compilesWhereClause() {
119119
let query = users.filter(admin == true)
120120

121-
let SQL = "SELECT * FROM \"users\" WHERE (admin = 1)"
121+
let SQL = "SELECT * FROM \"users\" WHERE (\"admin\" = 1)"
122122
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
123123
}
124124

@@ -128,57 +128,57 @@ class QueryTests: XCTestCase {
128128
.filter(age >= 21)
129129

130130
let SQL = "SELECT * FROM \"users\" " +
131-
"WHERE ((email = '[email protected]') " +
132-
"AND (age >= 21))"
131+
"WHERE ((\"email\" = '[email protected]') " +
132+
"AND (\"age\" >= 21))"
133133
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
134134
}
135135

136136
func test_group_withSingleExpressionName_compilesGroupClause() {
137137
let query = users.group(age)
138138

139-
let SQL = "SELECT * FROM \"users\" GROUP BY age"
139+
let SQL = "SELECT * FROM \"users\" GROUP BY \"age\""
140140
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
141141
}
142142

143143
func test_group_withVariadicExpressionNames_compilesGroupClause() {
144144
let query = users.group(age, admin)
145145

146-
let SQL = "SELECT * FROM \"users\" GROUP BY age, admin"
146+
let SQL = "SELECT * FROM \"users\" GROUP BY \"age\", \"admin\""
147147
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
148148
}
149149

150150
func test_group_withExpressionNameAndHavingBindings_compilesGroupClause() {
151151
let query = users.group(age, having: age >= 30)
152152

153-
let SQL = "SELECT * FROM \"users\" GROUP BY age HAVING (age >= 30)"
153+
let SQL = "SELECT * FROM \"users\" GROUP BY \"age\" HAVING (\"age\" >= 30)"
154154
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
155155
}
156156

157157
func test_group_withExpressionNamesAndHavingBindings_compilesGroupClause() {
158158
let query = users.group([age, admin], having: age >= 30)
159159

160-
let SQL = "SELECT * FROM \"users\" GROUP BY age, admin HAVING (age >= 30)"
160+
let SQL = "SELECT * FROM \"users\" GROUP BY \"age\", \"admin\" HAVING (\"age\" >= 30)"
161161
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
162162
}
163163

164164
func test_order_withSingleExpressionName_compilesOrderClause() {
165165
let query = users.order(age)
166166

167-
let SQL = "SELECT * FROM \"users\" ORDER BY age"
167+
let SQL = "SELECT * FROM \"users\" ORDER BY \"age\""
168168
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
169169
}
170170

171171
func test_order_withVariadicExpressionNames_compilesOrderClause() {
172172
let query = users.order(age, email)
173173

174-
let SQL = "SELECT * FROM \"users\" ORDER BY age, email"
174+
let SQL = "SELECT * FROM \"users\" ORDER BY \"age\", \"email\""
175175
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
176176
}
177177

178178
func test_order_withExpressionAndSortDirection_compilesOrderClause() {
179179
let query = users.order(age.desc, email.asc)
180180

181-
let SQL = "SELECT * FROM \"users\" ORDER BY age DESC, email ASC"
181+
let SQL = "SELECT * FROM \"users\" ORDER BY \"age\" DESC, \"email\" ASC"
182182
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
183183
}
184184

@@ -223,19 +223,19 @@ class QueryTests: XCTestCase {
223223
}
224224

225225
func test_subscript_withExpression_returnsNamespacedExpression() {
226-
ExpectExecution(db, "SELECT \"users\".admin FROM \"users\"", users.select(users[admin]))
227-
ExpectExecution(db, "SELECT \"users\".salary FROM \"users\"", users.select(users[salary]))
228-
ExpectExecution(db, "SELECT \"users\".age FROM \"users\"", users.select(users[age]))
229-
ExpectExecution(db, "SELECT \"users\".email FROM \"users\"", users.select(users[email]))
226+
ExpectExecution(db, "SELECT \"users\".\"admin\" FROM \"users\"", users.select(users[admin]))
227+
ExpectExecution(db, "SELECT \"users\".\"salary\" FROM \"users\"", users.select(users[salary]))
228+
ExpectExecution(db, "SELECT \"users\".\"age\" FROM \"users\"", users.select(users[age]))
229+
ExpectExecution(db, "SELECT \"users\".\"email\" FROM \"users\"", users.select(users[email]))
230230
ExpectExecution(db, "SELECT \"users\".* FROM \"users\"", users.select(users[*]))
231231
}
232232

233233
func test_subscript_withAliasAndExpression_returnsAliasedExpression() {
234234
let managers = users.alias("managers")
235-
ExpectExecution(db, "SELECT \"managers\".admin FROM \"users\" AS \"managers\"", managers.select(managers[admin]))
236-
ExpectExecution(db, "SELECT \"managers\".salary FROM \"users\" AS \"managers\"", managers.select(managers[salary]))
237-
ExpectExecution(db, "SELECT \"managers\".age FROM \"users\" AS \"managers\"", managers.select(managers[age]))
238-
ExpectExecution(db, "SELECT \"managers\".email FROM \"users\" AS \"managers\"", managers.select(managers[email]))
235+
ExpectExecution(db, "SELECT \"managers\".\"admin\" FROM \"users\" AS \"managers\"", managers.select(managers[admin]))
236+
ExpectExecution(db, "SELECT \"managers\".\"salary\" FROM \"users\" AS \"managers\"", managers.select(managers[salary]))
237+
ExpectExecution(db, "SELECT \"managers\".\"age\" FROM \"users\" AS \"managers\"", managers.select(managers[age]))
238+
ExpectExecution(db, "SELECT \"managers\".\"email\" FROM \"users\" AS \"managers\"", managers.select(managers[email]))
239239
ExpectExecution(db, "SELECT \"managers\".* FROM \"users\" AS \"managers\"", managers.select(managers[*]))
240240
}
241241

@@ -252,12 +252,12 @@ class QueryTests: XCTestCase {
252252
.order(users[email].desc)
253253
.limit(1, offset: 2)
254254

255-
let SQL = "SELECT \"users\".email, count(\"users\".email) FROM \"users\" " +
255+
let SQL = "SELECT \"users\".\"email\", count(\"users\".\"email\") FROM \"users\" " +
256256
"LEFT OUTER JOIN \"users\" AS \"managers\" " +
257-
"ON ((\"managers\".id = \"users\".manager_id) AND (\"managers\".admin = 1)) " +
258-
"WHERE \"users\".age BETWEEN 21 AND 32 " +
259-
"GROUP BY \"users\".age HAVING (count(\"users\".email) > 1) " +
260-
"ORDER BY \"users\".email DESC " +
257+
"ON ((\"managers\".\"id\" = \"users\".\"manager_id\") AND (\"managers\".\"admin\" = 1)) " +
258+
"WHERE \"users\".\"age\" BETWEEN 21 AND 32 " +
259+
"GROUP BY \"users\".\"age\" HAVING (count(\"users\".\"email\") > 1) " +
260+
"ORDER BY \"users\".\"email\" DESC " +
261261
"LIMIT 1 " +
262262
"OFFSET 2"
263263
ExpectExecutions(db, [SQL: 1]) { _ in for _ in query {} }
@@ -283,7 +283,7 @@ class QueryTests: XCTestCase {
283283
}
284284

285285
func test_insert_insertsRows() {
286-
let SQL = "INSERT INTO \"users\" (email, age) VALUES ('[email protected]', 30)"
286+
let SQL = "INSERT INTO \"users\" (\"email\", \"age\") VALUES ('[email protected]', 30)"
287287

288288
ExpectExecutions(db, [SQL: 1]) { _ in
289289
XCTAssertEqual(1, self.users.insert(self.email <- "[email protected]", self.age <- 30).ID!)
@@ -293,15 +293,15 @@ class QueryTests: XCTestCase {
293293
}
294294

295295
func test_insert_withQuery_insertsRows() {
296-
db.execute("CREATE TABLE \"emails\" (email TEXT)")
296+
db.execute("CREATE TABLE \"emails\" (\"email\" TEXT)")
297297
let emails = db["emails"]
298298
let admins = users.select(email).filter(admin == true)
299299

300-
ExpectExecution(db, "INSERT INTO \"emails\" SELECT email FROM \"users\" WHERE (admin = 1)", emails.insert(admins))
300+
ExpectExecution(db, "INSERT INTO \"emails\" SELECT \"email\" FROM \"users\" WHERE (\"admin\" = 1)", emails.insert(admins))
301301
}
302302

303303
func test_insert_insertsDefaultRow() {
304-
db.execute("CREATE TABLE \"timestamps\" (id INTEGER PRIMARY KEY, timestamp TEXT DEFAULT CURRENT_DATETIME)")
304+
db.execute("CREATE TABLE \"timestamps\" (\"id\" INTEGER PRIMARY KEY, \"timestamp\" TEXT DEFAULT CURRENT_DATETIME)")
305305
let table = db["timestamps"]
306306

307307
ExpectExecutions(db, ["INSERT INTO \"timestamps\" DEFAULT VALUES": 1]) { _ in
@@ -310,7 +310,7 @@ class QueryTests: XCTestCase {
310310
}
311311

312312
func test_replace_replaceRows() {
313-
let SQL = "INSERT OR REPLACE INTO \"users\" (email, age) VALUES ('[email protected]', 30)"
313+
let SQL = "INSERT OR REPLACE INTO \"users\" (\"email\", \"age\") VALUES ('[email protected]', 30)"
314314

315315
ExpectExecutions(db, [SQL: 1]) { _ in
316316
XCTAssertEqual(1, self.users.replace(self.email <- "[email protected]", self.age <- 30).ID!)

0 commit comments

Comments
 (0)