hssqlppp-0.4.2: src-extra/tests/Database/HsSqlPpp/Tests/Parsing/Plpgsql.lhs
> {-# LANGUAGE OverloadedStrings #-}
> module Database.HsSqlPpp.Tests.Parsing.Plpgsql (pgplsqlParsingTestData) where
>
> import Database.HsSqlPpp.Ast
> import Database.HsSqlPpp.Tests.Parsing.Utils
> pgplsqlParsingTestData:: Item
> pgplsqlParsingTestData =
> Group "plpgsql" [
> Group "simple plpgsql statements" [
> f "success := true;"
> [Assignment ea (Name ea ["success"]) (BooleanLit ea True)]
> ,f "success = true;"
> [Assignment ea (Name ea ["success"]) (BooleanLit ea True)]
> ,f "return true;"
> [Return ea $ Just (BooleanLit ea True)]
> ,f "return;"
> [Return ea Nothing]
> ,f "return next 1;"
> [ReturnNext ea $ NumberLit ea "1"]
> ,f "return query select a from b;"
> [ReturnQuery ea $ selectFrom [selI "a"] (Tref ea (i "b") (NoAlias ea))]
> ,f "raise notice 'stuff %', 1;"
> [Raise ea RNotice "stuff %" [NumberLit ea "1"]]
> ,f "perform test();"
> [Perform ea $ FunCall ea (name "test") []]
> ,f "perform test(a,b);"
> [Perform ea $ FunCall ea (name "test") [Identifier ea "a", Identifier ea "b"]]
> ,f "perform test(r.relvar_name || '_and_stuff');"
> [Perform ea $ FunCall ea (name "test") [
> FunCall ea (name "||") [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 $ Select ea Dupes (SelectList ea [selI "c", selI "d"])
> [Tref ea (i "e") (NoAlias ea)] Nothing [] Nothing [] Nothing Nothing]
> ,f "select c,d into a,b from e;"
> [Into ea False [name "a", name "b"]
> $ QueryStatement ea $ Select ea Dupes (SelectList ea [selI "c", selI "d"])
> [Tref ea (i "e") (NoAlias ea)] Nothing [] Nothing [] Nothing Nothing]
> ,f "delete from pieces where x = 1 and y = 1 returning tag into r.tag;"
> [Into ea False [Name ea [Nmc "r",Nmc "tag"]]
> $ Delete ea (dqi "pieces") []
> (Just $ funCall "!and" [funCall "=" [ei "x",num "1"]
> ,funCall "=" [ei "y",num "1"]])
> (Just $ sl [selI "tag"])]
> ,f "update pieces\n\
> \set a=b returning tag into r.tag;"
> [Into ea False [Name ea [Nmc "r",Nmc "tag"]]
> $ Update ea (dqi "pieces")
> [SetClause ea (Nmc "a") $ Identifier ea "b"]
> []
> Nothing (Just (SelectList ea
> [SelExp ea (Identifier ea "tag")]))]
> ,f "insert into t(a) values (1) returning id into x;"
> [Into ea False [Name ea [Nmc "x"]]
> $ Insert ea
> (dqi "t")
> [Nmc "a"]
> (Values ea [[NumberLit ea "1"]])
> (Just $ sl [selI "id"])]
> ,f "update t\n\
> \ set x = 1 returning id into z;"
> [Into ea False [Name ea [Nmc "z"]]
> $ Update ea (dqi "t") [SetClause ea (Nmc "x") $ NumberLit ea "1"]
> [] Nothing (Just $ sl [selI "id"])]
> ,f "execute s;"
> [Execute ea (Identifier ea "s")]
> ,f "execute s into r;"
> [Into ea False [Name ea [Nmc "r"]] (Execute ea (Identifier ea "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") (selectFrom [selI "a"] (Tref ea (i "tbl") (NoAlias ea)))
> [NullStatement ea]]
> ,f "for r in select a from tbl where true loop\n\
> \null;\n\
> \end loop;"
> [ForQueryStatement ea Nothing (Nmc "r")
> (selectFromWhere [selI "a"] (Tref ea (i "tbl") (NoAlias ea)) (BooleanLit ea True))
> [NullStatement ea]]
> ,f "for r in 1 .. 10 loop\n\
> \null;\n\
> \end loop;"
> [ForIntegerStatement ea Nothing (Nmc "r")
> (NumberLit ea "1") (NumberLit ea "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")
> (NumberLit ea "1") (NumberLit ea "10")
> [NullStatement ea]]
>
> ,f "if a=b then\n\
> \ update c set d = e;\n\
> \end if;"
> [If ea [(FunCall ea (name "=") [ei "a", ei "b"]
> ,[Update ea (dqi "c") [SetClause ea (Nmc "d")
> $ ei "e"] [] Nothing Nothing])]
> []]
> ,f "if true then\n\
> \ null;\n\
> \else\n\
> \ null;\n\
> \end if;"
> [If ea [(BooleanLit ea True,[NullStatement ea])]
> [NullStatement ea]]
> ,f "if true then\n\
> \ null;\n\
> \elseif false then\n\
> \ return;\n\
> \end if;"
> [If ea [(BooleanLit ea True, [NullStatement ea])
> ,(BooleanLit ea False, [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 [(BooleanLit ea True, [NullStatement ea])
> ,(BooleanLit ea False, [Return ea Nothing])
> ,(BooleanLit ea False, [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 (Identifier ea "a")
> [([Identifier ea "b"], [NullStatement ea])
> ,([Identifier ea "c", Identifier ea "d"], [NullStatement ea])]
> [NullStatement ea]]
> ]]
> where
> f = PgSqlStmt