Skip to content

Commit 5947ca0

Browse files
authored
fix: fix decimal bug (#557)
* fix decimal bug * fix decimal bug
1 parent 1fa13e9 commit 5947ca0

File tree

5 files changed

+27
-7
lines changed

5 files changed

+27
-7
lines changed

.github/workflows/ttc.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ on:
1010
- 'core/**'
1111
- 'driver/**'
1212
- 'ttc/**'
13+
- 'sql/**'
1314

1415
jobs:
1516
docker:

cli/tests/00-base.result

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ with comment
1414
"
1515
a"
1616
3
17+
-9999999999999999999999999999999999999999999999999999999999999999999999999999
1718
1
1819
NULL
1920
3.00 3.00 0.0000000170141183460469231731687303715884105727000 -0.0000000170141183460469231731687303715884105727000

cli/tests/00-base.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ select /* ignore this block */ 'with comment';
1919
select 1; select 2; select '
2020
a'; select 3;
2121

22+
select -9999999999999999999999999999999999999999999999999999999999999999999999999999;
23+
2224
-- issue 409
2325
drop table if exists t;
2426
create table t(id tuple(STRING, array(tuple(array(int), array(STRING NOT NULL)))));

sql/src/value.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,14 @@ pub fn display_decimal_256(num: i256, scale: u8) -> String {
980980
pub fn parse_decimal(text: &str, size: DecimalSize) -> Result<NumberValue> {
981981
let mut start = 0;
982982
let bytes = text.as_bytes();
983+
let mut is_negative = false;
984+
985+
// Check if the number is negative
986+
if bytes[start] == b'-' {
987+
is_negative = true;
988+
start += 1;
989+
}
990+
983991
while start < text.len() && bytes[start] == b'0' {
984992
start += 1
985993
}
@@ -1016,13 +1024,21 @@ pub fn parse_decimal(text: &str, size: DecimalSize) -> Result<NumberValue> {
10161024
let precision = std::cmp::min(digits.len(), 76);
10171025
let digits = unsafe { std::str::from_utf8_unchecked(&digits[..precision]) };
10181026

1019-
if size.precision > 38 {
1020-
Ok(NumberValue::Decimal256(
1021-
i256::from_string(digits).unwrap(),
1022-
size,
1023-
))
1027+
let result = if size.precision > 38 {
1028+
NumberValue::Decimal256(i256::from_string(digits).unwrap(), size)
1029+
} else {
1030+
NumberValue::Decimal128(digits.parse::<i128>()?, size)
1031+
};
1032+
1033+
// If the number was negative, negate the result
1034+
if is_negative {
1035+
match result {
1036+
NumberValue::Decimal256(val, size) => Ok(NumberValue::Decimal256(-val, size)),
1037+
NumberValue::Decimal128(val, size) => Ok(NumberValue::Decimal128(-val, size)),
1038+
_ => Ok(result),
1039+
}
10241040
} else {
1025-
Ok(NumberValue::Decimal128(digits.parse::<i128>()?, size))
1041+
Ok(result)
10261042
}
10271043
}
10281044
}

ttc/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ repository = { workspace = true }
1313
[dependencies]
1414
bytes = "1"
1515
clap = { version = "4.4", features = ["derive", "env"] }
16-
databend-driver = { path = "../driver" }
16+
databend-driver = { workspace = true }
1717
serde = { version = "1.0", features = ["derive"] }
1818
serde_json = { version = "1.0", default-features = false, features = ["std"] }
1919
tokio = { version = "1.34", features = [

0 commit comments

Comments
 (0)