Skip to content

Commit 95e4a6a

Browse files
committed
fix: write nulls to Nullable Enums
1 parent 81a24df commit 95e4a6a

File tree

4 files changed

+88
-5
lines changed

4 files changed

+88
-5
lines changed

clickhouse.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func (ch *clickhouse) CheckNamedValue(nv *driver.NamedValue) error {
165165
switch nv.Value.(type) {
166166
case IP, *types.Array, UUID:
167167
return nil
168-
case []byte, int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32, float64, string, time.Time:
168+
case nil, []byte, int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32, float64, string, time.Time:
169169
return nil
170170
}
171171

issues_test.go

+74
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,77 @@ func TestBytes(t *testing.T) {
160160
_, err = tx.Exec(`INSERT INTO TestBytes (s) VALUES (?)`, []byte("foo"))
161161
assert.NoError(t, err)
162162
}
163+
164+
func TestNullableEnumWithoutLeadZero(t *testing.T) {
165+
const (
166+
ddl = `
167+
CREATE TABLE test_nullable_enum_without_lead_zero (
168+
value Nullable(Enum8('A' = 1, 'B' = 2)),
169+
value2 Nullable(Enum16('A' = 1, 'B' = 2))
170+
) Engine=Memory
171+
`
172+
dml = "INSERT INTO test_nullable_enum_without_lead_zero (value, value2) VALUES (?, ?)"
173+
query = "SELECT value, value2 FROM test_nullable_enum_without_lead_zero"
174+
)
175+
var data = [][]interface{}{
176+
{"A", nil},
177+
{"A", "B"},
178+
{nil, "B"},
179+
}
180+
if connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true"); assert.NoError(t, err) && assert.NoError(t, connect.Ping()) {
181+
if _, err := connect.Exec("DROP TABLE IF EXISTS test_nullable_enum_without_lead_zero"); assert.NoError(t, err) {
182+
if _, err := connect.Exec(ddl); assert.NoError(t, err) {
183+
if tx, err := connect.Begin(); assert.NoError(t, err) {
184+
185+
if stmt, err := tx.Prepare(dml); assert.NoError(t, err) {
186+
for _, v := range data {
187+
if _, err = stmt.Exec(v...); !assert.NoError(t, err) {
188+
return
189+
}
190+
}
191+
192+
}
193+
if assert.NoError(t, tx.Commit()) {
194+
var item struct {
195+
Value *string
196+
Value2 *string
197+
}
198+
if rows, err := connect.Query(query); assert.NoError(t, err) {
199+
var i int
200+
for rows.Next() {
201+
err := rows.Scan(
202+
&item.Value,
203+
&item.Value2,
204+
)
205+
if !assert.NoError(t, err) {
206+
return
207+
}
208+
switch v := item.Value; true {
209+
case v != nil:
210+
if !assert.Equal(t, data[i][0], *v) {
211+
return
212+
}
213+
default:
214+
if !assert.Equal(t, (*string)(nil), v) {
215+
return
216+
}
217+
}
218+
switch v := item.Value2; true {
219+
case v != nil:
220+
if !assert.Equal(t, data[i][1], *v) {
221+
return
222+
}
223+
default:
224+
if !assert.Equal(t, (*string)(nil), v) {
225+
return
226+
}
227+
}
228+
i++
229+
}
230+
}
231+
}
232+
}
233+
}
234+
}
235+
}
236+
}

lib/column/enum.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ func (enum *Enum) Write(encoder *binary.Encoder, v interface{}) error {
7171
}
7272
}
7373

74+
func (enum *Enum) defaultValue() interface{} {
75+
return enum.baseType
76+
}
77+
7478
func parseEnum(name, chType string) (*Enum, error) {
7579
var (
7680
data string
@@ -114,12 +118,12 @@ func parseEnum(name, chType string) (*Enum, error) {
114118
ident = ident[1 : len(ident)-1]
115119
value interface{} = int16(value)
116120
)
117-
if isEnum16 {
118-
enum.baseType = int16(0)
119-
} else {
120-
enum.baseType = int8(0)
121+
if !isEnum16 {
121122
value = int8(value.(int16))
122123
}
124+
if enum.baseType == nil {
125+
enum.baseType = value
126+
}
123127
enum.iv[ident] = value
124128
enum.vi[value] = ident
125129
}

lib/column/int8.go

+5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ func (i *Int8) Write(encoder *binary.Encoder, v interface{}) error {
2222
return encoder.Int8(int8(v))
2323
case int:
2424
return encoder.Int8(int8(v))
25+
case bool:
26+
if v {
27+
return encoder.Int8(int8(1))
28+
}
29+
return encoder.Int8(int8(0))
2530
}
2631
return &ErrUnexpectedType{
2732
T: v,

0 commit comments

Comments
 (0)