|
| 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 | +} |
0 commit comments