@@ -9,6 +9,7 @@ data Value = VInt Int
9 |VStr String
9 |VStr String
10 |VFloat Float
10 |VFloat Float
11 |VCol String
11 |VCol String
14data Cond = Equals Value Value
15data Cond = Equals Value Value
@@ -16,14 +17,15 @@ data Cond = Equals Value Value
16 |MkGTE Value Value
17 |MkGTE Value Value
17 |MkLT Value Value
18 |MkLT Value Value
18 |MkLTE Value Value
19 |MkLTE Value Value
19−--TODO |MkIN (List Value)
23data Clause = MkCond Cond
22data Clause = MkCond Cond
24 | AND Clause Clause
23 | AND Clause Clause
25 | OR Clause Clause
24 | OR Clause Clause
27+data condClause = SET Clause
28+ | WHERE condClause Clause
28data SelVar = Cols (List String)
30data SelVar = Cols (List String)
@@ -31,6 +33,7 @@ data SelVar = Cols (List String)
31data SQL = SELECT SelVar SQL Clause
33data SQL = SELECT SelVar SQL Clause
32 | TBL String
34 | TBL String
33 | INSERT SQL (List Value)
35 | INSERT SQL (List Value)
36+ | UPDATE SQL condClause
35-- remember to remove these funcs later
38-- remember to remove these funcs later
36foldr1 : (a -> a -> a) -> List a -> a
39foldr1 : (a -> a -> a) -> List a -> a
@@ -54,39 +57,55 @@ mapping : Int -> List a -> List (Int, a)
54mapping counter [] = []
57mapping counter [] = []
55mapping counter (x :: xs) = (counter, x) :: mapping (counter + 1) xs
58mapping counter (x :: xs) = (counter, x) :: mapping (counter + 1) xs
60+fromJust : Maybe Value -> Value
61+fromJust Nothing = VNULL
58popintoList : Maybe Value -> List (Maybe Value) -> List (Maybe Value)
64popintoList : Maybe Value -> List (Maybe Value) -> List (Maybe Value)
59popintoList (Just x) [] = [(Just x)]
65popintoList (Just x) [] = [(Just x)]
60popintoList (Just (x)) ((Just x) :: xs) = (popintoList (Just x) xs)
66popintoList (Just (x)) ((Just x) :: xs) = (popintoList (Just x) xs)
61popintoList Nothing [] = []
67popintoList Nothing [] = []
69+getlist : (String, List (Maybe(Int, Value))) -> List (Maybe(Int, Value))
70+getlist (x, (xs)) = xs
73+outList : List (Maybe Value) -> Maybe Value
75+outList ((Just x)::xs) = Just x
63valString : List (Maybe(Int, Value)) -> Value -> (String, List (Maybe(Int, Value)))
77valString : List (Maybe(Int, Value)) -> Value -> (String, List (Maybe(Int, Value)))
64valString xs (VInt x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VInt x))])
78valString xs (VInt x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VInt x))])
65valString xs (VStr x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VStr x))])
79valString xs (VStr x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VStr x))])
66valString xs (VFloat x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VFloat x))])
80valString xs (VFloat x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VFloat x))])
67valString xs (VCol n) = (n, xs)
81valString xs (VCol n) = (n, xs)
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')
70evalCond : List (Maybe(Int, Value)) -> Cond -> (String, List (Maybe(Int, Value)))
89evalCond : List (Maybe(Int, Value)) -> Cond -> (String, List (Maybe(Int, Value)))
71evalCond xs (Equals val1 val2) = let (restring , newxs ) = valString xs val1 in
90evalCond xs (Equals val1 val2) = let (restring , newxs ) = valString xs val1 in
72 let (restring2, newxs') = valString newxs val2 in
91 let (restring2, newxs') = valString newxs val2 in
73− (restring ++ " = " ++ restring2, (newxs ++ newxs'))
92+ (restring ++ " = " ++ restring2, (newxs'))
75evalCond xs (MkGT val1 val2) = let (restring , newxs ) = valString xs val1 in
94evalCond xs (MkGT val1 val2) = let (restring , newxs ) = valString xs val1 in
76 let (restring2, newxs') = valString newxs val2 in
95 let (restring2, newxs') = valString newxs val2 in
77− (restring ++ " > " ++ restring2, (newxs ++ newxs'))
96+ (restring ++ " > " ++ restring2, (newxs'))
79evalCond xs (MkGTE val1 val2) = let (restring , newxs ) = valString xs val1 in
98evalCond xs (MkGTE val1 val2) = let (restring , newxs ) = valString xs val1 in
80 let (restring2, newxs') = valString newxs val2 in
99 let (restring2, newxs') = valString newxs val2 in
81− (restring ++ " >= " ++ restring2, (newxs ++ newxs'))
100+ (restring ++ " >= " ++ restring2, ( newxs'))
83evalCond xs (MkLT val1 val2) = let (restring , newxs ) = valString xs val1 in
102evalCond xs (MkLT val1 val2) = let (restring , newxs ) = valString xs val1 in
84 let (restring2, newxs') = valString newxs val2 in
103 let (restring2, newxs') = valString newxs val2 in
85− (restring ++ " < " ++ restring2, (newxs ++ newxs'))
104+ (restring ++ " < " ++ restring2, (newxs'))
87evalCond xs (MkLTE val1 val2) = let (restring , newxs ) = valString xs val1 in
106evalCond xs (MkLTE val1 val2) = let (restring , newxs ) = valString xs val1 in
88 let (restring2, newxs') = valString newxs val2 in
107 let (restring2, newxs') = valString newxs val2 in
89− (restring ++ " =< " ++ restring2, (newxs ++ newxs'))
108+ (restring ++ " =< " ++ restring2, ( newxs'))
92clauseString : List (Maybe(Int, Value)) -> Clause -> (String, List (Maybe(Int, Value)))
111clauseString : 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
102 let (clausestr2, newxs') = clauseString newxs c2 in
121 let (clausestr2, newxs') = clauseString newxs c2 in
103 (clausestr ++ " OR " ++clausestr2 , newxs')
122 (clausestr ++ " OR " ++clausestr2 , newxs')
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)
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')
106evalSQL : List (Maybe(Int, Value)) -> SQL -> ( String, List (Maybe(Int, Value)))
133evalSQL : List (Maybe(Int, Value)) -> SQL -> ( String, List (Maybe(Int, Value)))
107evalSQL xs (TBL tbl) = (tbl, xs)
134evalSQL xs (TBL tbl) = (tbl, xs)
@@ -109,26 +136,28 @@ evalSQL xs (SELECT vars sql' c) = let (sqlstring, newxs) = evalSQL xs sql' in
109 let (csstring, newxs') = clauseString newxs c in
136 let (csstring, newxs') = clauseString newxs c in
110 case c of
137 case c of
111 Empty => case vars of
138 Empty => case vars of
139+ (ALL ) => ("SELECT " ++ "*" ++ " FROM ("
112− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ csstring, newxs')
140+ ++ sqlstring ++ ") " ++ csstring++ ";", newxs')
113− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring, newxs')
141+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++
142+ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring++ ";", newxs')
115 _ => case vars of
144 _ => case vars of
145+ (ALL ) => ("SELECT " ++ "*" ++ " FROM ("
116− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ "WHERE " ++ csstring, newxs')
146+ ++ sqlstring ++ ") " ++ "WHERE " ++ csstring++ ";", newxs')
117− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring, newxs')
147+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++
148+ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring ++ ";", newxs')
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)
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')
120display : (String, List (Maybe(Int, Value))) -> String
160display : (String, List (Maybe(Int, Value))) -> String
121display (x, (xs)) = x
161display (x, (xs)) = x
123−getlist : (String, List (Maybe(Int, Value))) -> List (Maybe(Int, Value))
124−getlist (x, (xs)) = xs
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)
132−--main = (display(evalSQL [] ((SELECT ALL)(TBL "tbl") (MkCond (Equals (VCol "col")(VInt 1))))))