Skip to content

Commit da67983

Browse files
authored
Merge pull request #1083 from dolthub/zachmu/copy-tests
Go tests for the COPY command
2 parents 8480145 + 3c3b889 commit da67983

File tree

11 files changed

+327
-5
lines changed

11 files changed

+327
-5
lines changed

core/dataloader/csvreader.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,10 @@ func (csvr *csvReader) parseQuotedField(rs *recordState) (kontinue bool, err err
295295
const quoteLen = len(`"`)
296296
dl := len(csvr.delim)
297297
recordStartLine := csvr.numLine
298-
fullField := rs.line
298+
// full copy needed here because we append rs.line to fullField, and this can result in buffer corruption in
299+
// some cases (namely when windows line endings are present)
300+
fullField := make([]byte, len(rs.line))
301+
copy(fullField, rs.line)
299302

300303
// Quoted string field
301304
rs.line = rs.line[quoteLen:]

core/dataloader/dataloader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
// with the incomplete record.
3030
type DataLoader interface {
3131
// LoadChunk reads the records from |data| and inserts them into the previously configured table. Data records
32-
// are not guaranteed to stard and end cleanly on chunk boundaries, so implementations must recognize incomplete
32+
// are not guaranteed to start and end cleanly on chunk boundaries, so implementations must recognize incomplete
3333
// records and save them to prepend on the next processed chunk.
3434
LoadChunk(ctx *sql.Context, data *bufio.Reader) error
3535

core/dataloader/tabdataloader.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ func (tdl *TabularDataLoader) LoadChunk(ctx *sql.Context, data *bufio.Reader) er
111111
tdl.partialLine = ""
112112
}
113113

114-
// If we see the end of data marker, then jump out of the loop
114+
// If we see the end of data marker, return early
115115
if line == "\\." {
116-
break
116+
return nil
117117
}
118118

119119
// Skip over empty lines

testing/go/copy_test.go

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
// Copyright 2024 Dolthub, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package _go
16+
17+
import (
18+
"testing"
19+
20+
"github.com/dolthub/go-mysql-server/sql"
21+
)
22+
23+
func TestCopy(t *testing.T) {
24+
RunScripts(t, []ScriptTest{
25+
{
26+
Name: "tab delimited with header",
27+
SetUpScript: []string{
28+
"CREATE TABLE test (pk int primary key);",
29+
"INSERT INTO test VALUES (0), (1);",
30+
"CREATE TABLE test_info (id int, info varchar(255), test_pk int, primary key(id), foreign key (test_pk) references test(pk));",
31+
},
32+
Assertions: []ScriptTestAssertion{
33+
{
34+
Query: "COPY test_info FROM STDIN WITH (HEADER);",
35+
CopyFromStdInFile: "tab-load-with-header.sql",
36+
},
37+
{
38+
Query: "SELECT * FROM test_info order by 1;",
39+
Expected: []sql.Row{
40+
{4, "string for 4", 1},
41+
{5, "string for 5", 0},
42+
{6, "string for 6", 0},
43+
},
44+
},
45+
},
46+
},
47+
{
48+
Name: "tab delimited with quoted column names",
49+
SetUpScript: []string{
50+
`CREATE TABLE Regions (
51+
"Id" SERIAL UNIQUE NOT NULL,
52+
"Code" VARCHAR(4) UNIQUE NOT NULL,
53+
"Capital" VARCHAR(10) NOT NULL,
54+
"Name" VARCHAR(255) UNIQUE NOT NULL
55+
);`,
56+
},
57+
Assertions: []ScriptTestAssertion{
58+
{
59+
Query: "COPY regions (\"Id\", \"Code\", \"Capital\", \"Name\") FROM stdin;\n",
60+
CopyFromStdInFile: "tab-load-with-quoted-column-names.sql",
61+
},
62+
},
63+
},
64+
{
65+
Name: "basic csv",
66+
SetUpScript: []string{
67+
"CREATE TABLE tbl1 (pk int primary key, c1 varchar(100), c2 varchar(250));",
68+
},
69+
Assertions: []ScriptTestAssertion{
70+
{
71+
Query: "COPY tbl1 FROM STDIN (FORMAT CSV)",
72+
CopyFromStdInFile: "csv-load-basic-cases.sql",
73+
},
74+
{
75+
Query: "select * from tbl1 where pk = 6 order by pk;",
76+
Expected: []sql.Row{
77+
{6, `foo
78+
\\.
79+
bar`, "baz"},
80+
},
81+
},
82+
{
83+
Query: "select * from tbl1 where pk = 9;",
84+
Expected: []sql.Row{
85+
{9, nil, "''"},
86+
},
87+
},
88+
},
89+
},
90+
{
91+
Name: "csv with header",
92+
SetUpScript: []string{
93+
"CREATE TABLE tbl1 (pk int primary key, c1 varchar(100), c2 varchar(250));",
94+
},
95+
Assertions: []ScriptTestAssertion{
96+
{
97+
Query: " COPY tbl1 FROM STDIN (FORMAT CSV, HEADER TRUE);",
98+
CopyFromStdInFile: "csv-load-with-header.sql",
99+
},
100+
{
101+
Query: "select * from tbl1 where pk = 6 order by pk;",
102+
Expected: []sql.Row{
103+
{6, `foo
104+
\\.
105+
bar`, "baz"},
106+
},
107+
},
108+
},
109+
},
110+
{
111+
Name: "load multiple chunks",
112+
SetUpScript: []string{
113+
"CREATE TABLE tbl1 (pk int primary key, c1 varchar(100), c2 varchar(250));",
114+
},
115+
Assertions: []ScriptTestAssertion{
116+
{
117+
Query: "COPY tbl1 FROM STDIN (FORMAT CSV);",
118+
CopyFromStdInFile: "csv-load-multi-chunk.sql",
119+
},
120+
{
121+
Query: "select * from tbl1 where pk = 99 order by pk;",
122+
Expected: []sql.Row{
123+
{99, "foo", "barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash"},
124+
},
125+
},
126+
},
127+
},
128+
{
129+
Name: "load psv with headers",
130+
SetUpScript: []string{
131+
"CREATE TABLE test (pk int primary key);",
132+
"INSERT INTO test VALUES (0), (1);",
133+
"CREATE TABLE test_info (id int, info varchar(255), test_pk int, primary key(id), foreign key (test_pk) references test(pk));",
134+
},
135+
Assertions: []ScriptTestAssertion{
136+
{
137+
Query: "COPY test_info FROM STDIN (FORMAT CSV, HEADER TRUE, DELIMITER '|');",
138+
CopyFromStdInFile: "psv-load.sql",
139+
},
140+
{
141+
Query: "SELECT * FROM test_info order by 1;",
142+
Expected: []sql.Row{
143+
{4, "string for 4", 1},
144+
{5, "string for 5", 0},
145+
{6, "string for 6", 0},
146+
},
147+
},
148+
},
149+
},
150+
})
151+
}

testing/go/framework.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
package _go
1616

1717
import (
18+
"bufio"
1819
"context"
1920
"encoding/json"
2021
"errors"
2122
"fmt"
2223
"math"
2324
"net"
2425
"os"
26+
"path/filepath"
2527
"strconv"
2628
"testing"
2729
"time"
@@ -104,6 +106,9 @@ type ScriptTestAssertion struct {
104106

105107
// Cols is used to check the column names returned from the server.
106108
Cols []string
109+
110+
// CopyFromSTDIN is used to test the COPY FROM STDIN command.
111+
CopyFromStdInFile string
107112
}
108113

109114
// Connection contains the default and current connections.
@@ -182,7 +187,9 @@ func runScript(t *testing.T, ctx context.Context, script ScriptTest, conn *Conne
182187
return
183188
}
184189
// If we're skipping the results check, then we call Execute, as it uses a simplified message model.
185-
if assertion.SkipResultsCheck || assertion.ExpectedErr != "" {
190+
if assertion.CopyFromStdInFile != "" {
191+
copyFromStdin(t, conn.Current, assertion.Query, assertion.CopyFromStdInFile)
192+
} else if assertion.SkipResultsCheck || assertion.ExpectedErr != "" {
186193
_, err := conn.Exec(ctx, assertion.Query, assertion.BindVars...)
187194
if assertion.ExpectedErr != "" {
188195
require.Error(t, err)
@@ -220,6 +227,20 @@ func runScript(t *testing.T, ctx context.Context, script ScriptTest, conn *Conne
220227
}
221228
}
222229

230+
func copyFromStdin(t *testing.T, conn *pgx.Conn, query string, filename string) {
231+
filePath := filepath.Join("testdata", filename)
232+
233+
file, err := os.Open(filePath)
234+
if err != nil {
235+
t.Fatalf("Failed to open file: %v", err)
236+
}
237+
defer file.Close()
238+
239+
reader := bufio.NewReader(file)
240+
_, err = conn.PgConn().CopyFrom(context.Background(), reader, query)
241+
require.NoError(t, err)
242+
}
243+
223244
// RunScripts runs the given collection of scripts. This normalizes all rows before comparing them.
224245
func RunScripts(t *testing.T, scripts []ScriptTest) {
225246
runScripts(t, scripts, true)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
1,green,
2+
2,"blue","a
3+
q
4+
u
5+
a"
6+
3,"brown",
7+
4,"NULL",NULL
8+
5,"?",""
9+
6,"foo
10+
\\.
11+
bar","baz"
12+
7, ,' '
13+
8," ",""
14+
9,,''
15+
\.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
0,foo,barbazbashbarbazbashbarbazbashbarbazbash
2+
1,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
3+
2,foo,barbazbashbarbazbashbarbazbash
4+
3,foo,barbazbashbarbazbashbarbazbashbarbazbash
5+
4,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
6+
5,foo,barbazbashbarbazbashbarbazbash
7+
6,foo,barbazbashbarbazbashbarbazbashbarbazbash
8+
7,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
9+
8,foo,barbazbashbarbazbashbarbazbash
10+
9,foo,barbazbashbarbazbashbarbazbashbarbazbash
11+
10,foo,barbazbashbarbazbashbarbazbashbarbazbash
12+
11,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
13+
12,foo,barbazbashbarbazbashbarbazbash
14+
13,foo,barbazbashbarbazbashbarbazbashbarbazbash
15+
14,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
16+
15,foo,barbazbashbarbazbashbarbazbash
17+
16,foo,barbazbashbarbazbashbarbazbashbarbazbash
18+
17,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
19+
18,foo,barbazbashbarbazbashbarbazbash
20+
19,foo,barbazbashbarbazbashbarbazbashbarbazbash
21+
20,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
22+
21,foo,barbazbashbarbazbashbarbazbash
23+
22,foo,barbazbashbarbazbashbarbazbashbarbazbash
24+
23,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
25+
24,foo,barbazbashbarbazbashbarbazbash
26+
25,foo,barbazbashbarbazbashbarbazbashbarbazbash
27+
26,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
28+
27,foo,barbazbashbarbazbashbarbazbash
29+
28,foo,barbazbashbarbazbashbarbazbashbarbazbash
30+
29,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbash
31+
30,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
32+
31,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
33+
32,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
34+
33,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
35+
34,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
36+
35,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
37+
36,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
38+
37,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
39+
38,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
40+
39,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
41+
40,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
42+
41,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
43+
42,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
44+
43,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
45+
44,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
46+
45,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
47+
46,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
48+
47,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
49+
48,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
50+
49,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
51+
50,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
52+
51,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
53+
52,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
54+
53,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
55+
54,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
56+
55,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
57+
56,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
58+
57,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
59+
58,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
60+
59,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
61+
60,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
62+
61,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
63+
62,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
64+
63,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
65+
64,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
66+
65,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
67+
66,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
68+
67,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
69+
68,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
70+
69,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
71+
70,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
72+
71,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
73+
72,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
74+
73,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
75+
74,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
76+
75,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
77+
76,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
78+
77,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
79+
78,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
80+
79,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
81+
80,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
82+
81,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
83+
82,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
84+
83,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
85+
84,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
86+
85,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
87+
86,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
88+
87,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
89+
88,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
90+
89,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
91+
90,foo,"012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
92+
345678901234567"
93+
91,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
94+
92,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
95+
93,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
96+
94,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
97+
95,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
98+
96,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
99+
97,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
100+
98,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
101+
99,foo,barbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbashbarbazbash
102+
\.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
pk,c1,c2
2+
1,green,
3+
2,"blue","a
4+
q
5+
u
6+
a"
7+
3,"brown",
8+
4,"NULL",NULL
9+
5,"?",""
10+
6,"foo
11+
\\.
12+
bar","baz"
13+
7, ,' '
14+
8," ",""
15+
9,,''
16+
\.

testing/go/testdata/psv-load.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
id|info|test_pk
2+
4|string for 4|1
3+
5|string for 5|0
4+
6|string for 6|0
5+
\.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
id info test_pk
2+
4 string for 4 1
3+
5 string for 5 0
4+
6 string for 6 0
5+
\.

0 commit comments

Comments
 (0)