Switch the main dev branch back to 'master'
[dbsrgits/DBIx-Class.git] / t / sqlmaker / limit_dialects / rno.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use lib qw(t/lib);
6 use DBICTest ':DiffSQL';
7 use DBIx::Class::SQLMaker::LimitDialects;
8
9 my ($TOTAL, $OFFSET) = (
10    DBIx::Class::SQLMaker::LimitDialects->__total_bindtype,
11    DBIx::Class::SQLMaker::LimitDialects->__offset_bindtype,
12 );
13
14 my $schema = DBICTest->init_schema;
15
16 $schema->storage->_sql_maker->limit_dialect ('RowNumberOver');
17
18 my $rs_selectas_col = $schema->resultset ('BooksInLibrary')->search ({}, {
19   '+select' => ['owner.name'],
20   '+as' => ['owner.name'],
21   join => 'owner',
22   rows => 1,
23 });
24
25 is_same_sql_bind(
26   $rs_selectas_col->as_query,
27   '(
28     SELECT  me.id, me.source, me.owner, me.title, me.price,
29             owner__name
30       FROM (
31         SELECT  me.id, me.source, me.owner, me.title, me.price,
32                 owner__name,
33                 ROW_NUMBER() OVER( ) AS rno__row__index
34           FROM (
35             SELECT  me.id, me.source, me.owner, me.title, me.price,
36                     owner.name AS owner__name
37               FROM books me
38               JOIN owners owner ON owner.id = me.owner
39             WHERE ( source = ? )
40           ) me
41       ) me
42     WHERE rno__row__index >= ? AND rno__row__index <= ?
43   )',
44   [
45     [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
46     [ $OFFSET => 1 ],
47     [ $TOTAL => 1 ],
48   ],
49 );
50
51 $schema->storage->_sql_maker->quote_char ([qw/ [ ] /]);
52 $schema->storage->_sql_maker->name_sep ('.');
53
54 my $rs_selectas_rel = $schema->resultset ('BooksInLibrary')->search ({}, {
55   '+select' => ['owner.name'],
56   '+as' => ['owner_name'],
57   join => 'owner',
58   rows => 1,
59 });
60
61 is_same_sql_bind(
62   $rs_selectas_rel->as_query,
63   '(
64     SELECT  [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price],
65             [owner_name]
66       FROM (
67         SELECT  [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price],
68                 [owner_name],
69                 ROW_NUMBER() OVER( ) AS [rno__row__index]
70           FROM (
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]
78     WHERE [rno__row__index] >= ? AND [rno__row__index] <= ?
79   )',
80   [
81     [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
82     [ $OFFSET => 1 ],
83     [ $TOTAL => 1 ],
84   ],
85 );
86
87 {
88 my $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
93 my $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,
100   order_by => 'me.id',
101 });
102
103 is_same_sql_bind(
104   $rs_selectas_rel->as_query,
105   '(
106     SELECT [owner_name], [owner_books]
107       FROM (
108         SELECT [owner_name], [owner_books], ROW_NUMBER() OVER( ORDER BY [ORDER__BY__001] ) AS [rno__row__index]
109           FROM (
110             SELECT  [owner].[name] AS [owner_name],
111               ( SELECT COUNT( * ) FROM [owners] [owner]
112                 WHERE [count].[id] = [owner].[id] and [count].[name] = ? ) AS [owner_books],
113               [me].[id] AS [ORDER__BY__001]
114                 FROM [books] [me]
115                 JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
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 }{
130 my $subq = $schema->resultset('Owners')->search({
131    'count.id' => { -ident => 'owner.id' },
132 }, { alias => 'owner' })->count_rs;
133
134 my $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
143 is_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 {
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
184 {
185 my $subq = $schema->resultset('Owners')->search({
186    'books.owner' => { -ident => 'owner.id' },
187 }, { alias => 'owner', select => ['id'] } )->count_rs;
188
189 my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search( { -exists => $subq->as_query }, { select => ['id','owner'], rows => 1 } );
190
191 is_same_sql_bind(
192   $rs_selectas_rel->as_query,
193   '(
194  SELECT [me].[id], [me].[owner] FROM (
195    SELECT [me].[id], [me].[owner], ROW_NUMBER() OVER(  ) AS [rno__row__index] FROM (
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
214
215 done_testing;