... | ... |
@@ -260,7 +260,7 @@ sub delete { |
260 | 260 |
|
261 | 261 |
sub delete_all { shift->delete(allow_delete_all => 1, @_) } |
262 | 262 |
|
263 |
-sub DESTROY { } |
|
263 |
+sub DESTROY {} |
|
264 | 264 |
|
265 | 265 |
sub create_model { |
266 | 266 |
my $self = shift; |
... | ... |
@@ -233,165 +233,6 @@ require MyDBI1; |
233 | 233 |
} |
234 | 234 |
} |
235 | 235 |
|
236 |
-test 'join'; |
|
237 |
-$dbi = DBIx::Custom->connect; |
|
238 |
-eval { $dbi->execute("drop table $table1") }; |
|
239 |
-$dbi->execute($create_table1); |
|
240 |
-$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
241 |
-$dbi->insert(table => $table1, param => {$key1 => 3, $key2 => 4}); |
|
242 |
-eval { $dbi->execute("drop table $table2") }; |
|
243 |
-$dbi->execute($create_table2); |
|
244 |
-$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
245 |
-eval { $dbi->execute("drop table $table3") }; |
|
246 |
-$dbi->execute("create table $table3 ($key3 int, $key4 int)"); |
|
247 |
-$dbi->insert(table => $table3, param => {$key3 => 5, $key4 => 4}); |
|
248 |
-$rows = $dbi->select( |
|
249 |
- table => $table1, |
|
250 |
- column => "$table1.$key1 as ${table1}_$key1, $table2.$key1 as ${table2}_$key1, $key2, $key3", |
|
251 |
- where => {"$table1.$key2" => 2}, |
|
252 |
- join => ["left outer join $table2 on $table1.$key1 = $table2.$key1"] |
|
253 |
-)->all; |
|
254 |
-is_deeply($rows, [{"${table1}_$key1" => 1, "${table2}_$key1" => 1, $key2 => 2, $key3 => 5}]); |
|
255 |
- |
|
256 |
-$rows = $dbi->select( |
|
257 |
- table => $table1, |
|
258 |
- where => {$key1 => 1}, |
|
259 |
- join => ["left outer join $table2 on $table1.$key1 = $table2.$key1"] |
|
260 |
-)->all; |
|
261 |
-is_deeply($rows, [{$key1 => 1, $key2 => 2}]); |
|
262 |
- |
|
263 |
-eval { |
|
264 |
- $rows = $dbi->select( |
|
265 |
- table => $table1, |
|
266 |
- column => "$table1.$key1 as ${table1}_$key1, $table2.$key1 as ${table2}_$key1, $key2, $key3", |
|
267 |
- where => {"$table1.$key2" => 2}, |
|
268 |
- join => {"$table1.$key1" => "$table2.$key1"} |
|
269 |
- ); |
|
270 |
-}; |
|
271 |
-like ($@, qr/array/); |
|
272 |
- |
|
273 |
-$rows = $dbi->select( |
|
274 |
- table => $table1, |
|
275 |
- where => {$key1 => 1}, |
|
276 |
- join => ["left outer join $table2 on $table1.$key1 = $table2.$key1", |
|
277 |
- "left outer join $table3 on $table2.$key3 = $table3.$key3"] |
|
278 |
-)->all; |
|
279 |
-is_deeply($rows, [{$key1 => 1, $key2 => 2}]); |
|
280 |
- |
|
281 |
-$rows = $dbi->select( |
|
282 |
- column => "$table3.$key4 as ${table3}__$key4", |
|
283 |
- table => $table1, |
|
284 |
- where => {"$table1.$key1" => 1}, |
|
285 |
- join => ["left outer join $table2 on $table1.$key1 = $table2.$key1", |
|
286 |
- "left outer join $table3 on $table2.$key3 = $table3.$key3"] |
|
287 |
-)->all; |
|
288 |
-is_deeply($rows, [{"${table3}__$key4" => 4}]); |
|
289 |
- |
|
290 |
-$rows = $dbi->select( |
|
291 |
- column => "$table1.$key1 as ${table1}__$key1", |
|
292 |
- table => $table1, |
|
293 |
- where => {"$table3.$key4" => 4}, |
|
294 |
- join => ["left outer join $table2 on $table1.$key1 = $table2.$key1", |
|
295 |
- "left outer join $table3 on $table2.$key3 = $table3.$key3"] |
|
296 |
-)->all; |
|
297 |
-is_deeply($rows, [{"${table1}__$key1" => 1}]); |
|
298 |
- |
|
299 |
-$dbi = DBIx::Custom->connect; |
|
300 |
-eval { $dbi->execute("drop table $table1") }; |
|
301 |
-$dbi->execute($create_table1); |
|
302 |
-$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
303 |
-eval { $dbi->execute("drop table $table2") }; |
|
304 |
-$dbi->execute($create_table2); |
|
305 |
-$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
306 |
-$rows = $dbi->select( |
|
307 |
- table => $table1, |
|
308 |
- column => "${q}$table1$p.${q}$key1$p as ${q}${table1}_$key1$p, ${q}$table2$p.${q}$key1$p as ${q}${table2}_$key1$p, ${q}$key2$p, ${q}$key3$p", |
|
309 |
- where => {"$table1.$key2" => 2}, |
|
310 |
- join => ["left outer join ${q}$table2$p on ${q}$table1$p.${q}$key1$p = ${q}$table2$p.${q}$key1$p"], |
|
311 |
-)->all; |
|
312 |
-is_deeply($rows, [{"${table1}_$key1" => 1, "${table2}_$key1" => 1, $key2 => 2, $key3 => 5}], |
|
313 |
- 'quote'); |
|
314 |
- |
|
315 |
- |
|
316 |
-$dbi = DBIx::Custom->connect; |
|
317 |
-eval { $dbi->execute("drop table $table1") }; |
|
318 |
-$dbi->execute($create_table1); |
|
319 |
-$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
320 |
-$sql = <<"EOS"; |
|
321 |
-left outer join ( |
|
322 |
- select * from $table1 t1 |
|
323 |
- where t1.$key2 = ( |
|
324 |
- select max(t2.$key2) from $table1 t2 |
|
325 |
- where t1.$key1 = t2.$key1 |
|
326 |
- ) |
|
327 |
-) $table3 on $table1.$key1 = $table3.$key1 |
|
328 |
-EOS |
|
329 |
-$join = [$sql]; |
|
330 |
-$rows = $dbi->select( |
|
331 |
- table => $table1, |
|
332 |
- column => "$table3.$key1 as ${table3}__$key1", |
|
333 |
- join => $join |
|
334 |
-)->all; |
|
335 |
-$DB::single = 1; |
|
336 |
-is_deeply($rows, [{"${table3}__$key1" => 1}]); |
|
337 |
- |
|
338 |
-$dbi = DBIx::Custom->connect; |
|
339 |
-eval { $dbi->execute("drop table $table1") }; |
|
340 |
-eval { $dbi->execute("drop table $table2") }; |
|
341 |
-$dbi->execute($create_table1); |
|
342 |
-$dbi->execute($create_table2); |
|
343 |
-$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
344 |
-$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 4}); |
|
345 |
-$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
346 |
-$result = $dbi->select( |
|
347 |
- table => $table1, |
|
348 |
- join => [ |
|
349 |
- "left outer join $table2 on $table2.$key2 = '4' and $table1.$key1 = $table2.$key1" |
|
350 |
- ] |
|
351 |
-); |
|
352 |
-is_deeply($result->all, [{$key1 => 1, $key2 => 2}]); |
|
353 |
-$result = $dbi->select( |
|
354 |
- table => $table1, |
|
355 |
- column => [{$table2 => [$key3]}], |
|
356 |
- join => [ |
|
357 |
- "left outer join $table2 on $table2.$key3 = '4' and $table1.$key1 = $table2.$key1" |
|
358 |
- ] |
|
359 |
-); |
|
360 |
-is_deeply($result->all, [{"$table2.$key3" => 4}]); |
|
361 |
-$result = $dbi->select( |
|
362 |
- table => $table1, |
|
363 |
- column => [{$table2 => [$key3]}], |
|
364 |
- join => [ |
|
365 |
- "left outer join $table2 on $table1.$key1 = $table2.$key1 and $table2.$key3 = '4'" |
|
366 |
- ] |
|
367 |
-); |
|
368 |
-is_deeply($result->all, [{"$table2.$key3" => 4}]); |
|
369 |
- |
|
370 |
-$dbi = DBIx::Custom->connect; |
|
371 |
-eval { $dbi->execute("drop table $table1") }; |
|
372 |
-eval { $dbi->execute("drop table $table2") }; |
|
373 |
-$dbi->execute($create_table1); |
|
374 |
-$dbi->execute($create_table2); |
|
375 |
-$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
376 |
-$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 4}); |
|
377 |
-$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
378 |
-$result = $dbi->select( |
|
379 |
- table => $table1, |
|
380 |
- column => [{$table2 => [$key3]}], |
|
381 |
- join => [ |
|
382 |
- { |
|
383 |
- clause => "left outer join $table2 on $table2.$key3 = '4' and $table1.$key1 = $table2.$key1", |
|
384 |
- table => [$table1, $table2] |
|
385 |
- } |
|
386 |
- ] |
|
387 |
-); |
|
388 |
-is_deeply($result->all, [{"$table2.$key3" => 4}]); |
|
389 |
- |
|
390 |
-test 'columns'; |
|
391 |
-$DB::single = 1; |
|
392 |
-$dbi = MyDBI1->connect; |
|
393 |
-$model = $dbi->model($table1); |
|
394 |
- |
|
395 | 236 |
# Create table |
396 | 237 |
$dbi = DBIx::Custom->connect; |
397 | 238 |
eval { $dbi->execute("drop table $table1") }; |
... | ... |
@@ -3855,5 +3696,162 @@ like($result->type_rule2_off->fetch_first->[0], qr/^2010-01-06/); |
3855 | 3696 |
$result = $dbi->select(table => $table1); |
3856 | 3697 |
like($result->type_rule2_on->fetch_first->[0], qr/^2010-01-07/); |
3857 | 3698 |
|
3699 |
+test 'join'; |
|
3700 |
+$dbi = DBIx::Custom->connect; |
|
3701 |
+eval { $dbi->execute("drop table $table1") }; |
|
3702 |
+$dbi->execute($create_table1); |
|
3703 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
3704 |
+$dbi->insert(table => $table1, param => {$key1 => 3, $key2 => 4}); |
|
3705 |
+eval { $dbi->execute("drop table $table2") }; |
|
3706 |
+$dbi->execute($create_table2); |
|
3707 |
+$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
3708 |
+eval { $dbi->execute("drop table $table3") }; |
|
3709 |
+$dbi->execute("create table $table3 ($key3 int, $key4 int)"); |
|
3710 |
+$dbi->insert(table => $table3, param => {$key3 => 5, $key4 => 4}); |
|
3711 |
+$rows = $dbi->select( |
|
3712 |
+ table => $table1, |
|
3713 |
+ column => "$table1.$key1 as ${table1}_$key1, $table2.$key1 as ${table2}_$key1, $key2, $key3", |
|
3714 |
+ where => {"$table1.$key2" => 2}, |
|
3715 |
+ join => ["left outer join $table2 on $table1.$key1 = $table2.$key1"] |
|
3716 |
+)->all; |
|
3717 |
+is_deeply($rows, [{"${table1}_$key1" => 1, "${table2}_$key1" => 1, $key2 => 2, $key3 => 5}]); |
|
3718 |
+ |
|
3719 |
+$rows = $dbi->select( |
|
3720 |
+ table => $table1, |
|
3721 |
+ where => {$key1 => 1}, |
|
3722 |
+ join => ["left outer join $table2 on $table1.$key1 = $table2.$key1"] |
|
3723 |
+)->all; |
|
3724 |
+is_deeply($rows, [{$key1 => 1, $key2 => 2}]); |
|
3725 |
+ |
|
3726 |
+eval { |
|
3727 |
+ $rows = $dbi->select( |
|
3728 |
+ table => $table1, |
|
3729 |
+ column => "$table1.$key1 as ${table1}_$key1, $table2.$key1 as ${table2}_$key1, $key2, $key3", |
|
3730 |
+ where => {"$table1.$key2" => 2}, |
|
3731 |
+ join => {"$table1.$key1" => "$table2.$key1"} |
|
3732 |
+ ); |
|
3733 |
+}; |
|
3734 |
+like ($@, qr/array/); |
|
3735 |
+ |
|
3736 |
+$rows = $dbi->select( |
|
3737 |
+ table => $table1, |
|
3738 |
+ where => {$key1 => 1}, |
|
3739 |
+ join => ["left outer join $table2 on $table1.$key1 = $table2.$key1", |
|
3740 |
+ "left outer join $table3 on $table2.$key3 = $table3.$key3"] |
|
3741 |
+)->all; |
|
3742 |
+is_deeply($rows, [{$key1 => 1, $key2 => 2}]); |
|
3743 |
+ |
|
3744 |
+$rows = $dbi->select( |
|
3745 |
+ column => "$table3.$key4 as ${table3}__$key4", |
|
3746 |
+ table => $table1, |
|
3747 |
+ where => {"$table1.$key1" => 1}, |
|
3748 |
+ join => ["left outer join $table2 on $table1.$key1 = $table2.$key1", |
|
3749 |
+ "left outer join $table3 on $table2.$key3 = $table3.$key3"] |
|
3750 |
+)->all; |
|
3751 |
+is_deeply($rows, [{"${table3}__$key4" => 4}]); |
|
3752 |
+ |
|
3753 |
+$rows = $dbi->select( |
|
3754 |
+ column => "$table1.$key1 as ${table1}__$key1", |
|
3755 |
+ table => $table1, |
|
3756 |
+ where => {"$table3.$key4" => 4}, |
|
3757 |
+ join => ["left outer join $table2 on $table1.$key1 = $table2.$key1", |
|
3758 |
+ "left outer join $table3 on $table2.$key3 = $table3.$key3"] |
|
3759 |
+)->all; |
|
3760 |
+is_deeply($rows, [{"${table1}__$key1" => 1}]); |
|
3761 |
+ |
|
3762 |
+$dbi = DBIx::Custom->connect; |
|
3763 |
+eval { $dbi->execute("drop table $table1") }; |
|
3764 |
+$dbi->execute($create_table1); |
|
3765 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
3766 |
+eval { $dbi->execute("drop table $table2") }; |
|
3767 |
+$dbi->execute($create_table2); |
|
3768 |
+$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
3769 |
+$rows = $dbi->select( |
|
3770 |
+ table => $table1, |
|
3771 |
+ column => "${q}$table1$p.${q}$key1$p as ${q}${table1}_$key1$p, ${q}$table2$p.${q}$key1$p as ${q}${table2}_$key1$p, ${q}$key2$p, ${q}$key3$p", |
|
3772 |
+ where => {"$table1.$key2" => 2}, |
|
3773 |
+ join => ["left outer join ${q}$table2$p on ${q}$table1$p.${q}$key1$p = ${q}$table2$p.${q}$key1$p"], |
|
3774 |
+)->all; |
|
3775 |
+is_deeply($rows, [{"${table1}_$key1" => 1, "${table2}_$key1" => 1, $key2 => 2, $key3 => 5}], |
|
3776 |
+ 'quote'); |
|
3777 |
+ |
|
3778 |
+ |
|
3779 |
+$dbi = DBIx::Custom->connect; |
|
3780 |
+eval { $dbi->execute("drop table $table1") }; |
|
3781 |
+$dbi->execute($create_table1); |
|
3782 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
3783 |
+$sql = <<"EOS"; |
|
3784 |
+left outer join ( |
|
3785 |
+ select * from $table1 t1 |
|
3786 |
+ where t1.$key2 = ( |
|
3787 |
+ select max(t2.$key2) from $table1 t2 |
|
3788 |
+ where t1.$key1 = t2.$key1 |
|
3789 |
+ ) |
|
3790 |
+) $table3 on $table1.$key1 = $table3.$key1 |
|
3791 |
+EOS |
|
3792 |
+$join = [$sql]; |
|
3793 |
+$rows = $dbi->select( |
|
3794 |
+ table => $table1, |
|
3795 |
+ column => "$table3.$key1 as ${table3}__$key1", |
|
3796 |
+ join => $join |
|
3797 |
+)->all; |
|
3798 |
+is_deeply($rows, [{"${table3}__$key1" => 1}]); |
|
3799 |
+ |
|
3800 |
+$dbi = DBIx::Custom->connect; |
|
3801 |
+eval { $dbi->execute("drop table $table1") }; |
|
3802 |
+eval { $dbi->execute("drop table $table2") }; |
|
3803 |
+$dbi->execute($create_table1); |
|
3804 |
+$dbi->execute($create_table2); |
|
3805 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
3806 |
+$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 4}); |
|
3807 |
+$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
3808 |
+$result = $dbi->select( |
|
3809 |
+ table => $table1, |
|
3810 |
+ join => [ |
|
3811 |
+ "left outer join $table2 on $table2.$key2 = '4' and $table1.$key1 = $table2.$key1" |
|
3812 |
+ ] |
|
3813 |
+); |
|
3814 |
+is_deeply($result->all, [{$key1 => 1, $key2 => 2}]); |
|
3815 |
+$result = $dbi->select( |
|
3816 |
+ table => $table1, |
|
3817 |
+ column => [{$table2 => [$key3]}], |
|
3818 |
+ join => [ |
|
3819 |
+ "left outer join $table2 on $table2.$key3 = '4' and $table1.$key1 = $table2.$key1" |
|
3820 |
+ ] |
|
3821 |
+); |
|
3822 |
+is_deeply($result->all, [{"$table2.$key3" => 4}]); |
|
3823 |
+$result = $dbi->select( |
|
3824 |
+ table => $table1, |
|
3825 |
+ column => [{$table2 => [$key3]}], |
|
3826 |
+ join => [ |
|
3827 |
+ "left outer join $table2 on $table1.$key1 = $table2.$key1 and $table2.$key3 = '4'" |
|
3828 |
+ ] |
|
3829 |
+); |
|
3830 |
+is_deeply($result->all, [{"$table2.$key3" => 4}]); |
|
3831 |
+ |
|
3832 |
+$dbi = DBIx::Custom->connect; |
|
3833 |
+eval { $dbi->execute("drop table $table1") }; |
|
3834 |
+eval { $dbi->execute("drop table $table2") }; |
|
3835 |
+$dbi->execute($create_table1); |
|
3836 |
+$dbi->execute($create_table2); |
|
3837 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2}); |
|
3838 |
+$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 4}); |
|
3839 |
+$dbi->insert(table => $table2, param => {$key1 => 1, $key3 => 5}); |
|
3840 |
+$result = $dbi->select( |
|
3841 |
+ table => $table1, |
|
3842 |
+ column => [{$table2 => [$key3]}], |
|
3843 |
+ join => [ |
|
3844 |
+ { |
|
3845 |
+ clause => "left outer join $table2 on $table2.$key3 = '4' and $table1.$key1 = $table2.$key1", |
|
3846 |
+ table => [$table1, $table2] |
|
3847 |
+ } |
|
3848 |
+ ] |
|
3849 |
+); |
|
3850 |
+is_deeply($result->all, [{"$table2.$key3" => 4}]); |
|
3851 |
+ |
|
3852 |
+test 'columns'; |
|
3853 |
+$dbi = MyDBI1->connect; |
|
3854 |
+$model = $dbi->model($table1); |
|
3855 |
+ |
|
3858 | 3856 |
|
3859 | 3857 |
1; |
... | ... |
@@ -36,6 +36,18 @@ eval { |
36 | 36 |
}; |
37 | 37 |
ok(!$@); |
38 | 38 |
|
39 |
+# Test memory leaks |
|
40 |
+for (1 .. 200) { |
|
41 |
+ $dbi = DBIx::Custom->connect( |
|
42 |
+ dsn => "dbi:mysql:database=$database;host=localhost;port=10000", |
|
43 |
+ user => $user, |
|
44 |
+ password => $password |
|
45 |
+ ); |
|
46 |
+ $dbi->query_builder; |
|
47 |
+ $dbi->create_model(table => $table1); |
|
48 |
+ $dbi->create_model(table => $table2); |
|
49 |
+} |
|
50 |
+ |
|
39 | 51 |
test 'limit'; |
40 | 52 |
$dbi = DBIx::Custom->connect( |
41 | 53 |
dsn => "dbi:mysql:database=$database", |