Skip to content

Commit 7df1f85

Browse files
shiyuhang0ti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#2740
Signed-off-by: ti-chi-bot <ti-community-prow-bot@tidb.io>
1 parent 466db63 commit 7df1f85

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

core/src/test/scala/org/apache/spark/sql/IssueTestSuite.scala

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,33 @@ import org.apache.spark.sql.functions.{col, sum}
2222

2323
class IssueTestSuite extends BaseTiSparkTest {
2424

25+
test("test tiflash overflow in unsigned bigint") {
26+
if (!enableTiFlashTest) {
27+
cancel("tiflash test not enabled")
28+
}
29+
val dbTable = "tispark_test.tiflash_overflow"
30+
tidbStmt.execute(s"drop table if exists $dbTable")
31+
tidbStmt.execute(
32+
s"CREATE TABLE $dbTable (`a` bigint(20) UNSIGNED NOT NULL,`b` bigint(20) UNSIGNED NOT NULL)")
33+
tidbStmt.execute(s"insert into $dbTable values(16717361816800086255, 16717361816800086255)")
34+
tidbStmt.execute(s"ALTER TABLE $dbTable SET TIFLASH REPLICA 1")
35+
36+
Thread.sleep(5 * 1000)
37+
38+
val prev = spark.conf.getOption(TiConfigConst.ISOLATION_READ_ENGINES)
39+
try {
40+
spark.conf
41+
.set(TiConfigConst.ISOLATION_READ_ENGINES, TiConfigConst.TIFLASH_STORAGE_ENGINE)
42+
val df = spark.sql(s"select * from $dbTable")
43+
val row = Row(BigDecimal("16717361816800086255"), BigDecimal("16717361816800086255"))
44+
checkAnswer(df, Seq(row))
45+
} finally {
46+
spark.conf.set(
47+
TiConfigConst.ISOLATION_READ_ENGINES,
48+
prev.getOrElse(TiConfigConst.DEFAULT_STORAGE_ENGINES))
49+
}
50+
}
51+
2552
test("test issue 2649") {
2653
val dbTable = "tispark_test.mutil_uniq"
2754
tidbStmt.execute(s"drop table if exists $dbTable")

tikv-client/src/main/java/com/pingcap/tikv/columnar/TiBlockColumnVector.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@
1818

1919
import static com.pingcap.tikv.util.MemoryUtil.EMPTY_BYTE_BUFFER_DIRECT;
2020

21+
<<<<<<< HEAD
2122
import com.pingcap.tikv.ExtendedDateTime;
23+
=======
24+
import com.google.common.primitives.UnsignedLong;
25+
>>>>>>> 044630939 (Fix TiFlash overflow (#2740))
2226
import com.pingcap.tikv.codec.Codec.DateCodec;
2327
import com.pingcap.tikv.codec.Codec.DateTimeCodec;
2428
import com.pingcap.tikv.columnar.datatypes.CHType;
2529
import com.pingcap.tikv.types.AbstractDateTimeType;
2630
import com.pingcap.tikv.types.BytesType;
2731
import com.pingcap.tikv.types.DateType;
32+
import com.pingcap.tikv.types.DecimalType;
2833
import com.pingcap.tikv.util.MemoryUtil;
2934
import java.math.BigDecimal;
3035
import java.nio.ByteBuffer;
@@ -240,6 +245,10 @@ public double getDouble(int rowId) {
240245
@Override
241246
public BigDecimal getDecimal(int rowId, int precision, int scale) {
242247
long rowIdAddr = (long) rowId * fixedLength + dataAddr;
248+
// avoid unsigned long overflow here
249+
if (type == DecimalType.BIG_INT_DECIMAL) {
250+
return new BigDecimal(UnsignedLong.fromLongBits(this.getLong(rowId)).bigIntegerValue());
251+
}
243252
if (fixedLength == 4) {
244253
return MemoryUtil.getDecimal32(rowIdAddr, scale);
245254
} else if (fixedLength == 8) {

0 commit comments

Comments
 (0)