Estado: ✅ Aceptada Fecha: 2026-05-04 Contexto: implementación de índices secundarios. Bump VERSION 3 → 4.

🧭 Contexto

Un índice secundario sobre una columna no-PK necesita mapear el valor de la columna → la lista de PKs que lo contienen. Hay dos restricciones simultáneas:

  1. La clave del B+Tree tiene que ser i64 (firma actual del módulo bptree).
  2. Los valores indexables son escalares de varios tipos: INT, TEXT, BOOL, FLOAT, DATE, DATETIME.

La opción “natural” sería usar el valor serializado como clave directa, pero eso requeriría que el B+Tree tuviera claves de longitud variable, lo cual implica un refactor mayor.

💡 Decisión

El índice secundario es un B+Tree paralelo cuya:

Layout del bucket:

[count:u16] + count × ([vlen:u16][value_bytes][pk:i64])

El bucket tolera dos casos:

  1. Colisión de hash: dos valores distintos que hashean igual. El bucket distingue por value_bytes exactos en lookup.
  2. Valores duplicados: dos filas con el mismo valor en la columna indexada. El bucket guarda ambas tuplas con sus PKs distintos.

Operaciones:

🔄 Alternativas consideradas

📊 Consecuencias

Positivas:

Negativas:

Neutras:

🔗 Referencias