@@ -108,20 +108,13 @@ struct SQLFormatterService: SQLFormatterProtocol {
108108 /// Get or create the keyword uppercasing regex for a given database type
109109 private static func keywordRegex( for dialect: DatabaseType ) -> NSRegularExpression ? {
110110 keywordRegexLock. lock ( )
111- defer { keywordRegexLock. unlock ( ) }
112-
113111 if let cached = keywordRegexCache [ dialect] {
112+ keywordRegexLock. unlock ( )
114113 return cached
115114 }
115+ keywordRegexLock. unlock ( )
116116
117- let provider : SQLDialectProvider
118- if Thread . isMainThread {
119- provider = MainActor . assumeIsolated { SQLDialectFactory . createDialect ( for: dialect) }
120- } else {
121- provider = DispatchQueue . main. sync {
122- MainActor . assumeIsolated { SQLDialectFactory . createDialect ( for: dialect) }
123- }
124- }
117+ let provider = resolveDialectProvider ( for: dialect)
125118 let allKeywords = provider. keywords. union ( provider. functions) . union ( provider. dataTypes)
126119 let escapedKeywords = allKeywords. map { NSRegularExpression . escapedPattern ( for: $0) }
127120 let pattern = " \\ b( \( escapedKeywords. joined ( separator: " | " ) ) ) \\ b "
@@ -130,10 +123,24 @@ struct SQLFormatterService: SQLFormatterProtocol {
130123 return nil
131124 }
132125
126+ keywordRegexLock. lock ( )
127+ defer { keywordRegexLock. unlock ( ) }
128+ if let cached = keywordRegexCache [ dialect] {
129+ return cached
130+ }
133131 keywordRegexCache [ dialect] = regex
134132 return regex
135133 }
136134
135+ private static func resolveDialectProvider( for dialect: DatabaseType ) -> SQLDialectProvider {
136+ if Thread . isMainThread {
137+ return MainActor . assumeIsolated { SQLDialectFactory . createDialect ( for: dialect) }
138+ }
139+ return DispatchQueue . main. sync {
140+ MainActor . assumeIsolated { SQLDialectFactory . createDialect ( for: dialect) }
141+ }
142+ }
143+
137144 // MARK: - Public API
138145
139146 func format(
@@ -159,15 +166,7 @@ struct SQLFormatterService: SQLFormatterProtocol {
159166 throw SQLFormatterError . invalidCursorPosition ( cursor, max: sqlLength)
160167 }
161168
162- // Get dialect provider
163- let dialectProvider : SQLDialectProvider
164- if Thread . isMainThread {
165- dialectProvider = MainActor . assumeIsolated { SQLDialectFactory . createDialect ( for: dialect) }
166- } else {
167- dialectProvider = DispatchQueue . main. sync {
168- MainActor . assumeIsolated { SQLDialectFactory . createDialect ( for: dialect) }
169- }
170- }
169+ let dialectProvider = Self . resolveDialectProvider ( for: dialect)
171170
172171 // Format the SQL
173172 let formatted = formatSQL ( sql, dialect: dialectProvider, databaseType: dialect, options: options)
0 commit comments