本文整理汇总了Golang中github.com/cockroachdb/cockroach/pkg/testutils/sqlutils.PGUrl函数的典型用法代码示例。如果您正苦于以下问题:Golang PGUrl函数的具体用法?Golang PGUrl怎么用?Golang PGUrl使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PGUrl函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: TestPGWireDBName
func TestPGWireDBName(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestPGWireDBName", url.User(security.RootUser))
pgURL.Path = "foo"
defer cleanupFn()
{
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.Exec(`CREATE DATABASE foo`); err != nil {
t.Fatal(err)
}
if _, err := db.Exec(`CREATE TABLE bar (i INT PRIMARY KEY)`); err != nil {
t.Fatal(err)
}
}
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.Exec(`INSERT INTO bar VALUES ($1)`, 1); err != nil {
t.Fatal(err)
}
}
开发者ID:maxlang,项目名称:cockroach,代码行数:34,代码来源:pgwire_test.go
示例2: TestPGWireConnectionCloseReleasesLeases
// Test that abruptly closing a pgwire connection releases all leases held by
// that session.
func TestPGWireConnectionCloseReleasesLeases(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, kvDB := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
url, cleanupConn := sqlutils.PGUrl(t, s.ServingAddr(), "SetupServer", url.User(security.RootUser))
defer cleanupConn()
conn, err := pq.Open(url.String())
if err != nil {
t.Fatal(err)
}
ex := conn.(driver.Execer)
if _, err := ex.Exec("CREATE DATABASE test", nil); err != nil {
t.Fatal(err)
}
if _, err := ex.Exec("CREATE TABLE test.t (i INT PRIMARY KEY)", nil); err != nil {
t.Fatal(err)
}
// Start a txn so leases are accumulated by queries.
if _, err := ex.Exec("BEGIN", nil); err != nil {
t.Fatal(err)
}
// Get a table lease.
if _, err := ex.Exec("SELECT * FROM test.t", nil); err != nil {
t.Fatal(err)
}
// Abruptly close the connection.
if err := conn.Close(); err != nil {
t.Fatal(err)
}
// Verify that there are no leases held.
tableDesc := sqlbase.GetTableDescriptor(kvDB, "test", "t")
lm := s.LeaseManager().(*LeaseManager)
// Looking for a table state validates that there used to be a lease on the
// table.
ts := lm.findTableState(tableDesc.ID, false /* create */)
if ts == nil {
t.Fatal("table state not found")
}
ts.mu.Lock()
leases := ts.active.data
ts.mu.Unlock()
if len(leases) != 1 {
t.Fatalf("expected one lease, found: %d", len(leases))
}
// Wait for the lease to be released.
util.SucceedsSoon(t, func() error {
ts.mu.Lock()
refcount := ts.active.data[0].refcount
ts.mu.Unlock()
if refcount != 0 {
return errors.Errorf(
"expected lease to be unused, found refcount: %d", refcount)
}
return nil
})
}
开发者ID:knz,项目名称:cockroach,代码行数:58,代码来源:pgwire_internal_test.go
示例3: TestDumpBytes
func TestDumpBytes(t *testing.T) {
defer leaktest.AfterTest(t)()
c, err := newCLITest(t, false)
if err != nil {
t.Fatal(err)
}
defer c.stop(true)
url, cleanup := sqlutils.PGUrl(t, c.ServingAddr(), "TestDumpBytes", url.User(security.RootUser))
defer cleanup()
conn := makeSQLConn(url.String())
defer conn.Close()
if err := conn.Exec(`
CREATE DATABASE d;
SET DATABASE = d;
CREATE TABLE t (b BYTES PRIMARY KEY);
`, nil); err != nil {
t.Fatal(err)
}
for i := int64(0); i < 256; i++ {
if err := conn.Exec("INSERT INTO t VALUES ($1)", []driver.Value{[]byte{byte(i)}}); err != nil {
t.Fatal(err)
}
}
var b bytes.Buffer
if err := DumpTable(&b, conn, "d", "t"); err != nil {
t.Fatal(err)
}
dump := b.String()
b.Reset()
if err := conn.Exec(`
CREATE DATABASE o;
SET DATABASE = o;
`, nil); err != nil {
t.Fatal(err)
}
if err := conn.Exec(dump, nil); err != nil {
t.Fatal(err)
}
if err := DumpTable(&b, conn, "o", "t"); err != nil {
t.Fatal(err)
}
dump2 := b.String()
if dump != dump2 {
t.Fatalf("unmatching dumps:\n%s\n%s", dump, dump2)
}
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:53,代码来源:dump_test.go
示例4: BenchmarkPgbenchExec_Cockroach
func BenchmarkPgbenchExec_Cockroach(b *testing.B) {
defer tracing.Disable()()
s, _, _ := serverutils.StartServer(b, base.TestServerArgs{Insecure: true})
defer s.Stopper().Stop()
pgUrl, cleanupFn := sqlutils.PGUrl(
b, s.ServingAddr(), "benchmarkCockroach", url.User(security.RootUser))
pgUrl.RawQuery = "sslmode=disable"
defer cleanupFn()
execPgbench(b, pgUrl)
}
开发者ID:knz,项目名称:cockroach,代码行数:12,代码来源:pgbench_test.go
示例5: TestRollbackInRestartWait
// TestRollbackInRestartWait ensures that a ROLLBACK while the txn is in the
// RetryWait state works.
func TestRollbackInRestartWait(t *testing.T) {
defer leaktest.AfterTest(t)()
aborter := NewTxnAborter()
defer aborter.Close(t)
params, _ := createTestServerParams()
params.Knobs.SQLExecutor = aborter.executorKnobs()
s, sqlDB, _ := serverutils.StartServer(t, params)
defer s.Stopper().Stop()
{
pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestRollbackInRestartWait", url.User(security.RootUser))
defer cleanup()
if err := aborter.Init(pgURL); err != nil {
t.Fatal(err)
}
}
if _, err := sqlDB.Exec(`
CREATE DATABASE t;
CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT);
`); err != nil {
t.Fatal(err)
}
// Set up error injection that causes retries.
const insertStmt = "INSERT INTO t.test(k, v) VALUES (0, 'boulanger')"
if err := aborter.QueueStmtForAbortion(
insertStmt, 1 /* abortCount */, false, /* willBeRetriedIbid */
); err != nil {
t.Fatal(err)
}
tx, err := sqlDB.Begin()
if err != nil {
t.Fatal(err)
}
if _, err := tx.Exec("SAVEPOINT cockroach_restart"); err != nil {
t.Fatal(err)
}
if _, err := tx.Exec(insertStmt); err != nil {
t.Fatal(err)
}
if _, err := tx.Exec("RELEASE SAVEPOINT cockroach_restart"); !testutils.IsError(
err, "pq: restart transaction") {
t.Fatalf("unexpected error: %s", err)
}
if err := tx.Rollback(); err != nil {
t.Fatal(err)
}
}
开发者ID:veteranlu,项目名称:cockroach,代码行数:52,代码来源:txn_restart_test.go
示例6: setUser
// setUser sets the DB client to the specified user.
// It returns a cleanup function to be run when the credentials
// are no longer needed.
func (t *logicTest) setUser(user string) func() {
var outDBName string
if t.db != nil {
var inDBName string
if err := t.db.QueryRow("SHOW DATABASE").Scan(&inDBName); err != nil {
t.Fatal(err)
}
defer func() {
if inDBName != outDBName {
// Propagate the DATABASE setting to the newly-live connection.
if _, err := t.db.Exec(fmt.Sprintf("SET DATABASE = %s", inDBName)); err != nil {
t.Fatal(err)
}
}
}()
}
if t.clients == nil {
t.clients = map[string]*gosql.DB{}
}
if db, ok := t.clients[user]; ok {
t.db = db
t.user = user
if err := t.db.QueryRow("SHOW DATABASE").Scan(&outDBName); err != nil {
t.Fatal(err)
}
// No cleanup necessary, but return a no-op func to avoid nil pointer dereference.
return func() {}
}
pgURL, cleanupFunc := sqlutils.PGUrl(t.T, t.srv.ServingAddr(), "TestLogic", url.User(user))
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
t.clients[user] = db
t.db = db
t.user = user
if t.verbose {
fmt.Printf("--- new user: %s\n", user)
}
return cleanupFunc
}
开发者ID:veteranlu,项目名称:cockroach,代码行数:53,代码来源:logic_test.go
示例7: TestPGPrepareNameQual
// Names should be qualified automatically during Prepare when a database name
// was given in the connection string.
func TestPGPrepareNameQual(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestPGPrepareNameQual", url.User(security.RootUser))
defer cleanupFn()
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.Exec(`CREATE DATABASE IF NOT EXISTS testing`); err != nil {
t.Fatal(err)
}
pgURL.Path = "/testing"
db2, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db2.Close()
statements := []string{
`CREATE TABLE IF NOT EXISTS f (v INT)`,
`INSERT INTO f VALUES (42)`,
`SELECT * FROM f`,
`DELETE FROM f WHERE v = 42`,
`DROP TABLE IF EXISTS f`,
}
for _, stmtString := range statements {
if _, err = db2.Exec(stmtString); err != nil {
t.Fatal(err)
}
stmt, err := db2.Prepare(stmtString)
if err != nil {
t.Fatal(err)
}
if _, err = stmt.Exec(); err != nil {
t.Fatal(err)
}
}
}
开发者ID:maxlang,项目名称:cockroach,代码行数:50,代码来源:pgwire_test.go
示例8: TestPGPrepareFail
func TestPGPrepareFail(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestPGPrepareFail", url.User(security.RootUser))
defer cleanupFn()
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
testFailures := map[string]string{
"SELECT $1 = $1": "pq: could not determine data type of placeholder $1",
"SELECT $1": "pq: could not determine data type of placeholder $1",
"SELECT $1 + $1": "pq: could not determine data type of placeholder $1",
"SELECT CASE WHEN TRUE THEN $1 END": "pq: could not determine data type of placeholder $1",
"SELECT CASE WHEN TRUE THEN $1 ELSE $2 END": "pq: could not determine data type of placeholder $1",
"SELECT $1 > 0 AND NOT $1": "pq: incompatible NOT argument type: int",
"CREATE TABLE $1 (id INT)": "pq: syntax error at or near \"1\"\nCREATE TABLE $1 (id INT)\n ^\n",
"UPDATE d.t SET s = i + $1": "pq: unsupported binary operator: <int> + <placeholder{1}> (desired <string>)",
"SELECT $0 > 0": "pq: invalid placeholder name: $0",
"SELECT $2 > 0": "pq: could not determine data type of placeholder $1",
"SELECT 3 + CASE (4) WHEN 4 THEN $1 END": "pq: could not determine data type of placeholder $1",
"SELECT ($1 + $1) + CURRENT_DATE()": "pq: could not determine data type of placeholder $1",
"SELECT $1 + $2, $2::FLOAT": "pq: could not determine data type of placeholder $1",
"SELECT $1[2]": "pq: could not determine data type of placeholder $1",
"SELECT ($1 + 2) + ($1 + 2.5::FLOAT)": "pq: unsupported binary operator: <int> + <float>",
}
if _, err := db.Exec(`CREATE DATABASE d; CREATE TABLE d.t (i INT, s STRING, d INT)`); err != nil {
t.Fatal(err)
}
for query, reason := range testFailures {
if stmt, err := db.Prepare(query); err == nil {
t.Errorf("expected error: %s", query)
if err := stmt.Close(); err != nil {
t.Fatal(err)
}
} else if err.Error() != reason {
t.Errorf(`%s: got: %q, expected: %q`, query, err, reason)
}
}
}
开发者ID:maxlang,项目名称:cockroach,代码行数:48,代码来源:pgwire_test.go
示例9: TestAbortedTxnOnlyRetriedOnce
// Test that aborted txn are only retried once.
// Prevents regressions of #8456.
func TestAbortedTxnOnlyRetriedOnce(t *testing.T) {
defer leaktest.AfterTest(t)()
aborter := NewTxnAborter()
defer aborter.Close(t)
params, _ := createTestServerParams()
params.Knobs.SQLExecutor = aborter.executorKnobs()
// Disable one phase commits because they cannot be restarted.
params.Knobs.Store.(*storage.StoreTestingKnobs).DisableOnePhaseCommits = true
s, sqlDB, _ := serverutils.StartServer(t, params)
defer s.Stopper().Stop()
{
pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestAbortedTxnOnlyRetriedOnce", url.User(security.RootUser))
defer cleanup()
if err := aborter.Init(pgURL); err != nil {
t.Fatal(err)
}
}
const insertStmt = "INSERT INTO t.test(k, v) VALUES (1, 'boulanger')"
if err := aborter.QueueStmtForAbortion(
insertStmt, 1 /* abortCount */, true, /* willBeRetriedIbid */
); err != nil {
t.Fatal(err)
}
if _, err := sqlDB.Exec(`
CREATE DATABASE t;
CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT);
`); err != nil {
t.Fatal(err)
}
if _, err := sqlDB.Exec(insertStmt); err != nil {
t.Fatalf("unexpected error: %s", err)
}
execCount, ok := aborter.GetExecCount(insertStmt)
if !ok {
t.Fatalf("aborter has no state on %q", insertStmt)
}
if execCount != 2 {
t.Fatalf("expected %q to be executed 2 times, but got %d", insertStmt, execCount)
}
}
开发者ID:veteranlu,项目名称:cockroach,代码行数:47,代码来源:txn_restart_test.go
示例10: TestCmdCompleteVsEmptyStatements
// A DDL should return "CommandComplete", not "EmptyQuery" Response.
func TestCmdCompleteVsEmptyStatements(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(
t, s.ServingAddr(), "TestCmdCompleteVsEmptyStatements", url.User(security.RootUser))
defer cleanupFn()
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
// lib/pq handles the empty query response by returning a nil driver.Result.
// Unfortunately gosql.Exec wraps that, nil or not, in a gosql.Result which doesn't
// expose the underlying driver.Result.
// gosql.Result does however have methods which attempt to dereference the underlying
// driver.Result and can thus be used to determine if it is nil.
// TODO(dt): This would be prettier and generate better failures with testify/assert's helpers.
// Result of a DDL (command complete) yields a non-nil underlying driver result.
nonempty, err := db.Exec(`CREATE DATABASE IF NOT EXISTS testing`)
if err != nil {
t.Fatal(err)
}
_, _ = nonempty.RowsAffected() // should not panic if lib/pq returned a non-nil result.
empty, err := db.Exec(" ; ; ;")
if err != nil {
t.Fatal(err)
}
rows, err := empty.RowsAffected()
if rows != 0 {
t.Fatalf("expected 0 rows, got %d", rows)
}
if err == nil {
t.Fatal("expected error")
}
}
开发者ID:maxlang,项目名称:cockroach,代码行数:42,代码来源:pgwire_test.go
示例11: getClient
func (t *parallelTest) getClient(nodeIdx, clientIdx int) *gosql.DB {
for len(t.clients[nodeIdx]) <= clientIdx {
// Add a client.
pgURL, cleanupFunc := sqlutils.PGUrl(t.T,
t.cluster.Server(nodeIdx).ServingAddr(),
"TestParallel",
url.User(security.RootUser))
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
sqlutils.MakeSQLRunner(t, db).Exec("SET DATABASE = test")
t.cluster.Stopper().AddCloser(
stop.CloserFn(func() {
_ = db.Close()
cleanupFunc()
}))
t.clients[nodeIdx] = append(t.clients[nodeIdx], db)
}
return t.clients[nodeIdx][clientIdx]
}
开发者ID:veteranlu,项目名称:cockroach,代码行数:21,代码来源:parallel_test.go
示例12: TestPrepareSyntax
func TestPrepareSyntax(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestPrepareSyntax", url.User(security.RootUser))
defer cleanupFn()
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
const strTest = `SELECT """test"""`
if _, err := db.Exec(`SET SYNTAX = traditional`); err != nil {
t.Fatal(err)
}
if _, err := db.Prepare(strTest); err == nil {
t.Fatal("expected error")
}
if _, err := db.Exec(`SET SYNTAX = modern`); err != nil {
t.Fatal(err)
}
stmt, err := db.Prepare(strTest)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
var v string
if err := stmt.QueryRow().Scan(&v); err != nil {
t.Fatalf("unexpected error: %s", err)
} else if v != "test" {
t.Fatalf("unexpected result: %q", v)
}
}
开发者ID:maxlang,项目名称:cockroach,代码行数:38,代码来源:pgwire_test.go
示例13: StartServer
// StartServer creates a test server and sets up a gosql DB connection.
// The server should be stopped by calling server.Stopper().Stop().
func StartServer(
t testing.TB, params base.TestServerArgs,
) (TestServerInterface, *gosql.DB, *client.DB) {
server, err := StartServerRaw(params)
if err != nil {
t.Fatal(err)
}
kvClient := server.KVClient().(*client.DB)
pgURL, cleanupGoDB := sqlutils.PGUrl(
t, server.ServingAddr(), "StartServer", url.User(security.RootUser))
pgURL.Path = params.UseDatabase
goDB, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
server.Stopper().AddCloser(
stop.CloserFn(func() {
_ = goDB.Close()
cleanupGoDB()
}))
return server, goDB, kvClient
}
开发者ID:veteranlu,项目名称:cockroach,代码行数:25,代码来源:test_server_shim.go
示例14: TestPGPreparedExec
//.........这里部分代码省略.........
[]preparedExecTest{
baseTest.RowsAffected(1).SetArgs(
int64(0),
float64(0),
"",
[]byte{},
time.Time{}, // date
time.Time{}, // timestamp
time.Time{}, // timestamptz
time.Hour.String(),
true,
"0.0", // decimal
),
},
},
{
"DROP DATABASE d",
[]preparedExecTest{
baseTest,
},
},
// An empty string is valid in postgres.
{
"",
[]preparedExecTest{
baseTest.RowsAffectedErr("no RowsAffected available after the empty statement"),
},
},
// Empty statements are permitted.
{
";",
[]preparedExecTest{
baseTest.RowsAffectedErr("no RowsAffected available after the empty statement"),
},
},
// Any number of empty statements are permitted with a single statement
// anywhere.
{
"; ; SET DATABASE = system; ;",
[]preparedExecTest{
baseTest,
},
},
}
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestPGPreparedExec", url.User(security.RootUser))
defer cleanupFn()
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
runTests := func(query string, tests []preparedExecTest, execFunc func(...interface{}) (gosql.Result, error)) {
for _, test := range tests {
if testing.Verbose() || log.V(1) {
log.Infof(context.Background(), "exec: %s", query)
}
if result, err := execFunc(test.qargs...); err != nil {
if test.error == "" {
t.Errorf("%s: %v: unexpected error: %s", query, test.qargs, err)
} else if err.Error() != test.error {
t.Errorf("%s: %v: expected error: %s, got %s", query, test.qargs, test.error, err)
}
} else {
rowsAffected, err := result.RowsAffected()
if !testutils.IsError(err, test.rowsAffectedErr) {
t.Errorf("%s: %v: expected %q, got %v", query, test.qargs, test.rowsAffectedErr, err)
} else if rowsAffected != test.rowsAffected {
t.Errorf("%s: %v: expected %v, got %v", query, test.qargs, test.rowsAffected, rowsAffected)
}
}
}
}
for _, execTest := range execTests {
runTests(execTest.query, execTest.tests, func(args ...interface{}) (gosql.Result, error) {
return db.Exec(execTest.query, args...)
})
}
for _, execTest := range execTests {
if testing.Verbose() || log.V(1) {
log.Infof(context.Background(), "prepare: %s", execTest.query)
}
if stmt, err := db.Prepare(execTest.query); err != nil {
t.Errorf("%s: prepare error: %s", execTest.query, err)
} else {
func() {
defer stmt.Close()
runTests(execTest.query, execTest.tests, stmt.Exec)
}()
}
}
}
开发者ID:maxlang,项目名称:cockroach,代码行数:101,代码来源:pgwire_test.go
示例15: TestPGPreparedQuery
//.........这里部分代码省略.........
"SELECT ANNOTATE_TYPE($1, int)": {
baseTest.SetArgs(12).Results(12),
},
"SELECT $1 + $2, ANNOTATE_TYPE($2, float)": {
baseTest.SetArgs(12, 23).Results(35, 23),
},
"INSERT INTO d.T VALUES ($1 + 1) RETURNING a": {
baseTest.SetArgs(1).Results(2),
baseTest.SetArgs(11).Results(12),
},
"INSERT INTO d.T VALUES (-$1) RETURNING a": {
baseTest.SetArgs(1).Results(-1),
baseTest.SetArgs(-999).Results(999),
},
"INSERT INTO d.two (a, b) VALUES (~$1, $1 + $2) RETURNING a, b": {
baseTest.SetArgs(5, 6).Results(-6, 11),
},
"INSERT INTO d.str (s) VALUES (LEFT($1, 3)) RETURNING s": {
baseTest.SetArgs("abcdef").Results("abc"),
baseTest.SetArgs("123456").Results("123"),
},
"INSERT INTO d.str (b) VALUES (COALESCE($1, 'strLit')) RETURNING b": {
baseTest.SetArgs(nil).Results("strLit"),
baseTest.SetArgs("123456").Results("123456"),
},
"INSERT INTO d.intStr VALUES ($1, 'hello ' || $1::TEXT) RETURNING *": {
baseTest.SetArgs(123).Results(123, "hello 123"),
},
}
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestPGPreparedQuery", url.User(security.RootUser))
defer cleanupFn()
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
runTests := func(query string, prepared bool, tests []preparedQueryTest, queryFunc func(...interface{}) (*gosql.Rows, error)) {
for _, test := range tests {
if testing.Verbose() || log.V(1) {
log.Infof(context.Background(), "query: %s", query)
}
rows, err := queryFunc(test.qargs...)
if err != nil {
if test.error == "" {
t.Errorf("%s: %v: unexpected error: %s", query, test.qargs, err)
} else {
expectedErr := test.error
if prepared && test.preparedError != "" {
expectedErr = test.preparedError
}
if err.Error() != expectedErr {
t.Errorf("%s: %v: expected error: %s, got %s", query, test.qargs, expectedErr, err)
}
continue
}
}
defer rows.Close()
if test.error != "" {
t.Errorf("expected error: %s: %v", query, test.qargs)
开发者ID:maxlang,项目名称:cockroach,代码行数:67,代码来源:pgwire_test.go
示例16: TestDumpRandom
// TestDumpRandom generates a random number of random rows with all data
// types. This data is dumped, inserted, and dumped again. The two dumps
// are compared for exactness. The data from the inserted dump is then
// SELECT'd and compared to the original generated data to ensure it is
// round-trippable.
func TestDumpRandom(t *testing.T) {
defer leaktest.AfterTest(t)()
c, err := newCLITest(t, false)
if err != nil {
t.Fatal(err)
}
defer c.stop(true)
url, cleanup := sqlutils.PGUrl(t, c.ServingAddr(), "TestDumpRandom", url.User(security.RootUser))
defer cleanup()
conn := makeSQLConn(url.String())
defer conn.Close()
if err := conn.Exec(`
CREATE DATABASE d;
CREATE DATABASE o;
CREATE TABLE d.t (
rowid int,
i int,
f float,
d date,
m timestamp,
n interval,
o bool,
e decimal,
s string,
b bytes,
PRIMARY KEY (rowid, i, f, d, m, n, o, e, s, b)
);
`, nil); err != nil {
t.Fatal(err)
}
rnd, seed := randutil.NewPseudoRand()
t.Logf("random seed: %v", seed)
start := timeutil.Now()
for iteration := 0; timeutil.Since(start) < *randomTestTime; iteration++ {
if err := conn.Exec(`DELETE FROM d.t`, nil); err != nil {
t.Fatal(err)
}
var generatedRows [][]driver.Value
count := rnd.Int63n(500)
t.Logf("random iteration %v: %v rows", iteration, count)
for _i := int64(0); _i < count; _i++ {
// Generate a random number of random inserts.
i := rnd.Int63()
f := rnd.Float64()
d := time.Unix(0, rnd.Int63()).Round(time.Hour * 24).UTC()
m := time.Unix(0, rnd.Int63()).Round(time.Microsecond).UTC()
n := time.Duration(rnd.Int63()).String()
o := rnd.Intn(2) == 1
e := strings.TrimRight(inf.NewDec(rnd.Int63(), inf.Scale(rnd.Int31n(20)-10)).String(), ".0")
sr := make([]byte, rnd.Intn(500))
if _, err := rnd.Read(sr); err != nil {
t.Fatal(err)
}
s := make([]byte, 0, len(sr))
for _, b := range sr {
r := rune(b)
if !utf8.ValidRune(r) {
continue
}
s = append(s, []byte(string(r))...)
}
b := make([]byte, rnd.Intn(500))
if _, err := rnd.Read(b); err != nil {
t.Fatal(err)
}
vals := []driver.Value{
_i,
i,
f,
d,
m,
[]byte(n), // intervals come out as `[]byte`s
o,
[]byte(e), // decimals come out as `[]byte`s
string(s),
b,
}
if err := conn.Exec("INSERT INTO d.t VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)", vals); err != nil {
t.Fatal(err)
}
generatedRows = append(generatedRows, vals[1:])
}
check := func(table string) {
q := fmt.Sprintf("SELECT i, f, d, m, n, o, e, s, b FROM %s ORDER BY rowid", table)
nrows, err := conn.Query(q, nil)
if err != nil {
//.........这里部分代码省略.........
开发者ID:BramGruneir,项目名称:cockroach,代码行数:101,代码来源:dump_test.go
示例17: TestPGCommandTags
// Unfortunately lib/pq doesn't expose returned command tags directly, but we can test
// the methods where it depends on their values (Begin, Commit, RowsAffected for INSERTs).
func TestPGCommandTags(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, _ := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestPGCommandTags", url.User(security.RootUser))
defer cleanupFn()
db, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.Exec(`CREATE DATABASE IF NOT EXISTS testing`); err != nil {
t.Fatal(err)
}
if _, err := db.Exec(`CREATE TABLE testing.tags (k INT PRIMARY KEY, v INT)`); err != nil {
t.Fatal(err)
}
// Begin will error if the returned tag is not BEGIN.
tx, err := db.Begin()
if err != nil {
t.Fatal(err)
}
// Commit also checks the correct tag is returned.
if err := tx.Commit(); err != nil {
t.Fatal(err)
}
tx, err = db.Begin()
if err != nil {
t.Fatal(err)
}
if _, err := tx.Exec("INSERT INTO testing.tags VALUES (4, 1)"); err != nil {
t.Fatal(err)
}
// Rollback also checks the correct tag is returned.
if err := tx.Rollback(); err != nil {
t.Fatal(err)
}
tx, err = db.Begin()
if err != nil {
t.Fatal(err)
}
// An error will abort the server's transaction.
if _, err := tx.Exec("INSERT INTO testing.tags VALUES (4, 1), (4, 1)"); err == nil {
t.Fatal("expected an error on duplicate k")
}
// Rollback, even of an aborted txn, should also return the correct tag.
if err := tx.Rollback(); err != nil {
t.Fatal(err)
}
// lib/pq has a special-case for INSERT (due to oids), so test insert and update statements.
res, err := db.Exec("INSERT INTO testing.tags VALUES (1, 1), (2, 2)")
if err != nil {
t.Fatal(err)
}
affected, err := res.RowsAffected()
if err != nil {
t.Fatal(err)
}
if affected != 2 {
t.Fatal("unexpected number of rows affected:", affected)
}
res, err = db.Exec("INSERT INTO testing.tags VALUES (3, 3)")
if err != nil {
t.Fatal(err)
}
affected, err = res.RowsAffected()
if err != nil {
t.Fatal(err)
}
if affected != 1 {
t.Fatal("unexpected number of rows affected:", affected)
}
res, err = db.Exec("UPDATE testing.tags SET v = 3")
if err != nil {
t.Fatal(err)
}
affected, err = res.RowsAffected()
if err != nil {
t.Fatal(err)
}
if affected != 3 {
t.Fatal("unexpected number of rows affected:", affected)
}
}
开发者ID:maxlang,项目名称:cockroach,代码行数:95,代码来源:pgwire_test.go
示例18: TestLogRebalances
func TestLogRebalances(t *testing.T) {
defer leaktest.AfterTest(t)()
s, _, db := serverutils.StartServer(t, base.TestServerArgs{})
defer s.Stopper().Stop()
// Use a client to get the RangeDescriptor for the first range. We will use
// this range's information to log fake rebalance events.
desc := &roachpb.RangeDescriptor{}
if err := db.GetProto(context.TODO(), keys.RangeDescriptorKey(roachpb.RKeyMin), desc); err != nil {
t.Fatal(err)
}
// This code assumes that there is only one TestServer, and thus that
// StoreID 1 is present on the testserver. If this assumption changes in the
// future, *any* store will work, but a new method will need to be added to
// Stores (or a creative usage of VisitStores could suffice).
store, err := s.(*server.TestServer).Stores().GetStore(roachpb.StoreID(1))
if err != nil {
t.Fatal(err)
}
// Log several fake events using the store.
logEvent := func(changeType roachpb.ReplicaChangeType) {
if err := db.Txn(context.TODO(), func(txn *client.Txn) error {
return store.LogReplicaChangeTest(txn, changeType, desc.Replicas[0], *desc)
}); err != nil {
t.Fatal(err)
}
}
checkMetrics := func(expAdds, expRemoves int64) {
if a, e := store.Metrics().RangeAdds.Count(), expAdds; a != e {
t.Errorf("range adds %d != expected %d", a, e)
}
if a, e := store.Metrics().RangeRemoves.Count(), expRemoves; a != e {
t.Errorf("range removes %d != expected %d", a, e)
}
}
logEvent(roachpb.ADD_REPLICA)
checkMetrics(1 /*add*/, 0 /*remove*/)
logEvent(roachpb.ADD_REPLICA)
checkMetrics(2 /*adds*/, 0 /*remove*/)
logEvent(roachpb.REMOVE_REPLICA)
checkMetrics(2 /*adds*/, 1 /*remove*/)
// Open a SQL connection to verify that the events have been logged.
pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestLogRebalances", url.User(security.RootUser))
defer cleanupFn()
sqlDB, err := gosql.Open("postgres", pgURL.String())
if err != nil {
t.Fatal(err)
}
defer sqlDB.Close()
// verify that two add replica events have been logged.
// TODO(mrtracy): placeholders still appear to be broken, this query should
// be using a string placeholder for the eventType value.
rows, err := sqlDB.Query(`SELECT rangeID, info FROM system.rangelog WHERE eventType = 'add'`)
if err != nil {
t.Fatal(err)
}
var count int
for rows.Next() {
count++
var rangeID int64
var infoStr gosql.NullString
if err := rows.Scan(&rangeID, &infoStr); err != nil {
t.Fatal(err)
}
if a, e := roachpb.RangeID(rangeID), desc.RangeID; a != e {
t.Errorf("wrong rangeID %d recorded for add event, expected %d", a, e)
}
// Verify that info returns a json struct.
if !infoStr.Valid {
t.Errorf("info not recorded for add replica of range %d", rangeID)
}
var info struct {
AddReplica roachpb.ReplicaDescriptor
UpdatedDesc roachpb.RangeDescriptor
}
if err := json.Unmarshal([]byte(infoStr.String), &info); err != nil {
t.Errorf("error unmarshalling info string for add replica %d: %s", rangeID, err)
continue
}
if int64(info.UpdatedDesc.RangeID) != rangeID {
t.Errorf("recorded wrong updated descriptor %s for add replica of range %d", info.UpdatedDesc, rangeID)
}
if a, e := info.AddReplica, desc.Replicas[0]; a != e {
t.Errorf("recorded wrong updated replica %s for add replica of range %d, expected %s",
a, rangeID, e)
}
}
if rows.Err() != nil {
t.Fatal(rows.Err())
}
if a, e := count, 2; a != e {
t.Errorf("expected %d AddReplica events logged, found %d", e, a)
}
//.........这里部分代码省略.........
开发者ID:knz,项目名称:cockroach,代码行数:101,代码来源:log_test.go
示例19: TestErrorOnCommitFinalizesTxn
// Test that a COMMIT getting an error, retryable or not, leaves the txn
// finalized and not in Aborted/RestartWait (i.e. COMMIT, like ROLLBACK, is
// always final). As opposed to an error on a COMMIT in an auto-retry
// txn, where we retry the txn (not tested here).
func TestErrorOnCommitFinalizesTxn(t *testing.T) {
defer leaktest.AfterTest(t)()
aborter := NewTxnAborter()
defer aborter.Close(t)
params, _ := createTestServerParams()
params.Knobs.SQLExecutor = aborter.executorKnobs()
s, sqlDB, _ := serverutils.StartServer(t, params)
defer s.Stopper().Stop()
{
pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestErrorOnCommitFinalizesTxn", url.User(security.RootUser))
defer cleanup()
if err := aborter.Init(pgURL); err != nil {
t.Fatal(err)
}
}
if _, err := sqlDB.Exec(`
CREATE DATABASE t; CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT);
`); err != nil {
t.Fatal(err)
}
// We need to do everything on one connection as we'll want to observe the
// connection state after a COMMIT.
sqlDB.SetMaxOpenConns(1)
// We're going to test both errors that would leave the transaction in the
// RestartWait state and errors that would leave the transaction in Aborted,
// if they were to happen on any other statement than COMMIT.
// We do that by always injecting a retryable error at COMMIT, but once in a
// txn that had a "retry intent" (SAVEPOINT cockroach_restart), and once in a
// txn without it.
testCases := []struct {
retryIntent bool
}{
{false},
{true},
}
for _, tc := range testCases {
const insertStmt = "INSERT INTO t.test(k, v) VALUES (0, 'boulanger')"
if err := aborter.QueueStmtForAbortion(
insertStmt, 1 /* abortCount */, false, /* willBeRetriedIbid */
); err != nil {
t.Fatal(err)
}
if _, err := sqlDB.Exec("BEGIN"); err != nil {
t.Fatal(err)
}
if tc.retryIntent {
if _, err := sqlDB.Exec("SAVEPOINT cockroach_restart"); err != nil {
t.Fatal(err)
}
}
if _, err := sqlDB.Exec(insertStmt); err != nil {
t.Fatal(err)
}
if _, err := sqlDB.Exec("COMMIT"); !testutils.IsError(err, "pq: restart transaction") {
t.Fatalf("unexpected error: %v", err)
}
// Check that we can start another txn on the (one and only) connection.
if _, err := sqlDB.Exec("BEGIN"); err != nil {
t.Fatal(err)
}
// Check that we don't see any rows, so the previous txn was rolled back.
rows, err := sqlDB.Query("SELECT * FROM t.test")
if err != nil {
t.Fatal(err)
}
if rows.Next() {
var k int
var v string
err := rows.Scan(&k, &v)
t.Fatalf("found unexpected row: %d %s, %v", k, v, err)
}
rows.Close()
if _, err := sqlDB.Exec("END"); err != nil {
t.Fatal(err)
}
}
}
开发者ID:veteranlu,项目名称:cockroach,代码行数:85,代码来源:txn_restart_test.go
示例20: TestTxnUserRestart
// TestUserTxnRestart tests user-directed txn restarts.
// The test will inject and otherwise create retriable errors of various kinds
// and checks that we still manage to run a txn despite them.
func TestTxnUserRestart(t *testing.T) {
defer leaktest.AfterTest(t)()
aborter := NewTxnAborter()
defer aborter.Close(t)
params, cmdFilters := createTestServerParams()
params.Knobs.SQLExecutor = aborter.executorKnobs()
s, sqlDB, _ := serverutils.StartServer(t, params)
defer s.Stopper().Stop()
{
pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestTxnUserRestart", url.User(security.RootUser))
defer cleanup()
if err := aborter.Init(pgURL); err != nil {
t.Fatal(err)
}
}
if _, err := sqlDB.Exec(`
CREATE DATABASE t;
CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT);
`); err != nil {
t.Fatal(err)
}
// Set up error injection that causes retries.
testCases := []struct {
magicVals *filterVals
expectedErr string
}{
{
magicVals: createFilterVals(
map[string]int{"boulanger": 2}, // restartCounts
nil),
expectedErr: ".*encountered previous write with future timestamp.*",
},
{
magicVals: createFilterVals(
nil,
map[string]int{"boulanger": 2}), // abortCounts
expectedErr: ".*txn aborted.*",
},
}
for _, tc := range testCases {
for _, rs := range []rollbackStrategy{rollbackToSavepoint, declareSavepoint} {
cleanupFilter := cmdFilters.AppendFilter(
func(args storagebase.FilterArgs) *roachpb.Error {
if err := injectErrors(args.Req, args.Hdr, tc.magicVals); err != nil {
return roachpb.NewErrorWithTxn(err, args.Hdr.Txn)
}
return nil
}, false)
// Also inject an error at RELEASE time, besides the error injected by magicVals.
const sentinelInsert = "INSERT INTO t.test(k, v) VALUES (0, 'sentinel')"
if err := aborter.QueueStmtForAbortion(
sentinelInsert, 1 /* abortCount */, true, /* willBeRetriedIbid */
); err != nil {
t.Fatal(err)
}
commitCount := s.MustGetSQLCounter(sql.MetaTxnCommit.Name)
// This is the magic. Run the txn closure until all the retries are exhausted.
retryExec(t, sqlDB, rs, func(tx *gosql.Tx) bool {
return runTestTxn(t, tc.magicVals, tc.expectedErr, sqlDB, tx, sentinelInsert)
})
checkRestarts(t, tc.magicVals)
// Check that we only wrote the sentinel row.
rows, err := sqlDB.Query("SELECT * FROM t.test")
if err != nil {
t.Fatal(err)
}
for rows.Next() {
var k int
var v string
err = rows.Scan(&k, &v)
if err != nil {
t.Fatal(err)
}
if k != 0 || v != "sentinel" {
t.Fatalf("didn't find expected row: %d %s", k, v)
}
}
// Check that the commit counter was incremented. It could have been
// incremented by more than 1 because of the transactions we use to force
// aborts, plus who knows what else the server is doing in the background.
checkCou
|
请发表评论