packages feed

hssqlppp-0.6.2: tests/Database/HsSqlPpp/Tests/Parsing/Plpgsql.lhs


> {-# LANGUAGE OverloadedStrings #-}
> module Database.HsSqlPpp.Tests.Parsing.Plpgsql (pgplsql) where
>
> import Database.HsSqlPpp.Syntax

> import Database.HsSqlPpp.Tests.Parsing.Utils
> import Database.HsSqlPpp.Tests.TestTypes
> import Database.HsSqlPpp.Dialect

> pgplsql :: Item
> pgplsql =
>   Group "plpgsql" [
>     Group "simple plpgsql statements" [
>       f "success := true;"
>       [Assignment ea (name "success") lTrue]
>      ,f "success = true;"
>       [Assignment ea (name "success") lTrue]
>      ,f "return true;"
>       [Return ea $ Just lTrue]
>      ,f "return;"
>       [Return ea Nothing]
>      ,f "return next 1;"
>       [ReturnNext ea $ num "1"]
>      ,f "return query select a from b;"
>       [ReturnQuery ea $ makeSelect {selSelectList = sl [si $ ei "a"]
>                                    ,selTref = [tref "b"]}]
>      ,f "raise notice 'stuff %', 1;"
>       [Raise ea RNotice "stuff %" [num "1"]]
>      ,f "perform test();"
>       [Perform ea $ app "test" []]
>      ,f "perform test(a,b);"
>       [Perform ea $ app "test" [ei "a", ei "b"]]
>      ,f "perform test(r.relvar_name || '_and_stuff');"
>       [Perform ea $ app "test" [
>                     binop "||" (eqi "r" "relvar_name")
>                                (stringQ "_and_stuff")]]
>      ,f "select into a,b c,d from e;"
>       [Into ea False [name "a", name "b"]
>        $ QueryStatement ea
>        $ makeSelect {selSelectList = sl [si $ ei "c", si $ ei "d"]
>                     ,selTref = [tref "e"]}]
>      ,f "select c,d into a,b from e;"
>       [Into ea False [name "a", name "b"]
>        $ QueryStatement ea
>        $ makeSelect {selSelectList = sl [si $ ei "c", si $ ei "d"]
>                     ,selTref = [tref "e"]}]
>      ,f "delete from pieces where x = 1 and y = 1 returning tag into r.tag;"
>       [Into ea False [qn "r" "tag"]
>        $ Delete ea (name "pieces") []
>          (Just $ binop "and" (binop "=" (ei "x") (num "1"))
>                               (binop "=" (ei "y") (num "1")))
>          (Just $ sl [si $ ei "tag"])]
>      ,f "update pieces\n\
>         \set a=b returning tag into r.tag;"
>       [Into ea False [qn "r" "tag"]
>          $ Update ea (name "pieces")
>                [SetClause ea (Nmc "a") $ ei "b"]
>                []
>                Nothing
>                (Just $ sl $ [si $ ei "tag"])]
>      ,f "insert into t(a) values (1) returning id into x;"
>       [Into ea False [Name ea [Nmc "x"]]
>        $ Insert ea
>         (name "t")
>         [Nmc "a"]
>         (Values ea [[num "1"]])
>         (Just $ sl [si $ ei "id"])]

>      ,f "update t\n\
>         \  set x = 1 returning id into z;"
>       [Into ea False [Name ea [Nmc "z"]]
>       $ Update ea (name "t") [SetClause ea (Nmc "x") $ num "1"]
>         [] Nothing (Just $ sl [si $ ei "id"])]

>      ,f "execute s;"
>       [Execute ea (ei "s")]
>      ,f "execute s into r;"
>       [Into ea False [Name ea [Nmc "r"]] (Execute ea (ei "s"))]
>     ,f "continue;" [ContinueStatement ea Nothing]
>     ]
>
>     ,Group "other plpgsql statements" [
>       f "for r in select a from tbl loop\n\
>         \null;\n\
>         \end loop;"
>       [ForQueryStatement ea Nothing (Nmc "r")
>        (makeSelect {selSelectList = sl [si $ ei "a"]
>                    ,selTref = [tref "tbl"]})
>        [NullStatement ea]]
>      ,f "for r in select a from tbl where true loop\n\
>         \null;\n\
>         \end loop;"
>       [ForQueryStatement ea Nothing (Nmc "r")
>        (makeSelect {selSelectList = sl [si $ ei "a"]
>                    ,selTref = [tref "tbl"]
>                    ,selWhere = Just lTrue})
>        [NullStatement ea]]
>      ,f "for r in 1 .. 10 loop\n\
>         \null;\n\
>         \end loop;"
>       [ForIntegerStatement ea Nothing (Nmc "r")
>        (num "1") (num "10")
>        [NullStatement ea]]
>       -- catch a bug in lexing where 1..10 is parsed as
>       -- num "1.", num ".10", instead of num 1, symbol "..", num 10
>      ,f "for r in 1..10 loop\n\
>         \null;\n\
>         \end loop;"
>       [ForIntegerStatement ea Nothing (Nmc "r")
>        (num "1") (num "10")
>        [NullStatement ea]]
>
>      ,f "if a=b then\n\
>         \  update c set d = e;\n\
>         \end if;"
>       [If ea [(binop "=" (ei "a") (ei "b")
>               ,[Update ea (name "c") [SetClause ea (Nmc "d")
>                                      $ ei "e"] [] Nothing Nothing])]
>        []]
>      ,f "if true then\n\
>         \  null;\n\
>         \else\n\
>         \  null;\n\
>         \end if;"
>       [If ea [(lTrue,[NullStatement ea])]
>        [NullStatement ea]]
>      ,f "if true then\n\
>         \  null;\n\
>         \elseif false then\n\
>         \  return;\n\
>         \end if;"
>       [If ea [(lTrue, [NullStatement ea])
>              ,(lFalse, [Return ea Nothing])]
>        []]
>      ,f "if true then\n\
>         \  null;\n\
>         \elseif false then\n\
>         \  return;\n\
>         \elsif false then\n\
>         \  return;\n\
>         \else\n\
>         \  return;\n\
>         \end if;"
>       [If ea [(lTrue, [NullStatement ea])
>              ,(lFalse, [Return ea Nothing])
>              ,(lFalse, [Return ea Nothing])]
>        [Return ea Nothing]]
>      ,f "case a\n\
>         \  when b then null;\n\
>         \  when c,d then null;\n\
>         \  else null;\n\
>         \end case;"
>      [CaseStatementSimple ea (ei "a")
>       [([ei "b"], [NullStatement ea])
>       ,([ei "c", ei "d"], [NullStatement ea])]
>       [NullStatement ea]]
>     ]]
>  where
>    f = ParseProcSql defaultParseFlags {pfDialect=postgresDialect}