oracle support limit

This commit is contained in:
zhangyd
2023-09-15 18:10:54 +08:00
parent 92b7453ec1
commit b317170923
+33
View File
@@ -249,6 +249,21 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
sb.injection.WriteTo(buf, selectMarkerAfterSelect)
if flavor == Oracle && sb.limit >= 0 && sb.offset > 0 {
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, sb.selectCols...)
selectCols = append(selectCols, "ROWNUM r ")
buf.WriteString(strings.Join(selectCols, ", "))
}
}
if len(sb.tables) > 0 {
buf.WriteLeadingString("FROM ")
buf.WriteString(strings.Join(sb.tables, ", "))
@@ -274,6 +289,14 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
sb.injection.WriteTo(buf, selectMarkerAfterJoin)
}
if flavor == Oracle && sb.limit >= 0 {
upper := sb.limit
if sb.offset >= 0 {
upper += sb.offset
}
sb.whereExprs = append(sb.whereExprs, sb.LE("ROWNUM", upper))
}
if len(sb.whereExprs) > 0 {
buf.WriteLeadingString("WHERE ")
buf.WriteString(strings.Join(sb.whereExprs, " AND "))
@@ -354,6 +377,16 @@ func (sb *SelectBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
buf.WriteString(strconv.Itoa(sb.limit))
buf.WriteString(" ROWS ONLY")
}
case Oracle:
if flavor == Oracle && sb.limit >= 0 && sb.offset > 0 {
buf.WriteString(" ) ")
if len(sb.tables) > 0 {
buf.WriteString(strings.Join(sb.tables, ", "))
}
buf.WriteString(" WHERE ")
buf.WriteString(sb.G("r", sb.offset))
}
}
if sb.limit >= 0 {