From fdf7c157fad7d289e82ac9135501e1499c6ec609 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 13 Mar 2026 10:20:02 +0700 Subject: [PATCH] fix: use dialect-aware identifier quoting in TableQueryBuilder --- .../Core/Services/Query/TableQueryBuilder.swift | 14 +++++++++++--- TablePro/Views/Main/MainContentCoordinator.swift | 7 ++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/TablePro/Core/Services/Query/TableQueryBuilder.swift b/TablePro/Core/Services/Query/TableQueryBuilder.swift index 8c7bc5ce0..725037e58 100644 --- a/TablePro/Core/Services/Query/TableQueryBuilder.swift +++ b/TablePro/Core/Services/Query/TableQueryBuilder.swift @@ -15,12 +15,21 @@ struct TableQueryBuilder { private let databaseType: DatabaseType private var pluginDriver: (any PluginDatabaseDriver)? + private let dialectQuote: (String) -> String // MARK: - Initialization - init(databaseType: DatabaseType, pluginDriver: (any PluginDatabaseDriver)? = nil) { + init( + databaseType: DatabaseType, + pluginDriver: (any PluginDatabaseDriver)? = nil, + dialectQuote: ((String) -> String)? = nil + ) { self.databaseType = databaseType self.pluginDriver = pluginDriver + self.dialectQuote = dialectQuote ?? { name in + let escaped = name.replacingOccurrences(of: "\"", with: "\"\"") + return "\"\(escaped)\"" + } } mutating func setPluginDriver(_ driver: (any PluginDatabaseDriver)?) { @@ -31,8 +40,7 @@ struct TableQueryBuilder { private func quote(_ name: String) -> String { if let pluginDriver { return pluginDriver.quoteIdentifier(name) } - let escaped = name.replacingOccurrences(of: "\"", with: "\"\"") - return "\"\(escaped)\"" + return dialectQuote(name) } // MARK: - Query Building diff --git a/TablePro/Views/Main/MainContentCoordinator.swift b/TablePro/Views/Main/MainContentCoordinator.swift index 0aa805a03..c63ab5e7e 100644 --- a/TablePro/Views/Main/MainContentCoordinator.swift +++ b/TablePro/Views/Main/MainContentCoordinator.swift @@ -228,7 +228,12 @@ final class MainContentCoordinator { self.filterStateManager = filterStateManager self.columnVisibilityManager = columnVisibilityManager self.toolbarState = toolbarState - self.queryBuilder = TableQueryBuilder(databaseType: connection.type) + self.queryBuilder = TableQueryBuilder( + databaseType: connection.type, + dialectQuote: quoteIdentifierFromDialect( + PluginManager.shared.sqlDialect(for: connection.type) + ) + ) self.persistence = TabPersistenceCoordinator(connectionId: connection.id) self.schemaProvider = SchemaProviderRegistry.shared.getOrCreate(for: connection.id)