finagle / finagle/finagle-postgres
BinaryParameter(true) with preparedStatement produce weird value for BigDecimal
- Dominant language
- Scala
- Stars
- 81
- Forks
- 36
- PR merge metrics
- No merged PRs in 30d
Description
Hi, I am testing finagle-postgres with CockroachDb, and noticed all negative decimal values inserted into database are strange. After some test I narrowed it down to the binaryParameter.
Here's how I reproduced it :
```
root@:26257/it_test_db> show create table test;
+-------+-----------------------------------------------+
| Table | CreateTable |
+-------+-----------------------------------------------+
| test | CREATE TABLE test ( |
| | |
| | a INT NOT NULL, |
| | |
| | b DECIMAL NULL, |
| | |
| | CONSTRAINT "primary" PRIMARY KEY (a ASC), |
| | |
| | FAMILY "primary" (a, b) |
| | |
| | ) |
+-------+-----------------------------------------------+
```
then create a client withBinaryParams(true) and tried to insert some data:
```
val c =Postgres
.Client()
.withCredentials("root", None)
.database("it_test_db")
.withBinaryParams(true)
.newRichClient("localhost:26257")
```
```
cala> com.twitter.util.Await.result(c.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 1, 1.1))
res0: Int = 1
scala> com.twitter.util.Await.result(c.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 2, -1.1))
res1: Int = 1
scala> com.twitter.util.Await.result(c.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 3, BigDecimal(1.1)))
res2: Int = 1
scala> com.twitter.util.Await.result(c.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 4, BigDecimal(-1.1)))
res3: Int = 1
scala> com.twitter.util.Await.result(c.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 5, BigDecimal(1)))
res4: Int = 1
scala> com.twitter.util.Await.result(c.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 6, BigDecimal(-1)))
res5: Int = 1
```
but in the database it became :
```
root@:26257/it_test_db> select * from test;
+---+------------------------+
| a | b |
+---+------------------------+
| 1 | 1.1 |
| 2 | -1.1 |
| 3 | 1.1 |
| 4 | -1844674407370955161.5 |
| 5 | 100000 |
| 6 | -0 |
+---+------------------------+
```
however if client is created without withBinaryParams(true)
```
scala> val c2 =Postgres.Client().withCredentials("root", None).database("it_test_db").newRichClient("localhost:26257")
c2: com.twitter.finagle.postgres.PostgresClientImpl = com.twitter.finagle.postgres.PostgresClientImpl@45682e3e
scala> com.twitter.util.Await.result(c2.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 7, BigDecimal(1.1)))
res6: Int = 1
scala> com.twitter.util.Await.result(c2.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 8, BigDecimal(-1.1)))
res7: Int = 1
scala> com.twitter.util.Await.result(c2.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 9, BigDecimal(1)))
res8: Int = 1
scala> com.twitter.util.Await.result(c2.prepareAndExecute("INSERT INTO test VALUES ($1,$2)", 10, BigDecimal(-1)))
res9: Int = 1
```
in the database it seems ok:
```
root@:26257/it_test_db> select * from test;
+----+------------------------+
| a | b |
+----+------------------------+
| 1 | 1.1 |
| 2 | -1.1 |
| 3 | 1.1 |
| 4 | -1844674407370955161.5 |
| 5 | 100000 |
| 6 | -0 |
| 7 | 1.1 |
| 8 | -1.1 |
| 9 | 1 |
| 10 | -1 |
+----+------------------------+
(10 rows)
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.