@@ -103,8 +103,23 @@ extension Array: PostgresEncodable where Element: PSQLArrayElement {
103103 }
104104}
105105
106- extension Array : PostgresDecodable where Element: PSQLArrayElement {
107- init < JSONDecoder: PostgresJSONDecoder > (
106+ /// A type that can be decoded into a Swift Array of its own type from a Postgres array.
107+ public protocol PostgresArrayDecodable : PostgresDecodable { }
108+
109+ extension Bool : PostgresArrayDecodable { }
110+ extension ByteBuffer : PostgresArrayDecodable { }
111+ extension UInt8 : PostgresArrayDecodable { }
112+ extension Int16 : PostgresArrayDecodable { }
113+ extension Int32 : PostgresArrayDecodable { }
114+ extension Int64 : PostgresArrayDecodable { }
115+ extension Int : PostgresArrayDecodable { }
116+ extension Float : PostgresArrayDecodable { }
117+ extension Double : PostgresArrayDecodable { }
118+ extension String : PostgresArrayDecodable { }
119+ extension UUID : PostgresArrayDecodable { }
120+
121+ extension Array : PostgresDecodable where Element: PostgresArrayDecodable , Element == Element . _DecodableType {
122+ public init < JSONDecoder: PostgresJSONDecoder > (
108123 from buffer: inout ByteBuffer ,
109124 type: PostgresDataType ,
110125 format: PostgresFormat ,
@@ -114,48 +129,44 @@ extension Array: PostgresDecodable where Element: PSQLArrayElement {
114129 // currently we only support decoding arrays in binary format.
115130 throw PostgresCastingError . Code. failure
116131 }
117-
132+
118133 guard let ( isNotEmpty, b, element) = buffer. readMultipleIntegers ( endianness: . big, as: ( Int32, Int32, UInt32) . self) ,
119134 0 <= isNotEmpty, isNotEmpty <= 1 , b == 0
120135 else {
121136 throw PostgresCastingError . Code. failure
122137 }
123-
138+
124139 let elementType = PostgresDataType ( element)
125-
140+
126141 guard isNotEmpty == 1 else {
127142 self = [ ]
128143 return
129144 }
130-
145+
131146 guard let ( expectedArrayCount, dimensions) = buffer. readMultipleIntegers ( endianness: . big, as: ( Int32, Int32) . self) ,
132147 expectedArrayCount > 0 ,
133148 dimensions == 1
134149 else {
135150 throw PostgresCastingError . Code. failure
136151 }
137-
152+
138153 var result = Array < Element > ( )
139154 result. reserveCapacity ( Int ( expectedArrayCount) )
140-
155+
141156 for _ in 0 ..< expectedArrayCount {
142- guard let elementLength = buffer. readInteger ( as: Int32 . self) else {
157+ guard let elementLength = buffer. readInteger ( as: Int32 . self) , elementLength >= 0 else {
143158 throw PostgresCastingError . Code. failure
144159 }
145-
160+
146161 guard var elementBuffer = buffer. readSlice ( length: numericCast ( elementLength) ) else {
147162 throw PostgresCastingError . Code. failure
148163 }
149-
164+
150165 let element = try Element . init ( from: & elementBuffer, type: elementType, format: format, context: context)
151-
166+
152167 result. append ( element)
153168 }
154-
169+
155170 self = result
156171 }
157172}
158-
159- extension Array : PostgresCodable where Element: PSQLArrayElement {
160-
161- }
0 commit comments