Extra sqla quoting test
[dbsrgits/DBIx-Class.git] / t / 95sql_maker_quote.t
CommitLineData
3da841f1 1use strict;
2use warnings;
3
4use Test::More;
5
c61a0748 6use lib qw(t/lib);
7use DBIC::SqlMakerTest;
3da841f1 8
3da841f1 9use_ok('DBICTest');
10
c216324a 11my $schema = DBICTest->init_schema();
3da841f1 12
c216324a 13my $sql_maker = $schema->storage->sql_maker;
3da841f1 14
15$sql_maker->quote_char('`');
16$sql_maker->name_sep('.');
17
9b459129 18my ($sql, @bind) = $sql_maker->select(
3da841f1 19 [
20 {
21 'me' => 'cd'
22 },
23 [
24 {
25 'artist' => 'artist',
26 '-join_type' => ''
27 },
28 {
29 'artist.artistid' => 'me.artist'
30 }
83e09b5b 31 ],
32 [
33 {
34 'tracks' => 'tracks',
35 '-join_type' => 'left'
36 },
37 {
38 'tracks.cd' => 'me.cdid'
39 }
40 ],
3da841f1 41 ],
42 [
83e09b5b 43 'me.cdid',
44 { count => 'tracks.cd' },
50136dd9 45 { min => 'me.year', -as => 'me.minyear' },
3da841f1 46 ],
47 {
48 'artist.name' => 'Caterwauler McCrae',
49 'me.year' => 2001
50 },
51 [],
52 undef,
53 undef
54);
55
9b459129 56is_same_sql_bind(
57 $sql, \@bind,
83e09b5b 58 q/
50136dd9 59 SELECT `me`.`cdid`, COUNT( `tracks`.`cd` ), MIN( `me`.`year` ) AS `me`.`minyear`
83e09b5b 60 FROM `cd` `me`
61 JOIN `artist` `artist` ON ( `artist`.`artistid` = `me`.`artist` )
62 LEFT JOIN `tracks` `tracks` ON ( `tracks`.`cd` = `me`.`cdid` )
63 WHERE ( `artist`.`name` = ? AND `me`.`year` = ? )
64 /,
65 [ ['artist.name' => 'Caterwauler McCrae'], ['me.year' => 2001] ],
66 'got correct SQL and bind parameters for complex select query with quoting'
9b459129 67);
3da841f1 68
c80207cd 69
9b459129 70($sql, @bind) = $sql_maker->select(
3da841f1 71 [
72 {
73 'me' => 'cd'
74 }
75 ],
76 [
77 'me.cdid',
78 'me.artist',
79 'me.title',
80 'me.year'
81 ],
82 undef,
c80207cd 83 'year DESC',
84 undef,
85 undef
86);
87
88is_same_sql_bind(
89 $sql, \@bind,
90 q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY `year DESC`/, [],
91 'scalar ORDER BY okay (single value)'
92);
93
94
95($sql, @bind) = $sql_maker->select(
3da841f1 96 [
c80207cd 97 {
98 'me' => 'cd'
99 }
100 ],
101 [
102 'me.cdid',
103 'me.artist',
104 'me.title',
105 'me.year'
106 ],
107 undef,
108 [
109 'year DESC',
110 'title ASC'
3da841f1 111 ],
112 undef,
113 undef
114);
115
8682bb07 116is_same_sql_bind(
117 $sql, \@bind,
c80207cd 118 q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY `year DESC`, `title ASC`/, [],
119 'scalar ORDER BY okay (multiple values)'
8682bb07 120);
121
20ea616f 122{
89479564 123 ($sql, @bind) = $sql_maker->select(
124 [
125 {
126 'me' => 'cd'
127 }
128 ],
129 [
130 'me.cdid',
131 'me.artist',
132 'me.title',
133 'me.year'
134 ],
135 undef,
136 { -desc => 'year' },
137 undef,
138 undef
139 );
3da841f1 140
89479564 141 is_same_sql_bind(
142 $sql, \@bind,
143 q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY `year` DESC/, [],
144 'hashref ORDER BY okay (single value)'
145 );
3da841f1 146
c80207cd 147
89479564 148 ($sql, @bind) = $sql_maker->select(
149 [
150 {
151 'me' => 'cd'
152 }
153 ],
154 [
155 'me.cdid',
156 'me.artist',
157 'me.title',
158 'me.year'
159 ],
160 undef,
161 [
162 { -desc => 'year' },
163 { -asc => 'title' }
164 ],
165 undef,
166 undef
167 );
168
169 is_same_sql_bind(
170 $sql, \@bind,
171 q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY `year` DESC, `title` ASC/, [],
172 'hashref ORDER BY okay (multiple values)'
173 );
c80207cd 174
89479564 175}
c80207cd 176
177
178($sql, @bind) = $sql_maker->select(
179 [
180 {
181 'me' => 'cd'
182 }
183 ],
184 [
185 'me.cdid',
186 'me.artist',
187 'me.title',
188 'me.year'
3da841f1 189 ],
190 undef,
c80207cd 191 \'year DESC',
192 undef,
3da841f1 193 undef
194);
195
9b459129 196is_same_sql_bind(
197 $sql, \@bind,
198 q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY year DESC/, [],
c80207cd 199 'did not quote ORDER BY with scalarref (single value)'
200);
201
202
203($sql, @bind) = $sql_maker->select(
204 [
205 {
206 'me' => 'cd'
207 }
208 ],
209 [
210 'me.cdid',
211 'me.artist',
212 'me.title',
213 'me.year'
214 ],
215 undef,
216 [
217 \'year DESC',
218 \'title ASC'
219 ],
220 undef,
221 undef
222);
223
224is_same_sql_bind(
225 $sql, \@bind,
226 q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title`, `me`.`year` FROM `cd` `me` ORDER BY year DESC, title ASC/, [],
227 'did not quote ORDER BY with scalarref (multiple values)'
3da841f1 228);
229
c80207cd 230
da562e65 231($sql, @bind) = $sql_maker->select(
232 [ { me => 'cd' } ],
233 [qw/ me.cdid me.artist me.title /],
234 { cdid => \['rlike ?', [cdid => 'X'] ] },
235 { group_by => 'title', having => \['count(me.artist) > ?', [ cnt => 2] ] },
236);
237
238is_same_sql_bind(
239 $sql, \@bind,
240 q/SELECT `me`.`cdid`, `me`.`artist`, `me`.`title` FROM `cd` `me` WHERE ( `cdid` rlike ? ) GROUP BY `title` HAVING count(me.artist) > ?/,
241 [ [ cdid => 'X'], ['cnt' => '2'] ],
242 'Quoting works with where/having scalarrefs',
243);
244
245
9b459129 246($sql, @bind) = $sql_maker->update(
3da841f1 247 'group',
248 {
249 'order' => '12',
250 'name' => 'Bill'
251 }
252);
253
9b459129 254is_same_sql_bind(
255 $sql, \@bind,
256 q/UPDATE `group` SET `name` = ?, `order` = ?/, [ ['name' => 'Bill'], ['order' => '12'] ],
257 'quoted table names for UPDATE'
258);
3da841f1 259
20ea616f 260{
949172b0 261 ($sql, @bind) = $sql_maker->select(
262 [
263 {
264 'me' => 'cd'
265 }
266 ],
267 [
268 'me.*'
269 ],
270 undef,
271 [],
272 undef,
273 undef
274 );
c80207cd 275
949172b0 276 is_same_sql_bind(
277 $sql, \@bind,
278 q/SELECT `me`.* FROM `cd` `me`/, [],
279 'select attr with me.* is right'
280 );
281}
c80207cd 282
283
3da841f1 284$sql_maker->quote_char([qw/[ ]/]);
285
9b459129 286($sql, @bind) = $sql_maker->select(
3da841f1 287 [
288 {
289 'me' => 'cd'
290 },
291 [
292 {
293 'artist' => 'artist',
294 '-join_type' => ''
295 },
296 {
297 'artist.artistid' => 'me.artist'
298 }
299 ]
300 ],
301 [
302 {
50136dd9 303 max => 'rank',
304 -as => 'max_rank',
305 },
306 'rank',
307 {
308 'count' => '*',
309 -as => 'cnt',
3da841f1 310 }
311 ],
312 {
313 'artist.name' => 'Caterwauler McCrae',
314 'me.year' => 2001
315 },
316 [],
317 undef,
318 undef
319);
320
9b459129 321is_same_sql_bind(
322 $sql, \@bind,
50136dd9 323 q/SELECT MAX ( [rank] ) AS [max_rank], [rank], COUNT( * ) AS [cnt] FROM [cd] [me] JOIN [artist] [artist] ON ( [artist].[artistid] = [me].[artist] ) WHERE ( [artist].[name] = ? AND [me].[year] = ? )/, [ ['artist.name' => 'Caterwauler McCrae'], ['me.year' => 2001] ],
9b459129 324 'got correct SQL and bind parameters for count query with bracket quoting'
325);
3da841f1 326
327
9b459129 328($sql, @bind) = $sql_maker->update(
3da841f1 329 'group',
330 {
331 'order' => '12',
332 'name' => 'Bill'
333 }
334);
335
9b459129 336is_same_sql_bind(
337 $sql, \@bind,
338 q/UPDATE [group] SET [name] = ?, [order] = ?/, [ ['name' => 'Bill'], ['order' => '12'] ],
339 'bracket quoted table names for UPDATE'
340);
da562e65 341
342done_testing;