Massive rewrite of bind handling, and overall simplification of ::Storage::DBI
[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;
7 use DBIC::SqlMakerTest;
8
9 my $schema = DBICTest->init_schema;
10
11 $schema->storage->_sql_maker->limit_dialect ('RowNumberOver');
12
13 my $rs_selectas_col = $schema->resultset ('BooksInLibrary')->search ({}, {
14   '+select' => ['owner.name'],
15   '+as' => ['owner.name'],
16   join => 'owner',
17   rows => 1,
18 });
19
20 is_same_sql_bind(
21   $rs_selectas_col->as_query,
22   '(
23     SELECT  id, source, owner, title, price,
24             owner__name
25       FROM (
26         SELECT  id, source, owner, title, price,
27                 owner__name,
28                 ROW_NUMBER() OVER( ) AS rno__row__index
29           FROM (
30             SELECT  me.id, me.source, me.owner, me.title, me.price,
31                     owner.name AS owner__name
32               FROM books me
33               JOIN owners owner ON owner.id = me.owner
34             WHERE ( source = ? )
35           ) me
36       ) me
37     WHERE rno__row__index BETWEEN 1 AND 1
38   )',
39   [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' }
40     => 'Library' ] ],
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 });
52
53 is_same_sql_bind(
54   $rs_selectas_rel->as_query,
55   '(
56     SELECT  [id], [source], [owner], [title], [price],
57             [owner_name]
58       FROM (
59         SELECT  [id], [source], [owner], [title], [price],
60                 [owner_name],
61                 ROW_NUMBER() OVER( ) AS [rno__row__index]
62           FROM (
63             SELECT  [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price],
64                     [owner].[name] AS [owner_name]
65               FROM [books] [me]
66               JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
67             WHERE ( [source] = ? )
68           ) [me]
69       ) [me]
70     WHERE [rno__row__index] BETWEEN 1 AND 1
71   )',
72   [ [ { sqlt_datatype => 'varchar', sqlt_size => 100, dbic_colname => 'source' }
73     => 'Library' ] ],
74 );
75
76 {
77   my $rs = $schema->resultset('Artist')->search({}, {
78     columns => 'name',
79     offset => 1,
80     order_by => 'name',
81   });
82   local $rs->result_source->{name} = "weird \n newline/multi \t \t space containing \n table";
83
84   like (
85     ${$rs->as_query}->[0],
86     qr| weird \s \n \s newline/multi \s \t \s \t \s space \s containing \s \n \s table|x,
87     'Newlines/spaces preserved in final sql',
88   );
89 }
90
91
92 done_testing;