You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by co...@apache.org on 2024/01/13 19:25:31 UTC
(arrow-datafusion) branch main updated: Port tests in timestamp.rs to sqllogictest (#8818)
This is an automated email from the ASF dual-hosted git repository.
comphead pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new be361fdd80 Port tests in timestamp.rs to sqllogictest (#8818)
be361fdd80 is described below
commit be361fdd8079a2f44da70f6af6e9d8eb3f7d0020
Author: Cancai Cai <77...@users.noreply.github.com>
AuthorDate: Sun Jan 14 03:25:25 2024 +0800
Port tests in timestamp.rs to sqllogictest (#8818)
---
datafusion/core/tests/sql/timestamp.rs | 464 ----------------------
datafusion/sqllogictest/test_files/timestamps.slt | 53 +++
2 files changed, 53 insertions(+), 464 deletions(-)
diff --git a/datafusion/core/tests/sql/timestamp.rs b/datafusion/core/tests/sql/timestamp.rs
index ada66503a1..e74857cb31 100644
--- a/datafusion/core/tests/sql/timestamp.rs
+++ b/datafusion/core/tests/sql/timestamp.rs
@@ -18,470 +18,6 @@
use super::*;
use std::ops::Add;
-#[tokio::test]
-async fn test_current_timestamp_expressions() -> Result<()> {
- let t1 = chrono::Utc::now().timestamp();
- let ctx = SessionContext::new();
- let actual = execute(&ctx, "SELECT NOW(), NOW() as t2").await;
- let res1 = actual[0][0].as_str();
- let res2 = actual[0][1].as_str();
- let t3 = Utc::now().timestamp();
- let t2_naive = DateTime::parse_from_rfc3339(res1).unwrap();
-
- let t2 = t2_naive.timestamp();
- assert!(t1 <= t2 && t2 <= t3);
- assert_eq!(res2, res1);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn test_now_in_same_stmt_using_sql_function() -> Result<()> {
- let ctx = SessionContext::new();
-
- let df1 = ctx.sql("select now(), now() as now2").await?;
- let result = result_vec(&df1.collect().await?);
- assert_eq!(result[0][0], result[0][1]);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn test_now_across_statements() -> Result<()> {
- let ctx = SessionContext::new();
-
- let actual1 = execute(&ctx, "SELECT NOW()").await;
- let res1 = actual1[0][0].as_str();
-
- let actual2 = execute(&ctx, "SELECT NOW()").await;
- let res2 = actual2[0][0].as_str();
-
- assert!(res1 < res2);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn test_now_across_statements_using_sql_function() -> Result<()> {
- let ctx = SessionContext::new();
-
- let df1 = ctx.sql("select now()").await?;
- let rb1 = df1.collect().await?;
- let result1 = result_vec(&rb1);
- let res1 = result1[0][0].as_str();
-
- let df2 = ctx.sql("select now()").await?;
- let rb2 = df2.collect().await?;
- let result2 = result_vec(&rb2);
- let res2 = result2[0][0].as_str();
-
- assert!(res1 < res2);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn test_now_dataframe_api() -> Result<()> {
- let ctx = SessionContext::new();
- let df = ctx.sql("select 1").await?; // use this to get a DataFrame
- let df = df.select(vec![now(), now().alias("now2")])?;
- let result = result_vec(&df.collect().await?);
- assert_eq!(result[0][0], result[0][1]);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn test_now_dataframe_api_across_statements() -> Result<()> {
- let ctx = SessionContext::new();
- let df = ctx.sql("select 1").await?; // use this to get a DataFrame
- let df = df.select(vec![now()])?;
- let result = result_vec(&df.collect().await?);
-
- let df = ctx.sql("select 1").await?;
- let df = df.select(vec![now()])?;
- let result2 = result_vec(&df.collect().await?);
-
- assert_ne!(result[0][0], result2[0][0]);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn test_now_in_view() -> Result<()> {
- let ctx = SessionContext::new();
- let _df = ctx
- .sql("create or replace view test_now as select now()")
- .await?
- .collect()
- .await?;
-
- let df = ctx.sql("select * from test_now").await?;
- let result = result_vec(&df.collect().await?);
-
- let df1 = ctx.sql("select * from test_now").await?;
- let result2 = result_vec(&df1.collect().await?);
-
- assert_ne!(result[0][0], result2[0][0]);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn timestamp_minmax() -> Result<()> {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_tz_table::<TimestampMillisecondType>(None)?;
- let table_b =
- make_timestamp_tz_table::<TimestampNanosecondType>(Some("+00:00".into()))?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT MIN(table_a.ts), MAX(table_b.ts) FROM table_a, table_b";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = [
- "+-------------------------+-----------------------------+",
- "| MIN(table_a.ts) | MAX(table_b.ts) |",
- "+-------------------------+-----------------------------+",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T13:42:29.190855Z |",
- "+-------------------------+-----------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn timestamp_coercion() -> Result<()> {
- {
- let ctx = SessionContext::new();
- let table_a =
- make_timestamp_tz_table::<TimestampSecondType>(Some("+00:00".into()))?;
- let table_b =
- make_timestamp_tz_table::<TimestampMillisecondType>(Some("+00:00".into()))?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------------+--------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+----------------------+--------------------------+-------------------------+",
- "| 2020-09-08T13:42:29Z | 2020-09-08T13:42:29.190Z | true |",
- "| 2020-09-08T13:42:29Z | 2020-09-08T12:42:29.190Z | false |",
- "| 2020-09-08T13:42:29Z | 2020-09-08T11:42:29.190Z | false |",
- "| 2020-09-08T12:42:29Z | 2020-09-08T13:42:29.190Z | false |",
- "| 2020-09-08T12:42:29Z | 2020-09-08T12:42:29.190Z | true |",
- "| 2020-09-08T12:42:29Z | 2020-09-08T11:42:29.190Z | false |",
- "| 2020-09-08T11:42:29Z | 2020-09-08T13:42:29.190Z | false |",
- "| 2020-09-08T11:42:29Z | 2020-09-08T12:42:29.190Z | false |",
- "| 2020-09-08T11:42:29Z | 2020-09-08T11:42:29.190Z | true |",
- "+----------------------+--------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampSecondType>()?;
- let table_b = make_timestamp_table::<TimestampMicrosecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+---------------------+----------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+---------------------+----------------------------+-------------------------+",
- "| 2020-09-08T13:42:29 | 2020-09-08T13:42:29.190855 | true |",
- "| 2020-09-08T13:42:29 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T13:42:29 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T12:42:29 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T12:42:29 | 2020-09-08T12:42:29.190855 | true |",
- "| 2020-09-08T12:42:29 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T11:42:29 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T11:42:29 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T11:42:29 | 2020-09-08T11:42:29.190855 | true |",
- "+---------------------+----------------------------+-------------------------+",
-
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampSecondType>()?;
- let table_b = make_timestamp_table::<TimestampNanosecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+---------------------+----------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+---------------------+----------------------------+-------------------------+",
- "| 2020-09-08T13:42:29 | 2020-09-08T13:42:29.190855 | true |",
- "| 2020-09-08T13:42:29 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T13:42:29 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T12:42:29 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T12:42:29 | 2020-09-08T12:42:29.190855 | true |",
- "| 2020-09-08T12:42:29 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T11:42:29 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T11:42:29 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T11:42:29 | 2020-09-08T11:42:29.190855 | true |",
- "+---------------------+----------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampMillisecondType>()?;
- let table_b = make_timestamp_table::<TimestampSecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+-------------------------+---------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+-------------------------+---------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T13:42:29 | true |",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T12:42:29 | false |",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T11:42:29 | false |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T13:42:29 | false |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T12:42:29 | true |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T11:42:29 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T13:42:29 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T12:42:29 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T11:42:29 | true |",
- "+-------------------------+---------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampMillisecondType>()?;
- let table_b = make_timestamp_table::<TimestampMicrosecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+-------------------------+----------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+-------------------------+----------------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T13:42:29.190855 | true |",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T12:42:29.190855 | true |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T11:42:29.190855 | true |",
- "+-------------------------+----------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampMillisecondType>()?;
- let table_b = make_timestamp_table::<TimestampNanosecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+-------------------------+----------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+-------------------------+----------------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T13:42:29.190855 | true |",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T13:42:29.190 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T12:42:29.190855 | true |",
- "| 2020-09-08T12:42:29.190 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190 | 2020-09-08T11:42:29.190855 | true |",
- "+-------------------------+----------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampMicrosecondType>()?;
- let table_b = make_timestamp_table::<TimestampSecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------------------+---------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+----------------------------+---------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T13:42:29 | true |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T12:42:29 | false |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T11:42:29 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T13:42:29 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T12:42:29 | true |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T11:42:29 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T13:42:29 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T12:42:29 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T11:42:29 | true |",
- "+----------------------------+---------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampMicrosecondType>()?;
- let table_b = make_timestamp_table::<TimestampMillisecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------------------+-------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+----------------------------+-------------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T13:42:29.190 | true |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T12:42:29.190 | false |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T11:42:29.190 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T13:42:29.190 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T12:42:29.190 | true |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T11:42:29.190 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T13:42:29.190 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T12:42:29.190 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T11:42:29.190 | true |",
- "+----------------------------+-------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampMicrosecondType>()?;
- let table_b = make_timestamp_table::<TimestampNanosecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------------------+----------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+----------------------------+----------------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T13:42:29.190855 | true |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T12:42:29.190855 | true |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T11:42:29.190855 | true |",
- "+----------------------------+----------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampNanosecondType>()?;
- let table_b = make_timestamp_table::<TimestampSecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------------------+---------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+----------------------------+---------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T13:42:29 | true |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T12:42:29 | false |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T11:42:29 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T13:42:29 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T12:42:29 | true |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T11:42:29 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T13:42:29 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T12:42:29 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T11:42:29 | true |",
- "+----------------------------+---------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampNanosecondType>()?;
- let table_b = make_timestamp_table::<TimestampMillisecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------------------+-------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+----------------------------+-------------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T13:42:29.190 | true |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T12:42:29.190 | false |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T11:42:29.190 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T13:42:29.190 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T12:42:29.190 | true |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T11:42:29.190 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T13:42:29.190 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T12:42:29.190 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T11:42:29.190 | true |",
- "+----------------------------+-------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- {
- let ctx = SessionContext::new();
- let table_a = make_timestamp_table::<TimestampNanosecondType>()?;
- let table_b = make_timestamp_table::<TimestampMicrosecondType>()?;
- ctx.register_table("table_a", table_a)?;
- ctx.register_table("table_b", table_b)?;
-
- let sql = "SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------------------+----------------------------+-------------------------+",
- "| ts | ts | table_a.ts = table_b.ts |",
- "+----------------------------+----------------------------+-------------------------+",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T13:42:29.190855 | true |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T13:42:29.190855 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T12:42:29.190855 | true |",
- "| 2020-09-08T12:42:29.190855 | 2020-09-08T11:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T13:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T12:42:29.190855 | false |",
- "| 2020-09-08T11:42:29.190855 | 2020-09-08T11:42:29.190855 | true |",
- "+----------------------------+----------------------------+-------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- }
-
- Ok(())
-}
-
#[tokio::test]
async fn group_by_timestamp_millis() -> Result<()> {
let ctx = SessionContext::new();
diff --git a/datafusion/sqllogictest/test_files/timestamps.slt b/datafusion/sqllogictest/test_files/timestamps.slt
index 8b0f50cedf..7829ce53ac 100644
--- a/datafusion/sqllogictest/test_files/timestamps.slt
+++ b/datafusion/sqllogictest/test_files/timestamps.slt
@@ -1894,3 +1894,56 @@ query B
select arrow_cast(now(), 'Date64') < arrow_cast('2022-02-02 02:02:02', 'Timestamp(Nanosecond, None)');
----
false
+
+##########
+## Test query MAX Timestamp and MiN Timestamp
+##########
+
+statement ok
+create table table_a (val int, ts timestamp) as values (1, '2020-09-08T11:42:29.190'::timestamp), (2, '2000-02-01T00:00:00'::timestamp)
+
+query P
+SELECT MIN(table_a.ts) FROM table_a;
+----
+2000-02-01T00:00:00
+
+query P
+SELECT MAX(table_a.ts) FROM table_a;
+----
+2020-09-08T11:42:29.190
+
+statement ok
+drop table table_a
+
+##########
+## Test query MAX Timestamp and MiN Timestamp
+##########
+
+statement ok
+create table table_a (ts timestamp) as values
+ ('2020-09-08T11:42:29Z'::timestamp),
+ ('2020-09-08T12:42:29Z'::timestamp),
+ ('2020-09-08T13:42:29Z'::timestamp)
+
+statement ok
+create table table_b (ts timestamp) as values
+ ('2020-09-08T11:42:29.190Z'::timestamp),
+ ('2020-09-08T13:42:29.190Z'::timestamp),
+ ('2020-09-08T12:42:29.190Z'::timestamp)
+
+query PPB
+SELECT table_a.ts, table_b.ts, table_a.ts = table_b.ts FROM table_a, table_b order by table_a.ts desc, table_b.ts desc
+----
+2020-09-08T13:42:29 2020-09-08T13:42:29.190 false
+2020-09-08T13:42:29 2020-09-08T12:42:29.190 false
+2020-09-08T13:42:29 2020-09-08T11:42:29.190 false
+2020-09-08T12:42:29 2020-09-08T13:42:29.190 false
+2020-09-08T12:42:29 2020-09-08T12:42:29.190 false
+2020-09-08T12:42:29 2020-09-08T11:42:29.190 false
+2020-09-08T11:42:29 2020-09-08T13:42:29.190 false
+2020-09-08T11:42:29 2020-09-08T12:42:29.190 false
+2020-09-08T11:42:29 2020-09-08T11:42:29.190 false
+
+
+
+