@@ -9,6 +9,7 @@ data Value = VInt Int
99 |VStr String
1010 |VFloat Float
1111 |VCol String
12+ |VNULL
1213
1314
1415data Cond = Equals Value Value
@@ -16,14 +17,15 @@ data Cond = Equals Value Value
1617 |MkGTE Value Value
1718 |MkLT Value Value
1819 |MkLTE Value Value
19−--TODO |MkIN (List Value)
20−--TODO |MkIN SQL
2120
2221
2322data Clause = MkCond Cond
2423 | AND Clause Clause
2524 | OR Clause Clause
2625 | Empty
26+
27+data condClause = SET Clause
28+ | WHERE condClause Clause
2729
2830data SelVar = Cols (List String)
2931 |ALL
@@ -31,6 +33,7 @@ data SelVar = Cols (List String)
3133data SQL = SELECT SelVar SQL Clause
3234 | TBL String
3335 | INSERT SQL (List Value)
36+ | UPDATE SQL condClause
3437
3538-- remember to remove these funcs later
3639foldr1 : (a -> a -> a) -> List a -> a
@@ -54,39 +57,55 @@ mapping : Int -> List a -> List (Int, a)
5457mapping counter [] = []
5558mapping counter (x :: xs) = (counter, x) :: mapping (counter + 1) xs
5659
60+fromJust : Maybe Value -> Value
61+fromJust Nothing = VNULL
62+fromJust (Just x) = x
5763
5864popintoList : Maybe Value -> List (Maybe Value) -> List (Maybe Value)
5965popintoList (Just x) [] = [(Just x)]
6066popintoList (Just (x)) ((Just x) :: xs) = (popintoList (Just x) xs)
6167popintoList Nothing [] = []
6268
69+getlist : (String, List (Maybe(Int, Value))) -> List (Maybe(Int, Value))
70+getlist (x, (xs)) = xs
71+
72+
73+outList : List (Maybe Value) -> Maybe Value
74+outList [] = Nothing
75+outList ((Just x)::xs) = Just x
76+
6377valString : List (Maybe(Int, Value)) -> Value -> (String, List (Maybe(Int, Value)))
6478valString xs (VInt x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VInt x))])
6579valString xs (VStr x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VStr x))])
6680valString xs (VFloat x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VFloat x))])
6781valString xs (VCol n) = (n, xs)
6882
83+listVal : List (Maybe(Int, Value)) -> List Value -> (String, List (Maybe(Int, Value)))
84+listVal xs [] = ("", xs)
85+listVal xs (v::vs) = let (str, newxs) = (valString xs v) in
86+ let (str', newxs') = listVal newxs vs in
87+ ((unwords(intersperse "," (words(str) ++ words (str')))), newxs')
6988
7089evalCond : List (Maybe(Int, Value)) -> Cond -> (String, List (Maybe(Int, Value)))
7190evalCond xs (Equals val1 val2) = let (restring , newxs ) = valString xs val1 in
7291 let (restring2, newxs') = valString newxs val2 in
73− (restring ++ " = " ++ restring2, (newxs ++ newxs'))
92+ (restring ++ " = " ++ restring2, (newxs'))
7493
7594evalCond xs (MkGT val1 val2) = let (restring , newxs ) = valString xs val1 in
7695 let (restring2, newxs') = valString newxs val2 in
77− (restring ++ " > " ++ restring2, (newxs ++ newxs'))
96+ (restring ++ " > " ++ restring2, (newxs'))
7897
7998evalCond xs (MkGTE val1 val2) = let (restring , newxs ) = valString xs val1 in
8099 let (restring2, newxs') = valString newxs val2 in
81− (restring ++ " >= " ++ restring2, (newxs ++ newxs'))
100+ (restring ++ " >= " ++ restring2, ( newxs'))
82101
83102evalCond xs (MkLT val1 val2) = let (restring , newxs ) = valString xs val1 in
84103 let (restring2, newxs') = valString newxs val2 in
85− (restring ++ " < " ++ restring2, (newxs ++ newxs'))
104+ (restring ++ " < " ++ restring2, (newxs'))
86105
87106evalCond xs (MkLTE val1 val2) = let (restring , newxs ) = valString xs val1 in
88107 let (restring2, newxs') = valString newxs val2 in
89− (restring ++ " =< " ++ restring2, (newxs ++ newxs'))
108+ (restring ++ " =< " ++ restring2, ( newxs'))
90109
91110
92111clauseString : List (Maybe(Int, Value)) -> Clause -> (String, List (Maybe(Int, Value)))
@@ -102,6 +121,14 @@ clauseString xs (OR c1 c2) = let (clausestr, newxs) = clauseString xs c1 in
102121 let (clausestr2, newxs') = clauseString newxs c2 in
103122 (clausestr ++ " OR " ++clausestr2 , newxs')
104123
124+condClauseStr : List (Maybe(Int, Value)) -> condClause -> (String, List (Maybe(Int, Value)))
125+condClauseStr xs (SET setcl) = let (condstr, newxs) = clauseString xs setcl in
126+ (" SET " ++ condstr, newxs)
127+
128+condClauseStr xs (WHERE setcl1 setcl2) = let (condstr, newxs) = condClauseStr xs setcl1 in
129+ let (condstr', newxs') = clauseString newxs setcl2 in
130+ ( condstr ++ " WHERE " ++ condstr', newxs')
131+
105132
106133evalSQL : List (Maybe(Int, Value)) -> SQL -> ( String, List (Maybe(Int, Value)))
107134evalSQL xs (TBL tbl) = (tbl, xs)
@@ -109,26 +136,28 @@ evalSQL xs (SELECT vars sql' c) = let (sqlstring, newxs) = evalSQL xs sql' in
109136 let (csstring, newxs') = clauseString newxs c in
110137 case c of
111138 Empty => case vars of
112− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ csstring, newxs')
113− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring, newxs')
139+ (ALL ) => ("SELECT " ++ "*" ++ " FROM ("
140+ ++ sqlstring ++ ") " ++ csstring++ ";", newxs')
141+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++
142+ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring++ ";", newxs')
114143
115144 _ => case vars of
116− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ "WHERE " ++ csstring, newxs')
117− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring, newxs')
145+ (ALL ) => ("SELECT " ++ "*" ++ " FROM ("
146+ ++ sqlstring ++ ") " ++ "WHERE " ++ csstring++ ";", newxs')
147+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++
148+ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring ++ ";", newxs')
149+
150+evalSQL xs (INSERT sql vals) = let (tblname, newvals) = evalSQL xs sql in
151+ let (str, newxs ) = listVal newvals vals in
152+ ("INSERT INTO " ++ tblname ++ " VALUES (" ++ str ++ ")" , newxs)
153+
154+evalSQL xs (UPDATE sql cl) = let (tblname, newxs) = evalSQL xs sql in
155+ let (csstring, newxs') = condClauseStr newxs cl in
156+ ("UPDATE " ++ tblname ++ csstring, newxs')
118157
158+
119159
120160display : (String, List (Maybe(Int, Value))) -> String
121161display (x, (xs)) = x
122162
123−getlist : (String, List (Maybe(Int, Value))) -> List (Maybe(Int, Value))
124−getlist (x, (xs)) = xs
125−
126−--evalSQL2 : List (Maybe Value) -> String -> (String, List (Maybe Value))
127−--evalSQL2 [] sql = (sql, [])
128−--evalSQL2 ((Just (VInt x)) :: xs) sql = let ("string" , newxs) = evalSQL2 xs sql in
129−-- ("string" ++ sql , Just (VInt x) :: newxs)
130−
131−--main : IO ()
132−--main = (display(evalSQL [] ((SELECT ALL)(TBL "tbl") (MkCond (Equals (VCol "col")(VInt 1))))))
133−
134163