func benchPreparedQueryLoop(b *testing.B, db *sql.DB, stmt *sql.Stmt, result interface{}) { rows, err := stmt.Query() if err != nil { b.Fatal(err) } if !rows.Next() { rows.Close() b.Fatal("no rows") } defer rows.Close() for rows.Next() { err = rows.Scan(&result) if err != nil { b.Fatal("failed to scan") } } }
func TestByteaOutputFormats(t *testing.T) { db := openTestConn(t) defer db.Close() if getServerVersion(t, db) < 90000 { // skip return } testByteaOutputFormat := func(f string, usePrepared bool) { expectedData := []byte("\x5c\x78\x00\xff\x61\x62\x63\x01\x08") sqlQuery := "SELECT decode('5c7800ff6162630108', 'hex')" var data []byte // use a txn to avoid relying on getting the same connection txn, err := db.Begin() if err != nil { t.Fatal(err) } defer txn.Rollback() _, err = txn.Exec("SET LOCAL bytea_output TO " + f) if err != nil { t.Fatal(err) } var rows *sql.Rows var stmt *sql.Stmt if usePrepared { stmt, err = txn.Prepare(sqlQuery) if err != nil { t.Fatal(err) } rows, err = stmt.Query() } else { // use Query; QueryRow would hide the actual error rows, err = txn.Query(sqlQuery) } if err != nil { t.Fatal(err) } if !rows.Next() { if rows.Err() != nil { t.Fatal(rows.Err()) } t.Fatal("shouldn't happen") } err = rows.Scan(&data) if err != nil { t.Fatal(err) } err = rows.Close() if err != nil { t.Fatal(err) } if stmt != nil { err = stmt.Close() if err != nil { t.Fatal(err) } } if !bytes.Equal(data, expectedData) { t.Errorf("unexpected bytea value %v for format %s; expected %v", data, f, expectedData) } } testByteaOutputFormat("hex", false) testByteaOutputFormat("escape", false) testByteaOutputFormat("hex", true) testByteaOutputFormat("escape", true) }