Skip to content

Commit 7e4ec1d

Browse files
committed
Fix #299.
1 parent 2c582a1 commit 7e4ec1d

File tree

2 files changed

+52
-14
lines changed

2 files changed

+52
-14
lines changed

ext/zorder/zorder.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,25 @@ func Register(db *sqlite3.Conn) error {
1919
}
2020

2121
func zorder(ctx sqlite3.Context, arg ...sqlite3.Value) {
22-
var x [63]int64
23-
if len(arg) > len(x) {
24-
ctx.ResultError(util.ErrorString("zorder: too many parameters"))
22+
var x [24]int64
23+
if n := len(arg); n < 2 || n > 24 {
24+
ctx.ResultError(util.ErrorString("zorder: needs between 2 and 24 dimensions"))
2525
return
2626
}
2727
for i := range arg {
2828
x[i] = arg[i].Int64()
2929
}
3030

3131
var z int64
32-
if len(arg) > 0 {
33-
for i := range x {
34-
j := i % len(arg)
35-
z |= (x[j] & 1) << i
36-
x[j] >>= 1
37-
}
32+
for i := range 63 {
33+
j := i % len(arg)
34+
z |= (x[j] & 1) << i
35+
x[j] >>= 1
3836
}
3937

4038
for i := range arg {
4139
if x[i] != 0 {
42-
ctx.ResultError(util.ErrorString("zorder: parameter too large"))
40+
ctx.ResultError(util.ErrorString("zorder: argument out of range"))
4341
return
4442
}
4543
}
@@ -51,6 +49,19 @@ func unzorder(ctx sqlite3.Context, arg ...sqlite3.Value) {
5149
n := arg[1].Int64()
5250
z := arg[0].Int64()
5351

52+
if n < 2 || n > 24 {
53+
ctx.ResultError(util.ErrorString("unzorder: needs between 2 and 24 dimensions"))
54+
return
55+
}
56+
if i < 0 || i >= n {
57+
ctx.ResultError(util.ErrorString("unzorder: index out of range"))
58+
return
59+
}
60+
if z < 0 {
61+
ctx.ResultError(util.ErrorString("unzorder: argument out of range"))
62+
return
63+
}
64+
5465
var k int
5566
var x int64
5667
for j := i; j < 63; j += n {

ext/zorder/zorder_test.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"github.com/ncruces/go-sqlite3/vfs/memdb"
1313
)
1414

15-
func TestRegister_zorder(t *testing.T) {
15+
func Test_zorder(t *testing.T) {
1616
t.Parallel()
1717
tmp := memdb.TestDB(t)
1818

@@ -57,7 +57,7 @@ func TestRegister_zorder(t *testing.T) {
5757
}
5858
}
5959

60-
func TestRegister_unzorder(t *testing.T) {
60+
func Test_unzorder(t *testing.T) {
6161
t.Parallel()
6262
tmp := memdb.TestDB(t)
6363

@@ -85,7 +85,7 @@ func TestRegister_unzorder(t *testing.T) {
8585
}
8686
}
8787

88-
func TestRegister_error(t *testing.T) {
88+
func Test_zorder_error(t *testing.T) {
8989
t.Parallel()
9090
tmp := memdb.TestDB(t)
9191

@@ -103,7 +103,7 @@ func TestRegister_error(t *testing.T) {
103103

104104
var buf strings.Builder
105105
buf.WriteString("SELECT zorder(0")
106-
for i := 1; i < 80; i++ {
106+
for i := 1; i < 25; i++ {
107107
buf.WriteByte(',')
108108
buf.WriteString(strconv.Itoa(0))
109109
}
@@ -113,3 +113,30 @@ func TestRegister_error(t *testing.T) {
113113
t.Error("want error")
114114
}
115115
}
116+
117+
func Test_unzorder_error(t *testing.T) {
118+
t.Parallel()
119+
tmp := memdb.TestDB(t)
120+
121+
db, err := driver.Open(tmp, zorder.Register)
122+
if err != nil {
123+
t.Fatal(err)
124+
}
125+
defer db.Close()
126+
127+
var got int64
128+
err = db.QueryRow(`SELECT unzorder(-1, 2, 0)`).Scan(&got)
129+
if err == nil {
130+
t.Error("want error")
131+
}
132+
133+
err = db.QueryRow(`SELECT unzorder(0, 2, 2)`).Scan(&got)
134+
if err == nil {
135+
t.Error("want error")
136+
}
137+
138+
err = db.QueryRow(`SELECT unzorder(0, 25, 2)`).Scan(&got)
139+
if err == nil {
140+
t.Error("want error")
141+
}
142+
}

0 commit comments

Comments
 (0)