1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4
5 #include "sql_parser.h"
6
7 #define output(fmt,args...) fprintf (stdout, "%*s" fmt "\n" , indent * 2, "" , ##args)
8
9 static int sql_display_select (int indent, sql_select_statement * statement);
10 static int sql_display_field (int indent, sql_field * field);
11 static int sql_display_order_by (int indent, sql_order_field *order_by);
12
13 static int
sql_display_field_item(int indent,sql_field_item * item)14 sql_display_field_item (int indent, sql_field_item * item)
15 {
16 GList *cur;
17
18 switch (item->type) {
19 case SQL_name:
20 fprintf (stdout, "%*s", indent * 2, "");
21 for (cur = item->d.name; cur != NULL; cur = cur->next)
22 fprintf (stdout, "%s%s", (char *) cur->data, cur->next ? "." : "\n");
23 break;
24
25 case SQL_equation:
26 output ("equation: %d", item->d.equation.op);
27 output ("left:");
28 sql_display_field_item (indent + 1, item->d.equation.left);
29 output ("right");
30 sql_display_field_item (indent + 1, item->d.equation.right);
31 break;
32
33 case SQL_inlineselect:
34 output ("select:");
35 sql_display_select (indent + 1, item->d.select);
36 break;
37
38 case SQL_function:
39 output ("function: %s", item->d.function.funcname);
40 for (cur = item->d.function.funcarglist; cur != NULL; cur = cur->next)
41 sql_display_field (indent + 1, cur->data);
42 break;
43
44 }
45 return 0;
46 }
47
48 static int
sql_display_field(int indent,sql_field * field)49 sql_display_field (int indent, sql_field * field)
50 {
51 sql_display_field_item (indent, field->item);
52
53 if (field->as)
54 output ("as: %s", field->as);
55 return 0;
56 }
57
58 static int
sql_display_condition(int indent,sql_condition * cond)59 sql_display_condition (int indent, sql_condition * cond)
60 {
61 char *condstr;
62
63 if (!cond)
64 return 0;
65
66 switch (cond->op) {
67 case SQL_eq:
68 condstr = "=";
69 break;
70 case SQL_is:
71 condstr = "IS";
72 break;
73 case SQL_isnot:
74 condstr = "IS NOT";
75 break;
76 case SQL_in:
77 condstr = "IN";
78 break;
79 case SQL_notin:
80 condstr = "NOT IN";
81 break;
82 case SQL_like:
83 condstr = "LIKE";
84 break;
85 case SQL_gt:
86 condstr = ">";
87 break;
88 case SQL_lt:
89 condstr = "<";
90 break;
91 case SQL_geq:
92 condstr = ">=";
93 break;
94 case SQL_leq:
95 condstr = "<=";
96 break;
97 case SQL_diff:
98 condstr = "!=";
99 break;
100 case SQL_between:
101 condstr = "BETWEEN";
102 break;
103 default:
104 condstr = "UNKNOWN OPERATOR! (THIS IS AN ERROR)";
105 }
106
107 output ("op: %s", condstr);
108 switch (cond->op) {
109 case SQL_eq:
110 case SQL_is:
111 case SQL_isnot:
112 case SQL_in:
113 case SQL_notin:
114 case SQL_like:
115 case SQL_gt:
116 case SQL_lt:
117 case SQL_geq:
118 case SQL_leq:
119 output ("left:");
120 sql_display_field (indent + 1, cond->d.pair.left);
121 output ("right:");
122 sql_display_field (indent + 1, cond->d.pair.right);
123 break;
124
125 case SQL_between:
126 output ("field:");
127 sql_display_field (indent + 1, cond->d.between.field);
128 output ("lower:");
129 sql_display_field (indent + 1, cond->d.between.lower);
130 output ("upper:");
131 sql_display_field (indent + 1, cond->d.between.upper);
132 break;
133 }
134
135 return 0;
136 }
137
138 static int
sql_display_where(int indent,sql_where * where)139 sql_display_where (int indent, sql_where * where)
140 {
141 switch (where->type) {
142 case SQL_single:
143 sql_display_condition (indent + 1, where->d.single);
144 break;
145
146 case SQL_negated:
147 output ("negated:");
148 sql_display_where (indent + 1, where->d.negated);
149 break;
150
151 case SQL_pair:
152 output ("pair: %d", where->d.pair.op);
153 output ("left:");
154 sql_display_where (indent + 1, where->d.pair.left);
155 output ("right:");
156 sql_display_where (indent + 1, where->d.pair.right);
157 break;
158 }
159
160 return 0;
161 }
162
163 static int
sql_display_table(int indent,sql_table * table)164 sql_display_table (int indent, sql_table * table)
165 {
166 if (table->join_type != SQL_cross_join) {
167 switch (table->join_type) {
168 case SQL_inner_join:
169 output ("inner join");
170 break;
171 case SQL_left_join:
172 output ("left join");
173 break;
174 case SQL_right_join:
175 output ("right join");
176 break;
177 case SQL_full_join:
178 output ("full join");
179 break;
180 default:
181 break;
182 }
183 }
184
185 switch (table->type) {
186 case SQL_simple:
187 output ("table: %s", table->d.simple);
188 break;
189
190 case SQL_nestedselect:
191 output ("table:");
192 sql_display_select (indent + 1, table->d.select);
193 break;
194 }
195
196 if (table->join_cond) {
197 output ("cond:");
198 sql_display_where (indent + 1, table->join_cond);
199 }
200
201 return 0;
202 }
203
204 static int
sql_display_select(int indent,sql_select_statement * statement)205 sql_display_select (int indent, sql_select_statement * statement)
206 {
207 GList *cur;
208
209 if (statement->distinct)
210 output ("distinct");
211
212 output ("fields:");
213
214 for (cur = statement->fields; cur != NULL; cur = cur->next)
215 sql_display_field (indent + 1, cur->data);
216
217 output ("from:");
218
219 for (cur = statement->from; cur != NULL; cur = cur->next)
220 sql_display_table (indent + 1, cur->data);
221
222 if (statement->where) {
223 output ("where:");
224 sql_display_where (indent + 1, statement->where);
225 }
226
227 if (statement->order)
228 output ("order by:");
229 for (cur = statement->order; cur != NULL; cur = cur->next)
230 sql_display_order_by (indent + 1, cur->data);
231
232 if (statement->group)
233 output ("group by:");
234 for (cur = statement->group; cur != NULL; cur = cur->next)
235 sql_display_field (indent + 1, cur->data);
236
237 return 0;
238 }
239
240 static int
sql_display_order_by(int indent,sql_order_field * order_by)241 sql_display_order_by (int indent, sql_order_field *order_by)
242 {
243 GList *walk;
244 output ("order by %s", order_by->order_type == SQL_asc ? "ASC": "DESC");
245 for (walk = order_by->name; walk; walk = walk->next)
246 output ("%s", (gchar*) walk->data);
247 return 0;
248 }
249
250 static int
sql_display_insert(int indent,sql_insert_statement * insert)251 sql_display_insert (int indent, sql_insert_statement * insert)
252 {
253 GList *walk;
254
255 output ("table");
256 sql_display_table (indent + 1, insert->table);
257
258 if (insert->fields) {
259 output ("fields:");
260 for (walk = insert->fields; walk != NULL; walk = walk->next)
261 sql_display_field (indent + 1, walk->data);
262 }
263
264 output ("values:");
265 for (walk = insert->values; walk != NULL; walk = walk->next)
266 sql_display_field (indent + 1, walk->data);
267
268 return 0;
269 }
270
271 static int
sql_display_update(int indent,sql_update_statement * update)272 sql_display_update (int indent, sql_update_statement * update)
273 {
274 GList *walk;
275
276 output ("table:");
277 sql_display_table (indent + 1, update->table);
278
279 output ("set:");
280 for (walk = update->set; walk != NULL; walk = walk->next) {
281 sql_display_condition (indent + 1, walk->data);
282 }
283
284 if (update->where) {
285 output ("where:");
286 sql_display_where (indent + 1, update->where);
287 }
288
289 return 0;
290
291 }
292
sql_display(sql_statement * statement)293 int
294 sql_display (sql_statement * statement)
295 {
296 int indent = 0;
297
298 output ("query: %s", statement->full_query);
299 switch (statement->type) {
300 case SQL_select:
301 sql_display_select (indent + 1, statement->statement);
302 break;
303
304 case SQL_insert:
305 sql_display_insert (indent + 1, statement->statement);
306 break;
307
308 case SQL_update:
309 sql_display_update (indent + 1, statement->statement);
310 break;
311
312 default:
313 fprintf (stderr, "Unknown statement type: %d", statement->type);
314 }
315
316 return 0;
317 }
318