pg2any_lib 0.11.0

PostgreSQL to Any database library with Change Data Capture (CDC) and logical replication support
Documentation
//! Integration tests for bulk insert optimization

#[cfg(feature = "mysql")]
mod bulk_insert_integration {
    use pg2any_lib::destinations::bulk_insert::{
        build_multi_value_insert, detect_bulk_insert_batch,
    };

    #[test]
    fn test_large_batch_detection() {
        let stmts: Vec<String> = (0..1000)
            .map(|i| {
                format!(
                    "INSERT INTO `cdc_db`.`t1` (`id`, `val`, `col1`) VALUES ({}, {}, 'value_{}');",
                    i,
                    i * 100,
                    i
                )
            })
            .collect();

        let result = detect_bulk_insert_batch(&stmts);
        assert!(
            result.is_some(),
            "Should detect 1000 INSERT statements as bulk batch"
        );

        let parsed = result.unwrap();
        assert_eq!(parsed.table, "`cdc_db`.`t1`");
        assert_eq!(parsed.columns.len(), 3);
        assert_eq!(parsed.rows.len(), 1000);
    }

    #[test]
    fn test_below_threshold_not_detected() {
        let stmts = vec![
            "INSERT INTO `t` (`id`) VALUES (1);".to_string(),
            "INSERT INTO `t` (`id`) VALUES (2);".to_string(),
        ];
        let result = detect_bulk_insert_batch(&stmts);
        assert!(result.is_some());
    }

    #[test]
    fn test_multi_value_insert_generation() {
        let table = "`cdc_db`.`t1`";
        let columns = vec![
            "`id`".to_string(),
            "`name`".to_string(),
            "`value`".to_string(),
        ];
        let rows: Vec<Vec<String>> = (0..5)
            .map(|i| vec![i.to_string(), format!("'name_{}'", i), "NULL".to_string()])
            .collect();

        let sql = build_multi_value_insert(table, &columns, &rows);
        assert!(sql.starts_with("INSERT INTO `cdc_db`.`t1` (`id`, `name`, `value`) VALUES "));
        assert!(sql.contains("(0, 'name_0', NULL)"));
        assert!(sql.contains("(4, 'name_4', NULL)"));
        assert!(sql.ends_with(';'));
    }

    #[test]
    fn test_empty_batch_returns_none() {
        let stmts: Vec<String> = vec![];
        let result = detect_bulk_insert_batch(&stmts);
        assert!(result.is_none());
    }

    #[test]
    fn test_single_insert_detection() {
        let stmts = vec!["INSERT INTO `db`.`t` (`a`, `b`) VALUES (1, 'x');".to_string()];
        let result = detect_bulk_insert_batch(&stmts);
        assert!(result.is_some());
        let parsed = result.unwrap();
        assert_eq!(parsed.rows.len(), 1);
    }
}