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 Data.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
|