fix(oracle): paginate views with rownum on the first page

This commit is contained in:
zipg authored and GitHub committed 2026-09-13 13:25:44 +08:00
1 parent 1842ae9de7
commit 17f184cd07
2 files changed
+5 -10

No files matched your search

@@ -276,9 +276,6 @@ pub fn build_table_data_select_sql_with_database(
let include_xugu_row_id =
options.include_row_id && uses_xugu_row_id(database_type) && !is_view_table_type(options.table_type.as_deref());
let offset = options.offset.unwrap_or(0);
let oracle_view_first_page =
database_type == Some(DatabaseType::Oracle) && is_view_table_type(options.table_type.as_deref()) && offset == 0;
let select_columns = if include_oracle_row_id {
format!("ROWIDTOCHAR(t.ROWID) AS \"{DBX_ROWID_COLUMN}\", t.*")
} else if let Some(preview_columns) = build_large_value_preview_columns(&options) {
@@ -362,9 +359,6 @@ pub fn build_table_data_select_sql_with_database(
)
}
TablePaginationStrategy::Rownum => {
if oracle_view_first_page {
return format!("SELECT {page_select_columns} FROM {table_alias}{where_clause}{order}");
}
let rownum_inner_select_columns =
if include_oracle_row_id { &select_columns } else { &rownum_select_columns };
build_rownum_table_select_sql(
+5 -4
View File
@@ -1423,7 +1423,7 @@ fn builds_oracle_and_neo4j_table_data_queries() {
include_row_id: true,
..Default::default()
}),
"SELECT \"ID\", \"NAME\" FROM \"DBXTEST\".\"DBX_JOIN_VIEW\""
"SELECT \"ID\", \"NAME\" FROM (SELECT \"ID\", \"NAME\" FROM \"DBXTEST\".\"DBX_JOIN_VIEW\") WHERE ROWNUM <= 100"
);
assert_eq!(
build_table_data_select_sql(TableDataSelectSqlOptions {
@@ -1490,7 +1490,7 @@ fn builds_oracle_rowid_wrapped_large_value_reload_sql() {
}
#[test]
fn oracle_view_first_page_preserves_filter_and_sort_without_rownum() {
fn oracle_view_first_page_is_bounded_and_preserves_filter_and_sort() {
assert_eq!(
build_table_data_select_sql(TableDataSelectSqlOptions {
database_type: Some(DatabaseType::Oracle),
@@ -1505,7 +1505,7 @@ fn oracle_view_first_page_preserves_filter_and_sort_without_rownum() {
include_row_id: true,
..Default::default()
}),
"SELECT \"ID\", \"NAME\" FROM \"DBXTEST\".\"DBX_JOIN_VIEW\" WHERE (STATUS = 'A') ORDER BY \"ID\" DESC"
"SELECT \"ID\", \"NAME\" FROM (SELECT \"ID\", \"NAME\" FROM \"DBXTEST\".\"DBX_JOIN_VIEW\" WHERE (STATUS = 'A') ORDER BY \"ID\" DESC) WHERE ROWNUM <= 100"
);
}
@@ -1518,12 +1518,13 @@ fn oracle_view_later_pages_keep_rownum_pagination() {
table_name: "DBX_JOIN_VIEW".to_string(),
table_type: Some("VIEW".to_string()),
columns: vec!["ID".to_string(), "NAME".to_string()],
order_by: Some("\"ID\" DESC".to_string()),
limit: Some(100),
offset: Some(100),
include_row_id: true,
..Default::default()
}),
"SELECT \"ID\", \"NAME\" FROM (SELECT dbx_inner.*, ROWNUM AS \"__dbx_row_num\" FROM (SELECT \"ID\", \"NAME\" FROM \"DBXTEST\".\"DBX_JOIN_VIEW\") dbx_inner WHERE ROWNUM <= 200) WHERE \"__dbx_row_num\" > 100"
"SELECT \"ID\", \"NAME\" FROM (SELECT dbx_inner.*, ROWNUM AS \"__dbx_row_num\" FROM (SELECT \"ID\", \"NAME\" FROM \"DBXTEST\".\"DBX_JOIN_VIEW\" ORDER BY \"ID\" DESC) dbx_inner WHERE ROWNUM <= 200) WHERE \"__dbx_row_num\" > 100"
);
}