@@ -622,13 +622,20 @@ impl RewriteRule for IxScanEq2Col {
622622 . indexes
623623 . iter ( )
624624 . filter ( |idx| idx. index_algorithm . columns ( ) . len ( ) == 2 ) // TODO: Support prefix scans
625- . find_map ( |idx| {
625+ . map ( |idx| ( idx. index_id , idx. index_algorithm . columns ( ) ) )
626+ . find_map ( |( index_id, columns) | {
627+ let mut columns = columns. iter ( ) ;
628+ let x = columns. next ( ) ?;
629+ if x. idx ( ) != u. field_pos {
630+ return None ;
631+ }
632+ let y = columns. next ( ) ?;
633+ if y. idx ( ) != v. field_pos {
634+ return None ;
635+ }
626636 Some ( IxScanInfo {
627- index_id : idx. index_id ,
628- cols : vec ! [
629- ( i, idx. index_algorithm. find_col_index( u. field_pos) ?) ,
630- ( j, idx. index_algorithm. find_col_index( v. field_pos) ?) ,
631- ] ,
637+ index_id,
638+ cols : vec ! [ ( i, x) , ( j, y) ] ,
632639 } )
633640 } )
634641 {
@@ -795,14 +802,24 @@ impl RewriteRule for IxScanEq3Col {
795802 . indexes
796803 . iter ( )
797804 . filter ( |idx| idx. index_algorithm . columns ( ) . len ( ) == 3 )
798- . find_map ( |idx| {
805+ . map ( |idx| ( idx. index_id , idx. index_algorithm . columns ( ) ) )
806+ . find_map ( |( index_id, columns) | {
807+ let mut columns = columns. iter ( ) ;
808+ let x = columns. next ( ) ?;
809+ if x. idx ( ) != u. field_pos {
810+ return None ;
811+ }
812+ let y = columns. next ( ) ?;
813+ if y. idx ( ) != v. field_pos {
814+ return None ;
815+ }
816+ let z = columns. next ( ) ?;
817+ if z. idx ( ) != w. field_pos {
818+ return None ;
819+ }
799820 Some ( IxScanInfo {
800- index_id : idx. index_id ,
801- cols : vec ! [
802- ( i, idx. index_algorithm. find_col_index( u. field_pos) ?) ,
803- ( j, idx. index_algorithm. find_col_index( v. field_pos) ?) ,
804- ( k, idx. index_algorithm. find_col_index( w. field_pos) ?) ,
805- ] ,
821+ index_id,
822+ cols : vec ! [ ( i, x) , ( j, y) , ( k, z) ] ,
806823 } )
807824 } )
808825 {
0 commit comments