5 use List::Util qw(sum);
10 $Data::Dumper::Terse = 1;
11 $Data::Dumper::Sortkeys = 1;
13 # equivalent to $Module::Install::AUTHOR
17 ( -e ($^O eq 'VMS' ? './inc/_author' : './inc/.author') )
20 if (not $author and not $ENV{SQLATEST_TESTER} and not $ENV{AUTOMATED_TESTING}) {
21 plan skip_all => 'Skipping resource intensive self-tests, use SQLATEST_TESTER=1 to run';
26 # WHERE condition - equal
30 q/SELECT foo FROM bar WHERE a = 1/,
31 q/SELECT foo FROM bar WHERE a=1/,
32 q/SELECT foo FROM bar WHERE (a = 1)/,
33 q/SELECT foo FROM bar WHERE (a=1)/,
34 q/SELECT foo FROM bar WHERE ( a = 1 )/,
59 q/SELECT foo FROM bar WHERE ((a = 1))/,
60 q/SELECT foo FROM bar WHERE ( (a = 1) )/,
61 q/SELECT foo FROM bar WHERE ( ( a = 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)/,
69 q/SELECT foo FROM bar WHERE ((a = 1) AND (b = 1))/,
70 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1)/,
71 q/SELECT foo FROM bar WHERE ((a = 1 AND b = 1))/,
72 q/SELECT foo FROM bar WHERE (((a = 1) AND (b = 1)))/,
118 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/,
119 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1 AND c = 1)/,
120 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) AND c = 1/,
121 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 AND c = 1)/,
122 q/SELECT foo FROM bar WHERE ((((a = 1))) AND (b = 1 AND c = 1))/,
128 q/SELECT foo FROM bar WHERE a = 1 OR b = 1 OR c = 1/,
129 q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) OR c = 1/,
130 q/SELECT foo FROM bar WHERE a = 1 OR (b = 1 OR c = 1)/,
131 q/SELECT foo FROM bar WHERE a = 1 OR ((b = 1 OR (c = 1)))/,
137 q/SELECT foo FROM bar WHERE (a = 1) AND (b = 1 OR c = 1 OR d = 1) AND (e = 1 AND f = 1)/,
138 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1 OR d = 1) AND e = 1 AND (f = 1)/,
139 q/SELECT foo FROM bar WHERE ( ((a = 1) AND ( b = 1 OR (c = 1 OR d = 1) )) AND ((e = 1)) AND f = 1) /,
145 q/SELECT foo FROM bar WHERE (a) AND (b = 2)/,
146 q/SELECT foo FROM bar WHERE (a AND b = 2)/,
147 q/SELECT foo FROM bar WHERE (a AND (b = 2))/,
148 q/SELECT foo FROM bar WHERE a AND (b = 2)/,
154 q/SELECT foo FROM bar WHERE ((NOT a) AND b = 2)/,
155 q/SELECT foo FROM bar WHERE (NOT a) AND (b = 2)/,
156 q/SELECT foo FROM bar WHERE (NOT (a)) AND b = 2/,
162 q/SELECT foo FROM bar WHERE NOT a AND (b = 2)/,
163 q/SELECT foo FROM bar WHERE (NOT a) AND (b = 2)/,
168 parenthesis_significant => 1,
170 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/,
171 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1 AND c = 1)/,
172 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) AND c = 1/,
173 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 AND c = 1)/,
174 q/SELECT foo FROM bar WHERE ((((a = 1))) AND (b = 1 AND c = 1))/,
179 parenthesis_significant => 1,
181 q/SELECT foo FROM bar WHERE a = 1 OR b = 1 OR c = 1/,
182 q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) OR c = 1/,
183 q/SELECT foo FROM bar WHERE a = 1 OR (b = 1 OR c = 1)/,
184 q/SELECT foo FROM bar WHERE a = 1 OR ((b = 1 OR (c = 1)))/,
189 parenthesis_significant => 1,
191 q/SELECT foo FROM bar WHERE (a = 1) AND (b = 1 OR c = 1 OR d = 1) AND (e = 1 AND f = 1)/,
192 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1 OR d = 1) AND e = 1 AND (f = 1)/,
193 q/SELECT foo FROM bar WHERE ( ((a = 1) AND ( b = 1 OR (c = 1 OR d = 1) )) AND ((e = 1)) AND f = 1) /,
197 # WHERE condition - different
201 q/SELECT foo FROM bar WHERE a = 1/,
202 q/SELECT quux FROM bar WHERE a = 1/,
203 q/SELECT foo FROM quux WHERE a = 1/,
204 q/FOOBAR foo FROM bar WHERE a = 1/,
206 q/SELECT foo FROM bar WHERE a = 2/,
207 q/SELECT foo FROM bar WHERE a < 1/,
208 q/SELECT foo FROM bar WHERE b = 1/,
209 q/SELECT foo FROM bar WHERE (c = 1)/,
210 q/SELECT foo FROM bar WHERE (d = 1)/,
212 q/SELECT foo FROM bar WHERE a = 1 AND quux/,
213 q/SELECT foo FROM bar WHERE a = 1 GROUP BY foo/,
214 q/SELECT foo FROM bar WHERE a = 1 ORDER BY foo/,
215 q/SELECT foo FROM bar WHERE a = 1 LIMIT 1/,
216 q/SELECT foo FROM bar WHERE a = 1 OFFSET 1/,
217 q/SELECT foo FROM bar JOIN quux WHERE a = 1/,
218 q/SELECT foo FROM bar JOIN quux ON a = 1 WHERE a = 1/,
224 q/SELECT foo FROM bar WHERE a = 1 AND b = 1/,
225 q/SELECT quux FROM bar WHERE a = 1 AND b = 1/,
226 q/SELECT foo FROM quux WHERE a = 1 AND b = 1/,
227 q/FOOBAR foo FROM bar WHERE a = 1 AND b = 1/,
229 q/SELECT foo FROM bar WHERE a = 2 AND b = 1/,
230 q/SELECT foo FROM bar WHERE a = 3 AND (b = 1)/,
231 q/SELECT foo FROM bar WHERE (a = 4) AND b = 1/,
232 q/SELECT foo FROM bar WHERE (a = 5) AND (b = 1)/,
233 q/SELECT foo FROM bar WHERE ((a = 6) AND (b = 1))/,
234 q/SELECT foo FROM bar WHERE ((a = 7) AND (b = 1))/,
236 q/SELECT foo FROM bar WHERE a = 1 AND b = 2/,
237 q/SELECT foo FROM bar WHERE a = 1 AND (b = 3)/,
238 q/SELECT foo FROM bar WHERE (a = 1) AND b = 4/,
239 q/SELECT foo FROM bar WHERE (a = 1) AND (b = 5)/,
240 q/SELECT foo FROM bar WHERE ((a = 1) AND (b = 6))/,
241 q/SELECT foo FROM bar WHERE ((a = 1) AND (b = 7))/,
243 q/SELECT foo FROM bar WHERE a < 1 AND b = 1/,
244 q/SELECT foo FROM bar WHERE b = 1 AND b = 1/,
245 q/SELECT foo FROM bar WHERE (c = 1) AND b = 1/,
246 q/SELECT foo FROM bar WHERE (d = 1) AND b = 1/,
248 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND quux/,
249 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 GROUP BY foo/,
250 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 ORDER BY foo/,
251 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 LIMIT 1/,
252 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 OFFSET 1/,
253 q/SELECT foo FROM bar JOIN quux WHERE a = 1 AND b = 1/,
254 q/SELECT foo FROM bar JOIN quux ON a = 1 WHERE a = 1 AND b = 1/,
260 q/SELECT foo FROM bar WHERE a = 1 AND b = 1 OR c = 1/,
261 q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) OR c = 1/,
262 q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1)/,
268 q/SELECT foo FROM bar WHERE a = 1 OR b = 1 AND c = 1/,
269 q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) AND c = 1/,
270 q/SELECT foo FROM bar WHERE a = 1 OR (b = 1 AND c = 1)/,
275 parenthesis_significant => 1,
277 q/SELECT foo FROM bar WHERE a IN (1,2,3)/,
278 q/SELECT foo FROM bar WHERE a IN (1,3,2)/,
279 q/SELECT foo FROM bar WHERE a IN ((1,2,3))/,
285 # BETWEEN with/without parenthesis around itself/RHS is a sticky business
286 # if I made a mistake here, simply rewrite the special BETWEEN handling in
290 q/SELECT foo FROM bar WHERE ( completion_date BETWEEN ? AND ? AND status = ? )/,
291 q/SELECT foo FROM bar WHERE completion_date BETWEEN (? AND ?) AND status = ?/,
292 q/SELECT foo FROM bar WHERE ( (completion_date BETWEEN (? AND ?) ) AND status = ? )/,
293 q/SELECT foo FROM bar WHERE ( (completion_date BETWEEN (? AND ? AND status = ?) ) )/,
297 # JOIN condition - equal
301 q/SELECT foo FROM bar JOIN baz ON a = 1 WHERE x = 1/,
302 q/SELECT foo FROM bar JOIN baz ON a=1 WHERE x = 1/,
303 q/SELECT foo FROM bar JOIN baz ON (a = 1) WHERE x = 1/,
304 q/SELECT foo FROM bar JOIN baz ON (a=1) WHERE x = 1/,
305 q/SELECT foo FROM bar JOIN baz ON ( a = 1 ) WHERE x = 1/,
342 q/SELECT foo FROM bar JOIN baz ON ((a = 1)) WHERE x = 1/,
343 q/SELECT foo FROM bar JOIN baz ON ( (a = 1) ) WHERE x = 1/,
344 q/SELECT foo FROM bar JOIN baz ON ( ( a = 1 ) ) WHERE x = 1/,
350 q/SELECT foo FROM bar JOIN baz ON a = 1 AND b = 1 WHERE x = 1/,
351 q/SELECT foo FROM bar JOIN baz ON (a = 1) AND (b = 1) WHERE x = 1/,
352 q/SELECT foo FROM bar JOIN baz ON ((a = 1) AND (b = 1)) WHERE x = 1/,
353 q/SELECT foo FROM bar JOIN baz ON (a = 1 AND b = 1) WHERE x = 1/,
354 q/SELECT foo FROM bar JOIN baz ON ((a = 1 AND b = 1)) WHERE x = 1/,
355 q/SELECT foo FROM bar JOIN baz ON (((a = 1) AND (b = 1))) WHERE x = 1/,
415 # JOIN condition - different
419 q/SELECT foo FROM bar JOIN quux ON a = 1 WHERE quuux/,
420 q/SELECT quux FROM bar JOIN quux ON a = 1 WHERE quuux/,
421 q/SELECT foo FROM quux JOIN quux ON a = 1 WHERE quuux/,
422 q/FOOBAR foo FROM bar JOIN quux ON a = 1 WHERE quuux/,
424 q/SELECT foo FROM bar JOIN quux ON a = 2 WHERE quuux/,
425 q/SELECT foo FROM bar JOIN quux ON a < 1 WHERE quuux/,
426 q/SELECT foo FROM bar JOIN quux ON b = 1 WHERE quuux/,
427 q/SELECT foo FROM bar JOIN quux ON (c = 1) WHERE quuux/,
428 q/SELECT foo FROM bar JOIN quux ON (d = 1) WHERE quuux/,
430 q/SELECT foo FROM bar JOIN quux ON a = 1 AND quuux/,
431 q/SELECT foo FROM bar JOIN quux ON a = 1 GROUP BY foo/,
432 q/SELECT foo FROM bar JOIN quux ON a = 1 ORDER BY foo/,
433 q/SELECT foo FROM bar JOIN quux ON a = 1 LIMIT 1/,
434 q/SELECT foo FROM bar JOIN quux ON a = 1 OFFSET 1/,
435 q/SELECT foo FROM bar JOIN quux ON a = 1 JOIN quuux/,
436 q/SELECT foo FROM bar JOIN quux ON a = 1 JOIN quuux ON a = 1/,
442 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
443 q/SELECT quux FROM bar JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
444 q/SELECT foo FROM quux JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
445 q/FOOBAR foo FROM bar JOIN quux ON a = 1 AND b = 1 WHERE quuux/,
447 q/SELECT foo FROM bar JOIN quux ON a = 2 AND b = 1 WHERE quuux/,
448 q/SELECT foo FROM bar JOIN quux ON a = 3 AND (b = 1) WHERE quuux/,
449 q/SELECT foo FROM bar JOIN quux ON (a = 4) AND b = 1 WHERE quuux/,
450 q/SELECT foo FROM bar JOIN quux ON (a = 5) AND (b = 1) WHERE quuux/,
451 q/SELECT foo FROM bar JOIN quux ON ((a = 6) AND (b = 1)) WHERE quuux/,
452 q/SELECT foo FROM bar JOIN quux ON ((a = 7) AND (b = 1)) WHERE quuux/,
454 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 2 WHERE quuux/,
455 q/SELECT foo FROM bar JOIN quux ON a = 1 AND (b = 3) WHERE quuux/,
456 q/SELECT foo FROM bar JOIN quux ON (a = 1) AND b = 4 WHERE quuux/,
457 q/SELECT foo FROM bar JOIN quux ON (a = 1) AND (b = 5) WHERE quuux/,
458 q/SELECT foo FROM bar JOIN quux ON ((a = 1) AND (b = 6)) WHERE quuux/,
459 q/SELECT foo FROM bar JOIN quux ON ((a = 1) AND (b = 7)) WHERE quuux/,
461 q/SELECT foo FROM bar JOIN quux ON a < 1 AND b = 1 WHERE quuux/,
462 q/SELECT foo FROM bar JOIN quux ON b = 1 AND b = 1 WHERE quuux/,
463 q/SELECT foo FROM bar JOIN quux ON (c = 1) AND b = 1 WHERE quuux/,
464 q/SELECT foo FROM bar JOIN quux ON (d = 1) AND b = 1 WHERE quuux/,
466 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 AND quuux/,
467 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 GROUP BY foo/,
468 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 ORDER BY foo/,
469 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 LIMIT 1/,
470 q/SELECT foo FROM bar JOIN quux ON a = 1 AND b = 1 OFFSET 1/,
471 q/SELECT foo FROM bar JOIN quux JOIN quuux ON a = 1 AND b = 1/,
472 q/SELECT foo FROM bar JOIN quux ON a = 1 JOIN quuux ON a = 1 AND b = 1/,
476 # DISTINCT ON (...) not confused with JOIN ON (...)
480 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE a = 1/,
481 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE a=1/,
482 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE (a = 1)/,
483 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE (a=1)/,
484 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ( a = 1 )/,
486 SELECT DISTINCT ON (foo, quux)
495 SELECT DISTINCT ON (foo, quux)
504 SELECT DISTINCT ON (foo, quux)
512 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ((a = 1))/,
513 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ( (a = 1) )/,
514 q/SELECT DISTINCT ON (foo, quux) foo, quux FROM bar WHERE ( ( a = 1 ) )/,
522 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 1/,
523 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE (a = 1)/,
524 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE a = 1/,
525 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE (a = 1)/,
531 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE a = 1/,
532 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 1)) AS foo WHERE a = 1/,
533 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 1) AS foo WHERE a = 1/,
534 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 1)) AS foo WHERE a = 1/,
535 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 1))) AS foo WHERE a = 1/,
537 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE (a = 1)/,
538 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 1)) AS foo WHERE (a = 1)/,
539 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 1) AS foo WHERE (a = 1)/,
540 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 1)) AS foo WHERE (a = 1)/,
541 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 1))) AS foo WHERE (a = 1)/,
545 # subselects - different
549 q/DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM (SELECT * FROM cd me WHERE ( year != ? ) GROUP BY me.cdid) me WHERE ( year != ? ) ) )/,
550 q/DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM cd me WHERE ( year != ? ) GROUP BY me.cdid ) )/,
556 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 1/,
557 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 2/,
558 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE (a = 3)/,
559 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE a = 4/,
560 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1)) AS foo WHERE (a = 5)/,
561 q/SELECT * FROM (SELECT * FROM bar WHERE b = 2) AS foo WHERE a = 1/,
562 q/SELECT * FROM (SELECT * FROM bar WHERE b = 3) AS foo WHERE (a = 1)/,
563 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 4)) AS foo WHERE a = 1/,
564 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 5)) AS foo WHERE (a = 1)/,
570 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE a = 1/,
571 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 2) AS foo WHERE a = 1/,
572 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 3)) AS foo WHERE a = 1/,
573 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 4)) AS foo WHERE a = 1/,
574 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 5))) AS foo WHERE a = 1/,
576 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 6) AS foo WHERE (a = 1)/,
577 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 7) AS foo WHERE (a = 1)/,
578 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 8)) AS foo WHERE (a = 1)/,
579 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 9)) AS foo WHERE (a = 1)/,
580 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 10))) AS foo WHERE (a = 1)/,
582 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 1) AS foo WHERE a = 2/,
583 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 2) AS foo WHERE a = 2/,
584 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 3)) AS foo WHERE a = 2/,
585 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 4)) AS foo WHERE a = 2/,
586 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 5))) AS foo WHERE a = 2/,
588 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND c = 6) AS foo WHERE (a = 2)/,
589 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND c = 7) AS foo WHERE (a = 2)/,
590 q/SELECT * FROM (SELECT * FROM bar WHERE b = 1 AND (c = 8)) AS foo WHERE (a = 2)/,
591 q/SELECT * FROM (SELECT * FROM bar WHERE (b = 1) AND (c = 9)) AS foo WHERE (a = 2)/,
592 q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 10))) AS foo WHERE (a = 2)/,
598 'SELECT a,b,c FROM foo',
599 'SELECT a,c,b FROM foo',
600 'SELECT b,a,c FROM foo',
601 'SELECT b,c,a FROM foo',
602 'SELECT c,a,b FROM foo',
603 'SELECT c,b,a FROM foo',
609 'SELECT * FROM foo WHERE a IN (1,2,3)',
610 'SELECT * FROM foo WHERE a IN (1,3,2)',
611 'SELECT * FROM foo WHERE a IN (2,1,3)',
612 'SELECT * FROM foo WHERE a IN (2,3,1)',
613 'SELECT * FROM foo WHERE a IN (3,1,2)',
614 'SELECT * FROM foo WHERE a IN (3,2,1)',
620 'SELECT count(*) FROM foo',
621 'SELECT count(*) AS bar FROM foo',
622 'SELECT count(*) AS "bar" FROM foo',
623 'SELECT count(a) FROM foo',
624 'SELECT count(1) FROM foo',
710 { foo => 42, bar => 1 },
711 { foo => 42, bar => 1 },
712 { foo => '42', bar => 1 },
716 # blessed object - equal
720 bless(\(local $_ = 42), 'Life::Universe::Everything'),
721 bless(\(local $_ = 42), 'Life::Universe::Everything'),
727 bless([42], 'Life::Universe::Everything'),
728 bless([42], 'Life::Universe::Everything'),
734 bless({ answer => 42 }, 'Life::Universe::Everything'),
735 bless({ answer => 42 }, 'Life::Universe::Everything'),
739 # complex data structure - equal
743 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
744 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
759 # scalarref - different
769 # arrayref - different
779 # hashref - different
800 # complex data structure - different
804 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
805 [43, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
806 [42, { foo => 'baz', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
807 [42, { bar => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
808 [42, { foo => 'bar', quuux => [1, 2, \3, { quux => [4, 5] } ] }, 8 ],
809 [42, { foo => 'bar', quux => [0, 1, 2, \3, { quux => [4, 5] } ] }, 8 ],
810 [42, { foo => 'bar', quux => [1, 2, 3, { quux => [4, 5] } ] }, 8 ],
811 [42, { foo => 'bar', quux => [1, 2, \4, { quux => [4, 5] } ] }, 8 ],
812 [42, { foo => 'bar', quux => [1, 2, \3, { quuux => [4, 5] } ] }, 8 ],
813 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5, 6] } ] }, 8 ],
814 [42, { foo => 'bar', quux => [1, 2, \3, { quux => 4 } ] }, 8 ],
815 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5], quuux => 1 } ] }, 8 ],
816 [42, { foo => 'bar', quux => [1, 2, \3, { quux => [4, 5] } ] }, 8, 9 ],
823 map { $_ * ($_ - 1) / 2 }
824 map { scalar @{$_->{statements}} }
828 map { $_ * ($_ - 1) / 2 }
829 map { scalar @{$_->{bindvals}} }
834 use_ok('SQL::Abstract::Test', import => [qw(
835 eq_sql_bind eq_sql eq_bind is_same_sql_bind
838 for my $test (@sql_tests) {
839 my $statements = $test->{statements};
840 while (@$statements) {
841 my $sql1 = shift @$statements;
842 foreach my $sql2 (@$statements) {
844 no warnings qw/once/; # perl 5.10 is dumb
845 local $SQL::Abstract::Test::parenthesis_significant = $test->{parenthesis_significant}
846 if $test->{parenthesis_significant};
847 my $equal = eq_sql($sql1, $sql2);
850 local $TODO = $test->{todo} if $test->{todo};
852 if ($test->{equal}) {
853 ok($equal, "equal SQL expressions should have been considered equal");
855 ok(!$equal, "different SQL expressions should have been considered not equal");
858 if ($equal ^ $test->{equal}) {
861 note('ast1: ' . Dumper SQL::Abstract::Test::parse ($sql1));
862 note('ast2: ' . Dumper SQL::Abstract::Test::parse ($sql2));
869 for my $test (@bind_tests) {
870 my $bindvals = $test->{bindvals};
872 my $bind1 = shift @$bindvals;
873 foreach my $bind2 (@$bindvals) {
874 my $equal = eq_bind($bind1, $bind2);
875 if ($test->{equal}) {
876 ok($equal, "equal bind values considered equal");
878 ok(!$equal, "different bind values considered not equal");
881 if ($equal ^ $test->{equal}) {
882 diag("bind1: " . Dumper($bind1));
883 diag("bind2: " . Dumper($bind2));
890 "SELECT * FROM foo WHERE id = ?", [42],
891 "SELECT * FROM foo WHERE (id = ?)", [42],
893 "eq_sql_bind considers equal SQL expressions and bind values equal"
898 "SELECT * FROM foo WHERE id = ?", [42],
899 "SELECT * FROM foo WHERE (id = ?)", [0],
901 "eq_sql_bind considers equal SQL expressions and different bind values different"
905 "SELECT * FROM foo WHERE id = ?", [42],
906 "SELECT * FROM bar WHERE (id = ?)", [42],
908 "eq_sql_bind considers different SQL expressions and equal bind values different"