1445 | 1445 |
if ret != test.sum {
|
1446 | 1446 |
t.Fatalf("Custom sum returned wrong value, got %d, want %d", ret, test.sum)
|
1447 | 1447 |
}
|
|
1448 |
}
|
|
1449 |
}
|
|
1450 |
|
|
1451 |
type mode struct {
|
|
1452 |
counts map[interface{}]int
|
|
1453 |
top interface{}
|
|
1454 |
topCount int
|
|
1455 |
}
|
|
1456 |
|
|
1457 |
func newMode() *mode {
|
|
1458 |
return &mode{
|
|
1459 |
counts: map[interface{}]int{},
|
|
1460 |
}
|
|
1461 |
}
|
|
1462 |
|
|
1463 |
func (m *mode) Step(x interface{}) {
|
|
1464 |
m.counts[x]++
|
|
1465 |
c := m.counts[x]
|
|
1466 |
if c > m.topCount {
|
|
1467 |
m.top = x
|
|
1468 |
m.topCount = c
|
|
1469 |
}
|
|
1470 |
}
|
|
1471 |
|
|
1472 |
func (m *mode) Done() interface{} {
|
|
1473 |
return m.top
|
|
1474 |
}
|
|
1475 |
|
|
1476 |
func TestAggregatorRegistration_GenericReturn(t *testing.T) {
|
|
1477 |
sql.Register("sqlite3_AggregatorRegistration_GenericReturn", &SQLiteDriver{
|
|
1478 |
ConnectHook: func(conn *SQLiteConn) error {
|
|
1479 |
return conn.RegisterAggregator("mode", newMode, true)
|
|
1480 |
},
|
|
1481 |
})
|
|
1482 |
db, err := sql.Open("sqlite3_AggregatorRegistration_GenericReturn", ":memory:")
|
|
1483 |
if err != nil {
|
|
1484 |
t.Fatal("Failed to open database:", err)
|
|
1485 |
}
|
|
1486 |
defer db.Close()
|
|
1487 |
|
|
1488 |
_, err = db.Exec("create table foo (department integer, profits integer)")
|
|
1489 |
if err != nil {
|
|
1490 |
t.Fatal("Failed to create table:", err)
|
|
1491 |
}
|
|
1492 |
_, err = db.Exec("insert into foo values (1, 10), (1, 20), (1, 45), (2, 42), (2, 115), (2, 20)")
|
|
1493 |
if err != nil {
|
|
1494 |
t.Fatal("Failed to insert records:", err)
|
|
1495 |
}
|
|
1496 |
|
|
1497 |
var mode int
|
|
1498 |
err = db.QueryRow("select mode(profits) from foo").Scan(&mode)
|
|
1499 |
if err != nil {
|
|
1500 |
t.Fatal("MODE query error:", err)
|
|
1501 |
}
|
|
1502 |
|
|
1503 |
if mode != 20 {
|
|
1504 |
t.Fatal("Got incorrect mode. Wanted 20, got: ", mode)
|
1448 | 1505 |
}
|
1449 | 1506 |
}
|
1450 | 1507 |
|