Skip to content

Commit da4574b

Browse files
Frank Guoclaude
andcommitted
fix: handle DuckDB FLOAT[] type in embedding scan
DuckDB returns FLOAT[] columns as []interface{}, not []float64. This caused nomicSearch to silently fail, falling back to 2-way scoring even when nomic embeddings existed in the index. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 38910ba commit da4574b

1 file changed

Lines changed: 30 additions & 2 deletions

File tree

cmd/rekal/cli/db/indexer.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,15 +279,43 @@ func QueryEmbeddings(d *sql.DB, model string) (map[string][]float64, error) {
279279
result := make(map[string][]float64)
280280
for rows.Next() {
281281
var sid string
282-
var emb []float64
283-
if err := rows.Scan(&sid, &emb); err != nil {
282+
var raw interface{}
283+
if err := rows.Scan(&sid, &raw); err != nil {
284284
return nil, fmt.Errorf("scan embedding: %w", err)
285285
}
286+
emb, err := toFloat64Slice(raw)
287+
if err != nil {
288+
return nil, fmt.Errorf("convert embedding for %s: %w", sid, err)
289+
}
286290
result[sid] = emb
287291
}
288292
return result, rows.Err()
289293
}
290294

295+
// toFloat64Slice converts a DuckDB FLOAT[] result (returned as []interface{})
296+
// into a []float64.
297+
func toFloat64Slice(v interface{}) ([]float64, error) {
298+
switch arr := v.(type) {
299+
case []float64:
300+
return arr, nil
301+
case []interface{}:
302+
out := make([]float64, len(arr))
303+
for i, elem := range arr {
304+
switch n := elem.(type) {
305+
case float64:
306+
out[i] = n
307+
case float32:
308+
out[i] = float64(n)
309+
default:
310+
return nil, fmt.Errorf("unexpected element type %T at index %d", elem, i)
311+
}
312+
}
313+
return out, nil
314+
default:
315+
return nil, fmt.Errorf("unexpected embedding type %T", v)
316+
}
317+
}
318+
291319
// PopulateIndexIncremental adds new sessions to the index without a full rebuild.
292320
// sessionIDs are the newly captured sessions. checkpointID is the new checkpoint.
293321
func PopulateIndexIncremental(d *sql.DB, gitRoot string, sessionIDs []string, checkpointID string) error {

0 commit comments

Comments
 (0)