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}"); }
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}"); }