{-
Sections 17 and 19 in Foundation

This module covers the tests for transaction management (begin,
commit, savepoint, etc.), and session management (set).
-}


{-# LANGUAGE OverloadedStrings #-}
module Language.SQL.SimpleSQL.SQL2011Bits (sql2011BitsTests) where

import Language.SQL.SimpleSQL.TestTypes
import Language.SQL.SimpleSQL.Syntax

sql2011BitsTests :: TestItem
sql2011BitsTests = Group "sql 2011 bits tests" [

{-
17 Transaction management

17.1 <start transaction statement>

<start transaction statement> ::=
  START TRANSACTION [ <transaction characteristics> ]

BEGIN is not in the standard!
-}

     (TestStatement ansi2011
      "start transaction"
     $ StartTransaction)

{-
17.2 <set transaction statement>

<set transaction statement> ::=
  SET [ LOCAL ] TRANSACTION <transaction characteristics>

17.3 <transaction characteristics>

<transaction characteristics> ::=
      [ <transaction mode> [ { <comma> <transaction mode> }... ] ]

<transaction mode> ::=
    <isolation level>
  | <transaction access mode>
  | <diagnostics size>

<transaction access mode> ::=
    READ ONLY
  | READ WRITE

<isolation level> ::=
  ISOLATION LEVEL <level of isolation>

<level of isolation> ::=
    READ UNCOMMITTED
  | READ COMMITTED
  | REPEATABLE READ
  | SERIALIZABLE

<diagnostics size> ::=
  DIAGNOSTICS SIZE <number of conditions>

<number of conditions> ::=
  <simple value specification>

17.4 <set constraints mode statement>

<set constraints mode statement> ::=
  SET CONSTRAINTS <constraint name list> { DEFERRED | IMMEDIATE }

<constraint name list> ::=
    ALL
  | <constraint name> [ { <comma> <constraint name> }... ]

17.5 <savepoint statement>

<savepoint statement> ::=
  SAVEPOINT <savepoint specifier>

<savepoint specifier> ::=
  <savepoint name>
-}

    ,(TestStatement ansi2011
      "savepoint difficult_bit"
     $ Savepoint $ Name Nothing "difficult_bit")


{-
17.6 <release savepoint statement>

<release savepoint statement> ::=
  RELEASE SAVEPOINT <savepoint specifier>
-}

    ,(TestStatement ansi2011
      "release savepoint difficult_bit"
     $ ReleaseSavepoint $ Name Nothing "difficult_bit")


{-
17.7 <commit statement>

<commit statement> ::=
  COMMIT [ WORK ] [ AND [ NO ] CHAIN ]
-}

    ,(TestStatement ansi2011
      "commit"
     $ Commit)

    ,(TestStatement ansi2011
      "commit work"
     $ Commit)


{-
17.8 <rollback statement>

<rollback statement> ::=
  ROLLBACK [ WORK ] [ AND [ NO ] CHAIN ] [ <savepoint clause> ]

<savepoint clause> ::=
  TO SAVEPOINT <savepoint specifier>
-}

    ,(TestStatement ansi2011
      "rollback"
     $ Rollback Nothing)

    ,(TestStatement ansi2011
      "rollback work"
     $ Rollback Nothing)

    ,(TestStatement ansi2011
      "rollback to savepoint difficult_bit"
     $ Rollback $ Just $ Name Nothing "difficult_bit")


{-
19 Session management

19.1 <set session characteristics statement>

<set session characteristics statement> ::=
  SET SESSION CHARACTERISTICS AS <session characteristic list>

<session characteristic list> ::=
  <session characteristic> [ { <comma> <session characteristic> }... ]

<session characteristic> ::=
  <session transaction characteristics>

<session transaction characteristics> ::=
  TRANSACTION <transaction mode> [ { <comma> <transaction mode> }... ]

19.2 <set session user identifier statement>

<set session user identifier statement> ::=
  SET SESSION AUTHORIZATION <value specification>

19.3 <set role statement>

<set role statement> ::=
  SET ROLE <role specification>

<role specification> ::=
    <value specification>
  | NONE

19.4 <set local time zone statement>

<set local time zone statement> ::=
  SET TIME ZONE <set time zone value>

<set time zone value> ::=
    <interval value expression>
  | LOCAL

19.5 <set catalog statement>

<set catalog statement> ::=
  SET <catalog name characteristic>

<catalog name characteristic> ::=
  CATALOG <value specification>

19.6 <set schema statement>

<set schema statement> ::=
  SET <schema name characteristic>

<schema name characteristic> ::=
  SCHEMA <value specification>

19.7 <set names statement>

<set names statement> ::=
  SET <character set name characteristic>

<character set name characteristic> ::=
  NAMES <value specification>

19.8 <set path statement>

<set path statement> ::=
  SET <SQL-path characteristic>

<SQL-path characteristic> ::=
  PATH <value specification>

19.9 <set transform group statement>

<set transform group statement> ::=
  SET <transform group characteristic>

<transform group characteristic> ::=
    DEFAULT TRANSFORM GROUP <value specification>
  | TRANSFORM GROUP FOR TYPE <path-resolved user-defined type name> <value specification>

19.10 <set session collation statement>

<set session collation statement> ::=
    SET COLLATION <collation specification> [ FOR <character set specification list> ]
  | SET NO COLLATION [ FOR <character set specification list> ]

<collation specification> ::=
  <value specification>
-}

   ]