diff --git a/TODO b/TODO index cf6af47..49b38cf 100644 --- a/TODO +++ b/TODO @@ -1,9 +1,9 @@ continue 2011 review and tests -1. start replacing the 2003 stuff with 2011 -2. create an error message document for the website - - base of error messages but add some more variations -3. start thinking about tests for invalid syntax +1. create an error message document for the website + - base off ErrorMessages but add some more variations +2. start thinking about automated tests for invalid syntax to catch + bad parsing review names in the syntax for correspondence with sql standard, avoid gratuitous differences @@ -18,6 +18,7 @@ refactor crufty bits reorder the code reconsider the names and structure of the constructors in the syntax refactor the typename parser - it's a real mess +fix the lexing add documentation in Parser.lhs on the left factoring/error handling approach @@ -63,6 +64,7 @@ rules for changing the multi keyword parsing: change join defaults to be defaults + rough SQL 2011 todo, including tests to write: review the commented out reserved keyword entries and work out how to @@ -87,7 +89,6 @@ character set behaviour review datetime literals mixed quoting identifier chains names/identifiers careful review -typenames: lengths, binary general value bits collate for numeric val fn @@ -95,12 +96,9 @@ string exp fn datetime exp fn interval exp fn rows -table value constructor interval qualifier -query spec with setop -explicit table order/offset/fetch search/cycle preds: @@ -121,7 +119,6 @@ period alias for * in select list create list of unsupported syntax: xml, ref, subtypes, modules? -only --- diff --git a/tools/Language/SQL/SimpleSQL/SQL2011.lhs b/tools/Language/SQL/SimpleSQL/SQL2011.lhs index 7f5f939..34e7c7b 100644 --- a/tools/Language/SQL/SimpleSQL/SQL2011.lhs +++ b/tools/Language/SQL/SimpleSQL/SQL2011.lhs @@ -1052,7 +1052,6 @@ create a list of type name variations: > ,"timestamp"] > --interval -- not allowed without interval qualifier > --row -- not allowed without row type body -> --ref -- not allowed without reference type > -- array -- not allowed on own > -- multiset -- not allowed on own @@ -1062,8 +1061,10 @@ create a list of type name variations: > ,("char varying(5)", PrecTypeName [Name "char varying"] 5) > -- 1 scale > ,("decimal(15,2)", PrecScaleTypeName [Name "decimal"] 15 2) -> ,("char(3 octets)", PrecLengthTypeName [Name "char"] 3 Nothing (Just PrecOctets)) -> ,("varchar(50 characters)", PrecLengthTypeName [Name "varchar"] 50 Nothing (Just PrecCharacters)) +> ,("char(3 octets)" +> ,PrecLengthTypeName [Name "char"] 3 Nothing (Just PrecOctets)) +> ,("varchar(50 characters)" +> ,PrecLengthTypeName [Name "varchar"] 50 Nothing (Just PrecCharacters)) > -- lob prec + with multiname > ,("blob(3M)", PrecLengthTypeName [Name "blob"] 3 (Just PrecM) Nothing) > ,("blob(3T)", PrecLengthTypeName [Name "blob"] 3 (Just PrecT) Nothing) @@ -1073,7 +1074,8 @@ create a list of type name variations: > ,("blob(6G octets) " > ,PrecLengthTypeName [Name "blob"] 6 (Just PrecG) (Just PrecOctets)) > ,("national character large object(7K) " -> ,PrecLengthTypeName [Name "national character large object"] 7 (Just PrecK) Nothing) +> ,PrecLengthTypeName [Name "national character large object"] +> 7 (Just PrecK) Nothing) > -- 1 with and without tz > ,("time with time zone" > ,TimeTypeName [Name "time"] Nothing True) @@ -1261,7 +1263,8 @@ Specify a value that is syntactically self-delimited. > ] > parenthesizedValueExpression :: TestItem -> parenthesizedValueExpression = Group "parenthesized value expression" $ map (uncurry TestValueExpr) +> parenthesizedValueExpression = Group "parenthesized value expression" +> $ map (uncurry TestValueExpr) > [("(3)", Parens (NumLit "3")) > ,("((3))", Parens $ Parens (NumLit "3")) > ] @@ -1386,7 +1389,8 @@ Specify a value whose data type is to be inferred from its context. ::= DEFAULT > contextuallyTypedValueSpecification :: TestItem -> contextuallyTypedValueSpecification = Group "contextually typed value specification" +> contextuallyTypedValueSpecification = +> Group "contextually typed value specification" > $ map (uncurry TestValueExpr) > [("null", Iden [Name "null"]) > ,("array[]", Array (Iden [Name "array"]) []) @@ -1449,8 +1453,10 @@ Specify a value derived by the application of a function to an argument. > \GROUP BY ROLLUP(SalesQuota);" > ,makeSelect > {qeSelectList = [(Iden [Name "SalesQuota"],Nothing) -> ,(App [Name "SUM"] [Iden [Name "SalesYTD"]],Just (Name "TotalSalesYTD")) -> ,(App [Name "GROUPING"] [Iden [Name "SalesQuota"]],Just (Name "Grouping"))] +> ,(App [Name "SUM"] [Iden [Name "SalesYTD"]] +> ,Just (Name "TotalSalesYTD")) +> ,(App [Name "GROUPING"] [Iden [Name "SalesQuota"]] +> ,Just (Name "Grouping"))] > ,qeFrom = [TRSimple [Name "Sales",Name "SalesPerson"]] > ,qeGroupBy = [Rollup [SimpleGroup (Iden [Name "SalesQuota"])]]}) > ] @@ -2412,7 +2418,8 @@ Specify construction of an array. > ,ArrayCtor (makeSelect > {qeSelectList = [(Star,Nothing)] > ,qeFrom = [TRSimple [Name "t"]] -> ,qeOrderBy = [SortSpec (Iden [Name "a"]) DirDefault NullsOrderDefault] })) +> ,qeOrderBy = [SortSpec (Iden [Name "a"]) +> DirDefault NullsOrderDefault]})) > ] @@ -2490,7 +2497,8 @@ Specify construction of a multiset. > multisetValueConstructor :: TestItem > multisetValueConstructor = Group "multiset value constructor" > $ map (uncurry TestValueExpr) -> [("multiset[a,b,c]", MultisetCtor[Iden [Name "a"], Iden [Name "b"], Iden [Name "c"]]) +> [("multiset[a,b,c]", MultisetCtor[Iden [Name "a"] +> ,Iden [Name "b"], Iden [Name "c"]]) > ,("multiset(select * from t)", MultisetQueryCtor qe) > ,("table(select * from t)", MultisetQueryCtor qe) > ] @@ -3265,13 +3273,25 @@ everywhere > orderOffsetFetchQueryExpression = Group "order, offset, fetch query expression" > $ map (uncurry TestQueryExpr) > [-- todo: finish tests for order offset and fetch -> {- ("select * from t order by a", undefined) -> ,("select * from t offset 5 row", undefined) -> ,("select * from t offset 5 rows", undefined) -> ,("select * from t fetch first 5 row only", undefined) -> ,("select * from t fetch next 5 rows with ties", undefined) -> ,("select * from t fetch first 5 percent rows only", undefined)-} +> ("select a from t order by a" +> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) +> DirDefault NullsOrderDefault]}) +> ,("select a from t offset 5 row" +> ,qe {qeOffset = Just $ NumLit "5"}) +> ,("select a from t offset 5 rows" +> ,qe {qeOffset = Just $ NumLit "5"}) +> ,("select a from t fetch first 5 row only" +> ,qe {qeFetchFirst = Just $ NumLit "5"}) +> -- todo: support with ties and percent in fetch +> --,("select a from t fetch next 5 rows with ties" +> --,("select a from t fetch first 5 percent rows only" > ] +> where +> qe = makeSelect +> {qeSelectList = [(Iden [Name "a"], Nothing)] +> ,qeFrom = [TRSimple [Name "t"]] +> } + == 7.14 @@ -3622,7 +3642,8 @@ Specify a quantified comparison. > ,QuantifiedComparison (Iden [Name "a"]) [Name ">"] CPAll qe) > ,("(a,b) <> all (select * from t)" > ,QuantifiedComparison -> (SpecialOp [Name "rowctor"] [Iden [Name "a"],Iden [Name "b"]]) [Name "<>"] CPAll qe) +> (SpecialOp [Name "rowctor"] [Iden [Name "a"] +> ,Iden [Name "b"]]) [Name "<>"] CPAll qe) > ] > where > qe = makeSelect @@ -3697,15 +3718,18 @@ Specify a test for matching rows. > [("a match (select a from t)" > ,Match (Iden [Name "a"]) False qe) > ,("(a,b) match (select a,b from t)" -> ,Match (SpecialOp [Name "rowctor"] [Iden [Name "a"], Iden [Name "b"]]) False qea) +> ,Match (SpecialOp [Name "rowctor"] +> [Iden [Name "a"], Iden [Name "b"]]) False qea) > ,("(a,b) match unique (select a,b from t)" -> ,Match (SpecialOp [Name "rowctor"] [Iden [Name "a"], Iden [Name "b"]]) True qea) +> ,Match (SpecialOp [Name "rowctor"] +> [Iden [Name "a"], Iden [Name "b"]]) True qea) > ] > where > qe = makeSelect > {qeSelectList = [(Iden [Name "a"],Nothing)] > ,qeFrom = [TRSimple [Name "t"]]} -> qea = qe {qeSelectList = qeSelectList qe ++ [(Iden [Name "b"],Nothing)]} +> qea = qe {qeSelectList = qeSelectList qe +> ++ [(Iden [Name "b"],Nothing)]} TODO: simple, partial and full @@ -4202,7 +4226,8 @@ osf > ,AggregateApp [Name "array_agg"] > SQDefault > [Iden [Name "a"]] -> [SortSpec (Iden [Name "z"]) DirDefault NullsOrderDefault] +> [SortSpec (Iden [Name "z"]) +> DirDefault NullsOrderDefault] > Nothing)] > where @@ -4249,22 +4274,34 @@ Specify a sort order. > sortSpecificationList = Group "sort specification list" > $ map (uncurry TestQueryExpr) > [("select * from t order by a" -> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) DirDefault NullsOrderDefault]}) +> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) +> DirDefault NullsOrderDefault]}) > ,("select * from t order by a,b" -> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) DirDefault NullsOrderDefault -> ,SortSpec (Iden [Name "b"]) DirDefault NullsOrderDefault]}) +> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) +> DirDefault NullsOrderDefault +> ,SortSpec (Iden [Name "b"]) +> DirDefault NullsOrderDefault]}) > ,("select * from t order by a asc,b" -> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) Asc NullsOrderDefault -> ,SortSpec (Iden [Name "b"]) DirDefault NullsOrderDefault]}) +> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) +> Asc NullsOrderDefault +> ,SortSpec (Iden [Name "b"]) +> DirDefault NullsOrderDefault]}) > ,("select * from t order by a desc,b" -> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) Desc NullsOrderDefault -> ,SortSpec (Iden [Name "b"]) DirDefault NullsOrderDefault]}) +> ,qe {qeOrderBy = [SortSpec (Iden [Name "a"]) +> Desc NullsOrderDefault +> ,SortSpec (Iden [Name "b"]) +> DirDefault NullsOrderDefault]}) > ,("select * from t order by a collate x desc,b" -> ,qe {qeOrderBy = [SortSpec (Collate (Iden [Name "a"]) [Name "x"]) Desc NullsOrderDefault -> ,SortSpec (Iden [Name "b"]) DirDefault NullsOrderDefault]}) +> ,qe {qeOrderBy = [SortSpec +> (Collate (Iden [Name "a"]) [Name "x"]) +> Desc NullsOrderDefault +> ,SortSpec (Iden [Name "b"]) +> DirDefault NullsOrderDefault]}) > ,("select * from t order by 1,2" -> ,qe {qeOrderBy = [SortSpec (NumLit "1") DirDefault NullsOrderDefault -> ,SortSpec (NumLit "2") DirDefault NullsOrderDefault]}) +> ,qe {qeOrderBy = [SortSpec (NumLit "1") +> DirDefault NullsOrderDefault +> ,SortSpec (NumLit "2") +> DirDefault NullsOrderDefault]}) > ] > where > qe = makeSelect