diff --git a/bin/local b/bin/local index d36bb84dd..3e5f28001 100755 --- a/bin/local +++ b/bin/local @@ -28,4 +28,4 @@ esac export SERVER_KEY=$(cat world/server.key) export SERVER_CERT=$(cat world/server.crt) -docker-compose $CMD $EXTRA_FLAGS +docker compose $CMD $EXTRA_FLAGS diff --git a/modules/core/shared/src/main/scala/data/Completion.scala b/modules/core/shared/src/main/scala/data/Completion.scala index 70fdbf518..44e6f8495 100644 --- a/modules/core/shared/src/main/scala/data/Completion.scala +++ b/modules/core/shared/src/main/scala/data/Completion.scala @@ -64,6 +64,7 @@ object Completion { case object Grant extends Completion case object Revoke extends Completion case object AlterIndex extends Completion + case class Merge(count: Int) extends Completion // more ... /** diff --git a/modules/core/shared/src/main/scala/net/message/CommandComplete.scala b/modules/core/shared/src/main/scala/net/message/CommandComplete.scala index 7bdcaaade..d759399a9 100644 --- a/modules/core/shared/src/main/scala/net/message/CommandComplete.scala +++ b/modules/core/shared/src/main/scala/net/message/CommandComplete.scala @@ -41,6 +41,7 @@ object CommandComplete { val Update: Regex = """UPDATE (\d+)""".r val Insert: Regex = """INSERT (\d+ \d+)""".r val Copy: Regex = """COPY (\d+)""".r + val Merge: Regex = """MERGE (\d+)""".r } //TODO: maybe make lazy val @@ -102,6 +103,7 @@ object CommandComplete { case "GRANT" => apply(Completion.Grant) case "REVOKE" => apply(Completion.Revoke) case "ALTER INDEX" => apply(Completion.AlterIndex) + case Patterns.Merge(s) => apply(Completion.Merge(s.toInt)) // more .. fill in as we hit them case s => apply(Completion.Unknown(s)) diff --git a/modules/tests/shared/src/test/scala/CommandTest.scala b/modules/tests/shared/src/test/scala/CommandTest.scala index 96458e142..3e7b5f471 100644 --- a/modules/tests/shared/src/test/scala/CommandTest.scala +++ b/modules/tests/shared/src/test/scala/CommandTest.scala @@ -94,6 +94,13 @@ class CommandTest extends SkunkTest { WHERE id = $int4 """.command + val mergeCity: Command[Int] = + sql""" + MERGE INTO city + USING (VALUES ($int4)) t(city_id) ON t.city_id = city.id + WHEN MATCHED THEN DELETE + """.command + val createTable: Command[Void] = sql""" CREATE TABLE IF NOT EXISTS earth ( @@ -524,6 +531,26 @@ class CommandTest extends SkunkTest { } yield "ok" } + sessionTest("merge a record") { s => + s.unique(sql"SHOW server_version".query(skunk.codec.all.text)) + .flatMap { version => + val majorVersion = version.substring(0, 2).toInt + if (majorVersion >= 15) { + for { + c <- s.prepare(insertCity).flatMap(_.execute(Garin)) + _ <- assert("completion", c == Completion.Insert(1)) + c <- s.prepare(mergeCity).flatMap(_.execute(Garin.id)) + _ <- assert("merge", c == Completion.Merge(1)) + c <- s.prepare(selectCity).flatMap(_.option(Garin.id)) + _ <- assert("read", c == None) + _ <- s.execute(deleteCity)(Garin.id) + _ <- s.assertHealthy + } yield "ok" + } + else IO.pure("skip") + } + } + sessionTest("pipe") { s => for { _ <- s.execute(sql"delete from city where name like 'Pipe%'".command)