aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrittneje <rittneje@gmail.com>2020-08-25 14:22:54 -0400
committerGitHub <noreply@github.com>2020-08-26 03:22:54 +0900
commit59d4145b7f3b3f5ced1a0ac0570eeaab5b0be76b (patch)
tree0402ceb1ce4ae9cb0b7c82a1e78ad1649f22c475
parentcoveralls to codecov (#845) (diff)
downloadgolite-59d4145b7f3b3f5ced1a0ac0570eeaab5b0be76b.tar.gz
golite-59d4145b7f3b3f5ced1a0ac0570eeaab5b0be76b.tar.xz
treat vtable C arrays as Go slices rather than giant Go arrays (#840)
-rw-r--r--sqlite3_opt_vtable.go32
1 files changed, 21 insertions, 11 deletions
diff --git a/sqlite3_opt_vtable.go b/sqlite3_opt_vtable.go
index 50c9429..1af1c60 100644
--- a/sqlite3_opt_vtable.go
+++ b/sqlite3_opt_vtable.go
@@ -288,10 +288,13 @@ type InfoOrderBy struct {
}
func constraints(info *C.sqlite3_index_info) []InfoConstraint {
- l := info.nConstraint
- slice := (*[1 << 30]C.struct_sqlite3_index_constraint)(unsafe.Pointer(info.aConstraint))[:l:l]
+ slice := *(*[]C.struct_sqlite3_index_constraint)(unsafe.Pointer(&reflect.SliceHeader{
+ Data: uintptr(unsafe.Pointer(info.aConstraint)),
+ Len: int(info.nConstraint),
+ Cap: int(info.nConstraint),
+ }))
- cst := make([]InfoConstraint, 0, l)
+ cst := make([]InfoConstraint, 0, len(slice))
for _, c := range slice {
var usable bool
if c.usable > 0 {
@@ -307,10 +310,13 @@ func constraints(info *C.sqlite3_index_info) []InfoConstraint {
}
func orderBys(info *C.sqlite3_index_info) []InfoOrderBy {
- l := info.nOrderBy
- slice := (*[1 << 30]C.struct_sqlite3_index_orderby)(unsafe.Pointer(info.aOrderBy))[:l:l]
+ slice := *(*[]C.struct_sqlite3_index_orderby)(unsafe.Pointer(&reflect.SliceHeader{
+ Data: uintptr(unsafe.Pointer(info.aOrderBy)),
+ Len: int(info.nOrderBy),
+ Cap: int(info.nOrderBy),
+ }))
- ob := make([]InfoOrderBy, 0, l)
+ ob := make([]InfoOrderBy, 0, len(slice))
for _, c := range slice {
var desc bool
if c.desc > 0 {
@@ -418,13 +424,17 @@ func goVBestIndex(pVTab unsafe.Pointer, icp unsafe.Pointer) *C.char {
}
// Get a pointer to constraint_usage struct so we can update in place.
- l := info.nConstraint
- s := (*[1 << 30]C.struct_sqlite3_index_constraint_usage)(unsafe.Pointer(info.aConstraintUsage))[:l:l]
+
+ slice := *(*[]C.struct_sqlite3_index_constraint_usage)(unsafe.Pointer(&reflect.SliceHeader{
+ Data: uintptr(unsafe.Pointer(info.aConstraintUsage)),
+ Len: int(info.nConstraint),
+ Cap: int(info.nConstraint),
+ }))
index := 1
- for i := C.int(0); i < info.nConstraint; i++ {
+ for i := range slice {
if res.Used[i] {
- s[i].argvIndex = C.int(index)
- s[i].omit = C.uchar(1)
+ slice[i].argvIndex = C.int(index)
+ slice[i].omit = C.uchar(1)
index++
}
}