Estado: ✅ Aceptada Fecha: 2026-05-29 Bloque: Y4 (tercer sub-bloque post-Y) Bump on-disk: 19 → 20

🧭 Contexto

Y2/Y3 enforcaron longitud y rango sobre los tipos ya existentes. Y4 abre una nueva familia: bytes crudos. Esto es invasivo porque implica:

DECIMAL exacto, UNSIGNED *, CHAR(n) con padding y los WITH TIME ZONE siguen diferidos.

💡 Decisión

1. Value::Bytes(Vec<u8>)

Nueva variante del enum. Cobra sentido como tipo escalar normal — viaja por todos los flujos del engine como cualquier otro valor. Las operaciones no-binarias (aritmética, comparaciones SQL ordenadas, agregados numéricos) la rechazan con type mismatch.

2. ColumnType::Blob code=10

"BLOB" | "BYTEA" | "BINARY" | "VARBINARY" => Ok(Self::Blob),

Cuatro aliases sintácticos para portar schemas de cualquier dialecto. NO stores_as_text() — usa un path de encoding propio.

3. Disk format

Bytes encoding:

[present:u8=1][len:u32 LE][bytes...]

NULL se codifica con el present=0 heredado. La diferencia con TEXT es el len:u32 (vs u16 para text-family) — los BLOBs pueden ser más grandes y consideramos que 65 535 bytes era una limitación más restrictiva de lo razonable. El upper bound práctico queda en el tamaño de página del B+Tree (~4 KB hoy), pero el encoding no impone u16.

4. Sintaxis X'hex' (estándar SQL)

Tokenizer nuevo:

if (ch == 'X' || ch == 'x') && index + 1 < chars.len() && chars[index + 1] == '\'' {
    // ... extrae hasta el siguiente '\''
    tokens.push(Token { kind: TokenKind::Blob, text: hex });
}

parse_hex_to_bytes(s) decodifica el texto del token. Acepta también prefijo 0x para uso en CAST('0xdeadbeef' AS BLOB).

5. CAST(text AS BLOB)

Acepta string hex (con o sin 0x), parsea con parse_hex_to_bytes. Sin restricción sobre tipo de origen para BytesBytes (no-op). Otros tipos → [GBY-4036].

6. Display

7. Bump 19 → 20

Necesario por el code de columna 10 en disco. V19 rechazado con [GBY-1003].

📐 Códigos de error

Código Nombre Cuándo
GBY-4122 BLOB_LITERAL_INVALID X'hex' con largo impar, char no-hex, o CAST('s' AS BLOB) con s no hex.

🚫 Limitaciones explícitas

🧪 Validación

Suite y4_* en tests/integration_test.rs (13 tests):

Suite total: 557/557 pass (cargo test --lib --tests).

🔭 Futuro