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