dialect/sql/sqlgraph: ignore ORDER BY clauses in COUNT queries (#3226)

This commit is contained in:
Ariel Mashraki
2023-01-10 14:03:29 +02:00
committed by GitHub
parent 27a9db528b
commit fa1cf83fdd
4 changed files with 105 additions and 83 deletions

View File

@@ -645,6 +645,11 @@ func (q *query) count(ctx context.Context, drv dialect.Driver) (int, error) {
if err != nil {
return 0, err
}
// Remove any ORDER BY clauses present in the COUNT query as
// they are not allowed in some databases, such as PostgreSQL.
if q.Order != nil {
selector.ClearOrder()
}
// If no columns were selected in count,
// the default selection is by node ids.
columns := q.Node.Columns

View File

@@ -2198,11 +2198,11 @@ func TestQueryNodes(t *testing.T) {
AddRow(1, 10, nil, nil, nil).
AddRow(2, 20, "", 0, 0).
AddRow(3, 30, "a8m", 1, 1))
mock.ExpectQuery(escape("SELECT COUNT(DISTINCT `users`.`id`) FROM `users` WHERE `age` < ? ORDER BY `id` LIMIT 3 OFFSET 4 FOR UPDATE NOWAIT")).
mock.ExpectQuery(escape("SELECT COUNT(DISTINCT `users`.`id`) FROM `users` WHERE `age` < ? LIMIT 3 OFFSET 4 FOR UPDATE NOWAIT")).
WithArgs(40).
WillReturnRows(sqlmock.NewRows([]string{"COUNT"}).
AddRow(3))
mock.ExpectQuery(escape("SELECT COUNT(DISTINCT `users`.`name`) FROM `users` WHERE `age` < ? ORDER BY `id` LIMIT 3 OFFSET 4 FOR UPDATE NOWAIT")).
mock.ExpectQuery(escape("SELECT COUNT(DISTINCT `users`.`name`) FROM `users` WHERE `age` < ? LIMIT 3 OFFSET 4 FOR UPDATE NOWAIT")).
WithArgs(40).
WillReturnRows(sqlmock.NewRows([]string{"COUNT"}).
AddRow(3))