Commit | Line | Data |
37f2cc3f |
1 | =head1 NAME |
2 | |
3 | SQL::Abstract::Manual::Specification |
4 | |
5 | =head1 DESCRIPTION |
6 | |
7 | These are the examples for the AST |
8 | |
9 | =head1 EXAMPLES |
10 | |
11 | The following are example SQL statements and the AST that would represent each |
12 | one. The SQL used is from the MySQL dialect. |
13 | |
14 | =over 4 |
15 | |
16 | =item * SELECT 1 |
17 | |
18 | { |
19 | type => 'select', |
20 | ast_version => 0.0001, |
21 | select => [ |
22 | { |
662b716d |
23 | type => 'Value', |
24 | subtype => 'Number', |
25 | value => 1, |
37f2cc3f |
26 | }, |
27 | ], |
28 | } |
29 | |
30 | =item * SELECT NOW() AS time FROM dual AS duality |
31 | |
32 | { |
33 | type => 'select', |
34 | ast_version => 0.0001, |
35 | select => [ |
36 | { |
662b716d |
37 | type => 'Alias', |
37f2cc3f |
38 | value => { |
39 | type => 'Function', |
40 | function => 'NOW', |
41 | }, |
3004ebb7 |
42 | as => { |
43 | type => 'Identifier', |
44 | element1 => 'time', |
45 | }, |
37f2cc3f |
46 | }, |
47 | ], |
48 | tables => { |
662b716d |
49 | type => 'Alias', |
37f2cc3f |
50 | value => { |
51 | type => 'Identifier', |
52 | element1 => 'dual', |
53 | }, |
3004ebb7 |
54 | as => { |
55 | type => 'Identifier', |
56 | element1 => 'duality', |
57 | }, |
37f2cc3f |
58 | }, |
59 | } |
60 | |
61 | =item * SELECT 1 FROM foo LEFT OUTER JOIN bar ON ( foo.col1 = bar.col2 ) |
62 | |
63 | { |
64 | type => 'select', |
65 | ast_version => 0.0001, |
66 | select => [ |
67 | { |
662b716d |
68 | type => 'Value', |
69 | subtype => 'Number', |
70 | value => 1, |
37f2cc3f |
71 | }, |
72 | ], |
73 | tables => { |
74 | type => 'Operator', |
75 | op => 'LEFT OUTER', |
76 | args => [ |
77 | { |
662b716d |
78 | type => 'Identifier', |
79 | element1 => 'foo', |
37f2cc3f |
80 | }, |
81 | { |
662b716d |
82 | type => 'Identifier', |
83 | element1 => 'bar', |
37f2cc3f |
84 | }, |
85 | ], |
86 | on => { |
87 | type => 'Operator', |
88 | op => '=', |
89 | args => [ |
90 | { |
91 | type => 'Identifier', |
92 | element1 => 'foo', |
93 | element2 => 'col1', |
94 | }, |
95 | { |
96 | type => 'Identifier', |
97 | element1 => 'bar', |
98 | element2 => 'col2', |
99 | }, |
100 | ], |
101 | }, |
102 | }, |
103 | } |
104 | |
9c604aeb |
105 | =item SELECT * FROM foo WHERE name = 'John' |
106 | |
107 | { |
108 | type => 'select', |
109 | ast_version => 0.0001, |
110 | select => [ |
111 | { |
662b716d |
112 | type => 'Identifier', |
113 | element1 => '*', |
9c604aeb |
114 | }, |
115 | ], |
116 | tables => { |
662b716d |
117 | type => 'Identifier', |
118 | element1 => 'foo', |
9c604aeb |
119 | }, |
120 | where => { |
121 | type => 'Operator', |
122 | op => '=', |
123 | args => [ |
124 | { |
125 | type => 'Identifier', |
126 | element1 => 'name', |
127 | }, |
128 | { |
129 | type => 'Value', |
130 | subtype => 'String', |
131 | element1 => 'John', |
132 | }, |
133 | ], |
4f6e8987 |
134 | }, |
9c604aeb |
135 | } |
136 | |
4f6e8987 |
137 | =item SELECT COUNT(*) FROM foo WHERE name = 'John' AND ( title = 'Mr' OR abbrev = 'Dr' ) |
138 | |
139 | { |
140 | type => 'select', |
141 | ast_version => 0.0001, |
142 | select => [ |
143 | { |
662b716d |
144 | type => 'Operator', |
145 | op => 'COUNT', |
146 | args => [ |
147 | { |
148 | type => 'Identifier', |
149 | element1 => '*', |
150 | }, |
151 | ], |
4f6e8987 |
152 | }, |
153 | ], |
154 | tables => { |
662b716d |
155 | type => 'Identifier', |
156 | element1 => 'foo', |
4f6e8987 |
157 | }, |
158 | where => { |
159 | type => 'Operator', |
160 | op => 'AND', |
161 | args => [ |
162 | { |
163 | type => 'Operator', |
164 | op => '=', |
165 | args => [ |
166 | { |
167 | type => 'Identifier', |
168 | element1 => 'name', |
169 | }, |
170 | { |
171 | type => 'Value', |
172 | subtype => 'String', |
173 | element1 => 'John', |
174 | }, |
175 | ], |
176 | }, |
177 | { |
3d8ddf0b |
178 | type => 'Operator', |
179 | op => 'OR', |
4f6e8987 |
180 | args => [ |
181 | { |
182 | type => 'Operator', |
3d8ddf0b |
183 | op => '=', |
184 | args => [ |
185 | { |
186 | type => 'Identifier', |
187 | element1 => 'title', |
188 | }, |
189 | { |
190 | type => 'Value', |
191 | subtype => 'String', |
192 | element1 => 'Mr', |
193 | }, |
194 | ], |
195 | }, |
196 | { |
197 | type => 'Operator', |
198 | op => '=', |
4f6e8987 |
199 | args => [ |
200 | { |
3d8ddf0b |
201 | type => 'Identifier', |
202 | element1 => 'abbrev', |
4f6e8987 |
203 | }, |
204 | { |
3d8ddf0b |
205 | type => 'Value', |
206 | subtype => 'String', |
207 | element1 => 'Dr', |
4f6e8987 |
208 | }, |
209 | ], |
210 | }, |
211 | ], |
212 | }, |
213 | ], |
214 | }, |
215 | } |
216 | |
de1a11fa |
217 | =item SELECT COUNT(DISTINCT(*)) FROM foo WHERE ( name = 'John' AND title = 'Mr' ) OR abbrev = 'Dr' |
3d8ddf0b |
218 | |
219 | { |
220 | type => 'select', |
221 | ast_version => 0.0001, |
222 | select => [ |
de1a11fa |
223 | { |
662b716d |
224 | type => 'Operator', |
225 | op => 'COUNT', |
226 | args => [ |
227 | { |
228 | type => 'Operator', |
229 | op => 'DISTINCT', |
230 | args => [ |
231 | { |
232 | type => 'Identifier', |
233 | element1 => '*', |
234 | }, |
235 | ], |
236 | }, |
237 | ], |
3d8ddf0b |
238 | }, |
239 | ], |
240 | tables => { |
662b716d |
241 | type => 'Identifier', |
242 | element1 => 'foo', |
3d8ddf0b |
243 | }, |
244 | where => { |
245 | type => 'Operator', |
246 | op => 'OR', |
247 | args => [ |
248 | { |
249 | type => 'Operator', |
250 | op => 'AND', |
251 | args => [ |
252 | { |
253 | type => 'Operator', |
254 | op => '=', |
255 | args => [ |
256 | { |
257 | type => 'Identifier', |
258 | element1 => 'name', |
259 | }, |
260 | { |
261 | type => 'Value', |
262 | subtype => 'String', |
263 | element1 => 'John', |
264 | }, |
265 | ], |
266 | }, |
267 | { |
268 | type => 'Operator', |
269 | op => '=', |
270 | args => [ |
271 | { |
272 | type => 'Identifier', |
273 | element1 => 'title', |
274 | }, |
275 | { |
276 | type => 'Value', |
277 | subtype => 'String', |
278 | element1 => 'Mr', |
279 | }, |
280 | ], |
281 | }, |
282 | ], |
283 | }, |
284 | { |
285 | type => 'Operator', |
286 | op => '=', |
287 | args => [ |
288 | { |
289 | type => 'Identifier', |
290 | element1 => 'abbrev', |
291 | }, |
292 | { |
293 | type => 'Value', |
294 | subtype => 'String', |
295 | element1 => 'Dr', |
296 | }, |
297 | ], |
298 | }, |
299 | ], |
300 | }, |
301 | } |
302 | |
da74c1c8 |
303 | =item * SELECT foo, bar baz FROM foo ORDER BY bar, baz DESC GROUP BY 1,3,2 |
304 | |
305 | { |
306 | type => 'select', |
307 | ast_version => 0.0001, |
308 | select => [ |
309 | { |
662b716d |
310 | type => 'Identifier', |
311 | element1 => 'foo', |
da74c1c8 |
312 | }, |
313 | { |
662b716d |
314 | type => 'Identifier', |
315 | elements => 'bar', |
da74c1c8 |
316 | }, |
317 | { |
662b716d |
318 | type => 'Identifier', |
319 | element1 => 'baz', |
da74c1c8 |
320 | }, |
321 | ], |
322 | tables => { |
662b716d |
323 | type => 'Identifier', |
324 | element1 => 'foo', |
da74c1c8 |
325 | }, |
326 | orderby => [ |
327 | { |
328 | type => 'OrderbyComponent', |
329 | value => { |
330 | type => 'Identifier', |
331 | element1 => 'bar', |
332 | }, |
333 | dir => 'ASC', |
334 | }, |
335 | { |
336 | type => 'OrderbyComponent', |
337 | value => { |
338 | type => 'Identifier', |
339 | element1 => 'baz', |
340 | }, |
341 | dir => 'DESC', |
342 | }, |
343 | ], |
344 | groupby => [ |
345 | { |
346 | type => 'GroupbyComponent', |
347 | value => { |
da93022e |
348 | type => 'Value', |
349 | subtype => 'Number', |
da74c1c8 |
350 | value => 1, |
351 | }, |
352 | }, |
353 | { |
354 | type => 'GroupbyComponent', |
355 | value => { |
da93022e |
356 | type => 'Value', |
357 | subtype => 'Number', |
da74c1c8 |
358 | value => 3, |
359 | }, |
360 | }, |
361 | { |
362 | type => 'GroupbyComponent', |
363 | value => { |
da93022e |
364 | type => 'Value', |
365 | subtype => 'Number', |
da74c1c8 |
366 | value => 2, |
367 | }, |
368 | }, |
369 | ], |
370 | } |
371 | |
7b7ed1cb |
372 | =item * SELECT * FROM ( SELECT 1 ) AS foo |
753e226d |
373 | |
374 | { |
7b7ed1cb |
375 | type => 'select', |
376 | ast_version => 0.0001, |
377 | select => [ |
378 | { |
379 | type => 'Identifier', |
380 | element1 => '*', |
381 | }, |
382 | ], |
383 | tables => { |
384 | type => 'Identifier', |
385 | element1 => 'foo', |
386 | value => { |
387 | type => 'select', |
388 | ast_version => 0.0001, |
389 | select => [ |
390 | { |
391 | type => 'Value', |
392 | subtype => 'Number', |
393 | value => 1, |
394 | }, |
395 | ], |
396 | }, |
397 | as => { |
398 | type => 'Identifier', |
399 | element1 => 'foo', |
400 | }, |
401 | }, |
402 | } |
403 | |
404 | =item * INSERT INTO foo ( col1, col2 ) VALUES ( 1, 3 ) |
405 | |
406 | { |
407 | type => 'insert', |
753e226d |
408 | ast_version => 0.0001, |
409 | tables => { |
662b716d |
410 | type => 'Identifier', |
411 | element1 => 'foo', |
753e226d |
412 | }, |
413 | set => [ |
a08e7c02 |
414 | [ |
415 | { |
753e226d |
416 | type => 'Identifier, |
417 | element1 => 'col1', |
418 | }, |
7b7ed1cb |
419 | { |
420 | type => 'Identifier, |
421 | element1 => 'col2', |
422 | }, |
a08e7c02 |
423 | ], |
424 | [ |
425 | { |
da93022e |
426 | type => 'Value', |
427 | subtype => 'Number', |
7b7ed1cb |
428 | value => '1', |
429 | }, |
430 | { |
431 | type => 'Value', |
432 | subtype => 'Number', |
433 | value => '3', |
753e226d |
434 | }, |
a08e7c02 |
435 | ], |
753e226d |
436 | ], |
437 | } |
438 | |
7b7ed1cb |
439 | =item * INSERT INTO foo ( col1, col2 ) VALUES ( 1, 3 ), ( 2, 4 ) |
338df86b |
440 | |
441 | { |
442 | type => 'insert', |
443 | ast_version => 0.0001, |
444 | tables => { |
662b716d |
445 | type => 'Identifier', |
446 | element1 => 'foo', |
338df86b |
447 | }, |
a08e7c02 |
448 | set => [ |
449 | [ |
450 | { |
451 | type => 'Identifier, |
452 | element1 => 'col1', |
453 | }, |
454 | { |
455 | type => 'Identifier, |
456 | element1 => 'col2', |
457 | }, |
458 | ], |
459 | [ |
460 | { |
461 | type => 'Value', |
462 | subtype => 'Number', |
463 | value => '1', |
464 | }, |
465 | { |
466 | type => 'Value', |
467 | subtype => 'Number', |
468 | value => '3', |
469 | }, |
470 | ], |
7b7ed1cb |
471 | [ |
472 | { |
473 | type => 'Value', |
474 | subtype => 'Number', |
475 | value => '2', |
476 | }, |
477 | { |
478 | type => 'Value', |
479 | subtype => 'Number', |
480 | value => '3', |
481 | }, |
482 | ], |
483 | ], |
484 | } |
485 | |
486 | =item * UPDATE foo SET col1 = 1 |
487 | |
488 | { |
489 | type => 'update', |
490 | ast_version => 0.0001, |
491 | tables => { |
492 | type => 'Identifier', |
493 | element1 => 'foo', |
494 | }, |
495 | set => [ |
496 | [ |
497 | { |
498 | type => 'Identifier, |
499 | element1 => 'col1', |
500 | }, |
501 | ], |
502 | [ |
503 | { |
504 | type => 'Value', |
505 | subtype => 'Number', |
506 | value => 1, |
507 | }, |
508 | ], |
509 | ], |
510 | } |
511 | |
512 | =item * UPDATE foo SET col1 = 1, col2 = 6 |
513 | |
514 | { |
515 | type => 'update', |
516 | ast_version => 0.0001, |
517 | tables => { |
518 | type => 'Identifier', |
519 | element1 => 'foo', |
520 | }, |
521 | set => [ |
522 | [ |
523 | { |
524 | type => 'Identifier, |
525 | element1 => 'col1', |
526 | }, |
527 | { |
528 | type => 'Identifier, |
529 | element1 => 'col2', |
530 | }, |
531 | ], |
532 | [ |
533 | { |
534 | type => 'Value', |
535 | subtype => 'Number', |
536 | value => 1, |
537 | }, |
538 | { |
539 | type => 'Value', |
540 | subtype => 'Number', |
541 | value => 6, |
542 | }, |
543 | ], |
338df86b |
544 | ], |
545 | } |
546 | |
da93022e |
547 | =item * DELETE FROM foo WHERE col1 = 10 |
548 | |
549 | { |
550 | type => 'delete', |
551 | ast_version => 0.0001, |
552 | tables => { |
662b716d |
553 | type => 'Identifier', |
554 | element1 => 'foo', |
da93022e |
555 | }, |
556 | where => { |
557 | type => 'Operator', |
558 | op => '=', |
559 | args => [ |
560 | { |
561 | type => 'Identifier', |
562 | element1 => 'col1', |
563 | }, |
564 | { |
565 | type => 'Value', |
566 | subtype => 'Number', |
567 | value => 10, |
568 | }, |
569 | ], |
570 | }, |
571 | } |
572 | |
37f2cc3f |
573 | =back |
574 | |
575 | =head1 AUTHORS |
576 | |
577 | robkinyon: Rob Kinyon C<< <rkinyon@cpan.org> >> |
578 | |
579 | =head1 LICENSE |
580 | |
581 | You may distribute this code under the same terms as Perl itself. |
582 | |
583 | =cut |