Skip to content

Commit ad44b8c

Browse files
committed
Avoid phantom nil values
1 parent 830d66e commit ad44b8c

File tree

2 files changed

+20
-21
lines changed

2 files changed

+20
-21
lines changed

driver_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,14 +526,22 @@ func TestNULL(t *testing.T) {
526526
if !success {
527527
dbt.Error("Inserting []byte(nil) as NULL failed")
528528
}
529-
// Check input==output (==nil)
529+
// Check input==output with input==nil
530530
b = nil
531-
if err = dbt.db.QueryRow("SELECT ?", nil).Scan(&b); err != nil {
531+
if err = dbt.db.QueryRow("SELECT ?", b).Scan(&b); err != nil {
532532
dbt.Fatal(err)
533533
}
534534
if b != nil {
535535
dbt.Error("Non-nil echo from nil input")
536536
}
537+
// Check input==output with input!=nil
538+
b = []byte("")
539+
if err = dbt.db.QueryRow("SELECT ?", b).Scan(&b); err != nil {
540+
dbt.Fatal(err)
541+
}
542+
if b == nil {
543+
dbt.Error("nil echo from non-nil input")
544+
}
537545

538546
// Insert NULL
539547
dbt.mustExec("CREATE TABLE test (dummmy1 int, value int, dummy2 int)")

utils.go

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ func readLengthEnodedString(b []byte) ([]byte, bool, int, error) {
604604
// Get length
605605
num, isNull, n := readLengthEncodedInteger(b)
606606
if num < 1 {
607-
return nil, isNull, n, nil
607+
return b[n:n], isNull, n, nil
608608
}
609609

610610
n += int(num)
@@ -632,40 +632,31 @@ func skipLengthEnodedString(b []byte) (int, error) {
632632
return n, io.EOF
633633
}
634634

635-
func readLengthEncodedInteger(b []byte) (num uint64, isNull bool, n int) {
635+
func readLengthEncodedInteger(b []byte) (uint64, bool, int) {
636636
switch b[0] {
637637

638638
// 251: NULL
639639
case 0xfb:
640-
n = 1
641-
isNull = true
642-
return
640+
return 0, true, 1
643641

644642
// 252: value of following 2
645643
case 0xfc:
646-
num = uint64(b[1]) | uint64(b[2])<<8
647-
n = 3
648-
return
644+
return uint64(b[1]) | uint64(b[2])<<8, false, 3
649645

650646
// 253: value of following 3
651647
case 0xfd:
652-
num = uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16
653-
n = 4
654-
return
648+
return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16, false, 4
655649

656650
// 254: value of following 8
657651
case 0xfe:
658-
num = uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 |
659-
uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 |
660-
uint64(b[7])<<48 | uint64(b[8])<<54
661-
n = 9
662-
return
652+
return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 |
653+
uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 |
654+
uint64(b[7])<<48 | uint64(b[8])<<54,
655+
false, 9
663656
}
664657

665658
// 0-250: value of first byte
666-
num = uint64(b[0])
667-
n = 1
668-
return
659+
return uint64(b[0]), false, 1
669660
}
670661

671662
func appendLengthEncodedInteger(b []byte, n uint64) []byte {

0 commit comments

Comments
 (0)