mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-23908: Implement SELECT ... OFFSET ... FETCH ...
This commit implements the standard SQL extension OFFSET start { ROW | ROWS } [FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }] To achieve this a reserved keyword OFFSET is introduced. The general logic for WITH TIES implies: 1. The number of rows a query returns is no longer known during optimize phase. Adjust optimizations to no longer consider this. 2. During end_send make use of an "order Cached_item"to compare if the ORDER BY columns changed. Keep returning rows until there is a change. This happens only after we reached the row limit. 3. Within end_send_group, the order by clause was eliminated. It is still possible to keep the optimization of using end_send_group for producing the final result set.
This commit is contained in:
@@ -23,20 +23,23 @@
|
||||
class Select_limit_counters
|
||||
{
|
||||
ha_rows select_limit_cnt, offset_limit_cnt;
|
||||
bool with_ties;
|
||||
|
||||
public:
|
||||
Select_limit_counters():
|
||||
select_limit_cnt(0), offset_limit_cnt(0)
|
||||
select_limit_cnt(0), offset_limit_cnt(0), with_ties(false)
|
||||
{};
|
||||
Select_limit_counters(Select_limit_counters &orig):
|
||||
Select_limit_counters(const Select_limit_counters &orig):
|
||||
select_limit_cnt(orig.select_limit_cnt),
|
||||
offset_limit_cnt(orig.offset_limit_cnt)
|
||||
offset_limit_cnt(orig.offset_limit_cnt),
|
||||
with_ties(orig.with_ties)
|
||||
{};
|
||||
|
||||
void set_limit(ha_rows limit, ha_rows offset)
|
||||
void set_limit(ha_rows limit, ha_rows offset, bool with_ties_arg)
|
||||
{
|
||||
offset_limit_cnt= offset;
|
||||
select_limit_cnt= limit;
|
||||
with_ties= with_ties_arg;
|
||||
/*
|
||||
Guard against an overflow condition, where limit + offset exceede
|
||||
ha_rows value range. This case covers unreasonably large parameter
|
||||
@@ -53,6 +56,7 @@ class Select_limit_counters
|
||||
{
|
||||
offset_limit_cnt= 0;
|
||||
select_limit_cnt= 1;
|
||||
with_ties= false;
|
||||
}
|
||||
|
||||
bool is_unlimited() const
|
||||
@@ -67,7 +71,7 @@ class Select_limit_counters
|
||||
|
||||
/* Reset the limit entirely. */
|
||||
void clear()
|
||||
{ select_limit_cnt= HA_POS_ERROR; offset_limit_cnt= 0; }
|
||||
{ select_limit_cnt= HA_POS_ERROR; offset_limit_cnt= 0; with_ties= false;}
|
||||
|
||||
bool check_offset(ha_rows sent) const
|
||||
{
|
||||
@@ -79,6 +83,8 @@ class Select_limit_counters
|
||||
{ return select_limit_cnt; }
|
||||
ha_rows get_offset_limit() const
|
||||
{ return offset_limit_cnt; }
|
||||
bool is_with_ties() const
|
||||
{ return with_ties; }
|
||||
};
|
||||
|
||||
#endif // INCLUDES_MARIADB_SQL_LIMIT_H
|
||||
|
Reference in New Issue
Block a user