diff --git a/select.go b/select.go index 10f62ef..bec0d4b 100644 --- a/select.go +++ b/select.go @@ -6,7 +6,6 @@ package sqlbuilder import ( "fmt" "reflect" - "strings" "github.com/huandu/go-clone" ) @@ -374,8 +373,6 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{ buf := newStringBuilder() sb.injection.WriteTo(buf, selectMarkerInit) - oraclePage := flavor == Oracle && (len(sb.limitVar) > 0 || len(sb.offsetVar) > 0) - if sb.cteBuilderVar != "" { buf.WriteLeadingString(sb.cteBuilderVar) sb.injection.WriteTo(buf, selectMarkerAfterWith) @@ -388,51 +385,11 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{ buf.WriteString("DISTINCT ") } - if oraclePage { - var selectCols = make([]string, 0, len(sb.selectCols)) - for i := range sb.selectCols { - cols := strings.SplitN(sb.selectCols[i], ".", 2) - - if len(cols) == 1 { - selectCols = append(selectCols, cols[0]) - } else { - selectCols = append(selectCols, cols[1]) - } - } - buf.WriteStrings(selectCols, ", ") - } else { - buf.WriteStrings(sb.selectCols, ", ") - } + buf.WriteStrings(sb.selectCols, ", ") } sb.injection.WriteTo(buf, selectMarkerAfterSelect) - if oraclePage { - if len(sb.selectCols) > 0 { - buf.WriteLeadingString("FROM (SELECT ") - - if sb.distinct { - buf.WriteString("DISTINCT ") - } - - var selectCols = make([]string, 0, len(sb.selectCols)+1) - selectCols = append(selectCols, "ROWNUM r") - - for i := range sb.selectCols { - cols := strings.SplitN(sb.selectCols[i], ".", 2) - if len(cols) == 1 { - selectCols = append(selectCols, cols[0]) - } else { - selectCols = append(selectCols, cols[1]) - } - } - - buf.WriteStrings(selectCols, ", ") - buf.WriteLeadingString("FROM (SELECT ") - buf.WriteStrings(sb.selectCols, ", ") - } - } - tableNames := sb.TableNames() if len(tableNames) > 0 { @@ -562,34 +519,20 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{ } case Oracle: - if oraclePage { - buf.WriteString(") ") + if len(sb.offsetVar) > 0 { + buf.WriteLeadingString("OFFSET ") + buf.WriteString(sb.offsetVar) + buf.WriteString(" ROWS") + } - if len(sb.tables) > 0 { - buf.WriteStrings(sb.tables, ", ") + if len(sb.limitVar) > 0 { + if len(sb.offsetVar) == 0 { + buf.WriteLeadingString("OFFSET 0 ROWS") } - buf.WriteString(") WHERE ") - - if len(sb.limitVar) > 0 { - buf.WriteString("r BETWEEN ") - - if len(sb.offsetVar) > 0 { - buf.WriteString(sb.offsetVar) - buf.WriteString(" + 1 AND ") - buf.WriteString(sb.limitVar) - buf.WriteString(" + ") - buf.WriteString(sb.offsetVar) - } else { - buf.WriteString("1 AND ") - buf.WriteString(sb.limitVar) - } - } else { - // As oraclePage is true, sb.offsetVar must not be empty. - buf.WriteString("r >= ") - buf.WriteString(sb.offsetVar) - buf.WriteString(" + 1") - } + buf.WriteLeadingString("FETCH NEXT ") + buf.WriteString(sb.limitVar) + buf.WriteString(" ROWS ONLY") } case Informix: diff --git a/select_test.go b/select_test.go index b9b9d0e..4be9881 100644 --- a/select_test.go +++ b/select_test.go @@ -261,10 +261,10 @@ func ExampleSelectBuilder_limit_offset() { // // Oracle // #1: SELECT * FROM user - // #2: SELECT * FROM (SELECT ROWNUM r, * FROM (SELECT * FROM user) user) WHERE r >= :1 + 1 - // #3: SELECT * FROM (SELECT ROWNUM r, * FROM (SELECT * FROM user) user) WHERE r BETWEEN :1 + 1 AND :2 + :3 - // #4: SELECT * FROM (SELECT ROWNUM r, * FROM (SELECT * FROM user) user) WHERE r BETWEEN 1 AND :1 - // #5: SELECT * FROM (SELECT ROWNUM r, * FROM (SELECT * FROM user ORDER BY id) user) WHERE r BETWEEN :1 + 1 AND :2 + :3 + // #2: SELECT * FROM user OFFSET :1 ROWS + // #3: SELECT * FROM user OFFSET :1 ROWS FETCH NEXT :2 ROWS ONLY + // #4: SELECT * FROM user OFFSET 0 ROWS FETCH NEXT :1 ROWS ONLY + // #5: SELECT * FROM user ORDER BY id OFFSET :1 ROWS FETCH NEXT :2 ROWS ONLY // // Informix // #1: SELECT * FROM user