5 use List::Util qw(sum);
9 # equivalent to $Module::Install::AUTHOR
13 ( -e ($^O eq 'VMS' ? './inc/_author' : './inc/.author') )
16 if (not $author and not $ENV{SQLATEST_TESTER} and not $ENV{AUTOMATED_TESTING}) {
17 plan skip_all => 'Skipping resource intensive self-tests, use SQLATEST_TESTER=1 to run';
22 # WHERE condition - equal
26 q/SELECT foo FROM bar WHERE a = 1/,
27 q/SELECT foo FROM bar WHERE a=1/,
28 q/SELECT foo FROM bar WHERE (a = 1)/,
29 q/SELECT foo FROM bar WHERE (a=1)/,
30 q/SELECT foo FROM bar WHERE ( a = 1 )/,
55 q/SELECT foo FROM bar WHERE ((a = 1))/,
56 q/SELECT foo FROM bar WHERE ( (a = 1) )/,
57 q/SELECT foo FROM bar WHERE ( ( a = 1 ) )/,
63 q/SELECT foo FROM bar WHERE a = 1 AND b = 1/,
64 q/SELECT foo FROM bar WHERE (a = 1) AND (b = 1)/,
65 q/SELECT foo FROM bar WHERE ((a = 1) AND (b = 1))/,
66 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1)/,
67 q/SELECT foo FROM bar WHERE ((a = 1 AND b = 1))/,
68 q/SELECT foo FROM bar WHERE (((a = 1) AND (b = 1)))/,
114 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/,
115 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1 AND c = 1)/,
116 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) AND c = 1/,
117 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 AND c = 1)/,
118 q/SELECT foo FROM bar WHERE ((((a = 1))) AND (b = 1 AND c = 1))/,
124 q/SELECT foo FROM bar WHERE a = 1 OR b = 1 OR c = 1/,
125 q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) OR c = 1/,
126 q/SELECT foo FROM bar WHERE a = 1 OR (b = 1 OR c = 1)/,
127 q/SELECT foo FROM bar WHERE a = 1 OR ((b = 1 OR (c = 1)))/,
133 q/SELECT foo FROM bar WHERE (a = 1) AND (b = 1 OR c = 1 OR d = 1) AND (e = 1 AND f = 1)/,
134 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1 OR d = 1) AND e = 1 AND (f = 1)/,
135 q/SELECT foo FROM bar WHERE ( ((a = 1) AND ( b = 1 OR (c = 1 OR d = 1) )) AND ((e = 1)) AND f = 1) /,
141 q/SELECT foo FROM bar WHERE (a) AND (b = 2)/,
142 q/SELECT foo FROM bar WHERE (a AND b = 2)/,
143 q/SELECT foo FROM bar WHERE (a AND (b = 2))/,
144 q/SELECT foo FROM bar WHERE a AND (b = 2)/,
150 q/SELECT foo FROM bar WHERE ((NOT a) AND b = 2)/,
151 q/SELECT foo FROM bar WHERE (NOT a) AND (b = 2)/,
152 q/SELECT foo FROM bar WHERE (NOT (a)) AND b = 2/,
158 q/SELECT foo FROM bar WHERE NOT a AND (b = 2)/,
159 q/SELECT foo FROM bar WHERE (NOT a) AND (b = 2)/,
164 parenthesis_significant => 1,
166 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/,
167 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1 AND c = 1)/,
168 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) AND c = 1/,
169 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 AND c = 1)/,
170 q/SELECT foo FROM bar WHERE ((((a = 1))) AND (b = 1 AND c = 1))/,
175 parenthesis_significant => 1,
177 q/SELECT foo FROM bar WHERE a = 1 OR b = 1 OR c = 1/,
178 q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) OR c = 1/,
179 q/SELECT foo FROM bar WHERE a = 1 OR (b = 1 OR c = 1)/,
180 q/SELECT foo FROM bar WHERE a = 1 OR ((b = 1 OR (c = 1)))/,
185 parenthesis_significant => 1,
187 q/SELECT foo FROM bar WHERE (a = 1) AND (b = 1 OR c = 1 OR d = 1) AND (e = 1 AND f = 1)/,
188 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1 OR d = 1) AND e = 1 AND (f = 1)/,
189 q/SELECT foo FROM bar WHERE ( ((a = 1) AND ( b = 1 OR (c = 1 OR d = 1) )) AND ((e = 1)) AND f = 1) /,
193 # WHERE condition - different
197 q/SELECT foo FROM bar WHERE a = 1/,
198 q/SELECT quux FROM bar WHERE a = 1/,
199 q/SELECT foo FROM quux WHERE a = 1/,
200 q/FOOBAR foo FROM bar WHERE a = 1/,
202 q/SELECT foo FROM bar WHERE a = 2/,
203 q/SELECT foo FROM bar WHERE a < 1/,
204 q/SELECT foo FROM bar WHERE b = 1/,
205 q/SELECT foo FROM bar WHERE (c = 1)/,
206 q/SELECT foo FROM bar WHERE (d = 1)/,
208 q/SELECT foo FROM bar WHERE a = 1 AND quux/,
209 q/SELECT foo FROM bar WHERE a = 1 GROUP BY foo/,
210 q/SELECT foo FROM bar WHERE a = 1 ORDER BY foo/,
211 q/SELECT foo FROM bar WHERE a = 1 LIMIT 1/,
212 q/SELECT foo FROM bar WHERE a = 1 OFFSET 1/,
213 q/SELECT foo FROM bar JOIN quux WHERE a = 1/,
214 q/SELECT foo FROM bar JOIN quux ON a = 1 WHERE a = 1/,
220 q/SELECT foo FROM bar WHERE a = 1 AND b = 1/,
221 q/SELECT quux FROM bar WHERE a = 1 AND b = 1/,
222 q/SELECT foo FROM quux WHERE a = 1 AND b = 1/,
223 q/FOOBAR foo FROM bar WHERE a = 1 AND b = 1/,
225 q/SELECT foo FROM bar WHERE a = 2 AND b = 1/,
226 q/SELECT foo FROM bar WHERE a = 3 AND (b = 1)/,
227 q/SELECT foo FROM bar WHERE (a = 4) AND b = 1/,
228 q/SELECT foo FROM bar WHERE (a = 5) AND (b = 1)/,
229 q/SELECT foo FROM bar WHERE ((a = 6) AND (b = 1))/,
230 q/SELECT foo FROM bar WHERE ((a = 7) AND (b = 1))/,
232 q/SELECT foo FROM bar WHERE a = 1 AND b = 2/,
233 q/SELECT foo FROM bar WHERE a = 1 AND (b = 3)/,
234 q/SELECT foo FROM bar WHERE (a = 1) AND b = 4/,
235 q/SELECT foo FROM bar WHERE (a = 1) AND (b = 5)/,
236 q/SELECT foo FROM bar WHERE ((a = 1) AND (b = 6))/,
237 q/SELECT foo FROM bar WHERE ((a = 1) AND (b = 7))/,
239 q/SELECT foo FROM bar WHERE a < 1 AND b = 1/,
240 q/SELECT foo FROM bar WHERE b = 1 AND b = 1/,
241 q/SELECT foo FROM bar WHERE (c = 1) AND b = 1/,
242 q/SELECT foo FROM bar WHERE (d = 1) AND b = 1/,
244 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND quux/,
245 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 GROUP BY foo/,
246 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 ORDER BY foo/,
247 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 LIMIT 1/,
248 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 OFFSET 1/,
249 q/SELECT foo FROM bar JOIN quux WHERE a = 1 AND b = 1/,
250 q/SELECT foo FROM bar JOIN quux ON a = 1 WHERE a = 1 AND b = 1/,
256 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 OR c = 1/,
257 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) OR c = 1/,
258 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1)/,
264 q/SELECT foo FROM bar WHERE a = 1 OR b = 1 AND c = 1/,
265 q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) AND c = 1/,
266 q/SELECT foo FROM bar WHERE a = 1 OR (b = 1 AND c = 1)/,
272 # BETWEEN with/without parenthesis around itself/RHS is a sticky business
273 # if I made a mistake here, simply rewrite the special BETWEEN handling in
277 q/SELECT foo FROM bar WHERE ( completion_date BETWEEN ? AND ? AND status = ? )/,
278 q/SELECT foo FROM bar WHERE completion_date BETWEEN (? AND ?) AND status = ?/,
279 q/SELECT foo FROM bar WHERE ( (completion_date BETWEEN (? AND ?) ) AND status = ? )/,
280 q/SELECT foo FROM bar WHERE ( (completion_date BETWEEN (? AND ? AND status = ?) ) )/,
284 # JOIN condition - equal
288 q/SELECT foo FROM bar JOIN baz ON a = 1 WHERE x = 1/,
289 q/SELECT foo FROM bar JOIN baz ON a=1 WHERE x = 1/,
290 q/SELECT foo FROM bar JOIN baz ON (a = 1) WHERE x = 1/,
291 q/SELECT foo FROM bar JOIN baz ON (a=1) WHERE x = 1/,
292 q/SELECT foo FROM bar JOIN baz ON ( a = 1 ) WHERE x = 1/,
329 q/SELECT foo FROM bar JOIN baz ON ((a = 1)) WHERE x = 1/,
330 q/SELECT foo FROM bar JOIN baz ON ( (a = 1) ) WHERE x = 1/,
331 q/SELECT foo FROM bar JOIN baz ON ( ( a = 1 ) ) WHERE x = 1/,
337 q/SELECT foo FROM bar JOIN baz ON a = 1 AND b = 1 WHERE x = 1/,
338 q/SELECT foo FROM bar JOIN baz ON (a = 1) AND (b = 1) WHERE x = 1/,
339 q/SELECT foo FROM bar JOIN baz ON ((a = 1) AND (b = 1)) WHERE x = 1/,
340 q/SELECT foo FROM bar JOIN baz ON (a = 1 AND b = 1) WHERE x = 1/,
341 q/SELECT foo FROM bar JOIN baz ON ((a = 1 AND b = 1)) WHERE x = 1/,
342 q/SELECT foo FROM bar JOIN baz ON (((a = 1) AND (b = 1))) WHERE x = 1/,
402 # JOIN condition - different
406 q/SELECT foo FROM bar JOIN quux ON a = 1 WHERE quuux/,
407 q/SELECT quux FROM bar JOIN quux ON a = 1 WHERE quuux/,
408 q/SELECT foo FROM quux JOIN quux ON a = 1 WHERE quuux/,
409 q/FOOBAR foo FROM bar JOIN quux ON a = 1 WHERE quuux/,
411 q/SELECT foo FROM bar JOIN quux ON a = 2 WHERE quuux/,
412 q/SELECT foo FROM bar JOIN quux ON a < 1 WHERE quuux/,
413 q/SELECT foo FROM bar JOIN quux ON b = 1 WHERE quuux/,
414 q/SELECT foo FROM bar JOIN quux ON (c = 1) WHERE quuux/,
415 q/SELECT foo FROM bar JOIN quux ON (d = 1) WHERE quuux/,
417 q/SELECT foo FROM bar JOIN quux ON a = 1 AND quuux/,
418 q/SELECT foo FROM bar JOIN quux ON a = 1 GROUP BY foo/,
419 q/SELECT foo FROM bar JOIN quux ON a = 1 ORDER BY foo/,
420 q/SELECT foo FROM bar JOIN quux ON a = 1 LIMIT 1/,
421 q/SELECT foo FROM bar JOIN quux ON a = 1 OFFSET 1/,
422 q/SELECT foo FROM bar JOIN quux ON a = 1 JOIN quuux/,
423 q/SELECT foo FROM bar JOIN quux ON a = 1 JOIN quuux ON a = 1/,
429 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
430 q/SELECT quux FROM bar JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
431 q/SELECT foo FROM quux JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
432 q/FOOBAR foo FROM bar JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
434 q/SELECT foo FROM bar JOIN quux ON a = 2 AND b = 1 WHERE quuux/,
435 q/SELECT foo FROM bar JOIN quux ON a = 3 AND (b = 1) WHERE quuux/,
436 q/SELECT foo FROM bar JOIN quux ON (a = 4) AND b = 1 WHERE quuux/,
437 q/SELECT foo FROM bar JOIN quux ON (a = 5) AND (b = 1) WHERE quuux/,
438 q/SELECT foo FROM bar JOIN quux ON ((a = 6) AND (b = 1)) WHERE quuux/,
439 q/SELECT foo FROM bar JOIN quux ON ((a = 7) AND (b = 1)) WHERE quuux/,
441 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 2 WHERE quuux/,
442 q/SELECT foo FROM bar JOIN quux ON a = 1 AND (b = 3) WHERE quuux/,
443 q/SELECT foo FROM bar JOIN quux ON (a = 1) AND b = 4 WHERE quuux/,
444 q/SELECT foo FROM bar JOIN quux ON (a = 1) AND (b = 5) WHERE quuux/,
445 q/SELECT foo FROM bar JOIN quux ON ((a = 1) AND (b = 6)) WHERE quuux/,
446 q/SELECT foo FROM bar JOIN quux ON ((a = 1) AND (b = 7)) WHERE quuux/,
448 q/SELECT foo FROM bar JOIN quux ON a < 1 AND b = 1 WHERE quuux/,
449 q/SELECT foo FROM bar JOIN quux ON b = 1 AND b = 1 WHERE quuux/,
450 q/SELECT foo FROM bar JOIN quux ON (c = 1) AND b = 1 WHERE quuux/,
451 q/SELECT foo FROM bar JOIN quux ON (d = 1) AND b = 1 WHERE quuux/,
453 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 AND quuux/,
454 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 GROUP BY foo/,
455 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 ORDER BY foo/,
456 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 LIMIT 1/,
457 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 OFFSET 1/,
458 q/SELECT foo FROM bar JOIN quux JOIN quuux ON a = 1 AND b = 1/,
459 q/SELECT foo FROM bar JOIN quux ON a = 1 JOIN quuux ON a = 1 AND b = 1/,
463 # DISTINCT ON (...) not confused with JOIN ON (...)
467 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE a = 1/,
468 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE a=1/,
469 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE (a = 1)/,
470 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE (a=1)/,
471 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ( a = 1 )/,
473 SELECT DISTINCT ON (foo, quux)
482 SELECT DISTINCT ON (foo, quux)
491 SELECT DISTINCT ON (foo, quux)
499 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ((a = 1))/,
500 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ( (a = 1) )/,
501 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ( ( a = 1 ) )/,
509 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 1/,
510 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE (a = 1)/,
511 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE a = 1/,
512 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE (a = 1)/,
518 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE a = 1/,
519 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 1)) AS foo WHERE a = 1/,
520 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 1) AS foo WHERE a = 1/,
521 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 1)) AS foo WHERE a = 1/,
522 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 1))) AS foo WHERE a = 1/,
524 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE (a = 1)/,
525 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 1)) AS foo WHERE (a = 1)/,
526 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 1) AS foo WHERE (a = 1)/,
527 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 1)) AS foo WHERE (a = 1)/,
528 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 1))) AS foo WHERE (a = 1)/,
532 # subselects - different
536 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 1/,
537 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 2/,
538 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE (a = 3)/,
539 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE a = 4/,
540 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE (a = 5)/,
541 q/SELECT * FROM (SELECT * FROM bar WHERE b = 2) AS foo WHERE a = 1/,
542 q/SELECT * FROM (SELECT * FROM bar WHERE b = 3) AS foo WHERE (a = 1)/,
543 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 4)) AS foo WHERE a = 1/,
544 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 5)) AS foo WHERE (a = 1)/,
550 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE a = 1/,
551 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 2) AS foo WHERE a = 1/,
552 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 3)) AS foo WHERE a = 1/,
553 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 4)) AS foo WHERE a = 1/,
554 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 5))) AS foo WHERE a = 1/,
556 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 6) AS foo WHERE (a = 1)/,
557 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 7) AS foo WHERE (a = 1)/,
558 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 8)) AS foo WHERE (a = 1)/,
559 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 9)) AS foo WHERE (a = 1)/,
560 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 10))) AS foo WHERE (a = 1)/,
562 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE a = 2/,
563 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 2) AS foo WHERE a = 2/,
564 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 3)) AS foo WHERE a = 2/,
565 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 4)) AS foo WHERE a = 2/,
566 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 5))) AS foo WHERE a = 2/,
568 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 6) AS foo WHERE (a = 2)/,
569 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 7) AS foo WHERE (a = 2)/,
570 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 8)) AS foo WHERE (a = 2)/,
571 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 9)) AS foo WHERE (a = 2)/,
572 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 10))) AS foo WHERE (a = 2)/,
578 'SELECT a,b,c FROM foo',
579 'SELECT a,c,b FROM foo',
580 'SELECT b,a,c FROM foo',
581 'SELECT b,c,a FROM foo',
582 'SELECT c,a,b FROM foo',
583 'SELECT c,b,a FROM foo',
589 'SELECT count(*) FROM foo',
590 'SELECT count(a) FROM foo',
591 'SELECT count(1) FROM foo',
597 'SELECT * FROM foo WHERE a IN (1,2,3)',
598 'SELECT * FROM foo WHERE a IN (1,3,2)',
599 'SELECT * FROM foo WHERE a IN (2,1,3)',
600 'SELECT * FROM foo WHERE a IN (2,3,1)',
601 'SELECT * FROM foo WHERE a IN (3,1,2)',
602 'SELECT * FROM foo WHERE a IN (3,2,1)',
688 { foo => 42, bar => 1 },
689 { foo => 42, bar => 1 },
690 { foo => '42', bar => 1 },
694 # blessed object - equal
698 bless(\(local $_ = 42), 'Life::Universe::Everything'),
699 bless(\(local $_ = 42), 'Life::Universe::Everything'),
705 bless([42], 'Life::Universe::Everything'),
706 bless([42], 'Life::Universe::Everything'),
712 bless({ answer => 42 }, 'Life::Universe::Everything'),
713 bless({ answer => 42 }, 'Life::Universe::Everything'),
717 # complex data structure - equal
721 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
722 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
737 # scalarref - different
747 # arrayref - different
757 # hashref - different
778 # complex data structure - different
782 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
783 [43, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
784 [42, { foo => 'baz', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
785 [42, { bar => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
786 [42, { foo => 'bar', quuux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
787 [42, { foo => 'bar', quux => [0, 1, 2, \3, { quux => [4, 5] } ] }, 8 ],
788 [42, { foo => 'bar', quux => [1, 2, 3, { quux => [4, 5] } ] }, 8 ],
789 [42, { foo => 'bar', quux => [1, 2, \4, { quux => [4, 5] } ] }, 8 ],
790 [42, { foo => 'bar', quux => [1, 2, \3, { quuux => [4, 5] } ] }, 8 ],
791 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5, 6] } ] }, 8 ],
792 [42, { foo => 'bar', quux => [1, 2, \3, { quux => 4 } ] }, 8 ],
793 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5], quuux => 1 } ] }, 8 ],
794 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8, 9 ],
801 map { $_ * ($_ - 1) / 2 }
802 map { scalar @{$_->{statements}} }
806 map { $_ * ($_ - 1) / 2 }
807 map { scalar @{$_->{bindvals}} }
812 use_ok('SQL::Abstract::Test', import => [qw(
813 eq_sql_bind eq_sql eq_bind is_same_sql_bind
816 for my $test (@sql_tests) {
817 my $statements = $test->{statements};
818 while (@$statements) {
819 my $sql1 = shift @$statements;
820 foreach my $sql2 (@$statements) {
822 no warnings qw/once/; # perl 5.10 is dumb
823 local $SQL::Abstract::Test::parenthesis_significant = $test->{parenthesis_significant}
824 if $test->{parenthesis_significant};
825 my $equal = eq_sql($sql1, $sql2);
828 local $TODO = $test->{todo} if $test->{todo};
830 if ($test->{equal}) {
831 ok($equal, "equal SQL expressions should have been considered equal");
833 ok(!$equal, "different SQL expressions should have been considered not equal");
836 if ($equal ^ $test->{equal}) {
845 for my $test (@bind_tests) {
846 my $bindvals = $test->{bindvals};
848 my $bind1 = shift @$bindvals;
849 foreach my $bind2 (@$bindvals) {
850 my $equal = eq_bind($bind1, $bind2);
851 if ($test->{equal}) {
852 ok($equal, "equal bind values considered equal");
854 ok(!$equal, "different bind values considered not equal");
857 if ($equal ^ $test->{equal}) {
858 diag("bind1: " . Dumper($bind1));
859 diag("bind2: " . Dumper($bind2));
866 "SELECT * FROM foo WHERE id = ?", [42],
867 "SELECT * FROM foo WHERE (id = ?)", [42],
869 "eq_sql_bind considers equal SQL expressions and bind values equal"
874 "SELECT * FROM foo WHERE id = ?", [42],
875 "SELECT * FROM foo WHERE (id = ?)", [0],
877 "eq_sql_bind considers equal SQL expressions and different bind values different"
881 "SELECT * FROM foo WHERE id = ?", [42],
882 "SELECT * FROM bar WHERE (id = ?)", [42],
884 "eq_sql_bind considers different SQL expressions and equal bind values different"