1 package Data::Query::Renderer::SQL::Slice::RowNum;
3 use Data::Query::ExprHelpers;
6 with 'Data::Query::Renderer::SQL::Slice::SubqueryRemap';
9 (limit => 1, offset => 1);
18 die "Slice's inner is not a Select"
19 unless is_Select my $orig_select = $dq->{from};
20 my %remapped = $self->_subquery_remap_select($orig_select);
21 my $inside_select = Alias(
22 $remapped{default_inside_alias},
23 Select($remapped{inside_select_list}, $orig_select->{from}),
25 unless ($dq->{offset}) {
28 $remapped{outside_select_list},
31 { 'SQL.Naive' => '<=' },
33 Literal(SQL => 'ROWNUM'),
42 my ($limit_plus_offset, $offset_plus) = (
43 { %{$dq->{limit}}, value => $dq->{limit}{value}+$dq->{offset}{value} },
44 { %{$dq->{limit}}, value => $dq->{offset}{value}+1 }
47 my $rownum_name = 'rownum__index';
49 if ($dq->{order_is_stable}) {
52 $remapped{outside_select_list},
55 { 'SQL.Naive' => '>=' },
56 [ Identifier($rownum_name), $offset_plus ]
59 $remapped{default_inside_alias},
61 [ @{$remapped{outside_select_list}},
62 Alias($rownum_name, Literal(SQL => 'ROWNUM')) ],
65 { 'SQL.Naive' => '<=' },
66 [ Literal(SQL => 'ROWNUM'), $limit_plus_offset ]
78 $remapped{outside_select_list},
81 { 'SQL.Naive' => 'BETWEEN' },
82 [ Identifier($rownum_name), $offset_plus, $limit_plus_offset ]
85 $remapped{default_inside_alias},
87 [ @{$remapped{outside_select_list}},
88 Alias($rownum_name, Literal(SQL => 'ROWNUM')) ],