alamb commented on code in PR #5140: URL: https://github.com/apache/arrow-datafusion/pull/5140#discussion_r1093136598
########## datafusion/core/tests/sql/timestamp.rs: ########## @@ -1742,5 +1741,55 @@ async fn test_ts_dt_binary_ops() -> Result<()> { assert_batches_eq!(expected, &results); + //test cast path timestamp date using literals + let sql = "select '2000-01-01'::timestamp >= '2000-01-01'::date"; Review Comment: You might be able to add these tests to sqllogictest if you wanted -- https://github.com/apache/arrow-datafusion/blob/master/datafusion/core/tests/sqllogictests/test_files/timestamps.slt Not required but I find the sqllogictest framework much easier to work with ########## datafusion/core/tests/sql/timestamp.rs: ########## @@ -1742,5 +1741,55 @@ async fn test_ts_dt_binary_ops() -> Result<()> { assert_batches_eq!(expected, &results); + //test cast path timestamp date using literals + let sql = "select '2000-01-01'::timestamp >= '2000-01-01'::date"; + let df = ctx.sql(sql).await.unwrap(); + + let plan = df.explain(true, false)?.collect().await?; + let batch = &plan[0]; + let mut res: Option<String> = None; + for row in 0..batch.num_rows() { + if &array_value_to_string(batch.column(0), row)? + == "logical_plan after type_coercion" + { + res = Some(array_value_to_string(batch.column(1), row)?); + break; + } + } + assert_eq!(res, Some("Projection: CAST(Utf8(\"2000-01-01\") AS Timestamp(Nanosecond, None)) >= CAST(CAST(Utf8(\"2000-01-01\") AS Date32) AS Timestamp(Nanosecond, None))\n EmptyRelation".to_string())); + + //test cast path timestamp date using function + let sql = "select now() >= '2000-01-01'::date"; + let df = ctx.sql(sql).await.unwrap(); + + let plan = df.explain(true, false)?.collect().await?; + let batch = &plan[0]; + let mut res: Option<String> = None; + for row in 0..batch.num_rows() { + if &array_value_to_string(batch.column(0), row)? + == "logical_plan after type_coercion" + { + res = Some(array_value_to_string(batch.column(1), row)?); + break; + } + } + assert_eq!(res, Some("Projection: CAST(now() AS Timestamp(Nanosecond, None)) >= CAST(CAST(Utf8(\"2000-01-01\") AS Date32) AS Timestamp(Nanosecond, None))\n EmptyRelation".to_string())); + + let sql = "select now() = current_date()"; + let df = ctx.sql(sql).await.unwrap(); + + let plan = df.explain(true, false)?.collect().await?; + let batch = &plan[0]; + let mut res: Option<String> = None; + for row in 0..batch.num_rows() { + if &array_value_to_string(batch.column(0), row)? + == "logical_plan after type_coercion" + { + res = Some(array_value_to_string(batch.column(1), row)?); + break; + } + } + assert_eq!(res, Some("Projection: CAST(now() AS Timestamp(Nanosecond, None)) = CAST(currentdate() AS Timestamp(Nanosecond, None))\n EmptyRelation".to_string())); Review Comment: 👍 ########## datafusion/expr/src/type_coercion/functions.rs: ########## @@ -174,8 +174,8 @@ pub fn can_coerce_from(type_into: &DataType, type_from: &DataType) -> bool { | Float64 | Decimal128(_, _) ), - Timestamp(TimeUnit::Nanosecond, None) => { - matches!(type_from, Null | Timestamp(_, None)) + Timestamp(TimeUnit::Nanosecond, _) => { + matches!(type_from, Null | Timestamp(_, _) | Date32) Review Comment: 👍 (I have a draft PR in the works to support coercing from `utf8` as well https://github.com/apache/arrow-datafusion/pull/5117) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org