This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 0436013baf3 [fix](decimal) fix cast decimal overflow and add test
cases for casting decimalv2 to decimalv3 (#29165)
0436013baf3 is described below
commit 0436013baf3620a8a5842afa01d9da45e0a988f1
Author: TengJianPing <[email protected]>
AuthorDate: Wed Dec 27 20:58:37 2023 +0800
[fix](decimal) fix cast decimal overflow and add test cases for casting
decimalv2 to decimalv3 (#29165)
---
be/src/vec/functions/function_cast.h | 4 +-
.../datatype_p0/decimalv3/test_decimalv2_v3.out | 302 +++++
.../datatype_p0/decimalv3/test_decimalv3_cast.out | 8 +-
.../datatype_p0/decimalv3/test_decimalv2_v3.groovy | 1227 ++++++++++++++++++++
.../decimalv3/test_decimalv3_cast.groovy | 37 +
5 files changed, 1573 insertions(+), 5 deletions(-)
diff --git a/be/src/vec/functions/function_cast.h
b/be/src/vec/functions/function_cast.h
index 2e1e48db14d..474851e80d1 100644
--- a/be/src/vec/functions/function_cast.h
+++ b/be/src/vec/functions/function_cast.h
@@ -322,8 +322,10 @@ struct ConvertImpl {
vec_to.resize(size);
if constexpr (IsDataTypeDecimal<FromDataType> ||
IsDataTypeDecimal<ToDataType>) {
+ // the result is rounded when doing cast, so it may still
overflow after rounding
+ // if destination integer digit count is the same as source
integer digit count.
bool narrow_integral = context->check_overflow_for_decimal() &&
- (to_precision - to_scale) <
(from_precision - from_scale);
+ (to_precision - to_scale) <=
(from_precision - from_scale);
bool multiply_may_overflow =
context->check_overflow_for_decimal();
if (to_scale > from_scale) {
diff --git a/regression-test/data/datatype_p0/decimalv3/test_decimalv2_v3.out
b/regression-test/data/datatype_p0/decimalv3/test_decimalv2_v3.out
new file mode 100644
index 00000000000..b42b05d3e1d
--- /dev/null
+++ b/regression-test/data/datatype_p0/decimalv3/test_decimalv2_v3.out
@@ -0,0 +1,302 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !cast_v2_to_v3_1 --
+1234.5670
+
+-- !cast_v2_to_v3_2 --
+1234.5670
+
+-- !cast_v2_to_v3_3 --
+1234.5670
+
+-- !cast_v2_to_v3_4 --
+1234.5670
+
+-- !cast32_select_all --
+99999.9999
+
+-- !cast32_wider_scale_1 --
+99999.99990
+
+-- !cast32_wider_scale_2 --
+99999.99990
+
+-- !cast32_wider_scale_3 --
+99999.99990
+
+-- !cast32_wider_scale_4 --
+99999.99990
+
+-- !cast32_select_all2 --
+9999.9999
+
+-- !cast32_wider_scale_5 --
+9999.99990
+
+-- !cast32_select_all3 --
+10000.0001
+
+-- !cast32_same_scale_1 --
+99999.9999
+
+-- !cast32_same_scale_2 --
+99999.9999
+
+-- !cast32_same_scale_3 --
+99999.9999
+
+-- !cast32_same_scale_4 --
+99999.9999
+
+-- !cast32_same_scale_5 --
+99999.9999
+
+-- !cast32_same_scale_6 --
+9999.9999
+
+-- !cast32_narrow_scale_1 --
+10000.000
+
+-- !cast32_narrow_scale_2 --
+10000.000
+
+-- !cast32_narrow_scale_3 --
+10000.000
+
+-- !cast32_narrow_scale_4 --
+10000.000
+
+-- !cast32_narrow_scale_5 --
+10000.000
+
+-- !cast32_narrow_scale_6 --
+9999.999
+
+-- !cast32_negative_wider_scale_1 --
+-99999.99990
+
+-- !cast32_negative_wider_scale_2 --
+-99999.99990
+
+-- !cast32_negative_wider_scale_3 --
+-99999.99990
+
+-- !cast32_negative_wider_scale_4 --
+-99999.99990
+
+-- !cast32_negative_wider_scale_5 --
+-9999.99990
+
+-- !cast32_2_wider_scale_1 --
+99.99990
+
+-- !cast32_2_wider_scale_2 --
+99.99990
+
+-- !cast32_2_wider_scale_2 --
+99.99990
+
+-- !cast32_2_wider_scale_3 --
+99.99990
+
+-- !cast32_wider_scale_4 --
+99.99990
+
+-- !cast32_wider_scale_5 --
+9.99990
+
+-- !cast32_2_same_scale_1 --
+99.9999
+
+-- !cast32_2_same_scale_2 --
+99.9999
+
+-- !cast32_2_same_scale_3 --
+99.9999
+
+-- !cast32_2_same_scale_4 --
+99.9999
+
+-- !cast32_2_same_scale_5 --
+99.9999
+
+-- !cast32_2_same_scale_6 --
+9.9999
+
+-- !cast32_2_narrow_scale_1 --
+100.000
+
+-- !cast32_2_narrow_scale_2 --
+100.000
+
+-- !cast32_2_narrow_scale_3 --
+100.000
+
+-- !cast32_2_narrow_scale_4 --
+100.000
+
+-- !cast32_2_narrow_scale_6 --
+9.999
+
+-- !cast32_3_to_much_bigger_scale_1 --
+999999999.000000000
+
+-- !cast32_3_to_much_bigger_scale_2 --
+999999999.0000000000
+
+-- !cast32_3_to_much_bigger_scale_3 --
+999999999.00000000000000000000000000000
+
+-- !cast32_3_to_much_bigger_scale_4 --
+999999999.0000000000000000000000000000000000000000000000000000000000000000000
+
+-- !cast64_select_all --
+999999999999.999999
+
+-- !cast64_wider_scale_1 --
+999999999999.9999990
+
+-- !cast64_wider_scale_2 --
+999999999999.9999990
+
+-- !cast64_wider_scale_3 --
+999999999999.9999990
+
+-- !cast64_wider_scale_4 --
+999999999999.9999990
+
+-- !cast64_wider_scale_5 --
+99999999999.9999990
+
+-- !cast64_wider_scale_6 --
+99.9999990
+
+-- !cast64_wider_scale_7 --
+9.9999990
+
+-- !cast64_wider_scale_8 --
+9.9999990
+
+-- !cast64_same_scale_1 --
+999999999999.999999
+
+-- !cast64_same_scale_2 --
+999999999999.999999
+
+-- !cast64_same_scale_3 --
+999999999999.999999
+
+-- !cast64_same_scale_4 --
+999999999999.999999
+
+-- !cast64_same_scale_5 --
+99999999999.999999
+
+-- !cast64_same_scale_6 --
+999.999999
+
+-- !cast64_same_scale_7 --
+99.999999
+
+-- !cast64_same_scale_8 --
+99.999999
+
+-- !cast64_narrow_scale_1 --
+1000000000000.00000
+
+-- !cast64_narrow_scale_2 --
+1000000000000.00000
+
+-- !cast64_narrow_scale_3 --
+1000000000000.00000
+
+-- !cast64_narrow_scale_5 --
+99999999999.99999
+
+-- !cast64_narrow_scale_6 --
+9999.99999
+
+-- !cast64_narrow_scale_7 --
+1000.00000
+
+-- !cast64_narrow_scale_8 --
+999.99999
+
+-- !cast64_narrow_scale_9 --
+999.99999
+
+-- !cast128_wider_scale_1 --
+-999999999999999999.9999999990
+999999999999999999.9999999990
+
+-- !cast128_wider_scale_2 --
+-999999999999999999.9999999990
+999999999999999999.9999999990
+
+-- !cast128_wider_scale_3 --
+-999999999999999999.9999999990
+999999999999999999.9999999990
+
+-- !cast128_wider_scale_4 --
+-999999999999999999.9999999990
+999999999999999999.9999999990
+
+-- !cast128_wider_scale_5 --
+-999999999999999999.9999999990
+999999999999999999.9999999990
+
+-- !cast128_wider_scale_6 --
+-99999999999999999.9999999990
+99999999999999999.9999999990
+
+-- !cast128_wider_scale_7 --
+-99999999.9999999990
+99999999.9999999990
+
+-- !cast128_same_scale_1 --
+-999999999999999999.999999999
+999999999999999999.999999999
+
+-- !cast128_same_scale_2 --
+-999999999999999999.999999999
+999999999999999999.999999999
+
+-- !cast128_same_scale_3 --
+-999999999999999999.999999999
+999999999999999999.999999999
+
+-- !cast128_same_scale_4 --
+-999999999999999999.999999999
+999999999999999999.999999999
+
+-- !cast128_same_scale_5 --
+-99999999999999999.999999999
+99999999999999999.999999999
+
+-- !cast128_same_scale_6 --
+-999999999.999999999
+999999999.999999999
+
+-- !cast128_same_scale_7 --
+-999999999.999999999
+999999999.999999999
+
+-- !cast128_narrow_scale_1 --
+-1000000000000000000.00000000
+1000000000000000000.00000000
+
+-- !cast128_narrow_scale_2 --
+-1000000000000000000.00000000
+1000000000000000000.00000000
+
+-- !cast128_narrow_scale_3 --
+-1000000000000000000.00000000
+1000000000000000000.00000000
+
+-- !cast128_narrow_scale_4 --
+-999999999999999999.99999999
+999999999999999999.99999999
+
+-- !cast128_narrow_scale_5 --
+-99999999999999999.99999999
+99999999999999999.99999999
+
diff --git a/regression-test/data/datatype_p0/decimalv3/test_decimalv3_cast.out
b/regression-test/data/datatype_p0/decimalv3/test_decimalv3_cast.out
index 68bc757d5c3..5bec55ddf66 100644
--- a/regression-test/data/datatype_p0/decimalv3/test_decimalv3_cast.out
+++ b/regression-test/data/datatype_p0/decimalv3/test_decimalv3_cast.out
@@ -138,7 +138,7 @@
100.000
-- !cast32_2_narrow_scale_5 --
-100.000
+99.999
-- !cast32_2_narrow_scale_6 --
9.999
@@ -216,7 +216,7 @@
1000000000000.00000
-- !cast64_narrow_scale_4 --
-1000000000000.00000
+999999999999.99999
-- !cast64_narrow_scale_5 --
99999999999.99999
@@ -314,8 +314,8 @@
100000000000000000000000000000000.00000
-- !cast128_narrow_scale_3 --
--100000000000000000000000000000000.00000
-100000000000000000000000000000000.00000
+-99999999999999999999999999999999.99999
+99999999999999999999999999999999.99999
-- !cast128_narrow_scale_4 --
-9999999999999999999999999999999.99999
diff --git
a/regression-test/suites/datatype_p0/decimalv3/test_decimalv2_v3.groovy
b/regression-test/suites/datatype_p0/decimalv3/test_decimalv2_v3.groovy
new file mode 100644
index 00000000000..b44d04a9c38
--- /dev/null
+++ b/regression-test/suites/datatype_p0/decimalv3/test_decimalv2_v3.groovy
@@ -0,0 +1,1227 @@
+// 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.
+
+suite("test_decimalv2_v3", "nonConcurrent") {
+ sql """
+ admin set frontend config("enable_decimal_conversion" = "false");
+ """
+
+ // test cast decimalv2 to decimal32
+ def prepare_test_decimalv2_v3_1 = {
+ sql " drop table if exists test_decimalv2_v3_1; "
+ sql """
+ create table test_decimalv2_v3_1 (
+ k1 decimalv2(7, 3)
+ ) distributed by hash(k1)
+ properties (
+ "replication_num" = "1"
+ );
+ """
+ }
+
+ prepare_test_decimalv2_v3_1 ()
+ sql """
+ insert into test_decimalv2_v3_1 values (1234.567);
+ """
+
+ // old type 4.3
+ //////////////////////////////////////////
+ // cast to wider scale: x.4
+ //////////////////////////////////////////
+
+ //======= wider integral: 5.4
+ qt_cast_v2_to_v3_1 """
+ select cast(k1 as decimalv3(9,4)) from test_decimalv2_v3_1 order by 1;
+ """
+ qt_cast_v2_to_v3_2 """
+ select cast(k1 as decimalv3(18,4)) from test_decimalv2_v3_1 order by 1;
+ """
+ qt_cast_v2_to_v3_3 """
+ select cast(k1 as decimalv3(38,4)) from test_decimalv2_v3_1 order by 1;
+ """
+
+ //======= same integral: 4.4
+ qt_cast_v2_to_v3_4 """
+ select cast(k1 as decimalv3(8,4)) from test_decimalv2_v3_1 order by 1;
+ """
+
+ //======= narrow integral: 3.4
+ test {
+ // test multiply result overflow
+ sql """
+ select cast(k1 as decimalv3(7,4)) from test_decimalv2_v3_1 order by 1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ sql "drop table test_decimalv2_v3_1; "
+
+ // 5.4
+ // cast decimalv2 who's precision is within decimal32
+ def prepare_test_decimalv2_v3_decimal32_cast1 = {
+ sql "drop table if exists test_decimalv2_v3_decimal32_cast1;"
+ sql """
+ CREATE TABLE test_decimalv2_v3_decimal32_cast1(
+ k1 decimalv2(9, 4)
+ )
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 4
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+ }
+ prepare_test_decimalv2_v3_decimal32_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (99999.9999);
+ """
+ qt_cast32_select_all """
+ select * from test_decimalv2_v3_decimal32_cast1 order by 1;
+ """
+
+ // old type: 5.4
+ //////////////////////////////////////////
+ // cast to wider scale: x.5
+ //////////////////////////////////////////
+
+ //======= wider integral: 6.5
+ qt_cast32_wider_scale_1 """
+ select cast(k1 as decimalv3(11, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ qt_cast32_wider_scale_2 """
+ select cast(k1 as decimalv3(38, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_wider_scale_3 """
+ select cast(k1 as decimalv3(76, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 5.4
+ //======= same integral: 5.5
+ qt_cast32_wider_scale_4 """
+ select cast(k1 as decimalv3(10, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+
+ //======= narrow integral: 4.5
+ test {
+ // test multiply result overflow
+ sql """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ // test multiply result not overflow
+ prepare_test_decimalv2_v3_decimal32_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (9999.9999);
+ """
+ qt_cast32_select_all2 """
+ select * from test_decimalv2_v3_decimal32_cast1 order by 1;
+ """
+ qt_cast32_wider_scale_5 """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+
+ // old type: 5.4
+ // test multiply result not overflow, but cast result overflow
+ prepare_test_decimalv2_v3_decimal32_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (10000.0001);
+ """
+ qt_cast32_select_all3 """
+ select * from test_decimalv2_v3_decimal32_cast1 order by 1;
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ prepare_test_decimalv2_v3_decimal32_cast1();
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (99999.9999);
+ """
+
+ // old type: 5.4
+ //////////////////////////////////////////
+ // cast to same scale: x.4
+ //////////////////////////////////////////
+
+ //======= wider integral: 6.4
+ qt_cast32_same_scale_1 """
+ select cast(k1 as decimalv3(10, 4)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ qt_cast32_same_scale_2 """
+ select cast(k1 as decimalv3(18, 4)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ qt_cast32_same_scale_3 """
+ select cast(k1 as decimalv3(38, 4)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_same_scale_4 """
+ select cast(k1 as decimalv3(76, 4)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=false;"
+
+ //======= same integral: 5.4
+ qt_cast32_same_scale_5 """
+ select cast(k1 as decimalv3(9, 4)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+
+ // old type: 5.4
+ // cast to same scale: x.4
+ //======= narrow integral: 4.4
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 4)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // not overflow
+ prepare_test_decimalv2_v3_decimal32_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (9999.9999);
+ """
+ qt_cast32_same_scale_6 """
+ select cast(k1 as decimalv3(8, 4)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+
+ // old type: 5.4
+ //////////////////////////////////////////
+ // cast to narrow scale: x.3
+ //////////////////////////////////////////
+
+ //======= wider integral: 6.3
+ qt_cast32_narrow_scale_1 """
+ select cast(k1 as decimalv3(9, 3)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ qt_cast32_narrow_scale_2 """
+ select cast(k1 as decimalv3(18, 3)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ qt_cast32_narrow_scale_3 """
+ select cast(k1 as decimalv3(38, 3)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_narrow_scale_4 """
+ select cast(k1 as decimalv3(76, 3)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 5.4
+ // cast to narrow scale: x.3
+ //======= same integral: 5.3
+ qt_cast32_narrow_scale_5 """
+ select cast(k1 as decimalv3(8, 3)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+
+ // old type: 5.4
+ // cast to narrow scale: x.3
+ //======= narrow integral: 4.3
+ // integral overflow: overflow after round
+ test {
+ sql """
+ select cast(k1 as decimalv3(7, 3)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // integral not overflow
+ prepare_test_decimalv2_v3_decimal32_cast1();
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (9999.9989);
+ """
+ qt_cast32_narrow_scale_6 """
+ select cast(k1 as decimalv3(7, 3)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "drop table test_decimalv2_v3_decimal32_cast1; "
+
+
+ // cast negative decimal32
+ prepare_test_decimalv2_v3_decimal32_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (-99999.9999);
+ """
+ // old type: 5.4
+ //////////////////////////////////////////
+ // cast to wider scale: x.5
+ //////////////////////////////////////////
+ //======= wider integral: 6.5
+ qt_cast32_negative_wider_scale_1 """
+ select cast(k1 as decimalv3(11, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ qt_cast32_negative_wider_scale_2 """
+ select cast(k1 as decimalv3(38, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_negative_wider_scale_3 """
+ select cast(k1 as decimalv3(76, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ sql "set enable_decimal256=false;"
+
+ //======= same integral: 5.5
+ qt_cast32_negative_wider_scale_4 """
+ select cast(k1 as decimalv3(10, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+
+ //======= narrow integral: 4.5
+ test {
+ // test multiply result overflow
+ sql """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ // test multiply result not overflow
+ prepare_test_decimalv2_v3_decimal32_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (-9999.9999);
+ """
+ qt_cast32_negative_wider_scale_5 """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+
+ // old type: 5.4
+ // cast to wider scale: x.5
+ // narrow integral: 4.5
+ // test multiply result not overflow, but cast result overflow
+ prepare_test_decimalv2_v3_decimal32_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast1 values (-10000.0001);
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal32_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ sql "drop table test_decimalv2_v3_decimal32_cast1; "
+
+ def prepare_test_decimalv2_v3_decimal32_cast2 = {
+ // type: 2.4
+ sql "drop table if exists test_decimalv2_v3_decimal32_cast2;"
+ sql """
+ CREATE TABLE test_decimalv2_v3_decimal32_cast2(
+ k1 decimalv2(6, 4)
+ )
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 4
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+ }
+ prepare_test_decimalv2_v3_decimal32_cast2()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast2 values (99.9999);
+ """
+
+ // old type: 2.4
+ //////////////////////////////////////////
+ // cast to wider scale: x.5
+ //////////////////////////////////////////
+
+ //======= wider integral: 3.5
+ qt_cast32_2_wider_scale_1 """
+ select cast(k1 as decimalv3(8, 5)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ qt_cast32_2_wider_scale_2 """
+ select cast(k1 as decimalv3(18, 5)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ qt_cast32_2_wider_scale_2 """
+ select cast(k1 as decimalv3(38, 5)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_2_wider_scale_3 """
+ select cast(k1 as decimalv3(76, 5)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 2.4
+ //======= same integral: 2.5
+ qt_cast32_wider_scale_4 """
+ select cast(k1 as decimalv3(7, 5)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+
+ //======= narrow integral: 1.5
+ // integral part overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(6, 5)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // integral part not overflow
+ prepare_test_decimalv2_v3_decimal32_cast2()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast2 values (9.9999);
+ """
+ qt_cast32_wider_scale_5 """
+ select cast(k1 as decimalv3(6, 5)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+
+ // old type: 2.4
+ //////////////////////////////////////////
+ // cast to same scale: x.4
+ //////////////////////////////////////////
+ prepare_test_decimalv2_v3_decimal32_cast2()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast2 values (99.9999);
+ """
+
+ //======= wider integral: 3.4
+ qt_cast32_2_same_scale_1 """
+ select cast(k1 as decimalv3(7, 4)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ qt_cast32_2_same_scale_2 """
+ select cast(k1 as decimalv3(18, 4)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ qt_cast32_2_same_scale_3 """
+ select cast(k1 as decimalv3(38, 4)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_2_same_scale_4 """
+ select cast(k1 as decimalv3(76, 4)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 2.4
+ // cast to same scale: x.4
+ //======= same integral: 2.4
+ qt_cast32_2_same_scale_5 """
+ select cast(k1 as decimalv3(6, 4)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+
+ // cast to same scale: x.4
+ //======= narrow integral: 1.4
+ // integral part overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(5, 4)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // integral part not overflow
+ prepare_test_decimalv2_v3_decimal32_cast2()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast2 values (9.9999);
+ """
+ qt_cast32_2_same_scale_6 """
+ select cast(k1 as decimalv3(5, 4)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+
+ // old type: 2.4
+ //////////////////////////////////////////
+ // cast to narrow scale: x.3
+ //////////////////////////////////////////
+ prepare_test_decimalv2_v3_decimal32_cast2()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast2 values (99.9999);
+ """
+
+ // wider integral: 3.3
+ qt_cast32_2_narrow_scale_1 """
+ select cast(k1 as decimalv3(6, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ qt_cast32_2_narrow_scale_2 """
+ select cast(k1 as decimalv3(18, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ qt_cast32_2_narrow_scale_3 """
+ select cast(k1 as decimalv3(38, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_2_narrow_scale_4 """
+ select cast(k1 as decimalv3(76, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 2.4
+ // cast to narrow scale: x.3
+ // same integral: 2.3
+ // overflow after round
+ test {
+ sql """
+ select cast(k1 as decimalv3(5, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 2.4
+ // cast to narrow scale: x.3
+ // narrow integral: 1.3
+ // integral overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(4, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // integral overflow: overflow after round
+ prepare_test_decimalv2_v3_decimal32_cast2();
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast2 values (9.9999);
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(4, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // integral not overflow
+ prepare_test_decimalv2_v3_decimal32_cast2();
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast2 values (9.9989);
+ """
+ qt_cast32_2_narrow_scale_6 """
+ select cast(k1 as decimalv3(4, 3)) from
test_decimalv2_v3_decimal32_cast2;
+ """
+ sql "drop table test_decimalv2_v3_decimal32_cast2;"
+
+ def prepare_test_decimalv2_v3_decimal32_cast3 = {
+ // type: 9.0
+ sql "drop table if exists test_decimalv2_v3_decimal32_cast3;"
+ sql """
+ CREATE TABLE test_decimalv2_v3_decimal32_cast3(
+ k1 decimalv2(9, 0)
+ )
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 4
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+ }
+ prepare_test_decimalv2_v3_decimal32_cast3()
+ sql """
+ insert into test_decimalv2_v3_decimal32_cast3 values(999999999.0);
+ """
+ test {
+ // multiply not overflow, but result integral part overflow
+ sql """
+ select cast(k1 as decimalv3(17, 9)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ // multiply overflow: 999999999 * 10^10, result digit count: 19
+ sql """
+ select cast(k1 as decimalv3(18, 10)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(38, 30)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ exception "Arithmetic overflow"
+ }
+ sql "set enable_decimal256=true;"
+ test {
+ sql """
+ select cast(k1 as decimalv3(76, 68)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ exception "Arithmetic overflow"
+ }
+ sql "set enable_decimal256=false;"
+ qt_cast32_3_to_much_bigger_scale_1 """
+ select cast(k1 as decimalv3(18, 9)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ qt_cast32_3_to_much_bigger_scale_2 """
+ select cast(k1 as decimalv3(19, 10)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ qt_cast32_3_to_much_bigger_scale_3 """
+ select cast(k1 as decimalv3(38, 29)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast32_3_to_much_bigger_scale_4 """
+ select cast(k1 as decimalv3(76, 67)) from
test_decimalv2_v3_decimal32_cast3;
+ """
+ sql "set enable_decimal256=false;"
+
+ sql "drop table test_decimalv2_v3_decimal32_cast3; "
+
+ // cast decimalv2 who's precision is within decimal64
+ def prepare_test_decimalv2_v3_decimal64_cast1 = {
+ // 12.6
+ sql "drop table if exists test_decimalv2_v3_decimal64_cast1;"
+ sql """
+ CREATE TABLE test_decimalv2_v3_decimal64_cast1(
+ k1 decimalv2(18, 6)
+ )
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 4
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+ }
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values
(999999999999.999999);
+ """
+ qt_cast64_select_all """
+ select * from test_decimalv2_v3_decimal64_cast1 order by 1;
+ """
+
+ // old type: 12.6
+ //////////////////////////////////////////
+ // cast to wider scale: x.7
+ //////////////////////////////////////////
+
+ //======= wider integral: 13.7
+ qt_cast64_wider_scale_1 """
+ select cast(k1 as decimalv3(20, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ qt_cast64_wider_scale_2 """
+ select cast(k1 as decimalv3(38, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast64_wider_scale_3 """
+ select cast(k1 as decimalv3(76, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ sql "set enable_decimal256=false;"
+
+ // cast to wider scale: x.7
+ //======= same integral: 12.7
+ qt_cast64_wider_scale_4 """
+ select cast(k1 as decimalv3(19, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+
+ // old type: 12.6
+ // cast to wider scale: x.7
+ //======= narrow integral: 11.7
+ // integral part overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(18, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // cast to wider scale: x.7
+ //======= narrow integral: 11.7
+ // integral part not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values
(99999999999.999999);
+ """
+ qt_cast64_wider_scale_5 """
+ select cast(k1 as decimalv3(18, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ // cast to decimal32 overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // cast to decimal32 not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (99.999999);
+ """
+ qt_cast64_wider_scale_6 """
+ select cast(k1 as decimalv3(9, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // cast to decimal32 not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (9.999999);
+ """
+ qt_cast64_wider_scale_7 """
+ select cast(k1 as decimalv3(9, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ qt_cast64_wider_scale_8 """
+ select cast(k1 as decimalv3(8, 7)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values
(999999999999.999999);
+ """
+ // old type: 12.6
+ //////////////////////////////////////////
+ // cast to same scale: x.6
+ //////////////////////////////////////////
+
+ //======= wider integral: 13.6
+ qt_cast64_same_scale_1 """
+ select cast(k1 as decimalv3(19, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ qt_cast64_same_scale_2 """
+ select cast(k1 as decimalv3(38, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast64_same_scale_3 """
+ select cast(k1 as decimalv3(76, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ sql "set enable_decimal256=false;"
+
+ // cast to same scale: x.6
+ //======= same integral: 12.6
+ qt_cast64_same_scale_4 """
+ select cast(k1 as decimalv3(18, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+
+ // old type: 12.6
+ // cast to same scale: x.6
+ //======= narrow integral: 11.6
+ // integral part overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(17, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ // to decimal32 overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // cast to same scale: x.6
+ //======= narrow integral: 11.6
+ // integral part not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values
(99999999999.999999);
+ """
+ qt_cast64_same_scale_5 """
+ select cast(k1 as decimalv3(17, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ // to decimal32 overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // cast to same scale: x.6
+ //======= narrow integral: 3.6
+ // to decimal32 not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (999.999999);
+ """
+ qt_cast64_same_scale_6 """
+ select cast(k1 as decimalv3(9, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // to decimal32 not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (99.999999);
+ """
+ qt_cast64_same_scale_7 """
+ select cast(k1 as decimalv3(9, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ qt_cast64_same_scale_8 """
+ select cast(k1 as decimalv3(8, 6)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+
+ // old type: 12.6
+ //////////////////////////////////////////
+ // cast to narrow scale: x.5
+ //////////////////////////////////////////
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values
(999999999999.999999);
+ """
+
+ //======= wider integral: 13.5
+ qt_cast64_narrow_scale_1 """
+ select cast(k1 as decimalv3(18, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ qt_cast64_narrow_scale_2 """
+ select cast(k1 as decimalv3(38, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast64_narrow_scale_3 """
+ select cast(k1 as decimalv3(76, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 12.6
+ // cast to narrow scale: x.5
+ //======= same integral: 12.5
+ // overflow after round
+ test {
+ sql """
+ select cast(k1 as decimalv3(17, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 12.6
+ // cast to narrow scale: x.5
+ //======= narrow integral: 11.5
+ // integral overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(16, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // integral overflow after round
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values
(99999999999.999999);
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(16, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // integral not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values
(99999999999.999989);
+ """
+ qt_cast64_narrow_scale_5 """
+ select cast(k1 as decimalv3(16, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+
+ // to decimal32 overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // to decimal32 overflow after round
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (9999.999999);
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // to decimal32 not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (9999.999989);
+ """
+ qt_cast64_narrow_scale_6 """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // to decimal32 overflow after round
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (999.999999);
+ """
+ qt_cast64_narrow_scale_7 """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(8, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // to decimal32 not overflow
+ prepare_test_decimalv2_v3_decimal64_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal64_cast1 values (999.999989);
+ """
+ qt_cast64_narrow_scale_8 """
+ select cast(k1 as decimalv3(9, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ qt_cast64_narrow_scale_9 """
+ select cast(k1 as decimalv3(8, 5)) from
test_decimalv2_v3_decimal64_cast1;
+ """
+ sql "drop table test_decimalv2_v3_decimal64_cast1;"
+
+ // cast decimalv2 who's precision is within decimal128
+ def prepare_test_decimalv2_v3_decimal128_cast1 = {
+ // 18.9
+ sql "drop table if exists test_decimalv2_v3_decimal128_cast1;"
+ sql """
+ CREATE TABLE test_decimalv2_v3_decimal128_cast1(
+ k1 decimalv2(27, 9)
+ )
+ DISTRIBUTED BY HASH(`k1`) BUCKETS 4
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+ }
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (999999999999999999.999999999),
+ (-999999999999999999.999999999);
+ """
+ // old type: 18.9
+ //////////////////////////////////////////
+ // cast to wider scale: x.10
+ //////////////////////////////////////////
+
+ //======= wider integral: 19.10
+ qt_cast128_wider_scale_1 """
+ select cast(k1 as decimalv3(29, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ qt_cast128_wider_scale_2 """
+ select cast(k1 as decimalv3(38, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+
+ sql "set enable_decimal256=true;"
+ qt_cast128_wider_scale_3 """
+ select cast(k1 as decimalv3(39, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ qt_cast128_wider_scale_4 """
+ select cast(k1 as decimalv3(76, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ sql "set enable_decimal256=false;"
+
+ //======= same integral: 18.10
+ qt_cast128_wider_scale_5 """
+ select cast(k1 as decimalv3(28, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+
+ //======= narrow integral: 17.10
+ test {
+ sql """
+ select cast(k1 as decimalv3(27, 10)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(11, 10)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 18.9
+ // cast to wider scale: x.10
+ //======= narrow integral: 17.10, not overflow
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (99999999999999999.999999999),
+ (-99999999999999999.999999999);
+ """
+ qt_cast128_wider_scale_6 """
+ select cast(k1 as decimalv3(27, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ // to much narrower integer, still overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(26, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(11, 10)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 18.9
+ // cast to wider scale: x.10
+ //======= narrow integral
+ // narrow integral 64 not overflow
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (99999999.999999999),
+ (-99999999.999999999);
+ """
+ qt_cast128_wider_scale_7 """
+ select cast(k1 as decimalv3(18, 10)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(11, 10)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 18.9
+ //////////////////////////////////////////
+ // cast to same scale: x.9
+ //////////////////////////////////////////
+
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (999999999999999999.999999999),
+ (-999999999999999999.999999999);
+ """
+ //======= wider integral: 19.9
+ qt_cast128_same_scale_1 """
+ select cast(k1 as decimalv3(28, 9)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ qt_cast128_same_scale_2 """
+ select cast(k1 as decimalv3(38, 9)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast128_same_scale_3 """
+ select cast(k1 as decimalv3(76, 9)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 18.9
+ // cast to same scale: x.9
+ //======= same integral: 18.9
+ qt_cast128_same_scale_4 """
+ select cast(k1 as decimalv3(27, 9)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+
+ // old type: 18.9
+ // cast to same scale: x.9
+ //======= narrow integral: 17.9
+ test {
+ sql """
+ select cast(k1 as decimalv3(26, 9)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ // to decimal64 and decimal32 overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(18, 9)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 9)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 18.9
+ // cast to same scale: x.9
+ //======= narrow integral: 17.9
+ // not overflow
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (99999999999999999.999999999),
+ (-99999999999999999.999999999);
+ """
+ qt_cast128_same_scale_5 """
+ select cast(k1 as decimalv3(26, 9)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+
+ // to decimal64 and decimal32 overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(18, 9)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 9)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 18.9
+ // cast to same scale: x.9
+ //======= narrow integral: 17.9
+ // not overflow
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (999999999.999999999),
+ (-999999999.999999999);
+ """
+ qt_cast128_same_scale_6 """
+ select cast(k1 as decimalv3(26, 9)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+
+ // to decimal64 not overflow
+ qt_cast128_same_scale_7 """
+ select cast(k1 as decimalv3(18, 9)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ // to decimal32 not overflow
+ test {
+ sql """
+ select cast(k1 as decimalv3(9, 9)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // old type: 18.9
+ //////////////////////////////////////////
+ // cast to narrow scale: x.8
+ //////////////////////////////////////////
+
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (999999999999999999.999999999),
+ (-999999999999999999.999999999);
+ """
+
+ //======= wider integral: 19.8
+ qt_cast128_narrow_scale_1 """
+ select cast(k1 as decimalv3(27, 8)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ qt_cast128_narrow_scale_2 """
+ select cast(k1 as decimalv3(38, 8)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ sql "set enable_decimal256=true;"
+ qt_cast128_narrow_scale_3 """
+ select cast(k1 as decimalv3(76, 8)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+ sql "set enable_decimal256=false;"
+
+ // old type: 18.9
+ // cast to narrow scale: x.8
+ //======= same integral: 18.8
+ // overflow after round, bug
+ test {
+ sql """
+ select cast(k1 as decimalv3(26, 8)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ //======= same integral: 18.8 not overflow
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (999999999999999999.999999989),
+ (-999999999999999999.999999989);
+ """
+ qt_cast128_narrow_scale_4 """
+ select cast(k1 as decimalv3(26, 8)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+
+ // old type: 18.9
+ // cast to narrow scale: x.8
+ //======= narrow integral: 17.8
+
+ test {
+ sql """
+ select cast(k1 as decimalv3(25, 8)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // overflow after round
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (99999999999999999.999999999),
+ (-99999999999999999.999999999);
+ """
+ test {
+ sql """
+ select cast(k1 as decimalv3(25, 8)) from
test_decimalv2_v3_decimal128_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+
+ // not overflow
+ prepare_test_decimalv2_v3_decimal128_cast1()
+ sql """
+ insert into test_decimalv2_v3_decimal128_cast1 values
+ (99999999999999999.999999994),
+ (-99999999999999999.999999994);
+ """
+ qt_cast128_narrow_scale_5 """
+ select cast(k1 as decimalv3(25, 8)) from
test_decimalv2_v3_decimal128_cast1 order by 1;
+ """
+
+ sql """
+ admin set frontend config("enable_decimal_conversion" = "true");
+ """
+}
diff --git
a/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_cast.groovy
b/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_cast.groovy
index 8394ec5cf38..72fa8bc14df 100644
--- a/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_cast.groovy
+++ b/regression-test/suites/datatype_p0/decimalv3/test_decimalv3_cast.groovy
@@ -418,6 +418,18 @@ suite("test_decimalv3_cast") {
// old type: 2.4
// cast to narrow scale: x.3
// same integral: 2.3
+ // overflow after round
+ test {
+ sql """
+ select cast(k1 as decimalv3(5, 3)) from test_decimal32_cast2;
+ """
+ exception "Arithmetic overflow"
+ }
+ // not overflow after round
+ prepare_test_decimal32_cast2()
+ sql """
+ insert into test_decimal32_cast2 values (99.9989);
+ """
qt_cast32_2_narrow_scale_5 """
select cast(k1 as decimalv3(5, 3)) from test_decimal32_cast2;
"""
@@ -765,6 +777,18 @@ suite("test_decimalv3_cast") {
// old type: 12.6
// cast to narrow scale: x.5
//======= same integral: 12.5
+ // overflow after round
+ test {
+ sql """
+ select cast(k1 as decimalv3(17, 5)) from test_decimal64_cast1;
+ """
+ exception "Arithmetic overflow"
+ }
+ // not overflow after round
+ prepare_test_decimal64_cast1()
+ sql """
+ insert into test_decimal64_cast1 values (999999999999.999994);
+ """
qt_cast64_narrow_scale_4 """
select cast(k1 as decimalv3(17, 5)) from test_decimal64_cast1;
"""
@@ -1154,6 +1178,19 @@ suite("test_decimalv3_cast") {
sql "set enable_decimal256=false;"
//======= same integral: 32.5
+ // overflow after round
+ test {
+ sql """
+ select cast(k1 as decimalv3(37, 5)) from test_decimal128_cast1 order
by 1;
+ """
+ exception "Arithmetic overflow"
+ }
+ prepare_test_decimal128_cast1()
+ sql """
+ insert into test_decimal128_cast1 values
+ (99999999999999999999999999999999.999989),
+ (-99999999999999999999999999999999.999989);
+ """
qt_cast128_narrow_scale_3 """
select cast(k1 as decimalv3(37, 5)) from test_decimal128_cast1 order
by 1;
"""
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]