public async ValueTask <BlockHeader> SkipTable(ServerDataMessage dataMessage, bool async, CancellationToken cancellationToken) { var withDecompression = dataMessage.MessageCode != ServerMessageCode.ProfileEvents; var result = await WithCancellationToken(cancellationToken, ct => ReadTable(withDecompression, (typeInfo, rowCount) => typeInfo.CreateSkippingColumnReader(rowCount), null, async, ct)); return(new BlockHeader(dataMessage.TempTableName, result.columnInfos.AsReadOnly(), result.rowCount)); }
public async ValueTask <ClickHouseTable> ReadTable(ServerDataMessage dataMessage, IReadOnlyList <ClickHouseColumnSettings?>?columnSettings, bool async, CancellationToken cancellationToken) { var withDecompression = dataMessage.MessageCode != ServerMessageCode.ProfileEvents; var result = await WithCancellationToken( cancellationToken, ct => ReadTable( withDecompression, (typeInfo, rowCount) => typeInfo.CreateColumnReader(rowCount), (columnInfo, reader, index) => ReadTableColumn(columnInfo, reader, columnSettings == null || columnSettings.Count <= index ? null : columnSettings[index]), async, ct) ); Debug.Assert(result.columns != null); var blockHeader = new BlockHeader(dataMessage.TempTableName, result.columnInfos.AsReadOnly(), result.rowCount); return(new ClickHouseTable(blockHeader, result.columns.AsReadOnly())); }
private async ValueTask <ClickHouseTable> ReadTable(ServerDataMessage dataMessage, IReadOnlyList <ClickHouseColumnSettings?>?columnSettings, bool skip, bool async, CancellationToken cancellationToken) { CheckDisposed(); var compression = _client._settings.Compress ? CompressionAlgorithm.Lz4 : CompressionAlgorithm.None; var reader = _client._reader; reader.BeginDecompress(compression); int blockFieldCode; bool isOverflows = false; // It seems that this value is used only for internal purposes and does not affect the format of the block int bucketNum = -1; do { blockFieldCode = await reader.Read7BitInt32(async, cancellationToken); switch (blockFieldCode) { case BlockFieldCodes.IsOverflows: isOverflows = await reader.ReadBool(async, cancellationToken); break; case BlockFieldCodes.BucketNum: bucketNum = await reader.ReadInt32(async, cancellationToken); break; case BlockFieldCodes.End: break; default: throw new ClickHouseException(ClickHouseErrorCodes.ProtocolUnexpectedResponse, $"Internal error. Unexpected block field code (0x{blockFieldCode:X}) received from the server."); } } while (blockFieldCode != BlockFieldCodes.End); var columnCount = await reader.Read7BitInt32(async, cancellationToken); var rowCount = await reader.Read7BitInt32(async, cancellationToken); if (isOverflows) { throw new NotImplementedException("TODO: implement support for is_overflows."); } var columnInfos = new List <ColumnInfo>(columnCount); var columns = new List <IClickHouseTableColumn>(columnCount); for (int i = 0; i < columnCount; i++) { var columnName = await reader.ReadString(async, cancellationToken); var columnTypeName = await reader.ReadString(async, cancellationToken); var columnType = _client.TypeInfoProvider.GetTypeInfo(columnTypeName); columnInfos.Add(new ColumnInfo(columnName, columnType)); var columnRowCount = rowCount; var columnReader = columnType.CreateColumnReader(skip ? 0 : columnRowCount); object?skipContext = null; while (columnRowCount > 0) { SequenceSize sequenceSize; if (skip) { sequenceSize = await reader.ReadRaw(seq => columnReader.Skip(seq, columnRowCount, ref skipContext), async, cancellationToken); } else { sequenceSize = await reader.ReadRaw(columnReader.ReadNext, async, cancellationToken); } if (sequenceSize.Elements < 0) { throw new InvalidOperationException("The number of elements must be greater than zero."); } if (sequenceSize.Elements > columnRowCount) { throw new InvalidOperationException($"The number of rows in the column \"{columnName}\" is greater than the number of rows in the table."); } if (sequenceSize.Elements < columnRowCount) { await reader.Advance(async, cancellationToken); } columnRowCount -= sequenceSize.Elements; } var settings = columnSettings == null || columnSettings.Count <= i ? null : columnSettings[i]; var column = columnReader.EndRead(settings); columns.Add(column); } reader.EndDecompress(); var blockHeader = new BlockHeader(dataMessage.TempTableName, columnInfos.AsReadOnly(), rowCount); return(new ClickHouseTable(blockHeader, columns.AsReadOnly())); }
public async ValueTask <BlockHeader> SkipTable(ServerDataMessage dataMessage, bool async, CancellationToken cancellationToken) { var table = await WithCancellationToken(cancellationToken, ct => ReadTable(dataMessage, null, true, async, ct)); return(table.Header); }
public async ValueTask <ClickHouseTable> ReadTable(ServerDataMessage dataMessage, IReadOnlyList <ClickHouseColumnSettings?>?columnSettings, bool async, CancellationToken cancellationToken) { return(await WithCancellationToken(cancellationToken, ct => ReadTable(dataMessage, columnSettings, false, async, ct))); }