diff --git a/modules/core/shared/src/main/scala/data/Completion.scala b/modules/core/shared/src/main/scala/data/Completion.scala index 2f46ca766..63e916888 100644 --- a/modules/core/shared/src/main/scala/data/Completion.scala +++ b/modules/core/shared/src/main/scala/data/Completion.scala @@ -7,48 +7,51 @@ import skunk.exception.SkunkException sealed abstract class Completion object Completion { - case object Begin extends Completion - case object Commit extends Completion - case object CreateIndex extends Completion - case class Delete(count: Int) extends Completion - case object DropIndex extends Completion - case object Listen extends Completion - case object LockTable extends Completion - case object Notify extends Completion - case object Reset extends Completion - case object Rollback extends Completion - case object Savepoint extends Completion - case class Select(count: Int) extends Completion - case object Set extends Completion - case object Truncate extends Completion - case object Unlisten extends Completion - case class Update(count: Int) extends Completion - case class Insert(count: Int) extends Completion - case object CreateTable extends Completion - case object DropTable extends Completion - case object AlterTable extends Completion - case object CreateSchema extends Completion - case object DropSchema extends Completion - case object CreateType extends Completion - case object DropType extends Completion - case object CreateFunction extends Completion - case class Copy(count: Int) extends Completion - case object Show extends Completion - case object Do extends Completion - case object CreateView extends Completion - case object DropView extends Completion - case object CreateProcedure extends Completion - case object DropProcedure extends Completion - case object Call extends Completion - case object CreateDomain extends Completion - case object DropDomain extends Completion - case object CreateSequence extends Completion - case object AlterSequence extends Completion - case object DropSequence extends Completion - case object CreateDatabase extends Completion - case object DropDatabase extends Completion - case object CreateRole extends Completion - case object DropRole extends Completion + case object Begin extends Completion + case object Commit extends Completion + case object CreateIndex extends Completion + case class Delete(count: Int) extends Completion + case object DropIndex extends Completion + case object Listen extends Completion + case object LockTable extends Completion + case object Notify extends Completion + case object Reset extends Completion + case object Rollback extends Completion + case object Savepoint extends Completion + case class Select(count: Int) extends Completion + case object Set extends Completion + case object Truncate extends Completion + case object Unlisten extends Completion + case class Update(count: Int) extends Completion + case class Insert(count: Int) extends Completion + case object CreateTable extends Completion + case object DropTable extends Completion + case object AlterTable extends Completion + case object CreateSchema extends Completion + case object DropSchema extends Completion + case object CreateType extends Completion + case object DropType extends Completion + case object CreateFunction extends Completion + case class Copy(count: Int) extends Completion + case object Show extends Completion + case object Do extends Completion + case object CreateView extends Completion + case object DropView extends Completion + case object CreateProcedure extends Completion + case object DropProcedure extends Completion + case object Call extends Completion + case object CreateDomain extends Completion + case object DropDomain extends Completion + case object CreateSequence extends Completion + case object AlterSequence extends Completion + case object DropSequence extends Completion + case object CreateDatabase extends Completion + case object DropDatabase extends Completion + case object CreateRole extends Completion + case object DropRole extends Completion + case object CreateMaterializedView extends Completion + case object RefreshMaterializedView extends Completion + case object DropMaterializedView 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 c989db9ea..804b6c1ab 100644 --- a/modules/core/shared/src/main/scala/net/message/CommandComplete.scala +++ b/modules/core/shared/src/main/scala/net/message/CommandComplete.scala @@ -45,48 +45,51 @@ object CommandComplete { //TODO: maybe make lazy val def decoder: Decoder[CommandComplete] = utf8z.map { - case "BEGIN" => apply(Completion.Begin) - case "COMMIT" => apply(Completion.Commit) - case "CREATE INDEX" => apply(Completion.CreateIndex) - case "DROP INDEX" => apply(Completion.DropIndex) - case "LISTEN" => apply(Completion.Listen) - case "LOCK TABLE" => apply(Completion.LockTable) - case "NOTIFY" => apply(Completion.Notify) - case "RESET" => apply(Completion.Reset) - case "SET" => apply(Completion.Set) - case "TRUNCATE TABLE" => apply(Completion.Truncate) - case "UNLISTEN" => apply(Completion.Unlisten) - case "ROLLBACK" => apply(Completion.Rollback) - case "SAVEPOINT" => apply(Completion.Savepoint) - case "CREATE TABLE" => apply(Completion.CreateTable) - case "DROP TABLE" => apply(Completion.DropTable) - case "ALTER TABLE" => apply(Completion.AlterTable) - case "CREATE SCHEMA" => apply(Completion.CreateSchema) - case "DROP SCHEMA" => apply(Completion.DropSchema) - case "CREATE TYPE" => apply(Completion.CreateType) - case "DROP TYPE" => apply(Completion.DropType) - case "CREATE FUNCTION" => apply(Completion.CreateFunction) - case "SHOW" => apply(Completion.Show) - case "DO" => apply(Completion.Do) - case "CREATE PROCEDURE" => apply(Completion.CreateProcedure) - case "DROP PROCEDURE" => apply(Completion.DropProcedure) - case "CALL" => apply(Completion.Call) - case "CREATE VIEW" => apply(Completion.CreateView) - case "DROP VIEW" => apply(Completion.DropView) - case "CREATE DOMAIN" => apply(Completion.CreateDomain) - case "DROP DOMAIN" => apply(Completion.DropDomain) - case "CREATE SEQUENCE" => apply(Completion.CreateSequence) - case "ALTER SEQUENCE" => apply(Completion.AlterSequence) - case "DROP SEQUENCE" => apply(Completion.DropSequence) - case "CREATE DATABASE" => apply(Completion.CreateDatabase) - case "DROP DATABASE" => apply(Completion.DropDatabase) - case "CREATE ROLE" => apply(Completion.CreateRole) - case "DROP ROLE" => apply(Completion.DropRole) - case Patterns.Select(s) => apply(Completion.Select(s.toInt)) - case Patterns.Delete(s) => apply(Completion.Delete(s.toInt)) - case Patterns.Update(s) => apply(Completion.Update(s.toInt)) - case Patterns.Insert(s) => apply(Completion.Insert(s.drop(2).toInt)) - case Patterns.Copy(s) => apply(Completion.Copy(s.toInt)) + case "BEGIN" => apply(Completion.Begin) + case "COMMIT" => apply(Completion.Commit) + case "CREATE INDEX" => apply(Completion.CreateIndex) + case "DROP INDEX" => apply(Completion.DropIndex) + case "LISTEN" => apply(Completion.Listen) + case "LOCK TABLE" => apply(Completion.LockTable) + case "NOTIFY" => apply(Completion.Notify) + case "RESET" => apply(Completion.Reset) + case "SET" => apply(Completion.Set) + case "TRUNCATE TABLE" => apply(Completion.Truncate) + case "UNLISTEN" => apply(Completion.Unlisten) + case "ROLLBACK" => apply(Completion.Rollback) + case "SAVEPOINT" => apply(Completion.Savepoint) + case "CREATE TABLE" => apply(Completion.CreateTable) + case "DROP TABLE" => apply(Completion.DropTable) + case "ALTER TABLE" => apply(Completion.AlterTable) + case "CREATE SCHEMA" => apply(Completion.CreateSchema) + case "DROP SCHEMA" => apply(Completion.DropSchema) + case "CREATE TYPE" => apply(Completion.CreateType) + case "DROP TYPE" => apply(Completion.DropType) + case "CREATE FUNCTION" => apply(Completion.CreateFunction) + case "SHOW" => apply(Completion.Show) + case "DO" => apply(Completion.Do) + case "CREATE PROCEDURE" => apply(Completion.CreateProcedure) + case "DROP PROCEDURE" => apply(Completion.DropProcedure) + case "CALL" => apply(Completion.Call) + case "CREATE VIEW" => apply(Completion.CreateView) + case "DROP VIEW" => apply(Completion.DropView) + case "CREATE DOMAIN" => apply(Completion.CreateDomain) + case "DROP DOMAIN" => apply(Completion.DropDomain) + case "CREATE SEQUENCE" => apply(Completion.CreateSequence) + case "ALTER SEQUENCE" => apply(Completion.AlterSequence) + case "DROP SEQUENCE" => apply(Completion.DropSequence) + case "CREATE DATABASE" => apply(Completion.CreateDatabase) + case "DROP DATABASE" => apply(Completion.DropDatabase) + case "CREATE ROLE" => apply(Completion.CreateRole) + case "DROP ROLE" => apply(Completion.DropRole) + case "CREATE MATERIALIZED VIEW" => apply(Completion.CreateMaterializedView) + case "REFRESH MATERIALIZED VIEW" => apply(Completion.RefreshMaterializedView) + case "DROP MATERIALIZED VIEW" => apply(Completion.DropMaterializedView) + case Patterns.Select(s) => apply(Completion.Select(s.toInt)) + case Patterns.Delete(s) => apply(Completion.Delete(s.toInt)) + case Patterns.Update(s) => apply(Completion.Update(s.toInt)) + case Patterns.Insert(s) => apply(Completion.Insert(s.drop(2).toInt)) + case Patterns.Copy(s) => apply(Completion.Copy(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 a5eed1295..60d011430 100644 --- a/modules/tests/shared/src/test/scala/CommandTest.scala +++ b/modules/tests/shared/src/test/scala/CommandTest.scala @@ -194,6 +194,33 @@ class CommandTest extends SkunkTest { DROP ROLE skunk_role """.command + val createMaterializedView: Command[Void] = + sql""" + CREATE MATERIALIZED VIEW IF NOT EXISTS my_foo_mv + AS + SELECT now() + """.command + + val createUniqueIndexForMaterializedView: Command[Void] = + sql""" + CREATE UNIQUE INDEX IF NOT exists my_foo_mv_unique ON my_foo_mv(now) + """.command + + val refreshMaterializedView: Command[Void] = + sql""" + REFRESH MATERIALIZED VIEW my_foo_mv + """.command + + val refreshMaterializedViewConcurrently: Command[Void] = + sql""" + REFRESH MATERIALIZED VIEW CONCURRENTLY my_foo_mv + """.command + + val dropMaterializedView: Command[Void] = + sql""" + DROP MATERIALIZED VIEW my_foo_mv + """.command + sessionTest("create table, create index, drop index, alter table and drop table") { s => for { c <- s.execute(createTable) @@ -230,6 +257,23 @@ class CommandTest extends SkunkTest { } yield "ok" } + sessionTest("refresh materialized view, refresh materialized view concurrently") { s => + for { + c <- s.execute(createMaterializedView) + _ <- assert("completion", c == Completion.Select(1)) + c <- s.execute(createMaterializedView) + _ <- assert("completion", c == Completion.CreateMaterializedView) + c <- s.execute(refreshMaterializedView) + _ <- assert("completion", c == Completion.RefreshMaterializedView) + c <- s.execute(createUniqueIndexForMaterializedView) + _ <- assert("completion", c == Completion.CreateIndex) + c <- s.execute(refreshMaterializedViewConcurrently) + _ <- assert("completion", c == Completion.RefreshMaterializedView) + c <- s.execute(dropMaterializedView) + _ <- assert("completion", c == Completion.DropMaterializedView) + } yield "ok" + } + sessionTest("create, call and drop procedure"){ s=> for{ c <- s.execute(createProcedure) @@ -283,7 +327,7 @@ class CommandTest extends SkunkTest { } yield "ok" } - sessionTest("do command"){ s=> + sessionTest("do command") { s => for{ c <- s.execute(doCommand) _ <- assert("completion", c == Completion.Do)