Files
seaweedfs/weed/filer/postgres/postgres_collation_test.go
Chris Lu 3ccd4ed85c filer: skip COLLATE "C" list fallback on CockroachDB (#10015)
* filer: skip COLLATE "C" list fallback on CockroachDB

CockroachDB string comparison is already byte-ordered, so wrapping the
list queries in COLLATE "C" can never change result order. It reports
datcollate=en_US.utf8 regardless of how the database was created, so the
collation check always misfires and forces the fallback. On 22.1 and
older COLLATE "C" is rejected as an invalid locale, turning every filer
list query into a hard failure. Detect the backend via version() and
keep the default ordering.

* filer: test CockroachDB collation detection

Cover the CockroachDB skip path and the locale-aware Postgres force path
with go-sqlmock.
2026-06-19 09:22:45 -07:00

50 lines
1.4 KiB
Go

package postgres
import (
"testing"
"github.com/DATA-DOG/go-sqlmock"
)
func TestConfigureListOrderingSkipsCockroachDB(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("sqlmock: %v", err)
}
defer db.Close()
mock.ExpectQuery("SELECT version\\(\\)").WillReturnRows(
sqlmock.NewRows([]string{"version"}).AddRow("CockroachDB CCL v22.1.22 (x86_64-pc-linux-gnu)"))
gen := &SqlGenPostgres{}
ConfigureListOrdering(db, gen)
if gen.ForceBinaryCollation {
t.Fatal("CockroachDB default ordering is byte-ordered; COLLATE \"C\" must not be forced")
}
if err := mock.ExpectationsWereMet(); err != nil {
t.Fatalf("unmet expectations: %v", err)
}
}
func TestConfigureListOrderingForcesBinaryOnLocalePostgres(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("sqlmock: %v", err)
}
defer db.Close()
mock.ExpectQuery("SELECT version\\(\\)").WillReturnRows(
sqlmock.NewRows([]string{"version"}).AddRow("PostgreSQL 16.2 on x86_64-pc-linux-gnu"))
mock.ExpectQuery("datcollate").WillReturnRows(
sqlmock.NewRows([]string{"collation_name", "datcollate"}).AddRow(nil, "en_US.UTF-8"))
gen := &SqlGenPostgres{}
ConfigureListOrdering(db, gen)
if !gen.ForceBinaryCollation {
t.Fatal("locale-aware Postgres collation must force byte ordering")
}
if err := mock.ExpectationsWereMet(); err != nil {
t.Fatalf("unmet expectations: %v", err)
}
}