hssqlppp-0.6.2: tests/Database/HsSqlPpp/Tests/Parsing/SqlServer.lhs
> {-# LANGUAGE QuasiQuotes,OverloadedStrings #-}
>
> module Database.HsSqlPpp.Tests.Parsing.SqlServer (sqlServer) where
>
> --import Database.HsSqlPpp.Utils.Here
>
> import Database.HsSqlPpp.Syntax
> import Database.HsSqlPpp.Tests.Parsing.Utils
> import Database.HsSqlPpp.Tests.TestTypes
> import Database.HsSqlPpp.Dialect
> sqlServer :: Item
> sqlServer =
> Group "parse sql server"
> [s "select top 3 * from a order by c;"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [tref "a"]
> ,selOrderBy = [(ei "c", Asc, NullsDefault)]
> ,selLimit = Just $ num "3"}]
> ,s "select top(3) * from a order by c;"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [tref "a"]
> ,selOrderBy = [(ei "c", Asc, NullsDefault)]
> ,selLimit = Just $ num "3"}]
> ,s "select r.dn as 'rg' from tbl;"
> [qs $ makeSelect
> {selSelectList = sl [sia (eqi "r" "dn") $ QNmc "rg"]
> ,selTref = [tref "tbl"]}]
> ,s "select r.dn as 'check the pretty printing' from tbl;"
> [qs $ makeSelect
> {selSelectList = sl [sia (eqi "r" "dn") $ QNmc "check the pretty printing"]
> ,selTref = [tref "tbl"]}]
syntax for identifiers is:
[[[server.] [database].][schema].] database-object]
so could have
server.db.sc.obj
->
server...obj
=> three dots max
> ,s "select a..b() from t;"
> [qs $ makeSelect
> {selSelectList = sl [SelExp ea (App ea (Name ea [Nmc "a",Nmc "", Nmc "b"])
> [])]
> ,selTref = [tref "t"]}]
> ,s "select a...b() from t;"
> [qs $ makeSelect
> {selSelectList = sl [SelExp ea (App ea (Name ea [Nmc "a",Nmc "", Nmc "", Nmc "b"])
> [])]
> ,selTref = [tref "t"]}]
> ,s "select * from a join x..b;"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [innerJoin (tref "a")
> (Tref ea (Name ea [Nmc "x",Nmc "",Nmc "b"])) Nothing]}]
> ,s "select * from a join x...b;"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [innerJoin (tref "a")
> (Tref ea (Name ea [Nmc "x",Nmc "",Nmc "",Nmc "b"])) Nothing]}]
> ,s "select a from t with(nolock);"
> -- with is just (sort of) recognised, and not parsed to abstract
> -- syntax
> [qs $ makeSelect
> {selSelectList = sl [si $ ei "a"]
> ,selTref = [tref "t"]}]
> ,s "select a from #tbl;"
> [qs $ makeSelect
> {selSelectList = sl [si $ ei "a"]
> ,selTref = [tref "#tbl"]}]
> ,s "CREATE TABLE [schema].[table_name](\n\
> \ [fieldname] [typename])"
> $ [CreateTable ea (Name ea [QNmc "schema",QNmc "table_name"])
> [AttributeDef ea (QNmc "fieldname")
> (SimpleTypeName ea (Name ea [QNmc "typename"])) [] []] [] Nothing NoReplace []]
> ,s "select a from t -- no semi colon\n\
> \select b from t"
> $ [qs $ makeSelect
> {selSelectList = sl [si $ ei "a"]
> ,selTref = [tref "t"]}
> ,qs $ makeSelect
> {selSelectList = sl [si $ ei "b"]
> ,selTref = [tref "t"]}]
> ,s "if 1=1\n\
> \ drop table #temp\n\
> \select b from t"
> $ [If ea [(binop "=" (num "1") (num "1")
> ,[DropSomething ea Table Require [name "#temp"] Restrict])] []
> ,qs $ makeSelect
> {selSelectList = sl [si $ ei "b"]
> ,selTref = [tref "t"]}]
> ,s "declare @nm int"
> $ [DeclareStatement ea [("@nm"
> ,st "int"
> ,Nothing)]]
> ,s "declare @nm int = 3, @nm2 datetime = '1/1/2000'"
> $ [DeclareStatement ea [("@nm"
> ,st "int"
> ,Just (num "3"))
> ,("@nm2"
> ,st "datetime"
> ,Just $ str "1/1/2000")
> ]]
> --,s "set @nm=3"
> -- $ [Assignment ea (name "@nm") (num "3")]
> ,s "select convert (INT,5) from t"
> $ [qs $ makeSelect
> {selSelectList = sl [si $ App ea (name "convert") [ei "INT",num "5"]]
> ,selTref = [tref "t"]}]
todo: add more complex type name
needs to be better: the style is lost, also a bit inconsistent
> ,s "select convert (time,something,108) from t"
> $ [qs $ makeSelect
> {selSelectList = sl [si $ Cast ea (ei "something") (st "time")]
> ,selTref = [tref "t"]}]
> ,s "CREATE NONCLUSTERED INDEX idx ON tbl (col) INCLUDE (Gap)"
> $ [CreateIndexTSQL ea (Nmc "idx") (name "tbl") [Nmc "col"]]
> ,s "CREATE NONCLUSTERED INDEX idx ON [dbo].[#tmp] (col) INCLUDE (Gap)"
> $ [CreateIndexTSQL ea (Nmc "idx")
> (Name ea [QNmc "dbo"
> ,QNmc "#tmp"])
> [Nmc "col"]]
> ,s "select y -@test from t"
> $ [qs $ makeSelect
> {selSelectList = sl [si $ binop "-" (ei "y") (ei "@test")]
> ,selTref = [tref "t"]}]
> ,s "select * from t natural inner hash join u"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [JoinTref ea (tref "t") Natural Inner
> (Just Hash) (tref "u") Nothing]}
> ]
> ,s "select * from t natural inner loop join u"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [JoinTref ea (tref "t") Natural Inner
> (Just Loop) (tref "u") Nothing]}
> ]
> ,s "select * from t natural inner merge join u"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [JoinTref ea (tref "t") Natural Inner
> (Just Merge) (tref "u") Nothing]}
> ]
The following will fail if the words are not marked as keywords
in ParserInternal.lhs
> ,s "select * from t loop join u"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [JoinTref ea (tref "t") Unnatural Inner
> (Just Loop) (tref "u") Nothing]}
> ]
> ,s "select * from t merge join u"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [JoinTref ea (tref "t") Unnatural Inner
> (Just Merge) (tref "u") Nothing]}
> ]
> ,s "select * from t hash join u"
> [qs $ makeSelect
> {selSelectList = sl [si $ Star ea]
> ,selTref = [JoinTref ea (tref "t") Unnatural Inner
> (Just Hash) (tref "u") Nothing]}
> ]
> ]
> where
> s = ParseProcSql defaultParseFlags {pfDialect=sqlServerDialect}
> qs = QueryStatement ea
create index ++
parse select into to create table as (do this for postgresql non
plpgsql also)