@@ -82,7 +82,11 @@ impl<T> RawFromSql for ArrayBase<Option<T>> where T: RawFromSql {
82
82
lower_bound : try!( raw. read_be_i32 ( ) ) as int ,
83
83
} ) ;
84
84
}
85
- let nele = dim_info. iter ( ) . map ( |info| info. len as uint ) . product ( ) ;
85
+ let nele = if dim_info. len ( ) == 0 {
86
+ 0
87
+ } else {
88
+ dim_info. iter ( ) . map ( |info| info. len as uint ) . product ( )
89
+ } ;
86
90
87
91
let mut elements = Vec :: with_capacity ( nele) ;
88
92
for _ in range ( 0 , nele) {
@@ -160,6 +164,7 @@ mod test {
160
164
use std:: fmt;
161
165
162
166
use postgres:: { Connection , SslMode , FromSql , ToSql } ;
167
+ use ArrayBase ;
163
168
164
169
fn test_type < T : PartialEq +FromSql +ToSql , S : fmt:: Show > ( sql_type : & str , checks : & [ ( T , S ) ] ) {
165
170
let conn = Connection :: connect ( "postgres://postgres@localhost" , & SslMode :: None ) . unwrap ( ) ;
@@ -176,7 +181,6 @@ mod test {
176
181
177
182
macro_rules! test_array_params {
178
183
( $name: expr, $v1: expr, $s1: expr, $v2: expr, $s2: expr, $v3: expr, $s3: expr) => ( {
179
- use ArrayBase ;
180
184
181
185
let tests = & [ ( Some ( ArrayBase :: from_vec( vec!( Some ( $v1) , Some ( $v2) , None ) , 1 ) ) ,
182
186
format!( "'{{{},{},NULL}}'" , $s1, $s2) . into_string( ) ) ,
@@ -256,4 +260,11 @@ mod test {
256
260
fn test_float8array_params ( ) {
257
261
test_array_params ! ( "FLOAT8" , 0f64 , "0" , 1.5f64 , "1.5" , 0.009f64 , ".009" ) ;
258
262
}
263
+
264
+ #[ test]
265
+ fn test_empty_array ( ) {
266
+ let conn = Connection :: connect ( "postgres://postgres@localhost" , & SslMode :: None ) . unwrap ( ) ;
267
+ let stmt = conn. prepare ( "SELECT '{}'::INT4[]" ) . unwrap ( ) ;
268
+ stmt. query ( & [ ] ) . unwrap ( ) . next ( ) . unwrap ( ) . get :: < _ , ArrayBase < Option < i32 > > > ( 0 ) ;
269
+ }
259
270
}
0 commit comments