@ -6202,6 +6202,56 @@ void rr_unlock_row(st_join_table *tab)
/**
Pick the appropriate access method functions
Sets the functions for the selected table access method
@ param tab Table reference to put access method
*/
static void
pick_table_access_method ( JOIN_TAB * tab )
{
switch ( tab - > type )
{
case JT_REF :
tab - > read_first_record = join_read_always_key ;
tab - > read_record . read_record = join_read_next_same ;
break ;
case JT_REF_OR_NULL :
tab - > read_first_record = join_read_always_key_or_null ;
tab - > read_record . read_record = join_read_next_same_or_null ;
break ;
case JT_CONST :
tab - > read_first_record = join_read_const ;
tab - > read_record . read_record = join_no_more_records ;
break ;
case JT_EQ_REF :
tab - > read_first_record = join_read_key ;
tab - > read_record . read_record = join_no_more_records ;
break ;
case JT_FT :
tab - > read_first_record = join_ft_read_first ;
tab - > read_record . read_record = join_ft_read_next ;
break ;
case JT_SYSTEM :
tab - > read_first_record = join_read_system ;
tab - > read_record . read_record = join_no_more_records ;
break ;
/* keep gcc happy */
default :
break ;
}
}
static void
make_join_readinfo ( JOIN * join , ulonglong options )
{
@ -6234,45 +6284,15 @@ make_join_readinfo(JOIN *join, ulonglong options)
( join - > sort_by_table = = ( TABLE * ) 1 & & i ! = join - > const_tables ) ) )
ordered_set = 1 ;
table - > status = STATUS_NO_RECORD ;
pick_table_access_method ( tab ) ;
switch ( tab - > type ) {
case JT_SYSTEM : // Only happens with left join
table - > status = STATUS_NO_RECORD ;
tab - > read_first_record = join_read_system ;
tab - > read_record . read_record = join_no_more_records ;
break ;
case JT_CONST : // Only happens with left join
table - > status = STATUS_NO_RECORD ;
tab - > read_first_record = join_read_const ;
tab - > read_record . read_record = join_no_more_records ;
if ( table - > used_keys . is_set ( tab - > ref . key ) & &
! table - > no_keyread )
{
table - > key_read = 1 ;
table - > file - > extra ( HA_EXTRA_KEYREAD ) ;
}
break ;
case JT_EQ_REF :
table - > status = STATUS_NO_RECORD ;
if ( tab - > select )
{
delete tab - > select - > quick ;
tab - > select - > quick = 0 ;
}
delete tab - > quick ;
tab - > quick = 0 ;
tab - > read_first_record = join_read_key ;
tab - > read_record . unlock_row = join_read_key_unlock_row ;
tab - > read_record . read_record = join_no_more_records ;
if ( table - > used_keys . is_set ( tab - > ref . key ) & &
! table - > no_keyread )
{
table - > key_read = 1 ;
table - > file - > extra ( HA_EXTRA_KEYREAD ) ;
}
break ;
/* fall through */
case JT_REF_OR_NULL :
case JT_REF :
table - > status = STATUS_NO_RECORD ;
if ( tab - > select )
{
delete tab - > select - > quick ;
@ -6280,34 +6300,20 @@ make_join_readinfo(JOIN *join, ulonglong options)
}
delete tab - > quick ;
tab - > quick = 0 ;
/* fall through */
case JT_CONST : // Only happens with left join
if ( table - > used_keys . is_set ( tab - > ref . key ) & &
! table - > no_keyread )
{
table - > key_read = 1 ;
table - > file - > extra ( HA_EXTRA_KEYREAD ) ;
}
if ( tab - > type = = JT_REF )
{
tab - > read_first_record = join_read_always_key ;
tab - > read_record . read_record = join_read_next_same ;
}
else
{
tab - > read_first_record = join_read_always_key_or_null ;
tab - > read_record . read_record = join_read_next_same_or_null ;
}
break ;
case JT_FT :
table - > status = STATUS_NO_RECORD ;
tab - > read_first_record = join_ft_read_first ;
tab - > read_record . read_record = join_ft_read_next ;
break ;
case JT_ALL :
/*
If previous table use cache
If the incoming data set is already sorted don ' t use cache .
*/
table - > status = STATUS_NO_RECORD ;
if ( i ! = join - > const_tables & & ! ( options & SELECT_NO_JOIN_CACHE ) & &
tab - > use_quick ! = 2 & & ! tab - > first_inner & & ! ordered_set )
{
@ -6381,6 +6387,9 @@ make_join_readinfo(JOIN *join, ulonglong options)
}
}
break ;
case JT_FT :
case JT_SYSTEM :
break ;
default :
DBUG_PRINT ( " error " , ( " Table type %d found " , tab - > type ) ) ; /* purecov: deadcode */
break ; /* purecov: deadcode */
@ -12753,6 +12762,8 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
if ( create_ref_for_key ( tab - > join , tab , keyuse ,
tab - > join - > const_table_map ) )
DBUG_RETURN ( 0 ) ;
pick_table_access_method ( tab ) ;
}
else
{