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 69678d53d [sqllogictest] Move `decimal.rs` tests (#5086)
69678d53d is described below
commit 69678d53d09e6fde199a94eff2ff2e5a4083f183
Author: Yevhenii Melnyk <[email protected]>
AuthorDate: Sat Jan 28 14:18:53 2023 +0100
[sqllogictest] Move `decimal.rs` tests (#5086)
* [sqllogictest] Move `decimal.rs` tests
* Check types in sqllogictest
* Remove the decimal module properly
---
datafusion/core/tests/sql/decimal.rs | 915 ---------------------
datafusion/core/tests/sql/mod.rs | 25 -
.../tests/sqllogictests/test_files/decimal.slt | 594 +++++++++++++
3 files changed, 594 insertions(+), 940 deletions(-)
diff --git a/datafusion/core/tests/sql/decimal.rs
b/datafusion/core/tests/sql/decimal.rs
deleted file mode 100644
index f101777d7..000000000
--- a/datafusion/core/tests/sql/decimal.rs
+++ /dev/null
@@ -1,915 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-use super::*;
-
-#[tokio::test]
-async fn decimal_cast() -> Result<()> {
- let ctx = SessionContext::new();
- let sql = "select cast(1.23 as decimal(10,4))";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 4),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+---------------+",
- "| Float64(1.23) |",
- "+---------------+",
- "| 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::Decimal128(10, 4),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+---------------+",
- "| Float64(1.23) |",
- "+---------------+",
- "| 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::Decimal128(24, 2),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+-----------------+",
- "| Float64(1.2345) |",
- "+-----------------+",
- "| 1.23 |",
- "+-----------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_by_sql() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- let sql = "SELECT c1 from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+",
- "| c1 |",
- "+----------+",
- "| 0.000010 |",
- "| 0.000020 |",
- "| 0.000020 |",
- "| 0.000030 |",
- "| 0.000030 |",
- "| 0.000030 |",
- "| 0.000040 |",
- "| 0.000040 |",
- "| 0.000040 |",
- "| 0.000040 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "+----------+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_by_filter() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- let sql = "select c1 from decimal_simple where c1 > 0.000030";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+",
- "| c1 |",
- "+----------+",
- "| 0.000040 |",
- "| 0.000040 |",
- "| 0.000040 |",
- "| 0.000040 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "| 0.000050 |",
- "+----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- let sql = "select * from decimal_simple where c1 > c5";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- assert_eq!(
- &DataType::Decimal128(12, 7),
- actual[0].schema().field(4).data_type()
- );
- let expected = vec![
- "+----------+----------------+----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+----+-------+-----------+",
- "| 0.000020 | 0.000000000002 | 3 | false | 0.0000190 |",
- "| 0.000030 | 0.000000000003 | 5 | true | 0.0000110 |",
- "| 0.000050 | 0.000000000005 | 8 | false | 0.0000330 |",
- "+----------+----------------+----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_agg_function() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- // min
- let sql = "select min(c1) from decimal_simple where c4=false";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+------------------------+",
- "| MIN(decimal_simple.c1) |",
- "+------------------------+",
- "| 0.000020 |",
- "+------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- // max
- let sql = "select max(c1) from decimal_simple where c4=false";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+------------------------+",
- "| MAX(decimal_simple.c1) |",
- "+------------------------+",
- "| 0.000050 |",
- "+------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // sum
- let sql = "select sum(c1) from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- // inferred precision is 10+10
- assert_eq!(
- &DataType::Decimal128(20, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+------------------------+",
- "| SUM(decimal_simple.c1) |",
- "+------------------------+",
- "| 0.000550 |",
- "+------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // avg
- // inferred precision is original precision + 4
- // inferred scale is original scale + 4
- let sql = "select avg(c1) from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(14, 10),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+------------------------+",
- "| AVG(decimal_simple.c1) |",
- "+------------------------+",
- "| 0.0000366666 |",
- "+------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_logic_op() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- // logic operation: eq
- 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::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+----+-------+-----------+",
- "| 0.000020 | 0.000000000002 | 2 | true | 0.0000250 |",
- "| 0.000020 | 0.000000000002 | 3 | false | 0.0000190 |",
- "+----------+----------------+----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // logic operation: not eq
- let sql = "select c2,c3 from decimal_simple where c1!=0.00002";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+----------------+-----+",
- "| c2 | c3 |",
- "+----------------+-----+",
- "| 0.000000000001 | 1 |",
- "| 0.000000000003 | 4 |",
- "| 0.000000000003 | 5 |",
- "| 0.000000000003 | 5 |",
- "| 0.000000000004 | 5 |",
- "| 0.000000000004 | 12 |",
- "| 0.000000000004 | 14 |",
- "| 0.000000000004 | 8 |",
- "| 0.000000000005 | 9 |",
- "| 0.000000000005 | 4 |",
- "| 0.000000000005 | 8 |",
- "| 0.000000000005 | 100 |",
- "| 0.000000000005 | 1 |",
- "+----------------+-----+",
- ];
- assert_batches_eq!(expected, &actual);
- // logic operation: lt
- let sql = "select * from decimal_simple where 0.00002 > c1";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+----+------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+----+------+-----------+",
- "| 0.000010 | 0.000000000001 | 1 | true | 0.0000140 |",
- "+----------+----------------+----+------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // logic operation: lteq
- let sql = "select * from decimal_simple where c1 <= 0.00002";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+----+-------+-----------+",
- "| 0.000010 | 0.000000000001 | 1 | true | 0.0000140 |",
- "| 0.000020 | 0.000000000002 | 2 | true | 0.0000250 |",
- "| 0.000020 | 0.000000000002 | 3 | false | 0.0000190 |",
- "+----------+----------------+----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // logic operation: gt
- let sql = "select * from decimal_simple where c1 > 0.00002";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+-----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+-----+-------+-----------+",
- "| 0.000030 | 0.000000000003 | 4 | true | 0.0000320 |",
- "| 0.000030 | 0.000000000003 | 5 | false | 0.0000350 |",
- "| 0.000030 | 0.000000000003 | 5 | true | 0.0000110 |",
- "| 0.000040 | 0.000000000004 | 5 | true | 0.0000440 |",
- "| 0.000040 | 0.000000000004 | 12 | false | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 14 | true | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 8 | false | 0.0000440 |",
- "| 0.000050 | 0.000000000005 | 9 | true | 0.0000520 |",
- "| 0.000050 | 0.000000000005 | 4 | true | 0.0000780 |",
- "| 0.000050 | 0.000000000005 | 8 | false | 0.0000330 |",
- "| 0.000050 | 0.000000000005 | 100 | true | 0.0000680 |",
- "| 0.000050 | 0.000000000005 | 1 | false | 0.0001000 |",
- "+----------+----------------+-----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // logic operation: gteq
- let sql = "select * from decimal_simple where c1 >= 0.00002";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+-----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+-----+-------+-----------+",
- "| 0.000020 | 0.000000000002 | 2 | true | 0.0000250 |",
- "| 0.000020 | 0.000000000002 | 3 | false | 0.0000190 |",
- "| 0.000030 | 0.000000000003 | 4 | true | 0.0000320 |",
- "| 0.000030 | 0.000000000003 | 5 | false | 0.0000350 |",
- "| 0.000030 | 0.000000000003 | 5 | true | 0.0000110 |",
- "| 0.000040 | 0.000000000004 | 5 | true | 0.0000440 |",
- "| 0.000040 | 0.000000000004 | 12 | false | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 14 | true | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 8 | false | 0.0000440 |",
- "| 0.000050 | 0.000000000005 | 9 | true | 0.0000520 |",
- "| 0.000050 | 0.000000000005 | 4 | true | 0.0000780 |",
- "| 0.000050 | 0.000000000005 | 8 | false | 0.0000330 |",
- "| 0.000050 | 0.000000000005 | 100 | true | 0.0000680 |",
- "| 0.000050 | 0.000000000005 | 1 | false | 0.0001000 |",
- "+----------+----------------+-----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_arithmetic_op() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- // add
- let sql = "select c1+1 from decimal_simple"; // add scalar
- let actual = execute_to_batches(&ctx, sql).await;
- // array decimal(10,6) + scalar decimal(20,0) => decimal(21,6)
- assert_eq!(
- &DataType::Decimal128(27, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+------------------------------+",
- "| decimal_simple.c1 + Int64(1) |",
- "+------------------------------+",
- "| 1.000010 |",
- "| 1.000020 |",
- "| 1.000020 |",
- "| 1.000030 |",
- "| 1.000030 |",
- "| 1.000030 |",
- "| 1.000040 |",
- "| 1.000040 |",
- "| 1.000040 |",
- "| 1.000040 |",
- "| 1.000050 |",
- "| 1.000050 |",
- "| 1.000050 |",
- "| 1.000050 |",
- "| 1.000050 |",
- "+------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- // array decimal(10,6) + array decimal(12,7) => decimal(13,7)
- let sql = "select c1+c5 from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(13, 7),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+---------------------------------------+",
- "| decimal_simple.c1 + decimal_simple.c5 |",
- "+---------------------------------------+",
- "| 0.0000240 |",
- "| 0.0000450 |",
- "| 0.0000390 |",
- "| 0.0000620 |",
- "| 0.0000650 |",
- "| 0.0000410 |",
- "| 0.0000840 |",
- "| 0.0000800 |",
- "| 0.0000800 |",
- "| 0.0000840 |",
- "| 0.0001020 |",
- "| 0.0001280 |",
- "| 0.0000830 |",
- "| 0.0001180 |",
- "| 0.0001500 |",
- "+---------------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- // subtract
- let sql = "select c1-1 from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(27, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+------------------------------+",
- "| decimal_simple.c1 - Int64(1) |",
- "+------------------------------+",
- "| -0.999990 |",
- "| -0.999980 |",
- "| -0.999980 |",
- "| -0.999970 |",
- "| -0.999970 |",
- "| -0.999970 |",
- "| -0.999960 |",
- "| -0.999960 |",
- "| -0.999960 |",
- "| -0.999960 |",
- "| -0.999950 |",
- "| -0.999950 |",
- "| -0.999950 |",
- "| -0.999950 |",
- "| -0.999950 |",
- "+------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- let sql = "select c1-c5 from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(13, 7),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+---------------------------------------+",
- "| decimal_simple.c1 - decimal_simple.c5 |",
- "+---------------------------------------+",
- "| -0.0000040 |",
- "| -0.0000050 |",
- "| 0.0000010 |",
- "| -0.0000020 |",
- "| -0.0000050 |",
- "| 0.0000190 |",
- "| -0.0000040 |",
- "| 0.0000000 |",
- "| 0.0000000 |",
- "| -0.0000040 |",
- "| -0.0000020 |",
- "| -0.0000280 |",
- "| 0.0000170 |",
- "| -0.0000180 |",
- "| -0.0000500 |",
- "+---------------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- // multiply
- let sql = "select c1*20 from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(31, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+-------------------------------+",
- "| decimal_simple.c1 * Int64(20) |",
- "+-------------------------------+",
- "| 0.000200 |",
- "| 0.000400 |",
- "| 0.000400 |",
- "| 0.000600 |",
- "| 0.000600 |",
- "| 0.000600 |",
- "| 0.000800 |",
- "| 0.000800 |",
- "| 0.000800 |",
- "| 0.000800 |",
- "| 0.001000 |",
- "| 0.001000 |",
- "| 0.001000 |",
- "| 0.001000 |",
- "| 0.001000 |",
- "+-------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- let sql = "select c1*c5 from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(23, 13),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+---------------------------------------+",
- "| decimal_simple.c1 * decimal_simple.c5 |",
- "+---------------------------------------+",
- "| 0.0000000001400 |",
- "| 0.0000000005000 |",
- "| 0.0000000003800 |",
- "| 0.0000000009600 |",
- "| 0.0000000010500 |",
- "| 0.0000000003300 |",
- "| 0.0000000017600 |",
- "| 0.0000000016000 |",
- "| 0.0000000016000 |",
- "| 0.0000000017600 |",
- "| 0.0000000026000 |",
- "| 0.0000000039000 |",
- "| 0.0000000016500 |",
- "| 0.0000000034000 |",
- "| 0.0000000050000 |",
- "+---------------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- // divide
- 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::Decimal128(21, 12),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+--------------------------------------+",
- "| decimal_simple.c1 / Float64(0.00001) |",
- "+--------------------------------------+",
- "| 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::Decimal128(30, 19),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+---------------------------------------+",
- "| decimal_simple.c1 / decimal_simple.c5 |",
- "+---------------------------------------+",
- "| 0.7142857142857142857 |",
- "| 0.8000000000000000000 |",
- "| 1.0526315789473684210 |",
- "| 0.9375000000000000000 |",
- "| 0.8571428571428571428 |",
- "| 2.7272727272727272727 |",
- "| 0.9090909090909090909 |",
- "| 1.0000000000000000000 |",
- "| 1.0000000000000000000 |",
- "| 0.9090909090909090909 |",
- "| 0.9615384615384615384 |",
- "| 0.6410256410256410256 |",
- "| 1.5151515151515151515 |",
- "| 0.7352941176470588235 |",
- "| 0.5000000000000000000 |",
- "+---------------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- // modulo
- 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::Decimal128(7, 7),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+--------------------------------------+",
- "| decimal_simple.c5 % Float64(0.00001) |",
- "+--------------------------------------+",
- "| 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::Decimal128(11, 7),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+---------------------------------------+",
- "| decimal_simple.c1 % decimal_simple.c5 |",
- "+---------------------------------------+",
- "| 0.0000100 |",
- "| 0.0000200 |",
- "| 0.0000010 |",
- "| 0.0000300 |",
- "| 0.0000300 |",
- "| 0.0000080 |",
- "| 0.0000400 |",
- "| 0.0000000 |",
- "| 0.0000000 |",
- "| 0.0000400 |",
- "| 0.0000500 |",
- "| 0.0000500 |",
- "| 0.0000170 |",
- "| 0.0000500 |",
- "| 0.0000500 |",
- "+---------------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_sort() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- let sql = "select * from decimal_simple where c1 >= 0.00004 order by c1";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+-----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+-----+-------+-----------+",
- "| 0.000040 | 0.000000000004 | 5 | true | 0.0000440 |",
- "| 0.000040 | 0.000000000004 | 12 | false | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 14 | true | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 8 | false | 0.0000440 |",
- "| 0.000050 | 0.000000000005 | 9 | true | 0.0000520 |",
- "| 0.000050 | 0.000000000005 | 4 | true | 0.0000780 |",
- "| 0.000050 | 0.000000000005 | 8 | false | 0.0000330 |",
- "| 0.000050 | 0.000000000005 | 100 | true | 0.0000680 |",
- "| 0.000050 | 0.000000000005 | 1 | false | 0.0001000 |",
- "+----------+----------------+-----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- let sql = "select * from decimal_simple where c1 >= 0.00004 order by c1
limit 10";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+-----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+-----+-------+-----------+",
- "| 0.000040 | 0.000000000004 | 5 | true | 0.0000440 |",
- "| 0.000040 | 0.000000000004 | 12 | false | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 14 | true | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 8 | false | 0.0000440 |",
- "| 0.000050 | 0.000000000005 | 9 | true | 0.0000520 |",
- "| 0.000050 | 0.000000000005 | 4 | true | 0.0000780 |",
- "| 0.000050 | 0.000000000005 | 8 | false | 0.0000330 |",
- "| 0.000050 | 0.000000000005 | 100 | true | 0.0000680 |",
- "| 0.000050 | 0.000000000005 | 1 | false | 0.0001000 |",
- "+----------+----------------+-----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- let sql = "select * from decimal_simple where c1 >= 0.00004 order by c1
limit 5";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(
- &DataType::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+----+-------+-----------+",
- "| 0.000040 | 0.000000000004 | 5 | true | 0.0000440 |",
- "| 0.000040 | 0.000000000004 | 12 | false | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 14 | true | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 8 | false | 0.0000440 |",
- "| 0.000050 | 0.000000000005 | 9 | true | 0.0000520 |",
- "+----------+----------------+----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- 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::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+-----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+-----+-------+-----------+",
- "| 0.000050 | 0.000000000005 | 9 | true | 0.0000520 |",
- "| 0.000050 | 0.000000000005 | 4 | true | 0.0000780 |",
- "| 0.000050 | 0.000000000005 | 8 | false | 0.0000330 |",
- "| 0.000050 | 0.000000000005 | 100 | true | 0.0000680 |",
- "| 0.000050 | 0.000000000005 | 1 | false | 0.0001000 |",
- "| 0.000040 | 0.000000000004 | 5 | true | 0.0000440 |",
- "| 0.000040 | 0.000000000004 | 12 | false | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 14 | true | 0.0000400 |",
- "| 0.000040 | 0.000000000004 | 8 | false | 0.0000440 |",
- "+----------+----------------+-----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- 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::Decimal128(10, 6),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+----------+----------------+----+-------+-----------+",
- "| c1 | c2 | c3 | c4 | c5 |",
- "+----------+----------------+----+-------+-----------+",
- "| 0.000020 | 0.000000000002 | 3 | false | 0.0000190 |",
- "| 0.000020 | 0.000000000002 | 2 | true | 0.0000250 |",
- "| 0.000010 | 0.000000000001 | 1 | true | 0.0000140 |",
- "+----------+----------------+----+-------+-----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_group_function() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- 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::Decimal128(10, 6),
- actual[0].schema().field(1).data_type()
- );
- let expected = vec![
- "+-----------------+----------+",
- "| COUNT(UInt8(1)) | c1 |",
- "+-----------------+----------+",
- "| 1 | 0.000010 |",
- "| 2 | 0.000020 |",
- "| 3 | 0.000030 |",
- "| 4 | 0.000040 |",
- "| 5 | 0.000050 |",
- "+-----------------+----------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- 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::Decimal128(10, 6),
- actual[0].schema().field(1).data_type()
- );
- let expected = vec![
- "+-----------------+----------+-------+",
- "| COUNT(UInt8(1)) | c1 | c4 |",
- "+-----------------+----------+-------+",
- "| 1 | 0.000010 | true |",
- "| 1 | 0.000020 | false |",
- "| 1 | 0.000020 | true |",
- "| 1 | 0.000030 | false |",
- "| 2 | 0.000030 | true |",
- "| 2 | 0.000040 | false |",
- "| 2 | 0.000040 | true |",
- "| 2 | 0.000050 | false |",
- "| 3 | 0.000050 | true |",
- "+-----------------+----------+-------+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
-
-#[tokio::test]
-async fn sql_abs_decimal() -> Result<()> {
- let ctx = SessionContext::new();
- register_decimal_csv_table_by_sql(&ctx).await;
- let sql = "SELECT abs(c1) from decimal_simple";
- let actual = execute_to_batches(&ctx, sql).await;
- let expected = vec![
- "+------------------------+",
- "| abs(decimal_simple.c1) |",
- "+------------------------+",
- "| 0.00001 |",
- "| 0.00002 |",
- "| 0.00002 |",
- "| 0.00003 |",
- "| 0.00003 |",
- "| 0.00003 |",
- "| 0.00004 |",
- "| 0.00004 |",
- "| 0.00004 |",
- "| 0.00004 |",
- "| 0.00005 |",
- "| 0.00005 |",
- "| 0.00005 |",
- "| 0.00005 |",
- "| 0.00005 |",
- "+------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_null_scalar_array_comparison() -> Result<()> {
- let ctx = SessionContext::new();
- let sql = "select a < null from (values (1.1::decimal)) as t(a)";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(1, actual.len());
- assert_eq!(1, actual[0].num_columns());
- assert_eq!(1, actual[0].num_rows());
- assert!(actual[0].column(0).is_null(0));
- assert_eq!(&DataType::Boolean, actual[0].column(0).data_type());
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_null_array_scalar_comparison() -> Result<()> {
- let ctx = SessionContext::new();
- let sql = "select null <= a from (values (1.1::decimal)) as t(a);";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(1, actual.len());
- assert_eq!(1, actual[0].num_columns());
- assert_eq!(1, actual[0].num_rows());
- assert!(actual[0].column(0).is_null(0));
- assert_eq!(&DataType::Boolean, actual[0].column(0).data_type());
- Ok(())
-}
-
-#[tokio::test]
-async fn decimal_multiply_float() -> Result<()> {
- let ctx = SessionContext::new();
- let sql = "select cast(400420638.54 as decimal(12,2));";
- let actual = execute_to_batches(&ctx, sql).await;
-
- assert_eq!(
- &DataType::Decimal128(12, 2),
- actual[0].schema().field(0).data_type()
- );
- let expected = vec![
- "+-----------------------+",
- "| Float64(400420638.54) |",
- "+-----------------------+",
- "| 400420638.54 |",
- "+-----------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- let sql = "select cast(400420638.54 as decimal(12,2)) * 1.0;";
- let actual = execute_to_batches(&ctx, sql).await;
- assert_eq!(&DataType::Float64, actual[0].schema().field(0).data_type());
- let expected = vec![
- "+------------------------------------+",
- "| Float64(400420638.54) * Float64(1) |",
- "+------------------------------------+",
- "| 400420638.54 |",
- "+------------------------------------+",
- ];
- assert_batches_eq!(expected, &actual);
-
- Ok(())
-}
diff --git a/datafusion/core/tests/sql/mod.rs b/datafusion/core/tests/sql/mod.rs
index 516bd8c24..e2a1199d5 100644
--- a/datafusion/core/tests/sql/mod.rs
+++ b/datafusion/core/tests/sql/mod.rs
@@ -104,7 +104,6 @@ pub mod union;
pub mod wildcard;
pub mod window;
-pub mod decimal;
pub mod explain;
pub mod idenfifers;
pub mod information_schema;
@@ -1195,30 +1194,6 @@ fn result_vec(results: &[RecordBatch]) ->
Vec<Vec<String>> {
result
}
-async fn register_decimal_csv_table_by_sql(ctx: &SessionContext) {
- let df = ctx
- .sql(
- "CREATE EXTERNAL TABLE decimal_simple (
- c1 DECIMAL(10,6) NOT NULL,
- c2 DOUBLE NOT NULL,
- c3 BIGINT NOT NULL,
- c4 BOOLEAN NOT NULL,
- c5 DECIMAL(12,7) NOT NULL
- )
- STORED AS CSV
- WITH HEADER ROW
- LOCATION 'tests/data/decimal_data.csv'",
- )
- .await
- .expect("Creating dataframe for CREATE EXTERNAL TABLE with decimal
data type");
-
- let results = df.collect().await.expect("Executing CREATE EXTERNAL TABLE");
- assert!(
- results.is_empty(),
- "Expected no rows from executing CREATE EXTERNAL TABLE"
- );
-}
-
async fn register_alltypes_parquet(ctx: &SessionContext) {
let testdata = datafusion::test_util::parquet_test_data();
ctx.register_parquet(
diff --git a/datafusion/core/tests/sqllogictests/test_files/decimal.slt
b/datafusion/core/tests/sqllogictests/test_files/decimal.slt
new file mode 100644
index 000000000..7b9eee872
--- /dev/null
+++ b/datafusion/core/tests/sqllogictests/test_files/decimal.slt
@@ -0,0 +1,594 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+query ?R
+select arrow_typeof(cast(1.23 as decimal(10,4))),
+ cast(1.23 as decimal(10,4));
+----
+Decimal128(10, 4) 1.23
+
+
+query ?R
+select arrow_typeof(cast(cast(1.23 as decimal(10,3)) as decimal(10,4))),
+ cast(cast(1.23 as decimal(10,3)) as decimal(10,4));
+----
+Decimal128(10, 4) 1.23
+
+
+query ?R
+select arrow_typeof(cast(1.2345 as decimal(24,2))), cast(1.2345 as
decimal(24,2));
+----
+Decimal128(24, 2) 1.23
+
+
+query ok
+CREATE EXTERNAL TABLE decimal_simple (
+c1 DECIMAL(10,6) NOT NULL,
+c2 DOUBLE NOT NULL,
+c3 BIGINT NOT NULL,
+c4 BOOLEAN NOT NULL,
+c5 DECIMAL(12,7) NOT NULL
+)
+STORED AS CSV
+WITH HEADER ROW
+LOCATION 'tests/data/decimal_data.csv';
+
+
+query ??
+select arrow_typeof(c1), arrow_typeof(c5) from decimal_simple where c1 > c5
limit 1;
+----
+Decimal128(10, 6) Decimal128(12, 7)
+
+
+query R
+SELECT c1 from decimal_simple;
+----
+0.00001
+0.00002
+0.00002
+0.00003
+0.00003
+0.00003
+0.00004
+0.00004
+0.00004
+0.00004
+0.00005
+0.00005
+0.00005
+0.00005
+0.00005
+
+
+query R
+select c1 from decimal_simple where c1 > 0.000030;
+----
+0.00004
+0.00004
+0.00004
+0.00004
+0.00005
+0.00005
+0.00005
+0.00005
+0.00005
+
+
+query RRI?R
+select * from decimal_simple where c1 > c5;
+----
+0.00002 0.000000000002 3 false 0.000019
+0.00003 0.000000000003 5 true 0.000011
+0.00005 0.000000000005 8 false 0.000033
+
+
+query ?R
+select arrow_typeof(min(c1)), min(c1) from decimal_simple where c4=false;
+----
+Decimal128(10, 6) 0.00002
+
+
+query ?R
+select arrow_typeof(max(c1)), max(c1) from decimal_simple where c4=false;
+----
+Decimal128(10, 6) 0.00005
+
+
+# inferred precision is 10+10
+# inferred scale is the original scale
+query R
+select arrow_typeof(sum(c1)), sum(c1) from decimal_simple;
+----
+Decimal128(20, 6) 0.00055
+
+
+# inferred precision is original precision + 4
+# inferred scale is the original scale + 4
+query ?R
+select arrow_typeof(avg(c1)), avg(c1) from decimal_simple;
+----
+Decimal128(14, 10) 0.0000366666
+
+
+query RRI?R
+select * from decimal_simple where c1=CAST(0.00002 as Decimal(10,8));
+----
+0.00002 0.000000000002 2 true 0.000025
+0.00002 0.000000000002 3 false 0.000019
+
+
+query RI
+select c2,c3 from decimal_simple where c1!=0.00002;
+----
+0.000000000001 1
+0.000000000003 4
+0.000000000003 5
+0.000000000003 5
+0.000000000004 5
+0.000000000004 12
+0.000000000004 14
+0.000000000004 8
+0.000000000005 9
+0.000000000005 4
+0.000000000005 8
+0.000000000005 100
+0.000000000005 1
+
+
+query RRI?R
+select * from decimal_simple where 0.00002 > c1;
+----
+0.00001 0.000000000001 1 true 0.000014
+
+
+query RRI?R
+select * from decimal_simple where c1 <= 0.00002;
+----
+0.00001 0.000000000001 1 true 0.000014
+0.00002 0.000000000002 2 true 0.000025
+0.00002 0.000000000002 3 false 0.000019
+
+
+query RRI?R
+select * from decimal_simple where c1 > 0.00002;
+----
+0.00003 0.000000000003 4 true 0.000032
+0.00003 0.000000000003 5 false 0.000035
+0.00003 0.000000000003 5 true 0.000011
+0.00004 0.000000000004 5 true 0.000044
+0.00004 0.000000000004 12 false 0.00004
+0.00004 0.000000000004 14 true 0.00004
+0.00004 0.000000000004 8 false 0.000044
+0.00005 0.000000000005 9 true 0.000052
+0.00005 0.000000000005 4 true 0.000078
+0.00005 0.000000000005 8 false 0.000033
+0.00005 0.000000000005 100 true 0.000068
+0.00005 0.000000000005 1 false 0.0001
+
+
+query RRI?R
+select * from decimal_simple where c1 >= 0.00002;
+----
+0.00002 0.000000000002 2 true 0.000025
+0.00002 0.000000000002 3 false 0.000019
+0.00003 0.000000000003 4 true 0.000032
+0.00003 0.000000000003 5 false 0.000035
+0.00003 0.000000000003 5 true 0.000011
+0.00004 0.000000000004 5 true 0.000044
+0.00004 0.000000000004 12 false 0.00004
+0.00004 0.000000000004 14 true 0.00004
+0.00004 0.000000000004 8 false 0.000044
+0.00005 0.000000000005 9 true 0.000052
+0.00005 0.000000000005 4 true 0.000078
+0.00005 0.000000000005 8 false 0.000033
+0.00005 0.000000000005 100 true 0.000068
+0.00005 0.000000000005 1 false 0.0001
+
+
+query ?
+select arrow_typeof(c1+1) from decimal_simple limit 1;
+----
+Decimal128(27, 6)
+
+
+query R
+select c1+1 from decimal_simple;
+----
+1.00001
+1.00002
+1.00002
+1.00003
+1.00003
+1.00003
+1.00004
+1.00004
+1.00004
+1.00004
+1.00005
+1.00005
+1.00005
+1.00005
+1.00005
+
+
+# array decimal(10,6) + array decimal(12,7) => decimal(13,7)
+query ?
+select arrow_typeof(c1+c5) from decimal_simple limit 1;
+----
+Decimal128(13, 7)
+
+
+query R
+select c1+c5 from decimal_simple;
+----
+0.000024
+0.000045
+0.000039
+0.000062
+0.000065
+0.000041
+0.000084
+0.00008
+0.00008
+0.000084
+0.000102
+0.000128
+0.000083
+0.000118
+0.00015
+
+
+query ?
+select arrow_typeof(c1-1) from decimal_simple limit 1;
+----
+Decimal128(27, 6)
+
+
+query R
+select c1-1 from decimal_simple;
+----
+-0.99999
+-0.99998
+-0.99998
+-0.99997
+-0.99997
+-0.99997
+-0.99996
+-0.99996
+-0.99996
+-0.99996
+-0.99995
+-0.99995
+-0.99995
+-0.99995
+-0.99995
+
+
+query ?
+select arrow_typeof(c1-c5) from decimal_simple limit 1;
+----
+Decimal128(13, 7)
+
+
+query R
+select c1-c5 from decimal_simple;
+----
+-0.000004
+-0.000005
+0.000001
+-0.000002
+-0.000005
+0.000019
+-0.000004
+0
+0
+-0.000004
+-0.000002
+-0.000028
+0.000017
+-0.000018
+-0.00005
+
+
+query ?
+select arrow_typeof(c1*20) from decimal_simple limit 1;
+----
+Decimal128(31, 6)
+
+
+query R
+select c1*20 from decimal_simple;
+----
+0.0002
+0.0004
+0.0004
+0.0006
+0.0006
+0.0006
+0.0008
+0.0008
+0.0008
+0.0008
+0.001
+0.001
+0.001
+0.001
+0.001
+
+
+query ?
+select arrow_typeof(c1*c5) from decimal_simple limit 1;
+----
+Decimal128(23, 13)
+
+
+query R
+select c1*c5 from decimal_simple;
+----
+0.00000000014
+0.0000000005
+0.00000000038
+0.00000000096
+0.00000000105
+0.00000000033
+0.00000000176
+0.0000000016
+0.0000000016
+0.00000000176
+0.0000000026
+0.0000000039
+0.00000000165
+0.0000000034
+0.000000005
+
+
+query ?
+select arrow_typeof(c1/cast(0.00001 as decimal(5,5))) from decimal_simple
limit 1;
+----
+Decimal128(21, 12)
+
+
+query R
+select c1/cast(0.00001 as decimal(5,5)) from decimal_simple;
+----
+1
+2
+2
+3
+3
+3
+4
+4
+4
+4
+5
+5
+5
+5
+5
+
+
+query ?
+select arrow_typeof(c1/c5) from decimal_simple limit 1;
+----
+Decimal128(30, 19)
+
+
+query R
+select c1/c5 from decimal_simple;
+----
+0.714285714286
+0.8
+1.052631578947
+0.9375
+0.857142857143
+2.727272727273
+0.909090909091
+1
+1
+0.909090909091
+0.961538461538
+0.641025641026
+1.515151515152
+0.735294117647
+0.5
+
+
+query ?
+select arrow_typeof(c5%cast(0.00001 as decimal(5,5))) from decimal_simple
limit 1;
+----
+Decimal128(7, 7)
+
+
+query R
+select c5%cast(0.00001 as decimal(5,5)) from decimal_simple;
+----
+0.000004
+0.000005
+0.000009
+0.000002
+0.000005
+0.000001
+0.000004
+0
+0
+0.000004
+0.000002
+0.000008
+0.000003
+0.000008
+0
+
+
+query ?
+select arrow_typeof(c1%c5) from decimal_simple limit 1;
+----
+Decimal128(11, 7)
+
+
+query R
+select c1%c5 from decimal_simple;
+----
+0.00001
+0.00002
+0.000001
+0.00003
+0.00003
+0.000008
+0.00004
+0
+0
+0.00004
+0.00005
+0.00005
+0.000017
+0.00005
+0.00005
+
+
+query ?
+select arrow_typeof(abs(c1)) from decimal_simple limit 1;
+----
+Float64
+
+
+query R
+SELECT abs(c1) from decimal_simple;
+----
+0.00001
+0.00002
+0.00002
+0.00003
+0.00003
+0.00003
+0.00004
+0.00004
+0.00004
+0.00004
+0.00005
+0.00005
+0.00005
+0.00005
+0.00005
+
+
+query RRI?R
+select * from decimal_simple where c1 >= 0.00004 order by c1;
+----
+0.00004 0.000000000004 5 true 0.000044
+0.00004 0.000000000004 12 false 0.00004
+0.00004 0.000000000004 14 true 0.00004
+0.00004 0.000000000004 8 false 0.000044
+0.00005 0.000000000005 9 true 0.000052
+0.00005 0.000000000005 4 true 0.000078
+0.00005 0.000000000005 8 false 0.000033
+0.00005 0.000000000005 100 true 0.000068
+0.00005 0.000000000005 1 false 0.0001
+
+
+query RRI?R
+select * from decimal_simple where c1 >= 0.00004 order by c1 limit 10;
+----
+0.00004 0.000000000004 5 true 0.000044
+0.00004 0.000000000004 12 false 0.00004
+0.00004 0.000000000004 14 true 0.00004
+0.00004 0.000000000004 8 false 0.000044
+0.00005 0.000000000005 9 true 0.000052
+0.00005 0.000000000005 4 true 0.000078
+0.00005 0.000000000005 8 false 0.000033
+0.00005 0.000000000005 100 true 0.000068
+0.00005 0.000000000005 1 false 0.0001
+
+
+query RRI?R
+select * from decimal_simple where c1 >= 0.00004 order by c1 limit 5;
+----
+0.00004 0.000000000004 5 true 0.000044
+0.00004 0.000000000004 12 false 0.00004
+0.00004 0.000000000004 14 true 0.00004
+0.00004 0.000000000004 8 false 0.000044
+0.00005 0.000000000005 9 true 0.000052
+
+
+query RRI?R
+select * from decimal_simple where c1 >= 0.00004 order by c1 desc;
+----
+0.00005 0.000000000005 9 true 0.000052
+0.00005 0.000000000005 4 true 0.000078
+0.00005 0.000000000005 8 false 0.000033
+0.00005 0.000000000005 100 true 0.000068
+0.00005 0.000000000005 1 false 0.0001
+0.00004 0.000000000004 5 true 0.000044
+0.00004 0.000000000004 12 false 0.00004
+0.00004 0.000000000004 14 true 0.00004
+0.00004 0.000000000004 8 false 0.000044
+
+
+query RRI?R
+select * from decimal_simple where c1 < 0.00003 order by c1 desc,c4;
+----
+0.00002 0.000000000002 3 false 0.000019
+0.00002 0.000000000002 2 true 0.000025
+0.00001 0.000000000001 1 true 0.000014
+
+
+query IR
+select count(*),c1 from decimal_simple group by c1 order by c1;
+----
+1 0.00001
+2 0.00002
+3 0.00003
+4 0.00004
+5 0.00005
+
+
+query IR?
+select count(*),c1,c4 from decimal_simple group by c1,c4 order by c1,c4;
+----
+1 0.00001 true
+1 0.00002 false
+1 0.00002 true
+1 0.00003 false
+2 0.00003 true
+2 0.00004 false
+2 0.00004 true
+2 0.00005 false
+3 0.00005 true
+
+
+query R
+select arrow_typeof(cast(400420638.54 as decimal(12,2))), cast(400420638.54 as
decimal(12,2));
+----
+Decimal128(12, 2) 400420638.54
+
+
+query R
+select arrow_typeof(cast(400420638.54 as decimal(12,2)) * 1.0),
cast(400420638.54 as decimal(12,2)) * 1.0;
+----
+Float64 400420638.54
+
+
+query ??
+select arrow_typeof(a < null), a < null from (values (1.1::decimal)) as t(a);
+----
+Boolean NULL
+
+
+query ??
+select arrow_typeof(null <= a), null <= a from (values (1.1::decimal)) as t(a);
+----
+Boolean NULL