Skip to content

Commit e08c7b3

Browse files
committed
Refactor.
1 parent 66601dd commit e08c7b3

File tree

5 files changed

+129
-134
lines changed

5 files changed

+129
-134
lines changed

driver/driver.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) {
274274
// if err != nil {
275275
// log.Fatal(err)
276276
// }
277+
// defer conn.Close()
277278
//
278279
// err = conn.Raw(func(driverConn any) error {
279280
// conn := driverConn.(driver.Conn)

driver/util.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,63 @@ func namedValues(args []driver.Value) []driver.NamedValue {
1212
}
1313
return named
1414
}
15+
16+
func notWhitespace(sql string) bool {
17+
const (
18+
code = iota
19+
slash
20+
minus
21+
ccomment
22+
sqlcomment
23+
endcomment
24+
)
25+
26+
state := code
27+
for _, b := range ([]byte)(sql) {
28+
if b == 0 {
29+
break
30+
}
31+
32+
switch state {
33+
case code:
34+
switch b {
35+
case '/':
36+
state = slash
37+
case '-':
38+
state = minus
39+
case ' ', ';', '\t', '\n', '\v', '\f', '\r':
40+
continue
41+
default:
42+
return true
43+
}
44+
case slash:
45+
if b != '*' {
46+
return true
47+
}
48+
state = ccomment
49+
case minus:
50+
if b != '-' {
51+
return true
52+
}
53+
state = sqlcomment
54+
case ccomment:
55+
if b == '*' {
56+
state = endcomment
57+
}
58+
case sqlcomment:
59+
if b == '\n' {
60+
state = code
61+
}
62+
case endcomment:
63+
switch b {
64+
case '/':
65+
state = code
66+
case '*':
67+
state = endcomment
68+
default:
69+
state = ccomment
70+
}
71+
}
72+
}
73+
return state == slash || state == minus
74+
}

driver/util_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package driver
22

33
import (
4+
"context"
45
"database/sql/driver"
56
"reflect"
67
"testing"
8+
9+
_ "github.com/ncruces/go-sqlite3/embed"
10+
_ "github.com/ncruces/go-sqlite3/internal/testcfg"
711
)
812

913
func Test_namedValues(t *testing.T) {
@@ -16,3 +20,67 @@ func Test_namedValues(t *testing.T) {
1620
t.Errorf("got %v, want %v", got, want)
1721
}
1822
}
23+
24+
func Fuzz_notWhitespace(f *testing.F) {
25+
f.Add("")
26+
f.Add(" ")
27+
f.Add(";")
28+
f.Add("0")
29+
f.Add("-")
30+
f.Add("-0")
31+
f.Add("--")
32+
f.Add("--0")
33+
f.Add("--\n")
34+
f.Add("--0\n")
35+
f.Add("/0")
36+
f.Add("/*")
37+
f.Add("/*/")
38+
f.Add("/**")
39+
f.Add("/*0")
40+
f.Add("/**/")
41+
f.Add("/***/")
42+
f.Add("/**0/")
43+
f.Add("\v")
44+
f.Add(" \v")
45+
f.Add("\xf0")
46+
f.Add("\000")
47+
48+
db, err := Open(":memory:")
49+
if err != nil {
50+
f.Fatal(err)
51+
}
52+
defer db.Close()
53+
54+
f.Fuzz(func(t *testing.T, str string) {
55+
if len(str) > 128 {
56+
t.SkipNow()
57+
}
58+
59+
c, err := db.Conn(context.Background())
60+
if err != nil {
61+
t.Fatal(err)
62+
}
63+
defer c.Close()
64+
65+
c.Raw(func(driverConn any) error {
66+
conn := driverConn.(*conn).Conn
67+
stmt, tail, err := conn.Prepare(str)
68+
stmt.Close()
69+
70+
// It's hard to be bug for bug compatible with SQLite.
71+
// We settle for somewhat less:
72+
// - if SQLite reports whitespace, we must too
73+
// - if we report whitespace, SQLite must not parse a statement
74+
if notWhitespace(str) {
75+
if stmt == nil && tail == "" && err == nil {
76+
t.Errorf("was whitespace: %q", str)
77+
}
78+
} else {
79+
if stmt != nil {
80+
t.Errorf("was not whitespace: %q (%v)", str, err)
81+
}
82+
}
83+
return nil
84+
})
85+
})
86+
}

driver/whitespace.go

Lines changed: 0 additions & 61 deletions
This file was deleted.

driver/whitespace_test.go

Lines changed: 0 additions & 73 deletions
This file was deleted.

0 commit comments

Comments
 (0)