mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-23 17:05:36 +01:00
Fix not advancing the cell index of pages
This commit is contained in:
@@ -29,6 +29,7 @@ pub enum SeekOp {
|
||||
GE,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct MemPage {
|
||||
parent: Option<Rc<MemPage>>,
|
||||
page_idx: usize,
|
||||
@@ -249,17 +250,18 @@ impl BTreeCursor {
|
||||
let page = page.as_ref().unwrap();
|
||||
|
||||
for cell_idx in 0..page.cell_count() {
|
||||
match &page.cell_get(
|
||||
let cell = page.cell_get(
|
||||
cell_idx,
|
||||
self.pager.clone(),
|
||||
self.max_local(page.page_type()),
|
||||
self.min_local(page.page_type()),
|
||||
self.usable_space(),
|
||||
)? {
|
||||
)?;
|
||||
match &cell {
|
||||
BTreeCell::TableLeafCell(TableLeafCell {
|
||||
_rowid: cell_rowid,
|
||||
_payload: payload,
|
||||
first_overflow_page: _,
|
||||
first_overflow_page: fop,
|
||||
}) => {
|
||||
mem_page.advance();
|
||||
let comparison = match op {
|
||||
@@ -346,23 +348,24 @@ impl BTreeCursor {
|
||||
|
||||
let mut found_cell = false;
|
||||
for cell_idx in 0..page.cell_count() {
|
||||
match &page.cell_get(
|
||||
let cell = page.cell_get(
|
||||
cell_idx,
|
||||
self.pager.clone(),
|
||||
self.max_local(page.page_type()),
|
||||
self.min_local(page.page_type()),
|
||||
self.usable_space(),
|
||||
)? {
|
||||
)?;
|
||||
match &cell {
|
||||
BTreeCell::TableInteriorCell(TableInteriorCell {
|
||||
_left_child_page,
|
||||
_rowid,
|
||||
}) => {
|
||||
mem_page.advance();
|
||||
let comparison = match cmp {
|
||||
SeekOp::GT => *_rowid > rowid,
|
||||
SeekOp::GE => *_rowid >= rowid,
|
||||
};
|
||||
if comparison {
|
||||
mem_page.advance();
|
||||
let mem_page =
|
||||
MemPage::new(Some(mem_page.clone()), *_left_child_page as usize, 0);
|
||||
self.page.replace(Some(Rc::new(mem_page)));
|
||||
@@ -571,15 +574,13 @@ impl BTreeCursor {
|
||||
payload,
|
||||
..
|
||||
}) => {
|
||||
// get the logic for this from btree_index_seek
|
||||
|
||||
mem_page.advance();
|
||||
let record = crate::storage::sqlite3_ondisk::read_record(payload)?;
|
||||
let comparison = match cmp {
|
||||
SeekOp::GT => record > *key,
|
||||
SeekOp::GE => record >= *key,
|
||||
};
|
||||
if comparison {
|
||||
mem_page.advance();
|
||||
let mem_page =
|
||||
MemPage::new(Some(mem_page.clone()), *left_child_page as usize, 0);
|
||||
self.page.replace(Some(Rc::new(mem_page)));
|
||||
|
||||
@@ -92,24 +92,25 @@ do_execsql_test where-clause-no-table-constant-condition-false-7 {
|
||||
select 1 where 'hamburger';
|
||||
} {}
|
||||
|
||||
# this test functions as an assertion that the index on users.age is being used, since the results are ordered by age without an order by.
|
||||
do_execsql_test select-where-and {
|
||||
select first_name, age from users where first_name = 'Jamie' and age > 80
|
||||
} {Jamie|94
|
||||
} {Jamie|87
|
||||
Jamie|88
|
||||
Jamie|88
|
||||
Jamie|99
|
||||
Jamie|92
|
||||
Jamie|87
|
||||
Jamie|88
|
||||
Jamie|94
|
||||
Jamie|99
|
||||
}
|
||||
|
||||
do_execsql_test select-where-or {
|
||||
select first_name, age from users where first_name = 'Jamie' and age > 80
|
||||
} {Jamie|94
|
||||
} {Jamie|87
|
||||
Jamie|88
|
||||
Jamie|88
|
||||
Jamie|99
|
||||
Jamie|92
|
||||
Jamie|87
|
||||
Jamie|88
|
||||
Jamie|94
|
||||
Jamie|99
|
||||
}
|
||||
|
||||
do_execsql_test select-where-and-or {
|
||||
|
||||
Reference in New Issue
Block a user