@@ -87,7 +87,7 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression {
8787
8888 private def decimalToTimestamp (d : BigDecimal ) = {
8989 val seconds = d.longValue()
90- val bd = (d - seconds) * ( 1000000000 )
90+ val bd = (d - seconds) * 1000000000
9191 val nanos = bd.intValue()
9292
9393 // Convert to millis
@@ -96,18 +96,20 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression {
9696
9797 // remaining fractional portion as nanos
9898 t.setNanos(nanos)
99-
10099 t
101100 }
102101
103- private def timestampToDouble (t : Timestamp ) = (t.getSeconds() + t.getNanos().toDouble / 1000 )
102+ // Timestamp to long, converting milliseconds to seconds
103+ private def timestampToLong (ts : Timestamp ) = ts.getTime / 1000
104+
105+ private def timestampToDouble (ts : Timestamp ) = ts.getTime.toDouble / 1000
104106
105107 def castToLong : Any => Any = child.dataType match {
106108 case StringType => nullOrCast[String ](_, s => try s.toLong catch {
107109 case _ : NumberFormatException => null
108110 })
109111 case BooleanType => nullOrCast[Boolean ](_, b => if (b) 1 else 0 )
110- case TimestampType => nullOrCast[Timestamp ](_, t => timestampToDouble (t).toLong )
112+ case TimestampType => nullOrCast[Timestamp ](_, t => timestampToLong (t))
111113 case DecimalType => nullOrCast[BigDecimal ](_, _.toLong)
112114 case x : NumericType => b => x.numeric.asInstanceOf [Numeric [Any ]].toLong(b)
113115 }
@@ -117,7 +119,7 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression {
117119 case _ : NumberFormatException => null
118120 })
119121 case BooleanType => nullOrCast[Boolean ](_, b => if (b) 1 else 0 )
120- case TimestampType => nullOrCast[Timestamp ](_, t => timestampToDouble (t).toInt)
122+ case TimestampType => nullOrCast[Timestamp ](_, t => timestampToLong (t).toInt)
121123 case DecimalType => nullOrCast[BigDecimal ](_, _.toInt)
122124 case x : NumericType => b => x.numeric.asInstanceOf [Numeric [Any ]].toInt(b)
123125 }
@@ -127,7 +129,7 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression {
127129 case _ : NumberFormatException => null
128130 })
129131 case BooleanType => nullOrCast[Boolean ](_, b => if (b) 1 else 0 )
130- case TimestampType => nullOrCast[Timestamp ](_, t => timestampToDouble (t).toShort)
132+ case TimestampType => nullOrCast[Timestamp ](_, t => timestampToLong (t).toShort)
131133 case DecimalType => nullOrCast[BigDecimal ](_, _.toShort)
132134 case x : NumericType => b => x.numeric.asInstanceOf [Numeric [Any ]].toInt(b).toShort
133135 }
@@ -137,7 +139,7 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression {
137139 case _ : NumberFormatException => null
138140 })
139141 case BooleanType => nullOrCast[Boolean ](_, b => if (b) 1 else 0 )
140- case TimestampType => nullOrCast[Timestamp ](_, t => timestampToDouble (t).toByte)
142+ case TimestampType => nullOrCast[Timestamp ](_, t => timestampToLong (t).toByte)
141143 case DecimalType => nullOrCast[BigDecimal ](_, _.toByte)
142144 case x : NumericType => b => x.numeric.asInstanceOf [Numeric [Any ]].toInt(b).toByte
143145 }
@@ -147,7 +149,9 @@ case class Cast(child: Expression, dataType: DataType) extends UnaryExpression {
147149 case _ : NumberFormatException => null
148150 })
149151 case BooleanType => nullOrCast[Boolean ](_, b => if (b) BigDecimal (1 ) else BigDecimal (0 ))
150- case TimestampType => nullOrCast[Timestamp ](_, t => BigDecimal (timestampToDouble(t)))
152+ case TimestampType =>
153+ // Note that we lose precision here.
154+ nullOrCast[Timestamp ](_, t => BigDecimal (timestampToDouble(t)))
151155 case x : NumericType => b => BigDecimal (x.numeric.asInstanceOf [Numeric [Any ]].toDouble(b))
152156 }
153157
0 commit comments