Skip to content

Commit 1328704

Browse files
committed
refactor: make partition timestamp parsing engine-independent
1 parent ab3c92e commit 1328704

7 files changed

Lines changed: 378 additions & 257 deletions

File tree

kernel/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pre-release-hook = [
3232
delta_kernel_derive = { path = "../derive-macros", version = "0.28.0" }
3333
bytes = "1.10"
3434
chrono = "0.4.41"
35-
chrono-tz = { version = "0.10.4", optional = true }
35+
chrono-tz = "0.10.4"
3636
crc = "3.2.2"
3737
indexmap = "2.10.0"
3838
itertools = "0.14"
@@ -100,7 +100,7 @@ need-arrow = [] # need-arrow is a marker that the feature needs arrow dep
100100
arrow-58 = ["dep:arrow_58", "dep:parquet_58", "dep:object_store_13"]
101101
arrow-59 = ["dep:arrow_59", "dep:parquet_59", "dep:object_store_13"]
102102
arrow-conversion = ["need-arrow"]
103-
arrow-expression = ["need-arrow", "dep:chrono-tz"]
103+
arrow-expression = ["need-arrow"]
104104

105105
# Schema diffing functionality (experimental)
106106
schema-diff = []

kernel/src/engine/arrow_expression/evaluate_expression.rs

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,16 @@ use std::borrow::Cow;
33
use std::collections::HashMap;
44
use std::sync::Arc;
55

6-
use chrono::Utc;
76
use itertools::Itertools;
87
use tracing::warn;
98

10-
use super::timestamp_timezone::TimestampTimezone;
119
use crate::arrow::array::types::*;
1210
use crate::arrow::array::{
1311
self as arrow_array, make_array, new_null_array, Array, ArrayBuilder, ArrayData, ArrayRef,
1412
AsArray, BooleanArray, Datum, ListArray, MapArray, MutableArrayData, NullBufferBuilder,
1513
RecordBatch, StringArray, StructArray,
1614
};
1715
use crate::arrow::buffer::{NullBuffer, OffsetBuffer};
18-
use crate::arrow::compute::kernels::cast_utils::{string_to_datetime, Parser};
1916
use crate::arrow::compute::kernels::cmp::{distinct, eq, gt, gt_eq, lt, lt_eq, neq, not_distinct};
2017
use crate::arrow::compute::kernels::comparison::in_list_utf8;
2118
use crate::arrow::compute::kernels::numeric::{add, div, mul, sub};
@@ -44,6 +41,7 @@ use crate::expressions::{
4441
UnaryPredicateOp, VariadicExpression, VariadicExpressionOp,
4542
};
4643
use crate::schema::{DataType, PrimitiveType, StructField, StructType};
44+
use crate::timestamp_timezone::{parse_partition_scalar, TimestampTimezone};
4745

4846
#[internal_api]
4947
pub(crate) trait ProvidesColumnByName {
@@ -934,44 +932,6 @@ fn coalesce_arrays(
934932
Ok(make_array(mutable.freeze()))
935933
}
936934

937-
/// Parses one raw partition-value string into its target [`Scalar`], or `None` for a null value.
938-
///
939-
/// An empty string casts via [`PrimitiveType::empty_string_partition_cast`].
940-
/// `timestamp_timezone` applies only to `TIMESTAMP` values without an embedded offset or named
941-
/// timezone; it does not affect `DATE` or `TIMESTAMP_NTZ`.
942-
fn parse_partition_scalar(
943-
prim: &PrimitiveType,
944-
raw: &str,
945-
timestamp_timezone: TimestampTimezone,
946-
) -> DeltaResult<Option<Scalar>> {
947-
if raw.is_empty() {
948-
return Ok(prim.empty_string_partition_cast());
949-
}
950-
match prim {
951-
PrimitiveType::Date => {
952-
let days = Date32Type::parse(raw).ok_or_else(|| {
953-
Error::ParseError(raw.to_string(), DataType::Primitive(prim.clone()))
954-
})?;
955-
return Ok(Some(Scalar::Date(days)));
956-
}
957-
PrimitiveType::Timestamp => {
958-
let micros = timestamp_timezone.parse_timestamp(raw).ok_or_else(|| {
959-
Error::ParseError(raw.to_string(), DataType::Primitive(prim.clone()))
960-
})?;
961-
return Ok(Some(Scalar::Timestamp(micros)));
962-
}
963-
PrimitiveType::TimestampNtz => {
964-
let micros = string_to_datetime(&Utc, raw)
965-
.map_err(|_| Error::ParseError(raw.to_string(), DataType::Primitive(prim.clone())))?
966-
.timestamp_micros();
967-
return Ok(Some(Scalar::TimestampNtz(micros)));
968-
}
969-
_ => {}
970-
}
971-
let scalar = prim.parse_scalar(raw)?;
972-
Ok((!matches!(scalar, Scalar::Null(_))).then_some(scalar))
973-
}
974-
975935
/// Evaluates `MAP_TO_STRUCT(map_col, output_schema)`: extracts keys from a `Map<String, String>`
976936
/// and parses each value into its target type, producing a `StructArray`. An empty-string value
977937
/// casts via [`PrimitiveType::empty_string_partition_cast`].

kernel/src/engine/arrow_expression/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ use crate::{EngineData, EvaluationHandler, ExpressionEvaluator, PredicateEvaluat
2020

2121
pub mod evaluate_expression;
2222
pub mod opaque;
23-
mod timestamp_timezone;
2423

2524
#[cfg(test)]
2625
mod tests;

kernel/src/engine/arrow_expression/timestamp_timezone.rs

Lines changed: 0 additions & 213 deletions
This file was deleted.

kernel/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ pub mod table_changes;
114114
pub mod table_configuration;
115115
pub mod table_features;
116116
pub mod table_properties;
117+
pub(crate) mod timestamp_timezone;
117118
pub mod transaction;
118119
pub mod transforms;
119120

kernel/src/schema/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1983,6 +1983,7 @@ pub enum PrimitiveType {
19831983
Date,
19841984
/// Microsecond precision timestamp, adjusted to UTC.
19851985
Timestamp,
1986+
/// Microsecond precision local timestamp without timezone adjustment.
19861987
#[serde(rename = "timestamp_ntz")]
19871988
TimestampNtz,
19881989
Void,

0 commit comments

Comments
 (0)