aboutsummaryrefslogtreecommitdiff
path: root/sqlite3_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'sqlite3_test.go')
-rw-r--r--sqlite3_test.go121
1 files changed, 121 insertions, 0 deletions
diff --git a/sqlite3_test.go b/sqlite3_test.go
index 09e6727..9d4b373 100644
--- a/sqlite3_test.go
+++ b/sqlite3_test.go
@@ -1232,6 +1232,127 @@ func TestFunctionRegistration(t *testing.T) {
}
}
+func rot13(r rune) rune {
+ switch {
+ case r >= 'A' && r <= 'Z':
+ return 'A' + (r-'A'+13)%26
+ case r >= 'a' && r <= 'z':
+ return 'a' + (r-'a'+13)%26
+ }
+ return r
+}
+
+func TestCollationRegistration(t *testing.T) {
+ collateRot13 := func(a, b string) int {
+ ra, rb := strings.Map(rot13, a), strings.Map(rot13, b)
+ return strings.Compare(ra, rb)
+ }
+ collateRot13Reverse := func(a, b string) int {
+ return collateRot13(b, a)
+ }
+
+ sql.Register("sqlite3_CollationRegistration", &SQLiteDriver{
+ ConnectHook: func(conn *SQLiteConn) error {
+ if err := conn.RegisterCollation("rot13", collateRot13); err != nil {
+ return err
+ }
+ if err := conn.RegisterCollation("rot13reverse", collateRot13Reverse); err != nil {
+ return err
+ }
+ return nil
+ },
+ })
+
+ db, err := sql.Open("sqlite3_CollationRegistration", ":memory:")
+ if err != nil {
+ t.Fatal("Failed to open database:", err)
+ }
+ defer db.Close()
+
+ populate := []string{
+ `CREATE TABLE test (s TEXT)`,
+ `INSERT INTO test VALUES ("aaaa")`,
+ `INSERT INTO test VALUES ("ffff")`,
+ `INSERT INTO test VALUES ("qqqq")`,
+ `INSERT INTO test VALUES ("tttt")`,
+ `INSERT INTO test VALUES ("zzzz")`,
+ }
+ for _, stmt := range populate {
+ if _, err := db.Exec(stmt); err != nil {
+ t.Fatal("Failed to populate test DB:", err)
+ }
+ }
+
+ ops := []struct {
+ query string
+ want []string
+ }{
+ {
+ "SELECT * FROM test ORDER BY s COLLATE rot13 ASC",
+ []string{
+ "qqqq",
+ "tttt",
+ "zzzz",
+ "aaaa",
+ "ffff",
+ },
+ },
+ {
+ "SELECT * FROM test ORDER BY s COLLATE rot13 DESC",
+ []string{
+ "ffff",
+ "aaaa",
+ "zzzz",
+ "tttt",
+ "qqqq",
+ },
+ },
+ {
+ "SELECT * FROM test ORDER BY s COLLATE rot13reverse ASC",
+ []string{
+ "ffff",
+ "aaaa",
+ "zzzz",
+ "tttt",
+ "qqqq",
+ },
+ },
+ {
+ "SELECT * FROM test ORDER BY s COLLATE rot13reverse DESC",
+ []string{
+ "qqqq",
+ "tttt",
+ "zzzz",
+ "aaaa",
+ "ffff",
+ },
+ },
+ }
+
+ for _, op := range ops {
+ rows, err := db.Query(op.query)
+ if err != nil {
+ t.Fatalf("Query %q failed: %s", op.query, err)
+ }
+ got := []string{}
+ defer rows.Close()
+ for rows.Next() {
+ var s string
+ if err = rows.Scan(&s); err != nil {
+ t.Fatalf("Reading row for %q: %s", op.query, err)
+ }
+ got = append(got, s)
+ }
+ if err = rows.Err(); err != nil {
+ t.Fatalf("Reading rows for %q: %s", op.query, err)
+ }
+
+ if !reflect.DeepEqual(got, op.want) {
+ t.Fatalf("Unexpected output from %q\ngot:\n%s\n\nwant:\n%s", op.query, strings.Join(got, "\n"), strings.Join(op.want, "\n"))
+ }
+ }
+}
+
func TestDeclTypes(t *testing.T) {
d := SQLiteDriver{}