diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e2e61cc87..d4320f449 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - scala: [ 3.3.1 ] + scala: [ 3.3.3 ] module: [ sqltest, db, bigdata ] steps: diff --git a/build.sbt b/build.sbt index 3111930c7..7f645b632 100644 --- a/build.sbt +++ b/build.sbt @@ -27,7 +27,7 @@ val isCommunityRemoteBuild = sys.props.getOrElse("communityRemote", "false").toBoolean lazy val scalatestVersion = - if (isCommunityRemoteBuild) "3.2.7" else "3.2.17" + if (isCommunityRemoteBuild) "3.2.7" else "3.2.18" lazy val baseModules = Seq[sbt.ClasspathDep[sbt.ProjectReference]]( `quill-sql` @@ -85,7 +85,8 @@ val filteredModules = { selectedModules } -val zioQuillVersion = "4.8.0" +val zioQuillVersion = "4.8.3" +val zioVersion = "2.0.21" lazy val `quill` = (project in file(".")) @@ -118,7 +119,7 @@ lazy val `quill-sql` = "com.lihaoyi" %% "pprint" % "0.8.1", "ch.qos.logback" % "logback-classic" % "1.5.3" % Test, "io.getquill" %% "quill-engine" % zioQuillVersion, - "dev.zio" %% "zio" % "2.0.19", + "dev.zio" %% "zio" % zioVersion, ("io.getquill" %% "quill-util" % zioQuillVersion) .excludeAll({ if (isCommunityBuild) @@ -170,7 +171,7 @@ lazy val `quill-caliban` = .settings( Test / fork := true, libraryDependencies ++= Seq( - "com.github.ghostdogpr" %% "caliban-quick" % "2.5.1", + "com.github.ghostdogpr" %% "caliban-quick" % "2.5.3", // Adding this to main dependencies would force users to use logback-classic for SLF4j unless the specifically remove it // seems to be safer to just exclude & add a commented about need for a SLF4j implementation in Docs. "ch.qos.logback" % "logback-classic" % "1.5.3" % Test, @@ -188,8 +189,8 @@ lazy val `quill-zio` = .settings( Test / fork := true, libraryDependencies ++= Seq( - "dev.zio" %% "zio" % "2.0.21", - "dev.zio" %% "zio-streams" % "2.0.21" + "dev.zio" %% "zio" % zioVersion, + "dev.zio" %% "zio-streams" % zioVersion ) ) .dependsOn(`quill-sql` % "compile->compile;test->test") @@ -239,8 +240,8 @@ lazy val `quill-cassandra-zio` = Test / fork := true, libraryDependencies ++= Seq( "com.datastax.oss" % "java-driver-core" % "4.17.0", - "dev.zio" %% "zio" % "2.0.21", - "dev.zio" %% "zio-streams" % "2.0.21" + "dev.zio" %% "zio" % zioVersion, + "dev.zio" %% "zio-streams" % zioVersion ) ) .dependsOn(`quill-cassandra` % "compile->compile;test->test") @@ -265,11 +266,11 @@ lazy val jdbcTestingLibraries = Seq( libraryDependencies ++= Seq( "com.zaxxer" % "HikariCP" % "5.1.0" exclude("org.slf4j", "*"), // In 8.0.22 error happens: Conversion from java.time.OffsetDateTime to TIMESTAMP is not supported - "com.mysql" % "mysql-connector-j" % "8.2.0" % Test, + "com.mysql" % "mysql-connector-j" % "8.3.0" % Test, "com.h2database" % "h2" % "2.2.224" % Test, // In 42.2.18 error happens: PSQLException: conversion to class java.time.OffsetTime from timetz not supported "org.postgresql" % "postgresql" % "42.7.3" % Test, - "org.xerial" % "sqlite-jdbc" % "3.42.0.1" % Test, + "org.xerial" % "sqlite-jdbc" % "3.45.2.0" % Test, // In 7.1.1-jre8-preview error happens: The conversion to class java.time.OffsetDateTime is unsupported. "com.microsoft.sqlserver" % "mssql-jdbc" % "7.4.1.jre11" % Test, "com.oracle.ojdbc" % "ojdbc8" % "19.3.0.0" % Test, @@ -289,7 +290,7 @@ lazy val basicSettings = Seq( excludeDependencies ++= Seq( ExclusionRule("org.scala-lang.modules", "scala-collection-compat_2.13") ), - scalaVersion := "3.3.1", + scalaVersion := "3.3.3", // The -e option is the 'error' report of ScalaTest. We want it to only make a log // of the failed tests once all tests are done, the regular -o log shows everything else. // Test / testOptions ++= Seq( diff --git a/project/build.properties b/project/build.properties index e8a1e246e..4d5f78cc4 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.9.7 +sbt.version=1.9.9 \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt index 31406b83d..083cc69ff 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,6 +4,6 @@ resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releas addDependencyTreePlugin -addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.9") +addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.11") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2") addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12") diff --git a/quill-sql-tests/src/test/scala/io/getquill/context/sql/idiom/SqlIdiomOptionCompareSpec.scala b/quill-sql-tests/src/test/scala/io/getquill/context/sql/idiom/SqlIdiomOptionCompareSpec.scala index 4461eab9c..2aa1bbdb9 100644 --- a/quill-sql-tests/src/test/scala/io/getquill/context/sql/idiom/SqlIdiomOptionCompareSpec.scala +++ b/quill-sql-tests/src/test/scala/io/getquill/context/sql/idiom/SqlIdiomOptionCompareSpec.scala @@ -107,35 +107,35 @@ class SqlIdiomOptionCompareSpec extends Spec { qr1.filter(t => t.o.exists(op => if (op != 1) false else true)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.o IS NOT NULL AND CASE WHEN t.o <> 1 THEN false ELSE true END" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE CASE WHEN t.o <> 1 THEN false ELSE true END AND t.o IS NOT NULL" } "forall" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.forall(op => op == 1)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o = 1)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o = 1 OR t.o IS NULL)" } "forall with null-check" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.forall(op => if (op != 1) false else true)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o IS NOT NULL AND CASE WHEN t.o <> 1 THEN false ELSE true END)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (CASE WHEN t.o <> 1 THEN false ELSE true END AND t.o IS NOT NULL OR t.o IS NULL)" } "filterIfDefined" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.filterIfDefined(op => op == 1)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o = 1)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o = 1 OR t.o IS NULL)" } "filter IfDefined with null-check" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.filterIfDefined(op => if (op != 1) false else true)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o IS NOT NULL AND CASE WHEN t.o <> 1 THEN false ELSE true END)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (CASE WHEN t.o <> 1 THEN false ELSE true END AND t.o IS NOT NULL OR t.o IS NULL)" } "embedded" - { case class TestEntity(optionalEmbedded: Option[EmbeddedEntity]) @@ -183,7 +183,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NOT NULL AND CASE WHEN t.optionalValue = 1 THEN true ELSE false END" + "SELECT t.optionalValue FROM TestEntity t WHERE CASE WHEN t.optionalValue = 1 THEN true ELSE false END AND t.optionalValue IS NOT NULL" } "forall" in { inline def q = quote { @@ -191,7 +191,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue = 1" + "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue = 1 OR t.optionalValue IS NULL" } "forall with null-check" in { inline def q = quote { @@ -199,7 +199,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue IS NOT NULL AND CASE WHEN t.optionalValue = 1 THEN true ELSE false END" + "SELECT t.optionalValue FROM TestEntity t WHERE CASE WHEN t.optionalValue = 1 THEN true ELSE false END AND t.optionalValue IS NOT NULL OR t.optionalValue IS NULL" } "filterIfDefined" in { inline def q = quote { @@ -207,7 +207,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue = 1" + "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue = 1 OR t.optionalValue IS NULL" } "filterIfDefined with null-check" in { inline def q = quote { @@ -215,7 +215,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue IS NOT NULL AND CASE WHEN t.optionalValue = 1 THEN true ELSE false END" + "SELECT t.optionalValue FROM TestEntity t WHERE CASE WHEN t.optionalValue = 1 THEN true ELSE false END AND t.optionalValue IS NOT NULL OR t.optionalValue IS NULL" } } } @@ -318,35 +318,35 @@ class SqlIdiomOptionCompareSpec extends Spec { qr1.filter(t => t.o.exists(op => if (op != 1) false else true)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.o IS NOT NULL AND CASE WHEN t.o <> 1 THEN false ELSE true END" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE CASE WHEN t.o <> 1 THEN false ELSE true END AND t.o IS NOT NULL" } "forall" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.forall(op => op == 1)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o = 1)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o = 1 OR t.o IS NULL)" } "forall with null-check" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.forall(op => if (op != 1) false else true)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o IS NOT NULL AND CASE WHEN t.o <> 1 THEN false ELSE true END)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (CASE WHEN t.o <> 1 THEN false ELSE true END AND t.o IS NOT NULL OR t.o IS NULL)" } "filterIfDefined" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.filterIfDefined(op => op == 1)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o = 1)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o = 1 OR t.o IS NULL)" } "filterIfDefined with null-check" in { inline def q = quote { qr1.filter(t => t.i != 1 && t.o.filterIfDefined(op => if (op != 1) false else true)) } testContext.run(q).string mustEqual - "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (t.o IS NULL OR t.o IS NOT NULL AND CASE WHEN t.o <> 1 THEN false ELSE true END)" + "SELECT t.s, t.i, t.l, t.o, t.b FROM TestEntity t WHERE t.i <> 1 AND (CASE WHEN t.o <> 1 THEN false ELSE true END AND t.o IS NOT NULL OR t.o IS NULL)" } "embedded" - { case class TestEntity(optionalEmbedded: Option[EmbeddedEntity]) @@ -394,7 +394,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NOT NULL AND CASE WHEN t.optionalValue = 1 THEN true ELSE false END" + "SELECT t.optionalValue FROM TestEntity t WHERE CASE WHEN t.optionalValue = 1 THEN true ELSE false END AND t.optionalValue IS NOT NULL" } "forall" in { inline def q = quote { @@ -402,7 +402,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue = 1" + "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue = 1 OR t.optionalValue IS NULL" } "forall with null-check" in { inline def q = quote { @@ -410,7 +410,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue IS NOT NULL AND CASE WHEN t.optionalValue = 1 THEN true ELSE false END" + "SELECT t.optionalValue FROM TestEntity t WHERE CASE WHEN t.optionalValue = 1 THEN true ELSE false END AND t.optionalValue IS NOT NULL OR t.optionalValue IS NULL" } "filterIfDefined" in { inline def q = quote { @@ -418,7 +418,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue = 1" + "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue = 1 OR t.optionalValue IS NULL" } "filterIfDefined with null-check" in { inline def q = quote { @@ -426,7 +426,7 @@ class SqlIdiomOptionCompareSpec extends Spec { } testContext.run(q).string mustEqual - "SELECT t.optionalValue FROM TestEntity t WHERE t.optionalValue IS NULL OR t.optionalValue IS NOT NULL AND CASE WHEN t.optionalValue = 1 THEN true ELSE false END" + "SELECT t.optionalValue FROM TestEntity t WHERE CASE WHEN t.optionalValue = 1 THEN true ELSE false END AND t.optionalValue IS NOT NULL OR t.optionalValue IS NULL" } } }