Kill leaktest on smokers with 1.3xx Test::More alphas
[dbsrgits/DBIx-Class.git] / t / sqlmaker / limit_dialects / rownum.t
CommitLineData
327368bc 1use strict;
2use warnings;
3
4use Test::More;
5
6use lib qw(t/lib);
a5a7bb73 7use DBICTest ':DiffSQL';
fcb7fcbb 8use DBIx::Class::SQLMaker::LimitDialects;
9
cccd1876 10my ($TOTAL, $OFFSET, $ROWS) = (
fcb7fcbb 11 DBIx::Class::SQLMaker::LimitDialects->__total_bindtype,
12 DBIx::Class::SQLMaker::LimitDialects->__offset_bindtype,
cccd1876 13 DBIx::Class::SQLMaker::LimitDialects->__rows_bindtype,
fcb7fcbb 14);
327368bc 15
16my $s = DBICTest->init_schema (no_deploy => 1, );
17$s->storage->sql_maker->limit_dialect ('RowNum');
18
8b31f62e 19my $rs = $s->resultset ('CD')->search({ id => 1 });
20
95e41036 21# important for a test below, never traversed
22$rs->result_source->add_relationship(
23 ends_with_me => 'DBICTest::Schema::Artist', sub {}
24);
25
26
8b31f62e 27my $where_bind = [ { dbic_colname => 'id' }, 1 ];
327368bc 28
6a6394f1 29for my $test_set (
30 {
31 name => 'Rownum subsel aliasing works correctly',
32 rs => $rs->search_rs(undef, {
33 rows => 1,
34 offset => 3,
35 columns => [
36 { id => 'foo.id' },
95e41036 37 { 'artist.id' => 'bar.id' },
6a6394f1 38 { bleh => \'TO_CHAR (foo.womble, "blah")' },
39 ]
40 }),
41 sql => '(
95e41036 42 SELECT id, artist__id, bleh
327368bc 43 FROM (
b775fa8e 44 SELECT id, artist__id, bleh, ROWNUM AS rownum__index
6a6394f1 45 FROM (
95e41036 46 SELECT foo.id AS id, bar.id AS artist__id, TO_CHAR (foo.womble, "blah") AS bleh
8b31f62e 47 FROM cd me
48 WHERE id = ?
6a6394f1 49 ) me
50 ) me WHERE rownum__index BETWEEN ? AND ?
51 )',
52 binds => [
8b31f62e 53 $where_bind,
6a6394f1 54 [ $OFFSET => 4 ],
55 [ $TOTAL => 4 ],
56 ],
57 }, {
58 name => 'Rownum subsel aliasing works correctly with unique order_by',
59 rs => $rs->search_rs(undef, {
60 rows => 1,
61 offset => 3,
62 columns => [
63 { id => 'foo.id' },
95e41036 64 { 'artist.id' => 'bar.id' },
6a6394f1 65 { bleh => \'TO_CHAR (foo.womble, "blah")' },
66 ],
67 order_by => [qw( artist title )],
68 }),
69 sql => '(
95e41036 70 SELECT id, artist__id, bleh
6a6394f1 71 FROM (
b775fa8e 72 SELECT id, artist__id, bleh, ROWNUM AS rownum__index
6a6394f1 73 FROM (
95e41036 74 SELECT foo.id AS id, bar.id AS artist__id, TO_CHAR(foo.womble, "blah") AS bleh
8b31f62e 75 FROM cd me
76 WHERE id = ?
6a6394f1 77 ORDER BY artist, title
78 ) me
fcb7fcbb 79 WHERE ROWNUM <= ?
327368bc 80 ) me
6a6394f1 81 WHERE rownum__index >= ?
82 )',
83 binds => [
8b31f62e 84 $where_bind,
6a6394f1 85 [ $TOTAL => 4 ],
86 [ $OFFSET => 4 ],
87 ],
7cec4356 88 },
89 {
90 name => 'Rownum subsel aliasing works correctly with non-unique order_by',
91 rs => $rs->search_rs(undef, {
92 rows => 1,
93 offset => 3,
94 columns => [
95 { id => 'foo.id' },
95e41036 96 { 'artist.id' => 'bar.id' },
7cec4356 97 { bleh => \'TO_CHAR (foo.womble, "blah")' },
98 ],
99 order_by => 'artist',
100 }),
101 sql => '(
95e41036 102 SELECT id, artist__id, bleh
7cec4356 103 FROM (
b775fa8e 104 SELECT id, artist__id, bleh, ROWNUM AS rownum__index
7cec4356 105 FROM (
95e41036 106 SELECT foo.id AS id, bar.id AS artist__id, TO_CHAR(foo.womble, "blah") AS bleh
7cec4356 107 FROM cd me
108 WHERE id = ?
109 ORDER BY artist
110 ) me
111 ) me
112 WHERE rownum__index BETWEEN ? and ?
113 )',
114 binds => [
115 $where_bind,
116 [ $OFFSET => 4 ],
117 [ $TOTAL => 4 ],
118 ],
6a6394f1 119 }, {
120 name => 'Rownum subsel aliasing #2 works correctly',
121 rs => $rs->search_rs(undef, {
122 rows => 2,
123 offset => 3,
124 columns => [
125 { id => 'foo.id' },
126 { 'ends_with_me.id' => 'ends_with_me.id' },
127 ]
128 }),
129 sql => '(
130 SELECT id, ends_with_me__id
f8583f8f 131 FROM (
b775fa8e 132 SELECT id, ends_with_me__id, ROWNUM AS rownum__index
6a6394f1 133 FROM (
134 SELECT foo.id AS id, ends_with_me.id AS ends_with_me__id
8b31f62e 135 FROM cd me
136 WHERE id = ?
6a6394f1 137 ) me
138 ) me WHERE rownum__index BETWEEN ? AND ?
139 )',
140 binds => [
8b31f62e 141 $where_bind,
6a6394f1 142 [ $OFFSET => 4 ],
143 [ $TOTAL => 5 ],
144 ],
145 }, {
146 name => 'Rownum subsel aliasing #2 works correctly with unique order_by',
147 rs => $rs->search_rs(undef, {
148 rows => 2,
149 offset => 3,
150 columns => [
151 { id => 'foo.id' },
152 { 'ends_with_me.id' => 'ends_with_me.id' },
153 ],
4e9fc3f3 154 order_by => [qw( year artist title )],
6a6394f1 155 }),
156 sql => '(
157 SELECT id, ends_with_me__id
158 FROM (
b775fa8e 159 SELECT id, ends_with_me__id, ROWNUM AS rownum__index
6a6394f1 160 FROM (
161 SELECT foo.id AS id, ends_with_me.id AS ends_with_me__id
8b31f62e 162 FROM cd me
163 WHERE id = ?
4e9fc3f3 164 ORDER BY year, artist, title
6a6394f1 165 ) me
fcb7fcbb 166 WHERE ROWNUM <= ?
f8583f8f 167 ) me
6a6394f1 168 WHERE rownum__index >= ?
169 )',
170 binds => [
8b31f62e 171 $where_bind,
6a6394f1 172 [ $TOTAL => 5 ],
173 [ $OFFSET => 4 ],
174 ],
175 }
176) {
177 is_same_sql_bind(
178 $test_set->{rs}->as_query,
179 $test_set->{sql},
180 $test_set->{binds},
181 $test_set->{name});
182}
f8583f8f 183
d7632687 184{
69d3c270 185my $subq = $s->resultset('Owners')->search({
186 'count.id' => { -ident => 'owner.id' },
187}, { alias => 'owner' })->count_rs;
188
189my $rs_selectas_rel = $s->resultset('BooksInLibrary')->search ({}, {
190 columns => [
191 { owner_name => 'owner.name' },
192 { owner_books => $subq->as_query },
193 ],
194 join => 'owner',
195 rows => 2,
196 offset => 3,
197});
198
199is_same_sql_bind(
200 $rs_selectas_rel->as_query,
201 '(
202 SELECT owner_name, owner_books
203 FROM (
b775fa8e 204 SELECT owner_name, owner_books, ROWNUM AS rownum__index
69d3c270 205 FROM (
206 SELECT owner.name AS owner_name,
207 ( SELECT COUNT( * ) FROM owners owner WHERE (count.id = owner.id)) AS owner_books
208 FROM books me
209 JOIN owners owner ON owner.id = me.owner
210 WHERE ( source = ? )
211 ) me
69d3c270 212 ) me
6a6394f1 213 WHERE rownum__index BETWEEN ? AND ?
69d3c270 214 )',
215 [
216 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' }
217 => 'Library' ],
69d3c270 218 [ $OFFSET => 4 ],
6a6394f1 219 [ $TOTAL => 5 ],
69d3c270 220 ],
221
222 'pagination with subquery works'
223);
224
225}
226
227{
d7632687 228 $rs = $s->resultset('Artist')->search({}, {
229 columns => 'name',
230 offset => 1,
231 order_by => 'name',
232 });
233 local $rs->result_source->{name} = "weird \n newline/multi \t \t space containing \n table";
234
235 like (
236 ${$rs->as_query}->[0],
237 qr| weird \s \n \s newline/multi \s \t \s \t \s space \s containing \s \n \s table|x,
238 'Newlines/spaces preserved in final sql',
239 );
240}
241
f74d22e2 242{
243my $subq = $s->resultset('Owners')->search({
244 'books.owner' => { -ident => 'owner.id' },
245}, { alias => 'owner', select => ['id'] } )->count_rs;
246
247my $rs_selectas_rel = $s->resultset('BooksInLibrary')->search( { -exists => $subq->as_query }, { select => ['id','owner'], rows => 1 } );
248
249is_same_sql_bind(
250 $rs_selectas_rel->as_query,
6a6394f1 251 '(
90ed89cb 252 SELECT me.id, me.owner FROM (
cccd1876 253 SELECT me.id, me.owner FROM books me WHERE ( ( (EXISTS (SELECT COUNT( * ) FROM owners owner WHERE ( books.owner = owner.id ))) AND source = ? ) )
254 ) me
255 WHERE ROWNUM <= ?
6a6394f1 256 )',
f74d22e2 257 [
258 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
cccd1876 259 [ $ROWS => 1 ],
f74d22e2 260 ],
261 'Pagination with sub-query in WHERE works'
262);
263
264}
265
327368bc 266done_testing;