@@ -434,54 +434,65 @@ pub fn load_dataset(
434
434
Spi :: run ( & format ! ( r#"CREATE TABLE {table_name} ({column_types})"# ) ) ?;
435
435
let insert = format ! ( r#"INSERT INTO {table_name} ({column_names}) VALUES ({column_placeholders})"# ) ;
436
436
for i in 0 ..num_rows {
437
+ let mut skip = false ;
437
438
let mut row = Vec :: with_capacity ( num_cols) ;
438
439
for ( name, values) in data {
439
440
let value = values
440
441
. as_array ( )
441
442
. ok_or_else ( || anyhow ! ( "expected {values} to be an array" ) ) ?
442
443
. get ( i)
443
444
. ok_or_else ( || anyhow ! ( "invalid index {i} for {values}" ) ) ?;
444
- match types
445
+ let ( ty , datum ) = match types
445
446
. get ( name)
446
447
. ok_or_else ( || anyhow ! ( "{types:?} expected to have key {name}" ) ) ?
447
448
. as_str ( )
448
449
. ok_or_else ( || anyhow ! ( "json field {name} expected to be string" ) ) ?
449
450
{
450
- "string" => row . push ( (
451
+ "string" => (
451
452
PgBuiltInOids :: TEXTOID . oid ( ) ,
452
453
value
453
454
. as_str ( )
454
- . ok_or_else ( || anyhow ! ( "expected {value} to be string" ) ) ?
455
- . into_datum ( ) ,
456
- ) ) ,
457
- "dict" | "list" => row . push ( ( PgBuiltInOids :: JSONBOID . oid ( ) , JsonB ( value. clone ( ) ) . into_datum ( ) ) ) ,
458
- "int64" | "int32" | "int16" => row . push ( (
455
+ . map ( IntoDatum :: into_datum )
456
+ . ok_or_else ( || anyhow ! ( "expected column {name} with {value} to be string" ) ) ,
457
+ ) ,
458
+ "dict" | "list" => ( PgBuiltInOids :: JSONBOID . oid ( ) , Ok ( JsonB ( value. clone ( ) ) . into_datum ( ) ) ) ,
459
+ "int64" | "int32" | "int16" => (
459
460
PgBuiltInOids :: INT8OID . oid ( ) ,
460
461
value
461
462
. as_i64 ( )
462
- . ok_or_else ( || anyhow ! ( "expected {value} to be i64" ) ) ?
463
- . into_datum ( ) ,
464
- ) ) ,
465
- "float64" | "float32" | "float16" => row . push ( (
463
+ . map ( IntoDatum :: into_datum )
464
+ . ok_or_else ( || anyhow ! ( "expected column {name} with {value} to be i64" ) ) ,
465
+ ) ,
466
+ "float64" | "float32" | "float16" => (
466
467
PgBuiltInOids :: FLOAT8OID . oid ( ) ,
467
468
value
468
469
. as_f64 ( )
469
- . ok_or_else ( || anyhow ! ( "expected {value} to be f64" ) ) ?
470
- . into_datum ( ) ,
471
- ) ) ,
472
- "bool" => row . push ( (
470
+ . map ( IntoDatum :: into_datum )
471
+ . ok_or_else ( || anyhow ! ( "expected column {name} with {value} to be f64" ) ) ,
472
+ ) ,
473
+ "bool" => (
473
474
PgBuiltInOids :: BOOLOID . oid ( ) ,
474
475
value
475
476
. as_bool ( )
476
- . ok_or_else ( || anyhow ! ( "expected {value} to be bool" ) ) ?
477
- . into_datum ( ) ,
478
- ) ) ,
477
+ . map ( IntoDatum :: into_datum )
478
+ . ok_or_else ( || anyhow ! ( "expected column {name} with {value} to be bool" ) ) ,
479
+ ) ,
479
480
type_ => {
480
481
bail ! ( "unhandled dataset value type while reading dataset: {value:?} {type_:?}" )
481
482
}
483
+ } ;
484
+ match datum {
485
+ Ok ( datum) => row. push ( ( ty, datum) ) ,
486
+ Err ( e) => {
487
+ warning ! ( "failed to convert dataset value to datum while reading dataset: {e}" ) ;
488
+ skip = true ;
489
+ break ;
490
+ }
482
491
}
483
492
}
484
- Spi :: run_with_args ( & insert, Some ( row) ) ?
493
+ if !skip {
494
+ Spi :: run_with_args ( & insert, Some ( row) ) ?
495
+ }
485
496
}
486
497
487
498
Ok ( num_rows)
0 commit comments