-
Notifications
You must be signed in to change notification settings - Fork 2.4k
fix: unwrap_cast_in_comparison drops the timezone shift when unwrapping CAST(timestamp AS timestamptz) = literal #25099
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
6f6e5b4
ab0676b
df079a8
81b3579
156a6a2
d0ad665
b84ba80
e60c001
7a9760c
2cea9a2
838b442
340c693
72202c0
86a9cc8
f66c2a3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -113,17 +113,54 @@ fn is_date_type(data_type: &DataType) -> bool { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// `Date64` carrying sub-day milliseconds would lose them. This is not a licence to | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// drop them - [`try_cast_numeric_literal`] returns `None` for a `Date64` value not | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// divisible by 86_400_000, so an inexact `Date64` -> `Date32` fold never happens. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// **Timezone Shifts:** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// Conversions between timezone-naive and timezone-aware timestamps are | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// mathematically bijective (shifting the physical value by the timezone offset), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// rather than many-to-one lossy. However, we return `true` here to block unwrapping | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// as an intentionally conservative guard. If we returned `false`, `unwrap_cast_in_comparison` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// would strip the cast but fail to shift the underlying literal, returning incorrect | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// query results. (A robust alternative would be to allow the unwrap and shift the literal, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// preserving pushdown and pruning.) Only UTC-equivalent timezones (where the shift is | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// exactly zero) are allowed to bypass this guard. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+117
to
+125
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix before merge. The cast is not bijective. A naive local time in a DST gap has no instant. A naive local time in a DST fold has two instants. On this branch, both cases give an error: SET datafusion.execution.time_zone = 'America/New_York';
SELECT TIMESTAMP '2024-11-03T01:30:00'::timestamptz; -- fold
SELECT TIMESTAMP '2024-03-10T02:30:00'::timestamptz; -- gap
-- Arrow error: Cast error: Cannot cast timezone to different timezoneThis is the real reason that "shift the literal instead" is not a small change. That alternative must handle these two cases first (see apache/arrow-rs#11038). The conservative guard is the correct choice. But the comment must give the correct reason for it. The suggestion below also describes the one-direction change from my next comment.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fn is_lossy_temporal_cast(from_type: &DataType, to_type: &DataType) -> bool { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if from_type == to_type { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if is_date_type(from_type) && is_date_type(to_type) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if let (DataType::Timestamp(_, from_tz), DataType::Timestamp(_, to_tz)) = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I verified that this guard corrects the four queries in the issue, thank you. Four points on the block:
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the thorough review! I’ve updated the PR to address all four points:
Please take a look at the latest commits! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (from_type, to_type) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| match (from_tz, to_tz) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (Some(tz), None) | (None, Some(tz)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if !is_zero_offset_timezone(tz.as_ref()) => | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| _ => {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+133
to
+144
Comment on lines
+133
to
+144
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix before merge. Only one direction needs the guard. Arrow shifts the value only for SET datafusion.execution.time_zone = 'Asia/Singapore';
CREATE TABLE u AS SELECT '2024-10-31T16:00:00Z'::timestamptz AS tstz;
SELECT tstz::timestamp FROM u;
-- 2024-10-31T16:00:00 (the UTC wall clock, no shift)Thus The If you prefer to keep the wider guard, that is also fine with me. Then please write in the comment that it is intentionally wider than necessary, and keep the unit test as it is.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (is_date_type(from_type) && to_type.is_temporal()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| || (is_date_type(to_type) && from_type.is_temporal()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// Returns true if the timezone is known to have a fixed zero offset from UTC. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// This is used to determine if a cast between a timezone-aware and timezone-naive | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// timestamp is lossy. If the timezone is strictly UTC-equivalent, the cast is | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// a lossless re-labeling of the integer value. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fn is_zero_offset_timezone(tz: &str) -> bool { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| match tz { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Standard UTC identifiers | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "UTC" | "Etc/UTC" | "GMT" | "Etc/GMT" | "Greenwich" | "Z" => true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Common fixed offset zero strings parsed by Arrow | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "+00:00" | "-00:00" | "+0:00" | "-0:00" => true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| _ => false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is there no function in arrow-rs or chrono we could use for this?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The arrow::array::timezone::Tz enum only allows fetching the offset dynamically for a specific NaiveDateTime via offset_from_utc_datetime(). However, we cannot simply instantiate an arbitrary date (like the Unix Epoch) and check if the offset is zero because geographic timezones like Europe/London evaluate to an offset of 0 during winter time. This would create false positives during query planning. Because we need to evaluate this statically during optimization (where we don't want to instantiate values just to check offsets), explicitly whitelisting the known permanent zero-offset strings is currently the safest and most robust approach. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+149
to
+162
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix before merge. Some entries in this list are not valid Arrow timezones. Arrow rejects Thus these entries never match. At the same time, Arrow accepts The direction of the error is safe. But the list is not correct today, and this shows that a list is hard to keep correct. The suggestion parses the three fixed-offset shapes that Arrow accepts, and keeps a list only for the IANA aliases of UTC. Each name in the list is in chrono-tz. This also solves the DST problem that you described: a fixed offset does not change with the season, and the list has no geographic zones.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// Returns true when casting a timestamp from `from_type` to `to_type` loses | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// timestamp precision. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /// | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -998,6 +1035,31 @@ mod tests { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(is_lossy_temporal_cast(&ts, &DataType::Date32)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #[test] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fn test_is_lossy_temporal_cast_timestamp_tz() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This test examines Please add the queries from the issue to statement ok
set datafusion.execution.time_zone = 'Asia/Singapore';
statement ok
create table t as select TIMESTAMP '2024-11-01T00:00:00' as ts;
statement ok
create table u as select '2024-10-31T16:00:00Z'::timestamptz as tstz;
# 2024-11-01 00:00 in Singapore is 2024-10-31 16:00 UTC
query I
select count(*) from t where ts::timestamptz = '2024-10-31T16:00:00Z'::timestamptz;
----
1
query I
select count(*) from t where ts::timestamptz = '2024-11-01T00:00:00Z'::timestamptz;
----
0
# the same rewrite occurs for an implicit coercion
query I
select count(*) from t where ts = '2024-10-31T16:00:00Z'::timestamptz;
----
1
# control: a column against a column, thus the optimizer unwraps nothing
query I
select count(*) from t, u where t.ts::timestamptz = u.tstz;
----
1Please add two more cases:
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done! I've added all of these queries to datafusion/sqllogictest/test_files/datetime/timestamps.slt. I also added the two extra test cases (the symmetric guard check and the EXPLAIN block for the UTC session timezone) to ensure the optimization is still applied correctly when the offset is exactly zero. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let ts_naive = DataType::Timestamp(TimeUnit::Millisecond, None); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let ts_utc = DataType::Timestamp(TimeUnit::Millisecond, Some("UTC".into())); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let ts_etc_utc = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| DataType::Timestamp(TimeUnit::Millisecond, Some("Etc/UTC".into())); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let ts_gmt = DataType::Timestamp(TimeUnit::Millisecond, Some("GMT".into())); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let ts_sgt = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| DataType::Timestamp(TimeUnit::Millisecond, Some("Asia/Singapore".into())); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Naive <-> UTC is NOT lossy (UTC offset is 0, so literal cast is exact) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(!is_lossy_temporal_cast(&ts_naive, &ts_utc)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(!is_lossy_temporal_cast(&ts_utc, &ts_naive)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(!is_lossy_temporal_cast(&ts_naive, &ts_etc_utc)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(!is_lossy_temporal_cast(&ts_naive, &ts_gmt)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Naive <-> Non-UTC is lossy because it ignores session timezone | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(is_lossy_temporal_cast(&ts_naive, &ts_sgt)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(is_lossy_temporal_cast(&ts_sgt, &ts_naive)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1048
to
+1056
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This test must change with the two suggestions above. It now covers two fixed-offset spellings, and it shows that only one direction is lossy.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Tz-aware <-> Tz-aware is not lossy (both are UTC under the hood) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(!is_lossy_temporal_cast(&ts_utc, &ts_sgt)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| assert!(!is_lossy_temporal_cast(&ts_sgt, &ts_utc)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1038
to
+1061
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #[test] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fn test_timestamp_precision_narrowing_cast() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| let ts_ns = DataType::Timestamp(TimeUnit::Nanosecond, None); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -4301,6 +4301,10 @@ SELECT column1 FROM t_utc WHERE column1 < '2024-02-01T00:00:00' AT TIME ZONE 'Am | |||||||
| query P | ||||||||
| SELECT column1 FROM t_europe WHERE column1 = '2024-01-31T16:00:01' AT TIME ZONE 'America/Los_Angeles'; | ||||||||
| ---- | ||||||||
|
|
||||||||
|
Comment on lines
4302
to
4304
|
||||||||
| query P | ||||||||
| SELECT column1 FROM t_europe WHERE column1 = '2024-01-31T15:00:01' AT TIME ZONE 'America/Los_Angeles'; | ||||||||
| ---- | ||||||||
| 2024-02-01T00:00:01+01:00 | ||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I verified this change on your branch. The empty result is correct, but the PR does not give the reason, and the description says the opposite (see the note from the Copilot review). Please put the reason in the PR description. The arithmetic:
An empty result is a weak assertion. A guard that is too strong also gives an empty result, and this test cannot see the difference. Please keep a row here. The instant I ran this query two times on your branch: one time with your change, and one time with the new guard removed. Without the guard it gives zero rows, which is incorrect. With the guard it gives the row above. It is thus a correct test for this bug. Please keep the empty case also.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for catching that! I have updated the PR description with the exact explanation. I also restored the original empty test case and added your suggested 15:00:01 query alongside it to ensure we have a strong assertion that the correct row is being selected. |
||||||||
|
|
||||||||
| query P | ||||||||
|
|
@@ -5529,3 +5533,75 @@ query P | |||||||
| SELECT date_bin(NULL, TIMESTAMP '2023-01-01 12:30:00', TIMESTAMP '2023-01-01 12:00:00') | ||||||||
| ---- | ||||||||
| NULL | ||||||||
|
|
||||||||
| # Issue 25095: Optimizer incorrectly unwrapping timestamp cast when session timezone is not UTC | ||||||||
| statement ok | ||||||||
| set datafusion.execution.time_zone = 'Asia/Singapore'; | ||||||||
|
|
||||||||
| statement ok | ||||||||
| create table t_25095 as select TIMESTAMP '2024-11-01T00:00:00' as ts; | ||||||||
|
|
||||||||
| statement ok | ||||||||
| create table u_25095 as select '2024-10-31T16:00:00Z'::timestamptz as tstz; | ||||||||
|
|
||||||||
| # 2024-11-01 00:00 in Singapore is 2024-10-31 16:00 UTC | ||||||||
| query I | ||||||||
| select count(*) from t_25095 where ts::timestamptz = '2024-10-31T16:00:00Z'::timestamptz; | ||||||||
| ---- | ||||||||
| 1 | ||||||||
|
|
||||||||
| query I | ||||||||
| select count(*) from t_25095 where ts::timestamptz = '2024-11-01T00:00:00Z'::timestamptz; | ||||||||
| ---- | ||||||||
| 0 | ||||||||
|
|
||||||||
| # the same rewrite occurs for an implicit coercion | ||||||||
| query I | ||||||||
| select count(*) from t_25095 where ts = '2024-10-31T16:00:00Z'::timestamptz; | ||||||||
| ---- | ||||||||
| 1 | ||||||||
|
|
||||||||
| # control: a column against a column, thus the optimizer unwraps nothing | ||||||||
| query I | ||||||||
| select count(*) from t_25095, u_25095 where t_25095.ts::timestamptz = u_25095.tstz; | ||||||||
| ---- | ||||||||
| 1 | ||||||||
|
|
||||||||
| # A timezone-aware column against a timezone-naive literal | ||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit. This test does not exercise the guard. The coercion casts the literal, not the column, and that cast folds to a constant. The test is still a good test. But please change the comment, so that a reader does not think it tests the other direction of the guard.
Suggested change
|
||||||||
| query I | ||||||||
| select count(*) from u_25095 where tstz = TIMESTAMP '2024-11-01T00:00:00'; | ||||||||
| ---- | ||||||||
| 1 | ||||||||
|
|
||||||||
| # Set session timezone back to UTC and demonstrate that the cast IS unwrapped | ||||||||
| statement ok | ||||||||
| set datafusion.execution.time_zone = 'UTC'; | ||||||||
|
|
||||||||
| # The explain output should show that the cast s::timestamptz has been removed | ||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit. There is a tab character in this comment.
Suggested change
|
||||||||
| # because we allow unwrap_cast_in_comparison for UTC offsets | ||||||||
| query TT | ||||||||
| EXPLAIN select count(*) from t_25095 where ts::timestamptz = '2024-11-01T00:00:00Z'::timestamptz; | ||||||||
| ---- | ||||||||
| logical_plan | ||||||||
| 01)Projection: count(Int64(1)) AS count(*) | ||||||||
| 02)--Aggregate: groupBy=[[]], aggr=[[count(Int64(1))]] | ||||||||
| 03)----Projection: | ||||||||
| 04)------Filter: t_25095.ts = TimestampNanosecond(1730419200000000000, None) | ||||||||
| 05)--------TableScan: t_25095 projection=[ts] | ||||||||
| physical_plan | ||||||||
| 01)ProjectionExec: expr=[count(Int64(1))@0 as count(*)] | ||||||||
| 02)--AggregateExec: mode=Final, gby=[], aggr=[count(Int64(1))] | ||||||||
| 03)----CoalescePartitionsExec | ||||||||
| 04)------AggregateExec: mode=Partial, gby=[], aggr=[count(Int64(1))] | ||||||||
| 05)--------RepartitionExec: partitioning=RoundRobinBatch(4), input_partitions=1 | ||||||||
| 06)----------FilterExec: ts@0 = 1730419200000000000, projection=[] | ||||||||
| 07)------------DataSourceExec: partitions=1, partition_sizes=[1] | ||||||||
|
|
||||||||
| statement ok | ||||||||
| drop table t_25095; | ||||||||
|
|
||||||||
| statement ok | ||||||||
| drop table u_25095; | ||||||||
|
|
||||||||
| statement ok | ||||||||
| RESET datafusion.execution.time_zone; | ||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Blocker. This PR now changes six workflow files. They remove the Google Chrome apt list and add
|| trueafterapt-get update.These changes are not part of the fix, and the PR description does not mention them.
|| truehides all apt failures, also the permanent ones.maindoes not have this change.Please remove the three
ci:commits (838b442, 340c693, 72202c0). Your branch is 328 commits behindmain, and a rebase onmainis the best way to solve the CI problem:git fetch upstream main git rebase -i upstream/main # drop the three "ci:" commits