diff --git a/lib/column/decimal.go b/lib/column/decimal.go index 72dddd5f4e..a24fe1b9dc 100644 --- a/lib/column/decimal.go +++ b/lib/column/decimal.go @@ -155,7 +155,7 @@ 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 } @@ -163,7 +163,7 @@ func (col *Decimal) Decode(decoder *binary.Decoder, rows int) error { 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 } diff --git a/tests/decimal_test.go b/tests/decimal_test.go index c8a565c27a..ab14844146 100644 --- a/tests/decimal_test.go +++ b/tests/decimal_test.go @@ -19,6 +19,7 @@ package tests import ( "context" + "github.com/stretchr/testify/require" "testing" "github.com/ClickHouse/clickhouse-go/v2" @@ -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() { @@ -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 } @@ -82,11 +83,11 @@ 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)) } } } @@ -94,6 +95,63 @@ func TestDecimal(t *testing.T) { } } +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()