|
| 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