Skip to content

Commit 58f57ce

Browse files
committed
fix: handle INTEGER/BOOLEAN/TIMESTAMP type names in DML — INFORMATION_SCHEMA returns different names than table resource API
1 parent 97d76c6 commit 58f57ce

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

Plugins/BigQueryDriverPlugin/BigQueryPluginDriver.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,7 @@ internal final class BigQueryPluginDriver: PluginDatabaseDriver, @unchecked Send
694694
guard let conn = connection else { return nil }
695695

696696
let dataset = lock.withLock { _currentDataset } ?? ""
697+
Self.logger.info("generateStatements: dataset='\(dataset, privacy: .public)' table='\(table, privacy: .public)' self=\(ObjectIdentifier(self).debugDescription, privacy: .public)")
697698

698699
// Block DML on external tables
699700
let tableType: String? = lock.withLock {
@@ -717,6 +718,8 @@ internal final class BigQueryPluginDriver: PluginDatabaseDriver, @unchecked Send
717718
return columns.map { _ in "STRING" }
718719
}
719720

721+
Self.logger.info("generateStatements: typeNames=\(typeNames, privacy: .public)")
722+
720723
let generator = BigQueryStatementGenerator(
721724
projectId: conn.projectId,
722725
dataset: dataset,

Plugins/BigQueryDriverPlugin/BigQueryStatementGenerator.swift

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ internal struct BigQueryStatementGenerator {
162162

163163
let upperType = typeName.uppercased()
164164

165-
if upperType == "INT64" || upperType == "FLOAT64" ||
165+
if upperType == "INT64" || upperType == "INTEGER" ||
166+
upperType == "FLOAT64" || upperType == "FLOAT" ||
166167
upperType == "NUMERIC" || upperType == "BIGNUMERIC"
167168
{
168169
let isNumeric = value.range(
@@ -173,7 +174,7 @@ internal struct BigQueryStatementGenerator {
173174
return "'\(escapeString(value))'"
174175
}
175176

176-
if upperType == "BOOL" {
177+
if upperType == "BOOL" || upperType == "BOOLEAN" {
177178
let lower = value.lowercased()
178179
if lower == "true" || lower == "1" { return "TRUE" }
179180
if lower == "false" || lower == "0" { return "FALSE" }
@@ -204,6 +205,20 @@ internal struct BigQueryStatementGenerator {
204205
return "FROM_BASE64('\(escapeString(value))')"
205206
}
206207

208+
// Temporal types need explicit casting for WHERE clause comparisons
209+
if upperType == "TIMESTAMP" {
210+
return "TIMESTAMP '\(escapeString(value))'"
211+
}
212+
if upperType == "DATE" {
213+
return "DATE '\(escapeString(value))'"
214+
}
215+
if upperType == "DATETIME" {
216+
return "DATETIME '\(escapeString(value))'"
217+
}
218+
if upperType == "TIME" {
219+
return "TIME '\(escapeString(value))'"
220+
}
221+
207222
return "'\(escapeString(value))'"
208223
}
209224

0 commit comments

Comments
 (0)