Skip to content

Commit d5110f9

Browse files
committed
feat(select): add SKIP LOCKED
1 parent 0c2aa0f commit d5110f9

1 file changed

Lines changed: 39 additions & 5 deletions

File tree

select.go

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)