func ColumnInfoFromContext(ctx context.Context) (ColumnInfo, bool) {
	info, ok := ctx.Value(columnInfoKey{}).(ColumnInfo)
	return info, ok
}
ColumnInfoFromContext return ColumnInfo and true if was assigned, otherwise empty ColumnInfo and false
package base
import (
	"context"
	"github.com/sirupsen/logrus"
)
type ColumnInfo interface {
	Index() int
	Alias() string
}
type columnInfo struct {
	index int
	alias string
}
func (info columnInfo) Index() int {
	return info.index
}
func (info columnInfo) Alias() string {
	return info.alias
}
func NewColumnInfo(index int, alias string) ColumnInfo {
	return columnInfo{index: index, alias: alias}
}
type columnInfoKey struct{}
func NewContextWithColumnInfo(ctx context.Context, info ColumnInfo) context.Context {
	return context.WithValue(ctx, columnInfoKey{}, info)
}
type clientZoneInfo struct {
	clientID []byte
	zoneID   []byte
	withZone bool
}
func (info clientZoneInfo) ClientID() []byte {
	return info.clientID
}
func (info clientZoneInfo) ZoneID() []byte {
	return info.zoneID
}
func (info clientZoneInfo) WithZone() bool {
	return info.withZone
}
type ClientZoneInfo interface {
	ClientID() []byte
	ZoneID() []byte
	WithZone() bool
}
func NewClientZoneInfo(clientID, zoneID []byte, withZone bool) ClientZoneInfo {
	return clientZoneInfo{
		clientID: clientID,
		zoneID:   zoneID,
		withZone: withZone,
	}
}
type clientZoneInfoKey struct{}
func NewContextWithClientZoneInfo(ctx context.Context, clientID, zoneID []byte, withZone bool) context.Context {
	return context.WithValue(ctx, clientZoneInfoKey{}, NewClientZoneInfo(clientID, zoneID, withZone))
}
func ClientZoneInfoFromContext(ctx context.Context) (ClientZoneInfo, bool) {
	v, ok := ctx.Value(clientZoneInfoKey{}).(ClientZoneInfo)
	return v, ok
}