@@ -12,6 +12,7 @@ import (
1212 "fmt"
1313 "os"
1414 "reflect"
15+ "runtime"
1516 "strconv"
1617 "unsafe"
1718)
@@ -50,8 +51,14 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
5051
5152 var ret C.int32_t
5253 // Convert domain to type then to void*
54+ // Use domainPtr to ensure cdomain is not collected before it is passed to tiledb.
55+ var domainPtr any
56+ defer runtime .KeepAlive (domainPtr )
5357 var cdomain unsafe.Pointer
5458 // Convert extent to type then to void*
59+ // Use extentPtr to ensure cdomain is not collected before it is passed to tiledb.
60+ var extentPtr any
61+ defer runtime .KeepAlive (extentPtr )
5562 var cextent unsafe.Pointer
5663 // Switch on datatype type to create void* for domain and extent.
5764 // Extent has already checked to be same type as domain so this is safe
@@ -63,9 +70,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
6370 }
6471 // Create domain void*
6572 tmpDomain := domain .([]int8 )
73+ domainPtr = & tmpDomain
6674 cdomain = unsafe .Pointer (& tmpDomain [0 ])
6775 // Create extent void*
68- tmpExtent := (extent .(int8 ))
76+ tmpExtent := extent .(int8 )
77+ extentPtr = & tmpExtent
6978 cextent = unsafe .Pointer (& tmpExtent )
7079 case TILEDB_INT16 :
7180 if domainType != reflect .Int16 {
@@ -74,9 +83,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
7483 }
7584 // Create domain void*
7685 tmpDomain := domain .([]int16 )
86+ domainPtr = & tmpDomain
7787 cdomain = unsafe .Pointer (& tmpDomain [0 ])
7888 // Create extent void*
79- tmpExtent := (extent .(int16 ))
89+ tmpExtent := extent .(int16 )
90+ extentPtr = & tmpExtent
8091 cextent = unsafe .Pointer (& tmpExtent )
8192 case TILEDB_INT32 :
8293 if domainType != reflect .Int32 && domainType != reflect .Int {
@@ -90,9 +101,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
90101 }
91102 // Create domain void*
92103 tmpDomain := domain .([]int32 )
104+ domainPtr = & tmpDomain
93105 cdomain = unsafe .Pointer (& tmpDomain [0 ])
94106 // Create extent void*
95- tmpExtent := (extent .(int32 ))
107+ tmpExtent := extent .(int32 )
108+ extentPtr = & tmpExtent
96109 cextent = unsafe .Pointer (& tmpExtent )
97110 case TILEDB_INT64 , TILEDB_DATETIME_YEAR , TILEDB_DATETIME_MONTH , TILEDB_DATETIME_WEEK , TILEDB_DATETIME_DAY , TILEDB_DATETIME_HR , TILEDB_DATETIME_MIN , TILEDB_DATETIME_SEC , TILEDB_DATETIME_MS , TILEDB_DATETIME_US , TILEDB_DATETIME_NS , TILEDB_DATETIME_PS , TILEDB_DATETIME_FS , TILEDB_DATETIME_AS , TILEDB_TIME_HR , TILEDB_TIME_MIN , TILEDB_TIME_SEC , TILEDB_TIME_MS , TILEDB_TIME_US , TILEDB_TIME_NS , TILEDB_TIME_PS , TILEDB_TIME_FS , TILEDB_TIME_AS :
98111 if domainType != reflect .Int64 && domainType != reflect .Int {
@@ -106,9 +119,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
106119 }
107120 // Create domain void*
108121 tmpDomain := domain .([]int64 )
122+ domainPtr = & tmpDomain
109123 cdomain = unsafe .Pointer (& tmpDomain [0 ])
110124 // Create extent void*
111- tmpExtent := (extent .(int64 ))
125+ tmpExtent := extent .(int64 )
126+ extentPtr = & tmpExtent
112127 cextent = unsafe .Pointer (& tmpExtent )
113128 case TILEDB_UINT8 :
114129 if domainType != reflect .Uint8 {
@@ -117,9 +132,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
117132 }
118133 // Create domain void*
119134 tmpDomain := domain .([]uint8 )
135+ domainPtr = & tmpDomain
120136 cdomain = unsafe .Pointer (& tmpDomain [0 ])
121137 // Create extent void*
122- tmpExtent := (extent .(uint8 ))
138+ tmpExtent := extent .(uint8 )
139+ extentPtr = & tmpExtent
123140 cextent = unsafe .Pointer (& tmpExtent )
124141 case TILEDB_UINT16 :
125142 if domainType != reflect .Uint16 {
@@ -128,9 +145,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
128145 }
129146 // Create domain void*
130147 tmpDomain := domain .([]uint16 )
148+ domainPtr = & tmpDomain
131149 cdomain = unsafe .Pointer (& tmpDomain [0 ])
132150 // Create extent void*
133- tmpExtent := (extent .(uint16 ))
151+ tmpExtent := extent .(uint16 )
152+ extentPtr = & tmpExtent
134153 cextent = unsafe .Pointer (& tmpExtent )
135154 case TILEDB_UINT32 :
136155 if domainType != reflect .Uint32 && domainType != reflect .Uint {
@@ -144,9 +163,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
144163 }
145164 // Create domain void*
146165 tmpDomain := domain .([]uint32 )
166+ domainPtr = & tmpDomain
147167 cdomain = unsafe .Pointer (& tmpDomain [0 ])
148168 // Create extent void*
149- tmpExtent := (extent .(uint32 ))
169+ tmpExtent := extent .(uint32 )
170+ extentPtr = & tmpExtent
150171 cextent = unsafe .Pointer (& tmpExtent )
151172 case TILEDB_UINT64 :
152173 if domainType != reflect .Uint64 && domainType != reflect .Uint {
@@ -160,9 +181,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
160181 }
161182 // Create domain void*
162183 tmpDomain := domain .([]uint64 )
184+ domainPtr = & tmpDomain
163185 cdomain = unsafe .Pointer (& tmpDomain [0 ])
164186 // Create extent void*
165- tmpExtent := (extent .(uint64 ))
187+ tmpExtent := extent .(uint64 )
188+ extentPtr = & tmpExtent
166189 cextent = unsafe .Pointer (& tmpExtent )
167190 case TILEDB_FLOAT32 :
168191 if domainType != reflect .Float32 {
@@ -171,9 +194,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
171194 }
172195 // Create domain void*
173196 tmpDomain := domain .([]float32 )
197+ domainPtr = & tmpDomain
174198 cdomain = unsafe .Pointer (& tmpDomain [0 ])
175199 // Create extent void*
176- tmpExtent := (extent .(float32 ))
200+ tmpExtent := extent .(float32 )
201+ extentPtr = & tmpExtent
177202 cextent = unsafe .Pointer (& tmpExtent )
178203 case TILEDB_FLOAT64 :
179204 if domainType != reflect .Float64 {
@@ -182,9 +207,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
182207 }
183208 // Create domain void*
184209 tmpDomain := domain .([]float64 )
210+ domainPtr = & tmpDomain
185211 cdomain = unsafe .Pointer (& tmpDomain [0 ])
186212 // Create extent void*
187- tmpExtent := (extent .(float64 ))
213+ tmpExtent := extent .(float64 )
214+ extentPtr = & tmpExtent
188215 cextent = unsafe .Pointer (& tmpExtent )
189216 case TILEDB_BOOL :
190217 if domainType != reflect .Bool {
@@ -193,9 +220,11 @@ func NewDimension(context *Context, name string, datatype Datatype, domain inter
193220 }
194221 // Create domain void*
195222 tmpDomain := domain .([]bool )
223+ domainPtr = & tmpDomain
196224 cdomain = unsafe .Pointer (& tmpDomain [0 ])
197225 // Create extent void*
198- tmpExtent := (extent .(bool ))
226+ tmpExtent := extent .(bool )
227+ extentPtr = & tmpExtent
199228 cextent = unsafe .Pointer (& tmpExtent )
200229 default :
201230 return nil , fmt .Errorf ("Unrecognized datatype passed: %s" , datatype .String ())
0 commit comments