Added support for handling Class::DBI::Column in CDBICompat
[dbsrgits/DBIx-Class.git] / t / search / subquery.t
CommitLineData
cbbd7939 1use strict;
69989ea9 2use warnings;
cbbd7939 3
cbbd7939 4use Test::More;
d0a3e4e2 5
cbbd7939 6use lib qw(t/lib);
a5a7bb73 7use DBICTest ':DiffSQL';
fcb7fcbb 8use DBIx::Class::SQLMaker::LimitDialects;
9
10my $ROWS = DBIx::Class::SQLMaker::LimitDialects->__rows_bindtype;
cbbd7939 11
cbbd7939 12my $schema = DBICTest->init_schema();
13my $art_rs = $schema->resultset('Artist');
14my $cdrs = $schema->resultset('CD');
15
69989ea9 16my @tests = (
17 {
18 rs => $cdrs,
a17640f1 19 search => \[ "title = ? AND year LIKE ?", [ title => 'buahaha' ], [ year => '20%' ] ],
f21e372a 20 attrs => { rows => 5 },
21 sqlbind => \[
fcb7fcbb 22 "( SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE (title = ? AND year LIKE ?) LIMIT ?)",
23 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'title' } => 'buahaha' ],
24 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'year' } => '20%' ],
25 [ $ROWS => 5 ],
f21e372a 26 ],
27 },
28
29 {
30 rs => $cdrs,
69989ea9 31 search => {
0e773352 32 artistid => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'artistid' )->as_query },
69989ea9 33 },
34 sqlbind => \[
fcb7fcbb 35 "( SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE artistid IN ( SELECT me.artistid FROM artist me LIMIT ? ) )",
36 [ $ROWS => 1 ],
69989ea9 37 ],
38 },
cbbd7939 39
69989ea9 40 {
41 rs => $art_rs,
42 attrs => {
0a62f675 43 'select' => [
7f51e1c8 44 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
45 ],
0a62f675 46 },
69989ea9 47 sqlbind => \[
722274d0 48 "( SELECT (SELECT me.id FROM cd me LIMIT ?) FROM artist me )",
fcb7fcbb 49 [ $ROWS => 1 ],
69989ea9 50 ],
51 },
0a62f675 52
69989ea9 53 {
54 rs => $art_rs,
55 attrs => {
0a62f675 56 '+select' => [
57 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
7f51e1c8 58 ],
59 },
69989ea9 60 sqlbind => \[
722274d0 61 "( SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT me.id FROM cd me LIMIT ?) FROM artist me )",
fcb7fcbb 62 [ $ROWS => 1 ],
69989ea9 63 ],
64 },
7f51e1c8 65
69989ea9 66 {
67 rs => $cdrs,
68 attrs => {
7f51e1c8 69 alias => 'cd2',
70 from => [
0e773352 71 { cd2 => $cdrs->search({ artist => { '>' => 20 } })->as_query },
7f51e1c8 72 ],
73 },
69989ea9 74 sqlbind => \[
0491b597 75 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (
0e773352 76 SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE artist > ?
0491b597 77 ) cd2
78 )",
0e773352 79 [ { sqlt_datatype => 'integer', dbic_colname => 'artist' } => 20 ]
866557f9 80 ],
69989ea9 81 },
7f51e1c8 82
a3c8d695 83 {
69989ea9 84 rs => $art_rs,
85 attrs => {
539ffe87 86 from => [
87 { 'me' => 'artist' },
88 [
89 { 'cds' => $cdrs->search({}, { 'select' => [\'me.artist as cds_artist' ]})->as_query },
fcb7fcbb 90 { 'me.artistid' => 'cds_artist' }
539ffe87 91 ]
92 ]
69989ea9 93 },
94 sqlbind => \[
95 "( SELECT me.artistid, me.name, me.rank, me.charfield FROM artist me JOIN (SELECT me.artist as cds_artist FROM cd me) cds ON me.artistid = cds_artist )"
96 ],
97 },
a3c8d695 98
69989ea9 99 {
100 rs => $cdrs,
101 attrs => {
d20198ab 102 alias => 'cd2',
103 from => [
104 { cd2 => $cdrs->search(
fcb7fcbb 105 { artist => { '>' => 20 } },
106 {
d20198ab 107 alias => 'cd3',
fcb7fcbb 108 from => [
0e773352 109 { cd3 => $cdrs->search( { artist => { '<' => 40 } } )->as_query }
d20198ab 110 ],
111 }, )->as_query },
112 ],
113 },
69989ea9 114 sqlbind => \[
115 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track
116 FROM
0491b597 117 (SELECT cd3.cdid, cd3.artist, cd3.title, cd3.year, cd3.genreid, cd3.single_track
69989ea9 118 FROM
0491b597 119 (SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
0e773352 120 FROM cd me WHERE artist < ?) cd3
121 WHERE artist > ?) cd2
69989ea9 122 )",
0e773352 123 [ { sqlt_datatype => 'integer', dbic_colname => 'artist' } => 40 ],
124 [ { dbic_colname => 'artist' } => 20 ], # no rsrc in outer manual from - hence no resolution
866557f9 125 ],
69989ea9 126 },
d20198ab 127
69989ea9 128 {
129 rs => $cdrs,
130 search => {
131 year => {
132 '=' => $cdrs->search(
133 { artistid => { '=' => \'me.artistid' } },
134 { alias => 'inner' }
135 )->get_column('year')->max_rs->as_query,
136 },
4fa7bc22 137 },
69989ea9 138 sqlbind => \[
139 "( SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE year = (SELECT MAX(inner.year) FROM cd inner WHERE artistid = me.artistid) )",
140 ],
141 },
4fa7bc22 142
69989ea9 143 {
144 rs => $cdrs,
145 attrs => {
8996a659 146 alias => 'cd2',
147 from => [
148 { cd2 => $cdrs->search({ title => 'Thriller' })->as_query },
149 ],
150 },
69989ea9 151 sqlbind => \[
0491b597 152 "(SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (
153 SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE title = ?
154 ) cd2
155 )",
0e773352 156 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'title' }
157 => 'Thriller'
828ceb09 158 ]
159 ],
69989ea9 160 },
161);
162
163
69989ea9 164for my $i (0 .. $#tests) {
165 my $t = $tests[$i];
166 for my $p (1, 2) { # repeat everything twice, make sure we do not clobber search arguments
167 is_same_sql_bind (
168 $t->{rs}->search ($t->{search}, $t->{attrs})->as_query,
169 $t->{sqlbind},
170 sprintf 'Testcase %d, pass %d', $i+1, $p,
171 );
172 }
8996a659 173}
a17640f1 174
175done_testing;