]
], '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",
]
], '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",
[
]
],
[
- "=",
+ "-MISC",
[
[
+ "=",
+ [
+ [
+ "-LITERAL",
+ [
+ "foo.a"
+ ]
+ ],
+ [
+ "-PLACEHOLDER",
+ [
+ "?"
+ ]
+ ],
+ ],
+ ],
+ [
"-LITERAL",
[
- "foo.a"
+ "STUFF"
]
],
+ ],
+ ],
+ [
+ 'moar',
+ [
[
- "-PLACEHOLDER",
+ '-PAREN',
[
- "?"
+ [
+ '-LITERAL',
+ [
+ 'stuff'
+ ]
+ ]
]
]
]
]
],
[
+ 'IN',
+ [
+ [
+ '-LITERAL',
+ [
+ 'z',
+ ],
+ ],
+ [
+ '-PAREN',
+ [
+ [
+ '-PAREN',
+ [
+ [
+ '-LIST',
+ [
+ [
+ '-LITERAL',
+ [
+ '1'
+ ]
+ ],
+ [
+ '-LITERAL',
+ [
+ '2'
+ ]
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ ],
+ [
"=",
[
[
"-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"
]
]
]
# 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, [
[
"-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),
]
]
]