vibesql-executor 0.2.0

Query execution engine for vibesql SQL database
Documentation
//! Index-based ORDER BY optimization
//!
//! NOTE: This module currently returns None (disabled) because the optimization
//! cannot work correctly at this level. Index-based ORDER BY optimization must
//! happen at the SCAN level, not after WHERE filtering.
//!
//! See #1754 for the proper architectural redesign.

use vibesql_storage::database::Database;

use crate::{
    errors::ExecutorError,
    schema::CombinedSchema,
    select::order::RowWithSortKeys,
};

/// Try to use an index for ORDER BY optimization
/// Returns ordered rows if an index can be used, None otherwise
pub(in crate::select::executor) fn try_index_based_ordering(
    _database: &Database,
    _rows: &[RowWithSortKeys],
    _order_by: &[vibesql_ast::OrderByItem],
    _schema: &CombinedSchema,
    _from_clause: &Option<vibesql_ast::FromClause>,
    _select_list: &[vibesql_ast::SelectItem],
) -> Result<Option<Vec<RowWithSortKeys>>, ExecutorError> {
    // SIMPLIFIED FIX FOR #1806:
    // Previous implementation tried to use full-table index data to order filtered rows.
    // This is fundamentally flawed because:
    // 1. Index data is for the ENTIRE table
    // 2. This function receives FILTERED rows (post-WHERE)
    // 3. Sorting full-table index keys doesn't give correct order for filtered subset
    //
    // The correct approach: Just sort the filtered rows directly using their ORDER BY values.
    // No need to touch index data structures at all.
    //
    // Future work (#1754): Move index optimization to SCAN phase where it belongs.

    // This function is called AFTER WHERE filtering, so it receives filtered rows.
    // The previous buggy implementation tried to use full-table index data to order
    // these filtered rows, which is fundamentally incorrect.
    //
    // The correct place for index-based ORDER BY optimization is at the SCAN level,
    // not after filtering. See #1754 for the architectural redesign.
    //
    // For now, return None to fall back to apply_order_by(), which correctly sorts
    // the filtered rows.
    Ok(None)
}

// NOTE: All helper functions removed as they are no longer needed.
// The previous complex implementation has been replaced with a simple return None.
// Future work: Implement proper index-based ORDER BY at the scan level (#1754).