Introduce GOVERNANCE document and empty RESOLUTIONS file.
[dbsrgits/DBIx-Class.git] / t / sqlmaker / limit_dialects / skip_first.t
1 BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8 use DBICTest ':DiffSQL';
9 use DBIx::Class::SQLMaker::LimitDialects;
10
11 my ($LIMIT, $OFFSET) = (
12    DBIx::Class::SQLMaker::LimitDialects->__rows_bindtype,
13    DBIx::Class::SQLMaker::LimitDialects->__offset_bindtype,
14 );
15
16 my $schema = DBICTest->init_schema;
17
18 $schema->storage->_sql_maker->limit_dialect ('SkipFirst');
19
20 my $rs_selectas_col = $schema->resultset ('BooksInLibrary')->search ({}, {
21   '+select' => ['owner.name'],
22   '+as' => ['owner.name'],
23   join => 'owner',
24   rows => 1,
25   offset => 2,
26 });
27
28 is_same_sql_bind(
29   $rs_selectas_col->as_query,
30   '(
31     SELECT SKIP ? FIRST ? me.id, me.source, me.owner, me.title, me.price, owner.name
32       FROM books me
33       JOIN owners owner ON owner.id = me.owner
34     WHERE ( source = ? )
35   )',
36   [
37     [ $OFFSET => 2 ],
38     [ $LIMIT => 1 ],
39     [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
40   ],
41 );
42
43 $schema->storage->_sql_maker->quote_char ([qw/ [ ] /]);
44 $schema->storage->_sql_maker->name_sep ('.');
45
46 my $rs_selectas_rel = $schema->resultset ('BooksInLibrary')->search ({}, {
47   '+select' => ['owner.name'],
48   '+as' => ['owner_name'],
49   join => 'owner',
50   rows => 1,
51   offset => 2,
52 });
53
54 is_same_sql_bind(
55   $rs_selectas_rel->as_query,
56   '(
57     SELECT SKIP ? FIRST ? [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price], [owner].[name]
58       FROM [books] [me]
59       JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
60     WHERE ( [source] = ? )
61   )',
62   [
63     [ $OFFSET => 2 ],
64     [ $LIMIT => 1 ],
65     [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
66   ],
67 );
68
69 {
70 my $subq = $schema->resultset('Owners')->search({
71    'count.id' => { -ident => 'owner.id' },
72    'count.name' => 'fail', # no one would do this in real life, the rows makes even less sense
73 }, { alias => 'owner', rows => 1 })->count_rs;
74
75 my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search ({}, {
76   columns => [
77      { owner_name => 'owner.name' },
78      { owner_books => $subq->as_query },
79   ],
80   join => 'owner',
81   rows => 1,
82   offset => 2,
83 });
84
85 is_same_sql_bind(
86   $rs_selectas_rel->as_query,
87   '(
88     SELECT SKIP ? FIRST ?
89         [owner].[name],
90         ( SELECT COUNT(*) FROM
91           ( SELECT FIRST ? [owner].[id] FROM [owners] [owner]
92             WHERE [count].[id] = [owner].[id] and [count].[name] = ?
93           ) [owner]
94         )
95       FROM [books] [me]
96       JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
97     WHERE ( [source] = ? )
98   )',
99   [
100     [ $OFFSET => 2 ], # outer
101     [ $LIMIT => 1 ],  # outer
102     [ {%$LIMIT} => 1 ],  # inner
103     [ { dbic_colname => 'count.name' } => 'fail' ],
104     [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
105   ],
106 )
107 };
108
109 {
110   my $rs = $schema->resultset('Artist')->search({}, {
111     columns => 'name',
112     offset => 1,
113     order_by => 'name',
114   });
115   local $rs->result_source->{name} = "weird \n newline/multi \t \t space containing \n table";
116
117   like (
118     ${$rs->as_query}->[0],
119     qr| weird \s \n \s newline/multi \s \t \s \t \s space \s containing \s \n \s table|x,
120     'Newlines/spaces preserved in final sql',
121   );
122 }
123
124 {
125 my $subq = $schema->resultset('Owners')->search({
126    'books.owner' => { -ident => 'owner.id' },
127 }, { alias => 'owner', select => ['id'], offset => 3, rows => 4 });
128
129 my $rs_selectas_rel = $schema->resultset('BooksInLibrary')->search( { -exists => $subq->as_query }, { select => ['id','owner'], rows => 1, offset => 2 } );
130
131 is_same_sql_bind(
132   $rs_selectas_rel->as_query,
133   '(
134      SELECT SKIP ? FIRST ? [me].[id], [me].[owner]
135      FROM [books] [me]
136      WHERE ( ( (EXISTS (
137        SELECT SKIP ? FIRST ? [owner].[id] FROM [owners] [owner] WHERE ( [books].[owner] = [owner].[id] )
138      )) AND [source] = ? ) )
139  )',
140   [
141     [ $OFFSET => 2 ], #outer
142     [ $LIMIT => 1 ],  #outer
143     [ {%$OFFSET} => 3 ], #inner
144     [ {%$LIMIT} => 4 ],  #inner
145     [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' } => 'Library' ],
146   ],
147   'Pagination with sub-query in WHERE works'
148 );
149
150 }
151
152
153 done_testing;