This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git


The following commit(s) were added to refs/heads/master by this push:
     new 3eb55e9a0 Upgrade to arrow 20.0.0 (but no change to object_store), 
including `prost`, and `tonic` (#3083)
3eb55e9a0 is described below

commit 3eb55e9a0510d872f6f7765b1a5f17db46486e45
Author: Brent Gardner <[email protected]>
AuthorDate: Tue Aug 9 09:45:22 2022 -0700

    Upgrade to arrow 20.0.0 (but no change to object_store), including `prost`, 
and `tonic` (#3083)
    
    * Upgrade arrow
    
    fix decimal (#4)
    
    Fix human error
    
    Patch crates io to fix build (#5)
    
    * fix decimal
    
    * patch crate versions
    
    Patch objectstore
    
    Test in CI
    
    Undo override?
    
    Fix more errors
    
    Fix last error?
    
    Formatting
    
    Clippy
    
    Fixes
    
    Fix refs
    
    Able to get session context, but JDBC driver hung
    
    Upgrade to arrow 20
    
    Upgrade to RC2
    
    Formatting
    
    Fix some imports
    
    Install protoc
    
    Try platform agnostic path
    
    Debug in CI :(
    
    Debug in CI :(
    
    Debug in CI :(
    
    Not worth it, just separate builds
    
    Variables
    
    Fixes
    
    Fix windows?
    
    Fix windows?
    
    Hackily fix windows
    
    Down to 1 failure
    
    Fix protoc
    
    All? tests pass
    
    Formatting
    
    * Fix remaining tests
    
    * Clippy
    
    * Update docs for Windows
    
    * Try with old objectstore
    
    * Revert path "fixes" that broke windows
    
    * Update to arrow 20
---
 .github/workflows/rust.yml                         |  76 +++++++++-
 CONTRIBUTING.md                                    |   9 ++
 datafusion-cli/Cargo.toml                          |   2 +-
 datafusion-examples/Cargo.toml                     |   6 +-
 datafusion/common/Cargo.toml                       |   5 +-
 datafusion/common/src/from_slice.rs                |   2 +-
 datafusion/common/src/scalar.rs                    |  22 +--
 datafusion/core/Cargo.toml                         |   4 +-
 datafusion/core/fuzz-utils/Cargo.toml              |   2 +-
 .../core/src/avro_to_arrow/arrow_array_reader.rs   |  10 +-
 datafusion/core/src/avro_to_arrow/schema.rs        |   4 +-
 datafusion/core/src/catalog/information_schema.rs  |   2 +-
 .../core/src/datasource/file_format/parquet.rs     |   8 +-
 datafusion/core/src/physical_optimizer/pruning.rs  |   8 +-
 .../core/src/physical_plan/file_format/parquet.rs  |  22 +--
 datafusion/core/src/physical_plan/hash_join.rs     |   4 +-
 datafusion/core/src/physical_plan/hash_utils.rs    |   2 +-
 datafusion/core/src/physical_plan/repartition.rs   |   2 +-
 .../core/src/physical_plan/sort_merge_join.rs      |   4 +-
 datafusion/core/src/scheduler/plan.rs              |   2 +-
 datafusion/core/src/scheduler/task.rs              |   2 +-
 datafusion/core/tests/parquet_pruning.rs           |   4 +-
 datafusion/core/tests/sql/aggregates.rs            |   8 +-
 datafusion/core/tests/sql/decimal.rs               | 168 ++++++++++-----------
 datafusion/core/tests/sql/errors.rs                |   5 +-
 datafusion/core/tests/sql/joins.rs                 |  32 ++--
 datafusion/core/tests/sql/mod.rs                   |   4 +-
 datafusion/expr/Cargo.toml                         |   2 +-
 datafusion/expr/src/aggregate_function.rs          |  48 +++---
 datafusion/expr/src/binary_rule.rs                 | 112 +++++++-------
 datafusion/expr/src/type_coercion.rs               |   2 +-
 datafusion/expr/src/utils.rs                       |   2 +-
 datafusion/jit/Cargo.toml                          |   2 +-
 datafusion/optimizer/Cargo.toml                    |   2 +-
 .../optimizer/src/decorrelate_scalar_subquery.rs   |   6 +-
 .../optimizer/src/decorrelate_where_exists.rs      |   3 +-
 datafusion/optimizer/src/decorrelate_where_in.rs   |   5 +-
 datafusion/optimizer/src/simplify_expressions.rs   |  15 +-
 datafusion/physical-expr/Cargo.toml                |   2 +-
 datafusion/physical-expr/src/aggregate/average.rs  |  14 +-
 datafusion/physical-expr/src/aggregate/build_in.rs |  37 +++--
 datafusion/physical-expr/src/aggregate/min_max.rs  |  26 ++--
 datafusion/physical-expr/src/aggregate/sum.rs      |  20 +--
 .../physical-expr/src/aggregate/sum_distinct.rs    |   4 +-
 datafusion/physical-expr/src/expressions/binary.rs |  18 +--
 .../src/expressions/binary/adapter.rs              |   2 +-
 .../src/expressions/binary/kernels_arrow.rs        |   8 +-
 datafusion/physical-expr/src/expressions/cast.rs   |  40 ++---
 .../physical-expr/src/expressions/in_list.rs       |  56 ++++++-
 .../physical-expr/src/expressions/try_cast.rs      |  34 ++---
 datafusion/physical-expr/src/type_coercion.rs      |   2 +-
 datafusion/proto/Cargo.toml                        |   6 +-
 datafusion/proto/src/from_proto.rs                 |   4 +-
 datafusion/proto/src/lib.rs                        |  10 +-
 datafusion/proto/src/to_proto.rs                   |   4 +-
 datafusion/row/Cargo.toml                          |   2 +-
 datafusion/row/src/layout.rs                       |   2 +-
 datafusion/row/src/lib.rs                          |   2 +-
 datafusion/sql/Cargo.toml                          |   2 +-
 datafusion/sql/examples/sql.rs                     |   4 +-
 datafusion/sql/src/planner.rs                      |  18 +--
 datafusion/sql/src/utils.rs                        |   8 +-
 62 files changed, 527 insertions(+), 416 deletions(-)

diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 3a15759e1..6d08b98a5 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -82,6 +82,16 @@ jobs:
       - uses: actions/checkout@v2
         with:
           submodules: true
+      - name: Install protobuf compiler
+        shell: bash
+        run: |
+          mkdir -p $HOME/d/protoc
+          cd $HOME/d/protoc
+          export PROTO_ZIP="protoc-21.4-linux-x86_64.zip"
+          curl -LO 
https://github.com/protocolbuffers/protobuf/releases/download/v21.4/$PROTO_ZIP
+          unzip $PROTO_ZIP
+          export PATH=$PATH:$HOME/d/protoc/bin
+          protoc --version
       - name: Cache Cargo
         uses: actions/cache@v3
         with:
@@ -94,6 +104,7 @@ jobs:
           rust-version: ${{ matrix.rust }}
       - name: Run tests
         run: |
+          export PATH=$PATH:$HOME/d/protoc/bin
           cargo test --features avro,jit,scheduler,json
           # test datafusion-sql examples
           cargo run --example sql
@@ -159,17 +170,65 @@ jobs:
           POSTGRES_USER: postgres
           POSTGRES_PASSWORD: postgres
 
-  windows-and-macos:
-    name: Test on ${{ matrix.os }} Rust ${{ matrix.rust }}
+  windows:
+    name: Test on Windows Rust ${{ matrix.rust }}
     runs-on: ${{ matrix.os }}
     strategy:
       matrix:
-        os: [windows-latest, macos-latest]
+        os: [windows-latest]
         rust: [stable]
     steps:
       - uses: actions/checkout@v2
         with:
           submodules: true
+      - name: Install protobuf compiler
+        shell: bash
+        run: |
+          mkdir -p $HOME/d/protoc
+          cd $HOME/d/protoc
+          export PROTO_ZIP="protoc-21.4-win64.zip"
+          curl -LO 
https://github.com/protocolbuffers/protobuf/releases/download/v21.4/$PROTO_ZIP
+          unzip $PROTO_ZIP
+          export PATH=$PATH:$HOME/d/protoc/bin
+          protoc.exe --version
+      # TODO: this won't cache anything, which is expensive. Setup this action
+      # with a OS-dependent path.
+      - name: Setup Rust toolchain
+        run: |
+          rustup toolchain install ${{ matrix.rust }}
+          rustup default ${{ matrix.rust }}
+          rustup component add rustfmt
+      - name: Run tests
+        shell: bash
+        run: |
+          export PATH=$PATH:$HOME/d/protoc/bin
+          cargo test
+        env:
+          # do not produce debug symbols to keep memory usage down
+          RUSTFLAGS: "-C debuginfo=0"
+
+  macos:
+    name: Test on MacOS Rust ${{ matrix.rust }}
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os: [macos-latest]
+        rust: [stable]
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          submodules: true
+      - name: Install protobuf compiler
+        shell: bash
+        run: |
+          mkdir -p $HOME/d/protoc
+          cd $HOME/d/protoc
+          export PROTO_ZIP="protoc-21.4-osx-x86_64.zip"
+          curl -LO 
https://github.com/protocolbuffers/protobuf/releases/download/v21.4/$PROTO_ZIP
+          unzip $PROTO_ZIP
+          echo "$HOME/d/protoc/bin" >> $GITHUB_PATH
+          export PATH=$PATH:$HOME/d/protoc/bin
+          protoc --version
       # TODO: this won't cache anything, which is expensive. Setup this action
       # with a OS-dependent path.
       - name: Setup Rust toolchain
@@ -250,6 +309,16 @@ jobs:
       - uses: actions/checkout@v2
         with:
           submodules: true
+      - name: Install protobuf compiler
+        shell: bash
+        run: |
+          mkdir -p $HOME/d/protoc
+          cd $HOME/d/protoc
+          export PROTO_ZIP="protoc-21.4-linux-x86_64.zip"
+          curl -LO 
https://github.com/protocolbuffers/protobuf/releases/download/v21.4/$PROTO_ZIP
+          unzip $PROTO_ZIP
+          export PATH=$PATH:$HOME/d/protoc/bin
+          protoc --version
       - name: Setup Rust toolchain
         run: |
           rustup toolchain install ${{ matrix.rust }}
@@ -263,6 +332,7 @@ jobs:
           key: cargo-coverage-cache3-
       - name: Run coverage
         run: |
+          export PATH=$PATH:$HOME/d/protoc/bin
           rustup toolchain install stable
           rustup default stable
           cargo install --version 0.20.1 cargo-tarpaulin
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 467fc47f7..0a8a34fe8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -35,6 +35,15 @@ list to help you get started.
 
 This section describes how you can get started at developing DataFusion.
 
+### Windows setup
+
+```shell
+wget 
https://az792536.vo.msecnd.net/vms/VMBuild_20190311/VirtualBox/MSEdge/MSEdge.Win10.VirtualBox.zip
+choco install -y git rustup.install visualcpp-build-tools
+git-bash.exe
+cargo build
+```
+
 ### Bootstrap environment
 
 DataFusion is written in Rust and it uses a standard rust toolkit:
diff --git a/datafusion-cli/Cargo.toml b/datafusion-cli/Cargo.toml
index 6ac3a30c8..adb9c7dbd 100644
--- a/datafusion-cli/Cargo.toml
+++ b/datafusion-cli/Cargo.toml
@@ -29,7 +29,7 @@ rust-version = "1.59"
 readme = "README.md"
 
 [dependencies]
-arrow = { version = "19.0.0" }
+arrow = { version = "20.0.0" }
 clap = { version = "3", features = ["derive", "cargo"] }
 datafusion = { path = "../datafusion/core", version = "10.0.0" }
 dirs = "4.0.0"
diff --git a/datafusion-examples/Cargo.toml b/datafusion-examples/Cargo.toml
index ed23512f3..fde19e7db 100644
--- a/datafusion-examples/Cargo.toml
+++ b/datafusion-examples/Cargo.toml
@@ -34,13 +34,13 @@ path = "examples/avro_sql.rs"
 required-features = ["datafusion/avro"]
 
 [dev-dependencies]
-arrow-flight = { version = "19.0.0" }
+arrow-flight = { version = "20.0.0" }
 async-trait = "0.1.41"
 datafusion = { path = "../datafusion/core" }
 futures = "0.3"
 num_cpus = "1.13.0"
-prost = "0.10"
+prost = "0.11.0"
 serde = { version = "1.0.136", features = ["derive"] }
 serde_json = "1.0.82"
 tokio = { version = "1.0", features = ["macros", "rt", "rt-multi-thread", 
"sync", "parking_lot"] }
-tonic = "0.7"
+tonic = "0.8"
diff --git a/datafusion/common/Cargo.toml b/datafusion/common/Cargo.toml
index 9bab66ada..35ed2bb2a 100644
--- a/datafusion/common/Cargo.toml
+++ b/datafusion/common/Cargo.toml
@@ -39,11 +39,12 @@ pyarrow = ["pyo3"]
 
 [dependencies]
 apache-avro = { version = "0.14", features = ["snappy"], optional = true }
-arrow = { version = "19.0.0", features = ["prettyprint"] }
+arrow = { version = "20.0.0", features = ["prettyprint"] }
+avro-rs = { version = "0.13", features = ["snappy"], optional = true }
 cranelift-module = { version = "0.86.1", optional = true }
 object_store = { version = "0.3", optional = true }
 ordered-float = "3.0"
-parquet = { version = "19.0.0", features = ["arrow"], optional = true }
+parquet = { version = "20.0.0", features = ["arrow"], optional = true }
 pyo3 = { version = "0.16", optional = true }
 serde_json = "1.0"
 sqlparser = "0.20"
diff --git a/datafusion/common/src/from_slice.rs 
b/datafusion/common/src/from_slice.rs
index 2fedc668a..385848f93 100644
--- a/datafusion/common/src/from_slice.rs
+++ b/datafusion/common/src/from_slice.rs
@@ -69,7 +69,7 @@ where
             offsets.push(length_so_far);
             values.extend_from_slice(s);
         }
-        let array_data = ArrayData::builder(Self::get_data_type())
+        let array_data = ArrayData::builder(Self::DATA_TYPE)
             .len(slice.len())
             .add_buffer(Buffer::from_slice_ref(&offsets))
             .add_buffer(Buffer::from_slice_ref(&values));
diff --git a/datafusion/common/src/scalar.rs b/datafusion/common/src/scalar.rs
index 5b45b4b06..3069a54f4 100644
--- a/datafusion/common/src/scalar.rs
+++ b/datafusion/common/src/scalar.rs
@@ -27,7 +27,7 @@ use arrow::{
         IntervalMonthDayNanoType, IntervalUnit, IntervalYearMonthType, 
TimeUnit,
         TimestampMicrosecondType, TimestampMillisecondType, 
TimestampNanosecondType,
         TimestampSecondType, UInt16Type, UInt32Type, UInt64Type, UInt8Type,
-        DECIMAL_MAX_PRECISION,
+        DECIMAL128_MAX_PRECISION,
     },
     util::decimal::{BasicDecimal, Decimal128},
 };
@@ -611,7 +611,7 @@ impl ScalarValue {
         scale: usize,
     ) -> Result<Self> {
         // make sure the precision and scale is valid
-        if precision <= DECIMAL_MAX_PRECISION && scale <= precision {
+        if precision <= DECIMAL128_MAX_PRECISION && scale <= precision {
             return Ok(ScalarValue::Decimal128(Some(value), precision, scale));
         }
         Err(DataFusionError::Internal(format!(
@@ -654,7 +654,7 @@ impl ScalarValue {
             ScalarValue::Int32(_) => DataType::Int32,
             ScalarValue::Int64(_) => DataType::Int64,
             ScalarValue::Decimal128(_, precision, scale) => {
-                DataType::Decimal(*precision, *scale)
+                DataType::Decimal128(*precision, *scale)
             }
             ScalarValue::TimestampSecond(_, tz_opt) => {
                 DataType::Timestamp(TimeUnit::Second, tz_opt.clone())
@@ -935,7 +935,7 @@ impl ScalarValue {
         }
 
         let array: ArrayRef = match &data_type {
-            DataType::Decimal(precision, scale) => {
+            DataType::Decimal128(precision, scale) => {
                 let decimal_array =
                     ScalarValue::iter_to_decimal_array(scalars, precision, 
scale)?;
                 Arc::new(decimal_array)
@@ -1448,7 +1448,7 @@ impl ScalarValue {
 
         Ok(match array.data_type() {
             DataType::Null => ScalarValue::Null,
-            DataType::Decimal(precision, scale) => {
+            DataType::Decimal128(precision, scale) => {
                 ScalarValue::get_decimal_value_from_array(array, index, 
precision, scale)
             }
             DataType::Boolean => typed_cast!(array, index, BooleanArray, 
Boolean),
@@ -1899,7 +1899,7 @@ impl TryFrom<&DataType> for ScalarValue {
             DataType::UInt16 => ScalarValue::UInt16(None),
             DataType::UInt32 => ScalarValue::UInt32(None),
             DataType::UInt64 => ScalarValue::UInt64(None),
-            DataType::Decimal(precision, scale) => {
+            DataType::Decimal128(precision, scale) => {
                 ScalarValue::Decimal128(None, *precision, *scale)
             }
             DataType::Utf8 => ScalarValue::Utf8(None),
@@ -2145,7 +2145,7 @@ mod tests {
     #[test]
     fn scalar_decimal_test() {
         let decimal_value = ScalarValue::Decimal128(Some(123), 10, 1);
-        assert_eq!(DataType::Decimal(10, 1), decimal_value.get_datatype());
+        assert_eq!(DataType::Decimal128(10, 1), decimal_value.get_datatype());
         let try_into_value: i128 = decimal_value.clone().try_into().unwrap();
         assert_eq!(123_i128, try_into_value);
         assert!(!decimal_value.is_null());
@@ -2163,14 +2163,14 @@ mod tests {
         let array = decimal_value.to_array();
         let array = array.as_any().downcast_ref::<Decimal128Array>().unwrap();
         assert_eq!(1, array.len());
-        assert_eq!(DataType::Decimal(10, 1), array.data_type().clone());
+        assert_eq!(DataType::Decimal128(10, 1), array.data_type().clone());
         assert_eq!(123i128, array.value(0).as_i128());
 
         // decimal scalar to array with size
         let array = decimal_value.to_array_of_size(10);
         let array_decimal = 
array.as_any().downcast_ref::<Decimal128Array>().unwrap();
         assert_eq!(10, array.len());
-        assert_eq!(DataType::Decimal(10, 1), array.data_type().clone());
+        assert_eq!(DataType::Decimal128(10, 1), array.data_type().clone());
         assert_eq!(123i128, array_decimal.value(0).as_i128());
         assert_eq!(123i128, array_decimal.value(9).as_i128());
         // test eq array
@@ -2208,7 +2208,7 @@ mod tests {
         // convert the vec to decimal array and check the result
         let array = 
ScalarValue::iter_to_array(decimal_vec.into_iter()).unwrap();
         assert_eq!(3, array.len());
-        assert_eq!(DataType::Decimal(10, 2), array.data_type().clone());
+        assert_eq!(DataType::Decimal128(10, 2), array.data_type().clone());
 
         let decimal_vec = vec![
             ScalarValue::Decimal128(Some(1), 10, 2),
@@ -2218,7 +2218,7 @@ mod tests {
         ];
         let array = 
ScalarValue::iter_to_array(decimal_vec.into_iter()).unwrap();
         assert_eq!(4, array.len());
-        assert_eq!(DataType::Decimal(10, 2), array.data_type().clone());
+        assert_eq!(DataType::Decimal128(10, 2), array.data_type().clone());
 
         assert!(ScalarValue::try_new_decimal128(1, 10, 2)
             .unwrap()
diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml
index a76b2fc49..4ef1af708 100644
--- a/datafusion/core/Cargo.toml
+++ b/datafusion/core/Cargo.toml
@@ -56,7 +56,7 @@ unicode_expressions = 
["datafusion-physical-expr/regex_expressions", "datafusion
 [dependencies]
 ahash = { version = "0.7", default-features = false }
 apache-avro = { version = "0.14", optional = true }
-arrow = { version = "19.0.0", features = ["prettyprint"] }
+arrow = { version = "20.0.0", features = ["prettyprint"] }
 async-trait = "0.1.41"
 bytes = "1.1"
 chrono = { version = "0.4", default-features = false }
@@ -78,7 +78,7 @@ num_cpus = "1.13.0"
 object_store = "0.3.0"
 ordered-float = "3.0"
 parking_lot = "0.12"
-parquet = { version = "19.0.0", features = ["arrow", "async"] }
+parquet = { version = "20.0.0", features = ["arrow", "async"] }
 paste = "^1.0"
 pin-project-lite = "^0.2.7"
 pyo3 = { version = "0.16", optional = true }
diff --git a/datafusion/core/fuzz-utils/Cargo.toml 
b/datafusion/core/fuzz-utils/Cargo.toml
index 0d66a6999..46c386f24 100644
--- a/datafusion/core/fuzz-utils/Cargo.toml
+++ b/datafusion/core/fuzz-utils/Cargo.toml
@@ -23,6 +23,6 @@ edition = "2021"
 # See more keys and their definitions at 
https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-arrow = { version = "19.0.0", features = ["prettyprint"] }
+arrow = { version = "20.0.0", features = ["prettyprint"] }
 env_logger = "0.9.0"
 rand = "0.8"
diff --git a/datafusion/core/src/avro_to_arrow/arrow_array_reader.rs 
b/datafusion/core/src/avro_to_arrow/arrow_array_reader.rs
index 864a675ed..2da8066b1 100644
--- a/datafusion/core/src/avro_to_arrow/arrow_array_reader.rs
+++ b/datafusion/core/src/avro_to_arrow/arrow_array_reader.rs
@@ -101,12 +101,10 @@ impl<'a, R: Read> AvroArrowArrayReader<'a, R> {
                     "Failed to parse avro value: {:?}",
                     e
                 ))),
-                other => {
-                    return Err(ArrowError::ParseError(format!(
-                        "Row needs to be of type object, got: {:?}",
-                        other
-                    )))
-                }
+                other => Err(ArrowError::ParseError(format!(
+                    "Row needs to be of type object, got: {:?}",
+                    other
+                ))),
             })
             .collect::<ArrowResult<Vec<Vec<(String, Value)>>>>()?;
         if rows.is_empty() {
diff --git a/datafusion/core/src/avro_to_arrow/schema.rs 
b/datafusion/core/src/avro_to_arrow/schema.rs
index 5e601504d..d19641896 100644
--- a/datafusion/core/src/avro_to_arrow/schema.rs
+++ b/datafusion/core/src/avro_to_arrow/schema.rs
@@ -141,7 +141,7 @@ fn schema_to_field_with_props(
         AvroSchema::Fixed { size, .. } => DataType::FixedSizeBinary(*size as 
i32),
         AvroSchema::Decimal {
             precision, scale, ..
-        } => DataType::Decimal(*precision, *scale),
+        } => DataType::Decimal128(*precision, *scale),
         AvroSchema::Uuid => DataType::FixedSizeBinary(16),
         AvroSchema::Date => DataType::Date32,
         AvroSchema::TimeMillis => DataType::Time32(TimeUnit::Millisecond),
@@ -217,7 +217,7 @@ fn default_field_name(dt: &DataType) -> &str {
         DataType::Union(_, _, _) => "union",
         DataType::Dictionary(_, _) => "map",
         DataType::Map(_, _) => unimplemented!("Map support not implemented"),
-        DataType::Decimal(_, _) => "decimal",
+        DataType::Decimal128(_, _) => "decimal",
         DataType::Decimal256(_, _) => "decimal",
     }
 }
diff --git a/datafusion/core/src/catalog/information_schema.rs 
b/datafusion/core/src/catalog/information_schema.rs
index d4944c2d5..49b1f9dc7 100644
--- a/datafusion/core/src/catalog/information_schema.rs
+++ b/datafusion/core/src/catalog/information_schema.rs
@@ -508,7 +508,7 @@ impl InformationSchemaColumnsBuilder {
             Float32 => (Some(24), Some(2), None),
             // Numbers from postgres `double` type
             Float64 => (Some(24), Some(2), None),
-            Decimal(precision, scale) => {
+            Decimal128(precision, scale) => {
                 (Some(*precision as u64), Some(10), Some(*scale as u64))
             }
             _ => (None, None, None),
diff --git a/datafusion/core/src/datasource/file_format/parquet.rs 
b/datafusion/core/src/datasource/file_format/parquet.rs
index dfd08352d..04b0b9d52 100644
--- a/datafusion/core/src/datasource/file_format/parquet.rs
+++ b/datafusion/core/src/datasource/file_format/parquet.rs
@@ -1073,7 +1073,7 @@ mod tests {
         assert_eq!(1, batches.len());
         assert_eq!(1, batches[0].num_columns());
         let column = batches[0].column(0);
-        assert_eq!(&DataType::Decimal(4, 2), column.data_type());
+        assert_eq!(&DataType::Decimal128(4, 2), column.data_type());
 
         // parquet use the int64 as the physical type to store decimal
         let exec = get_exec("int64_decimal.parquet", None, None).await?;
@@ -1081,7 +1081,7 @@ mod tests {
         assert_eq!(1, batches.len());
         assert_eq!(1, batches[0].num_columns());
         let column = batches[0].column(0);
-        assert_eq!(&DataType::Decimal(10, 2), column.data_type());
+        assert_eq!(&DataType::Decimal128(10, 2), column.data_type());
 
         // parquet use the fixed length binary as the physical type to store 
decimal
         let exec = get_exec("fixed_length_decimal.parquet", None, None).await?;
@@ -1089,14 +1089,14 @@ mod tests {
         assert_eq!(1, batches.len());
         assert_eq!(1, batches[0].num_columns());
         let column = batches[0].column(0);
-        assert_eq!(&DataType::Decimal(25, 2), column.data_type());
+        assert_eq!(&DataType::Decimal128(25, 2), column.data_type());
 
         let exec = get_exec("fixed_length_decimal_legacy.parquet", None, 
None).await?;
         let batches = collect(exec, task_ctx.clone()).await?;
         assert_eq!(1, batches.len());
         assert_eq!(1, batches[0].num_columns());
         let column = batches[0].column(0);
-        assert_eq!(&DataType::Decimal(13, 2), column.data_type());
+        assert_eq!(&DataType::Decimal128(13, 2), column.data_type());
 
         // parquet use the fixed length binary as the physical type to store 
decimal
         // TODO: arrow-rs don't support convert the physical type of binary to 
decimal
diff --git a/datafusion/core/src/physical_optimizer/pruning.rs 
b/datafusion/core/src/physical_optimizer/pruning.rs
index 859ef79fc..b68d1d13a 100644
--- a/datafusion/core/src/physical_optimizer/pruning.rs
+++ b/datafusion/core/src/physical_optimizer/pruning.rs
@@ -800,7 +800,7 @@ mod tests {
     use crate::from_slice::FromSlice;
     use crate::logical_plan::{col, lit};
     use crate::{assert_batches_eq, 
physical_optimizer::pruning::StatisticsType};
-    use arrow::array::Decimal128Array;
+    use arrow::array::{BasicDecimalArray, Decimal128Array};
     use arrow::{
         array::{BinaryArray, Int32Array, Int64Array, StringArray},
         datatypes::{DataType, TimeUnit},
@@ -1515,7 +1515,7 @@ mod tests {
         // decimal(9,2)
         let schema = Arc::new(Schema::new(vec![Field::new(
             "s1",
-            DataType::Decimal(9, 2),
+            DataType::Decimal128(9, 2),
             true,
         )]));
         // s1 > 5
@@ -1537,7 +1537,7 @@ mod tests {
         // decimal(18,2)
         let schema = Arc::new(Schema::new(vec![Field::new(
             "s1",
-            DataType::Decimal(18, 2),
+            DataType::Decimal128(18, 2),
             true,
         )]));
         // s1 > 5
@@ -1559,7 +1559,7 @@ mod tests {
         // decimal(23,2)
         let schema = Arc::new(Schema::new(vec![Field::new(
             "s1",
-            DataType::Decimal(23, 2),
+            DataType::Decimal128(23, 2),
             true,
         )]));
         // s1 > 5
diff --git a/datafusion/core/src/physical_plan/file_format/parquet.rs 
b/datafusion/core/src/physical_plan/file_format/parquet.rs
index f404e4de8..bd5528c09 100644
--- a/datafusion/core/src/physical_plan/file_format/parquet.rs
+++ b/datafusion/core/src/physical_plan/file_format/parquet.rs
@@ -424,7 +424,7 @@ macro_rules! get_statistic {
             ParquetStatistics::Int32(s) => {
                 match $target_arrow_type {
                     // int32 to decimal with the precision and scale
-                    Some(DataType::Decimal(precision, scale)) => {
+                    Some(DataType::Decimal128(precision, scale)) => {
                         Some(ScalarValue::Decimal128(
                             Some(*s.$func() as i128),
                             precision,
@@ -437,7 +437,7 @@ macro_rules! get_statistic {
             ParquetStatistics::Int64(s) => {
                 match $target_arrow_type {
                     // int64 to decimal with the precision and scale
-                    Some(DataType::Decimal(precision, scale)) => {
+                    Some(DataType::Decimal128(precision, scale)) => {
                         Some(ScalarValue::Decimal128(
                             Some(*s.$func() as i128),
                             precision,
@@ -462,7 +462,7 @@ macro_rules! get_statistic {
             ParquetStatistics::FixedLenByteArray(s) => {
                 match $target_arrow_type {
                     // just support the decimal data type
-                    Some(DataType::Decimal(precision, scale)) => {
+                    Some(DataType::Decimal128(precision, scale)) => {
                         Some(ScalarValue::Decimal128(
                             Some(from_bytes_to_i128(s.$bytes_func())),
                             precision,
@@ -534,10 +534,10 @@ fn parquet_to_arrow_decimal_type(parquet_column: 
&ColumnDescriptor) -> Option<Da
     let type_ptr = parquet_column.self_type_ptr();
     match type_ptr.get_basic_info().logical_type() {
         Some(LogicalType::Decimal { scale, precision }) => {
-            Some(DataType::Decimal(precision as usize, scale as usize))
+            Some(DataType::Decimal128(precision as usize, scale as usize))
         }
         _ => match type_ptr.get_basic_info().converted_type() {
-            ConvertedType::DECIMAL => Some(DataType::Decimal(
+            ConvertedType::DECIMAL => Some(DataType::Decimal128(
                 type_ptr.get_precision() as usize,
                 type_ptr.get_scale() as usize,
             )),
@@ -1474,7 +1474,8 @@ mod tests {
 
         // INT32: c1 > 5, the c1 is decimal(9,2)
         let expr = col("c1").gt(lit(ScalarValue::Decimal128(Some(500), 9, 2)));
-        let schema = Schema::new(vec![Field::new("c1", DataType::Decimal(9, 
2), false)]);
+        let schema =
+            Schema::new(vec![Field::new("c1", DataType::Decimal128(9, 2), 
false)]);
         let schema_descr = get_test_schema_descr(vec![(
             "c1",
             PhysicalType::INT32,
@@ -1515,7 +1516,8 @@ mod tests {
         // INT32: c1 > 5, but parquet decimal type has different precision or 
scale to arrow decimal
         // The decimal of arrow is decimal(5,2), the decimal of parquet is 
decimal(9,0)
         let expr = col("c1").gt(lit(ScalarValue::Decimal128(Some(500), 5, 2)));
-        let schema = Schema::new(vec![Field::new("c1", DataType::Decimal(5, 
2), false)]);
+        let schema =
+            Schema::new(vec![Field::new("c1", DataType::Decimal128(5, 2), 
false)]);
         // The decimal of parquet is decimal(9,0)
         let schema_descr = get_test_schema_descr(vec![(
             "c1",
@@ -1567,7 +1569,8 @@ mod tests {
 
         // INT64: c1 < 5, the c1 is decimal(18,2)
         let expr = col("c1").lt(lit(ScalarValue::Decimal128(Some(500), 18, 
2)));
-        let schema = Schema::new(vec![Field::new("c1", DataType::Decimal(18, 
2), false)]);
+        let schema =
+            Schema::new(vec![Field::new("c1", DataType::Decimal128(18, 2), 
false)]);
         let schema_descr = get_test_schema_descr(vec![(
             "c1",
             PhysicalType::INT64,
@@ -1606,7 +1609,8 @@ mod tests {
         // FIXED_LENGTH_BYTE_ARRAY: c1 = 100, the c1 is decimal(28,2)
         // the type of parquet is decimal(18,2)
         let expr = col("c1").eq(lit(ScalarValue::Decimal128(Some(100000), 28, 
3)));
-        let schema = Schema::new(vec![Field::new("c1", DataType::Decimal(18, 
3), false)]);
+        let schema =
+            Schema::new(vec![Field::new("c1", DataType::Decimal128(18, 3), 
false)]);
         let schema_descr = get_test_schema_descr(vec![(
             "c1",
             PhysicalType::FIXED_LEN_BYTE_ARRAY,
diff --git a/datafusion/core/src/physical_plan/hash_join.rs 
b/datafusion/core/src/physical_plan/hash_join.rs
index 6540cc130..6111e3ae1 100644
--- a/datafusion/core/src/physical_plan/hash_join.rs
+++ b/datafusion/core/src/physical_plan/hash_join.rs
@@ -1098,8 +1098,8 @@ fn equal_rows(
             DataType::LargeUtf8 => {
                 equal_rows_elem!(LargeStringArray, l, r, left, right, 
null_equals_null)
             }
-            DataType::Decimal(_, lscale) => match r.data_type() {
-                DataType::Decimal(_, rscale) => {
+            DataType::Decimal128(_, lscale) => match r.data_type() {
+                DataType::Decimal128(_, rscale) => {
                     if lscale == rscale {
                         equal_rows_elem!(
                             Decimal128Array,
diff --git a/datafusion/core/src/physical_plan/hash_utils.rs 
b/datafusion/core/src/physical_plan/hash_utils.rs
index b9c34ec9b..a89247d7e 100644
--- a/datafusion/core/src/physical_plan/hash_utils.rs
+++ b/datafusion/core/src/physical_plan/hash_utils.rs
@@ -336,7 +336,7 @@ pub fn create_hashes<'a>(
             DataType::Null => {
                 hash_null(random_state, hashes_buffer, multi_col);
             }
-            DataType::Decimal(_, _) => {
+            DataType::Decimal128(_, _) => {
                 hash_decimal128(col, random_state, hashes_buffer, multi_col);
             }
             DataType::UInt8 => {
diff --git a/datafusion/core/src/physical_plan/repartition.rs 
b/datafusion/core/src/physical_plan/repartition.rs
index 552e1820a..f9024797b 100644
--- a/datafusion/core/src/physical_plan/repartition.rs
+++ b/datafusion/core/src/physical_plan/repartition.rs
@@ -933,7 +933,7 @@ mod tests {
         let items_set: HashSet<&str> = items_vec.iter().copied().collect();
         assert_eq!(items_vec.len(), items_set.len());
         let source_str_set: HashSet<&str> =
-            (&["foo", "bar", "frob", "baz", "goo", "gar", "grob", "gaz"])
+            ["foo", "bar", "frob", "baz", "goo", "gar", "grob", "gaz"]
                 .iter()
                 .copied()
                 .collect();
diff --git a/datafusion/core/src/physical_plan/sort_merge_join.rs 
b/datafusion/core/src/physical_plan/sort_merge_join.rs
index 4eb1616c9..da5f9c649 100644
--- a/datafusion/core/src/physical_plan/sort_merge_join.rs
+++ b/datafusion/core/src/physical_plan/sort_merge_join.rs
@@ -1098,7 +1098,7 @@ fn compare_join_arrays(
             DataType::Float64 => compare_value!(Float64Array),
             DataType::Utf8 => compare_value!(StringArray),
             DataType::LargeUtf8 => compare_value!(LargeStringArray),
-            DataType::Decimal(..) => compare_value!(Decimal128Array),
+            DataType::Decimal128(..) => compare_value!(Decimal128Array),
             DataType::Timestamp(time_unit, None) => match time_unit {
                 TimeUnit::Second => compare_value!(TimestampSecondArray),
                 TimeUnit::Millisecond => 
compare_value!(TimestampMillisecondArray),
@@ -1164,7 +1164,7 @@ fn is_join_arrays_equal(
             DataType::Float64 => compare_value!(Float64Array),
             DataType::Utf8 => compare_value!(StringArray),
             DataType::LargeUtf8 => compare_value!(LargeStringArray),
-            DataType::Decimal(..) => compare_value!(Decimal128Array),
+            DataType::Decimal128(..) => compare_value!(Decimal128Array),
             DataType::Timestamp(time_unit, None) => match time_unit {
                 TimeUnit::Second => compare_value!(TimestampSecondArray),
                 TimeUnit::Millisecond => 
compare_value!(TimestampMillisecondArray),
diff --git a/datafusion/core/src/scheduler/plan.rs 
b/datafusion/core/src/scheduler/plan.rs
index e7d5e1d33..b5a786a32 100644
--- a/datafusion/core/src/scheduler/plan.rs
+++ b/datafusion/core/src/scheduler/plan.rs
@@ -29,7 +29,7 @@ use crate::scheduler::pipeline::{
 };
 
 /// Identifies the [`Pipeline`] within the [`PipelinePlan`] to route output to
-#[derive(Debug, Clone, Copy, PartialEq)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub struct OutputLink {
     /// The index of the [`Pipeline`] in [`PipelinePlan`] to route output to
     pub pipeline: usize,
diff --git a/datafusion/core/src/scheduler/task.rs 
b/datafusion/core/src/scheduler/task.rs
index e90b2f07a..b723a37ce 100644
--- a/datafusion/core/src/scheduler/task.rs
+++ b/datafusion/core/src/scheduler/task.rs
@@ -137,7 +137,7 @@ impl Task {
         let partition = self.waker.partition;
 
         let waker = futures::task::waker_ref(&self.waker);
-        let mut cx = Context::from_waker(&*waker);
+        let mut cx = Context::from_waker(&waker);
 
         let pipelines = &self.context.pipelines;
         let routable = &pipelines[node];
diff --git a/datafusion/core/tests/parquet_pruning.rs 
b/datafusion/core/tests/parquet_pruning.rs
index f91d6e170..bda3b1f8b 100644
--- a/datafusion/core/tests/parquet_pruning.rs
+++ b/datafusion/core/tests/parquet_pruning.rs
@@ -20,7 +20,7 @@
 //! expected.
 use std::sync::Arc;
 
-use arrow::array::Decimal128Array;
+use arrow::array::{BasicDecimalArray, Decimal128Array};
 use arrow::{
     array::{
         Array, ArrayRef, Date32Array, Date64Array, Float64Array, Int32Array, 
StringArray,
@@ -881,7 +881,7 @@ fn make_f64_batch(v: Vec<f64>) -> RecordBatch {
 fn make_decimal_batch(v: Vec<i128>, precision: usize, scale: usize) -> 
RecordBatch {
     let schema = Arc::new(Schema::new(vec![Field::new(
         "decimal_col",
-        DataType::Decimal(precision, scale),
+        DataType::Decimal128(precision, scale),
         true,
     )]));
     let array = Arc::new(
diff --git a/datafusion/core/tests/sql/aggregates.rs 
b/datafusion/core/tests/sql/aggregates.rs
index eb0e07f84..76918bcb0 100644
--- a/datafusion/core/tests/sql/aggregates.rs
+++ b/datafusion/core/tests/sql/aggregates.rs
@@ -1472,7 +1472,7 @@ async fn aggregate_decimal_min() -> Result<()> {
         "+-----------------+",
     ];
     assert_eq!(
-        &DataType::Decimal(10, 3),
+        &DataType::Decimal128(10, 3),
         result[0].schema().field(0).data_type()
     );
     assert_batches_sorted_eq!(expected, &result);
@@ -1496,7 +1496,7 @@ async fn aggregate_decimal_max() -> Result<()> {
         "+-----------------+",
     ];
     assert_eq!(
-        &DataType::Decimal(10, 3),
+        &DataType::Decimal128(10, 3),
         result[0].schema().field(0).data_type()
     );
     assert_batches_sorted_eq!(expected, &result);
@@ -1519,7 +1519,7 @@ async fn aggregate_decimal_sum() -> Result<()> {
         "+-----------------+",
     ];
     assert_eq!(
-        &DataType::Decimal(20, 3),
+        &DataType::Decimal128(20, 3),
         result[0].schema().field(0).data_type()
     );
     assert_batches_sorted_eq!(expected, &result);
@@ -1542,7 +1542,7 @@ async fn aggregate_decimal_avg() -> Result<()> {
         "+-----------------+",
     ];
     assert_eq!(
-        &DataType::Decimal(14, 7),
+        &DataType::Decimal128(14, 7),
         result[0].schema().field(0).data_type()
     );
     assert_batches_sorted_eq!(expected, &result);
diff --git a/datafusion/core/tests/sql/decimal.rs 
b/datafusion/core/tests/sql/decimal.rs
index c8c242155..9b16ca534 100644
--- a/datafusion/core/tests/sql/decimal.rs
+++ b/datafusion/core/tests/sql/decimal.rs
@@ -23,45 +23,45 @@ async fn decimal_cast() -> Result<()> {
     let sql = "select cast(1.23 as decimal(10,4))";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 4),
+        &DataType::Decimal128(10, 4),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
-        "+---------------------------------------+",
-        "| CAST(Float64(1.23) AS Decimal(10, 4)) |",
-        "+---------------------------------------+",
-        "| 1.2300                                |",
-        "+---------------------------------------+",
+        "+------------------------------------------+",
+        "| CAST(Float64(1.23) AS Decimal128(10, 4)) |",
+        "+------------------------------------------+",
+        "| 1.2300                                   |",
+        "+------------------------------------------+",
     ];
     assert_batches_eq!(expected, &actual);
 
     let sql = "select cast(cast(1.23 as decimal(10,3)) as decimal(10,4))";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 4),
+        &DataType::Decimal128(10, 4),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
-        "+---------------------------------------------------------------+",
-        "| CAST(CAST(Float64(1.23) AS Decimal(10, 3)) AS Decimal(10, 4)) |",
-        "+---------------------------------------------------------------+",
-        "| 1.2300                                                        |",
-        "+---------------------------------------------------------------+",
+        
"+---------------------------------------------------------------------+",
+        "| CAST(CAST(Float64(1.23) AS Decimal128(10, 3)) AS Decimal128(10, 4)) 
|",
+        
"+---------------------------------------------------------------------+",
+        "| 1.2300                                                              
|",
+        
"+---------------------------------------------------------------------+",
     ];
     assert_batches_eq!(expected, &actual);
 
     let sql = "select cast(1.2345 as decimal(24,2))";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(24, 2),
+        &DataType::Decimal128(24, 2),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
-        "+-----------------------------------------+",
-        "| CAST(Float64(1.2345) AS Decimal(24, 2)) |",
-        "+-----------------------------------------+",
-        "| 1.23                                    |",
-        "+-----------------------------------------+",
+        "+--------------------------------------------+",
+        "| CAST(Float64(1.2345) AS Decimal128(24, 2)) |",
+        "+--------------------------------------------+",
+        "| 1.23                                       |",
+        "+--------------------------------------------+",
     ];
     assert_batches_eq!(expected, &actual);
 
@@ -75,7 +75,7 @@ async fn decimal_by_sql() -> Result<()> {
     let sql = "SELECT c1 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -110,7 +110,7 @@ async fn decimal_by_filter() -> Result<()> {
     let sql = "select c1 from decimal_simple where c1 > 0.000030";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -133,11 +133,11 @@ async fn decimal_by_filter() -> Result<()> {
     let sql = "select * from decimal_simple where c1 > c5";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     assert_eq!(
-        &DataType::Decimal(12, 7),
+        &DataType::Decimal128(12, 7),
         actual[0].schema().field(4).data_type()
     );
     let expected = vec![
@@ -161,7 +161,7 @@ async fn decimal_agg_function() -> Result<()> {
     let sql = "select min(c1) from decimal_simple where c4=false";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -176,7 +176,7 @@ async fn decimal_agg_function() -> Result<()> {
     let sql = "select max(c1) from decimal_simple where c4=false";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -193,7 +193,7 @@ async fn decimal_agg_function() -> Result<()> {
     let actual = execute_to_batches(&ctx, sql).await;
     // inferred precision is 10+10
     assert_eq!(
-        &DataType::Decimal(20, 6),
+        &DataType::Decimal128(20, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -211,7 +211,7 @@ async fn decimal_agg_function() -> Result<()> {
     let sql = "select avg(c1) from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(14, 10),
+        &DataType::Decimal128(14, 10),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -234,7 +234,7 @@ async fn decimal_logic_op() -> Result<()> {
     let sql = "select * from decimal_simple where c1=CAST(0.00002 as 
Decimal(10,8))";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -274,7 +274,7 @@ async fn decimal_logic_op() -> Result<()> {
     let sql = "select * from decimal_simple where 0.00002 > c1";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -290,7 +290,7 @@ async fn decimal_logic_op() -> Result<()> {
     let sql = "select * from decimal_simple where c1 <= 0.00002";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -308,7 +308,7 @@ async fn decimal_logic_op() -> Result<()> {
     let sql = "select * from decimal_simple where c1 > 0.00002";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -335,7 +335,7 @@ async fn decimal_logic_op() -> Result<()> {
     let sql = "select * from decimal_simple where c1 >= 0.00002";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -372,7 +372,7 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let actual = execute_to_batches(&ctx, sql).await;
     // array decimal(10,6) +  scalar decimal(20,0) => decimal(21,6)
     assert_eq!(
-        &DataType::Decimal(27, 6),
+        &DataType::Decimal128(27, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -401,7 +401,7 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let sql = "select c1+c5 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(13, 7),
+        &DataType::Decimal128(13, 7),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -430,7 +430,7 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let sql = "select c1-1 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(27, 6),
+        &DataType::Decimal128(27, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -459,7 +459,7 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let sql = "select c1-c5 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(13, 7),
+        &DataType::Decimal128(13, 7),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -488,7 +488,7 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let sql = "select c1*20 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(31, 6),
+        &DataType::Decimal128(31, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -517,7 +517,7 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let sql = "select c1*c5 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(23, 13),
+        &DataType::Decimal128(23, 13),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -546,36 +546,36 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let sql = "select c1/cast(0.00001 as decimal(5,5)) from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(21, 12),
+        &DataType::Decimal128(21, 12),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
-        "+-------------------------------------------------------------+",
-        "| decimal_simple.c1 / CAST(Float64(0.00001) AS Decimal(5, 5)) |",
-        "+-------------------------------------------------------------+",
-        "| 1.000000000000                                              |",
-        "| 2.000000000000                                              |",
-        "| 2.000000000000                                              |",
-        "| 3.000000000000                                              |",
-        "| 3.000000000000                                              |",
-        "| 3.000000000000                                              |",
-        "| 4.000000000000                                              |",
-        "| 4.000000000000                                              |",
-        "| 4.000000000000                                              |",
-        "| 4.000000000000                                              |",
-        "| 5.000000000000                                              |",
-        "| 5.000000000000                                              |",
-        "| 5.000000000000                                              |",
-        "| 5.000000000000                                              |",
-        "| 5.000000000000                                              |",
-        "+-------------------------------------------------------------+",
+        "+----------------------------------------------------------------+",
+        "| decimal_simple.c1 / CAST(Float64(0.00001) AS Decimal128(5, 5)) |",
+        "+----------------------------------------------------------------+",
+        "| 1.000000000000                                                 |",
+        "| 2.000000000000                                                 |",
+        "| 2.000000000000                                                 |",
+        "| 3.000000000000                                                 |",
+        "| 3.000000000000                                                 |",
+        "| 3.000000000000                                                 |",
+        "| 4.000000000000                                                 |",
+        "| 4.000000000000                                                 |",
+        "| 4.000000000000                                                 |",
+        "| 4.000000000000                                                 |",
+        "| 5.000000000000                                                 |",
+        "| 5.000000000000                                                 |",
+        "| 5.000000000000                                                 |",
+        "| 5.000000000000                                                 |",
+        "| 5.000000000000                                                 |",
+        "+----------------------------------------------------------------+",
     ];
     assert_batches_eq!(expected, &actual);
 
     let sql = "select c1/c5 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(30, 19),
+        &DataType::Decimal128(30, 19),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -605,36 +605,36 @@ async fn decimal_arithmetic_op() -> Result<()> {
     let sql = "select c5%cast(0.00001 as decimal(5,5)) from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(7, 7),
+        &DataType::Decimal128(7, 7),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
-        "+-------------------------------------------------------------+",
-        "| decimal_simple.c5 % CAST(Float64(0.00001) AS Decimal(5, 5)) |",
-        "+-------------------------------------------------------------+",
-        "| 0.0000040                                                   |",
-        "| 0.0000050                                                   |",
-        "| 0.0000090                                                   |",
-        "| 0.0000020                                                   |",
-        "| 0.0000050                                                   |",
-        "| 0.0000010                                                   |",
-        "| 0.0000040                                                   |",
-        "| 0.0000000                                                   |",
-        "| 0.0000000                                                   |",
-        "| 0.0000040                                                   |",
-        "| 0.0000020                                                   |",
-        "| 0.0000080                                                   |",
-        "| 0.0000030                                                   |",
-        "| 0.0000080                                                   |",
-        "| 0.0000000                                                   |",
-        "+-------------------------------------------------------------+",
+        "+----------------------------------------------------------------+",
+        "| decimal_simple.c5 % CAST(Float64(0.00001) AS Decimal128(5, 5)) |",
+        "+----------------------------------------------------------------+",
+        "| 0.0000040                                                      |",
+        "| 0.0000050                                                      |",
+        "| 0.0000090                                                      |",
+        "| 0.0000020                                                      |",
+        "| 0.0000050                                                      |",
+        "| 0.0000010                                                      |",
+        "| 0.0000040                                                      |",
+        "| 0.0000000                                                      |",
+        "| 0.0000000                                                      |",
+        "| 0.0000040                                                      |",
+        "| 0.0000020                                                      |",
+        "| 0.0000080                                                      |",
+        "| 0.0000030                                                      |",
+        "| 0.0000080                                                      |",
+        "| 0.0000000                                                      |",
+        "+----------------------------------------------------------------+",
     ];
     assert_batches_eq!(expected, &actual);
 
     let sql = "select c1%c5 from decimal_simple";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(11, 7),
+        &DataType::Decimal128(11, 7),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -670,7 +670,7 @@ async fn decimal_sort() -> Result<()> {
     let sql = "select * from decimal_simple where c1 >= 0.00004 order by c1";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -693,7 +693,7 @@ async fn decimal_sort() -> Result<()> {
     let sql = "select * from decimal_simple where c1 >= 0.00004 order by c1 
desc";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -716,7 +716,7 @@ async fn decimal_sort() -> Result<()> {
     let sql = "select * from decimal_simple where c1 < 0.00003 order by c1 
desc,c4";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(0).data_type()
     );
     let expected = vec![
@@ -740,7 +740,7 @@ async fn decimal_group_function() -> Result<()> {
     let sql = "select count(*),c1 from decimal_simple group by c1 order by c1";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(1).data_type()
     );
     let expected = vec![
@@ -759,7 +759,7 @@ async fn decimal_group_function() -> Result<()> {
     let sql = "select count(*),c1,c4 from decimal_simple group by c1,c4 order 
by c1,c4";
     let actual = execute_to_batches(&ctx, sql).await;
     assert_eq!(
-        &DataType::Decimal(10, 6),
+        &DataType::Decimal128(10, 6),
         actual[0].schema().field(1).data_type()
     );
     let expected = vec![
diff --git a/datafusion/core/tests/sql/errors.rs 
b/datafusion/core/tests/sql/errors.rs
index 6a9591213..92cc88e28 100644
--- a/datafusion/core/tests/sql/errors.rs
+++ b/datafusion/core/tests/sql/errors.rs
@@ -43,8 +43,9 @@ async fn test_cast_expressions_error() -> Result<()> {
     match result {
         Ok(_) => panic!("expected error"),
         Err(e) => {
-            assert_contains!(e.to_string(),
-                             "Cast error: Cannot cast string 'c' to value of 
arrow::datatypes::types::Int32Type type"
+            assert_contains!(
+                e.to_string(),
+                "Cannot cast string 'c' to value of Int32 type"
             );
         }
     }
diff --git a/datafusion/core/tests/sql/joins.rs 
b/datafusion/core/tests/sql/joins.rs
index 19de20d61..b899ac220 100644
--- a/datafusion/core/tests/sql/joins.rs
+++ b/datafusion/core/tests/sql/joins.rs
@@ -1265,10 +1265,10 @@ async fn hash_join_with_date32() -> Result<()> {
     let plan = state.optimize(&plan)?;
     let expected = vec![
         "Explain [plan_type:Utf8, plan:Utf8]",
-        "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
-        "    Inner Join: #t1.c1 = #t2.c1 [c1:Date32;N, c2:Date64;N, 
c3:Decimal(5, 2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, 
c3:Decimal(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
-        "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
-        "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
+        "    Inner Join: #t1.c1 = #t2.c1 [c1:Date32;N, c2:Date64;N, 
c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, 
c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
     ];
     let formatted = plan.display_indent_schema().to_string();
     let actual: Vec<&str> = formatted.trim().lines().collect();
@@ -1307,10 +1307,10 @@ async fn hash_join_with_date64() -> Result<()> {
     let plan = state.optimize(&plan)?;
     let expected = vec![
         "Explain [plan_type:Utf8, plan:Utf8]",
-        "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
-        "    Left Join: #t1.c2 = #t2.c2 [c1:Date32;N, c2:Date64;N, 
c3:Decimal(5, 2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, 
c3:Decimal(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
-        "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
-        "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
+        "    Left Join: #t1.c2 = #t2.c2 [c1:Date32;N, c2:Date64;N, 
c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, 
c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
     ];
     let formatted = plan.display_indent_schema().to_string();
     let actual: Vec<&str> = formatted.trim().lines().collect();
@@ -1351,10 +1351,10 @@ async fn hash_join_with_decimal() -> Result<()> {
     let plan = state.optimize(&plan)?;
     let expected = vec![
     "Explain [plan_type:Utf8, plan:Utf8]",
-    "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
-    "    Right Join: #t1.c3 = #t2.c3 [c1:Date32;N, c2:Date64;N, c3:Decimal(5, 
2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal(10, 
2);N, c4:Dictionary(Int32, Utf8);N]",
-    "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
-    "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+    "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
+    "    Right Join: #t1.c3 = #t2.c3 [c1:Date32;N, c2:Date64;N, 
c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, 
c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+    "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
+    "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
     ];
     let formatted = plan.display_indent_schema().to_string();
     let actual: Vec<&str> = formatted.trim().lines().collect();
@@ -1395,10 +1395,10 @@ async fn hash_join_with_dictionary() -> Result<()> {
     let plan = state.optimize(&plan)?;
     let expected = vec![
         "Explain [plan_type:Utf8, plan:Utf8]",
-        "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
-        "    Inner Join: #t1.c4 = #t2.c4 [c1:Date32;N, c2:Date64;N, 
c3:Decimal(5, 2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, 
c3:Decimal(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
-        "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
-        "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "  Projection: #t1.c1, #t1.c2, #t1.c3, #t1.c4, #t2.c1, #t2.c2, #t2.c3, 
#t2.c4 [c1:Date32;N, c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, 
Utf8);N, c1:Date32;N, c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, 
Utf8);N]",
+        "    Inner Join: #t1.c4 = #t2.c4 [c1:Date32;N, c2:Date64;N, 
c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N, c1:Date32;N, c2:Date64;N, 
c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "      TableScan: t1 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(5, 2);N, c4:Dictionary(Int32, Utf8);N]",
+        "      TableScan: t2 projection=[c1, c2, c3, c4] [c1:Date32;N, 
c2:Date64;N, c3:Decimal128(10, 2);N, c4:Dictionary(Int32, Utf8);N]",
     ];
     let formatted = plan.display_indent_schema().to_string();
     let actual: Vec<&str> = formatted.trim().lines().collect();
diff --git a/datafusion/core/tests/sql/mod.rs b/datafusion/core/tests/sql/mod.rs
index 07bd2f9d3..6f1ae52ae 100644
--- a/datafusion/core/tests/sql/mod.rs
+++ b/datafusion/core/tests/sql/mod.rs
@@ -279,7 +279,7 @@ fn create_hashjoin_datatype_context() -> 
Result<SessionContext> {
     let t1_schema = Schema::new(vec![
         Field::new("c1", DataType::Date32, true),
         Field::new("c2", DataType::Date64, true),
-        Field::new("c3", DataType::Decimal(5, 2), true),
+        Field::new("c3", DataType::Decimal128(5, 2), true),
         Field::new(
             "c4",
             DataType::Dictionary(Box::new(DataType::Int32), 
Box::new(DataType::Utf8)),
@@ -312,7 +312,7 @@ fn create_hashjoin_datatype_context() -> 
Result<SessionContext> {
     let t2_schema = Schema::new(vec![
         Field::new("c1", DataType::Date32, true),
         Field::new("c2", DataType::Date64, true),
-        Field::new("c3", DataType::Decimal(10, 2), true),
+        Field::new("c3", DataType::Decimal128(10, 2), true),
         Field::new(
             "c4",
             DataType::Dictionary(Box::new(DataType::Int32), 
Box::new(DataType::Utf8)),
diff --git a/datafusion/expr/Cargo.toml b/datafusion/expr/Cargo.toml
index 923015ae5..a3c4dd4ac 100644
--- a/datafusion/expr/Cargo.toml
+++ b/datafusion/expr/Cargo.toml
@@ -36,6 +36,6 @@ path = "src/lib.rs"
 
 [dependencies]
 ahash = { version = "0.7", default-features = false }
-arrow = { version = "19.0.0", features = ["prettyprint"] }
+arrow = { version = "20.0.0", features = ["prettyprint"] }
 datafusion-common = { path = "../common", version = "10.0.0" }
 sqlparser = "0.20"
diff --git a/datafusion/expr/src/aggregate_function.rs 
b/datafusion/expr/src/aggregate_function.rs
index 09d759e56..a4281aa0a 100644
--- a/datafusion/expr/src/aggregate_function.rs
+++ b/datafusion/expr/src/aggregate_function.rs
@@ -19,7 +19,7 @@
 
 use crate::{Signature, TypeSignature, Volatility};
 use arrow::datatypes::{
-    DataType, Field, TimeUnit, DECIMAL_MAX_PRECISION, DECIMAL_MAX_SCALE,
+    DataType, Field, TimeUnit, DECIMAL128_MAX_PRECISION, DECIMAL128_MAX_SCALE,
 };
 use datafusion_common::{DataFusionError, Result};
 use std::ops::Deref;
@@ -407,11 +407,11 @@ pub fn sum_return_type(arg_type: &DataType) -> 
Result<DataType> {
         // In the 
https://www.postgresql.org/docs/current/functions-aggregate.html doc,
         // the result type of floating-point is FLOAT64 with the double 
precision.
         DataType::Float64 | DataType::Float32 => Ok(DataType::Float64),
-        DataType::Decimal(precision, scale) => {
+        DataType::Decimal128(precision, scale) => {
             // in the spark, the result type is DECIMAL(min(38,precision+10), 
s)
             // ref: 
https://github.com/apache/spark/blob/fcf636d9eb8d645c24be3db2d599aba2d7e2955a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/Sum.scala#L66
-            let new_precision = DECIMAL_MAX_PRECISION.min(*precision + 10);
-            Ok(DataType::Decimal(new_precision, *scale))
+            let new_precision = DECIMAL128_MAX_PRECISION.min(*precision + 10);
+            Ok(DataType::Decimal128(new_precision, *scale))
         }
         other => Err(DataFusionError::Plan(format!(
             "SUM does not support type \"{:?}\"",
@@ -503,12 +503,12 @@ pub fn stddev_return_type(arg_type: &DataType) -> 
Result<DataType> {
 /// function return type of an average
 pub fn avg_return_type(arg_type: &DataType) -> Result<DataType> {
     match arg_type {
-        DataType::Decimal(precision, scale) => {
+        DataType::Decimal128(precision, scale) => {
             // in the spark, the result type is DECIMAL(min(38,precision+4), 
min(38,scale+4)).
             // ref: 
https://github.com/apache/spark/blob/fcf636d9eb8d645c24be3db2d599aba2d7e2955a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/aggregate/Average.scala#L66
-            let new_precision = DECIMAL_MAX_PRECISION.min(*precision + 4);
-            let new_scale = DECIMAL_MAX_SCALE.min(*scale + 4);
-            Ok(DataType::Decimal(new_precision, new_scale))
+            let new_precision = DECIMAL128_MAX_PRECISION.min(*precision + 4);
+            let new_scale = DECIMAL128_MAX_SCALE.min(*scale + 4);
+            Ok(DataType::Decimal128(new_precision, new_scale))
         }
         DataType::Int8
         | DataType::Int16
@@ -609,7 +609,7 @@ pub fn is_sum_support_arg_type(arg_type: &DataType) -> bool 
{
             | DataType::Int64
             | DataType::Float32
             | DataType::Float64
-            | DataType::Decimal(_, _)
+            | DataType::Decimal128(_, _)
     )
 }
 
@@ -626,7 +626,7 @@ pub fn is_avg_support_arg_type(arg_type: &DataType) -> bool 
{
             | DataType::Int64
             | DataType::Float32
             | DataType::Float64
-            | DataType::Decimal(_, _)
+            | DataType::Decimal128(_, _)
     )
 }
 
@@ -755,7 +755,7 @@ mod tests {
         ];
         let input_types = vec![
             vec![DataType::Int32],
-            vec![DataType::Decimal(10, 2)],
+            vec![DataType::Decimal128(10, 2)],
             vec![DataType::Utf8],
         ];
         for fun in funs {
@@ -770,7 +770,7 @@ mod tests {
         let input_types = vec![
             vec![DataType::Int32],
             vec![DataType::Float32],
-            vec![DataType::Decimal(20, 3)],
+            vec![DataType::Decimal128(20, 3)],
         ];
         for fun in funs {
             for input_type in &input_types {
@@ -807,13 +807,13 @@ mod tests {
 
     #[test]
     fn test_avg_return_data_type() -> Result<()> {
-        let data_type = DataType::Decimal(10, 5);
+        let data_type = DataType::Decimal128(10, 5);
         let result_type = avg_return_type(&data_type)?;
-        assert_eq!(DataType::Decimal(14, 9), result_type);
+        assert_eq!(DataType::Decimal128(14, 9), result_type);
 
-        let data_type = DataType::Decimal(36, 10);
+        let data_type = DataType::Decimal128(36, 10);
         let result_type = avg_return_type(&data_type)?;
-        assert_eq!(DataType::Decimal(38, 14), result_type);
+        assert_eq!(DataType::Decimal128(38, 14), result_type);
         Ok(())
     }
 
@@ -823,20 +823,20 @@ mod tests {
         let result_type = variance_return_type(&data_type)?;
         assert_eq!(DataType::Float64, result_type);
 
-        let data_type = DataType::Decimal(36, 10);
+        let data_type = DataType::Decimal128(36, 10);
         assert!(variance_return_type(&data_type).is_err());
         Ok(())
     }
 
     #[test]
     fn test_sum_return_data_type() -> Result<()> {
-        let data_type = DataType::Decimal(10, 5);
+        let data_type = DataType::Decimal128(10, 5);
         let result_type = sum_return_type(&data_type)?;
-        assert_eq!(DataType::Decimal(20, 5), result_type);
+        assert_eq!(DataType::Decimal128(20, 5), result_type);
 
-        let data_type = DataType::Decimal(36, 10);
+        let data_type = DataType::Decimal128(36, 10);
         let result_type = sum_return_type(&data_type)?;
-        assert_eq!(DataType::Decimal(38, 10), result_type);
+        assert_eq!(DataType::Decimal128(38, 10), result_type);
         Ok(())
     }
 
@@ -846,7 +846,7 @@ mod tests {
         let result_type = stddev_return_type(&data_type)?;
         assert_eq!(DataType::Float64, result_type);
 
-        let data_type = DataType::Decimal(36, 10);
+        let data_type = DataType::Decimal128(36, 10);
         assert!(stddev_return_type(&data_type).is_err());
         Ok(())
     }
@@ -857,7 +857,7 @@ mod tests {
         let result_type = covariance_return_type(&data_type)?;
         assert_eq!(DataType::Float64, result_type);
 
-        let data_type = DataType::Decimal(36, 10);
+        let data_type = DataType::Decimal128(36, 10);
         assert!(covariance_return_type(&data_type).is_err());
         Ok(())
     }
@@ -868,7 +868,7 @@ mod tests {
         let result_type = correlation_return_type(&data_type)?;
         assert_eq!(DataType::Float64, result_type);
 
-        let data_type = DataType::Decimal(36, 10);
+        let data_type = DataType::Decimal128(36, 10);
         assert!(correlation_return_type(&data_type).is_err());
         Ok(())
     }
diff --git a/datafusion/expr/src/binary_rule.rs 
b/datafusion/expr/src/binary_rule.rs
index 21e62344c..d6994d688 100644
--- a/datafusion/expr/src/binary_rule.rs
+++ b/datafusion/expr/src/binary_rule.rs
@@ -19,7 +19,7 @@
 
 use crate::Operator;
 use arrow::compute::can_cast_types;
-use arrow::datatypes::{DataType, DECIMAL_MAX_PRECISION, DECIMAL_MAX_SCALE};
+use arrow::datatypes::{DataType, DECIMAL128_MAX_PRECISION, 
DECIMAL128_MAX_SCALE};
 use datafusion_common::DataFusionError;
 use datafusion_common::Result;
 
@@ -194,9 +194,9 @@ fn comparison_binary_numeric_coercion(
     // that the coercion removes the least amount of information
     match (lhs_type, rhs_type) {
         // support decimal data type for comparison operation
-        (d1 @ Decimal(_, _), d2 @ Decimal(_, _)) => get_wider_decimal_type(d1, 
d2),
-        (Decimal(_, _), _) => get_comparison_common_decimal_type(lhs_type, 
rhs_type),
-        (_, Decimal(_, _)) => get_comparison_common_decimal_type(rhs_type, 
lhs_type),
+        (d1 @ Decimal128(_, _), d2 @ Decimal128(_, _)) => 
get_wider_decimal_type(d1, d2),
+        (Decimal128(_, _), _) => get_comparison_common_decimal_type(lhs_type, 
rhs_type),
+        (_, Decimal128(_, _)) => get_comparison_common_decimal_type(rhs_type, 
lhs_type),
         (Float64, _) | (_, Float64) => Some(Float64),
         (_, Float32) | (Float32, _) => Some(Float32),
         (Int64, _) | (_, Int64) => Some(Int64),
@@ -218,25 +218,25 @@ fn get_comparison_common_decimal_type(
     let other_decimal_type = &match other_type {
         // This conversion rule is from spark
         // 
https://github.com/apache/spark/blob/1c81ad20296d34f137238dadd67cc6ae405944eb/sql/catalyst/src/main/scala/org/apache/spark/sql/types/DecimalType.scala#L127
-        DataType::Int8 => DataType::Decimal(3, 0),
-        DataType::Int16 => DataType::Decimal(5, 0),
-        DataType::Int32 => DataType::Decimal(10, 0),
-        DataType::Int64 => DataType::Decimal(20, 0),
-        DataType::Float32 => DataType::Decimal(14, 7),
-        DataType::Float64 => DataType::Decimal(30, 15),
+        DataType::Int8 => DataType::Decimal128(3, 0),
+        DataType::Int16 => DataType::Decimal128(5, 0),
+        DataType::Int32 => DataType::Decimal128(10, 0),
+        DataType::Int64 => DataType::Decimal128(20, 0),
+        DataType::Float32 => DataType::Decimal128(14, 7),
+        DataType::Float64 => DataType::Decimal128(30, 15),
         _ => {
             return None;
         }
     };
     match (decimal_type, &other_decimal_type) {
-        (d1 @ DataType::Decimal(_, _), d2 @ DataType::Decimal(_, _)) => {
+        (d1 @ DataType::Decimal128(_, _), d2 @ DataType::Decimal128(_, _)) => {
             get_wider_decimal_type(d1, d2)
         }
         _ => None,
     }
 }
 
-// Returns a `DataType::Decimal` that can store any value from either
+// Returns a `DataType::Decimal128` that can store any value from either
 // `lhs_decimal_type` and `rhs_decimal_type`
 // The result decimal type is (max(s1, s2) + max(p1-s1, p2-s2), max(s1, s2)).
 fn get_wider_decimal_type(
@@ -244,7 +244,7 @@ fn get_wider_decimal_type(
     rhs_type: &DataType,
 ) -> Option<DataType> {
     match (lhs_decimal_type, rhs_type) {
-        (DataType::Decimal(p1, s1), DataType::Decimal(p2, s2)) => {
+        (DataType::Decimal128(p1, s1), DataType::Decimal128(p2, s2)) => {
             // max(s1, s2) + max(p1-s1, p2-s2), max(s1, s2)
             let s = *s1.max(s2);
             let range = (p1 - s1).max(p2 - s2);
@@ -258,13 +258,13 @@ fn get_wider_decimal_type(
 // Now, we just support the signed integer type and floating-point type.
 fn coerce_numeric_type_to_decimal(numeric_type: &DataType) -> Option<DataType> 
{
     match numeric_type {
-        DataType::Int8 => Some(DataType::Decimal(3, 0)),
-        DataType::Int16 => Some(DataType::Decimal(5, 0)),
-        DataType::Int32 => Some(DataType::Decimal(10, 0)),
-        DataType::Int64 => Some(DataType::Decimal(20, 0)),
+        DataType::Int8 => Some(DataType::Decimal128(3, 0)),
+        DataType::Int16 => Some(DataType::Decimal128(5, 0)),
+        DataType::Int32 => Some(DataType::Decimal128(10, 0)),
+        DataType::Int64 => Some(DataType::Decimal128(20, 0)),
         // TODO if we convert the floating-point data to the decimal type, it 
maybe overflow.
-        DataType::Float32 => Some(DataType::Decimal(14, 7)),
-        DataType::Float64 => Some(DataType::Decimal(30, 15)),
+        DataType::Float32 => Some(DataType::Decimal128(14, 7)),
+        DataType::Float64 => Some(DataType::Decimal128(30, 15)),
         _ => None,
     }
 }
@@ -289,10 +289,10 @@ fn mathematics_numerical_coercion(
     // these are ordered from most informative to least informative so
     // that the coercion removes the least amount of information
     match (lhs_type, rhs_type) {
-        (Decimal(_, _), Decimal(_, _)) => {
+        (Decimal128(_, _), Decimal128(_, _)) => {
             coercion_decimal_mathematics_type(mathematics_op, lhs_type, 
rhs_type)
         }
-        (Decimal(_, _), _) => {
+        (Decimal128(_, _), _) => {
             let converted_decimal_type = 
coerce_numeric_type_to_decimal(rhs_type);
             match converted_decimal_type {
                 None => None,
@@ -303,7 +303,7 @@ fn mathematics_numerical_coercion(
                 ),
             }
         }
-        (_, Decimal(_, _)) => {
+        (_, Decimal128(_, _)) => {
             let converted_decimal_type = 
coerce_numeric_type_to_decimal(lhs_type);
             match converted_decimal_type {
                 None => None,
@@ -329,9 +329,9 @@ fn mathematics_numerical_coercion(
 }
 
 fn create_decimal_type(precision: usize, scale: usize) -> DataType {
-    DataType::Decimal(
-        DECIMAL_MAX_PRECISION.min(precision),
-        DECIMAL_MAX_SCALE.min(scale),
+    DataType::Decimal128(
+        DECIMAL128_MAX_PRECISION.min(precision),
+        DECIMAL128_MAX_SCALE.min(scale),
     )
 }
 
@@ -344,7 +344,7 @@ fn coercion_decimal_mathematics_type(
     match (left_decimal_type, right_decimal_type) {
         // The coercion rule from spark
         // 
https://github.com/apache/spark/blob/c20af535803a7250fef047c2bf0fe30be242369d/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/DecimalPrecision.scala#L35
-        (Decimal(p1, s1), Decimal(p2, s2)) => {
+        (Decimal128(p1, s1), Decimal128(p2, s2)) => {
             match mathematics_op {
                 Operator::Plus | Operator::Minus => {
                     // max(s1, s2)
@@ -392,19 +392,17 @@ pub fn is_signed_numeric(dt: &DataType) -> bool {
             | DataType::Float16
             | DataType::Float32
             | DataType::Float64
-            | DataType::Decimal(_, _)
+            | DataType::Decimal128(_, _)
     )
 }
 
 /// Determine if a DataType is numeric or not
 pub fn is_numeric(dt: &DataType) -> bool {
     is_signed_numeric(dt)
-        || match dt {
-            DataType::UInt8 | DataType::UInt16 | DataType::UInt32 | 
DataType::UInt64 => {
-                true
-            }
-            _ => false,
-        }
+        || matches!(
+            dt,
+            DataType::UInt8 | DataType::UInt16 | DataType::UInt32 | 
DataType::UInt64
+        )
 }
 
 /// Determine if at least of one of lhs and rhs is numeric, and the other must 
be NULL or numeric
@@ -653,7 +651,7 @@ mod tests {
 
     #[test]
     fn test_decimal_binary_comparison_coercion() -> Result<()> {
-        let input_decimal = DataType::Decimal(20, 3);
+        let input_decimal = DataType::Decimal128(20, 3);
         let input_types = [
             DataType::Int8,
             DataType::Int16,
@@ -661,18 +659,18 @@ mod tests {
             DataType::Int64,
             DataType::Float32,
             DataType::Float64,
-            DataType::Decimal(38, 10),
-            DataType::Decimal(20, 8),
+            DataType::Decimal128(38, 10),
+            DataType::Decimal128(20, 8),
         ];
         let result_types = [
-            DataType::Decimal(20, 3),
-            DataType::Decimal(20, 3),
-            DataType::Decimal(20, 3),
-            DataType::Decimal(23, 3),
-            DataType::Decimal(24, 7),
-            DataType::Decimal(32, 15),
-            DataType::Decimal(38, 10),
-            DataType::Decimal(25, 8),
+            DataType::Decimal128(20, 3),
+            DataType::Decimal128(20, 3),
+            DataType::Decimal128(20, 3),
+            DataType::Decimal128(23, 3),
+            DataType::Decimal128(24, 7),
+            DataType::Decimal128(32, 15),
+            DataType::Decimal128(38, 10),
+            DataType::Decimal128(25, 8),
         ];
         let comparison_op_types = [
             Operator::NotEq,
@@ -699,66 +697,66 @@ mod tests {
     fn test_decimal_mathematics_op_type() {
         assert_eq!(
             coerce_numeric_type_to_decimal(&DataType::Int8).unwrap(),
-            DataType::Decimal(3, 0)
+            DataType::Decimal128(3, 0)
         );
         assert_eq!(
             coerce_numeric_type_to_decimal(&DataType::Int16).unwrap(),
-            DataType::Decimal(5, 0)
+            DataType::Decimal128(5, 0)
         );
         assert_eq!(
             coerce_numeric_type_to_decimal(&DataType::Int32).unwrap(),
-            DataType::Decimal(10, 0)
+            DataType::Decimal128(10, 0)
         );
         assert_eq!(
             coerce_numeric_type_to_decimal(&DataType::Int64).unwrap(),
-            DataType::Decimal(20, 0)
+            DataType::Decimal128(20, 0)
         );
         assert_eq!(
             coerce_numeric_type_to_decimal(&DataType::Float32).unwrap(),
-            DataType::Decimal(14, 7)
+            DataType::Decimal128(14, 7)
         );
         assert_eq!(
             coerce_numeric_type_to_decimal(&DataType::Float64).unwrap(),
-            DataType::Decimal(30, 15)
+            DataType::Decimal128(30, 15)
         );
 
         let op = Operator::Plus;
-        let left_decimal_type = DataType::Decimal(10, 3);
-        let right_decimal_type = DataType::Decimal(20, 4);
+        let left_decimal_type = DataType::Decimal128(10, 3);
+        let right_decimal_type = DataType::Decimal128(20, 4);
         let result = coercion_decimal_mathematics_type(
             &op,
             &left_decimal_type,
             &right_decimal_type,
         );
-        assert_eq!(DataType::Decimal(21, 4), result.unwrap());
+        assert_eq!(DataType::Decimal128(21, 4), result.unwrap());
         let op = Operator::Minus;
         let result = coercion_decimal_mathematics_type(
             &op,
             &left_decimal_type,
             &right_decimal_type,
         );
-        assert_eq!(DataType::Decimal(21, 4), result.unwrap());
+        assert_eq!(DataType::Decimal128(21, 4), result.unwrap());
         let op = Operator::Multiply;
         let result = coercion_decimal_mathematics_type(
             &op,
             &left_decimal_type,
             &right_decimal_type,
         );
-        assert_eq!(DataType::Decimal(31, 7), result.unwrap());
+        assert_eq!(DataType::Decimal128(31, 7), result.unwrap());
         let op = Operator::Divide;
         let result = coercion_decimal_mathematics_type(
             &op,
             &left_decimal_type,
             &right_decimal_type,
         );
-        assert_eq!(DataType::Decimal(35, 24), result.unwrap());
+        assert_eq!(DataType::Decimal128(35, 24), result.unwrap());
         let op = Operator::Modulo;
         let result = coercion_decimal_mathematics_type(
             &op,
             &left_decimal_type,
             &right_decimal_type,
         );
-        assert_eq!(DataType::Decimal(11, 4), result.unwrap());
+        assert_eq!(DataType::Decimal128(11, 4), result.unwrap());
     }
 
     #[test]
diff --git a/datafusion/expr/src/type_coercion.rs 
b/datafusion/expr/src/type_coercion.rs
index 33a540d6f..27eee3d30 100644
--- a/datafusion/expr/src/type_coercion.rs
+++ b/datafusion/expr/src/type_coercion.rs
@@ -182,7 +182,7 @@ pub fn can_coerce_from(type_into: &DataType, type_from: 
&DataType) -> bool {
                 | UInt64
                 | Float32
                 | Float64
-                | Decimal(_, _)
+                | Decimal128(_, _)
         ),
         Timestamp(TimeUnit::Nanosecond, None) => {
             matches!(type_from, Null | Timestamp(_, None))
diff --git a/datafusion/expr/src/utils.rs b/datafusion/expr/src/utils.rs
index f2f5d6002..25ca8d6e3 100644
--- a/datafusion/expr/src/utils.rs
+++ b/datafusion/expr/src/utils.rs
@@ -689,7 +689,7 @@ pub fn can_hash(data_type: &DataType) -> bool {
         },
         DataType::Utf8 => true,
         DataType::LargeUtf8 => true,
-        DataType::Decimal(_, _) => true,
+        DataType::Decimal128(_, _) => true,
         DataType::Date32 => true,
         DataType::Date64 => true,
         DataType::Dictionary(key_type, value_type)
diff --git a/datafusion/jit/Cargo.toml b/datafusion/jit/Cargo.toml
index e5b9e9297..8da87bbd7 100644
--- a/datafusion/jit/Cargo.toml
+++ b/datafusion/jit/Cargo.toml
@@ -36,7 +36,7 @@ path = "src/lib.rs"
 jit = []
 
 [dependencies]
-arrow = { version = "19.0.0" }
+arrow = { version = "20.0.0" }
 cranelift = "0.86.1"
 cranelift-jit = "0.86.1"
 cranelift-module = "0.86.1"
diff --git a/datafusion/optimizer/Cargo.toml b/datafusion/optimizer/Cargo.toml
index 30d943c86..695f5be9b 100644
--- a/datafusion/optimizer/Cargo.toml
+++ b/datafusion/optimizer/Cargo.toml
@@ -37,7 +37,7 @@ default = ["unicode_expressions"]
 unicode_expressions = []
 
 [dependencies]
-arrow = { version = "19.0.0", features = ["prettyprint"] }
+arrow = { version = "20.0.0", features = ["prettyprint"] }
 async-trait = "0.1.41"
 chrono = { version = "0.4", default-features = false }
 datafusion-common = { path = "../common", version = "10.0.0" }
diff --git a/datafusion/optimizer/src/decorrelate_scalar_subquery.rs 
b/datafusion/optimizer/src/decorrelate_scalar_subquery.rs
index d4f8372bd..561757dc8 100644
--- a/datafusion/optimizer/src/decorrelate_scalar_subquery.rs
+++ b/datafusion/optimizer/src/decorrelate_scalar_subquery.rs
@@ -69,7 +69,7 @@ impl DecorrelateScalarSubquery {
                                 _ => return Ok(()),
                             };
                             let subquery =
-                                self.optimize(&*subquery.subquery, 
optimizer_config)?;
+                                self.optimize(&subquery.subquery, 
optimizer_config)?;
                             let subquery = Arc::new(subquery);
                             let subquery = Subquery { subquery };
                             let res = SubqueryInfo::new(subquery, expr, *op, 
lhs);
@@ -163,7 +163,7 @@ fn optimize_scalar(
         "optimizing:\n{}",
         query_info.query.subquery.display_indent()
     );
-    let proj = Projection::try_from_plan(&*query_info.query.subquery)
+    let proj = Projection::try_from_plan(&query_info.query.subquery)
         .map_err(|e| context!("scalar subqueries must have a projection", e))?;
     let proj = only_or_err(proj.expr.as_slice())
         .map_err(|e| context!("exactly one expression should be projected", 
e))?;
@@ -173,7 +173,7 @@ fn optimize_scalar(
         .map_err(|e| context!("Exactly one input is expected. Is this a 
join?", e))?;
     let aggr = Aggregate::try_from_plan(sub_input)
         .map_err(|e| context!("scalar subqueries must aggregate a value", e))?;
-    let filter = Filter::try_from_plan(&*aggr.input).map_err(|e| {
+    let filter = Filter::try_from_plan(&aggr.input).map_err(|e| {
         context!("scalar subqueries must have a filter to be correlated", e)
     })?;
 
diff --git a/datafusion/optimizer/src/decorrelate_where_exists.rs 
b/datafusion/optimizer/src/decorrelate_where_exists.rs
index 2c25bcbb2..90fff3f80 100644
--- a/datafusion/optimizer/src/decorrelate_where_exists.rs
+++ b/datafusion/optimizer/src/decorrelate_where_exists.rs
@@ -56,8 +56,7 @@ impl DecorrelateWhereExists {
         for it in filters.iter() {
             match it {
                 Expr::Exists { subquery, negated } => {
-                    let subquery =
-                        self.optimize(&*subquery.subquery, optimizer_config)?;
+                    let subquery = self.optimize(&subquery.subquery, 
optimizer_config)?;
                     let subquery = Arc::new(subquery);
                     let subquery = Subquery { subquery };
                     let subquery = SubqueryInfo::new(subquery.clone(), 
*negated);
diff --git a/datafusion/optimizer/src/decorrelate_where_in.rs 
b/datafusion/optimizer/src/decorrelate_where_in.rs
index f90d94d8c..5da7d80c1 100644
--- a/datafusion/optimizer/src/decorrelate_where_in.rs
+++ b/datafusion/optimizer/src/decorrelate_where_in.rs
@@ -60,8 +60,7 @@ impl DecorrelateWhereIn {
                     subquery,
                     negated,
                 } => {
-                    let subquery =
-                        self.optimize(&*subquery.subquery, optimizer_config)?;
+                    let subquery = self.optimize(&subquery.subquery, 
optimizer_config)?;
                     let subquery = Arc::new(subquery);
                     let subquery = Subquery { subquery };
                     let subquery =
@@ -132,7 +131,7 @@ fn optimize_where_in(
     outer_other_exprs: &[Expr],
     optimizer_config: &mut OptimizerConfig,
 ) -> datafusion_common::Result<LogicalPlan> {
-    let proj = Projection::try_from_plan(&*query_info.query.subquery)
+    let proj = Projection::try_from_plan(&query_info.query.subquery)
         .map_err(|e| context!("a projection is required", e))?;
     let mut subqry_input = proj.input.clone();
     let proj = only_or_err(proj.expr.as_slice())
diff --git a/datafusion/optimizer/src/simplify_expressions.rs 
b/datafusion/optimizer/src/simplify_expressions.rs
index 0b865238f..8bb829024 100644
--- a/datafusion/optimizer/src/simplify_expressions.rs
+++ b/datafusion/optimizer/src/simplify_expressions.rs
@@ -159,15 +159,7 @@ fn is_false(expr: &Expr) -> bool {
 
 /// returns true if `haystack` looks like (needle OP X) or (X OP needle)
 fn is_op_with(target_op: Operator, haystack: &Expr, needle: &Expr) -> bool {
-    match haystack {
-        Expr::BinaryExpr { left, op, right }
-            if op == &target_op
-                && (needle == left.as_ref() || needle == right.as_ref()) =>
-        {
-            true
-        }
-        _ => false,
-    }
+    matches!(haystack, Expr::BinaryExpr { left, op, right } if op == 
&target_op && (needle == left.as_ref() || needle == right.as_ref()))
 }
 
 /// returns the contained boolean value in `expr` as
@@ -1903,7 +1895,7 @@ mod tests {
         let optimized_plan = rule
             .optimize(plan, &mut config)
             .expect("failed to optimize plan");
-        return format!("{:?}", optimized_plan);
+        format!("{:?}", optimized_plan)
     }
 
     #[test]
@@ -1971,8 +1963,7 @@ mod tests {
             .build()
             .unwrap();
 
-        let expected =
-            "Cannot cast string '' to value of 
arrow::datatypes::types::Int32Type type";
+        let expected = "Cannot cast string '' to value of Int32 type";
         let actual = get_optimized_plan_err(&plan, &Utc::now());
         assert_contains!(actual, expected);
     }
diff --git a/datafusion/physical-expr/Cargo.toml 
b/datafusion/physical-expr/Cargo.toml
index 6199949f0..5f25b2e4f 100644
--- a/datafusion/physical-expr/Cargo.toml
+++ b/datafusion/physical-expr/Cargo.toml
@@ -40,7 +40,7 @@ unicode_expressions = ["unicode-segmentation"]
 
 [dependencies]
 ahash = { version = "0.7", default-features = false }
-arrow = { version = "19.0.0", features = ["prettyprint"] }
+arrow = { version = "20.0.0", features = ["prettyprint"] }
 blake2 = { version = "^0.10.2", optional = true }
 blake3 = { version = "1.0", optional = true }
 chrono = { version = "0.4", default-features = false }
diff --git a/datafusion/physical-expr/src/aggregate/average.rs 
b/datafusion/physical-expr/src/aggregate/average.rs
index a55e0e352..9248a5e6b 100644
--- a/datafusion/physical-expr/src/aggregate/average.rs
+++ b/datafusion/physical-expr/src/aggregate/average.rs
@@ -54,7 +54,7 @@ impl Avg {
         // the result of avg just support FLOAT64 and Decimal data type.
         assert!(matches!(
             data_type,
-            DataType::Float64 | DataType::Decimal(_, _)
+            DataType::Float64 | DataType::Decimal128(_, _)
         ));
         Self {
             name: name.into(),
@@ -301,10 +301,10 @@ mod tests {
 
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Avg,
             ScalarValue::Decimal128(Some(35000), 14, 4),
-            DataType::Decimal(14, 4)
+            DataType::Decimal128(14, 4)
         )
     }
 
@@ -318,10 +318,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Avg,
             ScalarValue::Decimal128(Some(32500), 14, 4),
-            DataType::Decimal(14, 4)
+            DataType::Decimal128(14, 4)
         )
     }
 
@@ -336,10 +336,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Avg,
             ScalarValue::Decimal128(None, 14, 4),
-            DataType::Decimal(14, 4)
+            DataType::Decimal128(14, 4)
         )
     }
 
diff --git a/datafusion/physical-expr/src/aggregate/build_in.rs 
b/datafusion/physical-expr/src/aggregate/build_in.rs
index 7bfa9e0a1..f47982bec 100644
--- a/datafusion/physical-expr/src/aggregate/build_in.rs
+++ b/datafusion/physical-expr/src/aggregate/build_in.rs
@@ -292,7 +292,7 @@ mod tests {
             DataType::Int32,
             DataType::Float32,
             DataType::Float64,
-            DataType::Decimal(10, 2),
+            DataType::Decimal128(10, 2),
             DataType::Utf8,
         ];
         for fun in funcs {
@@ -453,7 +453,7 @@ mod tests {
             DataType::Int32,
             DataType::Float32,
             DataType::Float64,
-            DataType::Decimal(10, 2),
+            DataType::Decimal128(10, 2),
             DataType::Utf8,
         ];
         for fun in funcs {
@@ -898,7 +898,7 @@ mod tests {
 
         let observed = return_type(
             &AggregateFunction::ApproxMedian,
-            &[DataType::Decimal(10, 6)],
+            &[DataType::Decimal128(10, 6)],
         );
         assert!(observed.is_err());
 
@@ -914,13 +914,14 @@ mod tests {
         assert_eq!(DataType::Int32, observed);
 
         // test decimal for min
-        let observed = return_type(&AggregateFunction::Min, 
&[DataType::Decimal(10, 6)])?;
-        assert_eq!(DataType::Decimal(10, 6), observed);
+        let observed =
+            return_type(&AggregateFunction::Min, &[DataType::Decimal128(10, 
6)])?;
+        assert_eq!(DataType::Decimal128(10, 6), observed);
 
         // test decimal for max
         let observed =
-            return_type(&AggregateFunction::Max, &[DataType::Decimal(28, 
13)])?;
-        assert_eq!(DataType::Decimal(28, 13), observed);
+            return_type(&AggregateFunction::Max, &[DataType::Decimal128(28, 
13)])?;
+        assert_eq!(DataType::Decimal128(28, 13), observed);
 
         Ok(())
     }
@@ -939,11 +940,13 @@ mod tests {
         let observed = return_type(&AggregateFunction::Sum, 
&[DataType::Float64])?;
         assert_eq!(DataType::Float64, observed);
 
-        let observed = return_type(&AggregateFunction::Sum, 
&[DataType::Decimal(10, 5)])?;
-        assert_eq!(DataType::Decimal(20, 5), observed);
+        let observed =
+            return_type(&AggregateFunction::Sum, &[DataType::Decimal128(10, 
5)])?;
+        assert_eq!(DataType::Decimal128(20, 5), observed);
 
-        let observed = return_type(&AggregateFunction::Sum, 
&[DataType::Decimal(35, 5)])?;
-        assert_eq!(DataType::Decimal(38, 5), observed);
+        let observed =
+            return_type(&AggregateFunction::Sum, &[DataType::Decimal128(35, 
5)])?;
+        assert_eq!(DataType::Decimal128(38, 5), observed);
 
         Ok(())
     }
@@ -970,7 +973,7 @@ mod tests {
         assert_eq!(DataType::Int64, observed);
 
         let observed =
-            return_type(&AggregateFunction::Count, &[DataType::Decimal(28, 
13)])?;
+            return_type(&AggregateFunction::Count, &[DataType::Decimal128(28, 
13)])?;
         assert_eq!(DataType::Int64, observed);
         Ok(())
     }
@@ -986,11 +989,13 @@ mod tests {
         let observed = return_type(&AggregateFunction::Avg, 
&[DataType::Int32])?;
         assert_eq!(DataType::Float64, observed);
 
-        let observed = return_type(&AggregateFunction::Avg, 
&[DataType::Decimal(10, 6)])?;
-        assert_eq!(DataType::Decimal(14, 10), observed);
+        let observed =
+            return_type(&AggregateFunction::Avg, &[DataType::Decimal128(10, 
6)])?;
+        assert_eq!(DataType::Decimal128(14, 10), observed);
 
-        let observed = return_type(&AggregateFunction::Avg, 
&[DataType::Decimal(36, 6)])?;
-        assert_eq!(DataType::Decimal(38, 10), observed);
+        let observed =
+            return_type(&AggregateFunction::Avg, &[DataType::Decimal128(36, 
6)])?;
+        assert_eq!(DataType::Decimal128(38, 10), observed);
         Ok(())
     }
 
diff --git a/datafusion/physical-expr/src/aggregate/min_max.rs 
b/datafusion/physical-expr/src/aggregate/min_max.rs
index 077f4d725..0391382f9 100644
--- a/datafusion/physical-expr/src/aggregate/min_max.rs
+++ b/datafusion/physical-expr/src/aggregate/min_max.rs
@@ -207,7 +207,7 @@ macro_rules! typed_min_max_batch_decimal128 {
 macro_rules! min_max_batch {
     ($VALUES:expr, $OP:ident) => {{
         match $VALUES.data_type() {
-            DataType::Decimal(precision, scale) => {
+            DataType::Decimal128(precision, scale) => {
                 typed_min_max_batch_decimal128!($VALUES, precision, scale, $OP)
             }
             // all types that have a natural order
@@ -803,10 +803,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Min,
             ScalarValue::Decimal128(Some(1), 10, 0),
-            DataType::Decimal(10, 0)
+            DataType::Decimal128(10, 0)
         )
     }
 
@@ -821,10 +821,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Min,
             ScalarValue::Decimal128(None, 10, 0),
-            DataType::Decimal(10, 0)
+            DataType::Decimal128(10, 0)
         )
     }
 
@@ -840,10 +840,10 @@ mod tests {
 
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Min,
             ScalarValue::Decimal128(Some(1), 10, 0),
-            DataType::Decimal(10, 0)
+            DataType::Decimal128(10, 0)
         )
     }
 
@@ -892,10 +892,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Max,
             ScalarValue::Decimal128(Some(5), 10, 0),
-            DataType::Decimal(10, 0)
+            DataType::Decimal128(10, 0)
         )
     }
 
@@ -909,10 +909,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Max,
             ScalarValue::Decimal128(Some(5), 10, 0),
-            DataType::Decimal(10, 0)
+            DataType::Decimal128(10, 0)
         )
     }
 
@@ -926,10 +926,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Min,
             ScalarValue::Decimal128(None, 10, 0),
-            DataType::Decimal(10, 0)
+            DataType::Decimal128(10, 0)
         )
     }
 
diff --git a/datafusion/physical-expr/src/aggregate/sum.rs 
b/datafusion/physical-expr/src/aggregate/sum.rs
index b0a7de6c6..634b21c61 100644
--- a/datafusion/physical-expr/src/aggregate/sum.rs
+++ b/datafusion/physical-expr/src/aggregate/sum.rs
@@ -176,7 +176,7 @@ fn sum_decimal_batch(
 pub(crate) fn sum_batch(values: &ArrayRef, sum_type: &DataType) -> 
Result<ScalarValue> {
     let values = &cast(values, sum_type)?;
     Ok(match values.data_type() {
-        DataType::Decimal(precision, scale) => {
+        DataType::Decimal128(precision, scale) => {
             sum_decimal_batch(values, precision, scale)?
         }
         DataType::Float64 => typed_sum_delta_batch!(values, Float64Array, 
Float64),
@@ -544,7 +544,7 @@ mod tests {
                 .collect::<Decimal128Array>()
                 .with_precision_and_scale(10, 0)?,
         );
-        let result = sum_batch(&array, &DataType::Decimal(10, 0))?;
+        let result = sum_batch(&array, &DataType::Decimal128(10, 0))?;
         assert_eq!(ScalarValue::Decimal128(Some(15), 10, 0), result);
 
         // test agg
@@ -557,10 +557,10 @@ mod tests {
 
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Sum,
             ScalarValue::Decimal128(Some(15), 20, 0),
-            DataType::Decimal(20, 0)
+            DataType::Decimal128(20, 0)
         )
     }
 
@@ -579,7 +579,7 @@ mod tests {
                 .collect::<Decimal128Array>()
                 .with_precision_and_scale(10, 0)?,
         );
-        let result = sum_batch(&array, &DataType::Decimal(10, 0))?;
+        let result = sum_batch(&array, &DataType::Decimal128(10, 0))?;
         assert_eq!(ScalarValue::Decimal128(Some(13), 10, 0), result);
 
         // test agg
@@ -591,10 +591,10 @@ mod tests {
         );
         generic_test_op!(
             array,
-            DataType::Decimal(35, 0),
+            DataType::Decimal128(35, 0),
             Sum,
             ScalarValue::Decimal128(Some(13), 38, 0),
-            DataType::Decimal(38, 0)
+            DataType::Decimal128(38, 0)
         )
     }
 
@@ -613,16 +613,16 @@ mod tests {
                 .collect::<Decimal128Array>()
                 .with_precision_and_scale(10, 0)?,
         );
-        let result = sum_batch(&array, &DataType::Decimal(10, 0))?;
+        let result = sum_batch(&array, &DataType::Decimal128(10, 0))?;
         assert_eq!(ScalarValue::Decimal128(None, 10, 0), result);
 
         // test agg
         generic_test_op!(
             array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Sum,
             ScalarValue::Decimal128(None, 20, 0),
-            DataType::Decimal(20, 0)
+            DataType::Decimal128(20, 0)
         )
     }
 
diff --git a/datafusion/physical-expr/src/aggregate/sum_distinct.rs 
b/datafusion/physical-expr/src/aggregate/sum_distinct.rs
index d939a033e..96ba81834 100644
--- a/datafusion/physical-expr/src/aggregate/sum_distinct.rs
+++ b/datafusion/physical-expr/src/aggregate/sum_distinct.rs
@@ -289,9 +289,9 @@ mod tests {
         );
         generic_test_sum_distinct!(
             array,
-            DataType::Decimal(35, 0),
+            DataType::Decimal128(35, 0),
             ScalarValue::Decimal128(Some(1), 38, 0),
-            DataType::Decimal(38, 0)
+            DataType::Decimal128(38, 0)
         )
     }
 }
diff --git a/datafusion/physical-expr/src/expressions/binary.rs 
b/datafusion/physical-expr/src/expressions/binary.rs
index f199466e9..64e353116 100644
--- a/datafusion/physical-expr/src/expressions/binary.rs
+++ b/datafusion/physical-expr/src/expressions/binary.rs
@@ -334,7 +334,7 @@ macro_rules! binary_primitive_array_op {
         match $LEFT.data_type() {
             // TODO support decimal type
             // which is not the primitive type
-            DataType::Decimal(_,_) => compute_decimal_op!($LEFT, $RIGHT, $OP, 
Decimal128Array),
+            DataType::Decimal128(_,_) => compute_decimal_op!($LEFT, $RIGHT, 
$OP, Decimal128Array),
             DataType::Int8 => compute_op!($LEFT, $RIGHT, $OP, Int8Array),
             DataType::Int16 => compute_op!($LEFT, $RIGHT, $OP, Int16Array),
             DataType::Int32 => compute_op!($LEFT, $RIGHT, $OP, Int32Array),
@@ -359,7 +359,7 @@ macro_rules! binary_primitive_array_op {
 macro_rules! binary_primitive_array_op_scalar {
     ($LEFT:expr, $RIGHT:expr, $OP:ident) => {{
         let result: Result<Arc<dyn Array>> = match $LEFT.data_type() {
-            DataType::Decimal(_,_) => compute_decimal_op_scalar!($LEFT, 
$RIGHT, $OP, Decimal128Array),
+            DataType::Decimal128(_,_) => compute_decimal_op_scalar!($LEFT, 
$RIGHT, $OP, Decimal128Array),
             DataType::Int8 => compute_op_scalar!($LEFT, $RIGHT, $OP, 
Int8Array),
             DataType::Int16 => compute_op_scalar!($LEFT, $RIGHT, $OP, 
Int16Array),
             DataType::Int32 => compute_op_scalar!($LEFT, $RIGHT, $OP, 
Int32Array),
@@ -386,7 +386,7 @@ macro_rules! binary_array_op {
     ($LEFT:expr, $RIGHT:expr, $OP:ident) => {{
         match $LEFT.data_type() {
             DataType::Null => compute_null_op!($LEFT, $RIGHT, $OP, NullArray),
-            DataType::Decimal(_,_) => compute_decimal_op!($LEFT, $RIGHT, $OP, 
Decimal128Array),
+            DataType::Decimal128(_,_) => compute_decimal_op!($LEFT, $RIGHT, 
$OP, Decimal128Array),
             DataType::Int8 => compute_op!($LEFT, $RIGHT, $OP, Int8Array),
             DataType::Int16 => compute_op!($LEFT, $RIGHT, $OP, Int16Array),
             DataType::Int32 => compute_op!($LEFT, $RIGHT, $OP, Int32Array),
@@ -2208,7 +2208,7 @@ mod tests {
         // compare decimal array with other array type
         let schema = Arc::new(Schema::new(vec![
             Field::new("a", DataType::Int64, true),
-            Field::new("b", DataType::Decimal(10, 0), true),
+            Field::new("b", DataType::Decimal128(10, 0), true),
         ]));
 
         let value: i64 = 123;
@@ -2252,7 +2252,7 @@ mod tests {
 
         let schema = Arc::new(Schema::new(vec![
             Field::new("a", DataType::Float64, true),
-            Field::new("b", DataType::Decimal(10, 2), true),
+            Field::new("b", DataType::Decimal128(10, 2), true),
         ]));
 
         let value: i128 = 123;
@@ -2353,7 +2353,7 @@ mod tests {
     fn arithmetic_decimal_expr_test() -> Result<()> {
         let schema = Arc::new(Schema::new(vec![
             Field::new("a", DataType::Int32, true),
-            Field::new("b", DataType::Decimal(10, 2), true),
+            Field::new("b", DataType::Decimal128(10, 2), true),
         ]));
         let value: i128 = 123;
         let decimal_array = Arc::new(create_decimal_array(
@@ -2391,7 +2391,7 @@ mod tests {
         // subtract: decimal array subtract int32 array
         let schema = Arc::new(Schema::new(vec![
             Field::new("b", DataType::Int32, true),
-            Field::new("a", DataType::Decimal(10, 2), true),
+            Field::new("a", DataType::Decimal128(10, 2), true),
         ]));
         let expect = Arc::new(create_decimal_array(
             &[Some(-12177), None, Some(-12178), Some(-12276)],
@@ -2424,7 +2424,7 @@ mod tests {
         // divide: int32 array divide decimal array
         let schema = Arc::new(Schema::new(vec![
             Field::new("a", DataType::Int32, true),
-            Field::new("b", DataType::Decimal(10, 2), true),
+            Field::new("b", DataType::Decimal128(10, 2), true),
         ]));
         let expect = Arc::new(create_decimal_array(
             &[
@@ -2447,7 +2447,7 @@ mod tests {
         // modulus: int32 array modulus decimal array
         let schema = Arc::new(Schema::new(vec![
             Field::new("a", DataType::Int32, true),
-            Field::new("b", DataType::Decimal(10, 2), true),
+            Field::new("b", DataType::Decimal128(10, 2), true),
         ]));
         let expect = Arc::new(create_decimal_array(
             &[Some(000), None, Some(100), Some(000)],
diff --git a/datafusion/physical-expr/src/expressions/binary/adapter.rs 
b/datafusion/physical-expr/src/expressions/binary/adapter.rs
index b0293cdf0..12b8fab89 100644
--- a/datafusion/physical-expr/src/expressions/binary/adapter.rs
+++ b/datafusion/physical-expr/src/expressions/binary/adapter.rs
@@ -38,7 +38,7 @@ macro_rules! make_dyn_comp_op {
                     // Call `op_decimal` (e.g. `eq_decimal) until
                     // arrow has native support
                     // https://github.com/apache/arrow-rs/issues/1200
-                    (DataType::Decimal(_, _), DataType::Decimal(_, _)) => {
+                    (DataType::Decimal128(_, _), DataType::Decimal128(_, _)) 
=> {
                         [<$OP _decimal>](as_decimal_array(left), 
as_decimal_array(right))
                     },
                     // By default call the arrow kernel
diff --git a/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs 
b/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs
index ba8fff716..69b47944d 100644
--- a/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs
+++ b/datafusion/physical-expr/src/expressions/binary/kernels_arrow.rs
@@ -133,7 +133,7 @@ where
 {
     Ok(left
         .iter()
-        .map(|left| left.map(|left| op(left, right)))
+        .map(|left| left.map(|left| op(left.as_i128(), right)))
         .collect())
 }
 
@@ -152,7 +152,7 @@ where
         .zip(right.iter())
         .map(|(left, right)| {
             if let (Some(left), Some(right)) = (left, right) {
-                Some(op(left, right))
+                Some(op(left.as_i128(), right.as_i128()))
             } else {
                 None
             }
@@ -288,7 +288,7 @@ where
         .zip(right.iter())
         .map(|(left, right)| {
             if let (Some(left), Some(right)) = (left, right) {
-                Some(op(left, right)).transpose()
+                Some(op(left.as_i128(), right.as_i128())).transpose()
             } else {
                 Ok(None)
             }
@@ -307,7 +307,7 @@ where
     left.iter()
         .map(|left| {
             if let Some(left) = left {
-                Some(op(left, right)).transpose()
+                Some(op(left.as_i128(), right)).transpose()
             } else {
                 Ok(None)
             }
diff --git a/datafusion/physical-expr/src/expressions/cast.rs 
b/datafusion/physical-expr/src/expressions/cast.rs
index 72503bbdb..b575ca311 100644
--- a/datafusion/physical-expr/src/expressions/cast.rs
+++ b/datafusion/physical-expr/src/expressions/cast.rs
@@ -290,9 +290,9 @@ mod tests {
 
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 3),
+            DataType::Decimal128(10, 3),
             Decimal128Array,
-            DataType::Decimal(20, 6),
+            DataType::Decimal128(20, 6),
             vec![
                 Some(convert(1_234_000)),
                 Some(convert(2_222_000)),
@@ -312,9 +312,9 @@ mod tests {
         let convert = |v: i128| Decimal128::new(10, 2, &v.to_le_bytes());
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 3),
+            DataType::Decimal128(10, 3),
             Decimal128Array,
-            DataType::Decimal(10, 2),
+            DataType::Decimal128(10, 2),
             vec![
                 Some(convert(123)),
                 Some(convert(222)),
@@ -339,7 +339,7 @@ mod tests {
             .with_precision_and_scale(10, 0)?;
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int8Array,
             DataType::Int8,
             vec![
@@ -360,7 +360,7 @@ mod tests {
             .with_precision_and_scale(10, 0)?;
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int16Array,
             DataType::Int16,
             vec![
@@ -381,7 +381,7 @@ mod tests {
             .with_precision_and_scale(10, 0)?;
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int32Array,
             DataType::Int32,
             vec![
@@ -402,7 +402,7 @@ mod tests {
             .with_precision_and_scale(10, 0)?;
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int64Array,
             DataType::Int64,
             vec![
@@ -431,7 +431,7 @@ mod tests {
             .with_precision_and_scale(10, 3)?;
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 3),
+            DataType::Decimal128(10, 3),
             Float32Array,
             DataType::Float32,
             vec![
@@ -452,7 +452,7 @@ mod tests {
             .with_precision_and_scale(20, 6)?;
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(20, 6),
+            DataType::Decimal128(20, 6),
             Float64Array,
             DataType::Float64,
             vec![
@@ -477,7 +477,7 @@ mod tests {
             DataType::Int8,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(3, 0),
+            DataType::Decimal128(3, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -495,7 +495,7 @@ mod tests {
             DataType::Int16,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(5, 0),
+            DataType::Decimal128(5, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -513,7 +513,7 @@ mod tests {
             DataType::Int32,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -531,7 +531,7 @@ mod tests {
             DataType::Int64,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(20, 0),
+            DataType::Decimal128(20, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -549,7 +549,7 @@ mod tests {
             DataType::Int64,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(20, 2),
+            DataType::Decimal128(20, 2),
             vec![
                 Some(convert(100)),
                 Some(convert(200)),
@@ -567,7 +567,7 @@ mod tests {
             DataType::Float32,
             vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
             Decimal128Array,
-            DataType::Decimal(10, 2),
+            DataType::Decimal128(10, 2),
             vec![
                 Some(convert(150)),
                 Some(convert(250)),
@@ -585,7 +585,7 @@ mod tests {
             DataType::Float64,
             vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
             Decimal128Array,
-            DataType::Decimal(20, 4),
+            DataType::Decimal128(20, 4),
             vec![
                 Some(convert(15000)),
                 Some(convert(25000)),
@@ -678,9 +678,9 @@ mod tests {
         match result {
             Ok(_) => panic!("expected error"),
             Err(e) => {
-                assert!(e.to_string().contains(
-                    "Cast error: Cannot cast string '9.1' to value of 
arrow::datatypes::types::Int32Type type"
-                ))
+                assert!(e
+                    .to_string()
+                    .contains("Cannot cast string '9.1' to value of Int32 
type"))
             }
         }
         Ok(())
diff --git a/datafusion/physical-expr/src/expressions/in_list.rs 
b/datafusion/physical-expr/src/expressions/in_list.rs
index 899a20835..a391bf51d 100644
--- a/datafusion/physical-expr/src/expressions/in_list.rs
+++ b/datafusion/physical-expr/src/expressions/in_list.rs
@@ -254,6 +254,45 @@ macro_rules! collection_contains_check {
     }};
 }
 
+macro_rules! collection_contains_check_decimal {
+    ($ARRAY:expr, $VALUES:expr, $NEGATED:expr, $CONTAINS_NULL:expr) => {{
+        let bool_array = if $NEGATED {
+            // Not in
+            if $CONTAINS_NULL {
+                $ARRAY
+                    .iter()
+                    .map(|vop| match vop.map(|v| 
!$VALUES.contains(&v.as_i128())) {
+                        Some(true) => None,
+                        x => x,
+                    })
+                    .collect::<BooleanArray>()
+            } else {
+                $ARRAY
+                    .iter()
+                    .map(|vop| vop.map(|v| !$VALUES.contains(&v.as_i128())))
+                    .collect::<BooleanArray>()
+            }
+        } else {
+            // In
+            if $CONTAINS_NULL {
+                $ARRAY
+                    .iter()
+                    .map(|vop| match vop.map(|v| 
$VALUES.contains(&v.as_i128())) {
+                        Some(false) => None,
+                        x => x,
+                    })
+                    .collect::<BooleanArray>()
+            } else {
+                $ARRAY
+                    .iter()
+                    .map(|vop| vop.map(|v| $VALUES.contains(&v.as_i128())))
+                    .collect::<BooleanArray>()
+            }
+        };
+        ColumnarValue::Array(Arc::new(bool_array))
+    }};
+}
+
 // whether each value on the left (can be null) is contained in the non-null 
list
 fn in_list_utf8<OffsetSize: OffsetSizeTrait>(
     array: &GenericStringArray<OffsetSize>,
@@ -315,7 +354,7 @@ fn make_list_contains_decimal(
         })
         .collect::<Vec<_>>();
 
-    collection_contains_check!(array, values, negated, contains_null)
+    collection_contains_check_decimal!(array, values, negated, contains_null)
 }
 
 fn make_set_contains_decimal(
@@ -335,7 +374,7 @@ fn make_set_contains_decimal(
         .collect::<Vec<_>>();
     let native_set: HashSet<i128> = HashSet::from_iter(native_array);
 
-    collection_contains_check!(array, native_set, negated, contains_null)
+    collection_contains_check_decimal!(array, native_set, negated, 
contains_null)
 }
 
 fn set_contains_utf8<OffsetSize: OffsetSizeTrait>(
@@ -631,7 +670,7 @@ impl PhysicalExpr for InListExpr {
                         .unwrap();
                     Ok(set_contains_utf8(array, set, self.negated))
                 }
-                DataType::Decimal(_, _) => {
+                DataType::Decimal128(_, _) => {
                     let array = 
array.as_any().downcast_ref::<Decimal128Array>().unwrap();
                     Ok(make_set_contains_decimal(array, set, self.negated))
                 }
@@ -760,7 +799,7 @@ impl PhysicalExpr for InListExpr {
                     let null_array = new_null_array(&DataType::Boolean, 
array.len());
                     Ok(ColumnarValue::Array(Arc::new(null_array)))
                 }
-                DataType::Decimal(_, _) => {
+                DataType::Decimal128(_, _) => {
                     let decimal_array =
                         
array.as_any().downcast_ref::<Decimal128Array>().unwrap();
                     Ok(make_list_contains_decimal(
@@ -1032,7 +1071,8 @@ mod tests {
     #[test]
     fn in_list_decimal() -> Result<()> {
         // Now, we can check the NULL type
-        let schema = Schema::new(vec![Field::new("a", DataType::Decimal(13, 
4), true)]);
+        let schema =
+            Schema::new(vec![Field::new("a", DataType::Decimal128(13, 4), 
true)]);
         let array = vec![Some(100_0000_i128), None, Some(200_5000_i128)]
             .into_iter()
             .collect::<Decimal128Array>();
@@ -1278,7 +1318,8 @@ mod tests {
 
     #[test]
     fn in_list_set_decimal() -> Result<()> {
-        let schema = Schema::new(vec![Field::new("a", DataType::Decimal(13, 
4), true)]);
+        let schema =
+            Schema::new(vec![Field::new("a", DataType::Decimal128(13, 4), 
true)]);
         let array = vec![Some(100_0000_i128), Some(200_5000_i128), None]
             .into_iter()
             .collect::<Decimal128Array>();
@@ -1320,7 +1361,8 @@ mod tests {
     #[test]
     fn test_cast_static_filter_to_set() -> Result<()> {
         // random schema
-        let schema = Schema::new(vec![Field::new("a", DataType::Decimal(13, 
4), true)]);
+        let schema =
+            Schema::new(vec![Field::new("a", DataType::Decimal128(13, 4), 
true)]);
         // list of phy expr
         let mut phy_exprs = vec![
             lit(1i64),
diff --git a/datafusion/physical-expr/src/expressions/try_cast.rs 
b/datafusion/physical-expr/src/expressions/try_cast.rs
index 5e8cc30fe..0333cb300 100644
--- a/datafusion/physical-expr/src/expressions/try_cast.rs
+++ b/datafusion/physical-expr/src/expressions/try_cast.rs
@@ -237,9 +237,9 @@ mod tests {
         let convert = |v: i128| Decimal128::new(20, 6, &v.to_le_bytes());
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 3),
+            DataType::Decimal128(10, 3),
             Decimal128Array,
-            DataType::Decimal(20, 6),
+            DataType::Decimal128(20, 6),
             vec![
                 Some(convert(1_234_000)),
                 Some(convert(2_222_000)),
@@ -254,9 +254,9 @@ mod tests {
         let convert = |v: i128| Decimal128::new(10, 2, &v.to_le_bytes());
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 3),
+            DataType::Decimal128(10, 3),
             Decimal128Array,
-            DataType::Decimal(10, 2),
+            DataType::Decimal128(10, 2),
             vec![
                 Some(convert(123)),
                 Some(convert(222)),
@@ -279,7 +279,7 @@ mod tests {
         // decimal to i8
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int8Array,
             DataType::Int8,
             vec![
@@ -296,7 +296,7 @@ mod tests {
         let decimal_array = create_decimal_array(&array, 10, 0);
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int16Array,
             DataType::Int16,
             vec![
@@ -313,7 +313,7 @@ mod tests {
         let decimal_array = create_decimal_array(&array, 10, 0);
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int32Array,
             DataType::Int32,
             vec![
@@ -330,7 +330,7 @@ mod tests {
         let decimal_array = create_decimal_array(&array, 10, 0);
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             Int64Array,
             DataType::Int64,
             vec![
@@ -348,7 +348,7 @@ mod tests {
         let decimal_array = create_decimal_array(&array, 10, 3);
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(10, 3),
+            DataType::Decimal128(10, 3),
             Float32Array,
             DataType::Float32,
             vec![
@@ -364,7 +364,7 @@ mod tests {
         let decimal_array = create_decimal_array(&array, 20, 6);
         generic_decimal_to_other_test_cast!(
             decimal_array,
-            DataType::Decimal(20, 6),
+            DataType::Decimal128(20, 6),
             Float64Array,
             DataType::Float64,
             vec![
@@ -389,7 +389,7 @@ mod tests {
             DataType::Int8,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(3, 0),
+            DataType::Decimal128(3, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -406,7 +406,7 @@ mod tests {
             DataType::Int16,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(5, 0),
+            DataType::Decimal128(5, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -423,7 +423,7 @@ mod tests {
             DataType::Int32,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(10, 0),
+            DataType::Decimal128(10, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -440,7 +440,7 @@ mod tests {
             DataType::Int64,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(20, 0),
+            DataType::Decimal128(20, 0),
             vec![
                 Some(convert(1)),
                 Some(convert(2)),
@@ -457,7 +457,7 @@ mod tests {
             DataType::Int64,
             vec![1, 2, 3, 4, 5],
             Decimal128Array,
-            DataType::Decimal(20, 2),
+            DataType::Decimal128(20, 2),
             vec![
                 Some(convert(100)),
                 Some(convert(200)),
@@ -474,7 +474,7 @@ mod tests {
             DataType::Float32,
             vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
             Decimal128Array,
-            DataType::Decimal(10, 2),
+            DataType::Decimal128(10, 2),
             vec![
                 Some(convert(150)),
                 Some(convert(250)),
@@ -491,7 +491,7 @@ mod tests {
             DataType::Float64,
             vec![1.5, 2.5, 3.0, 1.123_456_8, 5.50],
             Decimal128Array,
-            DataType::Decimal(20, 4),
+            DataType::Decimal128(20, 4),
             vec![
                 Some(convert(15000)),
                 Some(convert(25000)),
diff --git a/datafusion/physical-expr/src/type_coercion.rs 
b/datafusion/physical-expr/src/type_coercion.rs
index fb5f59ef3..c7648cc26 100644
--- a/datafusion/physical-expr/src/type_coercion.rs
+++ b/datafusion/physical-expr/src/type_coercion.rs
@@ -78,7 +78,7 @@ mod tests {
             Schema::new(
                 t.iter()
                     .enumerate()
-                    .map(|(i, t)| Field::new(&*format!("c{}", i), t.clone(), 
true))
+                    .map(|(i, t)| Field::new(&format!("c{}", i), t.clone(), 
true))
                     .collect(),
             )
         };
diff --git a/datafusion/proto/Cargo.toml b/datafusion/proto/Cargo.toml
index c2966dcde..dc8991975 100644
--- a/datafusion/proto/Cargo.toml
+++ b/datafusion/proto/Cargo.toml
@@ -37,13 +37,13 @@ default = []
 json = ["pbjson", "pbjson-build", "serde", "serde_json"]
 
 [dependencies]
-arrow = { version = "19.0.0" }
+arrow = { version = "20.0.0" }
 datafusion = { path = "../core", version = "10.0.0" }
 datafusion-common = { path = "../common", version = "10.0.0" }
 datafusion-expr = { path = "../expr", version = "10.0.0" }
 pbjson = { version = "0.3", optional = true }
 pbjson-types = { version = "0.3", optional = true }
-prost = "0.10"
+prost = "0.11.0"
 serde = { version = "1.0", optional = true }
 serde_json = { version = "1.0", optional = true }
 
@@ -53,4 +53,4 @@ tokio = "1.18"
 
 [build-dependencies]
 pbjson-build = { version = "0.3", optional = true }
-prost-build = { version = "0.10" }
+prost-build = { version = "0.11.1" }
diff --git a/datafusion/proto/src/from_proto.rs 
b/datafusion/proto/src/from_proto.rs
index efe174082..c1c88e70d 100644
--- a/datafusion/proto/src/from_proto.rs
+++ b/datafusion/proto/src/from_proto.rs
@@ -226,7 +226,7 @@ impl From<protobuf::PrimitiveScalarType> for DataType {
                 DataType::Time64(TimeUnit::Nanosecond)
             }
             protobuf::PrimitiveScalarType::Null => DataType::Null,
-            protobuf::PrimitiveScalarType::Decimal128 => DataType::Decimal(0, 
0),
+            protobuf::PrimitiveScalarType::Decimal128 => 
DataType::Decimal128(0, 0),
             protobuf::PrimitiveScalarType::Date64 => DataType::Date64,
             protobuf::PrimitiveScalarType::TimeSecond => {
                 DataType::Timestamp(TimeUnit::Second, None)
@@ -309,7 +309,7 @@ impl TryFrom<&protobuf::arrow_type::ArrowTypeEnum> for 
DataType {
             arrow_type::ArrowTypeEnum::Decimal(protobuf::Decimal {
                 whole,
                 fractional,
-            }) => DataType::Decimal(*whole as usize, *fractional as usize),
+            }) => DataType::Decimal128(*whole as usize, *fractional as usize),
             arrow_type::ArrowTypeEnum::List(list) => {
                 let list_type =
                     
list.as_ref().field_type.as_deref().required("field_type")?;
diff --git a/datafusion/proto/src/lib.rs b/datafusion/proto/src/lib.rs
index 88230766d..c69723442 100644
--- a/datafusion/proto/src/lib.rs
+++ b/datafusion/proto/src/lib.rs
@@ -153,7 +153,7 @@ mod roundtrip_tests {
             pub expr: ::core::option::Option<crate::protobuf::LogicalExprNode>,
         }
 
-        #[derive(Clone, PartialEq, ::prost::Message)]
+        #[derive(Clone, PartialEq, Eq, ::prost::Message)]
         pub struct TopKExecProto {
             #[prost(uint64, tag = "1")]
             pub k: u64,
@@ -569,7 +569,7 @@ mod roundtrip_tests {
             DataType::FixedSizeBinary(1234),
             DataType::FixedSizeBinary(-432),
             DataType::LargeBinary,
-            DataType::Decimal(1345, 5431),
+            DataType::Decimal128(1345, 5431),
             // Recursive list tests
             DataType::List(new_box_field("Level1", DataType::Binary, true)),
             DataType::List(new_box_field(
@@ -651,7 +651,7 @@ mod roundtrip_tests {
                 ])),
             ),
             DataType::Dictionary(
-                Box::new(DataType::Decimal(10, 50)),
+                Box::new(DataType::Decimal128(10, 50)),
                 Box::new(DataType::FixedSizeList(
                     new_box_field("Level1", DataType::Binary, true),
                     4,
@@ -724,7 +724,7 @@ mod roundtrip_tests {
             DataType::LargeBinary,
             DataType::Utf8,
             DataType::LargeUtf8,
-            DataType::Decimal(1345, 5431),
+            DataType::Decimal128(1345, 5431),
             // Recursive list tests
             DataType::List(new_box_field("Level1", DataType::Binary, true)),
             DataType::List(new_box_field(
@@ -806,7 +806,7 @@ mod roundtrip_tests {
                 ])),
             ),
             DataType::Dictionary(
-                Box::new(DataType::Decimal(10, 50)),
+                Box::new(DataType::Decimal128(10, 50)),
                 Box::new(DataType::FixedSizeList(
                     new_box_field("Level1", DataType::Binary, true),
                     4,
diff --git a/datafusion/proto/src/to_proto.rs b/datafusion/proto/src/to_proto.rs
index bae41bc27..e78706e52 100644
--- a/datafusion/proto/src/to_proto.rs
+++ b/datafusion/proto/src/to_proto.rs
@@ -219,7 +219,7 @@ impl From<&DataType> for 
protobuf::arrow_type::ArrowTypeEnum {
                     value: Some(Box::new(value_type.as_ref().into())),
                 }))
             }
-            DataType::Decimal(whole, fractional) => 
Self::Decimal(protobuf::Decimal {
+            DataType::Decimal128(whole, fractional) => 
Self::Decimal(protobuf::Decimal {
                 whole: *whole as u64,
                 fractional: *fractional as u64,
             }),
@@ -1244,7 +1244,7 @@ impl TryFrom<&DataType> for 
protobuf::scalar_type::Datatype {
             | DataType::Union(_, _, _)
             | DataType::Dictionary(_, _)
             | DataType::Map(_, _)
-            | DataType::Decimal(_, _)
+            | DataType::Decimal128(_, _)
             | DataType::Decimal256(_, _) => {
                 return Err(Error::invalid_scalar_type(val));
             }
diff --git a/datafusion/row/Cargo.toml b/datafusion/row/Cargo.toml
index 2227103f4..1621a216e 100644
--- a/datafusion/row/Cargo.toml
+++ b/datafusion/row/Cargo.toml
@@ -37,7 +37,7 @@ path = "src/lib.rs"
 jit = ["datafusion-jit"]
 
 [dependencies]
-arrow = { version = "19.0.0" }
+arrow = { version = "20.0.0" }
 datafusion-common = { path = "../common", version = "10.0.0" }
 datafusion-jit = { path = "../jit", version = "10.0.0", optional = true }
 paste = "^1.0"
diff --git a/datafusion/row/src/layout.rs b/datafusion/row/src/layout.rs
index e5214f7c3..1518df9bf 100644
--- a/datafusion/row/src/layout.rs
+++ b/datafusion/row/src/layout.rs
@@ -166,7 +166,7 @@ fn word_aligned_offsets(null_width: usize, schema: &Schema) 
-> (Vec<usize>, usiz
     let mut offset = null_width;
     for f in schema.fields() {
         offsets.push(offset);
-        assert!(!matches!(f.data_type(), DataType::Decimal(_, _)));
+        assert!(!matches!(f.data_type(), DataType::Decimal128(_, _)));
         // All of the current support types can fit into one single 8-bytes 
word.
         // When we decide to support Decimal type in the future, its width 
would be
         // of two 8-bytes words and should adapt the width calculation below.
diff --git a/datafusion/row/src/lib.rs b/datafusion/row/src/lib.rs
index 5a7669356..7d715f9da 100644
--- a/datafusion/row/src/lib.rs
+++ b/datafusion/row/src/lib.rs
@@ -388,7 +388,7 @@ mod tests {
     fn test_unsupported_type_read() {
         let schema = Arc::new(Schema::new(vec![Field::new(
             "a",
-            DataType::Decimal(5, 2),
+            DataType::Decimal128(5, 2),
             false,
         )]));
         let vector = vec![0; 1024];
diff --git a/datafusion/sql/Cargo.toml b/datafusion/sql/Cargo.toml
index 17e658399..a6499a7f9 100644
--- a/datafusion/sql/Cargo.toml
+++ b/datafusion/sql/Cargo.toml
@@ -38,7 +38,7 @@ unicode_expressions = []
 
 [dependencies]
 ahash = { version = "0.7", default-features = false }
-arrow = { version = "19.0.0", features = ["prettyprint"] }
+arrow = { version = "20.0.0", features = ["prettyprint"] }
 datafusion-common = { path = "../common", version = "10.0.0" }
 datafusion-expr = { path = "../expr", version = "10.0.0" }
 hashbrown = "0.12"
diff --git a/datafusion/sql/examples/sql.rs b/datafusion/sql/examples/sql.rs
index d5af9d5ed..f03cad0b6 100644
--- a/datafusion/sql/examples/sql.rs
+++ b/datafusion/sql/examples/sql.rs
@@ -75,7 +75,7 @@ impl MySchemaProvider {
             "state".to_string(),
             create_table_source(vec![
                 Field::new("id", DataType::Int32, false),
-                Field::new("sales_tax", DataType::Decimal(10, 2), false),
+                Field::new("sales_tax", DataType::Decimal128(10, 2), false),
             ]),
         );
         tables.insert(
@@ -85,7 +85,7 @@ impl MySchemaProvider {
                 Field::new("customer_id", DataType::Int32, false),
                 Field::new("item_id", DataType::Int32, false),
                 Field::new("quantity", DataType::Int32, false),
-                Field::new("price", DataType::Decimal(10, 2), false),
+                Field::new("price", DataType::Decimal128(10, 2), false),
             ]),
         );
         Self { tables }
diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs
index dc71dc4b2..22a9b1f0e 100644
--- a/datafusion/sql/src/planner.rs
+++ b/datafusion/sql/src/planner.rs
@@ -369,9 +369,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
         let table_ref: TableReference = table_name.as_str().into();
 
         // check if table_name exists
-        if let Err(e) = self.schema_provider.get_table_provider(table_ref) {
-            return Err(e);
-        }
+        let _ = self.schema_provider.get_table_provider(table_ref)?;
 
         if self.has_table("information_schema", "tables") {
             let sql = format!("SELECT column_name, data_type, is_nullable \
@@ -2287,9 +2285,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
         let table_name = normalize_sql_object_name(sql_table_name);
         let table_ref: TableReference = table_name.as_str().into();
 
-        if let Err(e) = self.schema_provider.get_table_provider(table_ref) {
-            return Err(e);
-        }
+        let _ = self.schema_provider.get_table_provider(table_ref)?;
 
         // Figure out the where clause
         let columns = vec!["table_name", "table_schema", 
"table_catalog"].into_iter();
@@ -2334,9 +2330,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
         let table_name = normalize_sql_object_name(sql_table_name);
         let table_ref: TableReference = table_name.as_str().into();
 
-        if let Err(e) = self.schema_provider.get_table_provider(table_ref) {
-            return Err(e);
-        }
+        let _ = self.schema_provider.get_table_provider(table_ref)?;
 
         // Figure out the where clause
         let columns = vec!["table_name", "table_schema", 
"table_catalog"].into_iter();
@@ -2626,7 +2620,7 @@ mod tests {
     fn test_int_decimal_default() {
         quick_test(
             "SELECT CAST(10 AS DECIMAL)",
-            "Projection: CAST(Int64(10) AS Decimal(38, 10))\
+            "Projection: CAST(Int64(10) AS Decimal128(38, 10))\
              \n  EmptyRelation",
         );
     }
@@ -2635,7 +2629,7 @@ mod tests {
     fn test_int_decimal_no_scale() {
         quick_test(
             "SELECT CAST(10 AS DECIMAL(5))",
-            "Projection: CAST(Int64(10) AS Decimal(5, 0))\
+            "Projection: CAST(Int64(10) AS Decimal128(5, 0))\
              \n  EmptyRelation",
         );
     }
@@ -4424,7 +4418,7 @@ mod tests {
                 ])),
                 "test_decimal" => Ok(Schema::new(vec![
                     Field::new("id", DataType::Int32, false),
-                    Field::new("price", DataType::Decimal(10, 2), false),
+                    Field::new("price", DataType::Decimal128(10, 2), false),
                 ])),
                 "person" => Ok(Schema::new(vec![
                     Field::new("id", DataType::UInt32, false),
diff --git a/datafusion/sql/src/utils.rs b/datafusion/sql/src/utils.rs
index 00c28f823..81ea34de1 100644
--- a/datafusion/sql/src/utils.rs
+++ b/datafusion/sql/src/utils.rs
@@ -17,7 +17,7 @@
 
 //! SQL Utility Functions
 
-use arrow::datatypes::{DataType, DECIMAL_DEFAULT_SCALE, DECIMAL_MAX_PRECISION};
+use arrow::datatypes::{DataType, DECIMAL128_MAX_PRECISION, 
DECIMAL_DEFAULT_SCALE};
 use sqlparser::ast::Ident;
 
 use datafusion_common::{DataFusionError, Result, ScalarValue};
@@ -454,17 +454,17 @@ pub(crate) fn make_decimal_type(
                 "Cannot specify only scale for decimal data type".to_string(),
             ))
         }
-        (None, None) => (DECIMAL_MAX_PRECISION, DECIMAL_DEFAULT_SCALE),
+        (None, None) => (DECIMAL128_MAX_PRECISION, DECIMAL_DEFAULT_SCALE),
     };
 
     // Arrow decimal is i128 meaning 38 maximum decimal digits
-    if precision > DECIMAL_MAX_PRECISION || scale > precision {
+    if precision > DECIMAL128_MAX_PRECISION || scale > precision {
         Err(DataFusionError::Internal(format!(
             "For decimal(precision, scale) precision must be less than or 
equal to 38 and scale can't be greater than precision. Got ({}, {})",
             precision, scale
         )))
     } else {
-        Ok(DataType::Decimal(precision, scale))
+        Ok(DataType::Decimal128(precision, scale))
     }
 }
 

Reply via email to