f45b5e44fe069c26d6275a1891c81996f65ce566
[dbsrgits/SQL-Abstract.git] / t / 11unparse.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use Test::Deep;
6 use SQL::Abstract::Tree;
7
8 my $sqlat = SQL::Abstract::Tree->new;
9
10 cmp_deeply($sqlat->parse("SELECT a, b.*, * FROM foo WHERE foo.a =1 and foo.b LIKE 'station'"), [
11   [
12     [
13       "SELECT",
14       [
15         [
16           "LIST",
17           [
18             [
19               "LITERAL",
20               [
21                 "a"
22               ]
23             ],
24             [
25               "LITERAL",
26               [
27                 "b.*"
28               ]
29             ],
30             [
31               "LITERAL",
32               [
33                 "*"
34               ]
35             ]
36           ]
37         ]
38       ]
39     ],
40     [
41       "FROM",
42       [
43         [
44           "LITERAL",
45           [
46             "foo"
47           ]
48         ]
49       ]
50     ]
51   ],
52   [
53     "WHERE",
54     [
55       [
56         "AND",
57         [
58           [
59             "=",
60             [
61               [
62                 "LITERAL",
63                 [
64                   "foo.a"
65                 ]
66               ],
67               [
68                 "LITERAL",
69                 [
70                   1
71                 ]
72               ]
73             ]
74           ],
75           [
76             "LIKE",
77             [
78               [
79                 "LITERAL",
80                 [
81                   "foo.b"
82                 ]
83               ],
84               [
85                 "LITERAL",
86                 [
87                   "'station'"
88                 ]
89               ]
90             ]
91           ]
92         ]
93       ]
94     ]
95   ]
96 ], 'simple statement parsed correctly');
97
98 cmp_deeply($sqlat->parse( "SELECT * FROM (SELECT * FROM foobar) WHERE foo.a =1 and foo.b LIKE 'station'"), [
99   [
100     [
101       "SELECT",
102       [
103         [
104           "LITERAL",
105           [
106             "*"
107           ]
108         ]
109       ]
110     ],
111     [
112       "FROM",
113       [
114         [
115           "PAREN",
116           [
117             [
118               [
119                 "SELECT",
120                 [
121                   [
122                     "LITERAL",
123                     [
124                       "*"
125                     ]
126                   ]
127                 ]
128               ],
129               [
130                 "FROM",
131                 [
132                   [
133                     "LITERAL",
134                     [
135                       "foobar"
136                     ]
137                   ]
138                 ]
139               ]
140             ]
141           ]
142         ]
143       ]
144     ]
145   ],
146   [
147     "WHERE",
148     [
149       [
150         "AND",
151         [
152           [
153             "=",
154             [
155               [
156                 "LITERAL",
157                 [
158                   "foo.a"
159                 ]
160               ],
161               [
162                 "LITERAL",
163                 [
164                   1
165                 ]
166               ]
167             ]
168           ],
169           [
170             "LIKE",
171             [
172               [
173                 "LITERAL",
174                 [
175                   "foo.b"
176                 ]
177               ],
178               [
179                 "LITERAL",
180                 [
181                   "'station'"
182                 ]
183               ]
184             ]
185           ]
186         ]
187       ]
188     ]
189   ]
190 ], 'subquery statement parsed correctly');
191
192 cmp_deeply($sqlat->parse("SELECT * FROM lolz WHERE ( foo.a =1 ) and foo.b LIKE 'station'"), [
193   [
194     [
195       "SELECT",
196       [
197         [
198           "LITERAL",
199           [
200             "*"
201           ]
202         ]
203       ]
204     ],
205     [
206       "FROM",
207       [
208         [
209           "LITERAL",
210           [
211             "lolz"
212           ]
213         ]
214       ]
215     ]
216   ],
217   [
218     "WHERE",
219     [
220       [
221         "AND",
222         [
223           [
224             "PAREN",
225             [
226               [
227                 "=",
228                 [
229                   [
230                     "LITERAL",
231                     [
232                       "foo.a"
233                     ]
234                   ],
235                   [
236                     "LITERAL",
237                     [
238                       1
239                     ]
240                   ]
241                 ]
242               ]
243             ]
244           ],
245           [
246             "LIKE",
247             [
248               [
249                 "LITERAL",
250                 [
251                   "foo.b"
252                 ]
253               ],
254               [
255                 "LITERAL",
256                 [
257                   "'station'"
258                 ]
259               ]
260             ]
261           ]
262         ]
263       ]
264     ]
265   ]
266 ], 'simple statement with parens in where parsed correctly');
267
268 cmp_deeply($sqlat->parse( "SELECT [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype] FROM [users_roles] [me] JOIN [roles] [role] ON [role].[id] = [me].[role_id] JOIN [roles_permissions] [role_permissions] ON [role_permissions].[role_id] = [role].[id] JOIN [permissions] [permission] ON [permission].[id] = [role_permissions].[permission_id] JOIN [permissionscreens] [permission_screens] ON [permission_screens].[permission_id] = [permission].[id] JOIN [screens] [screen] ON [screen].[id] = [permission_screens].[screen_id] WHERE ( [me].[user_id] = ? ) GROUP BY [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype]"), [
269   [
270     [
271       [
272         [
273           [
274             [
275               [
276                 [
277                   [
278                     [
279                       [
280                         [
281                           [
282                             "SELECT",
283                             [
284                               [
285                                 "LIST",
286                                 [
287                                   [
288                                     "LITERAL",
289                                     [
290                                       "[screen].[id]"
291                                     ]
292                                   ],
293                                   [
294                                     "LITERAL",
295                                     [
296                                       "[screen].[name]"
297                                     ]
298                                   ],
299                                   [
300                                     "LITERAL",
301                                     [
302                                       "[screen].[section_id]"
303                                     ]
304                                   ],
305                                   [
306                                     "LITERAL",
307                                     [
308                                       "[screen].[xtype]"
309                                     ]
310                                   ]
311                                 ]
312                               ]
313                             ]
314                           ],
315                           [
316                             "FROM",
317                             [
318                               [
319                                 [
320                                   "LITERAL",
321                                   [
322                                     "[users_roles]"
323                                   ]
324                                 ],
325                                 [
326                                   "LITERAL",
327                                   [
328                                     "[me]"
329                                   ]
330                                 ]
331                               ]
332                             ]
333                           ]
334                         ],
335                         [
336                           "JOIN",
337                           [
338                             [
339                               [
340                                 "LITERAL",
341                                 [
342                                   "[roles]"
343                                 ]
344                               ],
345                               [
346                                 "LITERAL",
347                                 [
348                                   "[role]"
349                                 ]
350                               ]
351                             ]
352                           ]
353                         ]
354                       ],
355                       [
356                         "ON",
357                         [
358                           [
359                             "=",
360                             [
361                               [
362                                 "LITERAL",
363                                 [
364                                   "[role].[id]"
365                                 ]
366                               ],
367                               [
368                                 "LITERAL",
369                                 [
370                                   "[me].[role_id]"
371                                 ]
372                               ]
373                             ]
374                           ]
375                         ]
376                       ]
377                     ],
378                     [
379                       "JOIN",
380                       [
381                         [
382                           [
383                             "LITERAL",
384                             [
385                               "[roles_permissions]"
386                             ]
387                           ],
388                           [
389                             "LITERAL",
390                             [
391                               "[role_permissions]"
392                             ]
393                           ]
394                         ]
395                       ]
396                     ]
397                   ],
398                   [
399                     "ON",
400                     [
401                       [
402                         "=",
403                         [
404                           [
405                             "LITERAL",
406                             [
407                               "[role_permissions].[role_id]"
408                             ]
409                           ],
410                           [
411                             "LITERAL",
412                             [
413                               "[role].[id]"
414                             ]
415                           ]
416                         ]
417                       ]
418                     ]
419                   ]
420                 ],
421                 [
422                   "JOIN",
423                   [
424                     [
425                       [
426                         "LITERAL",
427                         [
428                           "[permissions]"
429                         ]
430                       ],
431                       [
432                         "LITERAL",
433                         [
434                           "[permission]"
435                         ]
436                       ]
437                     ]
438                   ]
439                 ]
440               ],
441               [
442                 "ON",
443                 [
444                   [
445                     "=",
446                     [
447                       [
448                         "LITERAL",
449                         [
450                           "[permission].[id]"
451                         ]
452                       ],
453                       [
454                         "LITERAL",
455                         [
456                           "[role_permissions].[permission_id]"
457                         ]
458                       ]
459                     ]
460                   ]
461                 ]
462               ]
463             ],
464             [
465               "JOIN",
466               [
467                 [
468                   [
469                     "LITERAL",
470                     [
471                       "[permissionscreens]"
472                     ]
473                   ],
474                   [
475                     "LITERAL",
476                     [
477                       "[permission_screens]"
478                     ]
479                   ]
480                 ]
481               ]
482             ]
483           ],
484           [
485             "ON",
486             [
487               [
488                 "=",
489                 [
490                   [
491                     "LITERAL",
492                     [
493                       "[permission_screens].[permission_id]"
494                     ]
495                   ],
496                   [
497                     "LITERAL",
498                     [
499                       "[permission].[id]"
500                     ]
501                   ]
502                 ]
503               ]
504             ]
505           ]
506         ],
507         [
508           "JOIN",
509           [
510             [
511               [
512                 "LITERAL",
513                 [
514                   "[screens]"
515                 ]
516               ],
517               [
518                 "LITERAL",
519                 [
520                   "[screen]"
521                 ]
522               ]
523             ]
524           ]
525         ]
526       ],
527       [
528         "ON",
529         [
530           [
531             "=",
532             [
533               [
534                 "LITERAL",
535                 [
536                   "[screen].[id]"
537                 ]
538               ],
539               [
540                 "LITERAL",
541                 [
542                   "[permission_screens].[screen_id]"
543                 ]
544               ]
545             ]
546           ]
547         ]
548       ]
549     ],
550     [
551       "WHERE",
552       [
553         [
554           "PAREN",
555           [
556             [
557               "=",
558               [
559                 [
560                   "LITERAL",
561                   [
562                     "[me].[user_id]"
563                   ]
564                 ],
565                 [
566                   "PLACEHOLDER",
567                   [
568                     "?"
569                   ]
570                 ]
571               ]
572             ]
573           ]
574         ]
575       ]
576     ]
577   ],
578   [
579     "GROUP BY",
580     [
581       [
582         "LIST",
583         [
584           [
585             "LITERAL",
586             [
587               "[screen].[id]"
588             ]
589           ],
590           [
591             "LITERAL",
592             [
593               "[screen].[name]"
594             ]
595           ],
596           [
597             "LITERAL",
598             [
599               "[screen].[section_id]"
600             ]
601           ],
602           [
603             "LITERAL",
604             [
605               "[screen].[xtype]"
606             ]
607           ]
608         ]
609       ]
610     ]
611   ]
612 ], 'real life statement 1 parsed correctly');
613
614 cmp_deeply($sqlat->parse("SELECT x, y FROM foo WHERE x IN (?, ?, ?, ?)"), [
615   [
616     [
617       "SELECT",
618       [
619         [
620           "LIST",
621           [
622             [
623               "LITERAL",
624               [
625                 "x"
626               ]
627             ],
628             [
629               "LITERAL",
630               [
631                 "y"
632               ]
633             ]
634           ]
635         ]
636       ]
637     ],
638     [
639       "FROM",
640       [
641         [
642           "LITERAL",
643           [
644             "foo"
645           ]
646         ]
647       ]
648     ]
649   ],
650   [
651     "WHERE",
652     [
653       [
654         "IN",
655         [
656           [
657             "LITERAL",
658             [
659               "x"
660             ]
661           ],
662           [
663             "PAREN",
664             [
665               [
666                 "LIST",
667                 [
668                   [
669                     "PLACEHOLDER",
670                     [
671                       "?"
672                     ]
673                   ],
674                   [
675                     "PLACEHOLDER",
676                     [
677                       "?"
678                     ]
679                   ],
680                   [
681                     "PLACEHOLDER",
682                     [
683                       "?"
684                     ]
685                   ],
686                   [
687                     "PLACEHOLDER",
688                     [
689                       "?"
690                     ]
691                   ]
692                 ]
693               ]
694             ]
695           ]
696         ]
697       ]
698     ]
699   ]
700 ], 'Lists parsed correctly');
701
702 done_testing;