Skip to content

Commit dc08546

Browse files
sparqueshuebnerr
authored andcommitted
Fix bug involving null columns. (#37)
* fix type conversion issue * add flag.Parse() to init so the flags actually do something * Update/fix tests
1 parent 4617d6a commit dc08546

File tree

2 files changed

+58
-80
lines changed

2 files changed

+58
-80
lines changed

driver_test.go

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -438,36 +438,40 @@ func TestValueTypes(t *testing.T) {
438438
assertEqual(t, numericVal, 1.2345)
439439

440440
assertNext(t, rows)
441-
nils := make([]interface{}, 13)
442-
assertNoErr(t, rows.Scan(&nils[0], &nils[1], &nils[2], &nils[3], &nils[4], &nils[5], &nils[6], &nils[7],
443-
&nils[8], &nils[9], &nils[10], &nils[11], &nils[12]))
444-
445-
_, ok := nils[0].(sql.NullBool)
446-
assertTrue(t, ok)
447-
_, ok = nils[1].(sql.NullInt64)
448-
assertTrue(t, ok)
449-
_, ok = nils[2].(sql.NullFloat64)
450-
assertTrue(t, ok)
451-
_, ok = nils[3].(sql.NullString)
452-
assertTrue(t, ok)
453-
_, ok = nils[4].(sql.NullString)
454-
assertTrue(t, ok)
455-
_, ok = nils[5].(sql.NullString)
456-
assertTrue(t, ok)
457-
_, ok = nils[6].(sql.NullString)
458-
assertTrue(t, ok)
459-
_, ok = nils[7].(sql.NullString)
460-
assertTrue(t, ok)
461-
_, ok = nils[8].(sql.NullString)
462-
assertTrue(t, ok)
463-
_, ok = nils[9].(sql.NullString)
464-
assertTrue(t, ok)
465-
_, ok = nils[10].(sql.NullString)
466-
assertTrue(t, ok)
467-
_, ok = nils[11].(sql.NullString)
468-
assertTrue(t, ok)
469-
_, ok = nils[12].(sql.NullFloat64)
470-
assertTrue(t, ok)
441+
442+
var (
443+
nullBoolVal sql.NullBool
444+
nullIntVal sql.NullInt64
445+
nullFloatVal sql.NullFloat64
446+
nullCharVal sql.NullString
447+
nullVarCharVal sql.NullString
448+
nullTimestampVal sql.NullString
449+
nullTimestampTZVal sql.NullString
450+
nullVarBinVal sql.NullString
451+
nullUuidVal sql.NullString
452+
nullLVarCharVal sql.NullString
453+
nullLVarBinaryVal sql.NullString
454+
nullBinaryVal sql.NullString
455+
nullNumericVal sql.NullFloat64
456+
)
457+
458+
assertNoErr(t, rows.Scan(&nullBoolVal, &nullIntVal, &nullFloatVal, &nullCharVal,
459+
&nullVarCharVal, &nullTimestampVal, &nullTimestampTZVal, &nullVarBinVal, &nullUuidVal,
460+
&nullLVarCharVal, &nullLVarBinaryVal, &nullBinaryVal, &nullNumericVal))
461+
462+
assertTrue(t, !nullBoolVal.Valid)
463+
assertTrue(t, !nullIntVal.Valid)
464+
assertTrue(t, !nullFloatVal.Valid)
465+
assertTrue(t, !nullCharVal.Valid)
466+
assertTrue(t, !nullVarCharVal.Valid)
467+
assertTrue(t, !nullTimestampVal.Valid)
468+
assertTrue(t, !nullTimestampTZVal.Valid)
469+
assertTrue(t, !nullVarBinVal.Valid)
470+
assertTrue(t, !nullUuidVal.Valid)
471+
assertTrue(t, !nullLVarCharVal.Valid)
472+
assertTrue(t, !nullLVarBinaryVal.Valid)
473+
assertTrue(t, !nullBinaryVal.Valid)
474+
assertTrue(t, !nullNumericVal.Valid)
471475

472476
assertNoErr(t, rows.Close())
473477
}
@@ -607,16 +611,16 @@ func TestSTDINCopy(t *testing.T) {
607611
_, err = connDB.ExecContext(ctx, "COPY stdin_data FROM STDIN DELIMITER ','")
608612
assertNoErr(t, err)
609613

610-
rows, err := connDB.QueryContext(ctx, "SELECT * FROM stdin_data")
614+
rows, err := connDB.QueryContext(ctx, "SELECT name,id FROM stdin_data as t(name,id) order by name")
611615
assertNoErr(t, err)
612616

613617
defer rows.Close()
614618

615619
columns, _ := rows.Columns()
616620
assertEqual(t, len(columns), 2)
617621

618-
names := []string{"roger", "siting", "tom", "yang", "john"}
619-
ids := []int{123, 456, 789, 333, 555}
622+
names := []string{"john", "roger", "siting", "tom", "yang"}
623+
ids := []int{555, 123, 456, 789, 333}
620624
matched := 0
621625
var name string
622626
var id int
@@ -648,16 +652,16 @@ func TestSTDINCopyWithStream(t *testing.T) {
648652
_, err = connDB.ExecContext(vCtx, "COPY stdin_data FROM STDIN DELIMITER ','")
649653
assertNoErr(t, err)
650654

651-
rows, err := connDB.QueryContext(ctx, "SELECT * FROM stdin_data")
655+
rows, err := connDB.QueryContext(ctx, "SELECT name,id FROM stdin_data as t(name,id) order by name")
652656
assertNoErr(t, err)
653657

654658
defer rows.Close()
655659

656660
columns, _ := rows.Columns()
657661
assertEqual(t, len(columns), 2)
658662

659-
names := []string{"roger", "siting", "tom", "yang", "john"}
660-
ids := []int{123, 456, 789, 333, 555}
663+
names := []string{"john", "roger", "siting", "tom", "yang"}
664+
ids := []int{555, 123, 456, 789, 333}
661665
matched := 0
662666
var name string
663667
var id int
@@ -680,6 +684,10 @@ var tlsMode = flag.String("tlsmode", "none", "SSL/TLS mode (none, server, server
680684
var usePreparedStmts = flag.Bool("use_prepared_statements", true, "whether to use prepared statements for all queries/executes")
681685

682686
func init() {
687+
// One or both lines below are necessary depending on your go version
688+
// testing.Init()
689+
// flag.Parse()
690+
683691
testLogger.Info("user name: %s", *verticaUserName)
684692
testLogger.Info("password : **********")
685693
testLogger.Info("locator : %s", *verticaHostPort)

rows.go

Lines changed: 14 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ package vertigo
3333
// THE SOFTWARE.
3434

3535
import (
36-
"database/sql"
3736
"database/sql/driver"
3837
"encoding/hex"
3938
"fmt"
@@ -88,60 +87,31 @@ func (r *rows) Next(dest []driver.Value) error {
8887
thisRow := r.resultData[r.readIndex]
8988

9089
for idx, colVal := range thisRow.RowData {
91-
90+
if colVal == nil {
91+
dest[idx] = nil
92+
continue
93+
}
9294
switch r.columnDefs.Columns[idx].DataTypeOID {
9395
case common.ColTypeBoolean: // to boolean
94-
if colVal == nil {
95-
dest[idx] = sql.NullBool{}
96+
if colVal[0] == 't' {
97+
dest[idx] = true
9698
} else {
97-
if colVal[0] == 't' {
98-
dest[idx] = true
99-
} else {
100-
dest[idx] = false
101-
}
99+
dest[idx] = false
102100
}
103101
case common.ColTypeInt64: // to integer
104-
if colVal == nil {
105-
dest[idx] = sql.NullInt64{}
106-
} else {
107-
dest[idx], _ = strconv.Atoi(string(colVal))
108-
}
102+
dest[idx], _ = strconv.Atoi(string(colVal))
109103
case common.ColTypeVarChar, common.ColTypeLongVarChar, common.ColTypeChar, common.ColTypeUUID: // stays string, convert char to string
110-
if colVal == nil {
111-
dest[idx] = sql.NullString{}
112-
} else {
113-
dest[idx] = string(colVal)
114-
}
104+
dest[idx] = string(colVal)
115105
case common.ColTypeFloat64, common.ColTypeNumeric: // to float64
116-
if colVal == nil {
117-
dest[idx] = sql.NullFloat64{}
118-
} else {
119-
dest[idx], _ = strconv.ParseFloat(string(colVal), 64)
120-
}
106+
dest[idx], _ = strconv.ParseFloat(string(colVal), 64)
121107
case common.ColTypeTimestamp: // to time.Time from YYYY-MM-DD hh:mm:ss
122-
if colVal == nil {
123-
dest[idx] = sql.NullString{}
124-
} else {
125-
dest[idx], _ = parseTimestampTZColumn(string(colVal) + r.tzOffset)
126-
}
108+
dest[idx], _ = parseTimestampTZColumn(string(colVal) + r.tzOffset)
127109
case common.ColTypeTimestampTZ:
128-
if colVal == nil {
129-
dest[idx] = sql.NullString{}
130-
} else {
131-
dest[idx], _ = parseTimestampTZColumn(string(colVal))
132-
}
110+
dest[idx], _ = parseTimestampTZColumn(string(colVal))
133111
case common.ColTypeVarBinary, common.ColTypeLongVarBinary, common.ColTypeBinary: // to []byte - this one's easy
134-
if colVal == nil {
135-
dest[idx] = sql.NullString{}
136-
} else {
137-
dest[idx] = hex.EncodeToString(colVal)
138-
}
112+
dest[idx] = hex.EncodeToString(colVal)
139113
default:
140-
if colVal == nil {
141-
dest[idx] = sql.NullString{}
142-
} else {
143-
dest[idx] = string(colVal)
144-
}
114+
dest[idx] = string(colVal)
145115
}
146116
}
147117

0 commit comments

Comments
 (0)