1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  | 
module SQLAst where
import Time(CalendarTime)
data Statement = Select SelectHead Order (Maybe Int)
               | Update Table [Assign] Condition
               | UpdateEntity Table Value
               | Delete Table Condition
               | Insert Table [ColumnRef] [[Value]]
               | Transaction
               | InTransaction [Statement]
               | Commit
               | Rollback
data ColumnRef = Column Tab String Type Bool Int
data Tab = Unique String | Def [String]
data Type = I | B | F | C | S | D | Key String | Entity String | Unknown
 deriving Eq
data Assign = Assign ColumnRef Value
data Value = Emb String Type
           | IntExp Int
           | KeyExp String Int 
           | FloatExp Float
           | StringExp String
           | DateExp CalendarTime
           | BoolExp Bool
           | CharExp Char
           | AbsNull
data SelectHead = Set ASetOp SelectHead SelectHead
                | Query SelectClause TableRef Condition (Maybe Group)
data SelectClause = SelAll ASpecifier
                  | SelColumns ASpecifier [SelElement]
data SelElement = Aggregation AFun ASpecifier ColumnRef
                | Col ColumnRef
                | Case Condition Operand Operand
data Table = Table String String Int 
data TableRef = TableRef Table (Maybe JoinClause)
data JoinClause = CrossJoin Table (Maybe JoinClause)
                | InnerJoin Table JoinCond (Maybe JoinClause)
data JoinCond =  JC Condition
data ASpecifier = AAll | ADistinct
data Condition = FK (String,Int) AbsRel (String,Int)
               | Cmp ALogOp Condition Condition
               | Not Condition
               | Exists Statement
               | IsNull Operand
               | NotNull Operand
               | AIn Operand [Value]
               | ABinOp AstOp Operand Operand
               | ABetween Operand Operand Operand
               | NoCond
data AbsRel = AMToN String
            | ANToOne String
            | AOneToN String
            | NotSpec String
type Operand = Either ColumnRef Value
data AstOp = ALth | ALe | AGth | AGe | AEq | AUnEq | ALike
data ALogOp = AAnd | AOr
data ASetOp = AUnion | AExcept | AIntersect
data Group = GroupBy [ColumnRef] Having
data Having = SimpleHave Condition
            | AggrHave AFun ASpecifier ColumnRef AstOp Operand
            | Neg Having
            | CmpHave ALogOp Having Having
            | NoHave
data AFun = ASum | ACount | AAvg | AMin | AMax
data Order = OrderBy [(ColumnRef, Dir)]
data Dir = Asc | Desc |