11import IssueReporting
22
33extension Table {
4+ /// Columns referencing the value that would have been inserted in an
5+ /// [insert statement](<doc:InsertStatements>) had there been no conflict.
6+ public typealias Excluded = TableAlias < Self , _ExcludedName > . TableColumns
7+
48 /// An insert statement for one or more table rows.
59 ///
610 /// This function can be used to create an insert statement from a ``Table`` value.
@@ -54,7 +58,7 @@ extension Table {
5458 or conflictResolution: ConflictResolution ? = nil ,
5559 _ columns: ( TableColumns ) -> TableColumns = { $0 } ,
5660 @InsertValuesBuilder < Self > values: ( ) -> [ Self ] ,
57- onConflictDoUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? = nil ,
61+ onConflictDoUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? = nil ,
5862 @QueryFragmentBuilder < Bool >
5963 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
6064 ) -> InsertOf < Self > {
@@ -89,7 +93,7 @@ extension Table {
8993 ) ,
9094 @QueryFragmentBuilder < Bool >
9195 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
92- doUpdate updates: ( inout Updates < Self > ) -> Void = { _ in } ,
96+ doUpdate updates: ( inout Updates < Self , Excluded > ) -> Void = { _ in } ,
9397 @QueryFragmentBuilder < Bool >
9498 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
9599 ) -> InsertOf < Self > {
@@ -111,7 +115,7 @@ extension Table {
111115 onConflict conflictTargets: ( TableColumns ) -> ( repeat TableColumn < Self , each ConflictTarget > ) ? ,
112116 @QueryFragmentBuilder < Bool >
113117 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
114- doUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? ,
118+ doUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? ,
115119 @QueryFragmentBuilder < Bool >
116120 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
117121 ) -> InsertOf < Self > {
@@ -197,7 +201,7 @@ extension Table {
197201 _ columns: ( TableColumns ) -> ( TableColumn < Self , V1 > , repeat TableColumn < Self , each V2 > ) ,
198202 @InsertValuesBuilder < ( V1 . QueryOutput , repeat ( each V2 ) . QueryOutput) >
199203 values: ( ) -> [ ( V1 . QueryOutput , repeat ( each V2 ) . QueryOutput) ] ,
200- onConflictDoUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? = nil ,
204+ onConflictDoUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? = nil ,
201205 @QueryFragmentBuilder < Bool >
202206 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
203207 ) -> InsertOf < Self > {
@@ -234,7 +238,7 @@ extension Table {
234238 ) ,
235239 @QueryFragmentBuilder < Bool >
236240 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
237- doUpdate updates: ( inout Updates < Self > ) -> Void = { _ in } ,
241+ doUpdate updates: ( inout Updates < Self , Excluded > ) -> Void = { _ in } ,
238242 @QueryFragmentBuilder < Bool >
239243 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
240244 ) -> InsertOf < Self > {
@@ -259,7 +263,7 @@ extension Table {
259263 onConflict conflictTargets: ( TableColumns ) -> ( repeat TableColumn < Self , each ConflictTarget > ) ? ,
260264 @QueryFragmentBuilder < Bool >
261265 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
262- doUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? ,
266+ doUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? ,
263267 @QueryFragmentBuilder < Bool >
264268 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
265269 ) -> InsertOf < Self > {
@@ -306,7 +310,7 @@ extension Table {
306310 or conflictResolution: ConflictResolution ? = nil ,
307311 _ columns: ( TableColumns ) -> ( TableColumn < Self , V1 > , repeat TableColumn < Self , each V2 > ) ,
308312 select selection: ( ) -> some PartialSelectStatement < ( V1 , repeat each V2 ) > ,
309- onConflictDoUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? = nil ,
313+ onConflictDoUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? = nil ,
310314 @QueryFragmentBuilder < Bool >
311315 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
312316 ) -> InsertOf < Self > {
@@ -350,7 +354,7 @@ extension Table {
350354 ) ,
351355 @QueryFragmentBuilder < Bool >
352356 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
353- doUpdate updates: ( inout Updates < Self > ) -> Void = { _ in } ,
357+ doUpdate updates: ( inout Updates < Self , Excluded > ) -> Void = { _ in } ,
354358 @QueryFragmentBuilder < Bool >
355359 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
356360 ) -> InsertOf < Self > {
@@ -377,7 +381,7 @@ extension Table {
377381 onConflict conflictTargets: ( TableColumns ) -> ( repeat TableColumn < Self , each ConflictTarget > ) ? ,
378382 @QueryFragmentBuilder < Bool >
379383 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
380- doUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? ,
384+ doUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? ,
381385 @QueryFragmentBuilder < Bool >
382386 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
383387 ) -> InsertOf < Self > {
@@ -428,7 +432,7 @@ extension Table {
428432 onConflict conflictTargets: ( TableColumns ) -> ( repeat TableColumn < Self , each ConflictTarget > ) ? ,
429433 @QueryFragmentBuilder < Bool >
430434 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
431- doUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? ,
435+ doUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? ,
432436 @QueryFragmentBuilder < Bool >
433437 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
434438 ) -> InsertOf < Self > {
@@ -444,7 +448,7 @@ extension Table {
444448 conflictTargetColumnNames: conflictTargetColumnNames,
445449 conflictTargetFilter: targetFilter ( Self . columns) ,
446450 values: values,
447- updates: updates. map { Updates ( $0) } ,
451+ updates: updates. map { Updates ( $0, excluded : Excluded . QueryValue . columns ) } ,
448452 updateFilter: updateFilter ( Self . columns) ,
449453 returning: [ ]
450454 )
@@ -468,7 +472,7 @@ extension PrimaryKeyedTable {
468472 or conflictResolution: ConflictResolution ? = nil ,
469473 _ columns: ( Draft . TableColumns ) -> Draft . TableColumns = { $0 } ,
470474 @InsertValuesBuilder < Draft > values: ( ) -> [ Draft ] ,
471- onConflictDoUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? = nil ,
475+ onConflictDoUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? = nil ,
472476 @QueryFragmentBuilder < Bool >
473477 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
474478 ) -> InsertOf < Self > {
@@ -504,7 +508,7 @@ extension PrimaryKeyedTable {
504508 ) ,
505509 @QueryFragmentBuilder < Bool >
506510 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
507- doUpdate updates: ( inout Updates < Self > ) -> Void = { _ in } ,
511+ doUpdate updates: ( inout Updates < Self , Excluded > ) -> Void = { _ in } ,
508512 @QueryFragmentBuilder < Bool >
509513 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
510514 ) -> InsertOf < Self > {
@@ -557,7 +561,7 @@ extension PrimaryKeyedTable {
557561 onConflict conflictTargets: ( TableColumns ) -> ( repeat TableColumn < Self , each ConflictTarget > ) ? ,
558562 @QueryFragmentBuilder < Bool >
559563 where targetFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] } ,
560- doUpdate updates: ( ( inout Updates < Self > ) -> Void ) ? ,
564+ doUpdate updates: ( ( inout Updates < Self , Excluded > ) -> Void ) ? ,
561565 @QueryFragmentBuilder < Bool >
562566 where updateFilter: ( TableColumns ) -> [ QueryFragment ] = { _ in [ ] }
563567 ) -> InsertOf < Self > {
@@ -603,7 +607,7 @@ public struct Insert<Into: Table, Returning> {
603607 var conflictTargetColumnNames : [ String ]
604608 var conflictTargetFilter : [ QueryFragment ]
605609 fileprivate var values : InsertValues
606- var updates : Updates < Into > ?
610+ var updates : Updates < Into , Into . Excluded > ?
607611 var updateFilter : [ QueryFragment ]
608612 var returning : [ QueryFragment ]
609613
@@ -613,7 +617,7 @@ public struct Insert<Into: Table, Returning> {
613617 conflictTargetColumnNames: [ String ] ,
614618 conflictTargetFilter: [ QueryFragment ] ,
615619 values: InsertValues ,
616- updates: Updates < Into > ? ,
620+ updates: Updates < Into , Into . Excluded > ? ,
617621 updateFilter: [ QueryFragment ] ,
618622 returning: [ QueryFragment ]
619623 ) {
@@ -806,3 +810,7 @@ public enum InsertValuesBuilder<Value> {
806810 accumulated + next
807811 }
808812}
813+
814+ public struct _ExcludedName : AliasName {
815+ public static var aliasName : String { " excluded " }
816+ }
0 commit comments