@@ -237,8 +237,7 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
237237 buf := newStringBuilder ()
238238 sb .injection .WriteTo (buf , selectMarkerInit )
239239
240- oraclePage1 := flavor == Oracle && sb .limit >= 0
241- oraclePage2 := oraclePage1 && sb .offset > 0
240+ oraclePage := flavor == Oracle && (sb .limit >= 0 || sb .offset >= 0 )
242241
243242 if len (sb .selectCols ) > 0 {
244243 buf .WriteLeadingString ("SELECT " )
@@ -247,7 +246,7 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
247246 buf .WriteString ("DISTINCT " )
248247 }
249248
250- if oraclePage2 {
249+ if oraclePage {
251250 var selectCols []string
252251 for i := range sb .selectCols {
253252 cols := strings .SplitN (sb .selectCols [i ], "." , 2 )
@@ -265,7 +264,7 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
265264
266265 sb .injection .WriteTo (buf , selectMarkerAfterSelect )
267266
268- if oraclePage2 {
267+ if oraclePage {
269268 if len (sb .selectCols ) > 0 {
270269 buf .WriteLeadingString ("FROM ( SELECT " )
271270
@@ -274,9 +273,12 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
274273 }
275274
276275 var selectCols = make ([]string , 0 , len (sb .selectCols )+ 1 )
276+ selectCols = append (selectCols , "ROWNUM r" )
277277 selectCols = append (selectCols , sb .selectCols ... )
278- selectCols = append (selectCols , "ROWNUM r " )
279278 buf .WriteString (strings .Join (selectCols , ", " ))
279+
280+ buf .WriteLeadingString ("FROM ( SELECT " )
281+ buf .WriteString (strings .Join (sb .selectCols , ", " ))
280282 }
281283 }
282284
@@ -305,25 +307,11 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
305307 sb .injection .WriteTo (buf , selectMarkerAfterJoin )
306308 }
307309
308- if oraclePage1 {
309- upper := sb .limit
310- if sb .offset >= 0 {
311- upper += sb .offset
312- }
310+ if len (sb .whereExprs ) > 0 {
313311 buf .WriteLeadingString ("WHERE " )
314- whereExprs := make ([]string , 0 , len (sb .whereExprs )+ 1 )
315- whereExprs = append (whereExprs , sb .whereExprs ... )
316- whereExprs = append (whereExprs , fmt .Sprintf ("ROWNUM <= %d" , upper ))
317- buf .WriteString (strings .Join (whereExprs , " AND " ))
312+ buf .WriteString (strings .Join (sb .whereExprs , " AND " ))
318313
319314 sb .injection .WriteTo (buf , selectMarkerAfterWhere )
320- } else {
321- if len (sb .whereExprs ) > 0 {
322- buf .WriteLeadingString ("WHERE " )
323- buf .WriteString (strings .Join (sb .whereExprs , " AND " ))
324-
325- sb .injection .WriteTo (buf , selectMarkerAfterWhere )
326- }
327315 }
328316
329317 if len (sb .groupByCols ) > 0 {
@@ -401,14 +389,27 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
401389 }
402390
403391 case Oracle :
404- if oraclePage2 {
392+ if oraclePage {
405393 buf .WriteString (" ) " )
406394 if len (sb .tables ) > 0 {
407395 buf .WriteString (strings .Join (sb .tables , ", " ))
408396 }
409- buf .WriteString (" WHERE " )
410- buf .WriteString ("r > " )
411- buf .WriteString (strconv .Itoa (sb .offset ))
397+
398+ min := sb .offset
399+ if min < 0 {
400+ min = 0
401+ }
402+
403+ buf .WriteString (" ) WHERE " )
404+ if sb .limit >= 0 {
405+ buf .WriteString ("r BETWEEN " )
406+ buf .WriteString (strconv .Itoa (min + 1 ))
407+ buf .WriteString (" AND " )
408+ buf .WriteString (strconv .Itoa (sb .limit + min ))
409+ } else {
410+ buf .WriteString ("r >= " )
411+ buf .WriteString (strconv .Itoa (min + 1 ))
412+ }
412413 }
413414 }
414415
0 commit comments