80b180f9b1eeb7dac547b7d8226e52a1dd73088c
[dbsrgits/DBIx-Class.git] / t / 95sql_maker_quote.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5
6 use lib qw(t/lib);
7 use DBIC::SqlMakerTest;
8
9 BEGIN {
10     eval "use DBD::SQLite";
11     plan $@
12         ? ( skip_all => 'needs DBD::SQLite for testing' )
13         : ( tests => 8 );
14 }
15
16 use_ok('DBICTest');
17
18 my $schema = DBICTest->init_schema();
19
20 my $sql_maker = $schema->storage->sql_maker;
21
22 $sql_maker->quote_char('`');
23 $sql_maker->name_sep('.');
24
25 my ($sql, @bind) = $sql_maker->select(
26           [
27             {
28               'me' => 'cd'
29             },
30             [
31               {
32                 'artist' => 'artist',
33                 '-join_type' => ''
34               },
35               {
36                 'artist.artistid' => 'me.artist'
37               }
38             ]
39           ],
40           [
41             {
42               'count' => '*'
43             }
44           ],
45           {
46             'artist.name' => 'Caterwauler McCrae',
47             'me.year' => 2001
48           },
49           [],
50           undef,
51           undef
52 );
53
54 is_same_sql_bind(
55    $sql, \@bind,
56    q/SELECT COUNT( * ) FROM `cd` `me`  JOIN `artist` `artist` ON ( `artist`.`artistid` = `me`.`artist` ) WHERE ( `artist`.`name` = ? AND `me`.`year` = ? )/,
57    [ ['artist.name' => 'Caterwauler McCrae'], ['me.year' => 2001] ],
58    'got correct SQL and bind parameters for count query with quoting'
59 );
60
61
62 ($sql, @bind) = $sql_maker->select(
63           [
64             {
65               'me' => 'cd'
66             }
67           ],
68           [
69             'me.cdid',
70             'me.artist',
71             'me.title',
72             'me.year'
73           ],
74           undef,
75           [
76             'year DESC'
77           ],
78           undef,
79           undef
80 );
81
82 TODO: {
83     local $TODO = "order_by with quoting needs fixing (ash/castaway)";
84
85     is_same_sql_bind(
86         $sql, \@bind,
87         q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY `year DESC`/, [],
88         'scalar ORDER BY okay (single value)'
89     );
90 }
91
92 TODO: {
93     local $TODO = "select attr with star needs fixing (mst/nate)";
94
95     ($sql, @bind) = $sql_maker->select(
96           [
97             {
98               'me' => 'cd'
99             }
100           ],
101           [
102             'me.*'
103           ],
104           undef,
105           [],
106           undef,
107           undef
108     );
109
110     is_same_sql_bind(
111       $sql, \@bind,
112       q/SELECT `me`.* FROM `cd` `me`/, [],
113       'select attr with me.* is right'
114     );
115 }
116
117 ($sql, @bind) = $sql_maker->select(
118           [
119             {
120               'me' => 'cd'
121             }
122           ],
123           [
124             'me.cdid',
125             'me.artist',
126             'me.title',
127             'me.year'
128           ],
129           undef,
130           [
131             \'year DESC'
132           ],
133           undef,
134           undef
135 );
136
137 is_same_sql_bind(
138   $sql, \@bind,
139   q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY year DESC/, [],
140   'did not quote ORDER BY with scalarref'
141 );
142
143
144 ($sql, @bind) = $sql_maker->update(
145           'group',
146           {
147             'order' => '12',
148             'name' => 'Bill'
149           }
150 );
151
152 is_same_sql_bind(
153   $sql, \@bind,
154   q/UPDATE `group` SET `name` = ?, `order` = ?/, [ ['name' => 'Bill'], ['order' => '12'] ],
155   'quoted table names for UPDATE'
156 );
157
158 $sql_maker->quote_char([qw/[ ]/]);
159
160 ($sql, @bind) = $sql_maker->select(
161           [
162             {
163               'me' => 'cd'
164             },
165             [
166               {
167                 'artist' => 'artist',
168                 '-join_type' => ''
169               },
170               {
171                 'artist.artistid' => 'me.artist'
172               }
173             ]
174           ],
175           [
176             {
177               'count' => '*'
178             }
179           ],
180           {
181             'artist.name' => 'Caterwauler McCrae',
182             'me.year' => 2001
183           },
184           [],
185           undef,
186           undef
187 );
188
189 is_same_sql_bind(
190   $sql, \@bind,
191   q/SELECT COUNT( * ) FROM [cd] [me]  JOIN [artist] [artist] ON ( [artist].[artistid] = [me].[artist] ) WHERE ( [artist].[name] = ? AND [me].[year] = ? )/, [ ['artist.name' => 'Caterwauler McCrae'], ['me.year' => 2001] ],
192   'got correct SQL and bind parameters for count query with bracket quoting'
193 );
194
195
196 ($sql, @bind) = $sql_maker->update(
197           'group',
198           {
199             'order' => '12',
200             'name' => 'Bill'
201           }
202 );
203
204 is_same_sql_bind(
205   $sql, \@bind,
206   q/UPDATE [group] SET [name] = ?, [order] = ?/, [ ['name' => 'Bill'], ['order' => '12'] ],
207   'bracket quoted table names for UPDATE'
208 );