fix old test using new bind vars (no more interpolating)
[dbsrgits/DBIx-Class.git] / t / search / subquery.t
CommitLineData
cbbd7939 1#!/usr/bin/perl
2
3use strict;
4use warnings FATAL => 'all';
5
6use Data::Dumper;
7
8use Test::More;
d0a3e4e2 9
27051402 10plan ( tests => 8 );
d0a3e4e2 11
cbbd7939 12use lib qw(t/lib);
13use DBICTest;
14use DBIC::SqlMakerTest;
15
cbbd7939 16my $schema = DBICTest->init_schema();
17my $art_rs = $schema->resultset('Artist');
18my $cdrs = $schema->resultset('CD');
19
20{
21 my $cdrs2 = $cdrs->search({
22 artist_id => { 'in' => $art_rs->search({}, { rows => 1 })->get_column( 'id' )->as_query },
23 });
24
25 my $arr = $cdrs2->as_query;
26 my ($query, @bind) = @{$$arr};
27 is_same_sql_bind(
28 $query, \@bind,
f7160d10 29 "( SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE artist_id IN ( SELECT id FROM artist me LIMIT 1 ) )",
cbbd7939 30 [],
31 );
32}
33
0a62f675 34{
7f51e1c8 35 my $rs = $art_rs->search(
36 {},
37 {
0a62f675 38 'select' => [
7f51e1c8 39 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
40 ],
0a62f675 41 },
42 );
43
44 my $arr = $rs->as_query;
45 my ($query, @bind) = @{$$arr};
46 is_same_sql_bind(
47 $query, \@bind,
f7160d10 48 "( SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me )",
0a62f675 49 [],
50 );
51}
52
53{
54 my $rs = $art_rs->search(
55 {},
56 {
57 '+select' => [
58 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
7f51e1c8 59 ],
60 },
61 );
62
63 my $arr = $rs->as_query;
64 my ($query, @bind) = @{$$arr};
7f51e1c8 65 is_same_sql_bind(
66 $query, \@bind,
f7160d10 67 "( SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me )",
7f51e1c8 68 [],
69 );
70}
71
d20198ab 72# simple from
73{
7f51e1c8 74 my $rs = $cdrs->search(
75 {},
76 {
77 alias => 'cd2',
78 from => [
79 { cd2 => $cdrs->search({ id => { '>' => 20 } })->as_query },
80 ],
81 },
82 );
83
84 my $arr = $rs->as_query;
85 my ($query, @bind) = @{$$arr};
86 is_same_sql_bind(
87 $query, \@bind,
866557f9 88 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE id > ?) cd2 )",
89 [
90 [ 'id', 20 ]
91 ],
7f51e1c8 92 );
93}
94
a3c8d695 95# nested from
d20198ab 96{
a3c8d695 97 my $art_rs2 = $schema->resultset('Artist')->search({},
98 {
99 from => [ { 'me' => 'artist' },
100 [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
101 { 'me.artistid' => 'cds_artist' } ] ]
102 });
103
104 my $arr = $art_rs2->as_query;
105 my ($query, @bind) = @{$$arr};
106 is_same_sql_bind(
107 $query, \@bind,
f7160d10 108 "( 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 )", []
a3c8d695 109 );
110
111
112}
113
d20198ab 114# nested subquery in from
115{
116 my $rs = $cdrs->search(
117 {},
118 {
119 alias => 'cd2',
120 from => [
121 { cd2 => $cdrs->search(
122 { id => { '>' => 20 } },
123 {
124 alias => 'cd3',
125 from => [
126 { cd3 => $cdrs->search( { id => { '<' => 40 } } )->as_query }
127 ],
128 }, )->as_query },
129 ],
130 },
131 );
132
133 my $arr = $rs->as_query;
134 my ($query, @bind) = @{$$arr};
135 is_same_sql_bind(
136 $query, \@bind,
f7160d10 137 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track
d20198ab 138 FROM
139 (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track
140 FROM
141 (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track
866557f9 142 FROM cd me WHERE id < ?) cd3
143 WHERE id > ?) cd2
f7160d10 144 )",
866557f9 145 [
146 [ 'id', 40 ],
147 [ 'id', 20 ]
148 ],
d20198ab 149 );
150
151}
152
496d9df9 153{
4fa7bc22 154 my $rs = $cdrs->search({
155 year => {
156 '=' => $cdrs->search(
157 { artistid => { '=' => \'me.artistid' } },
158 { alias => 'inner' }
159 )->get_column('year')->max_rs->as_query,
160 },
161 });
162 my $arr = $rs->as_query;
163 my ($query, @bind) = @{$$arr};
164 is_same_sql_bind(
165 $query, \@bind,
f7160d10 166 "( 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) )",
4fa7bc22 167 [],
168 );
169}
170
8996a659 171{
172 my $rs = $cdrs->search(
173 {},
174 {
175 alias => 'cd2',
176 from => [
177 { cd2 => $cdrs->search({ title => 'Thriller' })->as_query },
178 ],
179 },
180 );
181
182 my $arr = $rs->as_query;
183 my ($query, @bind) = @{$$arr};
184 is_same_sql_bind(
185 $query, \@bind,
27051402 186 "(SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track FROM (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track FROM cd me WHERE title = ?) cd2)",
828ceb09 187 [
188 [ 'title',
189 'Thriller'
190 ]
191 ],
8996a659 192 );
193}
194
cbbd7939 195__END__