Helper to build an IN/NOT IN predicate with a datum array.
(
table: *const paimon_table,
column: *const std::ffi::c_char,
datums: *const paimon_datum,
datums_len: usize,
build_fn: impl FnOnce(&PredicateBuilder, &str, Vec<Datum>) -> paimon:
| 892 | |
| 893 | /// Helper to build an IN/NOT IN predicate with a datum array. |
| 894 | unsafe fn build_leaf_predicate_datums( |
| 895 | table: *const paimon_table, |
| 896 | column: *const std::ffi::c_char, |
| 897 | datums: *const paimon_datum, |
| 898 | datums_len: usize, |
| 899 | build_fn: impl FnOnce(&PredicateBuilder, &str, Vec<Datum>) -> paimon::Result<Predicate>, |
| 900 | ) -> paimon_result_predicate { |
| 901 | if let Err(e) = check_non_null(table, "table") { |
| 902 | return paimon_result_predicate { |
| 903 | predicate: std::ptr::null_mut(), |
| 904 | error: e, |
| 905 | }; |
| 906 | } |
| 907 | let col_name = match validate_cstr(column, "column") { |
| 908 | Ok(s) => s, |
| 909 | Err(e) => { |
| 910 | return paimon_result_predicate { |
| 911 | predicate: std::ptr::null_mut(), |
| 912 | error: e, |
| 913 | } |
| 914 | } |
| 915 | }; |
| 916 | |
| 917 | if datums.is_null() && datums_len > 0 { |
| 918 | return paimon_result_predicate { |
| 919 | predicate: std::ptr::null_mut(), |
| 920 | error: paimon_error::new( |
| 921 | PaimonErrorCode::InvalidInput, |
| 922 | "null datums pointer with non-zero length".to_string(), |
| 923 | ), |
| 924 | }; |
| 925 | } |
| 926 | |
| 927 | let slice = if datums_len > 0 { |
| 928 | std::slice::from_raw_parts(datums, datums_len) |
| 929 | } else { |
| 930 | &[] |
| 931 | }; |
| 932 | let values: Result<Vec<Datum>, _> = slice.iter().map(|d| datum_from_c(d)).collect(); |
| 933 | let values = match values { |
| 934 | Ok(v) => v, |
| 935 | Err(e) => { |
| 936 | return paimon_result_predicate { |
| 937 | predicate: std::ptr::null_mut(), |
| 938 | error: e, |
| 939 | } |
| 940 | } |
| 941 | }; |
| 942 | |
| 943 | let table_ref = &*((*table).inner as *const Table); |
| 944 | let fields = table_ref.schema().fields(); |
| 945 | |
| 946 | let values: Result<Vec<Datum>, _> = values |
| 947 | .into_iter() |
| 948 | .map(|d| coerce_integer_datum(d, fields, &col_name)) |
| 949 | .collect(); |
| 950 | let values = match values { |
| 951 | Ok(v) => v, |
no test coverage detected