Skip to content

Commit 9b833d5

Browse files
early-out, if provided arguments don't match the expected column count (marcboeker#211)
1 parent 8b4a056 commit 9b833d5

File tree

3 files changed

+22
-22
lines changed

3 files changed

+22
-22
lines changed

appender.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,6 @@ func (a *Appender) AppendRow(args ...driver.Value) error {
139139
return getError(errAppenderAppendAfterClose, nil)
140140
}
141141

142-
// Create a new data chunk if the current chunk is full, or if this is the first row.
143-
if a.currSize == C.duckdb_vector_size() || len(a.chunks) == 0 {
144-
a.newDataChunk(len(args))
145-
}
146-
147142
err := a.appendRowSlice(args)
148143
if err != nil {
149144
return getError(errAppenderAppendRow, err)
@@ -186,6 +181,16 @@ func (a *Appender) newDataChunk(colCount int) {
186181
}
187182

188183
func (a *Appender) appendRowSlice(args []driver.Value) error {
184+
// early-out, if the number of args does not match the column count
185+
if len(args) != len(a.vectors) {
186+
return columnCountError(len(args), len(a.vectors))
187+
}
188+
189+
// Create a new data chunk if the current chunk is full, or if this is the first row.
190+
if a.currSize == C.duckdb_vector_size() || len(a.chunks) == 0 {
191+
a.newDataChunk(len(args))
192+
}
193+
189194
for i, val := range args {
190195
vec := a.vectors[i]
191196

errors.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ func columnError(err error, colIdx int) error {
2929
return fmt.Errorf("%w: %s: %d", err, columnErrMsg, colIdx)
3030
}
3131

32+
func columnCountError(actual int, expected int) error {
33+
return fmt.Errorf("%s: expected %d, got %d", columnCountErrMsg, expected, actual)
34+
}
35+
3236
func unsupportedTypeError(name string) error {
3337
return fmt.Errorf("%s: %s", unsupportedTypeErrMsg, name)
3438
}
@@ -46,6 +50,7 @@ const (
4650
castErrMsg = "cast error"
4751
structFieldErrMsg = "invalid STRUCT field"
4852
columnErrMsg = "column index"
53+
columnCountErrMsg = "invalid column count"
4954
unsupportedTypeErrMsg = "unsupported data type"
5055
invalidatedAppenderMsg = "appended data has been invalidated due to corrupt row"
5156
)
@@ -63,8 +68,10 @@ var (
6368
errAppenderDoubleClose = errors.New("could not close appender: already closed")
6469
errAppenderAppendRow = errors.New("could not append row")
6570
errAppenderAppendAfterClose = errors.New("could not append row: appender already closed")
66-
errAppenderClose = errors.New("could not close appender")
67-
errAppenderFlush = errors.New("could not flush appender")
71+
// FIXME: not covered by tests. Should be triggered by appending a constraint violation, see #210.
72+
errAppenderClose = errors.New("could not close appender")
73+
// FIXME: not covered by tests. Should be triggered by appending a constraint violation, see #210.
74+
errAppenderFlush = errors.New("could not flush appender")
6875

6976
// Errors not covered in tests.
7077
errConnect = errors.New("could not connect to database")

errors_test.go

+3-15
Original file line numberDiff line numberDiff line change
@@ -113,22 +113,10 @@ func TestErrAppender(t *testing.T) {
113113
require.NoError(t, c.Close())
114114
})
115115

116-
t.Run(errAppenderClose.Error(), func(t *testing.T) {
116+
t.Run(columnCountErrMsg, func(t *testing.T) {
117117
c, con, a := prepareAppender(t, `CREATE TABLE test (a VARCHAR, b VARCHAR)`)
118-
require.NoError(t, a.AppendRow("hello"))
119-
err := a.Close()
120-
121-
testError(t, err, errAppenderClose.Error(), duckdbErrMsg, invalidatedAppenderMsg)
122-
require.NoError(t, con.Close())
123-
require.NoError(t, c.Close())
124-
})
125-
126-
t.Run(errAppenderFlush.Error(), func(t *testing.T) {
127-
c, con, a := prepareAppender(t, `CREATE TABLE test (a VARCHAR, b VARCHAR)`)
128-
require.NoError(t, a.AppendRow("hello"))
129-
err := a.Flush()
130-
131-
testError(t, err, errAppenderFlush.Error(), duckdbErrMsg, invalidatedAppenderMsg)
118+
err := a.AppendRow("hello")
119+
testError(t, err, errAppenderAppendRow.Error(), columnCountErrMsg)
132120
cleanupAppender(t, c, con, a)
133121
})
134122

0 commit comments

Comments
 (0)