Fix: search/nearby 500 (pgx numeric vs float8)

pgx по умолчанию передаёт float64 как numeric.
В запросе BETWEEN $1 - $6 AND $1 + $6 numeric-numeric
сравнивалось с double precision lat/lng и возвращало ошибку.

Фикс: ::float8 касты на все параметры запроса.
Проверено: /search/nearby → 200 с count=2 для юзеров в 600м.
This commit is contained in:
ga 2026-08-21 11:50:49 +00:00
parent aafbc6f047
commit 21c413a9cc

View File

@ -110,21 +110,21 @@ func (r *Repo) Nearby(ctx context.Context, myID uuid.UUID, lat, lng, radiusKm fl
AND u.id != $3
AND ul.lat IS NOT NULL AND ul.lng IS NOT NULL
AND ul.updated_at > NOW() - INTERVAL '1 hour'
AND ul.lat BETWEEN $1 - $6 AND $1 + $6
AND ul.lng BETWEEN $2 - $7 AND $2 + $7
AND ul.lat BETWEEN ($1::float8 - $6::float8) AND ($1::float8 + $6::float8)
AND ul.lng BETWEEN ($2::float8 - $7::float8) AND ($2::float8 + $7::float8)
)
SELECT id, name, photo_url, lat, lng,
2 * 6371 * asin(sqrt(
sin(radians((lat - $1) / 2))^2 +
cos(radians($1)) * cos(radians(lat)) *
sin(radians((lng - $2) / 2))^2
sin(radians((lat - $1::float8) / 2))^2 +
cos(radians($1::float8)) * cos(radians(lat)) *
sin(radians((lng - $2::float8) / 2))^2
)) * 1000 AS dist_m
FROM bbox
WHERE 2 * 6371 * asin(sqrt(
sin(radians((lat - $1) / 2))^2 +
cos(radians($1)) * cos(radians(lat)) *
sin(radians((lng - $2) / 2))^2
)) <= $4
sin(radians((lat - $1::float8) / 2))^2 +
cos(radians($1::float8)) * cos(radians(lat)) *
sin(radians((lng - $2::float8) / 2))^2
)) <= $4::float8
ORDER BY dist_m
LIMIT $5`,
lat, lng, myID, radiusKm, limit, latDelta, lngDelta,