MSSQL through ODBC does not like unfinished statements - make sure we finish the...
[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
cbbd7939 25 is_same_sql_bind(
af6aac2d 26 $cdrs2->as_query,
f7160d10 27 "( 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 28 [],
29 );
30}
31
0a62f675 32{
7f51e1c8 33 my $rs = $art_rs->search(
34 {},
35 {
0a62f675 36 'select' => [
7f51e1c8 37 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
38 ],
0a62f675 39 },
40 );
41
0a62f675 42 is_same_sql_bind(
af6aac2d 43 $rs->as_query,
f7160d10 44 "( SELECT (SELECT id FROM cd me LIMIT 1) FROM artist me )",
0a62f675 45 [],
46 );
47}
48
49{
50 my $rs = $art_rs->search(
51 {},
52 {
53 '+select' => [
54 $cdrs->search({}, { rows => 1 })->get_column('id')->as_query,
7f51e1c8 55 ],
56 },
57 );
58
7f51e1c8 59 is_same_sql_bind(
af6aac2d 60 $rs->as_query,
f7160d10 61 "( SELECT me.artistid, me.name, me.rank, me.charfield, (SELECT id FROM cd me LIMIT 1) FROM artist me )",
7f51e1c8 62 [],
63 );
64}
65
d20198ab 66# simple from
67{
7f51e1c8 68 my $rs = $cdrs->search(
69 {},
70 {
71 alias => 'cd2',
72 from => [
73 { cd2 => $cdrs->search({ id => { '>' => 20 } })->as_query },
74 ],
75 },
76 );
77
7f51e1c8 78 is_same_sql_bind(
af6aac2d 79 $rs->as_query,
866557f9 80 "( 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 )",
81 [
82 [ 'id', 20 ]
83 ],
7f51e1c8 84 );
85}
86
a3c8d695 87# nested from
d20198ab 88{
a3c8d695 89 my $art_rs2 = $schema->resultset('Artist')->search({},
90 {
91 from => [ { 'me' => 'artist' },
92 [ { 'cds' => $cdrs->search({},{ 'select' => [\'me.artist as cds_artist' ]})->as_query },
93 { 'me.artistid' => 'cds_artist' } ] ]
94 });
95
a3c8d695 96 is_same_sql_bind(
af6aac2d 97 $art_rs2->as_query,
f7160d10 98 "( 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 99 );
100
101
102}
103
d20198ab 104# nested subquery in from
105{
106 my $rs = $cdrs->search(
107 {},
108 {
109 alias => 'cd2',
110 from => [
111 { cd2 => $cdrs->search(
112 { id => { '>' => 20 } },
113 {
114 alias => 'cd3',
115 from => [
116 { cd3 => $cdrs->search( { id => { '<' => 40 } } )->as_query }
117 ],
118 }, )->as_query },
119 ],
120 },
121 );
122
d20198ab 123 is_same_sql_bind(
af6aac2d 124 $rs->as_query,
f7160d10 125 "( SELECT cd2.cdid, cd2.artist, cd2.title, cd2.year, cd2.genreid, cd2.single_track
d20198ab 126 FROM
127 (SELECT cd3.cdid,cd3.artist,cd3.title,cd3.year,cd3.genreid,cd3.single_track
128 FROM
129 (SELECT me.cdid,me.artist,me.title,me.year,me.genreid,me.single_track
866557f9 130 FROM cd me WHERE id < ?) cd3
131 WHERE id > ?) cd2
f7160d10 132 )",
866557f9 133 [
134 [ 'id', 40 ],
135 [ 'id', 20 ]
136 ],
d20198ab 137 );
138
139}
140
496d9df9 141{
4fa7bc22 142 my $rs = $cdrs->search({
143 year => {
144 '=' => $cdrs->search(
145 { artistid => { '=' => \'me.artistid' } },
146 { alias => 'inner' }
147 )->get_column('year')->max_rs->as_query,
148 },
149 });
af6aac2d 150
4fa7bc22 151 is_same_sql_bind(
af6aac2d 152 $rs->as_query,
f7160d10 153 "( 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 154 [],
155 );
156}
157
8996a659 158{
159 my $rs = $cdrs->search(
160 {},
161 {
162 alias => 'cd2',
163 from => [
164 { cd2 => $cdrs->search({ title => 'Thriller' })->as_query },
165 ],
166 },
167 );
168
8996a659 169 is_same_sql_bind(
af6aac2d 170 $rs->as_query,
27051402 171 "(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 172 [
173 [ 'title',
174 'Thriller'
175 ]
176 ],
8996a659 177 );
178}