Esempio n. 1
0
            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));
            }
Esempio n. 2
0
            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()));
            }
Esempio n. 3
0
            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()));
            }
Esempio n. 4
0
            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);
            }
Esempio n. 5
0
 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)));
 }