java.sql.Types Scala Examples
The following examples show how to use java.sql.Types.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: DerbyDialect.scala From multi-tenancy-spark with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DerbyDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:derby") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) Option(FloatType) else None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case ByteType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case ShortType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case BooleanType => Option(JdbcType("BOOLEAN", java.sql.Types.BOOLEAN)) // 31 is the maximum precision and 5 is the default scale for a Derby DECIMAL case t: DecimalType if t.precision > 31 => Option(JdbcType("DECIMAL(31,5)", java.sql.Types.DECIMAL)) case _ => None } }
Example 2
Source File: MySQLDialect.scala From BigDatalog with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types.{BooleanType, LongType, DataType, MetadataBuilder} private case object MySQLDialect extends JdbcDialect { override def canHandle(url : String): Boolean = url.startsWith("jdbc:mysql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.VARBINARY && typeName.equals("BIT") && size != 1) { // This could instead be a BinaryType if we'd rather return bit-vectors of up to 64 bits as // byte arrays instead of longs. md.putLong("binarylong", 1) Option(LongType) } else if (sqlType == Types.BIT && typeName.equals("TINYINT")) { Option(BooleanType) } else None } override def quoteIdentifier(colName: String): String = { s"`$colName`" } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } }
Example 3
Source File: PostgresDialect.scala From BigDatalog with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.{Connection, Types} import org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils import org.apache.spark.sql.types._ private object PostgresDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:postgresql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.BIT && typeName.equals("bit") && size != 1) { Some(BinaryType) } else if (sqlType == Types.OTHER) { toCatalystType(typeName).filter(_ == StringType) } else if (sqlType == Types.ARRAY && typeName.length > 1 && typeName(0) == '_') { toCatalystType(typeName.drop(1)).map(ArrayType(_)) } else None } // TODO: support more type names. private def toCatalystType(typeName: String): Option[DataType] = typeName match { case "bool" => Some(BooleanType) case "bit" => Some(BinaryType) case "int2" => Some(ShortType) case "int4" => Some(IntegerType) case "int8" | "oid" => Some(LongType) case "float4" => Some(FloatType) case "money" | "float8" => Some(DoubleType) case "text" | "varchar" | "char" | "cidr" | "inet" | "json" | "jsonb" | "uuid" => Some(StringType) case "bytea" => Some(BinaryType) case "timestamp" | "timestamptz" | "time" | "timetz" => Some(TimestampType) case "date" => Some(DateType) case "numeric" => Some(DecimalType.SYSTEM_DEFAULT) case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Some(JdbcType("TEXT", Types.CHAR)) case BinaryType => Some(JdbcType("BYTEA", Types.BINARY)) case BooleanType => Some(JdbcType("BOOLEAN", Types.BOOLEAN)) case FloatType => Some(JdbcType("FLOAT4", Types.FLOAT)) case DoubleType => Some(JdbcType("FLOAT8", Types.DOUBLE)) case ArrayType(et, _) if et.isInstanceOf[AtomicType] => getJDBCType(et).map(_.databaseTypeDefinition) .orElse(JdbcUtils.getCommonJDBCType(et).map(_.databaseTypeDefinition)) .map(typeName => JdbcType(s"$typeName[]", java.sql.Types.ARRAY)) case ByteType => throw new IllegalArgumentException(s"Unsupported type in postgresql: $dt"); case _ => None } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def beforeFetch(connection: Connection, properties: Map[String, String]): Unit = { super.beforeFetch(connection, properties) // According to the postgres jdbc documentation we need to be in autocommit=false if we actually // want to have fetchsize be non 0 (all the rows). This allows us to not have to cache all the // rows inside the driver when fetching. // // See: https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor // if (properties.getOrElse("fetchsize", "0").toInt > 0) { connection.setAutoCommit(false) } } }
Example 4
Source File: DerbyDialect.scala From BigDatalog with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DerbyDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:derby") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) Option(FloatType) else None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case ByteType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case ShortType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case BooleanType => Option(JdbcType("BOOLEAN", java.sql.Types.BOOLEAN)) // 31 is the maximum precision and 5 is the default scale for a Derby DECIMAL case t: DecimalType if t.precision > 31 => Option(JdbcType("DECIMAL(31,5)", java.sql.Types.DECIMAL)) case _ => None } }
Example 5
Source File: OracleDialect.scala From BigDatalog with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private case object OracleDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:oracle") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { // Handle NUMBER fields that have no precision/scale in special way // because JDBC ResultSetMetaData converts this to 0 procision and -127 scale // For more details, please see // https://github.com/apache/spark/pull/8780#issuecomment-145598968 // and // https://github.com/apache/spark/pull/8780#issuecomment-144541760 if (sqlType == Types.NUMERIC && size == 0) { // This is sub-optimal as we have to pick a precision/scale in advance whereas the data // in Oracle is allowed to have different precision/scale for each value. Option(DecimalType(DecimalType.MAX_PRECISION, 10)) } else { None } } }
Example 6
Source File: DB2Dialect.scala From Spark-2.3.1 with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DB2Dialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:db2") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = sqlType match { case Types.REAL => Option(FloatType) case Types.OTHER => typeName match { case "DECFLOAT" => Option(DecimalType(38, 18)) case "XML" => Option(StringType) case t if (t.startsWith("TIMESTAMP")) => Option(TimestampType) // TIMESTAMP WITH TIMEZONE case _ => None } case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case BooleanType => Option(JdbcType("CHAR(1)", java.sql.Types.CHAR)) case ShortType | ByteType => Some(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case _ => None } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 7
Source File: MySQLDialect.scala From Spark-2.3.1 with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types.{BooleanType, DataType, LongType, MetadataBuilder} private case object MySQLDialect extends JdbcDialect { override def canHandle(url : String): Boolean = url.startsWith("jdbc:mysql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.VARBINARY && typeName.equals("BIT") && size != 1) { // This could instead be a BinaryType if we'd rather return bit-vectors of up to 64 bits as // byte arrays instead of longs. md.putLong("binarylong", 1) Option(LongType) } else if (sqlType == Types.BIT && typeName.equals("TINYINT")) { Option(BooleanType) } else None } override def quoteIdentifier(colName: String): String = { s"`$colName`" } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 8
Source File: PostgresDialect.scala From Spark-2.3.1 with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.{Connection, Types} import org.apache.spark.sql.execution.datasources.jdbc.{JDBCOptions, JdbcUtils} import org.apache.spark.sql.types._ private object PostgresDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:postgresql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) { Some(FloatType) } else if (sqlType == Types.SMALLINT) { Some(ShortType) } else if (sqlType == Types.BIT && typeName.equals("bit") && size != 1) { Some(BinaryType) } else if (sqlType == Types.OTHER) { Some(StringType) } else if (sqlType == Types.ARRAY) { val scale = md.build.getLong("scale").toInt // postgres array type names start with underscore toCatalystType(typeName.drop(1), size, scale).map(ArrayType(_)) } else None } private def toCatalystType( typeName: String, precision: Int, scale: Int): Option[DataType] = typeName match { case "bool" => Some(BooleanType) case "bit" => Some(BinaryType) case "int2" => Some(ShortType) case "int4" => Some(IntegerType) case "int8" | "oid" => Some(LongType) case "float4" => Some(FloatType) case "money" | "float8" => Some(DoubleType) case "text" | "varchar" | "char" | "cidr" | "inet" | "json" | "jsonb" | "uuid" => Some(StringType) case "bytea" => Some(BinaryType) case "timestamp" | "timestamptz" | "time" | "timetz" => Some(TimestampType) case "date" => Some(DateType) case "numeric" | "decimal" => Some(DecimalType.bounded(precision, scale)) case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Some(JdbcType("TEXT", Types.CHAR)) case BinaryType => Some(JdbcType("BYTEA", Types.BINARY)) case BooleanType => Some(JdbcType("BOOLEAN", Types.BOOLEAN)) case FloatType => Some(JdbcType("FLOAT4", Types.FLOAT)) case DoubleType => Some(JdbcType("FLOAT8", Types.DOUBLE)) case ShortType => Some(JdbcType("SMALLINT", Types.SMALLINT)) case t: DecimalType => Some( JdbcType(s"NUMERIC(${t.precision},${t.scale})", java.sql.Types.NUMERIC)) case ArrayType(et, _) if et.isInstanceOf[AtomicType] => getJDBCType(et).map(_.databaseTypeDefinition) .orElse(JdbcUtils.getCommonJDBCType(et).map(_.databaseTypeDefinition)) .map(typeName => JdbcType(s"$typeName[]", java.sql.Types.ARRAY)) case ByteType => throw new IllegalArgumentException(s"Unsupported type in postgresql: $dt"); case _ => None } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def getTruncateQuery(table: String): String = { s"TRUNCATE TABLE ONLY $table" } override def beforeFetch(connection: Connection, properties: Map[String, String]): Unit = { super.beforeFetch(connection, properties) // According to the postgres jdbc documentation we need to be in autocommit=false if we actually // want to have fetchsize be non 0 (all the rows). This allows us to not have to cache all the // rows inside the driver when fetching. // // See: https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor // if (properties.getOrElse(JDBCOptions.JDBC_BATCH_FETCH_SIZE, "0").toInt > 0) { connection.setAutoCommit(false) } } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 9
Source File: DerbyDialect.scala From Spark-2.3.1 with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DerbyDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:derby") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) Option(FloatType) else None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case ByteType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case ShortType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case BooleanType => Option(JdbcType("BOOLEAN", java.sql.Types.BOOLEAN)) // 31 is the maximum precision and 5 is the default scale for a Derby DECIMAL case t: DecimalType if t.precision > 31 => Option(JdbcType("DECIMAL(31,5)", java.sql.Types.DECIMAL)) case _ => None } }
Example 10
Source File: BaseContexts.scala From quill with Apache License 2.0 | 5 votes |
package io.getquill.context.jdbc import java.sql.Types import io.getquill._ trait PostgresJdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[PostgresDialect, N] with BooleanObjectEncoding with UUIDObjectEncoding with ArrayDecoders with ArrayEncoders { val idiom = PostgresDialect override def parseJdbcType(intType: Int): String = intType match { case Types.TINYINT => super.parseJdbcType(Types.SMALLINT) case Types.VARCHAR => "text" case Types.DOUBLE => "float8" case _ => super.parseJdbcType(intType) } } trait H2JdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[H2Dialect, N] with BooleanObjectEncoding with UUIDObjectEncoding { val idiom = H2Dialect } trait MysqlJdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[MySQLDialect, N] with BooleanObjectEncoding with UUIDStringEncoding { val idiom = MySQLDialect } trait SqliteJdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[SqliteDialect, N] with BooleanObjectEncoding with UUIDObjectEncoding { val idiom = SqliteDialect } trait SqlServerJdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[SQLServerDialect, N] with BooleanObjectEncoding with UUIDStringEncoding { val idiom = SQLServerDialect override def executeActionReturning[O](sql: String, prepare: Prepare = identityPrepare, extractor: Extractor[O], returningBehavior: ReturnAction): Result[O] = withConnectionWrapped { conn => val (params, ps) = prepare(prepareWithReturning(sql, conn, returningBehavior)) logger.logQuery(sql, params) handleSingleResult(extractResult(ps.executeQuery, extractor)) } } trait OracleJdbcContextBase[N <: NamingStrategy] extends JdbcContextBase[OracleDialect, N] with BooleanIntEncoding with UUIDStringEncoding { val idiom = OracleDialect }
Example 11
Source File: Encoders.scala From quill with Apache License 2.0 | 5 votes |
package io.getquill.context.jdbc import java.sql.{ Date, Timestamp, Types } import java.time.{ LocalDate, LocalDateTime } import java.util.{ Calendar, TimeZone } import java.{ sql, util } trait Encoders { this: JdbcContextBase[_, _] => type Encoder[T] = JdbcEncoder[T] protected val dateTimeZone = TimeZone.getDefault case class JdbcEncoder[T](sqlType: Int, encoder: BaseEncoder[T]) extends BaseEncoder[T] { override def apply(index: Index, value: T, row: PrepareRow) = encoder(index + 1, value, row) } def encoder[T](sqlType: Int, f: (Index, T, PrepareRow) => Unit): Encoder[T] = JdbcEncoder(sqlType, (index: Index, value: T, row: PrepareRow) => { f(index, value, row) row }) def encoder[T](sqlType: Int, f: PrepareRow => (Index, T) => Unit): Encoder[T] = encoder(sqlType, (index: Index, value: T, row: PrepareRow) => f(row)(index, value)) implicit def mappedEncoder[I, O](implicit mapped: MappedEncoding[I, O], e: Encoder[O]): Encoder[I] = JdbcEncoder(e.sqlType, mappedBaseEncoder(mapped, e.encoder)) private[this] val nullEncoder: Encoder[Int] = encoder(Types.INTEGER, _.setNull) implicit def optionEncoder[T](implicit d: Encoder[T]): Encoder[Option[T]] = JdbcEncoder( d.sqlType, (index, value, row) => value match { case Some(v) => d.encoder(index, v, row) case None => nullEncoder.encoder(index, d.sqlType, row) } ) implicit val stringEncoder: Encoder[String] = encoder(Types.VARCHAR, _.setString) implicit val bigDecimalEncoder: Encoder[BigDecimal] = encoder(Types.NUMERIC, (index, value, row) => row.setBigDecimal(index, value.bigDecimal)) implicit val byteEncoder: Encoder[Byte] = encoder(Types.TINYINT, _.setByte) implicit val shortEncoder: Encoder[Short] = encoder(Types.SMALLINT, _.setShort) implicit val intEncoder: Encoder[Int] = encoder(Types.INTEGER, _.setInt) implicit val longEncoder: Encoder[Long] = encoder(Types.BIGINT, _.setLong) implicit val floatEncoder: Encoder[Float] = encoder(Types.FLOAT, _.setFloat) implicit val doubleEncoder: Encoder[Double] = encoder(Types.DOUBLE, _.setDouble) implicit val byteArrayEncoder: Encoder[Array[Byte]] = encoder(Types.VARBINARY, _.setBytes) implicit val dateEncoder: Encoder[util.Date] = encoder(Types.TIMESTAMP, (index, value, row) => row.setTimestamp(index, new sql.Timestamp(value.getTime), Calendar.getInstance(dateTimeZone))) implicit val localDateEncoder: Encoder[LocalDate] = encoder(Types.DATE, (index, value, row) => row.setDate(index, Date.valueOf(value), Calendar.getInstance(dateTimeZone))) implicit val localDateTimeEncoder: Encoder[LocalDateTime] = encoder(Types.TIMESTAMP, (index, value, row) => row.setTimestamp(index, Timestamp.valueOf(value), Calendar.getInstance(dateTimeZone))) }
Example 12
Source File: KsqlResultSetMetaData.scala From ksql-jdbc-driver with Apache License 2.0 | 5 votes |
package com.github.mmolimar.ksql.jdbc.resultset import java.sql.{ResultSetMetaData, Types} import com.github.mmolimar.ksql.jdbc.Exceptions._ import com.github.mmolimar.ksql.jdbc.implicits.toIndexedMap import com.github.mmolimar.ksql.jdbc.{HeaderField, InvalidColumn} import io.confluent.ksql.schema.ksql.{SqlBaseType => KsqlType} class KsqlResultSetMetaData(private[jdbc] val columns: List[HeaderField]) extends ResultSetMetaDataNotSupported { private val fieldByIndex: Map[Int, HeaderField] = columns private def getField(index: Int): HeaderField = fieldByIndex.getOrElse(index, throw InvalidColumn(s"Column with index '$index' does not exist.")) override def getColumnClassName(column: Int): String = { getField(column).jdbcType match { case Types.INTEGER => classOf[java.lang.Integer] case Types.BIGINT => classOf[java.lang.Long] case Types.DOUBLE => classOf[java.lang.Double] case Types.DECIMAL => classOf[java.math.BigDecimal] case Types.BOOLEAN => classOf[java.lang.Boolean] case Types.VARCHAR => classOf[java.lang.String] case Types.JAVA_OBJECT => classOf[java.util.Map[AnyRef, AnyRef]] case Types.ARRAY => classOf[java.sql.Array] case Types.STRUCT => classOf[java.sql.Struct] case _ => classOf[java.lang.String] } }.getName override def getColumnCount: Int = columns.size override def getColumnDisplaySize(column: Int): Int = getField(column).length override def getColumnLabel(column: Int): String = getField(column).label override def getColumnName(column: Int): String = getField(column).name override def getColumnTypeName(column: Int): String = { getField(column).jdbcType match { case Types.INTEGER => KsqlType.INTEGER case Types.BIGINT => KsqlType.BIGINT case Types.DOUBLE => KsqlType.DOUBLE case Types.DECIMAL => KsqlType.DECIMAL case Types.BOOLEAN => KsqlType.BOOLEAN case Types.VARCHAR => KsqlType.STRING case Types.JAVA_OBJECT => KsqlType.MAP case Types.ARRAY => KsqlType.ARRAY case Types.STRUCT => KsqlType.STRUCT case _ => KsqlType.STRING } }.name override def getColumnType(column: Int): Int = getField(column).jdbcType override def getPrecision(column: Int): Int = getField(column).jdbcType match { case Types.DOUBLE => -1 case _ => 0 } override def getScale(column: Int): Int = getField(column).jdbcType match { case Types.DOUBLE => -1 case _ => 0 } override def isCaseSensitive(column: Int): Boolean = getField(column).jdbcType match { case Types.VARCHAR => true case _ => false } override def isNullable(column: Int): Int = ResultSetMetaData.columnNullableUnknown override def isAutoIncrement(column: Int): Boolean = false override def isCurrency(column: Int): Boolean = false override def isSearchable(column: Int): Boolean = true override def isReadOnly(column: Int): Boolean = false override def isWritable(column: Int): Boolean = !isReadOnly(column) override def isDefinitelyWritable(column: Int): Boolean = isWritable(column) override def isSigned(column: Int): Boolean = getField(column).jdbcType match { case Types.TINYINT | Types.SMALLINT | Types.INTEGER | Types.BIGINT | Types.FLOAT | Types.DOUBLE | Types.DECIMAL => true case _ => false } }
Example 13
Source File: MySQLDialect.scala From multi-tenancy-spark with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types.{BooleanType, DataType, LongType, MetadataBuilder} private case object MySQLDialect extends JdbcDialect { override def canHandle(url : String): Boolean = url.startsWith("jdbc:mysql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.VARBINARY && typeName.equals("BIT") && size != 1) { // This could instead be a BinaryType if we'd rather return bit-vectors of up to 64 bits as // byte arrays instead of longs. md.putLong("binarylong", 1) Option(LongType) } else if (sqlType == Types.BIT && typeName.equals("TINYINT")) { Option(BooleanType) } else None } override def quoteIdentifier(colName: String): String = { s"`$colName`" } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 14
Source File: PostgresDialect.scala From multi-tenancy-spark with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.{Connection, Types} import org.apache.spark.sql.execution.datasources.jdbc.{JDBCOptions, JdbcUtils} import org.apache.spark.sql.types._ private object PostgresDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:postgresql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) { Some(FloatType) } else if (sqlType == Types.SMALLINT) { Some(ShortType) } else if (sqlType == Types.BIT && typeName.equals("bit") && size != 1) { Some(BinaryType) } else if (sqlType == Types.OTHER) { Some(StringType) } else if (sqlType == Types.ARRAY) { val scale = md.build.getLong("scale").toInt // postgres array type names start with underscore toCatalystType(typeName.drop(1), size, scale).map(ArrayType(_)) } else None } private def toCatalystType( typeName: String, precision: Int, scale: Int): Option[DataType] = typeName match { case "bool" => Some(BooleanType) case "bit" => Some(BinaryType) case "int2" => Some(ShortType) case "int4" => Some(IntegerType) case "int8" | "oid" => Some(LongType) case "float4" => Some(FloatType) case "money" | "float8" => Some(DoubleType) case "text" | "varchar" | "char" | "cidr" | "inet" | "json" | "jsonb" | "uuid" => Some(StringType) case "bytea" => Some(BinaryType) case "timestamp" | "timestamptz" | "time" | "timetz" => Some(TimestampType) case "date" => Some(DateType) case "numeric" | "decimal" => Some(DecimalType.bounded(precision, scale)) case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Some(JdbcType("TEXT", Types.CHAR)) case BinaryType => Some(JdbcType("BYTEA", Types.BINARY)) case BooleanType => Some(JdbcType("BOOLEAN", Types.BOOLEAN)) case FloatType => Some(JdbcType("FLOAT4", Types.FLOAT)) case DoubleType => Some(JdbcType("FLOAT8", Types.DOUBLE)) case ShortType => Some(JdbcType("SMALLINT", Types.SMALLINT)) case t: DecimalType => Some( JdbcType(s"NUMERIC(${t.precision},${t.scale})", java.sql.Types.NUMERIC)) case ArrayType(et, _) if et.isInstanceOf[AtomicType] => getJDBCType(et).map(_.databaseTypeDefinition) .orElse(JdbcUtils.getCommonJDBCType(et).map(_.databaseTypeDefinition)) .map(typeName => JdbcType(s"$typeName[]", java.sql.Types.ARRAY)) case ByteType => throw new IllegalArgumentException(s"Unsupported type in postgresql: $dt"); case _ => None } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def beforeFetch(connection: Connection, properties: Map[String, String]): Unit = { super.beforeFetch(connection, properties) // According to the postgres jdbc documentation we need to be in autocommit=false if we actually // want to have fetchsize be non 0 (all the rows). This allows us to not have to cache all the // rows inside the driver when fetching. // // See: https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor // if (properties.getOrElse(JDBCOptions.JDBC_BATCH_FETCH_SIZE, "0").toInt > 0) { connection.setAutoCommit(false) } } override def isCascadingTruncateTable(): Option[Boolean] = Some(true) }
Example 15
Source File: DerbyDialect.scala From drizzle-spark with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DerbyDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:derby") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) Option(FloatType) else None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case ByteType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case ShortType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case BooleanType => Option(JdbcType("BOOLEAN", java.sql.Types.BOOLEAN)) // 31 is the maximum precision and 5 is the default scale for a Derby DECIMAL case t: DecimalType if t.precision > 31 => Option(JdbcType("DECIMAL(31,5)", java.sql.Types.DECIMAL)) case _ => None } }
Example 16
Source File: MemsqlDialect.scala From memsql-spark-connector with Apache License 2.0 | 5 votes |
package com.memsql.spark import java.sql.Types import org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils import org.apache.spark.sql.jdbc.{JdbcDialect, JdbcType} import org.apache.spark.sql.types._ case object MemsqlDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:memsql") val MEMSQL_DECIMAL_MAX_SCALE = 30 override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case BooleanType => Option(JdbcType("BOOL", Types.BOOLEAN)) case ByteType => Option(JdbcType("TINYINT", Types.TINYINT)) case ShortType => Option(JdbcType("SMALLINT", Types.SMALLINT)) case FloatType => Option(JdbcType("FLOAT", Types.FLOAT)) case TimestampType => Option(JdbcType("TIMESTAMP(6)", Types.TIMESTAMP)) case dt: DecimalType if (dt.scale <= MEMSQL_DECIMAL_MAX_SCALE) => Option(JdbcType(s"DECIMAL(${dt.precision}, ${dt.scale})", Types.DECIMAL)) case dt: DecimalType => throw new IllegalArgumentException( s"Too big scale specified(${dt.scale}). MemSQL DECIMAL maximum scale is ${MEMSQL_DECIMAL_MAX_SCALE}") case NullType => throw new IllegalArgumentException( "No corresponding MemSQL type found for NullType. If you want to use NullType, please write to an already existing MemSQL table.") case t => JdbcUtils.getCommonJDBCType(t) } override def getCatalystType(sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { (sqlType, typeName) match { case (Types.REAL, "FLOAT") => Option(FloatType) case (Types.BIT, "BIT") => Option(BinaryType) case (Types.TINYINT, "TINYINT") => Option(ShortType) case (Types.SMALLINT, "SMALLINT") => Option(ShortType) case (Types.DECIMAL, "DECIMAL") => { if (size > DecimalType.MAX_PRECISION) { throw new IllegalArgumentException( s"DECIMAL precision ${size} exceeds max precision ${DecimalType.MAX_PRECISION}") } else { Option( DecimalType(size, md.build().getLong("scale").toInt) ) } } case _ => None } } override def quoteIdentifier(colName: String): String = { s"`$colName`" } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 17
Source File: MySQLDialect.scala From sparkoscope with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types.{BooleanType, DataType, LongType, MetadataBuilder} private case object MySQLDialect extends JdbcDialect { override def canHandle(url : String): Boolean = url.startsWith("jdbc:mysql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.VARBINARY && typeName.equals("BIT") && size != 1) { // This could instead be a BinaryType if we'd rather return bit-vectors of up to 64 bits as // byte arrays instead of longs. md.putLong("binarylong", 1) Option(LongType) } else if (sqlType == Types.BIT && typeName.equals("TINYINT")) { Option(BooleanType) } else None } override def quoteIdentifier(colName: String): String = { s"`$colName`" } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 18
Source File: PostgresDialect.scala From sparkoscope with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.{Connection, Types} import org.apache.spark.sql.execution.datasources.jdbc.{JDBCOptions, JdbcUtils} import org.apache.spark.sql.types._ private object PostgresDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:postgresql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) { Some(FloatType) } else if (sqlType == Types.SMALLINT) { Some(ShortType) } else if (sqlType == Types.BIT && typeName.equals("bit") && size != 1) { Some(BinaryType) } else if (sqlType == Types.OTHER) { Some(StringType) } else if (sqlType == Types.ARRAY) { val scale = md.build.getLong("scale").toInt // postgres array type names start with underscore toCatalystType(typeName.drop(1), size, scale).map(ArrayType(_)) } else None } private def toCatalystType( typeName: String, precision: Int, scale: Int): Option[DataType] = typeName match { case "bool" => Some(BooleanType) case "bit" => Some(BinaryType) case "int2" => Some(ShortType) case "int4" => Some(IntegerType) case "int8" | "oid" => Some(LongType) case "float4" => Some(FloatType) case "money" | "float8" => Some(DoubleType) case "text" | "varchar" | "char" | "cidr" | "inet" | "json" | "jsonb" | "uuid" => Some(StringType) case "bytea" => Some(BinaryType) case "timestamp" | "timestamptz" | "time" | "timetz" => Some(TimestampType) case "date" => Some(DateType) case "numeric" | "decimal" => Some(DecimalType.bounded(precision, scale)) case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Some(JdbcType("TEXT", Types.CHAR)) case BinaryType => Some(JdbcType("BYTEA", Types.BINARY)) case BooleanType => Some(JdbcType("BOOLEAN", Types.BOOLEAN)) case FloatType => Some(JdbcType("FLOAT4", Types.FLOAT)) case DoubleType => Some(JdbcType("FLOAT8", Types.DOUBLE)) case ShortType => Some(JdbcType("SMALLINT", Types.SMALLINT)) case t: DecimalType => Some( JdbcType(s"NUMERIC(${t.precision},${t.scale})", java.sql.Types.NUMERIC)) case ArrayType(et, _) if et.isInstanceOf[AtomicType] => getJDBCType(et).map(_.databaseTypeDefinition) .orElse(JdbcUtils.getCommonJDBCType(et).map(_.databaseTypeDefinition)) .map(typeName => JdbcType(s"$typeName[]", java.sql.Types.ARRAY)) case ByteType => throw new IllegalArgumentException(s"Unsupported type in postgresql: $dt"); case _ => None } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def beforeFetch(connection: Connection, properties: Map[String, String]): Unit = { super.beforeFetch(connection, properties) // According to the postgres jdbc documentation we need to be in autocommit=false if we actually // want to have fetchsize be non 0 (all the rows). This allows us to not have to cache all the // rows inside the driver when fetching. // // See: https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor // if (properties.getOrElse(JDBCOptions.JDBC_BATCH_FETCH_SIZE, "0").toInt > 0) { connection.setAutoCommit(false) } } override def isCascadingTruncateTable(): Option[Boolean] = Some(true) }
Example 19
Source File: DerbyDialect.scala From sparkoscope with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DerbyDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:derby") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) Option(FloatType) else None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case ByteType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case ShortType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case BooleanType => Option(JdbcType("BOOLEAN", java.sql.Types.BOOLEAN)) // 31 is the maximum precision and 5 is the default scale for a Derby DECIMAL case t: DecimalType if t.precision > 31 => Option(JdbcType("DECIMAL(31,5)", java.sql.Types.DECIMAL)) case _ => None } }
Example 20
Source File: DB2Dialect.scala From XSQL with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DB2Dialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:db2") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = sqlType match { case Types.REAL => Option(FloatType) case Types.OTHER => typeName match { case "DECFLOAT" => Option(DecimalType(38, 18)) case "XML" => Option(StringType) case t if (t.startsWith("TIMESTAMP")) => Option(TimestampType) // TIMESTAMP WITH TIMEZONE case _ => None } case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case BooleanType => Option(JdbcType("CHAR(1)", java.sql.Types.CHAR)) case ShortType | ByteType => Some(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case _ => None } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 21
Source File: MySQLDialect.scala From XSQL with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types.{BooleanType, DataType, LongType, MetadataBuilder} private case object MySQLDialect extends JdbcDialect { override def canHandle(url : String): Boolean = url.startsWith("jdbc:mysql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.VARBINARY && typeName.equals("BIT") && size != 1) { // This could instead be a BinaryType if we'd rather return bit-vectors of up to 64 bits as // byte arrays instead of longs. md.putLong("binarylong", 1) Option(LongType) } else if (sqlType == Types.BIT && typeName.equals("TINYINT")) { Option(BooleanType) } else None } override def quoteIdentifier(colName: String): String = { s"`$colName`" } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 22
Source File: PostgresDialect.scala From XSQL with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.{Connection, Types} import org.apache.spark.sql.execution.datasources.jdbc.{JDBCOptions, JdbcUtils} import org.apache.spark.sql.types._ private object PostgresDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:postgresql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) { Some(FloatType) } else if (sqlType == Types.SMALLINT) { Some(ShortType) } else if (sqlType == Types.BIT && typeName.equals("bit") && size != 1) { Some(BinaryType) } else if (sqlType == Types.OTHER) { Some(StringType) } else if (sqlType == Types.ARRAY) { val scale = md.build.getLong("scale").toInt // postgres array type names start with underscore toCatalystType(typeName.drop(1), size, scale).map(ArrayType(_)) } else None } private def toCatalystType( typeName: String, precision: Int, scale: Int): Option[DataType] = typeName match { case "bool" => Some(BooleanType) case "bit" => Some(BinaryType) case "int2" => Some(ShortType) case "int4" => Some(IntegerType) case "int8" | "oid" => Some(LongType) case "float4" => Some(FloatType) case "money" | "float8" => Some(DoubleType) case "text" | "varchar" | "char" | "cidr" | "inet" | "json" | "jsonb" | "uuid" => Some(StringType) case "bytea" => Some(BinaryType) case "timestamp" | "timestamptz" | "time" | "timetz" => Some(TimestampType) case "date" => Some(DateType) case "numeric" | "decimal" if precision > 0 => Some(DecimalType.bounded(precision, scale)) case "numeric" | "decimal" => // SPARK-26538: handle numeric without explicit precision and scale. Some(DecimalType. SYSTEM_DEFAULT) case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Some(JdbcType("TEXT", Types.CHAR)) case BinaryType => Some(JdbcType("BYTEA", Types.BINARY)) case BooleanType => Some(JdbcType("BOOLEAN", Types.BOOLEAN)) case FloatType => Some(JdbcType("FLOAT4", Types.FLOAT)) case DoubleType => Some(JdbcType("FLOAT8", Types.DOUBLE)) case ShortType => Some(JdbcType("SMALLINT", Types.SMALLINT)) case t: DecimalType => Some( JdbcType(s"NUMERIC(${t.precision},${t.scale})", java.sql.Types.NUMERIC)) case ArrayType(et, _) if et.isInstanceOf[AtomicType] => getJDBCType(et).map(_.databaseTypeDefinition) .orElse(JdbcUtils.getCommonJDBCType(et).map(_.databaseTypeDefinition)) .map(typeName => JdbcType(s"$typeName[]", java.sql.Types.ARRAY)) case ByteType => throw new IllegalArgumentException(s"Unsupported type in postgresql: $dt"); case _ => None } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) override def getTruncateQuery( table: String, cascade: Option[Boolean] = isCascadingTruncateTable): String = { cascade match { case Some(true) => s"TRUNCATE TABLE ONLY $table CASCADE" case _ => s"TRUNCATE TABLE ONLY $table" } } override def beforeFetch(connection: Connection, properties: Map[String, String]): Unit = { super.beforeFetch(connection, properties) // According to the postgres jdbc documentation we need to be in autocommit=false if we actually // want to have fetchsize be non 0 (all the rows). This allows us to not have to cache all the // rows inside the driver when fetching. // // See: https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor // if (properties.getOrElse(JDBCOptions.JDBC_BATCH_FETCH_SIZE, "0").toInt > 0) { connection.setAutoCommit(false) } } }
Example 23
Source File: DerbyDialect.scala From XSQL with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types._ private object DerbyDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:derby") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) Option(FloatType) else None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Option(JdbcType("CLOB", java.sql.Types.CLOB)) case ByteType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case ShortType => Option(JdbcType("SMALLINT", java.sql.Types.SMALLINT)) case BooleanType => Option(JdbcType("BOOLEAN", java.sql.Types.BOOLEAN)) // 31 is the maximum precision and 5 is the default scale for a Derby DECIMAL case t: DecimalType if t.precision > 31 => Option(JdbcType("DECIMAL(31,5)", java.sql.Types.DECIMAL)) case _ => None } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 24
Source File: GenericJdbcDialectTest.scala From eel-sdk with Apache License 2.0 | 5 votes |
package io.eels.component.jdbc import java.sql.Types import javax.sql.rowset.RowSetMetaDataImpl import io.eels.component.jdbc.dialect.GenericJdbcDialect import io.eels.schema._ import org.scalatest.{Matchers, WordSpec} class GenericJdbcDialectTest extends WordSpec with Matchers { "GenericJdbcDialect.fromJdbcType" should { "convert int field to signed IntType" in { val meta = new RowSetMetaDataImpl meta.setColumnCount(1) meta.setColumnType(1, Types.INTEGER) new GenericJdbcDialect().fromJdbcType(1, meta) shouldBe IntType.Signed } "convert bigint field to signed LongType" in { val meta = new RowSetMetaDataImpl meta.setColumnCount(1) meta.setColumnType(1, Types.BIGINT) new GenericJdbcDialect().fromJdbcType(1, meta) shouldBe LongType.Signed } } "GenericJdbcDialect" should { "convert int field to int type" in { new GenericJdbcDialect().toJdbcType(Field("a", IntType(true), false)) shouldBe "int" } "convert Boolean field to int type" in { new GenericJdbcDialect().toJdbcType(Field("b", BooleanType, false)) shouldBe "boolean" } "convert short field to SMALLINT type" in { new GenericJdbcDialect().toJdbcType(Field("a", ShortType.Signed, false)) shouldBe "smallint" } "convert String field to text" in { new GenericJdbcDialect().toJdbcType(Field("a", StringType, false)) shouldBe "text" } "convert varchar field to VARCHAR using size" in { new GenericJdbcDialect().toJdbcType(Field("a", VarcharType(242), false)) shouldBe "varchar(242)" } } }
Example 25
Source File: OracleJdbcDialect.scala From eel-sdk with Apache License 2.0 | 5 votes |
package io.eels.component.jdbc.dialect import java.sql.{ResultSetMetaData, Types} import com.sksamuel.exts.Logging import io.eels.component.jdbc.JdbcReaderConfig import io.eels.schema.{BooleanType, ByteType, DataType, DecimalType, DoubleType, Field, FloatType, IntType, LongType, Precision, Scale, ShortType} class OracleJdbcDialect extends GenericJdbcDialect with Logging { private val config = JdbcReaderConfig() // oracle uses its own timestamp types override def sanitize(value: Any): Any = { if (value == null) null else value match { case other if other.getClass.getName == "oracle.sql.TIMESTAMP" => value.getClass.getDeclaredMethod("timestampValue").invoke(value) case other => super.sanitize(other) } } override def toJdbcType(field: Field): String = field.dataType match { // https://docs.oracle.com/cd/E19501-01/819-3659/gcmaz/ case BooleanType => "NUMBER(1)" case IntType(_) => "NUMBER(10)" case LongType(_) => "NUMBER(19)" case FloatType => "NUMBER(19, 4)" case DoubleType => "NUMBER(19, 4)" case ByteType(_) => "NUMBER(3)" case ShortType(_) => "NUMBER(5)" case _ => super.toJdbcType(field) } private def decimalType(column: Int, metadata: ResultSetMetaData): DataType = { val precision = metadata.getPrecision(column) val scale = metadata.getScale(column) require(scale <= precision, "Scale must be less than precision") (precision, scale) match { // Jdbc returns precision == 0 and scale == -127 for NUMBER fields which have no precision/scale // http://stackoverflow.com/questions/593197/what-is-the-default-precision-and-scale-for-a-number-in-oracle case (0, _) => DecimalType(config.defaultPrecision, config.defaultScale) case (_, -127L) => DecimalType(config.defaultPrecision, config.defaultScale) case (x, 0) if x > 9 => LongType.Signed case (_, 0) => IntType.Signed case (_, _) => DecimalType(Precision(precision), Scale(scale)) } } override def fromJdbcType(column: Int, metadata: ResultSetMetaData): DataType = { metadata.getColumnType(column) match { case Types.DECIMAL | Types.NUMERIC => decimalType(column, metadata) case _ => super.fromJdbcType(column, metadata) } } }
Example 26
Source File: UJESSQLTypeParser.scala From Linkis with Apache License 2.0 | 5 votes |
package com.webank.wedatasphere.linkis.ujes.jdbc import java.sql.{Timestamp, Types} object UJESSQLTypeParser { def parserFromName(typeName: String): Int = { typeName match { case null => throw new UJESSQLException(UJESSQLErrorCode.METADATA_EMPTY) case "string" => Types.CHAR case "short" => Types.SMALLINT case "int" => Types.INTEGER case "long" => Types.BIGINT case "float" => Types.FLOAT case "double" => Types.DOUBLE case "boolean" => Types.BOOLEAN case "byte" => Types.TINYINT case "char" => Types.CHAR case "timestamp" => Types.TIMESTAMP case _ => throw new UJESSQLException(UJESSQLErrorCode.PREPARESTATEMENT_TYPEERROR) } } def parserFromVal(obj: Any): Int ={ obj match { case _: String => Types.CHAR case _: Short => Types.SMALLINT case _: Int => Types.INTEGER case _: Long => Types.BIGINT case _: Float => Types.FLOAT case _: Double => Types.DOUBLE case _: Boolean => Types.BOOLEAN case _: Byte => Types.TINYINT case _: Char => Types.CHAR case _: Timestamp => Types.TIMESTAMP case _ => throw new UJESSQLException(UJESSQLErrorCode.PREPARESTATEMENT_TYPEERROR) } } def parserFromMetaData(dataType: Int): String = { dataType match { case Types.CHAR => "string" case Types.SMALLINT => "short" case Types.INTEGER => "int" case Types.BIGINT => "long" case Types.FLOAT => "float" case Types.DOUBLE => "double" case Types.BOOLEAN => "boolean" case Types.TINYINT => "byte" case Types.CHAR => "char" case Types.TIMESTAMP => "timestamp" case _ => throw new UJESSQLException(UJESSQLErrorCode.PREPARESTATEMENT_TYPEERROR) } } }
Example 27
Source File: MySQLDialect.scala From drizzle-spark with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.Types import org.apache.spark.sql.types.{BooleanType, DataType, LongType, MetadataBuilder} private case object MySQLDialect extends JdbcDialect { override def canHandle(url : String): Boolean = url.startsWith("jdbc:mysql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.VARBINARY && typeName.equals("BIT") && size != 1) { // This could instead be a BinaryType if we'd rather return bit-vectors of up to 64 bits as // byte arrays instead of longs. md.putLong("binarylong", 1) Option(LongType) } else if (sqlType == Types.BIT && typeName.equals("TINYINT")) { Option(BooleanType) } else None } override def quoteIdentifier(colName: String): String = { s"`$colName`" } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def isCascadingTruncateTable(): Option[Boolean] = Some(false) }
Example 28
Source File: PostgresDialect.scala From drizzle-spark with Apache License 2.0 | 5 votes |
package org.apache.spark.sql.jdbc import java.sql.{Connection, Types} import org.apache.spark.sql.execution.datasources.jdbc.{JDBCOptions, JdbcUtils} import org.apache.spark.sql.types._ private object PostgresDialect extends JdbcDialect { override def canHandle(url: String): Boolean = url.startsWith("jdbc:postgresql") override def getCatalystType( sqlType: Int, typeName: String, size: Int, md: MetadataBuilder): Option[DataType] = { if (sqlType == Types.REAL) { Some(FloatType) } else if (sqlType == Types.SMALLINT) { Some(ShortType) } else if (sqlType == Types.BIT && typeName.equals("bit") && size != 1) { Some(BinaryType) } else if (sqlType == Types.OTHER) { Some(StringType) } else if (sqlType == Types.ARRAY) { val scale = md.build.getLong("scale").toInt // postgres array type names start with underscore toCatalystType(typeName.drop(1), size, scale).map(ArrayType(_)) } else None } private def toCatalystType( typeName: String, precision: Int, scale: Int): Option[DataType] = typeName match { case "bool" => Some(BooleanType) case "bit" => Some(BinaryType) case "int2" => Some(ShortType) case "int4" => Some(IntegerType) case "int8" | "oid" => Some(LongType) case "float4" => Some(FloatType) case "money" | "float8" => Some(DoubleType) case "text" | "varchar" | "char" | "cidr" | "inet" | "json" | "jsonb" | "uuid" => Some(StringType) case "bytea" => Some(BinaryType) case "timestamp" | "timestamptz" | "time" | "timetz" => Some(TimestampType) case "date" => Some(DateType) case "numeric" | "decimal" => Some(DecimalType.bounded(precision, scale)) case _ => None } override def getJDBCType(dt: DataType): Option[JdbcType] = dt match { case StringType => Some(JdbcType("TEXT", Types.CHAR)) case BinaryType => Some(JdbcType("BYTEA", Types.BINARY)) case BooleanType => Some(JdbcType("BOOLEAN", Types.BOOLEAN)) case FloatType => Some(JdbcType("FLOAT4", Types.FLOAT)) case DoubleType => Some(JdbcType("FLOAT8", Types.DOUBLE)) case ShortType => Some(JdbcType("SMALLINT", Types.SMALLINT)) case t: DecimalType => Some( JdbcType(s"NUMERIC(${t.precision},${t.scale})", java.sql.Types.NUMERIC)) case ArrayType(et, _) if et.isInstanceOf[AtomicType] => getJDBCType(et).map(_.databaseTypeDefinition) .orElse(JdbcUtils.getCommonJDBCType(et).map(_.databaseTypeDefinition)) .map(typeName => JdbcType(s"$typeName[]", java.sql.Types.ARRAY)) case ByteType => throw new IllegalArgumentException(s"Unsupported type in postgresql: $dt"); case _ => None } override def getTableExistsQuery(table: String): String = { s"SELECT 1 FROM $table LIMIT 1" } override def beforeFetch(connection: Connection, properties: Map[String, String]): Unit = { super.beforeFetch(connection, properties) // According to the postgres jdbc documentation we need to be in autocommit=false if we actually // want to have fetchsize be non 0 (all the rows). This allows us to not have to cache all the // rows inside the driver when fetching. // // See: https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor // if (properties.getOrElse(JDBCOptions.JDBC_BATCH_FETCH_SIZE, "0").toInt > 0) { connection.setAutoCommit(false) } } override def isCascadingTruncateTable(): Option[Boolean] = Some(true) }