Expand description
Colunas ARRAY do SQL (op_get_slice / op_put_slice / op_slice).
Um ARRAY do Firebird é armazenado como um blob especial: numa linha a coluna
chega como um id de 8 bytes (Value::Array), igual a um blob. Para ler ou
escrever os elementos é preciso descrever a fatia com a SDL (Slice
Description Language) — um pequeno bytecode que diz o tipo do elemento, a
relação/campo e os limites de cada dimensão.
§Fluxo
Connection::array_descconsultaRDB$RELATION_FIELDS/RDB$FIELDS/RDB$FIELD_DIMENSIONSe monta umArrayDesc(tipo BLR do elemento, tamanho, escala, dimensões).Connection::read_arrayenviaop_get_slice(id + SDL) e decodifica a respostaop_slicenumVec<Value>(um por elemento, em ordem).Connection::write_arrayenviaop_put_slice(SDL + dados) e devolve o id do novo array, que então vai comoValue::Arraynum INSERT/UPDATE.
§Codificação na transmissão (wire)
A op_slice traz p_slr_length (tamanho da fatia na representação do
cliente = nº de elementos × stride) seguido do comprimento XDR e dos dados.
Cada elemento é serializado por xdr_datum: tipos de largura fixa vão como
inteiros XDR (4 ou 8 bytes); VARYING vai como comprimento(4 B) + bytes + padding até 4; TEXT como bytes + padding até 4. O nº de elementos é
p_slr_length / stride — derivamos o stride do ArrayDesc, pois o
comprimento XDR reportado é o tamanho lógico, não a contagem de bytes na rede.
Structs§
- Array
Desc - Descreve uma coluna ARRAY: o tipo do elemento e as dimensões. Obtido por
Connection::array_desc; consumido porConnection::read_array/Connection::write_arraypara montar a SDL. - Dimension
- Os limites (inferior, superior) de uma dimensão de array, ambos inclusivos.