1 #include <stdio.h>
2 #include <stdlib.h>
3 
4 #include "mem.h"
5 #include "sql_parser.h"
6 #include "sql_tree.h"
7 
8 sql_statement *
sql_statement_build(sql_statement_type type,void * statement)9 sql_statement_build (sql_statement_type type, void *statement)
10 {
11 	sql_statement *retval;
12 
13 	retval = memsql_alloc (sizeof *retval);
14 
15 	retval->type = type;
16 	retval->statement = statement;
17 	retval->full_query = NULL;
18 
19 	return retval;
20 }
21 
22 sql_select_statement *
sql_select_statement_build(int distinct,GList * fields,GList * from,sql_where * where,GList * order,GList * group)23 sql_select_statement_build (int distinct, GList * fields, GList * from,
24 			    sql_where * where, GList * order, GList * group)
25 {
26 	sql_select_statement *retval;
27 
28 	retval = memsql_alloc (sizeof *retval);
29 
30 	retval->distinct = distinct;
31 	retval->fields = fields;
32 	retval->from = from;
33 	retval->where = where;
34 	retval->order = order;
35 	retval->group = group;
36 
37 	return retval;
38 }
39 
40 sql_insert_statement *
sql_insert_statement_build(sql_table * table,GList * fields,GList * values)41 sql_insert_statement_build (sql_table * table, GList * fields, GList * values)
42 {
43 	sql_insert_statement *retval;
44 
45 	retval = memsql_alloc (sizeof *retval);
46 
47 	retval->table = table;
48 	retval->values = values;
49 	retval->fields = fields;
50 
51 	return retval;
52 }
53 
54 sql_update_statement *
sql_update_statement_build(sql_table * table,GList * set,sql_where * where)55 sql_update_statement_build (sql_table * table, GList * set, sql_where * where)
56 {
57 	sql_update_statement *retval;
58 
59 	retval = memsql_alloc (sizeof *retval);
60 
61 	retval->table = table;
62 	retval->set = set;
63 	retval->where = where;
64 
65 	return retval;
66 }
67 
68 sql_delete_statement *
sql_delete_statement_build(sql_table * table,sql_where * where)69 sql_delete_statement_build (sql_table * table, sql_where * where)
70 {
71 	sql_delete_statement *retval;
72 
73 	retval = memsql_alloc (sizeof *retval);
74 	retval->table = table;
75 	retval->where = where;
76 
77 	return retval;
78 }
79 
80 sql_field_item *
sql_field_build_function(gchar * funcname,GList * funcarglist)81 sql_field_build_function (gchar * funcname, GList * funcarglist)
82 {
83 	sql_field_item *item;
84 
85 	item = memsql_alloc (sizeof *item);
86 	item->type = SQL_function;
87 	item->d.function.funcname = funcname;
88 	item->d.function.funcarglist = funcarglist;
89 
90 	return item;
91 
92 }
93 
94 sql_field_item *
sql_field_item_build(GList * name)95 sql_field_item_build (GList * name)
96 {
97 	sql_field_item *item;
98 
99 	item = memsql_alloc (sizeof *item);
100 	item->type = SQL_name;
101 	item->d.name = name;
102 
103 	return item;
104 }
105 
106 sql_field_item *
sql_field_item_build_equation(sql_field_item * left,sql_field_item * right,sql_field_operator op)107 sql_field_item_build_equation (sql_field_item * left, sql_field_item * right,
108 			       sql_field_operator op)
109 {
110 	sql_field_item *item;
111 
112 	item = memsql_alloc (sizeof *item);
113 	item->type = SQL_equation;
114 	item->d.equation.left = left;
115 	item->d.equation.right = right;
116 	item->d.equation.op = op;
117 
118 	return item;
119 }
120 
121 sql_field_item *
sql_field_item_build_select(sql_select_statement * select)122 sql_field_item_build_select (sql_select_statement * select)
123 {
124 	sql_field_item *item;
125 
126 	item = memsql_alloc (sizeof *item);
127 	item->type = SQL_inlineselect;
128 	item->d.select = select;
129 
130 	return item;
131 }
132 
133 sql_field *
sql_field_build(sql_field_item * item)134 sql_field_build (sql_field_item * item)
135 {
136 	sql_field *retval;
137 
138 	retval = memsql_alloc (sizeof *retval);
139 	retval->as = NULL;
140 	retval->item = item;
141 	retval->param_spec = NULL;
142 
143 	return retval;
144 }
145 
146 sql_field *
sql_field_set_as(sql_field * field,char * as)147 sql_field_set_as (sql_field * field, char *as)
148 {
149 	field->as = as;
150 	return field;
151 }
152 
153 sql_field *
sql_field_set_param_spec(sql_field * field,GList * param_spec)154 sql_field_set_param_spec (sql_field * field, GList * param_spec)
155 {
156 	field->param_spec = param_spec;
157 	return field;
158 }
159 
160 param_spec *
param_spec_build(param_spec_type type,char * content)161 param_spec_build (param_spec_type type, char *content)
162 {
163 	param_spec *retval;
164 
165 	retval = memsql_alloc (sizeof *retval);
166 	retval->type = type;
167 	retval->content = content;
168 
169 	return retval;
170 }
171 
172 sql_table *
sql_table_build(char * tablename)173 sql_table_build (char *tablename)
174 {
175 	sql_table *retval;
176 
177 	retval = memsql_alloc (sizeof *retval);
178 
179 	retval->type = SQL_simple;
180 
181 	retval->d.simple = memsql_strdup (tablename);
182 
183 	retval->as = NULL;
184 	retval->join_type = SQL_cross_join;
185 	retval->join_cond = NULL;
186 
187 	return retval;
188 }
189 
190 sql_table *
sql_table_set_join(sql_table * table,sql_join_type join_type,sql_where * cond)191 sql_table_set_join (sql_table * table, sql_join_type join_type, sql_where * cond)
192 {
193 	table->join_type = join_type;
194 	table->join_cond = cond;
195 
196 	return table;
197 }
198 
199 sql_table *
sql_table_build_select(sql_select_statement * select)200 sql_table_build_select (sql_select_statement * select)
201 {
202 	sql_table *retval;
203 
204 	retval = memsql_alloc (sizeof *retval);
205 	retval->type = SQL_nestedselect, retval->d.select = select;
206 	retval->as = NULL;
207 
208 	return retval;
209 }
210 
211 sql_table *
sql_table_set_as(sql_table * table,char * as)212 sql_table_set_as (sql_table * table, char *as)
213 {
214 	table->as = as;
215 	return table;
216 }
217 
218 sql_where *
sql_where_build_single(sql_condition * cond)219 sql_where_build_single (sql_condition * cond)
220 {
221 	sql_where *retval;
222 
223 	retval = memsql_alloc (sizeof *retval);
224 	retval->type = SQL_single;
225 	retval->d.single = cond;
226 
227 	return retval;
228 }
229 
230 sql_where *
sql_where_build_negated(sql_where * where)231 sql_where_build_negated (sql_where * where)
232 {
233 	sql_where *retval;
234 
235 	retval = memsql_alloc (sizeof *retval);
236 	retval->type = SQL_negated;
237 	retval->d.negated = where;
238 
239 	return retval;
240 }
241 
242 sql_where *
sql_where_build_pair(sql_where * left,sql_where * right,sql_logic_operator op)243 sql_where_build_pair (sql_where * left, sql_where * right,
244 		      sql_logic_operator op)
245 {
246 	sql_where *retval;
247 
248 	retval = memsql_alloc (sizeof *retval);
249 	retval->type = SQL_pair;
250 	retval->d.pair.left = left;
251 	retval->d.pair.right = right;
252 	retval->d.pair.op = op;
253 
254 	return retval;
255 }
256 
257 sql_condition *
sql_build_condition(sql_field * left,sql_field * right,sql_condition_operator op)258 sql_build_condition (sql_field * left, sql_field * right,
259 		     sql_condition_operator op)
260 {
261 	sql_condition *retval;
262 
263 	retval = memsql_alloc (sizeof *retval);
264 
265 	retval->op = op;
266 	retval->d.pair.left = left;
267 	retval->d.pair.right = right;
268 
269 	return retval;
270 }
271 
272 sql_condition *
sql_build_condition_between(sql_field * field,sql_field * lower,sql_field * upper)273 sql_build_condition_between (sql_field * field, sql_field * lower,
274 			     sql_field * upper)
275 {
276 	sql_condition *retval;
277 
278 	retval = memsql_alloc (sizeof *retval);
279 
280 	retval->op = SQL_between;
281 
282 	retval->d.between.field = field;
283 	retval->d.between.lower = lower;
284 	retval->d.between.upper = upper;
285 
286 	return retval;
287 }
288 
289 sql_order_field *
sql_order_field_build(GList * name,sql_ordertype order_type)290 sql_order_field_build (GList * name, sql_ordertype order_type)
291 {
292 	sql_order_field *retval;
293 
294 	retval = memsql_alloc (sizeof *retval);
295 
296 	retval->name = name;
297 	retval->order_type = order_type;
298 
299 	return retval;
300 }
301