import struct from clickhouse_connect.driver.types import ByteSource class ByteArraySource(ByteSource): """ ByteSource implementation for in-memory byte arrays. This class wraps a byte array and provides the ByteSource interface, allowing ClickHouse type decoders to read from in-memory data instead of a network stream. Used primarily for decoding variant-encoded values from JSON shared data where each value is a complete serialized type instance. """ def __init__(self, data: bytes, encoding: str = "utf-8"): self.data = data self.pos = 0 self.encoding = encoding def read_byte(self) -> int: if self.pos >= len(self.data): raise EOFError("Attempted to read past end of byte array") b = self.data[self.pos] self.pos += 1 return b def read_bytes(self, sz: int) -> bytes: if self.pos + sz > len(self.data): raise EOFError(f"Attempted to read {sz} bytes, only {len(self.data) - self.pos} available") result = self.data[self.pos : self.pos + sz] self.pos += sz return result def read_leb128(self) -> int: sz = 0 shift = 0 while self.pos < len(self.data): b = self.read_byte() sz += (b & 0x7F) << shift if (b & 0x80) == 0: return sz shift += 7 raise EOFError("Unexpected end while reading LEB128") def read_leb128_str(self) -> str: sz = self.read_leb128() return self.read_bytes(sz).decode(self.encoding) def read_uint64(self) -> int: return int.from_bytes(self.read_bytes(8), "little", signed=False) def read_int64(self) -> int: return int.from_bytes(self.read_bytes(8), "little", signed=True) def read_uint32(self) -> int: return int.from_bytes(self.read_bytes(4), "little", signed=False) def read_int32(self) -> int: return int.from_bytes(self.read_bytes(4), "little", signed=True) def read_uint16(self) -> int: return int.from_bytes(self.read_bytes(2), "little", signed=False) def read_int16(self) -> int: return int.from_bytes(self.read_bytes(2), "little", signed=True) def read_float32(self) -> float: return struct.unpack(" float: return struct.unpack("