@@ -42,13 +42,13 @@ public enum ArrowError: Error {
4242 case invalid( String )
4343}
4444
45- public enum ArrowTypeId : Sendable {
45+ public enum ArrowTypeId : Sendable , Equatable {
4646 case binary
4747 case boolean
4848 case date32
4949 case date64
5050 case dateType
51- case decimal128
51+ case decimal128( _ precision : Int32 , _ scale : Int32 )
5252 case decimal256
5353 case dictionary
5454 case double
@@ -129,6 +129,23 @@ public class ArrowTypeTime64: ArrowType {
129129 }
130130}
131131
132+ public class ArrowTypeDecimal128 : ArrowType {
133+ let precision : Int32
134+ let scale : Int32
135+
136+ public init ( precision: Int32 , scale: Int32 ) {
137+ self . precision = precision
138+ self . scale = scale
139+ super. init ( ArrowType . ArrowDecimal128)
140+ }
141+
142+ public override var cDataFormatId : String {
143+ get throws {
144+ return " d: \( precision) , \( scale) "
145+ }
146+ }
147+ }
148+
132149/// @nodoc
133150public class ArrowNestedType : ArrowType {
134151 let fields : [ ArrowField ]
@@ -156,6 +173,7 @@ public class ArrowType {
156173 public static let ArrowBool = Info . primitiveInfo ( ArrowTypeId . boolean)
157174 public static let ArrowDate32 = Info . primitiveInfo ( ArrowTypeId . date32)
158175 public static let ArrowDate64 = Info . primitiveInfo ( ArrowTypeId . date64)
176+ public static let ArrowDecimal128 = Info . primitiveInfo ( ArrowTypeId . decimal128 ( 38 , 18 ) )
159177 public static let ArrowBinary = Info . variableInfo ( ArrowTypeId . binary)
160178 public static let ArrowTime32 = Info . timeInfo ( ArrowTypeId . time32)
161179 public static let ArrowTime64 = Info . timeInfo ( ArrowTypeId . time64)
@@ -216,6 +234,8 @@ public class ArrowType {
216234 return ArrowType . ArrowFloat
217235 } else if type == Double . self {
218236 return ArrowType . ArrowDouble
237+ } else if type == Decimal . self {
238+ return ArrowType . ArrowDecimal128
219239 } else {
220240 return ArrowType . ArrowUnknown
221241 }
@@ -242,6 +262,8 @@ public class ArrowType {
242262 return ArrowType . ArrowFloat
243263 } else if type == Double . self {
244264 return ArrowType . ArrowDouble
265+ } else if type == Decimal . self {
266+ return ArrowType . ArrowDecimal128
245267 } else {
246268 return ArrowType . ArrowUnknown
247269 }
@@ -271,6 +293,8 @@ public class ArrowType {
271293 return MemoryLayout< Float> . stride
272294 case . double:
273295 return MemoryLayout< Double> . stride
296+ case . decimal128:
297+ return 16 // Decimal 128 (= 16 * 8) bits
274298 case . boolean:
275299 return MemoryLayout< Bool> . stride
276300 case . date32:
@@ -315,6 +339,8 @@ public class ArrowType {
315339 return " f "
316340 case ArrowTypeId . double:
317341 return " g "
342+ case ArrowTypeId . decimal128( let precision, let scale) :
343+ return " d: \( precision) , \( scale) "
318344 case ArrowTypeId . boolean:
319345 return " b "
320346 case ArrowTypeId . date32:
@@ -344,6 +370,7 @@ public class ArrowType {
344370 public static func fromCDataFormatId( // swiftlint:disable:this cyclomatic_complexity
345371 _ from: String
346372 ) throws -> ArrowType {
373+ let REGEX_DECIMAL_TYPE = /^ d: ( \d + ) , ( \d + ) $/
347374 if from == " c " {
348375 return ArrowType ( ArrowType . ArrowInt8)
349376 } else if from == " s " {
@@ -364,6 +391,10 @@ public class ArrowType {
364391 return ArrowType ( ArrowType . ArrowFloat)
365392 } else if from == " g " {
366393 return ArrowType ( ArrowType . ArrowDouble)
394+ } else if from. contains ( REGEX_DECIMAL_TYPE) {
395+ let match = from. firstMatch ( of: REGEX_DECIMAL_TYPE) !
396+ let decimalType = ArrowTypeId . decimal128 ( Int32 ( match. 1 ) !, Int32 ( match. 2 ) !)
397+ return ArrowType ( Info . primitiveInfo ( decimalType) )
367398 } else if from == " b " {
368399 return ArrowType ( ArrowType . ArrowBool)
369400 } else if from == " tdD " {
0 commit comments