diff --git a/crates/dbx-core/src/data_compare.rs b/crates/dbx-core/src/data_compare.rs index a96d78e7d1..12ccb8cdba 100644 --- a/crates/dbx-core/src/data_compare.rs +++ b/crates/dbx-core/src/data_compare.rs @@ -2436,7 +2436,23 @@ mod tests { 25, 0, ), - "SELECT \"ID\", \"NAME\" FROM \"APP\".\"EVENTS\" ORDER BY \"ID\" ASC FETCH FIRST 25 ROWS ONLY" + "SELECT \"ID\", \"NAME\" FROM (SELECT \"ID\", \"NAME\" FROM \"APP\".\"EVENTS\" ORDER BY \"ID\" ASC) WHERE ROWNUM <= 25" + ); + } + + #[test] + fn builds_backend_table_select_sql_for_oracle11g_rownum_offset_pages() { + assert_eq!( + build_data_compare_select_sql( + DatabaseType::Oracle, + "APP", + "EVENTS", + &["ID".to_string(), "NAME".to_string()], + &["ID".to_string()], + 25, + 50, + ), + "SELECT \"ID\", \"NAME\" FROM (SELECT dbx_inner.*, ROWNUM AS \"__dbx_row_num\" FROM (SELECT \"ID\", \"NAME\" FROM \"APP\".\"EVENTS\" ORDER BY \"ID\" ASC) dbx_inner WHERE ROWNUM <= 75) WHERE \"__dbx_row_num\" > 50" ); } diff --git a/crates/dbx-core/src/sql_dialect/capabilities.rs b/crates/dbx-core/src/sql_dialect/capabilities.rs index 6c8a90a09b..bfe3c29276 100644 --- a/crates/dbx-core/src/sql_dialect/capabilities.rs +++ b/crates/dbx-core/src/sql_dialect/capabilities.rs @@ -91,8 +91,11 @@ pub fn pagination_strategy(database_type: Option, context: Paginat Some(DatabaseType::Oracle) if matches!(context, PaginationContext::TablePreview) => { TablePaginationStrategy::Rownum } + // Oracle's row-limiting clause (`FETCH FIRST`/`OFFSET ... FETCH`) was + // introduced in 12c. ROWNUM remains compatible with the supported 11g + // baseline while still providing a bounded read for newer servers. Some(DatabaseType::Oracle) if matches!(context, PaginationContext::BoundedRead) => { - TablePaginationStrategy::FetchFirst + TablePaginationStrategy::Rownum } Some(DatabaseType::Oracle) => TablePaginationStrategy::Unbounded, Some(DatabaseType::Oscar) diff --git a/crates/dbx-core/src/sql_dialect/tests.rs b/crates/dbx-core/src/sql_dialect/tests.rs index 82c51b3b55..8a538cd2db 100644 --- a/crates/dbx-core/src/sql_dialect/tests.rs +++ b/crates/dbx-core/src/sql_dialect/tests.rs @@ -148,7 +148,7 @@ fn maps_table_pagination_strategy_by_database_type() { assert_eq!(table_pagination_strategy(Some(DatabaseType::Oscar)), TablePaginationStrategy::Rownum); assert_eq!( pagination_strategy(Some(DatabaseType::Oracle), PaginationContext::BoundedRead), - TablePaginationStrategy::FetchFirst + TablePaginationStrategy::Rownum ); assert_eq!( pagination_strategy(Some(DatabaseType::Oscar), PaginationContext::BoundedRead),