Skip to content

Commit

Permalink
Merge pull request ClickHouse#605 from ClickHouse/issue_593
Browse files Browse the repository at this point in the history
Fix negative decimal
  • Loading branch information
gingerwizard authored Jun 7, 2022
2 parents 09eb8cf + 6b8865a commit 9e7744b
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 17 deletions.
4 changes: 2 additions & 2 deletions lib/column/decimal.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,15 +155,15 @@ func (col *Decimal) AppendRow(v interface{}) error {
func (col *Decimal) Decode(decoder *binary.Decoder, rows int) error {
switch col.nobits {
case 32:
var base UInt32
var base Int32
if err := base.Decode(decoder, rows); err != nil {
return err
}
for _, v := range base {
col.values = append(col.values, decimal.New(int64(v), int32(-col.scale)))
}
case 64:
var base UInt64
var base Int64
if err := base.Decode(decoder, rows); err != nil {
return err
}
Expand Down
88 changes: 73 additions & 15 deletions tests/decimal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package tests

import (
"context"
"github.com/stretchr/testify/require"
"testing"

"github.com/ClickHouse/clickhouse-go/v2"
Expand Down Expand Up @@ -52,11 +53,11 @@ func TestDecimal(t *testing.T) {
}
const ddl = `
CREATE TABLE test_decimal (
Col1 Decimal32(5)
, Col2 Decimal(18,5)
, Col3 Decimal(15,3)
, Col4 Decimal128(5)
, Col5 Decimal256(5)
Col1 Decimal32(3)
, Col2 Decimal(18,6)
, Col3 Decimal(15,7)
, Col4 Decimal128(8)
, Col5 Decimal256(9)
) Engine Memory
`
defer func() {
Expand All @@ -65,11 +66,11 @@ func TestDecimal(t *testing.T) {
if err := conn.Exec(ctx, ddl); assert.NoError(t, err) {
if batch, err := conn.PrepareBatch(ctx, "INSERT INTO test_decimal"); assert.NoError(t, err) {
if err := batch.Append(
decimal.New(25, 0),
decimal.New(30, 0),
decimal.New(35, 0),
decimal.New(135, 0),
decimal.New(256, 0),
decimal.New(25, 4),
decimal.New(30, 5),
decimal.New(35, 6),
decimal.New(135, 7),
decimal.New(256, 8),
); !assert.NoError(t, err) {
return
}
Expand All @@ -82,18 +83,75 @@ func TestDecimal(t *testing.T) {
col5 decimal.Decimal
)
if err := conn.QueryRow(ctx, "SELECT * FROM test_decimal").Scan(&col1, &col2, &col3, &col4, &col5); assert.NoError(t, err) {
assert.True(t, decimal.New(25, 0).Equal(col1))
assert.True(t, decimal.New(30, 0).Equal(col2))
assert.True(t, decimal.New(35, 0).Equal(col3))
assert.True(t, decimal.New(135, 0).Equal(col4))
assert.True(t, decimal.New(256, 0).Equal(col5))
assert.True(t, decimal.New(25, 4).Equal(col1))
assert.True(t, decimal.New(30, 5).Equal(col2))
assert.True(t, decimal.New(35, 6).Equal(col3))
assert.True(t, decimal.New(135, 7).Equal(col4))
assert.True(t, decimal.New(256, 8).Equal(col5))
}
}
}
}
}
}

func TestNegativeDecimal(t *testing.T) {
var (
ctx = context.Background()
conn, err = clickhouse.Open(&clickhouse.Options{
Addr: []string{"127.0.0.1:9000"},
Auth: clickhouse.Auth{
Database: "default",
Username: "default",
Password: "",
},
Compression: &clickhouse.Compression{
Method: clickhouse.CompressionLZ4,
},
Settings: clickhouse.Settings{
"allow_experimental_bigint_types": 1,
},
//Debug: true,
})
)
require.NoError(t, err)
require.NoError(t, conn.Exec(ctx, "DROP TABLE IF EXISTS test_decimal"))
const ddl = `
CREATE TABLE test_decimal (
Col1 Nullable(Decimal(9,4)),
Col2 Nullable(Decimal(18,5)),
Col3 Nullable(Decimal(48,7)),
Col4 Nullable(Decimal(76,29))
) Engine Memory
`
defer func() {
conn.Exec(ctx, "DROP TABLE test_decimal")
}()
if err := checkMinServerVersion(conn, 21, 1); err != nil {
t.Skip(err.Error())
return
}
require.NoError(t, conn.Exec(ctx, ddl))
batch, err := conn.PrepareBatch(ctx, "INSERT INTO test_decimal")
require.NoError(t, err)
require.NoError(t, batch.Append(decimal.RequireFromString("-0.0171"),
decimal.RequireFromString("-0.01171"),
decimal.RequireFromString("-3.0111"),
decimal.RequireFromString("-21111122.0111111111111111111171")))
require.NoError(t, batch.Send())
var (
col1 decimal.Decimal
col2 decimal.Decimal
col3 decimal.Decimal
col4 decimal.Decimal
)
require.NoError(t, conn.QueryRow(ctx, "SELECT * FROM test_decimal").Scan(&col1, &col2, &col3, &col4))
assert.Equal(t, decimal.RequireFromString("-0.0171").String(), col1.String())
assert.Equal(t, decimal.RequireFromString("-0.01171").String(), col2.String())
assert.Equal(t, decimal.RequireFromString("-3.0111").String(), col3.String())
assert.Equal(t, decimal.RequireFromString("-21111122.0111111111111111111171").String(), col4.String())
}

func TestNullableDecimal(t *testing.T) {
var (
ctx = context.Background()
Expand Down

0 comments on commit 9e7744b

Please sign in to comment.