1 package Data::Query::Renderer::SQL::Slice::RowNum;
3 use Data::Query::ExprHelpers;
6 with 'Data::Query::Renderer::SQL::Slice::SubqueryRemap';
14 die "Slice's inner is not a Select"
15 unless is_Select my $orig_select = $dq->{from};
16 my %remapped = $self->_subquery_remap_select($orig_select);
17 my $inside_select = Alias(
18 $remapped{default_inside_alias},
19 Select($remapped{inside_select_list}, $orig_select->{from}),
21 unless ($dq->{offset}) {
24 $remapped{outside_select_list},
27 { 'SQL.Naive' => '<=' },
29 Literal(SQL => 'ROWNUM'),
38 my ($limit_plus_offset, $offset_plus) = (
39 { %{$dq->{limit}}, value => $dq->{limit}{value}+$dq->{offset}{value} },
40 { %{$dq->{limit}}, value => $dq->{offset}{value}+1 }
43 my $rownum_name = 'rownum__index';
45 if ($dq->{order_is_stable}) {
48 $remapped{outside_select_list},
51 { 'SQL.Naive' => '>=' },
52 [ Identifier($rownum_name), $offset_plus ]
55 $remapped{default_inside_alias},
57 [ @{$remapped{outside_select_list}},
58 Alias($rownum_name, Literal(SQL => 'ROWNUM')) ],
61 { 'SQL.Naive' => '<=' },
62 [ Literal(SQL => 'ROWNUM'), $limit_plus_offset ]
74 $remapped{outside_select_list},
77 { 'SQL.Naive' => 'BETWEEN' },
78 [ Identifier($rownum_name), $offset_plus, $limit_plus_offset ]
81 $remapped{default_inside_alias},
83 [ @{$remapped{outside_select_list}},
84 Alias($rownum_name, Literal(SQL => 'ROWNUM')) ],