Skip to content

Fix: Add CustomStringConvertible for Setter #1279

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

Merged
merged 1 commit into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Documentation/Upgrading.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

- `Expression.asSQL()` is no longer available. Expressions now implement `CustomStringConvertible`,
where `description` returns the SQL.
- `Statement.prepareRowIterator()` is now longer available. Instead, use the methods
- `Statement.prepareRowIterator()` is no longer available. Instead, use the methods
of the same name on `Connection`.
- `Connection.registerTokenizer` is no longer available to register custom FTS4 tokenizers.
- `Setter.asSQL()` is no longer available. Instead, Setter now implement `CustomStringConvertible`,
where `description` returns the SQL.
6 changes: 6 additions & 0 deletions Sources/SQLite/Typed/Setter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ extension Setter: Expressible {

}

extension Setter: CustomStringConvertible {
public var description: String {
asSQL()
}
}

public func <-<V: Value>(column: Expression<V>, value: Expression<V>) -> Setter {
Setter(column: column, value: value)
}
Expand Down
4 changes: 2 additions & 2 deletions Tests/SQLiteTests/Core/Connection+AttachTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class ConnectionAttachTests: SQLiteTestCase {
try db.attach(.inMemory, as: schemaName)

let table = Table("attached_users", database: schemaName)
let name = Expression<String>("string")
let name = SQLite.Expression<String>("string")

// create a table, insert some data
try db.run(table.create { builder in
Expand All @@ -41,7 +41,7 @@ class ConnectionAttachTests: SQLiteTestCase {
try db.attach(.uri(testDb, parameters: [.mode(.readOnly)]), as: schemaName)

let table = Table("tests", database: schemaName)
let email = Expression<String>("email")
let email = SQLite.Expression<String>("email")

let rows = try db.prepare(table.select(email)).map { $0[email] }
XCTAssertEqual(["[email protected]"], rows)
Expand Down
16 changes: 8 additions & 8 deletions Tests/SQLiteTests/Core/CoreFunctionsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ class CoreFunctionsTests: XCTestCase {
}

func test_random_generatesExpressionWithRandomFunction() {
assertSQL("random()", Expression<Int64>.random())
assertSQL("random()", Expression<Int>.random())
assertSQL("random()", SQLite.Expression<Int64>.random())
assertSQL("random()", SQLite.Expression<Int>.random())
}

func test_length_wrapsStringExpressionWithLengthFunction() {
Expand All @@ -38,14 +38,14 @@ class CoreFunctionsTests: XCTestCase {
assertSQL("(\"string\" LIKE '%\\%' ESCAPE '\\')", string.like("%\\%", escape: "\\"))
assertSQL("(\"stringOptional\" LIKE '_\\_' ESCAPE '\\')", stringOptional.like("_\\_", escape: "\\"))

assertSQL("(\"string\" LIKE \"a\")", string.like(Expression<String>("a")))
assertSQL("(\"stringOptional\" LIKE \"a\")", stringOptional.like(Expression<String>("a")))
assertSQL("(\"string\" LIKE \"a\")", string.like(SQLite.Expression<String>("a")))
assertSQL("(\"stringOptional\" LIKE \"a\")", stringOptional.like(SQLite.Expression<String>("a")))

assertSQL("(\"string\" LIKE \"a\" ESCAPE '\\')", string.like(Expression<String>("a"), escape: "\\"))
assertSQL("(\"stringOptional\" LIKE \"a\" ESCAPE '\\')", stringOptional.like(Expression<String>("a"), escape: "\\"))
assertSQL("(\"string\" LIKE \"a\" ESCAPE '\\')", string.like(SQLite.Expression<String>("a"), escape: "\\"))
assertSQL("(\"stringOptional\" LIKE \"a\" ESCAPE '\\')", stringOptional.like(SQLite.Expression<String>("a"), escape: "\\"))

assertSQL("('string' LIKE \"a\")", "string".like(Expression<String>("a")))
assertSQL("('string' LIKE \"a\" ESCAPE '\\')", "string".like(Expression<String>("a"), escape: "\\"))
assertSQL("('string' LIKE \"a\")", "string".like(SQLite.Expression<String>("a")))
assertSQL("('string' LIKE \"a\" ESCAPE '\\')", "string".like(SQLite.Expression<String>("a"), escape: "\\"))
}

func test_glob_buildsExpressionWithGlobOperator() {
Expand Down
4 changes: 2 additions & 2 deletions Tests/SQLiteTests/Core/StatementTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class StatementTests: SQLiteTestCase {

func test_zero_sized_blob_returns_null() throws {
let blobs = Table("blobs")
let blobColumn = Expression<Blob>("blob_column")
let blobColumn = SQLite.Expression<Blob>("blob_column")
try db.run(blobs.create { $0.column(blobColumn) })
try db.run(blobs.insert(blobColumn <- Blob(bytes: [])))
let blobValue = try db.scalar(blobs.select(blobColumn).limit(1, offset: 0))
Expand All @@ -38,7 +38,7 @@ class StatementTests: SQLiteTestCase {
let names = ["a", "b", "c"]
try insertUsers(names)

let emailColumn = Expression<String>("email")
let emailColumn = SQLite.Expression<String>("email")
let statement = try db.prepare("SELECT email FROM users")
let emails = try statement.prepareRowIterator().map { $0[emailColumn] }

Expand Down
6 changes: 3 additions & 3 deletions Tests/SQLiteTests/Extensions/FTS4Tests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ class FTS4Tests: XCTestCase {
}

func test_match_onVirtualTableAsExpression_compilesMatchExpression() {
assertSQL("(\"virtual_table\" MATCH 'string')", virtualTable.match("string") as Expression<Bool>)
assertSQL("(\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as Expression<Bool>)
assertSQL("(\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as Expression<Bool?>)
assertSQL("(\"virtual_table\" MATCH 'string')", virtualTable.match("string") as SQLite.Expression<Bool>)
assertSQL("(\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as SQLite.Expression<Bool>)
assertSQL("(\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as SQLite.Expression<Bool?>)
}

func test_match_onVirtualTableAsQueryType_compilesMatchExpression() {
Expand Down
2 changes: 1 addition & 1 deletion Tests/SQLiteTests/Extensions/FTSIntegrationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import SQLite3
@testable import SQLite

class FTSIntegrationTests: SQLiteTestCase {
let email = Expression<String>("email")
let email = SQLite.Expression<String>("email")
let index = VirtualTable("index")

private func createIndex() throws {
Expand Down
2 changes: 1 addition & 1 deletion Tests/SQLiteTests/Schema/SchemaChangerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ class SchemaChangerTests: SQLiteTestCase {
}

func test_add_column() throws {
let column = Expression<String>("new_column")
let column = SQLite.Expression<String>("new_column")
let newColumn = ColumnDefinition(name: "new_column",
type: .TEXT,
nullable: true,
Expand Down
4 changes: 2 additions & 2 deletions Tests/SQLiteTests/Schema/SchemaReaderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ class SchemaReaderTests: SQLiteTestCase {

try db.run(linkTable.create(block: { definition in
definition.column(idColumn, primaryKey: .autoincrement)
definition.column(testIdColumn, unique: false, check: nil, references: users, Expression<Int64>("id"))
definition.column(testIdColumn, unique: false, check: nil, references: users, SQLite.Expression<Int64>("id"))
}))

let foreignKeys = try schemaReader.foreignKeys(table: "test_links")
Expand Down Expand Up @@ -238,7 +238,7 @@ class SchemaReaderTests: SQLiteTestCase {
}

func test_objectDefinitions_indexes() throws {
let emailIndex = users.createIndex(Expression<String>("email"), unique: false, ifNotExists: true)
let emailIndex = users.createIndex(SQLite.Expression<String>("email"), unique: false, ifNotExists: true)
try db.run(emailIndex)

let indexes = try schemaReader.objectDefinitions(type: .index)
Expand Down
32 changes: 16 additions & 16 deletions Tests/SQLiteTests/TestHelpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,29 +74,29 @@ class SQLiteTestCase: XCTestCase {

}

let bool = Expression<Bool>("bool")
let boolOptional = Expression<Bool?>("boolOptional")
let bool = SQLite.Expression<Bool>("bool")
let boolOptional = SQLite.Expression<Bool?>("boolOptional")

let data = Expression<Blob>("blob")
let dataOptional = Expression<Blob?>("blobOptional")
let data = SQLite.Expression<Blob>("blob")
let dataOptional = SQLite.Expression<Blob?>("blobOptional")

let date = Expression<Date>("date")
let dateOptional = Expression<Date?>("dateOptional")
let date = SQLite.Expression<Date>("date")
let dateOptional = SQLite.Expression<Date?>("dateOptional")

let double = Expression<Double>("double")
let doubleOptional = Expression<Double?>("doubleOptional")
let double = SQLite.Expression<Double>("double")
let doubleOptional = SQLite.Expression<Double?>("doubleOptional")

let int = Expression<Int>("int")
let intOptional = Expression<Int?>("intOptional")
let int = SQLite.Expression<Int>("int")
let intOptional = SQLite.Expression<Int?>("intOptional")

let int64 = Expression<Int64>("int64")
let int64Optional = Expression<Int64?>("int64Optional")
let int64 = SQLite.Expression<Int64>("int64")
let int64Optional = SQLite.Expression<Int64?>("int64Optional")

let string = Expression<String>("string")
let stringOptional = Expression<String?>("stringOptional")
let string = SQLite.Expression<String>("string")
let stringOptional = SQLite.Expression<String?>("stringOptional")

let uuid = Expression<UUID>("uuid")
let uuidOptional = Expression<UUID?>("uuidOptional")
let uuid = SQLite.Expression<UUID>("uuid")
let uuidOptional = SQLite.Expression<UUID?>("uuidOptional")

let testUUIDValue = UUID(uuidString: "E621E1F8-C36C-495A-93FC-0C247A3E6E5F")!

Expand Down
28 changes: 14 additions & 14 deletions Tests/SQLiteTests/Typed/CustomFunctionsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import SQLite
#if !os(Linux)

class CustomFunctionNoArgsTests: SQLiteTestCase {
typealias FunctionNoOptional = () -> Expression<String>
typealias FunctionResultOptional = () -> Expression<String?>
typealias FunctionNoOptional = () -> SQLite.Expression<String>
typealias FunctionResultOptional = () -> SQLite.Expression<String?>

func testFunctionNoOptional() throws {
let _: FunctionNoOptional = try db.createFunction("test", deterministic: true) {
Expand All @@ -26,10 +26,10 @@ class CustomFunctionNoArgsTests: SQLiteTestCase {
}

class CustomFunctionWithOneArgTests: SQLiteTestCase {
typealias FunctionNoOptional = (Expression<String>) -> Expression<String>
typealias FunctionLeftOptional = (Expression<String?>) -> Expression<String>
typealias FunctionResultOptional = (Expression<String>) -> Expression<String?>
typealias FunctionLeftResultOptional = (Expression<String?>) -> Expression<String?>
typealias FunctionNoOptional = (SQLite.Expression<String>) -> SQLite.Expression<String>
typealias FunctionLeftOptional = (SQLite.Expression<String?>) -> SQLite.Expression<String>
typealias FunctionResultOptional = (SQLite.Expression<String>) -> SQLite.Expression<String?>
typealias FunctionLeftResultOptional = (SQLite.Expression<String?>) -> SQLite.Expression<String?>

func testFunctionNoOptional() throws {
let _: FunctionNoOptional = try db.createFunction("test", deterministic: true) { a in
Expand Down Expand Up @@ -65,14 +65,14 @@ class CustomFunctionWithOneArgTests: SQLiteTestCase {
}

class CustomFunctionWithTwoArgsTests: SQLiteTestCase {
typealias FunctionNoOptional = (Expression<String>, Expression<String>) -> Expression<String>
typealias FunctionLeftOptional = (Expression<String?>, Expression<String>) -> Expression<String>
typealias FunctionRightOptional = (Expression<String>, Expression<String?>) -> Expression<String>
typealias FunctionResultOptional = (Expression<String>, Expression<String>) -> Expression<String?>
typealias FunctionLeftRightOptional = (Expression<String?>, Expression<String?>) -> Expression<String>
typealias FunctionLeftResultOptional = (Expression<String?>, Expression<String>) -> Expression<String?>
typealias FunctionRightResultOptional = (Expression<String>, Expression<String?>) -> Expression<String?>
typealias FunctionLeftRightResultOptional = (Expression<String?>, Expression<String?>) -> Expression<String?>
typealias FunctionNoOptional = (SQLite.Expression<String>, SQLite.Expression<String>) -> SQLite.Expression<String>
typealias FunctionLeftOptional = (SQLite.Expression<String?>, SQLite.Expression<String>) -> SQLite.Expression<String>
typealias FunctionRightOptional = (SQLite.Expression<String>, SQLite.Expression<String?>) -> SQLite.Expression<String>
typealias FunctionResultOptional = (SQLite.Expression<String>, SQLite.Expression<String>) -> SQLite.Expression<String?>
typealias FunctionLeftRightOptional = (SQLite.Expression<String?>, SQLite.Expression<String?>) -> SQLite.Expression<String>
typealias FunctionLeftResultOptional = (SQLite.Expression<String?>, SQLite.Expression<String>) -> SQLite.Expression<String?>
typealias FunctionRightResultOptional = (SQLite.Expression<String>, SQLite.Expression<String?>) -> SQLite.Expression<String?>
typealias FunctionLeftRightResultOptional = (SQLite.Expression<String?>, SQLite.Expression<String?>) -> SQLite.Expression<String?>

func testNoOptional() throws {
let _: FunctionNoOptional = try db.createFunction("test", deterministic: true) { a, b in
Expand Down
10 changes: 5 additions & 5 deletions Tests/SQLiteTests/Typed/ExpressionTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ import XCTest
class ExpressionTests: XCTestCase {

func test_asSQL_expression_bindings() {
let expression = Expression<String>("foo ? bar", ["baz"])
let expression = SQLite.Expression<String>("foo ? bar", ["baz"])
XCTAssertEqual(expression.asSQL(), "foo 'baz' bar")
}

func test_asSQL_expression_bindings_quoting() {
let expression = Expression<String>("foo ? bar", ["'baz'"])
let expression = SQLite.Expression<String>("foo ? bar", ["'baz'"])
XCTAssertEqual(expression.asSQL(), "foo '''baz''' bar")
}

func test_expression_custom_string_convertible() {
let expression = Expression<String>("foo ? bar", ["baz"])
let expression = SQLite.Expression<String>("foo ? bar", ["baz"])
XCTAssertEqual(expression.asSQL(), expression.description)
}

Expand All @@ -24,12 +24,12 @@ class ExpressionTests: XCTestCase {
}

func test_init_literal() {
let expression = Expression<String>(literal: "literal")
let expression = SQLite.Expression<String>(literal: "literal")
XCTAssertEqual(expression.template, "literal")
}

func test_init_identifier() {
let expression = Expression<String>("identifier")
let expression = SQLite.Expression<String>("identifier")
XCTAssertEqual(expression.template, "\"identifier\"")
}
}
2 changes: 1 addition & 1 deletion Tests/SQLiteTests/Typed/OperatorsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ class OperatorsTests: XCTestCase {
}

func test_precedencePreserved() {
let n = Expression<Int>(value: 1)
let n = SQLite.Expression<Int>(value: 1)
assertSQL("(((1 = 1) AND (1 = 1)) OR (1 = 1))", (n == n && n == n) || n == n)
assertSQL("((1 = 1) AND ((1 = 1) OR (1 = 1)))", n == n && (n == n || n == n))
}
Expand Down
Loading
Loading