Skip to content

Commit 3f1fac3

Browse files
committed
limit has been completed in the main & reconstruct feature UNION & update benchmark tests
1 parent f42cc73 commit 3f1fac3

7 files changed

+172
-156
lines changed

builder.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ func (b *Builder) Union(unionTp string, unionCond *Builder) *Builder {
110110
builder = &Builder{cond: NewCond()}
111111
builder.optype = unionType
112112
builder.dialect = b.dialect
113+
builder.selects = b.selects
113114

114115
currentUnions := b.unions
115116
// erase sub unions (actually append to new Builder.unions)
@@ -227,10 +228,6 @@ func (b *Builder) WriteTo(w Writer) error {
227228
case deleteType:
228229
return b.deleteWriteTo(w)
229230
case unionType:
230-
if b.limitation != nil {
231-
return b.limitWriteTo(w)
232-
}
233-
234231
return b.unionWriteTo(w)
235232
}
236233

builder_b_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,15 @@ func BenchmarkUpdate(b *testing.B) {
140140
// randQuery Generate a basic query for benchmark test. But be careful it's not a executable SQL in real db.
141141
func randQuery(dialect string, rgc *randGenConf) *Builder {
142142
b := randSelectByCondition(dialect, rgc)
143-
if rgc.allowUnion && rand.Intn(1000) >= 500 {
143+
isUnionized := rgc.allowUnion && rand.Intn(1000) >= 500
144+
if isUnionized {
144145
r := rand.Intn(3) + 1
145146
for i := r; i < r; i++ {
146147
b = b.Union("all", randSelectByCondition(dialect, rgc))
147148
}
148149
}
149150

150-
if rgc.allowLimit && rand.Intn(1000) >= 500 {
151+
if isUnionized && rgc.allowLimit && rand.Intn(1000) >= 500 {
151152
b = randLimit(b)
152153
}
153154

builder_limit.go

+29-34
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,32 @@ func (b *Builder) limitWriteTo(w Writer) error {
2424
b.limitation = nil
2525
ow := w.(*BytesWriter)
2626

27-
var final *Builder
28-
2927
switch strings.ToLower(strings.TrimSpace(b.dialect)) {
3028
case ORACLE:
31-
if ow.writer.Len() > 0 {
32-
// flush writer, both buffer & args
33-
ow.writer.Reset()
34-
ow.args = nil
29+
if len(b.selects) == 0 {
30+
b.selects = append(b.selects, "*")
3531
}
3632

33+
var final *Builder
3734
selects := b.selects
3835
b.selects = append(selects, "ROWNUM RN")
39-
if limit.offset == 0 {
40-
if len(selects) == 0 {
41-
selects = append(selects, "*")
42-
}
4336

44-
final = Dialect(b.dialect).Select("*").From("at", b).
37+
var wb *Builder
38+
if b.optype == unionType {
39+
wb = Dialect(b.dialect).Select("at.*", "ROWNUM RN").
40+
From("at", b)
41+
} else {
42+
wb = b
43+
}
44+
45+
if limit.offset == 0 {
46+
final = Dialect(b.dialect).Select(selects...).From("at", wb).
4547
Where(Lte{"at.RN": limit.limitN})
4648
} else {
4749
sub := Dialect(b.dialect).Select("*").
4850
From("at", b).Where(Lte{"at.RN": limit.offset + limit.limitN})
4951

50-
final = Dialect(b.dialect).Select("*").From("att", sub).
52+
final = Dialect(b.dialect).Select(selects...).From("att", sub).
5153
Where(Gt{"att.RN": limit.offset})
5254
}
5355

@@ -64,34 +66,27 @@ func (b *Builder) limitWriteTo(w Writer) error {
6466
fmt.Fprintf(ow, " LIMIT %v OFFSET %v", limit.limitN, limit.offset)
6567
}
6668
case MSSQL:
67-
if ow.writer.Len() > 0 {
68-
// flush writer, both buffer & args
69-
ow.writer.Reset()
70-
ow.args = nil
69+
if len(b.selects) == 0 {
70+
b.selects = append(b.selects, "*")
7171
}
7272

73+
var final *Builder
7374
selects := b.selects
74-
if limit.offset == 0 {
75-
if len(selects) == 0 {
76-
selects = append(selects, "*")
77-
}
75+
b.selects = append(append([]string{fmt.Sprintf("TOP %d %v", limit.limitN+limit.offset, b.selects[0])},
76+
b.selects[1:]...), "ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN")
7877

79-
final = Dialect(b.dialect).
80-
Select(fmt.Sprintf("TOP %d %v", limit.limitN, strings.Join(selects, ","))).
78+
var wb *Builder
79+
if b.optype == unionType {
80+
wb = Dialect(b.dialect).Select("*", "ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN").
8181
From("at", b)
8282
} else {
83-
sub := Dialect(b.dialect).Select(
84-
fmt.Sprintf("TOP %d %v,%v", limit.limitN+limit.offset,
85-
strings.Join(selects, ","), "ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN")).
86-
From(b.tableName).Where(b.cond)
87-
88-
if len(selects) == 0 {
89-
return ErrNotSupportType
90-
}
91-
92-
final = Dialect(b.dialect).Select(
93-
fmt.Sprintf("TOP %d %v", limit.limitN, strings.Join(append(selects, "RN"), ","))).
94-
From("at", sub).Where(Gt{"at.RN": limit.limitN})
83+
wb = b
84+
}
85+
86+
if limit.offset == 0 {
87+
final = Dialect(b.dialect).Select(selects...).From("at", wb)
88+
} else {
89+
final = Dialect(b.dialect).Select(selects...).From("at", wb).Where(Gt{"at.RN": limit.offset})
9590
}
9691

9792
return final.WriteTo(ow)

builder_limit_test.go

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// Copyright 2018 The Xorm Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package builder
6+
7+
import (
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
func TestBuilder_Limit(t *testing.T) {
14+
// simple -- OracleSQL style
15+
sql, args, err := Dialect(ORACLE).Select("a", "b", "c").From("table1").OrderBy("a ASC").
16+
Limit(5, 10).ToSQL()
17+
assert.NoError(t, err)
18+
assert.EqualValues(t, "SELECT a,b,c FROM (SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?", sql)
19+
assert.EqualValues(t, []interface{}{15, 10}, args)
20+
21+
// simple with join -- OracleSQL style
22+
sql, args, err = Dialect(ORACLE).Select("a", "b", "c", "d").From("table1 t1").
23+
InnerJoin("table2 t2", "t1.id = t2.ref_id").OrderBy("a ASC").Limit(5, 10).ToSQL()
24+
assert.NoError(t, err)
25+
assert.EqualValues(t, "SELECT a,b,c,d FROM (SELECT * FROM (SELECT a,b,c,d,ROWNUM RN FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.ref_id ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?", sql)
26+
assert.EqualValues(t, []interface{}{15, 10}, args)
27+
28+
// simple -- OracleSQL style
29+
sql, args, err = Dialect(ORACLE).Select("a", "b", "c").From("table1").
30+
OrderBy("a ASC").Limit(5).ToSQL()
31+
assert.NoError(t, err)
32+
assert.EqualValues(t, "SELECT a,b,c FROM (SELECT a,b,c,ROWNUM RN FROM table1 ORDER BY a ASC) at WHERE at.RN<=?", sql)
33+
assert.EqualValues(t, []interface{}{5}, args)
34+
35+
// simple with where -- OracleSQL style
36+
sql, args, err = Dialect(ORACLE).Select("a", "b", "c").From("table1").Where(Neq{"a": "10", "b": "20"}).
37+
OrderBy("a ASC").Limit(5, 1).ToSQL()
38+
assert.NoError(t, err)
39+
assert.EqualValues(t, "SELECT a,b,c FROM (SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 WHERE a<>? AND b<>? ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?", sql)
40+
assert.EqualValues(t, []interface{}{"10", "20", 6, 1}, args)
41+
42+
// simple -- MySQL/SQLite/PostgreSQL style
43+
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").OrderBy("a ASC").
44+
Limit(5, 10).ToSQL()
45+
assert.NoError(t, err)
46+
assert.EqualValues(t, "SELECT a,b,c FROM table1 ORDER BY a ASC LIMIT 5 OFFSET 10", sql)
47+
assert.EqualValues(t, 0, len(args))
48+
49+
// simple -- MySQL/SQLite/PostgreSQL style
50+
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").
51+
OrderBy("a ASC").Limit(5).ToSQL()
52+
assert.NoError(t, err)
53+
assert.EqualValues(t, "SELECT a,b,c FROM table1 ORDER BY a ASC LIMIT 5", sql)
54+
assert.EqualValues(t, 0, len(args))
55+
56+
// simple with where -- MySQL/SQLite/PostgreSQL style
57+
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").
58+
Where(Eq{"f1": "v1", "f2": "v2"}).OrderBy("a ASC").Limit(5, 10).ToSQL()
59+
assert.NoError(t, err)
60+
assert.EqualValues(t, "SELECT a,b,c FROM table1 WHERE f1=? AND f2=? ORDER BY a ASC LIMIT 5 OFFSET 10", sql)
61+
assert.EqualValues(t, []interface{}{"v1", "v2"}, args)
62+
63+
// simple -- MsSQL style
64+
sql, args, err = Dialect(MSSQL).Select("a", "b", "c").From("table1").
65+
OrderBy("a ASC").Limit(5).ToSQL()
66+
assert.NoError(t, err)
67+
assert.EqualValues(t, "SELECT a,b,c FROM (SELECT TOP 5 a,b,c,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM table1 ORDER BY a ASC) at", sql)
68+
assert.EqualValues(t, []interface{}([]interface{}(nil)), args)
69+
70+
// simple with where -- MsSQL style
71+
sql, args, err = Dialect(MSSQL).Select("a", "b", "c").From("table1").
72+
Where(Neq{"a": "3"}).OrderBy("a ASC").Limit(5, 10).ToSQL()
73+
assert.NoError(t, err)
74+
assert.EqualValues(t, "SELECT a,b,c FROM (SELECT TOP 15 a,b,c,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM table1 WHERE a<>? ORDER BY a ASC) at WHERE at.RN>?", sql)
75+
assert.EqualValues(t, []interface{}{"3", 10}, args)
76+
// union with limit -- OracleSQL style
77+
sql, args, err = Dialect(ORACLE).Select("a", "b", "c").From("at",
78+
Dialect(ORACLE).Select("a", "b", "c").From("table1").
79+
Where(Neq{"a": "0"}).OrderBy("a ASC").Limit(5, 10).Union("ALL",
80+
Select("a", "b", "c").From("table1").Where(Neq{"b": "48"}).OrderBy("a DESC").Limit(10))).Limit(3).ToSQL()
81+
assert.NoError(t, err)
82+
assert.EqualValues(t, "SELECT a,b,c FROM (SELECT a,b,c,ROWNUM RN FROM ((SELECT a,b,c FROM (SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 WHERE a<>? ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?) UNION ALL (SELECT a,b,c FROM (SELECT a,b,c,ROWNUM RN FROM table1 WHERE b<>? ORDER BY a DESC) at WHERE at.RN<=?)) at) at WHERE at.RN<=?", sql)
83+
assert.EqualValues(t, []interface{}{"0", 15, 10, "48", 10, 3}, args)
84+
85+
// union -- MySQL/SQLite/PostgreSQL style
86+
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("at",
87+
Dialect(MYSQL).Select("a", "b", "c").From("table1").Where(Eq{"a": 1}).OrderBy("a ASC").
88+
Limit(5, 9).Union("ALL",
89+
Select("a", "b", "c").From("table1").Where(Eq{"a": 2}).OrderBy("a DESC").Limit(10))).
90+
Limit(5, 10).ToSQL()
91+
assert.NoError(t, err)
92+
assert.EqualValues(t, "SELECT a,b,c FROM ((SELECT a,b,c FROM table1 WHERE a=? ORDER BY a ASC LIMIT 5 OFFSET 9) UNION ALL (SELECT a,b,c FROM table1 WHERE a=? ORDER BY a DESC LIMIT 10)) at LIMIT 5 OFFSET 10", sql)
93+
assert.EqualValues(t, []interface{}{1, 2}, args)
94+
95+
// union with limit -- MsSQL style
96+
sql, args, err = Dialect(MSSQL).Select("a", "b", "c").From("at",
97+
Dialect(MSSQL).Select("a", "b", "c").From("table1").Where(Neq{"a": "1"}).
98+
OrderBy("a ASC").Limit(5, 6).Union("ALL",
99+
Select("a", "b", "c").From("table1").Where(Neq{"b": "2"}).OrderBy("a DESC").Limit(10))).
100+
OrderBy("b DESC").Limit(7, 9).ToSQL()
101+
assert.NoError(t, err)
102+
assert.EqualValues(t, "SELECT a,b,c FROM (SELECT TOP 16 a,b,c,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM ((SELECT a,b,c FROM (SELECT TOP 11 a,b,c,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM table1 WHERE a<>? ORDER BY a ASC) at WHERE at.RN>?) UNION ALL (SELECT a,b,c FROM (SELECT TOP 10 a,b,c,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM table1 WHERE b<>? ORDER BY a DESC) at)) at ORDER BY b DESC) at WHERE at.RN>?", sql)
103+
assert.EqualValues(t, []interface{}{"1", 6, "2", 9}, args)
104+
}

builder_select_test.go

-92
Original file line numberDiff line numberDiff line change
@@ -92,95 +92,3 @@ func TestBuilder_From(t *testing.T) {
9292
assert.Error(t, err)
9393
fmt.Println(err)
9494
}
95-
96-
func TestBuilder_Limit(t *testing.T) {
97-
// simple -- OracleSQL style
98-
sql, args, err := Dialect(ORACLE).Select("a", "b", "c").From("table1").OrderBy("a ASC").
99-
Limit(5, 10).ToSQL()
100-
assert.NoError(t, err)
101-
assert.EqualValues(t, "SELECT * FROM (SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?", sql)
102-
assert.EqualValues(t, []interface{}{15, 10}, args)
103-
104-
// simple with join -- OracleSQL style
105-
sql, args, err = Dialect(ORACLE).Select("a", "b", "c", "d").From("table1 t1").
106-
InnerJoin("table2 t2", "t1.id = t2.ref_id").OrderBy("a ASC").Limit(5, 10).ToSQL()
107-
assert.NoError(t, err)
108-
assert.EqualValues(t, "SELECT * FROM (SELECT * FROM (SELECT a,b,c,d,ROWNUM RN FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.ref_id ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?", sql)
109-
assert.EqualValues(t, []interface{}{15, 10}, args)
110-
111-
// simple -- OracleSQL style
112-
sql, args, err = Dialect(ORACLE).Select("a", "b", "c").From("table1").
113-
OrderBy("a ASC").Limit(5).ToSQL()
114-
assert.NoError(t, err)
115-
assert.EqualValues(t, "SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 ORDER BY a ASC) at WHERE at.RN<=?", sql)
116-
assert.EqualValues(t, []interface{}{5}, args)
117-
118-
// simple with where -- OracleSQL style
119-
sql, args, err = Dialect(ORACLE).Select("a", "b", "c").From("table1").Where(Eq{"a": "10", "b": "10"}).
120-
OrderBy("a ASC").Limit(5, 1).ToSQL()
121-
assert.NoError(t, err)
122-
assert.EqualValues(t, "SELECT * FROM (SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 WHERE a=? AND b=? ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?", sql)
123-
assert.EqualValues(t, []interface{}{"10", "10", 6, 1}, args)
124-
125-
// simple -- MySQL/SQLite/PostgreSQL style
126-
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").OrderBy("a ASC").
127-
Limit(5, 10).ToSQL()
128-
assert.NoError(t, err)
129-
assert.EqualValues(t, "SELECT a,b,c FROM table1 ORDER BY a ASC LIMIT 5 OFFSET 10", sql)
130-
assert.EqualValues(t, 0, len(args))
131-
132-
// simple -- MySQL/SQLite/PostgreSQL style
133-
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").
134-
OrderBy("a ASC").Limit(5).ToSQL()
135-
assert.NoError(t, err)
136-
assert.EqualValues(t, "SELECT a,b,c FROM table1 ORDER BY a ASC LIMIT 5", sql)
137-
assert.EqualValues(t, 0, len(args))
138-
139-
// simple with where -- MySQL/SQLite/PostgreSQL style
140-
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").
141-
Where(Eq{"f1": "v1", "f2": "v2"}).OrderBy("a ASC").Limit(5, 10).ToSQL()
142-
assert.NoError(t, err)
143-
assert.EqualValues(t, "SELECT a,b,c FROM table1 WHERE f1=? AND f2=? ORDER BY a ASC LIMIT 5 OFFSET 10", sql)
144-
assert.EqualValues(t, []interface{}{"v1", "v2"}, args)
145-
146-
// simple -- MsSQL style
147-
sql, args, err = Dialect(MSSQL).Select("a", "b", "c").From("table1").
148-
OrderBy("a ASC").Limit(5).ToSQL()
149-
assert.NoError(t, err)
150-
assert.EqualValues(t, "SELECT TOP 5 a,b,c FROM (SELECT a,b,c FROM table1 ORDER BY a ASC) at", sql)
151-
assert.EqualValues(t, 0, len(args))
152-
153-
// simple with where -- MsSQL style
154-
sql, args, err = Dialect(MSSQL).Select("a", "b", "c").From("table1").
155-
Where(Eq{"a": "3"}).OrderBy("a ASC").Limit(5, 10).ToSQL()
156-
assert.NoError(t, err)
157-
assert.EqualValues(t, "SELECT TOP 5 a,b,c,RN FROM (SELECT TOP 15 a,b,c,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM table1 WHERE a=?) at WHERE at.RN>?", sql)
158-
assert.EqualValues(t, []interface{}{"3", 5}, args)
159-
160-
// union with limit -- OracleSQL style
161-
sql, args, err = Dialect(ORACLE).Select("a", "b", "c").From("table1").
162-
Where(Neq{"a": "0"}).OrderBy("a ASC").Limit(5, 10).Union("ALL",
163-
Select("a", "b", "c").From("table1").Where(Neq{"b": "48"}).OrderBy("a DESC").Limit(10)).
164-
Limit(3).ToSQL()
165-
assert.NoError(t, err)
166-
assert.EqualValues(t, "SELECT * FROM ((SELECT * FROM (SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 WHERE a<>? ORDER BY a ASC) at WHERE at.RN<=?) att WHERE att.RN>?) UNION ALL (SELECT * FROM (SELECT a,b,c,ROWNUM RN FROM table1 WHERE b<>? ORDER BY a DESC) at WHERE at.RN<=?)) at WHERE at.RN<=?", sql)
167-
assert.EqualValues(t, []interface{}{"0", 15, 10, "48", 10, 3}, args)
168-
169-
// union -- MySQL/SQLite/PostgreSQL style
170-
sql, args, err = Dialect(MYSQL).Select("a", "b", "c").From("table1").Where(Eq{"a": 1}).
171-
OrderBy("a ASC").Limit(5, 9).Union("ALL",
172-
Select("a", "b", "c").From("table1").Where(Eq{"a": 2}).OrderBy("a DESC").Limit(10)).
173-
Limit(5, 10).ToSQL()
174-
assert.NoError(t, err)
175-
assert.EqualValues(t, "(SELECT a,b,c FROM table1 WHERE a=? ORDER BY a ASC LIMIT 5 OFFSET 9) UNION ALL (SELECT a,b,c FROM table1 WHERE a=? ORDER BY a DESC LIMIT 10) LIMIT 5 OFFSET 10", sql)
176-
assert.EqualValues(t, []interface{}{1, 2}, args)
177-
178-
// union with limit -- MsSQL style
179-
sql, args, err = Dialect(MSSQL).Select("a", "b", "c").From("table1").
180-
Where(Eq{"a": 1}).OrderBy("a ASC").Limit(5, 6).Union("ALL",
181-
Select("a", "b", "c").From("table1").Where(Eq{"b": 2}).OrderBy("a DESC").Limit(10)).
182-
OrderBy("b DESC").Limit(7).ToSQL()
183-
assert.NoError(t, err)
184-
assert.EqualValues(t, "SELECT TOP 7 * FROM ((SELECT TOP 5 a,b,c,RN FROM (SELECT TOP 11 a,b,c,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RN FROM table1 WHERE a=?) at WHERE at.RN>?) UNION ALL (SELECT TOP 10 a,b,c FROM (SELECT a,b,c FROM table1 WHERE b=? ORDER BY a DESC) at)) at", sql)
185-
assert.EqualValues(t, []interface{}{1, 5, 2}, args)
186-
}

builder_union.go

+26-23
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ import (
1111
)
1212

1313
func (b *Builder) unionWriteTo(w Writer) error {
14+
if b.limitation != nil || b.cond != NewCond() ||
15+
b.orderBy != "" || b.having != "" || b.groupBy != "" {
16+
return errors.New("builder in unionType should not have any conditional fields in it(like Where or Limit)")
17+
}
18+
1419
for idx, u := range b.unions {
1520
current := u.builder
1621
if current.optype != selectType {
@@ -27,29 +32,27 @@ func (b *Builder) unionWriteTo(w Writer) error {
2732
}
2833
fmt.Fprint(w, "(")
2934

30-
if current.limitation != nil {
31-
switch current.dialect {
32-
case ORACLE, MSSQL:
33-
// if dialect is Oracle or Mssql, we need to make a copy of current context
34-
// coz the result of current will turn into a sub-query when building LIMIT query
35-
tw := NewWriter()
36-
if err := current.selectWriteTo(tw); err != nil {
37-
return err
38-
}
39-
40-
fmt.Fprintf(w, tw.writer.String())
41-
w.(*BytesWriter).args = append(w.(*BytesWriter).args, tw.args...)
42-
case MYSQL, SQLITE, POSTGRES:
43-
if err := current.selectWriteTo(w); err != nil {
44-
return err
45-
}
46-
default:
47-
return ErrNotSupportType
48-
}
49-
} else {
50-
if err := current.selectWriteTo(w); err != nil {
51-
return err
52-
}
35+
// switch b.dialect {
36+
// case ORACLE, MSSQL:
37+
// // if dialect is Oracle or Mssql, we need to make a copy of current context
38+
// // coz the result of current will turn into a sub-query when building LIMIT query
39+
// tw := NewWriter()
40+
// if err := current.selectWriteTo(tw); err != nil {
41+
// return err
42+
// }
43+
//
44+
// fmt.Fprintf(w, tw.writer.String())
45+
// w.(*BytesWriter).args = append(w.(*BytesWriter).args, tw.args...)
46+
// case MYSQL, SQLITE, POSTGRES:
47+
// if err := current.selectWriteTo(w); err != nil {
48+
// return err
49+
// }
50+
// default:
51+
// return ErrNotSupportType
52+
// }
53+
54+
if err := current.selectWriteTo(w); err != nil {
55+
return err
5356
}
5457

5558
fmt.Fprint(w, ")")

0 commit comments

Comments
 (0)