a8cc66de990015bf5aa20b4ece081dc565baed1c
[dbsrgits/Data-Query.git] / t / sql.t
1 use strictures 1;
2 use Test::More qw(no_plan);
3
4 use Devel::Dwarn;
5 use Data::Query::Renderer::SQL::Naive;
6 use Data::Query::ExprHelpers qw(perl_scalar_value);
7
8 BEGIN { require 't/expr.include' }
9
10 my $rend = Data::Query::Renderer::SQL::Naive->new({ quote_chars => [ "'" ] });
11
12 sub binding { map perl_scalar_value($_), @_ }
13
14 sub expr_sql_is (&;@) {
15   my $sub = shift;
16   @_
17     ? is_deeply($rend->render(_run_expr($sub)->{expr}), @_)
18     : ::Dwarn($rend->render(_run_expr($sub)->{expr}));
19 }
20
21 expr_sql_is { $_->foo }
22   [ 'foo' ],
23   "Simple identifier -> SQL";
24
25 expr_sql_is { $_->group }
26   [ q{'group'} ],
27   "Simple identifier needing quoting -> SQL";
28
29 expr_sql_is { $_->foo->group }
30   [ q{foo.'group'} ],
31   "Complex identifier -> SQL";
32
33 expr_sql_is { $_->foo == 1 }
34   [ "foo = ?", binding(1) ],
35   "Simple expression -> SQL";
36
37 expr_sql_is { ($_->foo == 1) & ($_->bar eq "foo") }
38   [ "( foo = ? AND bar = ? )", binding(1, "foo") ],
39   "Compound expression -> SQL";
40
41
42 expr_sql_is { ($_->foo == 1) & ($_->bar eq "foo") & ($_->baz > 3) }
43   [ "( foo = ? AND bar = ? AND baz > ? )", binding(1, "foo", 3) ],
44   "Flatten expression ok";
45
46 expr_sql_is { !$_->foo } # XXX revisit this why are the parens here
47   [ "( NOT foo )" ],
48   "Unary expression ok";
49
50 expr_sql_is { SELECT { $_->foo } }
51   [ "SELECT foo" ],
52   "Simple identifier";
53
54 expr_sql_is { SELECT { $_->foo, 1 } }
55   # the extra space here is a little icky but Naive's _flatten_structure
56   # will need rewriting to fix it - commit bits available if you do it first
57   [ "SELECT foo, ?", binding(1) ],
58   "Identifier and literal";
59
60 expr_sql_is { SELECT { $_->foo => AS("foom"), 1 } }
61   [ "SELECT foo AS foom, ?", binding(1) ],
62   "AS with parens";
63
64 expr_sql_is { SELECT { $_->foo => AS "foom", 1 } }
65   [ "SELECT foo AS foom, ?", binding(1) ],
66   "AS without parens";