Retire DBIC/SqlMakerTest.pm now that SQLA::Test provides the same function
[dbsrgits/DBIx-Class.git] / t / sqlmaker / limit_dialects / rno.t
CommitLineData
a5f843e3 1use strict;
2use warnings;
3
4use Test::More;
5use lib qw(t/lib);
a5a7bb73 6use DBICTest ':DiffSQL';
fcb7fcbb 7use DBIx::Class::SQLMaker::LimitDialects;
8
9my ($TOTAL, $OFFSET) = (
10 DBIx::Class::SQLMaker::LimitDialects->__total_bindtype,
11 DBIx::Class::SQLMaker::LimitDialects->__offset_bindtype,
12);
a5f843e3 13
14my $schema = DBICTest->init_schema;
15
a5f843e3 16$schema->storage->_sql_maker->limit_dialect ('RowNumberOver');
17
41eac664 18my $rs_selectas_col = $schema->resultset ('BooksInLibrary')->search ({}, {
19 '+select' => ['owner.name'],
20 '+as' => ['owner.name'],
21 join => 'owner',
22 rows => 1,
23});
a5f843e3 24
41eac664 25is_same_sql_bind(
26 $rs_selectas_col->as_query,
27 '(
90ed89cb 28 SELECT me.id, me.source, me.owner, me.title, me.price,
760545fa 29 owner__name
41eac664 30 FROM (
90ed89cb 31 SELECT me.id, me.source, me.owner, me.title, me.price,
760545fa 32 owner__name,
41eac664 33 ROW_NUMBER() OVER( ) AS rno__row__index
34 FROM (
35 SELECT me.id, me.source, me.owner, me.title, me.price,
760545fa 36 owner.name AS owner__name
41eac664 37 FROM books me
38 JOIN owners owner ON owner.id = me.owner
39 WHERE ( source = ? )
40 ) me
41 ) me
fcb7fcbb 42 WHERE rno__row__index >= ? AND rno__row__index <= ?
41eac664 43 )',
fcb7fcbb 44 [
45 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
46 [ $OFFSET => 1 ],
47 [ $TOTAL => 1 ],
48 ],
41eac664 49);
50
760545fa 51$schema->storage->_sql_maker->quote_char ([qw/ [ ] /]);
52$schema->storage->_sql_maker->name_sep ('.');
41eac664 53
54my $rs_selectas_rel = $schema->resultset ('BooksInLibrary')->search ({}, {
55 '+select' => ['owner.name'],
56 '+as' => ['owner_name'],
57 join => 'owner',
760545fa 58 rows => 1,
41eac664 59});
60
61is_same_sql_bind(
62 $rs_selectas_rel->as_query,
63 '(
90ed89cb 64 SELECT [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price],
760545fa 65 [owner_name]
41eac664 66 FROM (
90ed89cb 67 SELECT [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price],
760545fa 68 [owner_name],
69 ROW_NUMBER() OVER( ) AS [rno__row__index]
41eac664 70 FROM (
760545fa 71 SELECT [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price],
72 [owner].[name] AS [owner_name]
73 FROM [books] [me]
74 JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
75 WHERE ( [source] = ? )
76 ) [me]
77 ) [me]
fcb7fcbb 78 WHERE [rno__row__index] >= ? AND [rno__row__index] <= ?
41eac664 79 )',
fcb7fcbb 80 [
81 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
82 [ $OFFSET => 1 ],
83 [ $TOTAL => 1 ],
84 ],
41eac664 85);
a5f843e3 86
d7632687 87{
69d3c270 88my $subq = $schema->resultset('Owners')->search({
89 'count.id' => { -ident => 'owner.id' },
90 'count.name' => 'fail', # no one would do this in real life
91}, { alias => 'owner' })->count_rs;
92
93my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search ({}, {
94 columns => [
95 { owner_name => 'owner.name' },
96 { owner_books => $subq->as_query },
97 ],
98 join => 'owner',
99 rows => 1,
071dea12 100 order_by => 'me.id',
69d3c270 101});
102
103is_same_sql_bind(
104 $rs_selectas_rel->as_query,
105 '(
106 SELECT [owner_name], [owner_books]
107 FROM (
08a1eaad 108 SELECT [owner_name], [owner_books], ROW_NUMBER() OVER( ORDER BY [ORDER__BY__001] ) AS [rno__row__index]
69d3c270 109 FROM (
110 SELECT [owner].[name] AS [owner_name],
111 ( SELECT COUNT( * ) FROM [owners] [owner]
071dea12 112 WHERE [count].[id] = [owner].[id] and [count].[name] = ? ) AS [owner_books],
08a1eaad 113 [me].[id] AS [ORDER__BY__001]
071dea12 114 FROM [books] [me]
115 JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
69d3c270 116 WHERE ( [source] = ? )
117 ) [me]
118 ) [me]
119 WHERE [rno__row__index] >= ? AND [rno__row__index] <= ?
120 )',
121 [
122 [ { dbic_colname => 'count.name' } => 'fail' ],
123 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
124 [ $OFFSET => 1 ],
125 [ $TOTAL => 1 ],
126 ],
127);
128
129}{
130my $subq = $schema->resultset('Owners')->search({
131 'count.id' => { -ident => 'owner.id' },
132}, { alias => 'owner' })->count_rs;
133
134my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search ({}, {
135 columns => [
136 { owner_name => 'owner.name' },
137 { owner_books => $subq->as_query },
138 ],
139 join => 'owner',
140 rows => 1,
141});
142
143is_same_sql_bind(
144 $rs_selectas_rel->as_query,
145 '(
146 SELECT [owner_name], [owner_books]
147 FROM (
148 SELECT [owner_name], [owner_books], ROW_NUMBER() OVER( ) AS [rno__row__index]
149 FROM (
150 SELECT [owner].[name] AS [owner_name],
151 ( SELECT COUNT( * ) FROM [owners] [owner] WHERE [count].[id] = [owner].[id] ) AS [owner_books]
152 FROM [books] [me]
153 JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
154 WHERE ( [source] = ? )
155 ) [me]
156 ) [me]
157 WHERE [rno__row__index] >= ? AND [rno__row__index] <= ?
158 )',
159 [
160 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' }
161 => 'Library' ],
162 [ $OFFSET => 1 ],
163 [ $TOTAL => 1 ],
164 ],
165);
166
167}
168
169{
d7632687 170 my $rs = $schema->resultset('Artist')->search({}, {
171 columns => 'name',
172 offset => 1,
173 order_by => 'name',
174 });
175 local $rs->result_source->{name} = "weird \n newline/multi \t \t space containing \n table";
176
177 like (
178 ${$rs->as_query}->[0],
179 qr| weird \s \n \s newline/multi \s \t \s \t \s space \s containing \s \n \s table|x,
180 'Newlines/spaces preserved in final sql',
181 );
182}
183
f74d22e2 184{
185my $subq = $schema->resultset('Owners')->search({
186 'books.owner' => { -ident => 'owner.id' },
187}, { alias => 'owner', select => ['id'] } )->count_rs;
188
189my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search( { -exists => $subq->as_query }, { select => ['id','owner'], rows => 1 } );
190
191is_same_sql_bind(
192 $rs_selectas_rel->as_query,
193 '(
90ed89cb 194 SELECT [me].[id], [me].[owner] FROM (
195 SELECT [me].[id], [me].[owner], ROW_NUMBER() OVER( ) AS [rno__row__index] FROM (
f74d22e2 196 SELECT [me].[id], [me].[owner]
197 FROM [books] [me]
198 WHERE ( ( (EXISTS (
199 SELECT COUNT( * ) FROM [owners] [owner] WHERE ( [books].[owner] = [owner].[id] )
200 )) AND [source] = ? ) )
201 ) [me]
202 ) [me] WHERE [rno__row__index] >= ? AND [rno__row__index] <= ?
203 )',
204 [
205 [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
206 [ $OFFSET => 1 ],
207 [ $TOTAL => 1 ],
208 ],
209 'Pagination with sub-query in WHERE works'
210);
211
212}
213
d7632687 214
a5f843e3 215done_testing;