Skip to content

Commit 1ed954e

Browse files
committed
Fix #243.
1 parent 9e7a0a8 commit 1ed954e

File tree

3 files changed

+53
-32
lines changed

3 files changed

+53
-32
lines changed

ext/regexp/regexp.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -111,22 +111,24 @@ loop2:
111111
return glob.String()
112112
}
113113

114-
func load(ctx sqlite3.Context, i int, expr string) (*regexp.Regexp, error) {
114+
func load(ctx sqlite3.Context, arg []sqlite3.Value, i int) (*regexp.Regexp, error) {
115115
re, ok := ctx.GetAuxData(i).(*regexp.Regexp)
116116
if !ok {
117-
r, err := regexp.Compile(expr)
118-
if err != nil {
119-
return nil, err
117+
re, ok = arg[i].Pointer().(*regexp.Regexp)
118+
if !ok {
119+
r, err := regexp.Compile(arg[i].Text())
120+
if err != nil {
121+
return nil, err
122+
}
123+
re = r
120124
}
121-
re = r
122-
ctx.SetAuxData(0, r)
125+
ctx.SetAuxData(i, re)
123126
}
124127
return re, nil
125128
}
126129

127130
func regex(ctx sqlite3.Context, arg ...sqlite3.Value) {
128-
_ = arg[1] // bounds check
129-
re, err := load(ctx, 0, arg[0].Text())
131+
re, err := load(ctx, arg, 0)
130132
if err != nil {
131133
ctx.ResultError(err)
132134
return // notest
@@ -136,18 +138,17 @@ func regex(ctx sqlite3.Context, arg ...sqlite3.Value) {
136138
}
137139

138140
func regexLike(ctx sqlite3.Context, arg ...sqlite3.Value) {
139-
re, err := load(ctx, 1, arg[1].Text())
141+
re, err := load(ctx, arg, 1)
140142
if err != nil {
141143
ctx.ResultError(err)
142144
return // notest
143145
}
144-
145146
text := arg[0].RawText()
146147
ctx.ResultBool(re.Match(text))
147148
}
148149

149150
func regexCount(ctx sqlite3.Context, arg ...sqlite3.Value) {
150-
re, err := load(ctx, 1, arg[1].Text())
151+
re, err := load(ctx, arg, 1)
151152
if err != nil {
152153
ctx.ResultError(err)
153154
return // notest
@@ -162,7 +163,7 @@ func regexCount(ctx sqlite3.Context, arg ...sqlite3.Value) {
162163
}
163164

164165
func regexSubstr(ctx sqlite3.Context, arg ...sqlite3.Value) {
165-
re, err := load(ctx, 1, arg[1].Text())
166+
re, err := load(ctx, arg, 1)
166167
if err != nil {
167168
ctx.ResultError(err)
168169
return // notest
@@ -187,7 +188,7 @@ func regexSubstr(ctx sqlite3.Context, arg ...sqlite3.Value) {
187188
}
188189

189190
func regexInstr(ctx sqlite3.Context, arg ...sqlite3.Value) {
190-
re, err := load(ctx, 1, arg[1].Text())
191+
re, err := load(ctx, arg, 1)
191192
if err != nil {
192193
ctx.ResultError(err)
193194
return // notest
@@ -215,16 +216,14 @@ func regexInstr(ctx sqlite3.Context, arg ...sqlite3.Value) {
215216
}
216217

217218
func regexReplace(ctx sqlite3.Context, arg ...sqlite3.Value) {
218-
_ = arg[2] // bounds check
219-
220-
re, err := load(ctx, 1, arg[1].Text())
219+
re, err := load(ctx, arg, 1)
221220
if err != nil {
222221
ctx.ResultError(err)
223222
return // notest
224223
}
225224

226-
text := arg[0].RawText()
227225
repl := arg[2].RawText()
226+
text := arg[0].RawText()
228227
var pos, n int
229228
if len(arg) > 3 {
230229
pos = arg[3].Int()

ext/regexp/regexp_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77
"testing"
88

9+
"github.com/ncruces/go-sqlite3"
910
"github.com/ncruces/go-sqlite3/driver"
1011
_ "github.com/ncruces/go-sqlite3/embed"
1112
_ "github.com/ncruces/go-sqlite3/internal/testcfg"
@@ -104,6 +105,27 @@ func TestRegister_errors(t *testing.T) {
104105
}
105106
}
106107

108+
func TestRegister_pointer(t *testing.T) {
109+
t.Parallel()
110+
tmp := memdb.TestDB(t)
111+
112+
db, err := driver.Open(tmp, Register)
113+
if err != nil {
114+
t.Fatal(err)
115+
}
116+
defer db.Close()
117+
118+
var got int
119+
err = db.QueryRow(`SELECT regexp_count('ABCABCAXYaxy', ?, 1)`,
120+
sqlite3.Pointer(regexp.MustCompile(`(?i)A.`))).Scan(&got)
121+
if err != nil {
122+
t.Fatal(err)
123+
}
124+
if got != 4 {
125+
t.Errorf("got %d, want %d", got, 4)
126+
}
127+
}
128+
107129
func TestGlobPrefix(t *testing.T) {
108130
tests := []struct {
109131
re string

ext/unicode/unicode.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,8 @@ func upper(ctx sqlite3.Context, arg ...sqlite3.Value) {
113113
ctx.ResultError(err)
114114
return // notest
115115
}
116-
c := cases.Upper(t)
117-
ctx.SetAuxData(1, c)
118-
cs = c
116+
cs = cases.Upper(t)
117+
ctx.SetAuxData(1, cs)
119118
}
120119
ctx.ResultRawText(cs.Bytes(arg[0].RawText()))
121120
}
@@ -132,9 +131,8 @@ func lower(ctx sqlite3.Context, arg ...sqlite3.Value) {
132131
ctx.ResultError(err)
133132
return // notest
134133
}
135-
c := cases.Lower(t)
136-
ctx.SetAuxData(1, c)
137-
cs = c
134+
cs = cases.Lower(t)
135+
ctx.SetAuxData(1, cs)
138136
}
139137
ctx.ResultRawText(cs.Bytes(arg[0].RawText()))
140138
}
@@ -151,9 +149,8 @@ func initcap(ctx sqlite3.Context, arg ...sqlite3.Value) {
151149
ctx.ResultError(err)
152150
return // notest
153151
}
154-
c := cases.Title(t)
155-
ctx.SetAuxData(1, c)
156-
cs = c
152+
cs = cases.Title(t)
153+
ctx.SetAuxData(1, cs)
157154
}
158155
ctx.ResultRawText(cs.Bytes(arg[0].RawText()))
159156
}
@@ -200,13 +197,16 @@ func normalize(ctx sqlite3.Context, arg ...sqlite3.Value) {
200197
func regex(ctx sqlite3.Context, arg ...sqlite3.Value) {
201198
re, ok := ctx.GetAuxData(0).(*regexp.Regexp)
202199
if !ok {
203-
r, err := regexp.Compile(arg[0].Text())
204-
if err != nil {
205-
ctx.ResultError(err)
206-
return // notest
200+
re, ok = arg[0].Pointer().(*regexp.Regexp)
201+
if !ok {
202+
r, err := regexp.Compile(arg[0].Text())
203+
if err != nil {
204+
ctx.ResultError(err)
205+
return // notest
206+
}
207+
re = r
207208
}
208-
re = r
209-
ctx.SetAuxData(0, r)
209+
ctx.SetAuxData(0, re)
210210
}
211211
ctx.ResultBool(re.Match(arg[1].RawText()))
212212
}

0 commit comments

Comments
 (0)