X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F11parser.t;h=f02a8680f248a9205530e020a1c00e030ec56bad;hb=cf5b7ab163f8ac123ebc9bb1156e79646cd5bd2f;hp=d6acd1d7bb02bc1c73081d48b66bcc1856236e9d;hpb=6f2a5b668d6d34e8aee21c2b0cf51fdbf5dee991;p=scpubgit%2FQ-Branch.git diff --git a/t/11parser.t b/t/11parser.t index d6acd1d..f02a868 100644 --- a/t/11parser.t +++ b/t/11parser.t @@ -533,6 +533,122 @@ is_deeply($sqlat->parse( "SELECT [screen].[id], [screen].[name], [screen].[secti ] ], 'real life statement 1 parsed correctly'); +is_deeply($sqlat->parse("CASE WHEN FOO() > BAR()"), [ + [ + "-MISC", + [ + [ + "-LITERAL", + [ + "CASE" + ] + ], + [ + "-LITERAL", + [ + "WHEN" + ] + ] + ] + ], + [ + ">", + [ + [ + "FOO", + [ + [ + "-PAREN", + [] + ] + ] + ], + [ + "BAR", + [ + [ + "-PAREN", + [] + ] + ] + ] + ] + ] +]); + +is_deeply($sqlat->parse("SELECT [me].[id], ROW_NUMBER ( ) OVER (ORDER BY (SELECT 1)) AS [rno__row__index] FROM bar"), [ + [ + "SELECT", + [ + [ + "-LIST", + [ + [ + "-LITERAL", + [ + "[me].[id]" + ] + ], + [ + "AS", + [ + [ + "ROW_NUMBER() OVER", + [ + [ + "-PAREN", + [ + [ + "ORDER BY", + [ + [ + "-PAREN", + [ + [ + "SELECT", + [ + [ + "-LITERAL", + [ + 1 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + "-LITERAL", + [ + "[rno__row__index]" + ] + ] + ] + ] + ] + ] + ] + ], + [ + "FROM", + [ + [ + "-LITERAL", + [ + "bar" + ] + ] + ] + ] +]); + + is_deeply($sqlat->parse("SELECT x, y FROM foo WHERE x IN (?, ?, ?, ?)"), [ [ "SELECT", @@ -619,13 +735,217 @@ is_deeply($sqlat->parse("SELECT x, y FROM foo WHERE x IN (?, ?, ?, ?)"), [ ] ], 'Lists parsed correctly'); -is_deeply($sqlat->parse("SELECT * * FROM (SELECT *, FROM foobar baz buzz) foo bar WHERE NOT NOT NOT EXISTS (SELECT 'cr,ap') AND foo.a = ? and not (foo.b LIKE 'station') and x = y and a = b and GROUP BY , ORDER BY x x1 x2 y asc, max(y) desc x z desc"), [ +is_deeply($sqlat->parse('SELECT foo FROM bar ORDER BY x + ? DESC, oomph, y - ? DESC, unf, baz.g / ? ASC, buzz * 0 DESC, foo LIKE ? DESC, ickk ASC'), [ [ "SELECT", [ [ - "*", + "-LITERAL", + [ + "foo" + ] + ] + ] + ], + [ + "FROM", + [ + [ + "-LITERAL", [ + "bar" + ] + ] + ] + ], + [ + "ORDER BY", + [ + [ + "-LIST", + [ + [ + "-DESC", + [ + [ + "-MISC", + [ + [ + "-LITERAL", + [ + "x" + ] + ], + [ + "-LITERAL", + [ + "+" + ] + ], + [ + "-PLACEHOLDER", + [ + "?" + ] + ] + ] + ], + ] + ], + [ + "-LITERAL", + [ + "oomph" + ] + ], + [ + "-DESC", + [ + [ + "-MISC", + [ + [ + "-LITERAL", + [ + "y" + ] + ], + [ + "-LITERAL", + [ + "-" + ] + ], + [ + "-PLACEHOLDER", + [ + "?" + ] + ], + ] + ], + ] + ], + [ + "-LITERAL", + [ + "unf" + ] + ], + [ + "-ASC", + [ + [ + "-MISC", + [ + [ + "-LITERAL", + [ + "baz.g" + ] + ], + [ + "-LITERAL", + [ + "/" + ] + ], + [ + "-PLACEHOLDER", + [ + "?" + ] + ], + ] + ], + ] + ], + [ + "-DESC", + [ + [ + "-MISC", + [ + [ + "-LITERAL", + [ + "buzz" + ] + ], + [ + "-LITERAL", + [ + "*" + ] + ], + [ + "-LITERAL", + [ + 0 + ] + ] + ] + ] + ] + ], + [ + "-DESC", + [ + [ + "LIKE", + [ + [ + "-LITERAL", + [ + "foo" + ] + ], + [ + "-PLACEHOLDER", + [ + "?" + ] + ], + ], + ], + ] + ], + [ + "-ASC", + [ + [ + "-LITERAL", + [ + "ickk" + ] + ] + ] + ] + ] + ] + ] + ] +], 'Crazy ORDER BY parsed correctly'); + +is_deeply( $sqlat->parse("META SELECT * * FROM (SELECT *, FROM foobar baz buzz) foo bar WHERE NOT NOT NOT EXISTS (SELECT 'cr,ap') AND foo.a = ? STUFF moar(stuff) and not (foo.b LIKE 'station') and x = y and z in ((1, 2)) and a = b and GROUP BY , ORDER BY x x1 x2 y asc, max(y) desc x z desc"), [ + [ + "-LITERAL", + [ + "META" + ] + ], + [ + "SELECT", + [ + [ + "-MISC", + [ + [ + "-LITERAL", + [ + "*" + ] + ], [ "-LITERAL", [ @@ -755,18 +1075,45 @@ is_deeply($sqlat->parse("SELECT * * FROM (SELECT *, FROM foobar baz buzz) foo ba ] ], [ - "=", + "-MISC", [ [ + "=", + [ + [ + "-LITERAL", + [ + "foo.a" + ] + ], + [ + "-PLACEHOLDER", + [ + "?" + ] + ], + ], + ], + [ "-LITERAL", [ - "foo.a" + "STUFF" ] ], + ], + ], + [ + 'moar', + [ [ - "-PLACEHOLDER", + '-PAREN', [ - "?" + [ + '-LITERAL', + [ + 'stuff' + ] + ] ] ] ] @@ -816,6 +1163,44 @@ is_deeply($sqlat->parse("SELECT * * FROM (SELECT *, FROM foobar baz buzz) foo ba ] ], [ + 'IN', + [ + [ + '-LITERAL', + [ + 'z', + ], + ], + [ + '-PAREN', + [ + [ + '-PAREN', + [ + [ + '-LIST', + [ + [ + '-LITERAL', + [ + '1' + ] + ], + [ + '-LITERAL', + [ + '2' + ] + ], + ], + ], + ], + ], + ], + ], + ], + ], + [ "=", [ [ @@ -855,78 +1240,76 @@ is_deeply($sqlat->parse("SELECT * * FROM (SELECT *, FROM foobar baz buzz) foo ba "-LIST", [ [ - "-MISC", - [ - [ - "-LITERAL", - [ - "x" - ] - ], - [ - "-LITERAL", - [ - "x1" - ] - ], - [ - "-LITERAL", - [ - "x2" - ] - ], - [ - "-LITERAL", - [ - "y" - ] - ], - [ - "-LITERAL", - [ - "asc" - ] - ] - ] - ], - [ - "max", + "-ASC", [ [ "-MISC", [ [ - "-DESC", + "-LITERAL", [ - [ - "-PAREN", - [ - [ - "-LITERAL", - [ - "y" - ] - ] - ] - ] + "x" ] ], [ "-LITERAL", [ - "x" + "x1" ] ], [ "-LITERAL", [ - "z" + "x2" ] ], [ "-LITERAL", [ - "desc" + "y" + ] + ] + ] + ], + ], + ], + [ + "-DESC", + [ + [ + "-MISC", + [ + [ + "-DESC", + [ + [ + "max", + [ + [ + "-PAREN", + [ + [ + "-LITERAL", + [ + "y" + ] + ] + ] + ] + ], + ] + ] + ], + [ + "-LITERAL", + [ + "x" + ] + ], + [ + "-LITERAL", + [ + "z" ] ] ] @@ -941,10 +1324,10 @@ is_deeply($sqlat->parse("SELECT * * FROM (SELECT *, FROM foobar baz buzz) foo ba # test for recursion warnings on huge selectors -my @lst = ('XAA' .. 'XZZ'); -#@lst = ('XAAA' .. 'XZZZ'); # if you really want to wait a while +my @lst = ('AA' .. 'zz'); +#@lst = ('AAA' .. 'zzz'); # if you really want to wait a while warnings_are { - my $sql = sprintf 'SELECT %s FROM foo', join (', ', (map { "( $_ )" } @lst), (map { qq|"$_"| } @lst), (map { qq|"$_", ( $_ )| } @lst) ); + my $sql = sprintf 'SELECT %s FROM foo', join (', ', (map { qq|( "$_" )| } @lst), (map { qq|"$_"| } @lst), (map { qq|"$_", ( "$_" )| } @lst) ); my $tree = $sqlat->parse($sql); is_deeply( $tree, [ @@ -954,9 +1337,9 @@ warnings_are { [ "-LIST", [ - (map { [ -PAREN => [ [ -LITERAL => [ $_ ] ] ] ] } @lst), + (map { [ -PAREN => [ [ -LITERAL => [ qq|"$_"| ] ] ] ] } @lst), (map { [ -LITERAL => [ qq|"$_"| ] ] } @lst), - (map { [ -LITERAL => [ qq|"$_"| ] ], [ -PAREN => [ [ -LITERAL => [ $_ ] ] ] ] } @lst), + (map { [ -LITERAL => [ qq|"$_"| ] ], [ -PAREN => [ [ -LITERAL => [ qq|"$_"| ] ] ] ] } @lst), ] ] ]