From 44792b7183c92c7a12782a0ba89febe872a38490 Mon Sep 17 00:00:00 2001 From: David Gregory Date: Tue, 7 Nov 2017 18:43:19 +0000 Subject: [PATCH] Fix invalid date / date-time literals --- .../sql/base/BaseStatementBuilder.scala | 9 +++++++-- .../sqlest/sql/BaseStatementBuilderSpec.scala | 8 ++++++++ .../sql/SelectStatementBuilderSpec.scala | 20 ++++++++++++++++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/sqlest/src/main/scala/sqlest/sql/base/BaseStatementBuilder.scala b/sqlest/src/main/scala/sqlest/sql/base/BaseStatementBuilder.scala index 0b31f79..b3e7544 100644 --- a/sqlest/src/main/scala/sqlest/sql/base/BaseStatementBuilder.scala +++ b/sqlest/src/main/scala/sqlest/sql/base/BaseStatementBuilder.scala @@ -18,8 +18,13 @@ package sqlest.sql.base import sqlest.ast._ import sqlest.ast.operations.ColumnOperations._ +import org.joda.time.{ LocalDate, DateTime } +import org.joda.time.format.{ DateTimeFormat, DateTimeFormatter } trait BaseStatementBuilder { + val dateTimeFormat: DateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS") + val localDateFormat: DateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd") + def preprocess(operation: Operation): Operation = aliasColumnsFromSubselects(operation) @@ -158,8 +163,8 @@ trait BaseStatementBuilder { case DoubleColumnType => value.toString case BigDecimalColumnType => value.toString case StringColumnType => "'" + escapeSqlString(value.toString) + "'" - case DateTimeColumnType => value.toString - case LocalDateColumnType => value.toString + case DateTimeColumnType => "'" + dateTimeFormat.print(value.asInstanceOf[DateTime]) + "'" + case LocalDateColumnType => "'" + localDateFormat.print(value.asInstanceOf[LocalDate]) + "'" case ByteArrayColumnType => javax.xml.bind.DatatypeConverter.printHexBinary(value.asInstanceOf[Array[Byte]]) case optionType: OptionColumnType[_, _] => value.asInstanceOf[Option[_]] match { case None if optionType.hasNullNullValue => "null" diff --git a/sqlest/src/test/scala/sqlest/sql/BaseStatementBuilderSpec.scala b/sqlest/src/test/scala/sqlest/sql/BaseStatementBuilderSpec.scala index 71b9ba0..ae13c1f 100644 --- a/sqlest/src/test/scala/sqlest/sql/BaseStatementBuilderSpec.scala +++ b/sqlest/src/test/scala/sqlest/sql/BaseStatementBuilderSpec.scala @@ -18,6 +18,7 @@ package sqlest.sql import org.scalatest._ import org.scalatest.matchers._ +import org.joda.time.{ LocalDate, DateTime } import sqlest._ import sqlest.ast._ @@ -77,6 +78,13 @@ trait BaseStatementBuilderSpec extends FlatSpec with Matchers { } object TableFive extends TableFive(None) + class TableSix(alias: Option[String]) extends Table("six", alias) { + val col1 = column[DateTime]("col1") + val col2 = column[LocalDate]("col2") + val col3 = column[Option[LocalDate]]("col3") + } + object TableSix extends TableSix(None) + class TestTableFunction(alias: Option[String]) extends TableFunction2[String, String]("testTableFunction", alias) { val col5 = column[String]("col5") val col6 = column[String]("col6") diff --git a/sqlest/src/test/scala/sqlest/sql/SelectStatementBuilderSpec.scala b/sqlest/src/test/scala/sqlest/sql/SelectStatementBuilderSpec.scala index 5ec539c..351b58c 100644 --- a/sqlest/src/test/scala/sqlest/sql/SelectStatementBuilderSpec.scala +++ b/sqlest/src/test/scala/sqlest/sql/SelectStatementBuilderSpec.scala @@ -16,7 +16,7 @@ package sqlest.sql -import org.joda.time.LocalDate +import org.joda.time.{ DateTime, LocalDate } import org.scalatest._ import org.scalatest.matchers._ import sqlest._ @@ -654,6 +654,24 @@ class SelectStatementBuilderSpec extends BaseStatementBuilderSpec { } } + "select with constant date and time values" should "produce valid SQL literals" in { + sql { + select(TableSix.col1) + .from(TableSix) + .where( + TableSix.col1 > new DateTime(2017, 11, 7, 18, 33, 54, 883).constant && + TableSix.col2 >= new LocalDate(1976, 1, 24).constant && + TableSix.col3 < Option(new LocalDate(1983, 10, 17)).constant + ) + } should equal( + s""" + |select six.col1 as six_col1 + |from six + |where (((six.col1 > '2017-11-07-18.33.54.883000') and (six.col2 >= '1976-01-24')) and (six.col3 < '1983-10-17'))""".formatSql, + List(Nil) + ) + } + "optimize" should "not be supported outside DB2" in { intercept[UnsupportedOperationException] { sql {