@@ -96,9 +96,12 @@ type SelectBuilder struct {
9696 groupByCols []string
9797 orderByCols []string
9898 order string
99- limitVar string
100- offsetVar string
101- forWhat string
99+ limitVar string
100+ offsetVar string
101+ forWhat string
102+ forOf []string
103+ forSkipLocked bool
104+ forNoWait bool
102105
103106 args * Args
104107
@@ -321,15 +324,35 @@ func (sb *SelectBuilder) Offset(offset int) *SelectBuilder {
321324}
322325
323326// ForUpdate adds FOR UPDATE at the end of SELECT statement.
324- func (sb * SelectBuilder ) ForUpdate () * SelectBuilder {
327+ // Optional table names are appended as FOR UPDATE OF t1, t2, ...
328+ func (sb * SelectBuilder ) ForUpdate (tables ... string ) * SelectBuilder {
325329 sb .forWhat = "UPDATE"
330+ sb .forOf = tables
326331 sb .marker = selectMarkerAfterFor
327332 return sb
328333}
329334
330335// ForShare adds FOR SHARE at the end of SELECT statement.
331- func (sb * SelectBuilder ) ForShare () * SelectBuilder {
336+ // Optional table names are appended as FOR SHARE OF t1, t2, ...
337+ func (sb * SelectBuilder ) ForShare (tables ... string ) * SelectBuilder {
332338 sb .forWhat = "SHARE"
339+ sb .forOf = tables
340+ sb .marker = selectMarkerAfterFor
341+ return sb
342+ }
343+
344+ // SkipLocked appends SKIP LOCKED to a FOR UPDATE / FOR SHARE clause.
345+ func (sb * SelectBuilder ) SkipLocked () * SelectBuilder {
346+ sb .forSkipLocked = true
347+ sb .forNoWait = false
348+ sb .marker = selectMarkerAfterFor
349+ return sb
350+ }
351+
352+ // NoWait appends NOWAIT to a FOR UPDATE / FOR SHARE clause.
353+ func (sb * SelectBuilder ) NoWait () * SelectBuilder {
354+ sb .forNoWait = true
355+ sb .forSkipLocked = false
333356 sb .marker = selectMarkerAfterFor
334357 return sb
335358}
@@ -569,6 +592,17 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
569592 buf .WriteLeadingString ("FOR " )
570593 buf .WriteString (sb .forWhat )
571594
595+ if len (sb .forOf ) > 0 {
596+ buf .WriteString (" OF " )
597+ buf .WriteStrings (sb .forOf , ", " )
598+ }
599+
600+ if sb .forSkipLocked {
601+ buf .WriteString (" SKIP LOCKED" )
602+ } else if sb .forNoWait {
603+ buf .WriteString (" NOWAIT" )
604+ }
605+
572606 sb .injection .WriteTo (buf , selectMarkerAfterFor )
573607 }
574608
0 commit comments