@@ -24,7 +24,8 @@ struct SQLStatementGeneratorTests {
2424 tableName: tableName,
2525 columns: columns,
2626 primaryKeyColumn: primaryKeyColumn,
27- databaseType: databaseType
27+ databaseType: databaseType,
28+ dialect: PluginManager . shared. sqlDialect ( for: databaseType)
2829 )
2930 }
3031
@@ -1208,4 +1209,129 @@ struct SQLStatementGeneratorTests {
12081209 #expect( stmt. sql. range ( of: " \" email \" = $2 " ) != nil )
12091210 #expect( stmt. sql. range ( of: " \" id \" = $3 " ) != nil )
12101211 }
1212+
1213+ // MARK: - Reserved Keyword Column Name Regression (GH-373)
1214+
1215+ @Test ( " UPDATE quotes reserved keyword column names in MySQL " )
1216+ func testUpdateQuotesReservedKeywordColumnMySQL( ) {
1217+ let generator = makeGenerator (
1218+ tableName: " connections " ,
1219+ columns: [ " id " , " database " , " table " , " order " ] ,
1220+ primaryKeyColumn: " id "
1221+ )
1222+ let changes : [ RowChange ] = [
1223+ RowChange (
1224+ rowIndex: 0 ,
1225+ type: . update,
1226+ cellChanges: [
1227+ CellChange ( rowIndex: 0 , columnIndex: 1 , columnName: " database " , oldValue: " old_db " , newValue: " new_db " )
1228+ ] ,
1229+ originalRow: [ " 1 " , " old_db " , " users " , " 5 " ]
1230+ )
1231+ ]
1232+
1233+ let statements = generator. generateStatements (
1234+ from: changes,
1235+ insertedRowData: [ : ] ,
1236+ deletedRowIndices: [ ] ,
1237+ insertedRowIndices: [ ]
1238+ )
1239+
1240+ #expect( statements. count == 1 )
1241+ let stmt = statements [ 0 ]
1242+ #expect( stmt. sql. contains ( " `database` = ? " ) )
1243+ #expect( stmt. sql. contains ( " WHERE `id` = ? " ) )
1244+ #expect( !stmt. sql. contains ( " SET database = " ) )
1245+ }
1246+
1247+ @Test ( " INSERT quotes reserved keyword column names in MySQL " )
1248+ func testInsertQuotesReservedKeywordColumnMySQL( ) {
1249+ let generator = makeGenerator (
1250+ tableName: " connections " ,
1251+ columns: [ " id " , " database " , " order " ] ,
1252+ primaryKeyColumn: " id "
1253+ )
1254+ let insertedRowData : [ Int : [ String ? ] ] = [
1255+ 0 : [ " 1 " , " mydb " , " 5 " ]
1256+ ]
1257+ let changes : [ RowChange ] = [
1258+ RowChange ( rowIndex: 0 , type: . insert, cellChanges: [ ] , originalRow: nil )
1259+ ]
1260+
1261+ let statements = generator. generateStatements (
1262+ from: changes,
1263+ insertedRowData: insertedRowData,
1264+ deletedRowIndices: [ ] ,
1265+ insertedRowIndices: [ 0 ]
1266+ )
1267+
1268+ #expect( statements. count == 1 )
1269+ let stmt = statements [ 0 ]
1270+ #expect( stmt. sql. contains ( " `database` " ) )
1271+ #expect( stmt. sql. contains ( " `order` " ) )
1272+ #expect( !stmt. sql. contains ( " (database, " ) )
1273+ #expect( !stmt. sql. contains ( " , order) " ) )
1274+ }
1275+
1276+ @Test ( " DELETE quotes reserved keyword column names in MySQL (no PK) " )
1277+ func testDeleteQuotesReservedKeywordColumnMySQL( ) {
1278+ let generator = makeGenerator (
1279+ tableName: " connections " ,
1280+ columns: [ " id " , " database " , " select " ] ,
1281+ primaryKeyColumn: nil
1282+ )
1283+ let changes : [ RowChange ] = [
1284+ RowChange (
1285+ rowIndex: 0 ,
1286+ type: . delete,
1287+ cellChanges: [ ] ,
1288+ originalRow: [ " 1 " , " mydb " , " foo " ]
1289+ )
1290+ ]
1291+
1292+ let statements = generator. generateStatements (
1293+ from: changes,
1294+ insertedRowData: [ : ] ,
1295+ deletedRowIndices: [ 0 ] ,
1296+ insertedRowIndices: [ ]
1297+ )
1298+
1299+ #expect( statements. count == 1 )
1300+ let stmt = statements [ 0 ]
1301+ #expect( stmt. sql. contains ( " `database` " ) )
1302+ #expect( stmt. sql. contains ( " `select` " ) )
1303+ }
1304+
1305+ @Test ( " UPDATE quotes reserved keyword column names in PostgreSQL " )
1306+ func testUpdateQuotesReservedKeywordColumnPostgreSQL( ) {
1307+ let generator = makeGenerator (
1308+ tableName: " connections " ,
1309+ columns: [ " id " , " database " , " order " ] ,
1310+ primaryKeyColumn: " id " ,
1311+ databaseType: . postgresql
1312+ )
1313+ let changes : [ RowChange ] = [
1314+ RowChange (
1315+ rowIndex: 0 ,
1316+ type: . update,
1317+ cellChanges: [
1318+ CellChange ( rowIndex: 0 , columnIndex: 1 , columnName: " database " , oldValue: " old_db " , newValue: " new_db " )
1319+ ] ,
1320+ originalRow: [ " 1 " , " old_db " , " 5 " ]
1321+ )
1322+ ]
1323+
1324+ let statements = generator. generateStatements (
1325+ from: changes,
1326+ insertedRowData: [ : ] ,
1327+ deletedRowIndices: [ ] ,
1328+ insertedRowIndices: [ ]
1329+ )
1330+
1331+ #expect( statements. count == 1 )
1332+ let stmt = statements [ 0 ]
1333+ // PostgreSQL uses double quotes
1334+ #expect( stmt. sql. contains ( " \" database \" = $1 " ) )
1335+ #expect( stmt. sql. contains ( " \" id \" = $2 " ) )
1336+ }
12111337}
0 commit comments