Skip to content

Commit 386fc0e

Browse files
committed
Document NULL behaviour with COPY
The default doesn't work as copyin.Exec() calls appendEncodedText(), which escapes \N to \\N. To fix it we need to read query, see if "WITH NULL" was passed, and don't escape that text (or the default of \N). Well, don't do that now, but do test and document this. Updates #591
1 parent a62682e commit 386fc0e

File tree

7 files changed

+136
-171
lines changed

7 files changed

+136
-171
lines changed

bench_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,3 +441,24 @@ func Benchmark_writeBuf_string(b *testing.B) {
441441
buf.buf = buf.buf[:0]
442442
}
443443
}
444+
445+
func BenchmarkCopyIn(b *testing.B) {
446+
db := pqtest.MustDB(b)
447+
tx := pqtest.Begin(b, db)
448+
449+
pqtest.Exec(b, tx, `create temp table tbl (a int, b varchar)`)
450+
stmt := pqtest.Prepare(b, tx, `copy tbl (a, b) from stdin`)
451+
452+
b.ResetTimer()
453+
for i := 0; i < b.N; i++ {
454+
stmt.MustExec(b, int64(i), "hello world!")
455+
}
456+
457+
stmt.MustExec(b)
458+
stmt.MustClose(b)
459+
460+
rows := pqtest.Query[int](b, tx, `select count(*) from tbl`)
461+
if rows[0]["count"] != b.N {
462+
b.Fatalf("expected %d items, not %d", b.N, rows[0]["count"])
463+
}
464+
}

conn_test.go

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -251,17 +251,10 @@ func TestExec(t *testing.T) {
251251
func TestStatment(t *testing.T) {
252252
db := pqtest.MustDB(t)
253253

254-
st, err := db.Prepare("SELECT 1")
255-
if err != nil {
256-
t.Fatal(err)
257-
}
258-
259-
st1, err := db.Prepare("SELECT 2")
260-
if err != nil {
261-
t.Fatal(err)
262-
}
254+
stmt1 := pqtest.Prepare(t, db, "select 1")
255+
stmt2 := pqtest.Prepare(t, db, "select 2")
263256

264-
r, err := st.Query()
257+
r, err := stmt1.Query()
265258
if err != nil {
266259
t.Fatal(err)
267260
}
@@ -276,12 +269,11 @@ func TestStatment(t *testing.T) {
276269
if err != nil {
277270
t.Fatal(err)
278271
}
279-
280272
if i != 1 {
281273
t.Fatalf("expected 1, got %d", i)
282274
}
283275

284-
r1, err := st1.Query()
276+
r1, err := stmt2.Query()
285277
if err != nil {
286278
t.Fatal(err)
287279
}
@@ -361,14 +353,9 @@ func TestEmptyQuery(t *testing.T) {
361353
t.Fatal(rows.Err())
362354
}
363355

364-
stmt, err := db.Prepare("")
365-
if err != nil {
366-
t.Fatal(err)
367-
}
368-
res, err = stmt.Exec()
369-
if err != nil {
370-
t.Fatal(err)
371-
}
356+
stmt := pqtest.Prepare(t, db, "")
357+
stmt.MustExec(t)
358+
res = stmt.MustExec(t)
372359
if _, err := res.RowsAffected(); err != errNoRowsAffected {
373360
t.Fatalf("expected %s, got %v", errNoRowsAffected, err)
374361
}
@@ -419,10 +406,7 @@ func TestEmptyResultSetColumns(t *testing.T) {
419406
t.Fatalf("unexpected Columns result %v", cols)
420407
}
421408

422-
stmt, err := db.Prepare("SELECT $1::int AS a, text 'bar' AS bar WHERE FALSE")
423-
if err != nil {
424-
t.Fatal(err)
425-
}
409+
stmt := pqtest.Prepare(t, db, "select $1::int as a, text 'bar' AS bar where false")
426410
rows, err = stmt.Query(1)
427411
if err != nil {
428412
t.Fatal(err)
@@ -529,13 +513,10 @@ func TestEncodeDecode(t *testing.T) {
529513
func TestNoData(t *testing.T) {
530514
db := pqtest.MustDB(t)
531515

532-
st, err := db.Prepare("SELECT 1 WHERE true = false")
533-
if err != nil {
534-
t.Fatal(err)
535-
}
536-
defer st.Close()
516+
stmt := pqtest.Prepare(t, db, "select 1 where true = false")
517+
defer stmt.Close()
537518

538-
r, err := st.Query()
519+
r, err := stmt.Query()
539520
if err != nil {
540521
t.Fatal(err)
541522
}

0 commit comments

Comments
 (0)