work on from clause, group by and having tests in 2011
This commit is contained in:
parent
be79448414
commit
0d1e345262
19
TODO
19
TODO
|
@ -34,7 +34,7 @@ keyword tree support prefix mode so can start from already parsed
|
||||||
do the final big left factor: typenames, interval lits, iden +
|
do the final big left factor: typenames, interval lits, iden +
|
||||||
suffixes
|
suffixes
|
||||||
|
|
||||||
left factor/try removal summary (needs updating):
|
left factor/try removal summary (this list needs updating):
|
||||||
|
|
||||||
identifier starts:
|
identifier starts:
|
||||||
interval literal
|
interval literal
|
||||||
|
@ -61,19 +61,24 @@ rules for changing the multi keyword parsing:
|
||||||
if the keyword is optionally followed by another, e.g. with
|
if the keyword is optionally followed by another, e.g. with
|
||||||
recursive, then don't do this.
|
recursive, then don't do this.
|
||||||
|
|
||||||
|
change join defaults to be defaults
|
||||||
|
|
||||||
rough SQL 2011 todo, including tests to write:
|
rough SQL 2011 todo, including tests to write:
|
||||||
|
|
||||||
review the commented out reserved keyword entries and work out how to
|
review the commented out reserved keyword entries and work out how to
|
||||||
fix
|
fix
|
||||||
|
|
||||||
|
test case insensitvity and case preservation
|
||||||
|
|
||||||
big areas:
|
big areas:
|
||||||
window functions
|
window functions
|
||||||
nested window functions
|
nested window functions
|
||||||
case
|
case
|
||||||
table ref
|
|
||||||
joined table
|
table ref: tablesample, time period spec, only, unnest, table, lateral
|
||||||
group by
|
bug
|
||||||
|
joined table: partitioned joins
|
||||||
|
group by: set quantifier
|
||||||
window clause
|
window clause
|
||||||
|
|
||||||
other areas:
|
other areas:
|
||||||
|
@ -113,11 +118,15 @@ member
|
||||||
submultiset
|
submultiset
|
||||||
period
|
period
|
||||||
|
|
||||||
create list of unsupported syntax: xml, ref, subtypes, modules?
|
alias for * in select list
|
||||||
|
|
||||||
|
create list of unsupported syntax: xml, ref, subtypes, modules?
|
||||||
|
only
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
after next release
|
after next release
|
||||||
|
|
||||||
review areas where this parser is too permissive, e.g. value
|
review areas where this parser is too permissive, e.g. value
|
||||||
|
|
|
@ -2501,10 +2501,12 @@ Specify construction of a multiset.
|
||||||
> [rowValueConstructor
|
> [rowValueConstructor
|
||||||
> ,rowValueExpression
|
> ,rowValueExpression
|
||||||
> ,tableValueConstructor
|
> ,tableValueConstructor
|
||||||
|
> ,fromClause
|
||||||
> ,tableReference
|
> ,tableReference
|
||||||
> ,joinedTable
|
> ,joinedTable
|
||||||
> ,whereClause
|
> ,whereClause
|
||||||
> ,groupByClause
|
> ,groupByClause
|
||||||
|
> ,havingClause
|
||||||
> ,windowClause
|
> ,windowClause
|
||||||
> ,querySpecification
|
> ,querySpecification
|
||||||
> ,withQueryExpression
|
> ,withQueryExpression
|
||||||
|
@ -2635,11 +2637,26 @@ Specify a table derived from one or more tables.
|
||||||
<table reference list> ::=
|
<table reference list> ::=
|
||||||
<table reference> [ { <comma> <table reference> }... ]
|
<table reference> [ { <comma> <table reference> }... ]
|
||||||
|
|
||||||
|
> fromClause :: TestItem
|
||||||
|
> fromClause = Group "fromClause"
|
||||||
|
> $ map (uncurry TestQueryExpr)
|
||||||
|
> [("select * from tbl1,tbl2"
|
||||||
|
> ,makeSelect
|
||||||
|
> {qeSelectList = [(Star, Nothing)]
|
||||||
|
> ,qeFrom = [TRSimple [Name "tbl1"], TRSimple [Name "tbl2"]]
|
||||||
|
> })]
|
||||||
|
|
||||||
|
|
||||||
== 7.6 <table reference>
|
== 7.6 <table reference>
|
||||||
|
|
||||||
Function
|
Function
|
||||||
Reference a table.
|
Reference a table.
|
||||||
|
|
||||||
|
> tableReference :: TestItem
|
||||||
|
> tableReference = Group "table reference"
|
||||||
|
> $ map (uncurry TestQueryExpr)
|
||||||
|
> [("select * from t", sel)
|
||||||
|
|
||||||
<table reference> ::= <table factor> | <joined table>
|
<table reference> ::= <table factor> | <joined table>
|
||||||
|
|
||||||
<table factor> ::= <table primary> [ <sample clause> ]
|
<table factor> ::= <table primary> [ <sample clause> ]
|
||||||
|
@ -2657,7 +2674,7 @@ Reference a table.
|
||||||
<repeat argument> ::= <numeric value expression>
|
<repeat argument> ::= <numeric value expression>
|
||||||
|
|
||||||
<table primary> ::=
|
<table primary> ::=
|
||||||
<table or query name> [ <query system time period specification> ]
|
<table or query name> [ <query system time period specification> ]
|
||||||
[ [ AS ] <correlation name>
|
[ [ AS ] <correlation name>
|
||||||
[ <left paren> <derived column list> <right paren> ] ]
|
[ <left paren> <derived column list> <right paren> ] ]
|
||||||
| <derived table> [ AS ] <correlation name>
|
| <derived table> [ AS ] <correlation name>
|
||||||
|
@ -2680,6 +2697,8 @@ Reference a table.
|
||||||
<point in time 1> AND <point in time 2>
|
<point in time 1> AND <point in time 2>
|
||||||
| FOR SYSTEM_TIME FROM <point in time 1> TO <point in time 2>
|
| FOR SYSTEM_TIME FROM <point in time 1> TO <point in time 2>
|
||||||
|
|
||||||
|
TODO: query system time period spec
|
||||||
|
|
||||||
<point in time 1> ::= <point in time>
|
<point in time 1> ::= <point in time>
|
||||||
|
|
||||||
<point in time 2> ::= <point in time>
|
<point in time 2> ::= <point in time>
|
||||||
|
@ -2688,6 +2707,8 @@ Reference a table.
|
||||||
|
|
||||||
<only spec> ::= ONLY <left paren> <table or query name> <right paren>
|
<only spec> ::= ONLY <left paren> <table or query name> <right paren>
|
||||||
|
|
||||||
|
TODO: only
|
||||||
|
|
||||||
<lateral derived table> ::= LATERAL <table subquery>
|
<lateral derived table> ::= LATERAL <table subquery>
|
||||||
|
|
||||||
<collection derived table> ::=
|
<collection derived table> ::=
|
||||||
|
@ -2721,10 +2742,53 @@ Reference a table.
|
||||||
<left paren> <parenthesized joined table> <right paren>
|
<left paren> <parenthesized joined table> <right paren>
|
||||||
| <left paren> <joined table> <right paren>
|
| <left paren> <joined table> <right paren>
|
||||||
|
|
||||||
> tableReference :: TestItem
|
|
||||||
> tableReference = Group "table reference"
|
> -- table or query name
|
||||||
> [-- todo: table reference
|
> ,("select * from t u", a sel)
|
||||||
|
> ,("select * from t as u", a sel)
|
||||||
|
> ,("select * from t u(a,b)", sel1 )
|
||||||
|
> ,("select * from t as u(a,b)", sel1)
|
||||||
|
> -- derived table TODO: realistic example
|
||||||
|
> ,("select * from (select * from t) u"
|
||||||
|
> ,a $ sel {qeFrom = [TRQueryExpr sel]})
|
||||||
|
> -- lateral TODO: realistic example
|
||||||
|
> ,("select * from lateral t"
|
||||||
|
> ,af TRLateral sel)
|
||||||
|
> -- TODO: bug, lateral should bind more tightly than the alias
|
||||||
|
> --,("select * from lateral t u"
|
||||||
|
> -- ,a $ af sel TRLateral)
|
||||||
|
> -- collection TODO: realistic example
|
||||||
|
> -- TODO: make it work
|
||||||
|
> --,("select * from unnest(a)", undefined)
|
||||||
|
> --,("select * from unnest(a,b)", undefined)
|
||||||
|
> --,("select * from unnest(a,b) with ordinality", undefined)
|
||||||
|
> --,("select * from unnest(a,b) with ordinality u", undefined)
|
||||||
|
> --,("select * from unnest(a,b) with ordinality as u", undefined)
|
||||||
|
> -- table fn TODO: realistic example
|
||||||
|
> -- TODO: make it work
|
||||||
|
> --,("select * from table(a)", undefined)
|
||||||
|
> -- parens
|
||||||
|
> ,("select * from (a join b)", jsel)
|
||||||
|
> ,("select * from (a join b) u", a jsel)
|
||||||
|
> ,("select * from ((a join b)) u", a $ af TRParens jsel)
|
||||||
|
> ,("select * from ((a join b) u) u", a $ af TRParens $ a jsel)
|
||||||
> ]
|
> ]
|
||||||
|
> where
|
||||||
|
> sel = makeSelect
|
||||||
|
> {qeSelectList = [(Star, Nothing)]
|
||||||
|
> ,qeFrom = [TRSimple [Name "t"]]}
|
||||||
|
> af f s = s {qeFrom = map f (qeFrom s)}
|
||||||
|
> a s = af (\x -> TRAlias x $ Alias (Name "u") Nothing) s
|
||||||
|
> sel1 = makeSelect
|
||||||
|
> {qeSelectList = [(Star, Nothing)]
|
||||||
|
> ,qeFrom = [TRAlias (TRSimple [Name "t"])
|
||||||
|
> $ Alias (Name "u") $ Just [Name "a", Name "b"]]}
|
||||||
|
> jsel = sel {qeFrom =
|
||||||
|
> [TRParens $ TRJoin (TRSimple [Name "a"])
|
||||||
|
> False
|
||||||
|
> JInner
|
||||||
|
> (TRSimple [Name "b"])
|
||||||
|
> Nothing]}
|
||||||
|
|
||||||
== 7.7 <joined table>
|
== 7.7 <joined table>
|
||||||
|
|
||||||
|
@ -2771,8 +2835,51 @@ Specify a table derived from a Cartesian product, inner join, or outer join.
|
||||||
|
|
||||||
> joinedTable :: TestItem
|
> joinedTable :: TestItem
|
||||||
> joinedTable = Group "joined table"
|
> joinedTable = Group "joined table"
|
||||||
> [-- todo: joined table
|
> $ map (uncurry TestQueryExpr)
|
||||||
|
> [("select * from a cross join b"
|
||||||
|
> ,sel $ TRJoin a False JCross b Nothing)
|
||||||
|
> ,("select * from a join b on true"
|
||||||
|
> ,sel $ TRJoin a False JInner b
|
||||||
|
> (Just $ JoinOn $ Iden [Name "true"]))
|
||||||
|
> ,("select * from a join b using (c)"
|
||||||
|
> ,sel $ TRJoin a False JInner b
|
||||||
|
> (Just $ JoinUsing [Name "c"]))
|
||||||
|
> ,("select * from a inner join b on true"
|
||||||
|
> ,sel $ TRJoin a False JInner b
|
||||||
|
> (Just $ JoinOn $ Iden [Name "true"]))
|
||||||
|
> ,("select * from a left join b on true"
|
||||||
|
> ,sel $ TRJoin a False JLeft b
|
||||||
|
> (Just $ JoinOn $ Iden [Name "true"]))
|
||||||
|
> ,("select * from a left outer join b on true"
|
||||||
|
> ,sel $ TRJoin a False JLeft b
|
||||||
|
> (Just $ JoinOn $ Iden [Name "true"]))
|
||||||
|
> ,("select * from a right join b on true"
|
||||||
|
> ,sel $ TRJoin a False JRight b
|
||||||
|
> (Just $ JoinOn $ Iden [Name "true"]))
|
||||||
|
> ,("select * from a full join b on true"
|
||||||
|
> ,sel $ TRJoin a False JFull b
|
||||||
|
> (Just $ JoinOn $ Iden [Name "true"]))
|
||||||
|
> ,("select * from a natural join b"
|
||||||
|
> ,sel $ TRJoin a True JInner b Nothing)
|
||||||
|
> ,("select * from a natural inner join b"
|
||||||
|
> ,sel $ TRJoin a True JInner b Nothing)
|
||||||
|
> ,("select * from a natural left join b"
|
||||||
|
> ,sel $ TRJoin a True JLeft b Nothing)
|
||||||
|
> ,("select * from a natural left outer join b"
|
||||||
|
> ,sel $ TRJoin a True JLeft b Nothing)
|
||||||
|
> ,("select * from a natural right join b"
|
||||||
|
> ,sel $ TRJoin a True JRight b Nothing)
|
||||||
|
> ,("select * from a natural full join b"
|
||||||
|
> ,sel $ TRJoin a True JFull b Nothing)
|
||||||
> ]
|
> ]
|
||||||
|
> where
|
||||||
|
> sel t = makeSelect
|
||||||
|
> {qeSelectList = [(Star, Nothing)]
|
||||||
|
> ,qeFrom = [t]}
|
||||||
|
> a = TRSimple [Name "a"]
|
||||||
|
> b = TRSimple [Name "b"]
|
||||||
|
|
||||||
|
TODO: partitioned joins
|
||||||
|
|
||||||
== 7.8 <where clause>
|
== 7.8 <where clause>
|
||||||
|
|
||||||
|
@ -2842,6 +2949,46 @@ clause> to the result of the previously specified clause.
|
||||||
|
|
||||||
<empty grouping set> ::= <left paren> <right paren>
|
<empty grouping set> ::= <left paren> <right paren>
|
||||||
|
|
||||||
|
|
||||||
|
> groupByClause :: TestItem
|
||||||
|
> groupByClause = Group "group by clause"
|
||||||
|
> $ map (uncurry TestQueryExpr)
|
||||||
|
> [("select a,sum(x) from t group by a"
|
||||||
|
> ,qe [SimpleGroup $ Iden [Name "a"]])
|
||||||
|
> ,("select a,sum(x) from t group by a collate c"
|
||||||
|
> ,qe [SimpleGroup $ Collate (Iden [Name "a"]) [Name "c"]])
|
||||||
|
> ,("select a,b,sum(x) from t group by a,b"
|
||||||
|
> ,qex [SimpleGroup $ Iden [Name "a"]
|
||||||
|
> ,SimpleGroup $ Iden [Name "b"]])
|
||||||
|
> -- todo: group by set quantifier
|
||||||
|
> --,("select a,sum(x) from t group by distinct a"
|
||||||
|
> --,undefined)
|
||||||
|
> --,("select a,sum(x) from t group by all a"
|
||||||
|
> -- ,undefined)
|
||||||
|
> ,("select a,b,sum(x) from t group by rollup(a,b)"
|
||||||
|
> ,qex [Rollup [SimpleGroup $ Iden [Name "a"]
|
||||||
|
> ,SimpleGroup $ Iden [Name "b"]]])
|
||||||
|
> ,("select a,b,sum(x) from t group by cube(a,b)"
|
||||||
|
> ,qex [Cube [SimpleGroup $ Iden [Name "a"]
|
||||||
|
> ,SimpleGroup $ Iden [Name "b"]]])
|
||||||
|
> ,("select a,b,sum(x) from t group by grouping sets((),(a,b))"
|
||||||
|
> ,qex [GroupingSets [GroupingParens []
|
||||||
|
> ,GroupingParens [SimpleGroup $ Iden [Name "a"]
|
||||||
|
> ,SimpleGroup $ Iden [Name "b"]]]])
|
||||||
|
> ,("select sum(x) from t group by ()"
|
||||||
|
> ,let x = qe [GroupingParens []]
|
||||||
|
> in x {qeSelectList = tail $ qeSelectList x})
|
||||||
|
> ]
|
||||||
|
> where
|
||||||
|
> qe g = makeSelect
|
||||||
|
> {qeSelectList = [(Iden [Name "a"], Nothing)
|
||||||
|
> ,(App [Name "sum"] [Iden [Name "x"]], Nothing)]
|
||||||
|
> ,qeFrom = [TRSimple [Name "t"]]
|
||||||
|
> ,qeGroupBy = g}
|
||||||
|
> qex g = let x = qe g
|
||||||
|
> in x {qeSelectList = let [a,b] = qeSelectList x
|
||||||
|
> in [a,(Iden [Name "b"],Nothing),b]}
|
||||||
|
|
||||||
== 7.10 <having clause>
|
== 7.10 <having clause>
|
||||||
|
|
||||||
Function
|
Function
|
||||||
|
@ -2851,9 +2998,18 @@ not satisfy a <search condition>.
|
||||||
|
|
||||||
<having clause> ::= HAVING <search condition>
|
<having clause> ::= HAVING <search condition>
|
||||||
|
|
||||||
> groupByClause :: TestItem
|
> havingClause :: TestItem
|
||||||
> groupByClause = Group "group by clause"
|
> havingClause = Group "having clause"
|
||||||
> [-- todo: group by clause
|
> $ map (uncurry TestQueryExpr)
|
||||||
|
> [("select a,sum(x) from t group by a having sum(x) > 1000"
|
||||||
|
> ,makeSelect
|
||||||
|
> {qeSelectList = [(Iden [Name "a"], Nothing)
|
||||||
|
> ,(App [Name "sum"] [Iden [Name "x"]], Nothing)]
|
||||||
|
> ,qeFrom = [TRSimple [Name "t"]]
|
||||||
|
> ,qeGroupBy = [SimpleGroup $ Iden [Name "a"]]
|
||||||
|
> ,qeHaving = Just $ BinOp (App [Name "sum"] [Iden [Name "x"]])
|
||||||
|
> [Name ">"]
|
||||||
|
> (NumLit "1000")})
|
||||||
> ]
|
> ]
|
||||||
|
|
||||||
== 7.11 <window clause>
|
== 7.11 <window clause>
|
||||||
|
|
Loading…
Reference in a new issue