@@ -188,6 +188,12 @@ enum PreCqlType {
188188 type_ : PreCollectionType ,
189189 } ,
190190 Tuple ( Vec < PreCqlType > ) ,
191+ Vector {
192+ type_ : Box < PreCqlType > ,
193+ /// matches the datatype used by the java driver:
194+ /// <https://github.com/apache/cassandra-java-driver/blob/85bb4065098b887d2dda26eb14423ce4fc687045/core/src/main/java/com/datastax/oss/driver/api/core/type/DataTypes.java#L77>
195+ dimensions : i32 ,
196+ } ,
191197 UserDefinedType {
192198 frozen : bool ,
193199 name : String ,
@@ -211,6 +217,10 @@ impl PreCqlType {
211217 . map ( |t| t. into_cql_type ( keyspace_name, udts) )
212218 . collect ( ) ,
213219 ) ,
220+ PreCqlType :: Vector { type_, dimensions } => CqlType :: Vector {
221+ type_ : Box :: new ( type_. into_cql_type ( keyspace_name, udts) ) ,
222+ dimensions,
223+ } ,
214224 PreCqlType :: UserDefinedType { frozen, name } => {
215225 let definition = match udts
216226 . get ( keyspace_name)
@@ -236,6 +246,12 @@ pub enum CqlType {
236246 type_ : CollectionType ,
237247 } ,
238248 Tuple ( Vec < CqlType > ) ,
249+ Vector {
250+ type_ : Box < CqlType > ,
251+ /// matches the datatype used by the java driver:
252+ /// <https://github.com/apache/cassandra-java-driver/blob/85bb4065098b887d2dda26eb14423ce4fc687045/core/src/main/java/com/datastax/oss/driver/api/core/type/DataTypes.java#L77>
253+ dimensions : i32 ,
254+ } ,
239255 UserDefinedType {
240256 frozen : bool ,
241257 // Using Arc here in order not to have many copies of the same definition
@@ -1137,6 +1153,7 @@ fn topo_sort_udts(udts: &mut Vec<UdtRowWithParsedFieldTypes>) -> Result<(), Quer
11371153 PreCqlType :: Tuple ( types) => types
11381154 . iter ( )
11391155 . for_each ( |type_| do_with_referenced_udts ( what, type_) ) ,
1156+ PreCqlType :: Vector { type_, .. } => do_with_referenced_udts ( what, type_) ,
11401157 PreCqlType :: UserDefinedType { name, .. } => what ( name) ,
11411158 }
11421159 }
@@ -1637,6 +1654,22 @@ fn parse_cql_type(p: ParserState<'_>) -> ParseResult<(PreCqlType, ParserState<'_
16371654 } ) ?;
16381655
16391656 Ok ( ( PreCqlType :: Tuple ( types) , p) )
1657+ } else if let Ok ( p) = p. accept ( "vector<" ) {
1658+ let ( inner_type, p) = parse_cql_type ( p) ?;
1659+
1660+ let p = p. skip_white ( ) ;
1661+ let p = p. accept ( "," ) ?;
1662+ let p = p. skip_white ( ) ;
1663+ let ( size, p) = p. parse_i32 ( ) ?;
1664+ let p = p. skip_white ( ) ;
1665+ let p = p. accept ( ">" ) ?;
1666+
1667+ let typ = PreCqlType :: Vector {
1668+ type_ : Box :: new ( inner_type) ,
1669+ dimensions : size,
1670+ } ;
1671+
1672+ Ok ( ( typ, p) )
16401673 } else if let Ok ( ( typ, p) ) = parse_native_type ( p) {
16411674 Ok ( ( PreCqlType :: Native ( typ) , p) )
16421675 } else if let Ok ( ( name, p) ) = parse_user_defined_type ( p) {
@@ -1827,6 +1860,20 @@ mod tests {
18271860 PreCqlType :: Native ( NativeType :: Varint ) ,
18281861 ] ) ,
18291862 ) ,
1863+ (
1864+ "vector<int, 5>" ,
1865+ PreCqlType :: Vector {
1866+ type_ : Box :: new ( PreCqlType :: Native ( NativeType :: Int ) ) ,
1867+ dimensions : 5 ,
1868+ } ,
1869+ ) ,
1870+ (
1871+ "vector<text, 1234>" ,
1872+ PreCqlType :: Vector {
1873+ type_ : Box :: new ( PreCqlType :: Native ( NativeType :: Text ) ) ,
1874+ dimensions : 1234 ,
1875+ } ,
1876+ ) ,
18301877 (
18311878 "com.scylladb.types.AwesomeType" ,
18321879 PreCqlType :: UserDefinedType {
0 commit comments