@@ -750,33 +750,45 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked)
750
750
if (!(test_if_locked & HA_OPEN_TMP_TABLE) && opt_myisam_use_mmap)
751
751
test_if_locked|= HA_OPEN_MMAP;
752
752
753
- lock_shared_ha_data ();
754
- my_handler_share= static_cast <Myisam_handler_share*>(get_ha_share_ptr ());
755
- if (my_handler_share)
756
- share= my_handler_share->m_share ;
757
-
758
- if (!(file= mi_open_share (name, share, mode,
759
- test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
760
- {
761
- unlock_shared_ha_data ();
762
- return (my_errno ? my_errno : -1 );
763
- }
764
- if (!my_handler_share)
753
+ /*
754
+ We are allocating the handler share only in case of normal MyISAM tables
755
+ */
756
+ if (table->s ->tmp_table == NO_TMP_TABLE)
765
757
{
766
- my_handler_share= new (std::nothrow) Myisam_handler_share;
758
+ lock_shared_ha_data ();
759
+ my_handler_share= static_cast <Myisam_handler_share*>(get_ha_share_ptr ());
767
760
if (my_handler_share)
761
+ share= my_handler_share->m_share ;
762
+
763
+ if (!(file= mi_open_share (name, share, mode,
764
+ test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
768
765
{
769
- my_handler_share-> m_share = file-> s ;
770
- set_ha_share_ptr ( static_cast <Handler_share*>(my_handler_share) );
766
+ unlock_shared_ha_data () ;
767
+ return (my_errno ? my_errno : - 1 );
771
768
}
772
- else
769
+ if (!my_handler_share)
773
770
{
774
- mi_close (file);
775
- unlock_shared_ha_data ();
776
- return (my_errno ? my_errno : HA_ERR_OUT_OF_MEM);
771
+ my_handler_share= new (std::nothrow) Myisam_handler_share;
772
+ if (my_handler_share)
773
+ {
774
+ my_handler_share->m_share = file->s ;
775
+ set_ha_share_ptr (static_cast <Handler_share*>(my_handler_share));
776
+ }
777
+ else
778
+ {
779
+ mi_close (file);
780
+ unlock_shared_ha_data ();
781
+ return (my_errno ? my_errno : HA_ERR_OUT_OF_MEM);
782
+ }
777
783
}
784
+ unlock_shared_ha_data ();
778
785
}
779
- unlock_shared_ha_data ();
786
+ else
787
+ if (!(file=
788
+ mi_open_share (name, share, mode,
789
+ test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
790
+ return (my_errno ? my_errno : -1 );
791
+
780
792
if (!table->s ->tmp_table ) /* No need to perform a check for tmp table */
781
793
{
782
794
if ((my_errno= table2myisam (table, &keyinfo, &recinfo, &recs)))
@@ -837,15 +849,15 @@ int ha_myisam::close(void)
837
849
my_bool closed_share= FALSE ;
838
850
lock_shared_ha_data ();
839
851
int err= mi_close_share (file, &closed_share);
840
- file=0 ;
852
+ file= 0 ;
841
853
/*
842
854
Since tmp tables will also come to the same flow. To distinguesh with them
843
855
we need to check table_share->tmp_table.
844
856
*/
845
857
if (closed_share && table_share->tmp_table == NO_TMP_TABLE)
846
858
{
847
859
Myisam_handler_share *my_handler_share=
848
- static_cast <Myisam_handler_share*>(get_ha_share_ptr ());
860
+ static_cast <Myisam_handler_share*>(get_ha_share_ptr ());
849
861
if (my_handler_share && my_handler_share->m_share )
850
862
delete (my_handler_share);
851
863
set_ha_share_ptr (NULL );
0 commit comments