| 33635 | */ |
| 33636 | |
| 33637 | uint get_index_for_order(ORDER *order, TABLE *table, SQL_SELECT *select, |
| 33638 | ha_rows limit, ha_rows *scanned_limit, |
| 33639 | bool *need_sort, bool *reverse) |
| 33640 | { |
| 33641 | if (!order) |
| 33642 | { |
| 33643 | *need_sort= FALSE; |
| 33644 | if (select && select->quick) |
| 33645 | return select->quick->index; // index or MAX_KEY, use quick select as is |
| 33646 | else |
| 33647 | return table->file->key_used_on_scan; // MAX_KEY or index for some engine |
| 33648 | } |
| 33649 | |
| 33650 | if (!is_simple_order(order)) // just to cut further expensive checks |
| 33651 | { |
| 33652 | *need_sort= TRUE; |
| 33653 | return MAX_KEY; |
| 33654 | } |
| 33655 | |
| 33656 | if (select && select->quick) |
| 33657 | { |
| 33658 | if (select->quick->index == MAX_KEY) |
| 33659 | { |
| 33660 | *need_sort= TRUE; |
| 33661 | return MAX_KEY; |
| 33662 | } |
| 33663 | |
| 33664 | uint used_key_parts; |
| 33665 | switch (test_if_order_by_key(NULL, order, table, select->quick->index, |
| 33666 | &used_key_parts)) { |
| 33667 | case 1: // desired order |
| 33668 | *need_sort= FALSE; |
| 33669 | *scanned_limit= MY_MIN(limit, select->quick->records); |
| 33670 | return select->quick->index; |
| 33671 | case 0: // unacceptable order |
| 33672 | *need_sort= TRUE; |
| 33673 | return MAX_KEY; |
| 33674 | case -1: // desired order, but opposite direction |
| 33675 | { |
| 33676 | QUICK_SELECT_I *reverse_quick; |
| 33677 | if ((reverse_quick= |
| 33678 | select->quick->make_reverse(used_key_parts))) |
| 33679 | { |
| 33680 | select->set_quick(reverse_quick); |
| 33681 | *need_sort= FALSE; |
| 33682 | *scanned_limit= MY_MIN(limit, select->quick->records); |
| 33683 | return select->quick->index; |
| 33684 | } |
| 33685 | else |
| 33686 | { |
| 33687 | *need_sort= TRUE; |
| 33688 | return MAX_KEY; |
| 33689 | } |
| 33690 | } |
| 33691 | } |
| 33692 | DBUG_ASSERT(0); |
| 33693 | } |
| 33694 | else if (limit != HA_POS_ERROR) |
no test coverage detected