|
1 | 1 | package pgx_test |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "compress/gzip" |
| 5 | + "fmt" |
| 6 | + "io/ioutil" |
| 7 | + "os" |
4 | 8 | "reflect" |
| 9 | + "strconv" |
5 | 10 | "strings" |
6 | 11 | "testing" |
7 | 12 | "time" |
@@ -639,3 +644,91 @@ func TestConnCopyFromReaderNoTableError(t *testing.T) { |
639 | 644 |
|
640 | 645 | ensureConnValid(t, conn) |
641 | 646 | } |
| 647 | + |
| 648 | +func TestConnCopyFromGzipReader(t *testing.T) { |
| 649 | + t.Parallel() |
| 650 | + |
| 651 | + conn := mustConnect(t, *defaultConnConfig) |
| 652 | + defer closeConn(t, conn) |
| 653 | + |
| 654 | + mustExec(t, conn, `create temporary table foo( |
| 655 | + a int4, |
| 656 | + b varchar |
| 657 | + )`) |
| 658 | + |
| 659 | + f, err := ioutil.TempFile("", "*") |
| 660 | + if err != nil { |
| 661 | + t.Fatalf("Unexpected error for ioutil.TempFile: %v", err) |
| 662 | + } |
| 663 | + |
| 664 | + gw := gzip.NewWriter(f) |
| 665 | + |
| 666 | + inputRows := [][]interface{}{} |
| 667 | + for i := 0; i < 1000; i++ { |
| 668 | + val := strconv.Itoa(i * i) |
| 669 | + inputRows = append(inputRows, []interface{}{int32(i), val}) |
| 670 | + _, err = gw.Write([]byte(fmt.Sprintf("%d,\"%s\"\n", i, val))) |
| 671 | + if err != nil { |
| 672 | + t.Errorf("Unexpected error for gw.Write: %v", err) |
| 673 | + } |
| 674 | + } |
| 675 | + |
| 676 | + err = gw.Close() |
| 677 | + if err != nil { |
| 678 | + t.Fatalf("Unexpected error for gw.Close: %v", err) |
| 679 | + } |
| 680 | + |
| 681 | + _, err = f.Seek(0, 0) |
| 682 | + if err != nil { |
| 683 | + t.Fatalf("Unexpected error for f.Seek: %v", err) |
| 684 | + } |
| 685 | + |
| 686 | + gr, err := gzip.NewReader(f) |
| 687 | + if err != nil { |
| 688 | + t.Fatalf("Unexpected error for gzip.NewReader: %v", err) |
| 689 | + } |
| 690 | + |
| 691 | + err = conn.CopyFromReader(gr, "COPY foo FROM STDIN WITH (FORMAT csv)") |
| 692 | + if err != nil { |
| 693 | + t.Errorf("Unexpected error for CopyFromReader: %v", err) |
| 694 | + } |
| 695 | + |
| 696 | + err = gr.Close() |
| 697 | + if err != nil { |
| 698 | + t.Errorf("Unexpected error for gr.Close: %v", err) |
| 699 | + } |
| 700 | + |
| 701 | + err = f.Close() |
| 702 | + if err != nil { |
| 703 | + t.Errorf("Unexpected error for f.Close: %v", err) |
| 704 | + } |
| 705 | + |
| 706 | + err = os.Remove(f.Name()) |
| 707 | + if err != nil { |
| 708 | + t.Errorf("Unexpected error for os.Remove: %v", err) |
| 709 | + } |
| 710 | + |
| 711 | + rows, err := conn.Query("select * from foo") |
| 712 | + if err != nil { |
| 713 | + t.Errorf("Unexpected error for Query: %v", err) |
| 714 | + } |
| 715 | + |
| 716 | + var outputRows [][]interface{} |
| 717 | + for rows.Next() { |
| 718 | + row, err := rows.Values() |
| 719 | + if err != nil { |
| 720 | + t.Errorf("Unexpected error for rows.Values(): %v", err) |
| 721 | + } |
| 722 | + outputRows = append(outputRows, row) |
| 723 | + } |
| 724 | + |
| 725 | + if rows.Err() != nil { |
| 726 | + t.Errorf("Unexpected error for rows.Err(): %v", rows.Err()) |
| 727 | + } |
| 728 | + |
| 729 | + if !reflect.DeepEqual(inputRows, outputRows) { |
| 730 | + t.Errorf("Input rows and output rows do not equal") |
| 731 | + } |
| 732 | + |
| 733 | + ensureConnValid(t, conn) |
| 734 | +} |
0 commit comments