public void Handshake(ClickHouseConnectionSettings connectionSettings) { _connectionSettings = connectionSettings; _compressor = connectionSettings.Compress ? Compressor.Create(connectionSettings) : null; WriteUInt((int)ClientMessageType.Hello); WriteString(string.IsNullOrEmpty(connectionSettings.ClientName) ? ClientInfo.ClientName : connectionSettings.ClientName); WriteUInt(ClientInfo.ClientVersionMajor); WriteUInt(ClientInfo.ClientVersionMinor); WriteUInt(ClientInfo.ClientRevision); WriteString(connectionSettings.Database); WriteString(connectionSettings.User); WriteString(connectionSettings.Password); _ioStream.Flush(); var serverHello = ReadUInt(); if (serverHello == (int)ServerMessageType.Hello) { var serverName = ReadString(); var serverMajor = ReadUInt(); var serverMinor = ReadUInt(); var serverBuild = ReadUInt(); string serverTz = null, serverDn = null; ulong serverPatch = 0; if (serverBuild >= ProtocolCaps.DbmsMinRevisionWithServerTimezone) { serverTz = ReadString(); } if (serverBuild >= ProtocolCaps.DbmsMinRevisionWithServerDisplayName) { serverDn = ReadString(); } if (serverBuild >= ProtocolCaps.DbmsMinRevisionWithServerVersionPatch) { serverPatch = (uint)ReadUInt(); } ServerInfo = new ServerInfo { Build = serverBuild, Major = serverMajor, Minor = serverMinor, Name = serverName, Timezone = serverTz, Patch = (long)serverPatch, DisplayName = serverDn }; } else if (serverHello == (int)ServerMessageType.Exception) { _owner.MaybeSetBroken(null); ReadAndThrowException(); } else { _owner.MaybeSetBroken(null); throw new FormatException($"Bad message type {serverHello:X} received from server."); } }