public override void Parse(MySqlStreamReader reader)
        {
            //reset final result
            _parseResult = null;
            while (!StepParse(reader))
            {
                ;
            }
            //StepParse() return true if
            //1. need more data or
            //2. finish

            reader.ClearReadBuffer();

            if (_needMoreData)
            {
                //at any state if need more buffer
                //then stop parsing and return
                if (_supportPartialRelease)
                {
                    if (_rows != null && _rows.Count > 0)
                    {
                        _parseResult = new MySqlTableResult(_tableHeader, _rows.ToArray())
                        {
                            HasFollower = true
                        };
                    }
                    if (_generateResultMode)
                    {
                        //generate new result
#if DEBUG
                        if (_rows != null)
                        {
                        }
#endif
                        _rows.Clear();
                    }
                }
            }
            else if (_parsingState == ResultPacketState.ShouldEnd)
            {
                //reset
                reader.Reset();
                _parsingState = ResultPacketState.Header_Header;
            }
        }
        bool Parse_Row_Content(MySqlStreamReader reader)
        {
            if (!reader.Ensure(_currentHeader.ContentLength))
            {
                return(_needMoreData = true);
            }
            if (_currentHeader.ContentLength > Packet.MAX_PACKET_LENGTH)
            {
                throw new NotSupportedException("???");
            }
            else if (_currentHeader.ContentLength == Packet.MAX_PACKET_LENGTH)
            {
                //can't complete in this round
                //so store data into temp extra large buffer
                //and set isLargeData= true
                StoreBuffer(reader, (int)_currentHeader.ContentLength);
                _isLargeData = true;
                //we still in the row content state
                _parsingState = ResultPacketState.Row_Header;
                return(false);
            }
            //--------------------------------

            if (_generateResultMode)
            {
                //this is normal mode (opposite to JustFlushOutMode)
                //in this mode we parse packet content
                //and add it to the output rows
                //----------------------------------
                //in  this version row buffer len must < int.MaxLength
                if (_currentHeader.ContentLength > int.MaxValue)
                {
                    throw new NotSupportedException("not support this length");
                }
                //------------------------------------
                if (_isLargeData)
                {
                    if (_ms == null)
                    {                                      //it should not be null here
                        throw new NotSupportedException(); //?
                    }
                    _ms.Write(reader.ReadBuffer((int)_currentHeader.ContentLength), 0,
                              (int)_currentHeader.ContentLength);
                    _rows.Add(new DataRowPacket(_currentHeader, _ms.ToArray()));

#if NET20
                    _ms.Close();
#endif
                    _ms.Dispose();
                    _ms = null;

                    _isLargeData = false; //reset
                }
                else
                {
                    _rows.Add(new DataRowPacket(_currentHeader,
                                                reader.ReadBuffer((int)_currentHeader.ContentLength)));
                    reader.ClearReadBuffer();
                }
            }
            else
            {
                //just flush data***
                //not create data row
                if (_currentHeader.ContentLength > int.MaxValue)
                {
                    throw new Exception("not support content length> int.MaxValue");
                }
                reader.SkipForward((int)_currentHeader.ContentLength);
            }
            //-----------------------------------------------------------------------
            //after this row, next state = next row header
            _parsingState = ResultPacketState.Row_Header;
            return(false);
        }