From 0411fd46b6c8c9205399b3e52ed4c8e6b61d652f Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 17 Jun 2026 01:00:09 +0800 Subject: [PATCH] fix(jdbc): skip SQL-level row limiting for JDBC connections --- crates/dbx-core/src/data_compare.rs | 5 +++++ crates/dbx-core/src/database_search_sql.rs | 3 +++ crates/dbx-core/src/query_result_sql.rs | 5 +++++ crates/dbx-core/src/sql_dialect/table_select.rs | 10 ++++++++++ crates/dbx-core/src/sql_dialect/tests.rs | 4 +++- 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/dbx-core/src/data_compare.rs b/crates/dbx-core/src/data_compare.rs index 33c2cc93a..747a3a058 100644 --- a/crates/dbx-core/src/data_compare.rs +++ b/crates/dbx-core/src/data_compare.rs @@ -787,6 +787,11 @@ fn build_data_compare_select_sql( ); } + // JDBC connections rely on Statement.setMaxRows() for row limiting. + if database_type == DatabaseType::Jdbc { + return format!("SELECT {select_columns} FROM {table}{order_by};"); + } + let offset_sql = if offset > 0 { format!(" OFFSET {offset}") } else { String::new() }; format!("SELECT {select_columns} FROM {table}{order_by} LIMIT {row_limit}{offset_sql};") } diff --git a/crates/dbx-core/src/database_search_sql.rs b/crates/dbx-core/src/database_search_sql.rs index dc7b0a684..c80d02f7b 100644 --- a/crates/dbx-core/src/database_search_sql.rs +++ b/crates/dbx-core/src/database_search_sql.rs @@ -111,6 +111,9 @@ pub fn build_database_search_sql(options: DatabaseSearchSqlOptions) -> Option QuerySqlB return ok(add_fetch_first_limit(&statement, safe_limit, safe_offset)); } + // JDBC connections rely on Statement.setMaxRows() for row limiting. + if options.database_type == Some(DatabaseType::Jdbc) { + return ok(format!("{statement};")); + } + ok(add_standard_limit(&statement, safe_limit, safe_offset)) } diff --git a/crates/dbx-core/src/sql_dialect/table_select.rs b/crates/dbx-core/src/sql_dialect/table_select.rs index 96aa8c665..191882266 100644 --- a/crates/dbx-core/src/sql_dialect/table_select.rs +++ b/crates/dbx-core/src/sql_dialect/table_select.rs @@ -123,6 +123,11 @@ pub fn build_table_data_select_sql(options: TableDataSelectSqlOptions) -> String let offset = options.offset.filter(|offset| *offset > 0).map(|offset| format!(" OFFSET {offset}")).unwrap_or_default(); + // JDBC connections rely on Statement.setMaxRows() for row limiting instead of + // SQL-level LIMIT, which is not universally supported across all JDBC drivers. + if database_type == Some(DatabaseType::Jdbc) { + return format!("SELECT {select_columns} FROM {table_alias}{where_clause}{order};"); + } format!("SELECT {select_columns} FROM {table_alias}{where_clause}{order} LIMIT {limit}{offset};") } @@ -170,6 +175,11 @@ pub fn build_table_select_sql(options: TableSelectSqlOptions<'_>) -> String { return format!("SELECT TOP ({limit}) {select_columns} FROM {table}{order_by}"); } + // JDBC connections rely on Statement.setMaxRows() for row limiting. + if database_type == Some(DatabaseType::Jdbc) { + return format!("SELECT {select_columns} FROM {table}{order_by};"); + } + format!("SELECT {select_columns} FROM {table}{order_by} LIMIT {limit};") } diff --git a/crates/dbx-core/src/sql_dialect/tests.rs b/crates/dbx-core/src/sql_dialect/tests.rs index 76a463a1d..e1a48726a 100644 --- a/crates/dbx-core/src/sql_dialect/tests.rs +++ b/crates/dbx-core/src/sql_dialect/tests.rs @@ -82,6 +82,8 @@ fn builds_select_sql_with_limit_syntax_for_database_type() { }), "SELECT \"id\", \"name\" FROM \"DB2INST1\".\"USERS\" ORDER BY \"id\" ASC FETCH FIRST 100 ROWS ONLY" ); + // JDBC connections skip SQL-level row limiting — the JDBC agent handles + // it via Statement.setMaxRows() which is universally supported. assert_eq!( build_table_select_sql(TableSelectSqlOptions { database_type: Some(DatabaseType::Jdbc), @@ -91,7 +93,7 @@ fn builds_select_sql_with_limit_syntax_for_database_type() { order_columns: &[], limit: 100, }), - "SELECT * FROM dwd_test_df LIMIT 100;" + "SELECT * FROM dwd_test_df;" ); assert_eq!( build_table_select_sql(TableSelectSqlOptions {