// TestScanBatches tests the scan-in-batches code by artificially setting the batch size to // particular values and performing queries. func TestScanBatches(t *testing.T) { defer leaktest.AfterTest(t)() s := server.StartTestServer(t) defer s.Stop() pgURL, cleanupFn := sqlutils.PGUrl(t, s, security.RootUser, "scanTestCockroach") pgURL.Path = "test" defer cleanupFn() db, err := sql.Open("postgres", pgURL.String()) if err != nil { t.Fatal(err) } defer db.Close() if _, err := db.Exec(`CREATE DATABASE IF NOT EXISTS test`); err != nil { t.Fatal(err) } // The test will screw around with KVBatchSize; make sure to restore it at the end. restore := csql.SetKVBatchSize(10) defer restore() numRows := 100 if _, err := db.Exec(`DROP TABLE IF EXISTS test.scan`); err != nil { t.Fatal(err) } if _, err := db.Exec(`CREATE TABLE test.scan (k INT PRIMARY KEY, v STRING)`); err != nil { t.Fatal(err) } var buf bytes.Buffer buf.WriteString(`INSERT INTO test.scan VALUES `) for i := 0; i < numRows; i++ { if i > 0 { buf.WriteString(", ") } if i%2 == 0 { fmt.Fprintf(&buf, "(%d, 'str%d')", i, i) } else { // Every other row doesn't get the string value (to have NULLs). fmt.Fprintf(&buf, "(%d, NULL)", i) } } if _, err := db.Exec(buf.String()); err != nil { t.Fatal(err) } // The table will have one key for the even rows, and two keys for the odd rows. batchSizes := []int{1, 2, 3, 5, 10, 13, 100, 3*numRows/2 - 1, 3 * numRows / 2, 3*numRows/2 + 1} // We can test with at most one one span for now (see kvFetcher.fetch) numSpanValues := []int{0, 1} for _, batch := range batchSizes { csql.SetKVBatchSize(batch) for _, numSpans := range numSpanValues { testScanBatchQuery(t, db, numSpans, numRows, false) testScanBatchQuery(t, db, numSpans, numRows, true) } } if _, err := db.Exec(`DROP TABLE test.scan`); err != nil { t.Fatal(err) } }
// TestScanBatches tests the scan-in-batches code by artificially setting the batch size to // particular values and performing queries. func TestScanBatches(t *testing.T) { defer leaktest.AfterTest(t)() s := server.StartTestServer(t) defer s.Stop() pgURL, cleanupFn := sqlutils.PGUrl(t, s, security.RootUser, "scanTestCockroach") pgURL.Path = "test" defer cleanupFn() db, err := sql.Open("postgres", pgURL.String()) if err != nil { t.Fatal(err) } defer db.Close() if _, err := db.Exec(`CREATE DATABASE IF NOT EXISTS test`); err != nil { t.Fatal(err) } // The test will screw around with KVBatchSize; make sure to restore it at the end. restore := csql.SetKVBatchSize(10) defer restore() numAs := 5 numBs := 20 if _, err := db.Exec(`DROP TABLE IF EXISTS test.scan`); err != nil { t.Fatal(err) } if _, err := db.Exec(`CREATE TABLE test.scan (a INT, b INT, v STRING, PRIMARY KEY (a, b))`); err != nil { t.Fatal(err) } var buf bytes.Buffer buf.WriteString(`INSERT INTO test.scan VALUES `) for a := 0; a < numAs; a++ { for b := 0; b < numBs; b++ { if a+b > 0 { buf.WriteString(", ") } if (a+b)%2 == 0 { fmt.Fprintf(&buf, "(%d, %d, 'str%d%d')", a, b, a, b) } else { // Every other row doesn't get the string value (to have NULLs). fmt.Fprintf(&buf, "(%d, %d, NULL)", a, b) } } } if _, err := db.Exec(buf.String()); err != nil { t.Fatal(err) } // The table will have one key for the even rows, and two keys for the odd rows. numKeys := 3 * numAs * numBs / 2 batchSizes := []int{1, 2, 3, 5, 10, 13, 100, numKeys - 1, numKeys, numKeys + 1} numSpanValues := []int{0, 1, 2, 3} for _, batch := range batchSizes { csql.SetKVBatchSize(batch) for _, numSpans := range numSpanValues { testScanBatchQuery(t, db, numSpans, numAs, numBs, false) testScanBatchQuery(t, db, numSpans, numAs, numBs, true) } } if _, err := db.Exec(`DROP TABLE test.scan`); err != nil { t.Fatal(err) } }