X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F10test.t;h=ceac4e1b3b47fff8e5a81b89f26385d2053363f2;hb=0769ac0e4022d40ded0dff13abe292d4867c9d09;hp=8cb108bd6aba11e2594c0279ed918d31d3fa2a8f;hpb=b6c8b01b36078f748e58b807333a479dd04c4e39;p=dbsrgits%2FSQL-Abstract.git diff --git a/t/10test.t b/t/10test.t index 8cb108b..ceac4e1 100644 --- a/t/10test.t +++ b/t/10test.t @@ -6,6 +6,20 @@ use List::Util qw(sum); use Test::More; +use Data::Dumper; +$Data::Dumper::Terse = 1; +$Data::Dumper::Sortkeys = 1; + +# equivalent to $Module::Install::AUTHOR +my $author = ( + ( not -d './inc' ) + or + ( -e ($^O eq 'VMS' ? './inc/_author' : './inc/.author') ) +); + +if (not $author and not $ENV{SQLATEST_TESTER} and not $ENV{AUTOMATED_TESTING}) { + plan skip_all => 'Skipping resource intensive self-tests, use SQLATEST_TESTER=1 to run'; +} my @sql_tests = ( # WHERE condition - equal @@ -101,6 +115,7 @@ my @sql_tests = ( equal => 1, statements => [ q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/, + q/SELECT foo FROM bar WHERE (a = 1 AND b = 1 AND c = 1)/, q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) AND c = 1/, q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 AND c = 1)/, q/SELECT foo FROM bar WHERE ((((a = 1))) AND (b = 1 AND c = 1))/, @@ -123,6 +138,60 @@ my @sql_tests = ( q/SELECT foo FROM bar WHERE ( ((a = 1) AND ( b = 1 OR (c = 1 OR d = 1) )) AND ((e = 1)) AND f = 1) /, ] }, + { + equal => 1, + statements => [ + q/SELECT foo FROM bar WHERE (a) AND (b = 2)/, + q/SELECT foo FROM bar WHERE (a AND b = 2)/, + q/SELECT foo FROM bar WHERE (a AND (b = 2))/, + q/SELECT foo FROM bar WHERE a AND (b = 2)/, + ] + }, + { + equal => 1, + statements => [ + q/SELECT foo FROM bar WHERE ((NOT a) AND b = 2)/, + q/SELECT foo FROM bar WHERE (NOT a) AND (b = 2)/, + q/SELECT foo FROM bar WHERE (NOT (a)) AND b = 2/, + ], + }, + { + equal => 0, + statements => [ + q/SELECT foo FROM bar WHERE NOT a AND (b = 2)/, + q/SELECT foo FROM bar WHERE (NOT a) AND (b = 2)/, + ] + }, + { + equal => 0, + parenthesis_significant => 1, + statements => [ + q/SELECT foo FROM bar WHERE a = 1 AND b = 1 AND c = 1/, + q/SELECT foo FROM bar WHERE (a = 1 AND b = 1 AND c = 1)/, + q/SELECT foo FROM bar WHERE (a = 1 AND b = 1) AND c = 1/, + q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 AND c = 1)/, + q/SELECT foo FROM bar WHERE ((((a = 1))) AND (b = 1 AND c = 1))/, + ] + }, + { + equal => 0, + parenthesis_significant => 1, + statements => [ + q/SELECT foo FROM bar WHERE a = 1 OR b = 1 OR c = 1/, + q/SELECT foo FROM bar WHERE (a = 1 OR b = 1) OR c = 1/, + q/SELECT foo FROM bar WHERE a = 1 OR (b = 1 OR c = 1)/, + q/SELECT foo FROM bar WHERE a = 1 OR ((b = 1 OR (c = 1)))/, + ] + }, + { + equal => 0, + parenthesis_significant => 1, + statements => [ + q/SELECT foo FROM bar WHERE (a = 1) AND (b = 1 OR c = 1 OR d = 1) AND (e = 1 AND f = 1)/, + q/SELECT foo FROM bar WHERE a = 1 AND (b = 1 OR c = 1 OR d = 1) AND e = 1 AND (f = 1)/, + q/SELECT foo FROM bar WHERE ( ((a = 1) AND ( b = 1 OR (c = 1 OR d = 1) )) AND ((e = 1)) AND f = 1) /, + ] + }, # WHERE condition - different { @@ -202,9 +271,25 @@ my @sql_tests = ( }, { equal => 0, + parenthesis_significant => 1, statements => [ + q/SELECT foo FROM bar WHERE a IN (1,2,3)/, + q/SELECT foo FROM bar WHERE a IN (1,3,2)/, + q/SELECT foo FROM bar WHERE a IN ((1,2,3))/, + ] + }, + { + equal => 0, + statements => [ + # BETWEEN with/without parenthesis around itself/RHS is a sticky business + # if I made a mistake here, simply rewrite the special BETWEEN handling in + # _recurse_parse() + # + # by RIBASUSHI q/SELECT foo FROM bar WHERE ( completion_date BETWEEN ? AND ? AND status = ? )/, - q/SELECT foo FROM bar WHERE ( (completion_date BETWEEN ? AND ?) AND status = ? )/, + q/SELECT foo FROM bar WHERE completion_date BETWEEN (? AND ?) AND status = ?/, + q/SELECT foo FROM bar WHERE ( (completion_date BETWEEN (? AND ?) ) AND status = ? )/, + q/SELECT foo FROM bar WHERE ( (completion_date BETWEEN (? AND ? AND status = ?) ) )/, ] }, @@ -460,6 +545,13 @@ my @sql_tests = ( { equal => 0, statements => [ + q/DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM (SELECT * FROM cd me WHERE ( year != ? ) GROUP BY me.cdid) me WHERE ( year != ? ) ) )/, + q/DELETE FROM cd WHERE ( cdid IN ( SELECT me.cdid FROM cd me WHERE ( year != ? ) GROUP BY me.cdid ) )/, + ], + }, + { + equal => 0, + statements => [ q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 1/, q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE a = 2/, q/SELECT * FROM (SELECT * FROM bar WHERE b = 1) AS foo WHERE (a = 3)/, @@ -499,6 +591,74 @@ my @sql_tests = ( q/SELECT * FROM (SELECT * FROM bar WHERE ((b = 1) AND (c = 10))) AS foo WHERE (a = 2)/, ] }, + + # list permutations + { + equal => 0, + statements => [ + 'SELECT a,b,c FROM foo', + 'SELECT a,c,b FROM foo', + 'SELECT b,a,c FROM foo', + 'SELECT b,c,a FROM foo', + 'SELECT c,a,b FROM foo', + 'SELECT c,b,a FROM foo', + ], + }, + { + equal => 0, + statements => [ + 'SELECT * FROM foo WHERE a IN (1,2,3)', + 'SELECT * FROM foo WHERE a IN (1,3,2)', + 'SELECT * FROM foo WHERE a IN (2,1,3)', + 'SELECT * FROM foo WHERE a IN (2,3,1)', + 'SELECT * FROM foo WHERE a IN (3,1,2)', + 'SELECT * FROM foo WHERE a IN (3,2,1)', + ] + }, + { + equal => 0, + statements => [ + 'SELECT count(*) FROM foo', + 'SELECT count(*) AS bar FROM foo', + 'SELECT count(*) AS "bar" FROM foo', + 'SELECT count(a) FROM foo', + 'SELECT count(1) FROM foo', + ] + }, + # func + { + equal => 1, + statements => [ + 'SELECT foo() bar FROM baz', + 'SELECT foo ( )bar FROM baz', + 'SELECT foo (())bar FROM baz', + 'SELECT foo(( ) ) bar FROM baz', + ] + }, + { + equal => 0, + statements => [ + 'SELECT foo() FROM bar', + 'SELECT foo FROM bar', + 'SELECT foo FROM bar ()', + ] + }, + # math + { + equal => 0, + statements => [ + 'SELECT * FROM foo WHERE 1 = ( a > b)', + 'SELECT * FROM foo WHERE 1 = a > b', + 'SELECT * FROM foo WHERE (1 = a) > b', + ] + }, + { + equal => 1, + statements => [ + 'SELECT * FROM foo WHERE bar = baz(buzz)', + 'SELECT * FROM foo WHERE bar = (baz( buzz ))', + ] + }, ); my @bind_tests = ( @@ -715,7 +875,12 @@ for my $test (@sql_tests) { while (@$statements) { my $sql1 = shift @$statements; foreach my $sql2 (@$statements) { + + no warnings qw/once/; # perl 5.10 is dumb + local $SQL::Abstract::Test::parenthesis_significant = $test->{parenthesis_significant} + if $test->{parenthesis_significant}; my $equal = eq_sql($sql1, $sql2); + TODO: { local $TODO = $test->{todo} if $test->{todo}; @@ -726,8 +891,14 @@ for my $test (@sql_tests) { } if ($equal ^ $test->{equal}) { + my ($ast1, $ast2) = map { SQL::Abstract::Test::parse ($_) } ($sql1, $sql2); + + $_ = Dumper $_ for ($ast1, $ast2); + diag("sql1: $sql1"); diag("sql2: $sql2"); + note("ast1: $ast1"); + note("ast2: $ast2"); } } }