Showing 3 changed files with 170 additions and 160 deletions
+1 -1
lib/DBIx/Custom.pm
... ...
@@ -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;
+157 -159
t/common.t
... ...
@@ -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;
+12
t/mysql.t
... ...
@@ -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",