Skip to content

Commit 095a0a2

Browse files
committed
Pass TestInt, TestFloat32, TestFloat64, TestString
1 parent 9cad8e9 commit 095a0a2

File tree

3 files changed

+169
-1
lines changed

3 files changed

+169
-1
lines changed

connection.go

+1
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ func (sc *snowflakeConn) Exec(query string, args []driver.Value) (driver.Result,
125125
}
126126
var updatedRows int64
127127
if sc.isDml(data.Data.StatementTypeId) {
128+
// collects all values from the returned row sets
128129
updatedRows = 0
129130
for i, n := 0, len(data.Data.RowType); i < n; i++ {
130131
v, err := strconv.ParseInt(data.Data.RowSet[0][i], 10, 64)

converter.go

+6
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ func valueToString(v interface{}) (string, error) {
6565
} else {
6666
return "", errors.New(fmt.Sprintf("Failed to convert %s to string", v))
6767
}
68+
case string:
69+
if v1, ok := v.(string); ok {
70+
return v1, nil
71+
} else {
72+
return "", errors.New(fmt.Sprintf("Failed to convert %s to string", v))
73+
}
6874
default:
6975
return "0", nil
7076
}

driver_test.go

+162-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func (dbt *DBTest) fail(method, query string, err error) {
9292
if len(query) > 300 {
9393
query = "[query too large to print]"
9494
}
95-
dbt.Fatalf("error on %s %s: %s", method, query, err.Error())
95+
dbt.Fatalf("error on %s [%s]: %s", method, query, err.Error())
9696
}
9797

9898
func (dbt *DBTest) mustExec(query string, args ...interface{}) (res sql.Result) {
@@ -119,6 +119,22 @@ func runTests(t *testing.T, dsn string, tests ...func(dbt *DBTest)) {
119119
}
120120
}
121121

122+
func TestEmptyQuery(t *testing.T) {
123+
runTests(t, dsn, func(dbt *DBTest) {
124+
query := "--"
125+
// just a comment, no query
126+
_, err := dbt.db.Query(query)
127+
if err == nil {
128+
dbt.fail("query", query, err)
129+
}
130+
if driverErr, ok := err.(*SnowflakeError); ok {
131+
if driverErr.Number != 900 { // syntax error
132+
dbt.fail("query", query, err)
133+
}
134+
}
135+
})
136+
}
137+
122138
func TestCRUD(t *testing.T) {
123139
runTests(t, dsn, func(dbt *DBTest) {
124140
// Create Table
@@ -211,3 +227,148 @@ func TestCRUD(t *testing.T) {
211227
}
212228
})
213229
}
230+
231+
func TestInt(t *testing.T) {
232+
runTests(t, dsn, func(dbt *DBTest) {
233+
types := []string{"INT", "INTEGER"}
234+
in := int64(42)
235+
var out int64
236+
var rows *sql.Rows
237+
238+
// SIGNED
239+
for _, v := range types {
240+
dbt.mustExec("CREATE TABLE test (value " + v + ")")
241+
242+
dbt.mustExec("INSERT INTO test VALUES (?)", in)
243+
244+
rows = dbt.mustQuery("SELECT value FROM test")
245+
if rows.Next() {
246+
rows.Scan(&out)
247+
if in != out {
248+
dbt.Errorf("%s: %d != %d", v, in, out)
249+
}
250+
} else {
251+
dbt.Errorf("%s: no data", v)
252+
}
253+
254+
dbt.mustExec("DROP TABLE IF EXISTS test")
255+
}
256+
})
257+
}
258+
259+
func TestFloat32(t *testing.T) {
260+
runTests(t, dsn, func(dbt *DBTest) {
261+
types := [2]string{"FLOAT", "DOUBLE"}
262+
in := float32(42.23)
263+
var out float32
264+
var rows *sql.Rows
265+
for _, v := range types {
266+
dbt.mustExec("CREATE TABLE test (value " + v + ")")
267+
dbt.mustExec("INSERT INTO test VALUES (?)", in)
268+
rows = dbt.mustQuery("SELECT value FROM test")
269+
if rows.Next() {
270+
rows.Scan(&out)
271+
if in != out {
272+
dbt.Errorf("%s: %g != %g", v, in, out)
273+
}
274+
} else {
275+
dbt.Errorf("%s: no data", v)
276+
}
277+
dbt.mustExec("DROP TABLE IF EXISTS test")
278+
}
279+
})
280+
}
281+
282+
func TestFloat64(t *testing.T) {
283+
runTests(t, dsn, func(dbt *DBTest) {
284+
types := [2]string{"FLOAT", "DOUBLE"}
285+
var expected float64 = 42.23
286+
var out float64
287+
var rows *sql.Rows
288+
for _, v := range types {
289+
dbt.mustExec("CREATE TABLE test (value " + v + ")")
290+
dbt.mustExec("INSERT INTO test VALUES (42.23)")
291+
rows = dbt.mustQuery("SELECT value FROM test")
292+
if rows.Next() {
293+
rows.Scan(&out)
294+
if expected != out {
295+
dbt.Errorf("%s: %g != %g", v, expected, out)
296+
}
297+
} else {
298+
dbt.Errorf("%s: no data", v)
299+
}
300+
dbt.mustExec("DROP TABLE IF EXISTS test")
301+
}
302+
})
303+
}
304+
305+
func TestFloat64Placeholder(t *testing.T) {
306+
runTests(t, dsn, func(dbt *DBTest) {
307+
types := [2]string{"FLOAT", "DOUBLE"}
308+
var expected float64 = 42.23
309+
var out float64
310+
var rows *sql.Rows
311+
for _, v := range types {
312+
dbt.mustExec("CREATE TABLE test (id int, value " + v + ")")
313+
dbt.mustExec("INSERT INTO test VALUES (1, 42.23)")
314+
rows = dbt.mustQuery("SELECT value FROM test WHERE id = ?", 1)
315+
if rows.Next() {
316+
rows.Scan(&out)
317+
if expected != out {
318+
dbt.Errorf("%s: %g != %g", v, expected, out)
319+
}
320+
} else {
321+
dbt.Errorf("%s: no data", v)
322+
}
323+
dbt.mustExec("DROP TABLE IF EXISTS test")
324+
}
325+
})
326+
}
327+
328+
func TestString(t *testing.T) {
329+
runTests(t, dsn, func(dbt *DBTest) {
330+
types := []string{"CHAR(255)", "VARCHAR(255)", "TEXT", "STRING"}
331+
in := "κόσμε üöäßñóùéàâÿœ'îë Árvíztűrő いろはにほへとちりぬるを イロハニホヘト דג סקרן чащах น่าฟังเอย"
332+
var out string
333+
var rows *sql.Rows
334+
335+
for _, v := range types {
336+
dbt.mustExec("CREATE TABLE test (value " + v + ")")
337+
338+
dbt.mustExec("INSERT INTO test VALUES (?)", in)
339+
340+
rows = dbt.mustQuery("SELECT value FROM test")
341+
if rows.Next() {
342+
rows.Scan(&out)
343+
if in != out {
344+
dbt.Errorf("%s: %s != %s", v, in, out)
345+
}
346+
} else {
347+
dbt.Errorf("%s: no data", v)
348+
}
349+
350+
dbt.mustExec("DROP TABLE IF EXISTS test")
351+
}
352+
353+
// BLOB (Snowflake doesn't support BLOB type but STRING covers large text data)
354+
dbt.mustExec("CREATE TABLE test (id int, value STRING)")
355+
356+
id := 2
357+
in = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, " +
358+
"sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, " +
359+
"sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. " +
360+
"Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. " +
361+
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, " +
362+
"sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, " +
363+
"sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. " +
364+
"Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
365+
dbt.mustExec("INSERT INTO test VALUES (?, ?)", id, in)
366+
367+
err := dbt.db.QueryRow("SELECT value FROM test WHERE id = ?", id).Scan(&out)
368+
if err != nil {
369+
dbt.Fatalf("Error on BLOB-Query: %s", err.Error())
370+
} else if out != in {
371+
dbt.Errorf("BLOB: %s != %s", in, out)
372+
}
373+
})
374+
}

0 commit comments

Comments
 (0)