Skip to content

Commit 872bf82

Browse files
authored
Preserve column names in page (#40)
1 parent a9e3bca commit 872bf82

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

page.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package pgkit
33
import (
44
"fmt"
55
"regexp"
6+
"slices"
67
"strings"
78

89
sq "github.com/Masterminds/squirrel"
@@ -111,8 +112,7 @@ func (p *Page) SetDefaults(o *PaginatorSettings) {
111112
func (p *Page) GetOrder(columnFunc func(string) string, defaultSort ...string) []Sort {
112113
var sorts []Sort
113114
if p != nil && len(p.Sort) != 0 {
114-
// use sort
115-
sorts = p.Sort
115+
sorts = slices.Clone(p.Sort)
116116
}
117117
// fall back to column
118118
if len(sorts) == 0 {

page_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ func TestPagination(t *testing.T) {
3232
require.NoError(t, err)
3333
require.Equal(t, `SELECT * FROM t ORDER BY "id" ASC LIMIT 3 OFFSET 0`, sql)
3434
require.Empty(t, args)
35+
// Verify page.Column and page.Sort are not modified
36+
require.Empty(t, page.Column)
37+
require.Len(t, page.Sort, 0)
3538

3639
result = paginator.PrepareResult(make([]T, 0), page)
3740
require.Len(t, result, 0)
@@ -60,6 +63,9 @@ func TestInvalidSort(t *testing.T) {
6063
require.NoError(t, err)
6164
require.Equal(t, "SELECT * FROM t ORDER BY \"ID; DROP TABLE users;\" ASC, \"name\" DESC LIMIT 11 OFFSET 0", sql)
6265
require.Empty(t, args)
66+
// Verify columns in page.Sort are not quoted
67+
require.Equal(t, "ID; DROP TABLE users;", page.Sort[0].Column)
68+
require.Equal(t, "name", page.Sort[1].Column)
6369
}
6470

6571
func TestPageColumnInjection(t *testing.T) {
@@ -73,6 +79,8 @@ func TestPageColumnInjection(t *testing.T) {
7379
require.NoError(t, err)
7480
require.Equal(t, "SELECT * FROM t ORDER BY \"id; DROP TABLE users;--\" ASC LIMIT 11 OFFSET 0", sql)
7581
require.Empty(t, args)
82+
// Verify column in page is not quoted
83+
require.Equal(t, "id; DROP TABLE users;--", page.Column)
7684
}
7785

7886
func TestPageColumnSpaces(t *testing.T) {
@@ -86,6 +94,8 @@ func TestPageColumnSpaces(t *testing.T) {
8694
require.NoError(t, err)
8795
require.Equal(t, "SELECT * FROM t ORDER BY \"id\" ASC, \"name\" ASC LIMIT 11 OFFSET 0", sql)
8896
require.Empty(t, args)
97+
// Verify column in page is not quoted
98+
require.Equal(t, "id, name", page.Column)
8999
}
90100

91101
func TestSortOrderInjection(t *testing.T) {
@@ -103,6 +113,10 @@ func TestSortOrderInjection(t *testing.T) {
103113
require.NoError(t, err)
104114
require.Equal(t, "SELECT * FROM t ORDER BY \"id\" ASC, \"name\" DESC, \"created_at\" ASC LIMIT 11 OFFSET 0", sql)
105115
require.Empty(t, args)
116+
// Verify columns in page.Sort are not quoted
117+
require.Equal(t, "id", page.Sort[0].Column)
118+
require.Equal(t, "name", page.Sort[1].Column)
119+
require.Equal(t, "created_at", page.Sort[2].Column)
106120
}
107121

108122
func TestPaginationEdgeCases(t *testing.T) {
@@ -180,6 +194,10 @@ func TestColumnFunc(t *testing.T) {
180194
require.NoError(t, err)
181195
require.Equal(t, `SELECT * FROM t ORDER BY "ID" ASC, "NAME" DESC, "created_at" ASC LIMIT 11 OFFSET 0`, sql)
182196
require.Empty(t, args)
197+
// Verify columns in page.Sort are not quoted
198+
require.Equal(t, "id", page.Sort[0].Column)
199+
require.Equal(t, "name", page.Sort[1].Column)
200+
require.Equal(t, "created_at", page.Sort[2].Column)
183201
}
184202

185203
func TestColumnFallbackUsesColumnFunc(t *testing.T) {
@@ -199,6 +217,8 @@ func TestColumnFallbackUsesColumnFunc(t *testing.T) {
199217
require.NoError(t, err)
200218
require.Equal(t, `SELECT * FROM t ORDER BY "NAME" ASC LIMIT 11 OFFSET 0`, sql)
201219
require.Empty(t, args)
220+
// Verify column in page is not quoted or transformed
221+
require.Equal(t, "name", page.Column)
202222
}
203223

204224
func TestSortTakesPrecedenceOverColumn(t *testing.T) {
@@ -218,6 +238,8 @@ func TestSortTakesPrecedenceOverColumn(t *testing.T) {
218238
require.NoError(t, err)
219239
require.Equal(t, `SELECT * FROM t ORDER BY "id" DESC LIMIT 11 OFFSET 0`, sql)
220240
require.Empty(t, args)
241+
// Verify sort column in page is not quoted
242+
require.Equal(t, "id", page.Sort[0].Column)
221243
}
222244

223245
func TestPaginationOffsetAndPageRecompute(t *testing.T) {

0 commit comments

Comments
 (0)