Fix IoTDBRpcDataSet.moreData not updated in fetchResults (#171)
diff --git a/client/rpcdataset.go b/client/rpcdataset.go
index da97ef6..d41a765 100644
--- a/client/rpcdataset.go
+++ b/client/rpcdataset.go
@@ -234,6 +234,8 @@
 		return false, err
 	}
 
+	s.moreData = resp.GetMoreData()
+
 	if !resp.HasResultSet {
 		err = s.Close()
 	} else {
diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go
index 8fd2167..aef1dbd 100644
--- a/test/e2e/e2e_test.go
+++ b/test/e2e/e2e_test.go
@@ -436,6 +436,73 @@
 	s.session.DeleteStorageGroup("root.ln.**")
 }
 
+// createSimpleTablet creates a tablet whose single INT64 measurement value
+// equals the row index, so that the values read back can be verified.
+func createSimpleTablet(deviceId string, rowCount int) (*client.Tablet, error) {
+	tablet, err := client.NewTablet(deviceId, []*client.MeasurementSchema{
+		{
+			Measurement: "value",
+			DataType:    client.INT64,
+		},
+	}, rowCount)
+	if err != nil {
+		return nil, err
+	}
+	var ts int64 = 0
+	for row := 0; row < rowCount; row++ {
+		ts++
+		tablet.SetTimestamp(ts, row)
+		tablet.SetValueAt(int64(row), 0, row)
+		tablet.RowSize++
+	}
+	return tablet, nil
+}
+
+// Test_QueryDataAcrossMultipleFetches writes more rows than the fetch size so
+// that reading the result requires several fetchResults rounds; the data set
+// must keep fetching while the server reports more data and stop once the
+// server reports no more data, otherwise the read-back count and values would
+// not match.
+func (s *e2eTestSuite) Test_QueryDataAcrossMultipleFetches() {
+	var timeseries = []string{"root.ln.device1.**"}
+	tests := []struct {
+		name      string
+		fetchSize int32
+		rowCount  int
+	}{
+		{name: "30000 rows with fetchSize 100", fetchSize: 100, rowCount: 30000},
+		{name: "50000 rows with fetchSize 1000", fetchSize: 1000, rowCount: 50000},
+	}
+	for _, tt := range tests {
+		s.Run(tt.name, func() {
+			s.session.SetFetchSize(tt.fetchSize)
+			s.session.DeleteTimeseries(timeseries)
+			tablet, err := createSimpleTablet("root.ln.device1", tt.rowCount)
+			s.Require().NoError(err)
+			s.checkError(s.session.InsertAlignedTablets([]*client.Tablet{tablet}, false))
+
+			ds, err := s.session.ExecuteQueryStatement("select * from root.ln.device1", nil)
+			s.Require().NoError(err)
+			defer ds.Close()
+
+			count := 0
+			for {
+				hasNext, err := ds.Next()
+				s.Require().NoError(err)
+				if !hasNext {
+					break
+				}
+				value, err := ds.GetLong("root.ln.device1.value")
+				s.Require().NoError(err)
+				s.Assert().Equal(int64(count), value)
+				count++
+			}
+			s.Assert().Equal(tt.rowCount, count)
+			s.session.DeleteStorageGroup("root.ln.**")
+		})
+	}
+}
+
 func (s *e2eTestSuite) Test_QueryAllDataType() {
 	measurementSchemas := []*client.MeasurementSchema{
 		{