示例#1
0
        public static ColumnType Create(string name)
        {
            if (Types.ContainsKey(name))
            {
                return((ColumnType)Activator.CreateInstance(Types[name]));
            }

            var m = FixedStringRegex.Match(name);

            if (m.Success)
            {
                return(new FixedStringColumnType(uint.Parse(m.Groups["len"].Value)));
            }
            m = NestedRegex.Match(name);
            if (m.Success)
            {
                switch (m.Groups["outer"].Value)
                {
                case "Nullable":
                    return(new NullableColumnType(Create(m.Groups["inner"].Value)));

                case "Array":
                    if (m.Groups["inner"].Value == "Null")
                    {
                        return(new ArrayColumnType(new NullableColumnType(new SimpleColumnType <byte>())));
                    }
                    return(new ArrayColumnType(Create(m.Groups["inner"].Value)));

                case "AggregateFunction":
                    //See ClickHouse\dbms\src\DataTypes\DataTypeFactory.cpp:128
                    throw new NotImplementedException($"AggregateFunction({m.Groups["inner"].Value}) column type is not supported");

                case "Nested":
                    //See ClickHouse\dbms\src\DataTypes\DataTypeFactory.cpp:189
                    throw new NotImplementedException($"Nested({m.Groups["inner"].Value}) column type is not supported");

                case "Tuple":
                {
                    var parser = new ATG.IdentList.Parser(new ATG.IdentList.Scanner(new MemoryStream(Encoding.UTF8.GetBytes(m.Groups["inner"].Value))));
                    parser.Parse();
                    if (parser.errors != null && parser.errors.count > 0)
                    {
                        throw new FormatException($"Bad enum description: {m.Groups["inner"].Value}.");
                    }
                    return(new TupleColumnType(parser.result.Select(x => Create(x))));
                }

                case "Enum8":
                case "Enum16":
                {
                    var parser = new ATG.Enums.Parser(new ATG.Enums.Scanner(new MemoryStream(Encoding.UTF8.GetBytes(m.Groups["inner"].Value))));
                    parser.Parse();
                    if (parser.errors != null && parser.errors.count > 0)
                    {
                        throw new FormatException($"Bad enum description: {m.Groups["inner"].Value}.");
                    }
                    return(new EnumColumnType(m.Groups["outer"].Value == "Enum8" ? 8 : 16, parser.result));
                }
                }
            }
            throw new NotSupportedException($"Unknown column type {name}");
        }
示例#2
0
        public static ColumnType Create(string name)
        {
            if (CaseInsensitiveTypeAliases.TryGetValue(name, out var alias))
            {
                name = alias;
            }
            if (Types.ContainsKey(name))
            {
                return((ColumnType)Activator.CreateInstance(Types[name]));
            }
            var m = FixedStringRegex.Match(name);

            if (m.Success)
            {
                return(new FixedStringColumnType(uint.Parse(m.Groups["len"].Value)));
            }
            m = DecimalRegex.Match(name);
            if (m.Success)
            {
                uint len;
                if (m.Groups["dlen"].Success)
                {
                    switch (m.Groups["dlen"].Value)
                    {
                    case "32":
                        len = 9;
                        break;

                    case "64":
                        len = 18;
                        break;

                    case "128":
                        len = 38;
                        break;

                    case "256":
                        len = 76;
                        break;

                    default:
                        throw new ClickHouseException($"Invalid Decimal bit-length {m.Groups["dlen"].Value}");
                    }
                }
                else
                {
                    len = uint.Parse(m.Groups["len"].Value);
                }

                return(new DecimalColumnType(len, uint.Parse(m.Groups["prec"].Value)));
            }

            m = DateTime64Regex.Match(name);
            if (m.Success)
            {
                return(new DateTime64ColumnType(int.Parse(m.Groups["prec"].Value), ProtocolFormatter.UnescapeStringValue(m.Groups["tz"].Value)));
            }
            m = DateTimeRegex.Match(name);
            if (m.Success)
            {
                return(new DateTimeColumnType());
            }
            m = NestedRegex.Match(name);
            if (m.Success)
            {
                switch (m.Groups["outer"].Value)
                {
                case "Nullable":
                    return(new NullableColumnType(Create(m.Groups["inner"].Value)));

                case "LowCardinality":
                    return(new LowCardinalityColumnType(Create(m.Groups["inner"].Value)));

                case "Array":
                    if (m.Groups["inner"].Value == "Null")
                    {
                        return(new ArrayColumnType(new NullableColumnType(new SimpleColumnType <byte>())));
                    }
                    return(new ArrayColumnType(Create(m.Groups["inner"].Value)));

                case "AggregateFunction":
                    //See ClickHouse\dbms\src\DataTypes\DataTypeFactory.cpp:128
                    throw new NotSupportedException($"AggregateFunction({m.Groups["inner"].Value}) column type is not supported");

                case "Nested":
                    //See ClickHouse\dbms\src\DataTypes\DataTypeFactory.cpp:189
                    throw new NotSupportedException($"Nested({m.Groups["inner"].Value}) column type is not supported");

                case "Tuple": {
                    var parser = new ATG.IdentList.Parser(new Scanner(new MemoryStream(Encoding.UTF8.GetBytes(m.Groups["inner"].Value))));
                    parser.Parse();
                    if (parser.errors != null && parser.errors.count > 0)
                    {
                        throw new FormatException($"Bad enum description: {m.Groups["inner"].Value}.");
                    }
                    return(new TupleColumnType(parser.result.Select(x => Create(x))));
                }

                case "Enum8":
                case "Enum16": {
                    var parser = new ATG.Enums.Parser(new ATG.Enums.Scanner(new MemoryStream(Encoding.UTF8.GetBytes(m.Groups["inner"].Value))));
                    parser.Parse();
                    if (parser.errors != null && parser.errors.count > 0)
                    {
                        throw new FormatException($"Bad enum description: {m.Groups["inner"].Value}.");
                    }
                    return(new EnumColumnType(m.Groups["outer"].Value == "Enum8" ? 8 : 16, parser.result));
                }
                }
            }

            throw new NotSupportedException($"Unknown column type {name}");
        }