Skip to content

Commit 1f620f6

Browse files
author
Akira Ajisaka
committed
Add support for VARBYTE type
1 parent 7bf470f commit 1f620f6

5 files changed

Lines changed: 28 additions & 1 deletion

File tree

src/main/scala/io/github/spark_redshift_community/spark/redshift/data/DataApiWrapper.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import scala.concurrent.duration.Duration
2222
import scala.util.control.NonFatal
2323
import io.github.spark_redshift_community.spark.redshift.Parameters.MergedParameters
2424
import io.github.spark_redshift_community.spark.redshift.TimestampNTZTypeExtractor
25-
import io.github.spark_redshift_community.spark.redshift.pushdown.{BooleanVariable, ByteVariable, ConstantString, DoubleVariable, FloatVariable, IntVariable, LongVariable, RedshiftSQLStatement, ShortVariable, StatementElement, StringVariable}
25+
import io.github.spark_redshift_community.spark.redshift.pushdown.{BinaryVariable, BooleanVariable, ByteVariable, ConstantString, DoubleVariable, FloatVariable, IntVariable, LongVariable, RedshiftSQLStatement, ShortVariable, StatementElement, StringVariable}
2626
import org.slf4j.LoggerFactory
2727

2828
import java.util.concurrent.{ConcurrentHashMap, Executors, ThreadFactory}
@@ -365,6 +365,7 @@ private[redshift] class DataApiWrapper extends RedshiftWrapper with Serializable
365365
case "float8" => DoubleType
366366
case "char" => StringType
367367
case "varchar" => StringType
368+
case "varbyte" => BinaryType
368369
case "bool" => BooleanType
369370
case "date" => DateType
370371
case "time" => TimestampType
@@ -473,6 +474,7 @@ private[redshift] class DataApiWrapper extends RedshiftWrapper with Serializable
473474
case ele: DoubleVariable => QueryParameter(name, ele.variable, java.sql.Types.DOUBLE)
474475
case ele: BooleanVariable => QueryParameter(name, ele.variable, java.sql.Types.BOOLEAN)
475476
case ele: ByteVariable => QueryParameter(name, ele.variable, java.sql.Types.TINYINT)
477+
case ele: BinaryVariable => QueryParameter(name, ele.variable, java.sql.Types.LONGVARBINARY)
476478
case _ =>
477479
throw new IllegalArgumentException(
478480
"Unexpected Element Type: " + element.getClass.getName

src/main/scala/io/github/spark_redshift_community/spark/redshift/data/JDBCWrapper.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,9 @@ private[redshift] class JDBCWrapper extends RedshiftWrapper with Serializable {
414414
case java.sql.Types.VARCHAR => StringType
415415
case java.sql.Types.LONGVARCHAR => StringType
416416

417+
// Binary types
418+
case java.sql.Types.LONGVARBINARY => BinaryType
419+
417420
// Datetime Types
418421
case java.sql.Types.DATE => DateType
419422
case java.sql.Types.TIME => TimestampType

src/main/scala/io/github/spark_redshift_community/spark/redshift/data/RedshiftResults.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ private[redshift] abstract class RedshiftResults() {
2727
def getInt(columnIndex: Int): Int
2828
def getLong(columnIndex: Int): Long
2929
def getString(columnIndex: Int): String
30+
def getBinary(columnIndex: Int): Array[Byte]
3031

3132
def getInt(columnLabel: String): Int
3233
def getLong(columnLabel: String): Long
3334
def getString(columnLabel: String): String
35+
def getBinary(columnLabel: String): Array[Byte]
3436

3537
}
3638

@@ -61,6 +63,10 @@ private[redshift] case class DataApiResults(results: GetStatementResultResult)
6163
curr.get(columnIndex - 1).getStringValue
6264
}
6365

66+
override def getBinary(columnIndex: Int): Array[Byte] = {
67+
curr.get(columnIndex - 1).getBlobValue.array()
68+
}
69+
6470
override def getInt(columnLabel: String): Int = {
6571
curr.get(getIndex(columnLabel)).getLongValue.asInstanceOf[Int]
6672
}
@@ -73,6 +79,10 @@ private[redshift] case class DataApiResults(results: GetStatementResultResult)
7379
curr.get(getIndex(columnLabel)).getStringValue
7480
}
7581

82+
def getBinary(columnLabel: String): Array[Byte] = {
83+
curr.get(getIndex(columnLabel)).getBlobValue.array()
84+
}
85+
7686
private def getIndex(columnLabel: String): Int = {
7787
results.getColumnMetadata.asScala.indexWhere(col => col.getLabel == columnLabel)
7888
}
@@ -95,6 +105,10 @@ private[redshift] case class JDBCResults(results: ResultSet) extends RedshiftRes
95105
results.getString(columnIndex)
96106
}
97107

108+
override def getBinary(columnIndex: Int): Array[Byte] = {
109+
results.getBytes(columnIndex)
110+
}
111+
98112
override def getInt(columnLabel: String): Int = {
99113
results.getInt(columnLabel)
100114
}
@@ -106,4 +120,8 @@ private[redshift] case class JDBCResults(results: ResultSet) extends RedshiftRes
106120
override def getString(columnLabel: String): String = {
107121
results.getString(columnLabel)
108122
}
123+
124+
override def getBinary(columnLabel: String): Array[Byte] = {
125+
results.getBytes(columnLabel)
126+
}
109127
}

src/main/scala/io/github/spark_redshift_community/spark/redshift/data/RedshiftWrapper.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ private[redshift] class RedshiftWrapper extends Serializable {
5656
} else {
5757
s"VARCHAR(MAX)"
5858
}
59+
case BinaryType => "VARBYTE"
5960
case TimestampType => if (redshift.legacyTimestampHandling) "TIMESTAMP" else "TIMESTAMPTZ"
6061
case TimestampNTZTypeExtractor(_) if !redshift.legacyTimestampHandling => "TIMESTAMP"
6162
case DateType => "DATE"

src/main/scala/io/github/spark_redshift_community/spark/redshift/pushdown/RedshiftSQLStatement.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,6 @@ private[redshift] case class BooleanVariable(override val variable: Option[Boole
165165

166166
private[redshift] case class ByteVariable(override val variable: Option[Byte])
167167
extends VariableElement[Byte]
168+
169+
private[redshift] case class BinaryVariable(override val variable: Option[Array[Byte]])
170+
extends VariableElement[Array[Byte]]

0 commit comments

Comments
 (0)