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