Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 084fa59

Browse files
committed
sql: correctly handle nulls in SQL type conversion
Signed-off-by: Miguel Molina <[email protected]>
1 parent 5f48ea3 commit 084fa59

File tree

2 files changed

+17
-21
lines changed

2 files changed

+17
-21
lines changed

sql/type.go

+16-20
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,8 @@ func (t numberT) Type() query.Type {
302302

303303
// SQL implements Type interface.
304304
func (t numberT) SQL(v interface{}) (sqltypes.Value, error) {
305-
if _, ok := v.(nullT); ok {
306-
return sqltypes.NULL, nil
305+
if v == nil {
306+
return sqltypes.MakeTrusted(t.t, nil), nil
307307
}
308308

309309
switch t.t {
@@ -428,8 +428,8 @@ var TimestampLayouts = []string{
428428

429429
// SQL implements Type interface.
430430
func (t timestampT) SQL(v interface{}) (sqltypes.Value, error) {
431-
if _, ok := v.(nullT); ok {
432-
return sqltypes.NULL, nil
431+
if v == nil {
432+
return sqltypes.MakeTrusted(sqltypes.Timestamp, nil), nil
433433
}
434434

435435
v, err := t.Convert(v)
@@ -504,8 +504,8 @@ func (t dateT) Type() query.Type {
504504
}
505505

506506
func (t dateT) SQL(v interface{}) (sqltypes.Value, error) {
507-
if _, ok := v.(nullT); ok {
508-
return sqltypes.NULL, nil
507+
if v == nil {
508+
return sqltypes.MakeTrusted(sqltypes.Timestamp, nil), nil
509509
}
510510

511511
v, err := t.Convert(v)
@@ -561,8 +561,8 @@ func (t textT) Type() query.Type {
561561

562562
// SQL implements Type interface.
563563
func (t textT) SQL(v interface{}) (sqltypes.Value, error) {
564-
if _, ok := v.(nullT); ok {
565-
return sqltypes.NULL, nil
564+
if v == nil {
565+
return sqltypes.MakeTrusted(sqltypes.Text, nil), nil
566566
}
567567

568568
v, err := t.Convert(v)
@@ -598,8 +598,8 @@ func (t booleanT) Type() query.Type {
598598

599599
// SQL implements Type interface.
600600
func (t booleanT) SQL(v interface{}) (sqltypes.Value, error) {
601-
if _, ok := v.(nullT); ok {
602-
return sqltypes.NULL, nil
601+
if v == nil {
602+
return sqltypes.MakeTrusted(sqltypes.Bit, nil), nil
603603
}
604604

605605
b := []byte{'0'}
@@ -670,8 +670,8 @@ func (t blobT) Type() query.Type {
670670

671671
// SQL implements Type interface.
672672
func (t blobT) SQL(v interface{}) (sqltypes.Value, error) {
673-
if _, ok := v.(nullT); ok {
674-
return sqltypes.NULL, nil
673+
if v == nil {
674+
return sqltypes.MakeTrusted(sqltypes.Blob, nil), nil
675675
}
676676

677677
v, err := t.Convert(v)
@@ -714,8 +714,8 @@ func (t jsonT) Type() query.Type {
714714

715715
// SQL implements Type interface.
716716
func (t jsonT) SQL(v interface{}) (sqltypes.Value, error) {
717-
if _, ok := v.(nullT); ok {
718-
return sqltypes.NULL, nil
717+
if v == nil {
718+
return sqltypes.MakeTrusted(sqltypes.TypeJSON, nil), nil
719719
}
720720

721721
v, err := t.Convert(v)
@@ -760,10 +760,6 @@ func (t tupleT) Type() query.Type {
760760
}
761761

762762
func (t tupleT) SQL(v interface{}) (sqltypes.Value, error) {
763-
if _, ok := v.(nullT); ok {
764-
return sqltypes.NULL, nil
765-
}
766-
767763
return sqltypes.Value{}, fmt.Errorf("unable to convert tuple type to SQL")
768764
}
769765

@@ -825,8 +821,8 @@ func (t arrayT) Type() query.Type {
825821
}
826822

827823
func (t arrayT) SQL(v interface{}) (sqltypes.Value, error) {
828-
if _, ok := v.(nullT); ok {
829-
return sqltypes.NULL, nil
824+
if v == nil {
825+
return sqltypes.MakeTrusted(sqltypes.TypeJSON, nil), nil
830826
}
831827

832828
v, err := t.Convert(v)

sql/type_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func TestIsNull(t *testing.T) {
1313
require.True(t, IsNull(nil))
1414

1515
n := numberT{sqltypes.Uint64}
16-
require.Equal(t, sqltypes.NULL, mustSQL(n.SQL(Null)))
16+
require.Equal(t, sqltypes.MakeTrusted(sqltypes.Uint64, nil), mustSQL(n.SQL(nil)))
1717
require.Equal(t, sqltypes.NewUint64(0), mustSQL(n.SQL(uint64(0))))
1818
}
1919

0 commit comments

Comments
 (0)