diff --git a/LICENSE-binary b/LICENSE-binary
index 4c5ac5d..6620f9a 100644
--- a/LICENSE-binary
+++ b/LICENSE-binary
@@ -215,4 +215,4 @@
 
 Apache Software Foundation License 2.0
 --------------------------------------
-github.com/apache/thrift@v0.13.0
+github.com/apache/thrift@v0.14.1
diff --git a/Makefile b/Makefile
index 2808b27..9109054 100644
--- a/Makefile
+++ b/Makefile
@@ -24,12 +24,12 @@
 	fi
 
 	@if ! command -v thrift &> /dev/null; then \
-		echo "thrift could not be found, please install thrift 0.13.0"; \
+		echo "thrift could not be found, please install thrift 0.14.1"; \
 		exit 1; \
 	fi
 
-	@if [[ "`thrift --version|grep -o '0.13.[0-9]'`" == "" ]]; then \
-		echo "please install thrift 0.13.0"; \
+	@if [[ "`thrift --version|grep -o '0.14.[0-9]'`" == "" ]]; then \
+		echo "please install thrift 0.14.1"; \
 		exit 1; \
 	fi
 
diff --git a/README.md b/README.md
index 891386c..7fa62f9 100644
--- a/README.md
+++ b/README.md
@@ -72,10 +72,10 @@
 Without go mod
 
 ```sh
-# get thrift 0.13.0
+# get thrift 0.14.1
 go get github.com/apache/thrift
 cd $GOPATH/src/github.com/apache/thrift
-git checkout 0.13.0
+git checkout 0.14.1
 
 mkdir -p $GOPATH/src/iotdb-client-go-example/session_example
 cd $GOPATH/src/iotdb-client-go-example/session_example
@@ -96,4 +96,4 @@
 * golang >= 1.13
 * make >= 3.0
 * curl >= 7.1.1
-* thrift 0.13.x
+* thrift 0.14.1
diff --git a/README_ZH.md b/README_ZH.md
index c415b78..4f0dedb 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -54,10 +54,10 @@
 不使用go mod，采用GOPATH
 
 ```sh
-# get thrift 0.13.0
+# get thrift 0.14.1
 go get github.com/apache/thrift
 cd $GOPATH/src/github.com/apache/thrift
-git checkout 0.13.0
+git checkout 0.14.1
 
 mkdir -p $GOPATH/src/iotdb-client-go-example/session_example
 cd $GOPATH/src/iotdb-client-go-example/session_example
@@ -77,4 +77,4 @@
 * golang >= 1.13
 * make   >= 3.0
 * curl   >= 7.1.1
-* thrift 0.13.x
+* thrift 0.14.1
diff --git a/client/session.go b/client/session.go
index e345f57..9c89662 100644
--- a/client/session.go
+++ b/client/session.go
@@ -68,7 +68,10 @@
 
 	var protocolFactory thrift.TProtocolFactory
 	var err error
-	s.trans, err = thrift.NewTSocketTimeout(net.JoinHostPort(s.config.Host, s.config.Port), time.Duration(connectionTimeoutInMs))
+
+	s.trans, err = thrift.NewTSocketConf(net.JoinHostPort(s.config.Host, s.config.Port), &thrift.TConfiguration{
+         ConnectTimeout: time.Duration(connectionTimeoutInMs), // Use 0 for no timeout
+	})
 	if err != nil {
 		return err
 	}
diff --git a/go.mod b/go.mod
index a87f66a..9f433aa 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,6 @@
 go 1.13
 
 require (
-	github.com/apache/thrift v0.13.0
+	github.com/apache/thrift v0.14.1
 	github.com/stretchr/testify v1.7.0
 )
diff --git a/go.sum b/go.sum
index 8639507..765cd50 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,5 @@
-github.com/apache/thrift v0.13.0 h1:5hryIiq9gtn+MiLVn0wP37kb/uTeRZgN08WoCsAhIhI=
-github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.14.1 h1:Yh8v0hpCj63p5edXOLaqTJW0IJ1p+eMW6+YSOqw1d6s=
+github.com/apache/thrift v0.14.1/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
diff --git a/rpc/rpc.go b/rpc/rpc.go
index 3c9fbca..e001f86 100644
--- a/rpc/rpc.go
+++ b/rpc/rpc.go
@@ -1,27 +1,25 @@
-// Autogenerated by Thrift Compiler (0.13.0)
-// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+// Code generated by Thrift Compiler (0.14.1). DO NOT EDIT.
 
 package rpc
 
-import (
+import(
 	"bytes"
 	"context"
 	"database/sql/driver"
 	"errors"
 	"fmt"
+	"time"
 	"github.com/apache/thrift/lib/go/thrift"
-	"reflect"
 )
 
 // (needed to ensure safety because of naive import list construction.)
 var _ = thrift.ZERO
 var _ = fmt.Printf
 var _ = context.Background
-var _ = reflect.DeepEqual
+var _ = time.Now
 var _ = bytes.Equal
 
 type TSProtocolVersion int64
-
 const (
 	TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V1 TSProtocolVersion = 0
 	TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V2 TSProtocolVersion = 1
@@ -30,28 +28,23 @@
 
 func (p TSProtocolVersion) String() string {
 	switch p {
-	case TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V1:
-		return "IOTDB_SERVICE_PROTOCOL_V1"
-	case TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V2:
-		return "IOTDB_SERVICE_PROTOCOL_V2"
-	case TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V3:
-		return "IOTDB_SERVICE_PROTOCOL_V3"
+	case TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V1: return "IOTDB_SERVICE_PROTOCOL_V1"
+	case TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V2: return "IOTDB_SERVICE_PROTOCOL_V2"
+	case TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V3: return "IOTDB_SERVICE_PROTOCOL_V3"
 	}
 	return "<UNSET>"
 }
 
 func TSProtocolVersionFromString(s string) (TSProtocolVersion, error) {
 	switch s {
-	case "IOTDB_SERVICE_PROTOCOL_V1":
-		return TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V1, nil
-	case "IOTDB_SERVICE_PROTOCOL_V2":
-		return TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V2, nil
-	case "IOTDB_SERVICE_PROTOCOL_V3":
-		return TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V3, nil
+	case "IOTDB_SERVICE_PROTOCOL_V1": return TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V1, nil
+	case "IOTDB_SERVICE_PROTOCOL_V2": return TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V2, nil
+	case "IOTDB_SERVICE_PROTOCOL_V3": return TSProtocolVersion_IOTDB_SERVICE_PROTOCOL_V3, nil
 	}
 	return TSProtocolVersion(0), fmt.Errorf("not a valid TSProtocolVersion string")
 }
 
+
 func TSProtocolVersionPtr(v TSProtocolVersion) *TSProtocolVersion { return &v }
 
 func (p TSProtocolVersion) MarshalText() ([]byte, error) {
@@ -60,7 +53,7 @@
 
 func (p *TSProtocolVersion) UnmarshalText(text []byte) error {
 	q, err := TSProtocolVersionFromString(string(text))
-	if err != nil {
+	if (err != nil) {
 		return err
 	}
 	*p = q
@@ -76,25 +69,25 @@
 	return nil
 }
 
-func (p *TSProtocolVersion) Value() (driver.Value, error) {
+func (p * TSProtocolVersion) Value() (driver.Value, error) {
 	if p == nil {
 		return nil, nil
 	}
 	return int64(*p), nil
 }
-
 // Attributes:
 //  - IP
 //  - Port
 type EndPoint struct {
-	IP   string `thrift:"ip,1,required" db:"ip" json:"ip"`
-	Port int32  `thrift:"port,2,required" db:"port" json:"port"`
+	IP string `thrift:"ip,1,required" db:"ip" json:"ip"`
+	Port int32 `thrift:"port,2,required" db:"port" json:"port"`
 }
 
 func NewEndPoint() *EndPoint {
 	return &EndPoint{}
 }
 
+
 func (p *EndPoint) GetIP() string {
 	return p.IP
 }
@@ -102,68 +95,66 @@
 func (p *EndPoint) GetPort() int32 {
 	return p.Port
 }
-func (p *EndPoint) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *EndPoint) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetIP bool = false
-	var issetPort bool = false
+	var issetIP bool = false;
+	var issetPort bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetIP = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetPort = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetIP {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field IP is not set"))
+	if !issetIP{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field IP is not set"));
 	}
-	if !issetPort {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Port is not set"))
+	if !issetPort{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Port is not set"));
 	}
 	return nil
 }
 
-func (p *EndPoint) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *EndPoint)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.IP = v
@@ -171,8 +162,8 @@
 	return nil
 }
 
-func (p *EndPoint) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *EndPoint)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.Port = v
@@ -180,53 +171,51 @@
 	return nil
 }
 
-func (p *EndPoint) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("EndPoint"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *EndPoint) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "EndPoint"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *EndPoint) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("ip", thrift.STRING, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ip: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.IP)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.ip (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ip: ", p), err)
-	}
+func (p *EndPoint) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "ip", thrift.STRING, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ip: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.IP)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.ip (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ip: ", p), err) }
 	return err
 }
 
-func (p *EndPoint) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("port", thrift.I32, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:port: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.Port)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.port (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:port: ", p), err)
-	}
+func (p *EndPoint) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "port", thrift.I32, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:port: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.Port)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.port (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:port: ", p), err) }
 	return err
 }
 
+func (p *EndPoint) Equals(other *EndPoint) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.IP != other.IP { return false }
+	if p.Port != other.Port { return false }
+	return true
+}
+
 func (p *EndPoint) String() string {
 	if p == nil {
 		return "<nil>"
@@ -240,37 +229,33 @@
 //  - SubStatus
 //  - RedirectNode
 type TSStatus struct {
-	Code         int32       `thrift:"code,1,required" db:"code" json:"code"`
-	Message      *string     `thrift:"message,2" db:"message" json:"message,omitempty"`
-	SubStatus    []*TSStatus `thrift:"subStatus,3" db:"subStatus" json:"subStatus,omitempty"`
-	RedirectNode *EndPoint   `thrift:"redirectNode,4" db:"redirectNode" json:"redirectNode,omitempty"`
+	Code int32 `thrift:"code,1,required" db:"code" json:"code"`
+	Message *string `thrift:"message,2" db:"message" json:"message,omitempty"`
+	SubStatus []*TSStatus `thrift:"subStatus,3" db:"subStatus" json:"subStatus,omitempty"`
+	RedirectNode *EndPoint `thrift:"redirectNode,4" db:"redirectNode" json:"redirectNode,omitempty"`
 }
 
 func NewTSStatus() *TSStatus {
 	return &TSStatus{}
 }
 
+
 func (p *TSStatus) GetCode() int32 {
 	return p.Code
 }
-
 var TSStatus_Message_DEFAULT string
-
 func (p *TSStatus) GetMessage() string {
 	if !p.IsSetMessage() {
 		return TSStatus_Message_DEFAULT
 	}
 	return *p.Message
 }
-
 var TSStatus_SubStatus_DEFAULT []*TSStatus
 
 func (p *TSStatus) GetSubStatus() []*TSStatus {
 	return p.SubStatus
 }
-
 var TSStatus_RedirectNode_DEFAULT *EndPoint
-
 func (p *TSStatus) GetRedirectNode() *EndPoint {
 	if !p.IsSetRedirectNode() {
 		return TSStatus_RedirectNode_DEFAULT
@@ -289,83 +274,81 @@
 	return p.RedirectNode != nil
 }
 
-func (p *TSStatus) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSStatus) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetCode bool = false
+	var issetCode bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetCode = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetCode {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Code is not set"))
+	if !issetCode{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Code is not set"));
 	}
 	return nil
 }
 
-func (p *TSStatus) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSStatus)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.Code = v
@@ -373,8 +356,8 @@
 	return nil
 }
 
-func (p *TSStatus) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSStatus)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.Message = &v
@@ -382,127 +365,128 @@
 	return nil
 }
 
-func (p *TSStatus) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSStatus)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]*TSStatus, 0, size)
-	p.SubStatus = tSlice
-	for i := 0; i < size; i++ {
+	p.SubStatus =  tSlice
+	for i := 0; i < size; i ++ {
 		_elem0 := &TSStatus{}
-		if err := _elem0.Read(iprot); err != nil {
+		if err := _elem0.Read(ctx, iprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err)
 		}
 		p.SubStatus = append(p.SubStatus, _elem0)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSStatus) ReadField4(iprot thrift.TProtocol) error {
+func (p *TSStatus)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
 	p.RedirectNode = &EndPoint{}
-	if err := p.RedirectNode.Read(iprot); err != nil {
+	if err := p.RedirectNode.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.RedirectNode), err)
 	}
 	return nil
 }
 
-func (p *TSStatus) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSStatus"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSStatus) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSStatus"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSStatus) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("code", thrift.I32, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:code: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.Code)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.code (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:code: ", p), err)
-	}
+func (p *TSStatus) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "code", thrift.I32, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:code: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.Code)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.code (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:code: ", p), err) }
 	return err
 }
 
-func (p *TSStatus) writeField2(oprot thrift.TProtocol) (err error) {
+func (p *TSStatus) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetMessage() {
-		if err := oprot.WriteFieldBegin("message", thrift.STRING, 2); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:message: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.Message)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.message (2) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:message: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "message", thrift.STRING, 2); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:message: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.Message)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.message (2) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:message: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSStatus) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSStatus) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSubStatus() {
-		if err := oprot.WriteFieldBegin("subStatus", thrift.LIST, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:subStatus: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.STRUCT, len(p.SubStatus)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "subStatus", thrift.LIST, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:subStatus: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.STRUCT, len(p.SubStatus)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.SubStatus {
-			if err := v.Write(oprot); err != nil {
+			if err := v.Write(ctx, oprot); err != nil {
 				return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err)
 			}
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:subStatus: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:subStatus: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSStatus) writeField4(oprot thrift.TProtocol) (err error) {
+func (p *TSStatus) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetRedirectNode() {
-		if err := oprot.WriteFieldBegin("redirectNode", thrift.STRUCT, 4); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:redirectNode: ", p), err)
-		}
-		if err := p.RedirectNode.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "redirectNode", thrift.STRUCT, 4); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:redirectNode: ", p), err) }
+		if err := p.RedirectNode.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.RedirectNode), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:redirectNode: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:redirectNode: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSStatus) Equals(other *TSStatus) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.Code != other.Code { return false }
+	if p.Message != other.Message {
+		if p.Message == nil || other.Message == nil {
+			return false
+		}
+		if (*p.Message) != (*other.Message) { return false }
+	}
+	if len(p.SubStatus) != len(other.SubStatus) { return false }
+	for i, _tgt := range p.SubStatus {
+		_src1 := other.SubStatus[i]
+		if !_tgt.Equals(_src1) { return false }
+	}
+	if !p.RedirectNode.Equals(other.RedirectNode) { return false }
+	return true
+}
+
 func (p *TSStatus) String() string {
 	if p == nil {
 		return "<nil>"
@@ -515,8 +499,8 @@
 //  - ValueList
 //  - BitmapList
 type TSQueryDataSet struct {
-	Time       []byte   `thrift:"time,1,required" db:"time" json:"time"`
-	ValueList  [][]byte `thrift:"valueList,2,required" db:"valueList" json:"valueList"`
+	Time []byte `thrift:"time,1,required" db:"time" json:"time"`
+	ValueList [][]byte `thrift:"valueList,2,required" db:"valueList" json:"valueList"`
 	BitmapList [][]byte `thrift:"bitmapList,3,required" db:"bitmapList" json:"bitmapList"`
 }
 
@@ -524,6 +508,7 @@
 	return &TSQueryDataSet{}
 }
 
+
 func (p *TSQueryDataSet) GetTime() []byte {
 	return p.Time
 }
@@ -535,83 +520,81 @@
 func (p *TSQueryDataSet) GetBitmapList() [][]byte {
 	return p.BitmapList
 }
-func (p *TSQueryDataSet) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSQueryDataSet) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetTime bool = false
-	var issetValueList bool = false
-	var issetBitmapList bool = false
+	var issetTime bool = false;
+	var issetValueList bool = false;
+	var issetBitmapList bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetTime = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetValueList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetBitmapList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetTime {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Time is not set"))
+	if !issetTime{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Time is not set"));
 	}
-	if !issetValueList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValueList is not set"))
+	if !issetValueList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValueList is not set"));
 	}
-	if !issetBitmapList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field BitmapList is not set"))
+	if !issetBitmapList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field BitmapList is not set"));
 	}
 	return nil
 }
 
-func (p *TSQueryDataSet) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBinary(); err != nil {
+func (p *TSQueryDataSet)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBinary(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.Time = v
@@ -619,129 +602,131 @@
 	return nil
 }
 
-func (p *TSQueryDataSet) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSQueryDataSet)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]byte, 0, size)
-	p.ValueList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem1 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
-			return thrift.PrependError("error reading field 0: ", err)
-		} else {
-			_elem1 = v
-		}
-		p.ValueList = append(p.ValueList, _elem1)
-	}
-	if err := iprot.ReadListEnd(); err != nil {
-		return thrift.PrependError("error reading list end: ", err)
-	}
-	return nil
-}
-
-func (p *TSQueryDataSet) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
-	if err != nil {
-		return thrift.PrependError("error reading list begin: ", err)
-	}
-	tSlice := make([][]byte, 0, size)
-	p.BitmapList = tSlice
-	for i := 0; i < size; i++ {
+	p.ValueList =  tSlice
+	for i := 0; i < size; i ++ {
 		var _elem2 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
+		if v, err := iprot.ReadBinary(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
 			_elem2 = v
 		}
-		p.BitmapList = append(p.BitmapList, _elem2)
+		p.ValueList = append(p.ValueList, _elem2)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSQueryDataSet) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSQueryDataSet"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
+func (p *TSQueryDataSet)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
+	if err != nil {
+		return thrift.PrependError("error reading list begin: ", err)
 	}
-	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
+	tSlice := make([][]byte, 0, size)
+	p.BitmapList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem3 []byte
+		if v, err := iprot.ReadBinary(ctx); err != nil {
+			return thrift.PrependError("error reading field 0: ", err)
+		} else {
+			_elem3 = v
 		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
+		p.BitmapList = append(p.BitmapList, _elem3)
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
+	if err := iprot.ReadListEnd(ctx); err != nil {
+		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSQueryDataSet) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("time", thrift.STRING, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:time: ", p), err)
+func (p *TSQueryDataSet) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSQueryDataSet"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
+	if p != nil {
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteBinary(p.Time); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.time (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:time: ", p), err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
+	return nil
+}
+
+func (p *TSQueryDataSet) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "time", thrift.STRING, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:time: ", p), err) }
+	if err := oprot.WriteBinary(ctx, p.Time); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.time (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:time: ", p), err) }
 	return err
 }
 
-func (p *TSQueryDataSet) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("valueList", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:valueList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.ValueList)); err != nil {
+func (p *TSQueryDataSet) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "valueList", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:valueList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.ValueList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.ValueList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:valueList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:valueList: ", p), err) }
 	return err
 }
 
-func (p *TSQueryDataSet) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("bitmapList", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:bitmapList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.BitmapList)); err != nil {
+func (p *TSQueryDataSet) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "bitmapList", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:bitmapList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.BitmapList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.BitmapList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:bitmapList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:bitmapList: ", p), err) }
 	return err
 }
 
+func (p *TSQueryDataSet) Equals(other *TSQueryDataSet) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if bytes.Compare(p.Time, other.Time) != 0 { return false }
+	if len(p.ValueList) != len(other.ValueList) { return false }
+	for i, _tgt := range p.ValueList {
+		_src4 := other.ValueList[i]
+		if bytes.Compare(_tgt, _src4) != 0 { return false }
+	}
+	if len(p.BitmapList) != len(other.BitmapList) { return false }
+	for i, _tgt := range p.BitmapList {
+		_src5 := other.BitmapList[i]
+		if bytes.Compare(_tgt, _src5) != 0 { return false }
+	}
+	return true
+}
+
 func (p *TSQueryDataSet) String() string {
 	if p == nil {
 		return "<nil>"
@@ -753,7 +738,7 @@
 //  - TimeList
 //  - ValueList
 type TSQueryNonAlignDataSet struct {
-	TimeList  [][]byte `thrift:"timeList,1,required" db:"timeList" json:"timeList"`
+	TimeList [][]byte `thrift:"timeList,1,required" db:"timeList" json:"timeList"`
 	ValueList [][]byte `thrift:"valueList,2,required" db:"valueList" json:"valueList"`
 }
 
@@ -761,6 +746,7 @@
 	return &TSQueryNonAlignDataSet{}
 }
 
+
 func (p *TSQueryNonAlignDataSet) GetTimeList() [][]byte {
 	return p.TimeList
 }
@@ -768,173 +754,177 @@
 func (p *TSQueryNonAlignDataSet) GetValueList() [][]byte {
 	return p.ValueList
 }
-func (p *TSQueryNonAlignDataSet) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSQueryNonAlignDataSet) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetTimeList bool = false
-	var issetValueList bool = false
+	var issetTimeList bool = false;
+	var issetValueList bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimeList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetValueList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetTimeList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimeList is not set"))
+	if !issetTimeList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimeList is not set"));
 	}
-	if !issetValueList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValueList is not set"))
+	if !issetValueList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValueList is not set"));
 	}
 	return nil
 }
 
-func (p *TSQueryNonAlignDataSet) ReadField1(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSQueryNonAlignDataSet)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]byte, 0, size)
-	p.TimeList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem3 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
+	p.TimeList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem6 []byte
+		if v, err := iprot.ReadBinary(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem3 = v
+			_elem6 = v
 		}
-		p.TimeList = append(p.TimeList, _elem3)
+		p.TimeList = append(p.TimeList, _elem6)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSQueryNonAlignDataSet) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSQueryNonAlignDataSet)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]byte, 0, size)
-	p.ValueList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem4 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
+	p.ValueList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem7 []byte
+		if v, err := iprot.ReadBinary(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem4 = v
+			_elem7 = v
 		}
-		p.ValueList = append(p.ValueList, _elem4)
+		p.ValueList = append(p.ValueList, _elem7)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSQueryNonAlignDataSet) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSQueryNonAlignDataSet"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSQueryNonAlignDataSet) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSQueryNonAlignDataSet"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSQueryNonAlignDataSet) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timeList", thrift.LIST, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timeList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.TimeList)); err != nil {
+func (p *TSQueryNonAlignDataSet) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timeList", thrift.LIST, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timeList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.TimeList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.TimeList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timeList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timeList: ", p), err) }
 	return err
 }
 
-func (p *TSQueryNonAlignDataSet) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("valueList", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:valueList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.ValueList)); err != nil {
+func (p *TSQueryNonAlignDataSet) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "valueList", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:valueList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.ValueList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.ValueList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:valueList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:valueList: ", p), err) }
 	return err
 }
 
+func (p *TSQueryNonAlignDataSet) Equals(other *TSQueryNonAlignDataSet) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if len(p.TimeList) != len(other.TimeList) { return false }
+	for i, _tgt := range p.TimeList {
+		_src8 := other.TimeList[i]
+		if bytes.Compare(_tgt, _src8) != 0 { return false }
+	}
+	if len(p.ValueList) != len(other.ValueList) { return false }
+	for i, _tgt := range p.ValueList {
+		_src9 := other.ValueList[i]
+		if bytes.Compare(_tgt, _src9) != 0 { return false }
+	}
+	return true
+}
+
 func (p *TSQueryNonAlignDataSet) String() string {
 	if p == nil {
 		return "<nil>"
@@ -953,15 +943,15 @@
 //  - NonAlignQueryDataSet
 //  - ColumnNameIndexMap
 type TSExecuteStatementResp struct {
-	Status               *TSStatus               `thrift:"status,1,required" db:"status" json:"status"`
-	QueryId              *int64                  `thrift:"queryId,2" db:"queryId" json:"queryId,omitempty"`
-	Columns              []string                `thrift:"columns,3" db:"columns" json:"columns,omitempty"`
-	OperationType        *string                 `thrift:"operationType,4" db:"operationType" json:"operationType,omitempty"`
-	IgnoreTimeStamp      *bool                   `thrift:"ignoreTimeStamp,5" db:"ignoreTimeStamp" json:"ignoreTimeStamp,omitempty"`
-	DataTypeList         []string                `thrift:"dataTypeList,6" db:"dataTypeList" json:"dataTypeList,omitempty"`
-	QueryDataSet         *TSQueryDataSet         `thrift:"queryDataSet,7" db:"queryDataSet" json:"queryDataSet,omitempty"`
+	Status *TSStatus `thrift:"status,1,required" db:"status" json:"status"`
+	QueryId *int64 `thrift:"queryId,2" db:"queryId" json:"queryId,omitempty"`
+	Columns []string `thrift:"columns,3" db:"columns" json:"columns,omitempty"`
+	OperationType *string `thrift:"operationType,4" db:"operationType" json:"operationType,omitempty"`
+	IgnoreTimeStamp *bool `thrift:"ignoreTimeStamp,5" db:"ignoreTimeStamp" json:"ignoreTimeStamp,omitempty"`
+	DataTypeList []string `thrift:"dataTypeList,6" db:"dataTypeList" json:"dataTypeList,omitempty"`
+	QueryDataSet *TSQueryDataSet `thrift:"queryDataSet,7" db:"queryDataSet" json:"queryDataSet,omitempty"`
 	NonAlignQueryDataSet *TSQueryNonAlignDataSet `thrift:"nonAlignQueryDataSet,8" db:"nonAlignQueryDataSet" json:"nonAlignQueryDataSet,omitempty"`
-	ColumnNameIndexMap   map[string]int32        `thrift:"columnNameIndexMap,9" db:"columnNameIndexMap" json:"columnNameIndexMap,omitempty"`
+	ColumnNameIndexMap map[string]int32 `thrift:"columnNameIndexMap,9" db:"columnNameIndexMap" json:"columnNameIndexMap,omitempty"`
 }
 
 func NewTSExecuteStatementResp() *TSExecuteStatementResp {
@@ -969,71 +959,57 @@
 }
 
 var TSExecuteStatementResp_Status_DEFAULT *TSStatus
-
 func (p *TSExecuteStatementResp) GetStatus() *TSStatus {
 	if !p.IsSetStatus() {
 		return TSExecuteStatementResp_Status_DEFAULT
 	}
 	return p.Status
 }
-
 var TSExecuteStatementResp_QueryId_DEFAULT int64
-
 func (p *TSExecuteStatementResp) GetQueryId() int64 {
 	if !p.IsSetQueryId() {
 		return TSExecuteStatementResp_QueryId_DEFAULT
 	}
 	return *p.QueryId
 }
-
 var TSExecuteStatementResp_Columns_DEFAULT []string
 
 func (p *TSExecuteStatementResp) GetColumns() []string {
 	return p.Columns
 }
-
 var TSExecuteStatementResp_OperationType_DEFAULT string
-
 func (p *TSExecuteStatementResp) GetOperationType() string {
 	if !p.IsSetOperationType() {
 		return TSExecuteStatementResp_OperationType_DEFAULT
 	}
 	return *p.OperationType
 }
-
 var TSExecuteStatementResp_IgnoreTimeStamp_DEFAULT bool
-
 func (p *TSExecuteStatementResp) GetIgnoreTimeStamp() bool {
 	if !p.IsSetIgnoreTimeStamp() {
 		return TSExecuteStatementResp_IgnoreTimeStamp_DEFAULT
 	}
 	return *p.IgnoreTimeStamp
 }
-
 var TSExecuteStatementResp_DataTypeList_DEFAULT []string
 
 func (p *TSExecuteStatementResp) GetDataTypeList() []string {
 	return p.DataTypeList
 }
-
 var TSExecuteStatementResp_QueryDataSet_DEFAULT *TSQueryDataSet
-
 func (p *TSExecuteStatementResp) GetQueryDataSet() *TSQueryDataSet {
 	if !p.IsSetQueryDataSet() {
 		return TSExecuteStatementResp_QueryDataSet_DEFAULT
 	}
 	return p.QueryDataSet
 }
-
 var TSExecuteStatementResp_NonAlignQueryDataSet_DEFAULT *TSQueryNonAlignDataSet
-
 func (p *TSExecuteStatementResp) GetNonAlignQueryDataSet() *TSQueryNonAlignDataSet {
 	if !p.IsSetNonAlignQueryDataSet() {
 		return TSExecuteStatementResp_NonAlignQueryDataSet_DEFAULT
 	}
 	return p.NonAlignQueryDataSet
 }
-
 var TSExecuteStatementResp_ColumnNameIndexMap_DEFAULT map[string]int32
 
 func (p *TSExecuteStatementResp) GetColumnNameIndexMap() map[string]int32 {
@@ -1075,141 +1051,139 @@
 	return p.ColumnNameIndexMap != nil
 }
 
-func (p *TSExecuteStatementResp) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSExecuteStatementResp) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetStatus bool = false
+	var issetStatus bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatus = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.BOOL {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 7:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField7(iprot); err != nil {
+				if err := p.ReadField7(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 8:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField8(iprot); err != nil {
+				if err := p.ReadField8(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 9:
 			if fieldTypeId == thrift.MAP {
-				if err := p.ReadField9(iprot); err != nil {
+				if err := p.ReadField9(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetStatus {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"))
+	if !issetStatus{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"));
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSExecuteStatementResp)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Status = &TSStatus{}
-	if err := p.Status.Read(iprot); err != nil {
+	if err := p.Status.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Status), err)
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSExecuteStatementResp)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.QueryId = &v
@@ -1217,30 +1191,30 @@
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSExecuteStatementResp)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Columns = tSlice
-	for i := 0; i < size; i++ {
-		var _elem5 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Columns =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem10 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem5 = v
+			_elem10 = v
 		}
-		p.Columns = append(p.Columns, _elem5)
+		p.Columns = append(p.Columns, _elem10)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSExecuteStatementResp)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.OperationType = &v
@@ -1248,8 +1222,8 @@
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBool(); err != nil {
+func (p *TSExecuteStatementResp)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBool(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.IgnoreTimeStamp = &v
@@ -1257,274 +1231,273 @@
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField6(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSExecuteStatementResp)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.DataTypeList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem6 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.DataTypeList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem11 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem6 = v
+			_elem11 = v
 		}
-		p.DataTypeList = append(p.DataTypeList, _elem6)
+		p.DataTypeList = append(p.DataTypeList, _elem11)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField7(iprot thrift.TProtocol) error {
+func (p *TSExecuteStatementResp)  ReadField7(ctx context.Context, iprot thrift.TProtocol) error {
 	p.QueryDataSet = &TSQueryDataSet{}
-	if err := p.QueryDataSet.Read(iprot); err != nil {
+	if err := p.QueryDataSet.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.QueryDataSet), err)
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField8(iprot thrift.TProtocol) error {
+func (p *TSExecuteStatementResp)  ReadField8(ctx context.Context, iprot thrift.TProtocol) error {
 	p.NonAlignQueryDataSet = &TSQueryNonAlignDataSet{}
-	if err := p.NonAlignQueryDataSet.Read(iprot); err != nil {
+	if err := p.NonAlignQueryDataSet.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.NonAlignQueryDataSet), err)
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementResp) ReadField9(iprot thrift.TProtocol) error {
-	_, _, size, err := iprot.ReadMapBegin()
+func (p *TSExecuteStatementResp)  ReadField9(ctx context.Context, iprot thrift.TProtocol) error {
+	_, _, size, err := iprot.ReadMapBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading map begin: ", err)
 	}
 	tMap := make(map[string]int32, size)
-	p.ColumnNameIndexMap = tMap
-	for i := 0; i < size; i++ {
-		var _key7 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.ColumnNameIndexMap =  tMap
+	for i := 0; i < size; i ++ {
+		var _key12 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_key7 = v
+			_key12 = v
 		}
-		var _val8 int32
-		if v, err := iprot.ReadI32(); err != nil {
+		var _val13 int32
+		if v, err := iprot.ReadI32(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_val8 = v
+			_val13 = v
 		}
-		p.ColumnNameIndexMap[_key7] = _val8
+		p.ColumnNameIndexMap[_key12] = _val13
 	}
-	if err := iprot.ReadMapEnd(); err != nil {
+	if err := iprot.ReadMapEnd(ctx); err != nil {
 		return thrift.PrependError("error reading map end: ", err)
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementResp) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSExecuteStatementResp"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSExecuteStatementResp) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSExecuteStatementResp"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField7(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField8(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField9(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
+		if err := p.writeField7(ctx, oprot); err != nil { return err }
+		if err := p.writeField8(ctx, oprot); err != nil { return err }
+		if err := p.writeField9(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSExecuteStatementResp) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("status", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err)
-	}
-	if err := p.Status.Write(oprot); err != nil {
+func (p *TSExecuteStatementResp) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "status", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err) }
+	if err := p.Status.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Status), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err) }
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField2(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetQueryId() {
-		if err := oprot.WriteFieldBegin("queryId", thrift.I64, 2); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err)
-		}
-		if err := oprot.WriteI64(int64(*p.QueryId)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "queryId", thrift.I64, 2); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err) }
+		if err := oprot.WriteI64(ctx, int64(*p.QueryId)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetColumns() {
-		if err := oprot.WriteFieldBegin("columns", thrift.LIST, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:columns: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.STRING, len(p.Columns)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "columns", thrift.LIST, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:columns: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Columns)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.Columns {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:columns: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:columns: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField4(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetOperationType() {
-		if err := oprot.WriteFieldBegin("operationType", thrift.STRING, 4); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:operationType: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.OperationType)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.operationType (4) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:operationType: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "operationType", thrift.STRING, 4); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:operationType: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.OperationType)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.operationType (4) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:operationType: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField5(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetIgnoreTimeStamp() {
-		if err := oprot.WriteFieldBegin("ignoreTimeStamp", thrift.BOOL, 5); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:ignoreTimeStamp: ", p), err)
-		}
-		if err := oprot.WriteBool(bool(*p.IgnoreTimeStamp)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.ignoreTimeStamp (5) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:ignoreTimeStamp: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "ignoreTimeStamp", thrift.BOOL, 5); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:ignoreTimeStamp: ", p), err) }
+		if err := oprot.WriteBool(ctx, bool(*p.IgnoreTimeStamp)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.ignoreTimeStamp (5) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:ignoreTimeStamp: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField6(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetDataTypeList() {
-		if err := oprot.WriteFieldBegin("dataTypeList", thrift.LIST, 6); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:dataTypeList: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.STRING, len(p.DataTypeList)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "dataTypeList", thrift.LIST, 6); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:dataTypeList: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.DataTypeList)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.DataTypeList {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:dataTypeList: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:dataTypeList: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField7(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField7(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetQueryDataSet() {
-		if err := oprot.WriteFieldBegin("queryDataSet", thrift.STRUCT, 7); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:queryDataSet: ", p), err)
-		}
-		if err := p.QueryDataSet.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "queryDataSet", thrift.STRUCT, 7); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:queryDataSet: ", p), err) }
+		if err := p.QueryDataSet.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.QueryDataSet), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:queryDataSet: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:queryDataSet: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField8(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField8(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetNonAlignQueryDataSet() {
-		if err := oprot.WriteFieldBegin("nonAlignQueryDataSet", thrift.STRUCT, 8); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:nonAlignQueryDataSet: ", p), err)
-		}
-		if err := p.NonAlignQueryDataSet.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "nonAlignQueryDataSet", thrift.STRUCT, 8); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:nonAlignQueryDataSet: ", p), err) }
+		if err := p.NonAlignQueryDataSet.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.NonAlignQueryDataSet), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 8:nonAlignQueryDataSet: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 8:nonAlignQueryDataSet: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementResp) writeField9(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementResp) writeField9(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetColumnNameIndexMap() {
-		if err := oprot.WriteFieldBegin("columnNameIndexMap", thrift.MAP, 9); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:columnNameIndexMap: ", p), err)
-		}
-		if err := oprot.WriteMapBegin(thrift.STRING, thrift.I32, len(p.ColumnNameIndexMap)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "columnNameIndexMap", thrift.MAP, 9); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:columnNameIndexMap: ", p), err) }
+		if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.I32, len(p.ColumnNameIndexMap)); err != nil {
 			return thrift.PrependError("error writing map begin: ", err)
 		}
 		for k, v := range p.ColumnNameIndexMap {
-			if err := oprot.WriteString(string(k)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
-			if err := oprot.WriteI32(int32(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(k)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+			if err := oprot.WriteI32(ctx, int32(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteMapEnd(); err != nil {
+		if err := oprot.WriteMapEnd(ctx); err != nil {
 			return thrift.PrependError("error writing map end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 9:columnNameIndexMap: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 9:columnNameIndexMap: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSExecuteStatementResp) Equals(other *TSExecuteStatementResp) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if !p.Status.Equals(other.Status) { return false }
+	if p.QueryId != other.QueryId {
+		if p.QueryId == nil || other.QueryId == nil {
+			return false
+		}
+		if (*p.QueryId) != (*other.QueryId) { return false }
+	}
+	if len(p.Columns) != len(other.Columns) { return false }
+	for i, _tgt := range p.Columns {
+		_src14 := other.Columns[i]
+		if _tgt != _src14 { return false }
+	}
+	if p.OperationType != other.OperationType {
+		if p.OperationType == nil || other.OperationType == nil {
+			return false
+		}
+		if (*p.OperationType) != (*other.OperationType) { return false }
+	}
+	if p.IgnoreTimeStamp != other.IgnoreTimeStamp {
+		if p.IgnoreTimeStamp == nil || other.IgnoreTimeStamp == nil {
+			return false
+		}
+		if (*p.IgnoreTimeStamp) != (*other.IgnoreTimeStamp) { return false }
+	}
+	if len(p.DataTypeList) != len(other.DataTypeList) { return false }
+	for i, _tgt := range p.DataTypeList {
+		_src15 := other.DataTypeList[i]
+		if _tgt != _src15 { return false }
+	}
+	if !p.QueryDataSet.Equals(other.QueryDataSet) { return false }
+	if !p.NonAlignQueryDataSet.Equals(other.NonAlignQueryDataSet) { return false }
+	if len(p.ColumnNameIndexMap) != len(other.ColumnNameIndexMap) { return false }
+	for k, _tgt := range p.ColumnNameIndexMap {
+		_src16 := other.ColumnNameIndexMap[k]
+		if _tgt != _src16 { return false }
+	}
+	return true
+}
+
 func (p *TSExecuteStatementResp) String() string {
 	if p == nil {
 		return "<nil>"
@@ -1538,10 +1511,10 @@
 //  - SessionId
 //  - Configuration
 type TSOpenSessionResp struct {
-	Status                *TSStatus         `thrift:"status,1,required" db:"status" json:"status"`
+	Status *TSStatus `thrift:"status,1,required" db:"status" json:"status"`
 	ServerProtocolVersion TSProtocolVersion `thrift:"serverProtocolVersion,2,required" db:"serverProtocolVersion" json:"serverProtocolVersion"`
-	SessionId             *int64            `thrift:"sessionId,3" db:"sessionId" json:"sessionId,omitempty"`
-	Configuration         map[string]string `thrift:"configuration,4" db:"configuration" json:"configuration,omitempty"`
+	SessionId *int64 `thrift:"sessionId,3" db:"sessionId" json:"sessionId,omitempty"`
+	Configuration map[string]string `thrift:"configuration,4" db:"configuration" json:"configuration,omitempty"`
 }
 
 func NewTSOpenSessionResp() *TSOpenSessionResp {
@@ -1551,7 +1524,6 @@
 }
 
 var TSOpenSessionResp_Status_DEFAULT *TSStatus
-
 func (p *TSOpenSessionResp) GetStatus() *TSStatus {
 	if !p.IsSetStatus() {
 		return TSOpenSessionResp_Status_DEFAULT
@@ -1562,16 +1534,13 @@
 func (p *TSOpenSessionResp) GetServerProtocolVersion() TSProtocolVersion {
 	return p.ServerProtocolVersion
 }
-
 var TSOpenSessionResp_SessionId_DEFAULT int64
-
 func (p *TSOpenSessionResp) GetSessionId() int64 {
 	if !p.IsSetSessionId() {
 		return TSOpenSessionResp_SessionId_DEFAULT
 	}
 	return *p.SessionId
 }
-
 var TSOpenSessionResp_Configuration_DEFAULT map[string]string
 
 func (p *TSOpenSessionResp) GetConfiguration() map[string]string {
@@ -1589,96 +1558,94 @@
 	return p.Configuration != nil
 }
 
-func (p *TSOpenSessionResp) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSOpenSessionResp) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetStatus bool = false
-	var issetServerProtocolVersion bool = false
+	var issetStatus bool = false;
+	var issetServerProtocolVersion bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatus = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetServerProtocolVersion = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.MAP {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetStatus {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"))
+	if !issetStatus{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"));
 	}
-	if !issetServerProtocolVersion {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ServerProtocolVersion is not set"))
+	if !issetServerProtocolVersion{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ServerProtocolVersion is not set"));
 	}
 	return nil
 }
 
-func (p *TSOpenSessionResp) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSOpenSessionResp)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Status = &TSStatus{}
-	if err := p.Status.Read(iprot); err != nil {
+	if err := p.Status.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Status), err)
 	}
 	return nil
 }
 
-func (p *TSOpenSessionResp) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSOpenSessionResp)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		temp := TSProtocolVersion(v)
@@ -1687,8 +1654,8 @@
 	return nil
 }
 
-func (p *TSOpenSessionResp) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSOpenSessionResp)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.SessionId = &v
@@ -1696,128 +1663,127 @@
 	return nil
 }
 
-func (p *TSOpenSessionResp) ReadField4(iprot thrift.TProtocol) error {
-	_, _, size, err := iprot.ReadMapBegin()
+func (p *TSOpenSessionResp)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	_, _, size, err := iprot.ReadMapBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading map begin: ", err)
 	}
 	tMap := make(map[string]string, size)
-	p.Configuration = tMap
-	for i := 0; i < size; i++ {
-		var _key9 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Configuration =  tMap
+	for i := 0; i < size; i ++ {
+		var _key17 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_key9 = v
+			_key17 = v
 		}
-		var _val10 string
-		if v, err := iprot.ReadString(); err != nil {
+		var _val18 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_val10 = v
+			_val18 = v
 		}
-		p.Configuration[_key9] = _val10
+		p.Configuration[_key17] = _val18
 	}
-	if err := iprot.ReadMapEnd(); err != nil {
+	if err := iprot.ReadMapEnd(ctx); err != nil {
 		return thrift.PrependError("error reading map end: ", err)
 	}
 	return nil
 }
 
-func (p *TSOpenSessionResp) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSOpenSessionResp"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSOpenSessionResp) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSOpenSessionResp"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSOpenSessionResp) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("status", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err)
-	}
-	if err := p.Status.Write(oprot); err != nil {
+func (p *TSOpenSessionResp) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "status", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err) }
+	if err := p.Status.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Status), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err) }
 	return err
 }
 
-func (p *TSOpenSessionResp) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("serverProtocolVersion", thrift.I32, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:serverProtocolVersion: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.ServerProtocolVersion)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.serverProtocolVersion (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:serverProtocolVersion: ", p), err)
-	}
+func (p *TSOpenSessionResp) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "serverProtocolVersion", thrift.I32, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:serverProtocolVersion: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.ServerProtocolVersion)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.serverProtocolVersion (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:serverProtocolVersion: ", p), err) }
 	return err
 }
 
-func (p *TSOpenSessionResp) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSOpenSessionResp) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSessionId() {
-		if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:sessionId: ", p), err)
-		}
-		if err := oprot.WriteI64(int64(*p.SessionId)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.sessionId (3) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:sessionId: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:sessionId: ", p), err) }
+		if err := oprot.WriteI64(ctx, int64(*p.SessionId)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.sessionId (3) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:sessionId: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSOpenSessionResp) writeField4(oprot thrift.TProtocol) (err error) {
+func (p *TSOpenSessionResp) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetConfiguration() {
-		if err := oprot.WriteFieldBegin("configuration", thrift.MAP, 4); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:configuration: ", p), err)
-		}
-		if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Configuration)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "configuration", thrift.MAP, 4); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:configuration: ", p), err) }
+		if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(p.Configuration)); err != nil {
 			return thrift.PrependError("error writing map begin: ", err)
 		}
 		for k, v := range p.Configuration {
-			if err := oprot.WriteString(string(k)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(k)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteMapEnd(); err != nil {
+		if err := oprot.WriteMapEnd(ctx); err != nil {
 			return thrift.PrependError("error writing map end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:configuration: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:configuration: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSOpenSessionResp) Equals(other *TSOpenSessionResp) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if !p.Status.Equals(other.Status) { return false }
+	if p.ServerProtocolVersion != other.ServerProtocolVersion { return false }
+	if p.SessionId != other.SessionId {
+		if p.SessionId == nil || other.SessionId == nil {
+			return false
+		}
+		if (*p.SessionId) != (*other.SessionId) { return false }
+	}
+	if len(p.Configuration) != len(other.Configuration) { return false }
+	for k, _tgt := range p.Configuration {
+		_src19 := other.Configuration[k]
+		if _tgt != _src19 { return false }
+	}
+	return true
+}
+
 func (p *TSOpenSessionResp) String() string {
 	if p == nil {
 		return "<nil>"
@@ -1833,10 +1799,10 @@
 //  - Configuration
 type TSOpenSessionReq struct {
 	ClientProtocol TSProtocolVersion `thrift:"client_protocol,1,required" db:"client_protocol" json:"client_protocol"`
-	ZoneId         string            `thrift:"zoneId,2,required" db:"zoneId" json:"zoneId"`
-	Username       *string           `thrift:"username,3" db:"username" json:"username,omitempty"`
-	Password       *string           `thrift:"password,4" db:"password" json:"password,omitempty"`
-	Configuration  map[string]string `thrift:"configuration,5" db:"configuration" json:"configuration,omitempty"`
+	ZoneId string `thrift:"zoneId,2,required" db:"zoneId" json:"zoneId"`
+	Username *string `thrift:"username,3" db:"username" json:"username,omitempty"`
+	Password *string `thrift:"password,4" db:"password" json:"password,omitempty"`
+	Configuration map[string]string `thrift:"configuration,5" db:"configuration" json:"configuration,omitempty"`
 }
 
 func NewTSOpenSessionReq() *TSOpenSessionReq {
@@ -1845,6 +1811,7 @@
 	}
 }
 
+
 func (p *TSOpenSessionReq) GetClientProtocol() TSProtocolVersion {
 	return p.ClientProtocol
 }
@@ -1852,25 +1819,20 @@
 func (p *TSOpenSessionReq) GetZoneId() string {
 	return p.ZoneId
 }
-
 var TSOpenSessionReq_Username_DEFAULT string
-
 func (p *TSOpenSessionReq) GetUsername() string {
 	if !p.IsSetUsername() {
 		return TSOpenSessionReq_Username_DEFAULT
 	}
 	return *p.Username
 }
-
 var TSOpenSessionReq_Password_DEFAULT string
-
 func (p *TSOpenSessionReq) GetPassword() string {
 	if !p.IsSetPassword() {
 		return TSOpenSessionReq_Password_DEFAULT
 	}
 	return *p.Password
 }
-
 var TSOpenSessionReq_Configuration_DEFAULT map[string]string
 
 func (p *TSOpenSessionReq) GetConfiguration() map[string]string {
@@ -1888,98 +1850,96 @@
 	return p.Configuration != nil
 }
 
-func (p *TSOpenSessionReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSOpenSessionReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetClientProtocol bool = false
-	var issetZoneId bool = false
+	var issetClientProtocol bool = false;
+	var issetZoneId bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetClientProtocol = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetZoneId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.MAP {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetClientProtocol {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ClientProtocol is not set"))
+	if !issetClientProtocol{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ClientProtocol is not set"));
 	}
-	if !issetZoneId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ZoneId is not set"))
+	if !issetZoneId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ZoneId is not set"));
 	}
 	return nil
 }
 
-func (p *TSOpenSessionReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSOpenSessionReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		temp := TSProtocolVersion(v)
@@ -1988,8 +1948,8 @@
 	return nil
 }
 
-func (p *TSOpenSessionReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSOpenSessionReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.ZoneId = v
@@ -1997,8 +1957,8 @@
 	return nil
 }
 
-func (p *TSOpenSessionReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSOpenSessionReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.Username = &v
@@ -2006,8 +1966,8 @@
 	return nil
 }
 
-func (p *TSOpenSessionReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSOpenSessionReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.Password = &v
@@ -2015,146 +1975,145 @@
 	return nil
 }
 
-func (p *TSOpenSessionReq) ReadField5(iprot thrift.TProtocol) error {
-	_, _, size, err := iprot.ReadMapBegin()
+func (p *TSOpenSessionReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	_, _, size, err := iprot.ReadMapBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading map begin: ", err)
 	}
 	tMap := make(map[string]string, size)
-	p.Configuration = tMap
-	for i := 0; i < size; i++ {
-		var _key11 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Configuration =  tMap
+	for i := 0; i < size; i ++ {
+		var _key20 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_key11 = v
+			_key20 = v
 		}
-		var _val12 string
-		if v, err := iprot.ReadString(); err != nil {
+		var _val21 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_val12 = v
+			_val21 = v
 		}
-		p.Configuration[_key11] = _val12
+		p.Configuration[_key20] = _val21
 	}
-	if err := iprot.ReadMapEnd(); err != nil {
+	if err := iprot.ReadMapEnd(ctx); err != nil {
 		return thrift.PrependError("error reading map end: ", err)
 	}
 	return nil
 }
 
-func (p *TSOpenSessionReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSOpenSessionReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSOpenSessionReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSOpenSessionReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSOpenSessionReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("client_protocol", thrift.I32, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:client_protocol: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.ClientProtocol)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.client_protocol (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:client_protocol: ", p), err)
-	}
+func (p *TSOpenSessionReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "client_protocol", thrift.I32, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:client_protocol: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.ClientProtocol)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.client_protocol (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:client_protocol: ", p), err) }
 	return err
 }
 
-func (p *TSOpenSessionReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("zoneId", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:zoneId: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.ZoneId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.zoneId (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:zoneId: ", p), err)
-	}
+func (p *TSOpenSessionReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "zoneId", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:zoneId: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.ZoneId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.zoneId (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:zoneId: ", p), err) }
 	return err
 }
 
-func (p *TSOpenSessionReq) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSOpenSessionReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetUsername() {
-		if err := oprot.WriteFieldBegin("username", thrift.STRING, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:username: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.Username)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.username (3) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:username: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "username", thrift.STRING, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:username: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.Username)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.username (3) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:username: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSOpenSessionReq) writeField4(oprot thrift.TProtocol) (err error) {
+func (p *TSOpenSessionReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetPassword() {
-		if err := oprot.WriteFieldBegin("password", thrift.STRING, 4); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:password: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.Password)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.password (4) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:password: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "password", thrift.STRING, 4); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:password: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.Password)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.password (4) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:password: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSOpenSessionReq) writeField5(oprot thrift.TProtocol) (err error) {
+func (p *TSOpenSessionReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetConfiguration() {
-		if err := oprot.WriteFieldBegin("configuration", thrift.MAP, 5); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:configuration: ", p), err)
-		}
-		if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Configuration)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "configuration", thrift.MAP, 5); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:configuration: ", p), err) }
+		if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(p.Configuration)); err != nil {
 			return thrift.PrependError("error writing map begin: ", err)
 		}
 		for k, v := range p.Configuration {
-			if err := oprot.WriteString(string(k)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(k)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteMapEnd(); err != nil {
+		if err := oprot.WriteMapEnd(ctx); err != nil {
 			return thrift.PrependError("error writing map end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:configuration: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:configuration: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSOpenSessionReq) Equals(other *TSOpenSessionReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.ClientProtocol != other.ClientProtocol { return false }
+	if p.ZoneId != other.ZoneId { return false }
+	if p.Username != other.Username {
+		if p.Username == nil || other.Username == nil {
+			return false
+		}
+		if (*p.Username) != (*other.Username) { return false }
+	}
+	if p.Password != other.Password {
+		if p.Password == nil || other.Password == nil {
+			return false
+		}
+		if (*p.Password) != (*other.Password) { return false }
+	}
+	if len(p.Configuration) != len(other.Configuration) { return false }
+	for k, _tgt := range p.Configuration {
+		_src22 := other.Configuration[k]
+		if _tgt != _src22 { return false }
+	}
+	return true
+}
+
 func (p *TSOpenSessionReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -2172,56 +2131,55 @@
 	return &TSCloseSessionReq{}
 }
 
+
 func (p *TSCloseSessionReq) GetSessionId() int64 {
 	return p.SessionId
 }
-func (p *TSCloseSessionReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSCloseSessionReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
+	var issetSessionId bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
 	return nil
 }
 
-func (p *TSCloseSessionReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCloseSessionReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -2229,37 +2187,39 @@
 	return nil
 }
 
-func (p *TSCloseSessionReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSCloseSessionReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSCloseSessionReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSCloseSessionReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSCloseSessionReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSCloseSessionReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
+func (p *TSCloseSessionReq) Equals(other *TSCloseSessionReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	return true
+}
+
 func (p *TSCloseSessionReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -2275,18 +2235,19 @@
 //  - Timeout
 //  - EnableRedirectQuery
 type TSExecuteStatementReq struct {
-	SessionId           int64  `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	Statement           string `thrift:"statement,2,required" db:"statement" json:"statement"`
-	StatementId         int64  `thrift:"statementId,3,required" db:"statementId" json:"statementId"`
-	FetchSize           *int32 `thrift:"fetchSize,4" db:"fetchSize" json:"fetchSize,omitempty"`
-	Timeout             *int64 `thrift:"timeout,5" db:"timeout" json:"timeout,omitempty"`
-	EnableRedirectQuery *bool  `thrift:"enableRedirectQuery,6" db:"enableRedirectQuery" json:"enableRedirectQuery,omitempty"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	Statement string `thrift:"statement,2,required" db:"statement" json:"statement"`
+	StatementId int64 `thrift:"statementId,3,required" db:"statementId" json:"statementId"`
+	FetchSize *int32 `thrift:"fetchSize,4" db:"fetchSize" json:"fetchSize,omitempty"`
+	Timeout *int64 `thrift:"timeout,5" db:"timeout" json:"timeout,omitempty"`
+	EnableRedirectQuery *bool `thrift:"enableRedirectQuery,6" db:"enableRedirectQuery" json:"enableRedirectQuery,omitempty"`
 }
 
 func NewTSExecuteStatementReq() *TSExecuteStatementReq {
 	return &TSExecuteStatementReq{}
 }
 
+
 func (p *TSExecuteStatementReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -2298,27 +2259,21 @@
 func (p *TSExecuteStatementReq) GetStatementId() int64 {
 	return p.StatementId
 }
-
 var TSExecuteStatementReq_FetchSize_DEFAULT int32
-
 func (p *TSExecuteStatementReq) GetFetchSize() int32 {
 	if !p.IsSetFetchSize() {
 		return TSExecuteStatementReq_FetchSize_DEFAULT
 	}
 	return *p.FetchSize
 }
-
 var TSExecuteStatementReq_Timeout_DEFAULT int64
-
 func (p *TSExecuteStatementReq) GetTimeout() int64 {
 	if !p.IsSetTimeout() {
 		return TSExecuteStatementReq_Timeout_DEFAULT
 	}
 	return *p.Timeout
 }
-
 var TSExecuteStatementReq_EnableRedirectQuery_DEFAULT bool
-
 func (p *TSExecuteStatementReq) GetEnableRedirectQuery() bool {
 	if !p.IsSetEnableRedirectQuery() {
 		return TSExecuteStatementReq_EnableRedirectQuery_DEFAULT
@@ -2337,113 +2292,111 @@
 	return p.EnableRedirectQuery != nil
 }
 
-func (p *TSExecuteStatementReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSExecuteStatementReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetStatement bool = false
-	var issetStatementId bool = false
+	var issetSessionId bool = false;
+	var issetStatement bool = false;
+	var issetStatementId bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatement = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatementId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.BOOL {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetStatement {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Statement is not set"))
+	if !issetStatement{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Statement is not set"));
 	}
-	if !issetStatementId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StatementId is not set"))
+	if !issetStatementId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StatementId is not set"));
 	}
 	return nil
 }
 
-func (p *TSExecuteStatementReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSExecuteStatementReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -2451,8 +2404,8 @@
 	return nil
 }
 
-func (p *TSExecuteStatementReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSExecuteStatementReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.Statement = v
@@ -2460,8 +2413,8 @@
 	return nil
 }
 
-func (p *TSExecuteStatementReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSExecuteStatementReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.StatementId = v
@@ -2469,8 +2422,8 @@
 	return nil
 }
 
-func (p *TSExecuteStatementReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSExecuteStatementReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.FetchSize = &v
@@ -2478,8 +2431,8 @@
 	return nil
 }
 
-func (p *TSExecuteStatementReq) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSExecuteStatementReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.Timeout = &v
@@ -2487,8 +2440,8 @@
 	return nil
 }
 
-func (p *TSExecuteStatementReq) ReadField6(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBool(); err != nil {
+func (p *TSExecuteStatementReq)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBool(ctx); err != nil {
 		return thrift.PrependError("error reading field 6: ", err)
 	} else {
 		p.EnableRedirectQuery = &v
@@ -2496,123 +2449,120 @@
 	return nil
 }
 
-func (p *TSExecuteStatementReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSExecuteStatementReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSExecuteStatementReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSExecuteStatementReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSExecuteStatementReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSExecuteStatementReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSExecuteStatementReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("statement", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:statement: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.Statement)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.statement (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:statement: ", p), err)
-	}
+func (p *TSExecuteStatementReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "statement", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:statement: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.Statement)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.statement (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:statement: ", p), err) }
 	return err
 }
 
-func (p *TSExecuteStatementReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("statementId", thrift.I64, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:statementId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.StatementId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.statementId (3) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:statementId: ", p), err)
-	}
+func (p *TSExecuteStatementReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "statementId", thrift.I64, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:statementId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.StatementId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.statementId (3) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:statementId: ", p), err) }
 	return err
 }
 
-func (p *TSExecuteStatementReq) writeField4(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetFetchSize() {
-		if err := oprot.WriteFieldBegin("fetchSize", thrift.I32, 4); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:fetchSize: ", p), err)
-		}
-		if err := oprot.WriteI32(int32(*p.FetchSize)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.fetchSize (4) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:fetchSize: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "fetchSize", thrift.I32, 4); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:fetchSize: ", p), err) }
+		if err := oprot.WriteI32(ctx, int32(*p.FetchSize)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.fetchSize (4) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:fetchSize: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementReq) writeField5(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetTimeout() {
-		if err := oprot.WriteFieldBegin("timeout", thrift.I64, 5); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timeout: ", p), err)
-		}
-		if err := oprot.WriteI64(int64(*p.Timeout)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.timeout (5) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timeout: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "timeout", thrift.I64, 5); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timeout: ", p), err) }
+		if err := oprot.WriteI64(ctx, int64(*p.Timeout)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.timeout (5) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timeout: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSExecuteStatementReq) writeField6(oprot thrift.TProtocol) (err error) {
+func (p *TSExecuteStatementReq) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetEnableRedirectQuery() {
-		if err := oprot.WriteFieldBegin("enableRedirectQuery", thrift.BOOL, 6); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:enableRedirectQuery: ", p), err)
-		}
-		if err := oprot.WriteBool(bool(*p.EnableRedirectQuery)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.enableRedirectQuery (6) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:enableRedirectQuery: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "enableRedirectQuery", thrift.BOOL, 6); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:enableRedirectQuery: ", p), err) }
+		if err := oprot.WriteBool(ctx, bool(*p.EnableRedirectQuery)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.enableRedirectQuery (6) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:enableRedirectQuery: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSExecuteStatementReq) Equals(other *TSExecuteStatementReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.Statement != other.Statement { return false }
+	if p.StatementId != other.StatementId { return false }
+	if p.FetchSize != other.FetchSize {
+		if p.FetchSize == nil || other.FetchSize == nil {
+			return false
+		}
+		if (*p.FetchSize) != (*other.FetchSize) { return false }
+	}
+	if p.Timeout != other.Timeout {
+		if p.Timeout == nil || other.Timeout == nil {
+			return false
+		}
+		if (*p.Timeout) != (*other.Timeout) { return false }
+	}
+	if p.EnableRedirectQuery != other.EnableRedirectQuery {
+		if p.EnableRedirectQuery == nil || other.EnableRedirectQuery == nil {
+			return false
+		}
+		if (*p.EnableRedirectQuery) != (*other.EnableRedirectQuery) { return false }
+	}
+	return true
+}
+
 func (p *TSExecuteStatementReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -2624,7 +2574,7 @@
 //  - SessionId
 //  - Statements
 type TSExecuteBatchStatementReq struct {
-	SessionId  int64    `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
 	Statements []string `thrift:"statements,2,required" db:"statements" json:"statements"`
 }
 
@@ -2632,6 +2582,7 @@
 	return &TSExecuteBatchStatementReq{}
 }
 
+
 func (p *TSExecuteBatchStatementReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -2639,68 +2590,66 @@
 func (p *TSExecuteBatchStatementReq) GetStatements() []string {
 	return p.Statements
 }
-func (p *TSExecuteBatchStatementReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSExecuteBatchStatementReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetStatements bool = false
+	var issetSessionId bool = false;
+	var issetStatements bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatements = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetStatements {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Statements is not set"))
+	if !issetStatements{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Statements is not set"));
 	}
 	return nil
 }
 
-func (p *TSExecuteBatchStatementReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSExecuteBatchStatementReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -2708,83 +2657,85 @@
 	return nil
 }
 
-func (p *TSExecuteBatchStatementReq) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSExecuteBatchStatementReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Statements = tSlice
-	for i := 0; i < size; i++ {
-		var _elem13 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Statements =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem23 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem13 = v
+			_elem23 = v
 		}
-		p.Statements = append(p.Statements, _elem13)
+		p.Statements = append(p.Statements, _elem23)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSExecuteBatchStatementReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSExecuteBatchStatementReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSExecuteBatchStatementReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSExecuteBatchStatementReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSExecuteBatchStatementReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSExecuteBatchStatementReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSExecuteBatchStatementReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("statements", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:statements: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Statements)); err != nil {
+func (p *TSExecuteBatchStatementReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "statements", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:statements: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Statements)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Statements {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:statements: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:statements: ", p), err) }
 	return err
 }
 
+func (p *TSExecuteBatchStatementReq) Equals(other *TSExecuteBatchStatementReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if len(p.Statements) != len(other.Statements) { return false }
+	for i, _tgt := range p.Statements {
+		_src24 := other.Statements[i]
+		if _tgt != _src24 { return false }
+	}
+	return true
+}
+
 func (p *TSExecuteBatchStatementReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -2797,13 +2748,14 @@
 //  - QueryId
 type TSGetOperationStatusReq struct {
 	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	QueryId   int64 `thrift:"queryId,2,required" db:"queryId" json:"queryId"`
+	QueryId int64 `thrift:"queryId,2,required" db:"queryId" json:"queryId"`
 }
 
 func NewTSGetOperationStatusReq() *TSGetOperationStatusReq {
 	return &TSGetOperationStatusReq{}
 }
 
+
 func (p *TSGetOperationStatusReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -2811,68 +2763,66 @@
 func (p *TSGetOperationStatusReq) GetQueryId() int64 {
 	return p.QueryId
 }
-func (p *TSGetOperationStatusReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSGetOperationStatusReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetQueryId bool = false
+	var issetSessionId bool = false;
+	var issetQueryId bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetQueryId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetQueryId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field QueryId is not set"))
+	if !issetQueryId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field QueryId is not set"));
 	}
 	return nil
 }
 
-func (p *TSGetOperationStatusReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSGetOperationStatusReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -2880,8 +2830,8 @@
 	return nil
 }
 
-func (p *TSGetOperationStatusReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSGetOperationStatusReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.QueryId = v
@@ -2889,53 +2839,51 @@
 	return nil
 }
 
-func (p *TSGetOperationStatusReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSGetOperationStatusReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSGetOperationStatusReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSGetOperationStatusReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSGetOperationStatusReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSGetOperationStatusReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSGetOperationStatusReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("queryId", thrift.I64, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.QueryId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err)
-	}
+func (p *TSGetOperationStatusReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "queryId", thrift.I64, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.QueryId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err) }
 	return err
 }
 
+func (p *TSGetOperationStatusReq) Equals(other *TSGetOperationStatusReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.QueryId != other.QueryId { return false }
+	return true
+}
+
 func (p *TSGetOperationStatusReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -2948,13 +2896,14 @@
 //  - QueryId
 type TSCancelOperationReq struct {
 	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	QueryId   int64 `thrift:"queryId,2,required" db:"queryId" json:"queryId"`
+	QueryId int64 `thrift:"queryId,2,required" db:"queryId" json:"queryId"`
 }
 
 func NewTSCancelOperationReq() *TSCancelOperationReq {
 	return &TSCancelOperationReq{}
 }
 
+
 func (p *TSCancelOperationReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -2962,68 +2911,66 @@
 func (p *TSCancelOperationReq) GetQueryId() int64 {
 	return p.QueryId
 }
-func (p *TSCancelOperationReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSCancelOperationReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetQueryId bool = false
+	var issetSessionId bool = false;
+	var issetQueryId bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetQueryId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetQueryId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field QueryId is not set"))
+	if !issetQueryId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field QueryId is not set"));
 	}
 	return nil
 }
 
-func (p *TSCancelOperationReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCancelOperationReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -3031,8 +2978,8 @@
 	return nil
 }
 
-func (p *TSCancelOperationReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCancelOperationReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.QueryId = v
@@ -3040,53 +2987,51 @@
 	return nil
 }
 
-func (p *TSCancelOperationReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSCancelOperationReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSCancelOperationReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSCancelOperationReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSCancelOperationReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSCancelOperationReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSCancelOperationReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("queryId", thrift.I64, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.QueryId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err)
-	}
+func (p *TSCancelOperationReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "queryId", thrift.I64, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.QueryId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err) }
 	return err
 }
 
+func (p *TSCancelOperationReq) Equals(other *TSCancelOperationReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.QueryId != other.QueryId { return false }
+	return true
+}
+
 func (p *TSCancelOperationReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -3099,8 +3044,8 @@
 //  - QueryId
 //  - StatementId
 type TSCloseOperationReq struct {
-	SessionId   int64  `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	QueryId     *int64 `thrift:"queryId,2" db:"queryId" json:"queryId,omitempty"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	QueryId *int64 `thrift:"queryId,2" db:"queryId" json:"queryId,omitempty"`
 	StatementId *int64 `thrift:"statementId,3" db:"statementId" json:"statementId,omitempty"`
 }
 
@@ -3108,21 +3053,18 @@
 	return &TSCloseOperationReq{}
 }
 
+
 func (p *TSCloseOperationReq) GetSessionId() int64 {
 	return p.SessionId
 }
-
 var TSCloseOperationReq_QueryId_DEFAULT int64
-
 func (p *TSCloseOperationReq) GetQueryId() int64 {
 	if !p.IsSetQueryId() {
 		return TSCloseOperationReq_QueryId_DEFAULT
 	}
 	return *p.QueryId
 }
-
 var TSCloseOperationReq_StatementId_DEFAULT int64
-
 func (p *TSCloseOperationReq) GetStatementId() int64 {
 	if !p.IsSetStatementId() {
 		return TSCloseOperationReq_StatementId_DEFAULT
@@ -3137,73 +3079,71 @@
 	return p.StatementId != nil
 }
 
-func (p *TSCloseOperationReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSCloseOperationReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
+	var issetSessionId bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
 	return nil
 }
 
-func (p *TSCloseOperationReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCloseOperationReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -3211,8 +3151,8 @@
 	return nil
 }
 
-func (p *TSCloseOperationReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCloseOperationReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.QueryId = &v
@@ -3220,8 +3160,8 @@
 	return nil
 }
 
-func (p *TSCloseOperationReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCloseOperationReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.StatementId = &v
@@ -3229,73 +3169,77 @@
 	return nil
 }
 
-func (p *TSCloseOperationReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSCloseOperationReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSCloseOperationReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSCloseOperationReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSCloseOperationReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSCloseOperationReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSCloseOperationReq) writeField2(oprot thrift.TProtocol) (err error) {
+func (p *TSCloseOperationReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetQueryId() {
-		if err := oprot.WriteFieldBegin("queryId", thrift.I64, 2); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err)
-		}
-		if err := oprot.WriteI64(int64(*p.QueryId)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "queryId", thrift.I64, 2); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:queryId: ", p), err) }
+		if err := oprot.WriteI64(ctx, int64(*p.QueryId)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.queryId (2) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:queryId: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSCloseOperationReq) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSCloseOperationReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetStatementId() {
-		if err := oprot.WriteFieldBegin("statementId", thrift.I64, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:statementId: ", p), err)
-		}
-		if err := oprot.WriteI64(int64(*p.StatementId)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.statementId (3) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:statementId: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "statementId", thrift.I64, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:statementId: ", p), err) }
+		if err := oprot.WriteI64(ctx, int64(*p.StatementId)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.statementId (3) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:statementId: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSCloseOperationReq) Equals(other *TSCloseOperationReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.QueryId != other.QueryId {
+		if p.QueryId == nil || other.QueryId == nil {
+			return false
+		}
+		if (*p.QueryId) != (*other.QueryId) { return false }
+	}
+	if p.StatementId != other.StatementId {
+		if p.StatementId == nil || other.StatementId == nil {
+			return false
+		}
+		if (*p.StatementId) != (*other.StatementId) { return false }
+	}
+	return true
+}
+
 func (p *TSCloseOperationReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -3311,18 +3255,19 @@
 //  - IsAlign
 //  - Timeout
 type TSFetchResultsReq struct {
-	SessionId int64  `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
 	Statement string `thrift:"statement,2,required" db:"statement" json:"statement"`
-	FetchSize int32  `thrift:"fetchSize,3,required" db:"fetchSize" json:"fetchSize"`
-	QueryId   int64  `thrift:"queryId,4,required" db:"queryId" json:"queryId"`
-	IsAlign   bool   `thrift:"isAlign,5,required" db:"isAlign" json:"isAlign"`
-	Timeout   *int64 `thrift:"timeout,6" db:"timeout" json:"timeout,omitempty"`
+	FetchSize int32 `thrift:"fetchSize,3,required" db:"fetchSize" json:"fetchSize"`
+	QueryId int64 `thrift:"queryId,4,required" db:"queryId" json:"queryId"`
+	IsAlign bool `thrift:"isAlign,5,required" db:"isAlign" json:"isAlign"`
+	Timeout *int64 `thrift:"timeout,6" db:"timeout" json:"timeout,omitempty"`
 }
 
 func NewTSFetchResultsReq() *TSFetchResultsReq {
 	return &TSFetchResultsReq{}
 }
 
+
 func (p *TSFetchResultsReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -3342,9 +3287,7 @@
 func (p *TSFetchResultsReq) GetIsAlign() bool {
 	return p.IsAlign
 }
-
 var TSFetchResultsReq_Timeout_DEFAULT int64
-
 func (p *TSFetchResultsReq) GetTimeout() int64 {
 	if !p.IsSetTimeout() {
 		return TSFetchResultsReq_Timeout_DEFAULT
@@ -3355,123 +3298,121 @@
 	return p.Timeout != nil
 }
 
-func (p *TSFetchResultsReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSFetchResultsReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetStatement bool = false
-	var issetFetchSize bool = false
-	var issetQueryId bool = false
-	var issetIsAlign bool = false
+	var issetSessionId bool = false;
+	var issetStatement bool = false;
+	var issetFetchSize bool = false;
+	var issetQueryId bool = false;
+	var issetIsAlign bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatement = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetFetchSize = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetQueryId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.BOOL {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetIsAlign = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetStatement {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Statement is not set"))
+	if !issetStatement{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Statement is not set"));
 	}
-	if !issetFetchSize {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field FetchSize is not set"))
+	if !issetFetchSize{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field FetchSize is not set"));
 	}
-	if !issetQueryId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field QueryId is not set"))
+	if !issetQueryId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field QueryId is not set"));
 	}
-	if !issetIsAlign {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field IsAlign is not set"))
+	if !issetIsAlign{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field IsAlign is not set"));
 	}
 	return nil
 }
 
-func (p *TSFetchResultsReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSFetchResultsReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -3479,8 +3420,8 @@
 	return nil
 }
 
-func (p *TSFetchResultsReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSFetchResultsReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.Statement = v
@@ -3488,8 +3429,8 @@
 	return nil
 }
 
-func (p *TSFetchResultsReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSFetchResultsReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.FetchSize = v
@@ -3497,8 +3438,8 @@
 	return nil
 }
 
-func (p *TSFetchResultsReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSFetchResultsReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.QueryId = v
@@ -3506,8 +3447,8 @@
 	return nil
 }
 
-func (p *TSFetchResultsReq) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBool(); err != nil {
+func (p *TSFetchResultsReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBool(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.IsAlign = v
@@ -3515,8 +3456,8 @@
 	return nil
 }
 
-func (p *TSFetchResultsReq) ReadField6(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSFetchResultsReq)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 6: ", err)
 	} else {
 		p.Timeout = &v
@@ -3524,119 +3465,106 @@
 	return nil
 }
 
-func (p *TSFetchResultsReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSFetchResultsReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSFetchResultsReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSFetchResultsReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSFetchResultsReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSFetchResultsReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("statement", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:statement: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.Statement)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.statement (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:statement: ", p), err)
-	}
+func (p *TSFetchResultsReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "statement", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:statement: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.Statement)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.statement (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:statement: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("fetchSize", thrift.I32, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:fetchSize: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.FetchSize)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.fetchSize (3) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:fetchSize: ", p), err)
-	}
+func (p *TSFetchResultsReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "fetchSize", thrift.I32, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:fetchSize: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.FetchSize)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.fetchSize (3) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:fetchSize: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("queryId", thrift.I64, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:queryId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.QueryId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.queryId (4) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:queryId: ", p), err)
-	}
+func (p *TSFetchResultsReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "queryId", thrift.I64, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:queryId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.QueryId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.queryId (4) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:queryId: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("isAlign", thrift.BOOL, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:isAlign: ", p), err)
-	}
-	if err := oprot.WriteBool(bool(p.IsAlign)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.isAlign (5) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:isAlign: ", p), err)
-	}
+func (p *TSFetchResultsReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "isAlign", thrift.BOOL, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:isAlign: ", p), err) }
+	if err := oprot.WriteBool(ctx, bool(p.IsAlign)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.isAlign (5) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:isAlign: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsReq) writeField6(oprot thrift.TProtocol) (err error) {
+func (p *TSFetchResultsReq) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetTimeout() {
-		if err := oprot.WriteFieldBegin("timeout", thrift.I64, 6); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:timeout: ", p), err)
-		}
-		if err := oprot.WriteI64(int64(*p.Timeout)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.timeout (6) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:timeout: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "timeout", thrift.I64, 6); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:timeout: ", p), err) }
+		if err := oprot.WriteI64(ctx, int64(*p.Timeout)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.timeout (6) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:timeout: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSFetchResultsReq) Equals(other *TSFetchResultsReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.Statement != other.Statement { return false }
+	if p.FetchSize != other.FetchSize { return false }
+	if p.QueryId != other.QueryId { return false }
+	if p.IsAlign != other.IsAlign { return false }
+	if p.Timeout != other.Timeout {
+		if p.Timeout == nil || other.Timeout == nil {
+			return false
+		}
+		if (*p.Timeout) != (*other.Timeout) { return false }
+	}
+	return true
+}
+
 func (p *TSFetchResultsReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -3651,10 +3579,10 @@
 //  - QueryDataSet
 //  - NonAlignQueryDataSet
 type TSFetchResultsResp struct {
-	Status               *TSStatus               `thrift:"status,1,required" db:"status" json:"status"`
-	HasResultSet         bool                    `thrift:"hasResultSet,2,required" db:"hasResultSet" json:"hasResultSet"`
-	IsAlign              bool                    `thrift:"isAlign,3,required" db:"isAlign" json:"isAlign"`
-	QueryDataSet         *TSQueryDataSet         `thrift:"queryDataSet,4" db:"queryDataSet" json:"queryDataSet,omitempty"`
+	Status *TSStatus `thrift:"status,1,required" db:"status" json:"status"`
+	HasResultSet bool `thrift:"hasResultSet,2,required" db:"hasResultSet" json:"hasResultSet"`
+	IsAlign bool `thrift:"isAlign,3,required" db:"isAlign" json:"isAlign"`
+	QueryDataSet *TSQueryDataSet `thrift:"queryDataSet,4" db:"queryDataSet" json:"queryDataSet,omitempty"`
 	NonAlignQueryDataSet *TSQueryNonAlignDataSet `thrift:"nonAlignQueryDataSet,5" db:"nonAlignQueryDataSet" json:"nonAlignQueryDataSet,omitempty"`
 }
 
@@ -3663,7 +3591,6 @@
 }
 
 var TSFetchResultsResp_Status_DEFAULT *TSStatus
-
 func (p *TSFetchResultsResp) GetStatus() *TSStatus {
 	if !p.IsSetStatus() {
 		return TSFetchResultsResp_Status_DEFAULT
@@ -3678,18 +3605,14 @@
 func (p *TSFetchResultsResp) GetIsAlign() bool {
 	return p.IsAlign
 }
-
 var TSFetchResultsResp_QueryDataSet_DEFAULT *TSQueryDataSet
-
 func (p *TSFetchResultsResp) GetQueryDataSet() *TSQueryDataSet {
 	if !p.IsSetQueryDataSet() {
 		return TSFetchResultsResp_QueryDataSet_DEFAULT
 	}
 	return p.QueryDataSet
 }
-
 var TSFetchResultsResp_NonAlignQueryDataSet_DEFAULT *TSQueryNonAlignDataSet
-
 func (p *TSFetchResultsResp) GetNonAlignQueryDataSet() *TSQueryNonAlignDataSet {
 	if !p.IsSetNonAlignQueryDataSet() {
 		return TSFetchResultsResp_NonAlignQueryDataSet_DEFAULT
@@ -3708,111 +3631,109 @@
 	return p.NonAlignQueryDataSet != nil
 }
 
-func (p *TSFetchResultsResp) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSFetchResultsResp) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetStatus bool = false
-	var issetHasResultSet bool = false
-	var issetIsAlign bool = false
+	var issetStatus bool = false;
+	var issetHasResultSet bool = false;
+	var issetIsAlign bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatus = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.BOOL {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetHasResultSet = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.BOOL {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetIsAlign = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetStatus {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"))
+	if !issetStatus{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"));
 	}
-	if !issetHasResultSet {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field HasResultSet is not set"))
+	if !issetHasResultSet{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field HasResultSet is not set"));
 	}
-	if !issetIsAlign {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field IsAlign is not set"))
+	if !issetIsAlign{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field IsAlign is not set"));
 	}
 	return nil
 }
 
-func (p *TSFetchResultsResp) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSFetchResultsResp)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Status = &TSStatus{}
-	if err := p.Status.Read(iprot); err != nil {
+	if err := p.Status.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Status), err)
 	}
 	return nil
 }
 
-func (p *TSFetchResultsResp) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBool(); err != nil {
+func (p *TSFetchResultsResp)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBool(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.HasResultSet = v
@@ -3820,8 +3741,8 @@
 	return nil
 }
 
-func (p *TSFetchResultsResp) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBool(); err != nil {
+func (p *TSFetchResultsResp)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBool(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.IsAlign = v
@@ -3829,121 +3750,110 @@
 	return nil
 }
 
-func (p *TSFetchResultsResp) ReadField4(iprot thrift.TProtocol) error {
+func (p *TSFetchResultsResp)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
 	p.QueryDataSet = &TSQueryDataSet{}
-	if err := p.QueryDataSet.Read(iprot); err != nil {
+	if err := p.QueryDataSet.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.QueryDataSet), err)
 	}
 	return nil
 }
 
-func (p *TSFetchResultsResp) ReadField5(iprot thrift.TProtocol) error {
+func (p *TSFetchResultsResp)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
 	p.NonAlignQueryDataSet = &TSQueryNonAlignDataSet{}
-	if err := p.NonAlignQueryDataSet.Read(iprot); err != nil {
+	if err := p.NonAlignQueryDataSet.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.NonAlignQueryDataSet), err)
 	}
 	return nil
 }
 
-func (p *TSFetchResultsResp) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSFetchResultsResp"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSFetchResultsResp) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSFetchResultsResp"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSFetchResultsResp) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("status", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err)
-	}
-	if err := p.Status.Write(oprot); err != nil {
+func (p *TSFetchResultsResp) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "status", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err) }
+	if err := p.Status.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Status), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsResp) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("hasResultSet", thrift.BOOL, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:hasResultSet: ", p), err)
-	}
-	if err := oprot.WriteBool(bool(p.HasResultSet)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.hasResultSet (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:hasResultSet: ", p), err)
-	}
+func (p *TSFetchResultsResp) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "hasResultSet", thrift.BOOL, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:hasResultSet: ", p), err) }
+	if err := oprot.WriteBool(ctx, bool(p.HasResultSet)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.hasResultSet (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:hasResultSet: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsResp) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("isAlign", thrift.BOOL, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:isAlign: ", p), err)
-	}
-	if err := oprot.WriteBool(bool(p.IsAlign)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.isAlign (3) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:isAlign: ", p), err)
-	}
+func (p *TSFetchResultsResp) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "isAlign", thrift.BOOL, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:isAlign: ", p), err) }
+	if err := oprot.WriteBool(ctx, bool(p.IsAlign)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.isAlign (3) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:isAlign: ", p), err) }
 	return err
 }
 
-func (p *TSFetchResultsResp) writeField4(oprot thrift.TProtocol) (err error) {
+func (p *TSFetchResultsResp) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetQueryDataSet() {
-		if err := oprot.WriteFieldBegin("queryDataSet", thrift.STRUCT, 4); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:queryDataSet: ", p), err)
-		}
-		if err := p.QueryDataSet.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "queryDataSet", thrift.STRUCT, 4); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:queryDataSet: ", p), err) }
+		if err := p.QueryDataSet.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.QueryDataSet), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:queryDataSet: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:queryDataSet: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSFetchResultsResp) writeField5(oprot thrift.TProtocol) (err error) {
+func (p *TSFetchResultsResp) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetNonAlignQueryDataSet() {
-		if err := oprot.WriteFieldBegin("nonAlignQueryDataSet", thrift.STRUCT, 5); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:nonAlignQueryDataSet: ", p), err)
-		}
-		if err := p.NonAlignQueryDataSet.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "nonAlignQueryDataSet", thrift.STRUCT, 5); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:nonAlignQueryDataSet: ", p), err) }
+		if err := p.NonAlignQueryDataSet.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.NonAlignQueryDataSet), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:nonAlignQueryDataSet: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 5:nonAlignQueryDataSet: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSFetchResultsResp) Equals(other *TSFetchResultsResp) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if !p.Status.Equals(other.Status) { return false }
+	if p.HasResultSet != other.HasResultSet { return false }
+	if p.IsAlign != other.IsAlign { return false }
+	if !p.QueryDataSet.Equals(other.QueryDataSet) { return false }
+	if !p.NonAlignQueryDataSet.Equals(other.NonAlignQueryDataSet) { return false }
+	return true
+}
+
 func (p *TSFetchResultsResp) String() string {
 	if p == nil {
 		return "<nil>"
@@ -3957,10 +3867,10 @@
 //  - ColumnsList
 //  - DataType
 type TSFetchMetadataResp struct {
-	Status         *TSStatus `thrift:"status,1,required" db:"status" json:"status"`
-	MetadataInJson *string   `thrift:"metadataInJson,2" db:"metadataInJson" json:"metadataInJson,omitempty"`
-	ColumnsList    []string  `thrift:"columnsList,3" db:"columnsList" json:"columnsList,omitempty"`
-	DataType       *string   `thrift:"dataType,4" db:"dataType" json:"dataType,omitempty"`
+	Status *TSStatus `thrift:"status,1,required" db:"status" json:"status"`
+	MetadataInJson *string `thrift:"metadataInJson,2" db:"metadataInJson" json:"metadataInJson,omitempty"`
+	ColumnsList []string `thrift:"columnsList,3" db:"columnsList" json:"columnsList,omitempty"`
+	DataType *string `thrift:"dataType,4" db:"dataType" json:"dataType,omitempty"`
 }
 
 func NewTSFetchMetadataResp() *TSFetchMetadataResp {
@@ -3968,31 +3878,25 @@
 }
 
 var TSFetchMetadataResp_Status_DEFAULT *TSStatus
-
 func (p *TSFetchMetadataResp) GetStatus() *TSStatus {
 	if !p.IsSetStatus() {
 		return TSFetchMetadataResp_Status_DEFAULT
 	}
 	return p.Status
 }
-
 var TSFetchMetadataResp_MetadataInJson_DEFAULT string
-
 func (p *TSFetchMetadataResp) GetMetadataInJson() string {
 	if !p.IsSetMetadataInJson() {
 		return TSFetchMetadataResp_MetadataInJson_DEFAULT
 	}
 	return *p.MetadataInJson
 }
-
 var TSFetchMetadataResp_ColumnsList_DEFAULT []string
 
 func (p *TSFetchMetadataResp) GetColumnsList() []string {
 	return p.ColumnsList
 }
-
 var TSFetchMetadataResp_DataType_DEFAULT string
-
 func (p *TSFetchMetadataResp) GetDataType() string {
 	if !p.IsSetDataType() {
 		return TSFetchMetadataResp_DataType_DEFAULT
@@ -4015,91 +3919,89 @@
 	return p.DataType != nil
 }
 
-func (p *TSFetchMetadataResp) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSFetchMetadataResp) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetStatus bool = false
+	var issetStatus bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatus = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetStatus {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"))
+	if !issetStatus{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"));
 	}
 	return nil
 }
 
-func (p *TSFetchMetadataResp) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSFetchMetadataResp)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Status = &TSStatus{}
-	if err := p.Status.Read(iprot); err != nil {
+	if err := p.Status.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Status), err)
 	}
 	return nil
 }
 
-func (p *TSFetchMetadataResp) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSFetchMetadataResp)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.MetadataInJson = &v
@@ -4107,30 +4009,30 @@
 	return nil
 }
 
-func (p *TSFetchMetadataResp) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSFetchMetadataResp)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.ColumnsList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem14 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.ColumnsList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem25 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem14 = v
+			_elem25 = v
 		}
-		p.ColumnsList = append(p.ColumnsList, _elem14)
+		p.ColumnsList = append(p.ColumnsList, _elem25)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSFetchMetadataResp) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSFetchMetadataResp)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.DataType = &v
@@ -4138,99 +4040,104 @@
 	return nil
 }
 
-func (p *TSFetchMetadataResp) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSFetchMetadataResp"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSFetchMetadataResp) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSFetchMetadataResp"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSFetchMetadataResp) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("status", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err)
-	}
-	if err := p.Status.Write(oprot); err != nil {
+func (p *TSFetchMetadataResp) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "status", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err) }
+	if err := p.Status.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Status), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err) }
 	return err
 }
 
-func (p *TSFetchMetadataResp) writeField2(oprot thrift.TProtocol) (err error) {
+func (p *TSFetchMetadataResp) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetMetadataInJson() {
-		if err := oprot.WriteFieldBegin("metadataInJson", thrift.STRING, 2); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:metadataInJson: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.MetadataInJson)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.metadataInJson (2) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:metadataInJson: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "metadataInJson", thrift.STRING, 2); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:metadataInJson: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.MetadataInJson)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.metadataInJson (2) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 2:metadataInJson: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSFetchMetadataResp) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSFetchMetadataResp) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetColumnsList() {
-		if err := oprot.WriteFieldBegin("columnsList", thrift.LIST, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:columnsList: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.STRING, len(p.ColumnsList)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "columnsList", thrift.LIST, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:columnsList: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.ColumnsList)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.ColumnsList {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:columnsList: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:columnsList: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSFetchMetadataResp) writeField4(oprot thrift.TProtocol) (err error) {
+func (p *TSFetchMetadataResp) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetDataType() {
-		if err := oprot.WriteFieldBegin("dataType", thrift.STRING, 4); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:dataType: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.DataType)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.dataType (4) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:dataType: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "dataType", thrift.STRING, 4); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:dataType: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.DataType)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.dataType (4) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 4:dataType: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSFetchMetadataResp) Equals(other *TSFetchMetadataResp) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if !p.Status.Equals(other.Status) { return false }
+	if p.MetadataInJson != other.MetadataInJson {
+		if p.MetadataInJson == nil || other.MetadataInJson == nil {
+			return false
+		}
+		if (*p.MetadataInJson) != (*other.MetadataInJson) { return false }
+	}
+	if len(p.ColumnsList) != len(other.ColumnsList) { return false }
+	for i, _tgt := range p.ColumnsList {
+		_src26 := other.ColumnsList[i]
+		if _tgt != _src26 { return false }
+	}
+	if p.DataType != other.DataType {
+		if p.DataType == nil || other.DataType == nil {
+			return false
+		}
+		if (*p.DataType) != (*other.DataType) { return false }
+	}
+	return true
+}
+
 func (p *TSFetchMetadataResp) String() string {
 	if p == nil {
 		return "<nil>"
@@ -4243,8 +4150,8 @@
 //  - Type
 //  - ColumnPath
 type TSFetchMetadataReq struct {
-	SessionId  int64   `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	Type       string  `thrift:"type,2,required" db:"type" json:"type"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	Type string `thrift:"type,2,required" db:"type" json:"type"`
 	ColumnPath *string `thrift:"columnPath,3" db:"columnPath" json:"columnPath,omitempty"`
 }
 
@@ -4252,6 +4159,7 @@
 	return &TSFetchMetadataReq{}
 }
 
+
 func (p *TSFetchMetadataReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -4259,9 +4167,7 @@
 func (p *TSFetchMetadataReq) GetType() string {
 	return p.Type
 }
-
 var TSFetchMetadataReq_ColumnPath_DEFAULT string
-
 func (p *TSFetchMetadataReq) GetColumnPath() string {
 	if !p.IsSetColumnPath() {
 		return TSFetchMetadataReq_ColumnPath_DEFAULT
@@ -4272,78 +4178,76 @@
 	return p.ColumnPath != nil
 }
 
-func (p *TSFetchMetadataReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSFetchMetadataReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetType bool = false
+	var issetSessionId bool = false;
+	var issetType bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetType = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetType {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Type is not set"))
+	if !issetType{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Type is not set"));
 	}
 	return nil
 }
 
-func (p *TSFetchMetadataReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSFetchMetadataReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -4351,8 +4255,8 @@
 	return nil
 }
 
-func (p *TSFetchMetadataReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSFetchMetadataReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.Type = v
@@ -4360,8 +4264,8 @@
 	return nil
 }
 
-func (p *TSFetchMetadataReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSFetchMetadataReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.ColumnPath = &v
@@ -4369,71 +4273,70 @@
 	return nil
 }
 
-func (p *TSFetchMetadataReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSFetchMetadataReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSFetchMetadataReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSFetchMetadataReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSFetchMetadataReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSFetchMetadataReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSFetchMetadataReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("type", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:type: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.Type)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.type (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:type: ", p), err)
-	}
+func (p *TSFetchMetadataReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "type", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:type: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.Type)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.type (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:type: ", p), err) }
 	return err
 }
 
-func (p *TSFetchMetadataReq) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSFetchMetadataReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetColumnPath() {
-		if err := oprot.WriteFieldBegin("columnPath", thrift.STRING, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:columnPath: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.ColumnPath)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.columnPath (3) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:columnPath: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "columnPath", thrift.STRING, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:columnPath: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.ColumnPath)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.columnPath (3) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:columnPath: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSFetchMetadataReq) Equals(other *TSFetchMetadataReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.Type != other.Type { return false }
+	if p.ColumnPath != other.ColumnPath {
+		if p.ColumnPath == nil || other.ColumnPath == nil {
+			return false
+		}
+		if (*p.ColumnPath) != (*other.ColumnPath) { return false }
+	}
+	return true
+}
+
 func (p *TSFetchMetadataReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -4445,8 +4348,8 @@
 //  - Status
 //  - TimeZone
 type TSGetTimeZoneResp struct {
-	Status   *TSStatus `thrift:"status,1,required" db:"status" json:"status"`
-	TimeZone string    `thrift:"timeZone,2,required" db:"timeZone" json:"timeZone"`
+	Status *TSStatus `thrift:"status,1,required" db:"status" json:"status"`
+	TimeZone string `thrift:"timeZone,2,required" db:"timeZone" json:"timeZone"`
 }
 
 func NewTSGetTimeZoneResp() *TSGetTimeZoneResp {
@@ -4454,7 +4357,6 @@
 }
 
 var TSGetTimeZoneResp_Status_DEFAULT *TSStatus
-
 func (p *TSGetTimeZoneResp) GetStatus() *TSStatus {
 	if !p.IsSetStatus() {
 		return TSGetTimeZoneResp_Status_DEFAULT
@@ -4469,76 +4371,74 @@
 	return p.Status != nil
 }
 
-func (p *TSGetTimeZoneResp) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSGetTimeZoneResp) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetStatus bool = false
-	var issetTimeZone bool = false
+	var issetStatus bool = false;
+	var issetTimeZone bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatus = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimeZone = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetStatus {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"))
+	if !issetStatus{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Status is not set"));
 	}
-	if !issetTimeZone {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimeZone is not set"))
+	if !issetTimeZone{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimeZone is not set"));
 	}
 	return nil
 }
 
-func (p *TSGetTimeZoneResp) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSGetTimeZoneResp)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Status = &TSStatus{}
-	if err := p.Status.Read(iprot); err != nil {
+	if err := p.Status.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Status), err)
 	}
 	return nil
 }
 
-func (p *TSGetTimeZoneResp) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSGetTimeZoneResp)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.TimeZone = v
@@ -4546,53 +4446,52 @@
 	return nil
 }
 
-func (p *TSGetTimeZoneResp) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSGetTimeZoneResp"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSGetTimeZoneResp) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSGetTimeZoneResp"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSGetTimeZoneResp) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("status", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err)
-	}
-	if err := p.Status.Write(oprot); err != nil {
+func (p *TSGetTimeZoneResp) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "status", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:status: ", p), err) }
+	if err := p.Status.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Status), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:status: ", p), err) }
 	return err
 }
 
-func (p *TSGetTimeZoneResp) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timeZone", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:timeZone: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.TimeZone)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.timeZone (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:timeZone: ", p), err)
-	}
+func (p *TSGetTimeZoneResp) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timeZone", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:timeZone: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.TimeZone)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.timeZone (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:timeZone: ", p), err) }
 	return err
 }
 
+func (p *TSGetTimeZoneResp) Equals(other *TSGetTimeZoneResp) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if !p.Status.Equals(other.Status) { return false }
+	if p.TimeZone != other.TimeZone { return false }
+	return true
+}
+
 func (p *TSGetTimeZoneResp) String() string {
 	if p == nil {
 		return "<nil>"
@@ -4604,14 +4503,15 @@
 //  - SessionId
 //  - TimeZone
 type TSSetTimeZoneReq struct {
-	SessionId int64  `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	TimeZone  string `thrift:"timeZone,2,required" db:"timeZone" json:"timeZone"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	TimeZone string `thrift:"timeZone,2,required" db:"timeZone" json:"timeZone"`
 }
 
 func NewTSSetTimeZoneReq() *TSSetTimeZoneReq {
 	return &TSSetTimeZoneReq{}
 }
 
+
 func (p *TSSetTimeZoneReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -4619,68 +4519,66 @@
 func (p *TSSetTimeZoneReq) GetTimeZone() string {
 	return p.TimeZone
 }
-func (p *TSSetTimeZoneReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSSetTimeZoneReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetTimeZone bool = false
+	var issetSessionId bool = false;
+	var issetTimeZone bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimeZone = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetTimeZone {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimeZone is not set"))
+	if !issetTimeZone{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimeZone is not set"));
 	}
 	return nil
 }
 
-func (p *TSSetTimeZoneReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSSetTimeZoneReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -4688,8 +4586,8 @@
 	return nil
 }
 
-func (p *TSSetTimeZoneReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSSetTimeZoneReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.TimeZone = v
@@ -4697,53 +4595,51 @@
 	return nil
 }
 
-func (p *TSSetTimeZoneReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSSetTimeZoneReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSSetTimeZoneReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSSetTimeZoneReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSSetTimeZoneReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSSetTimeZoneReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSSetTimeZoneReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timeZone", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:timeZone: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.TimeZone)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.timeZone (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:timeZone: ", p), err)
-	}
+func (p *TSSetTimeZoneReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timeZone", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:timeZone: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.TimeZone)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.timeZone (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:timeZone: ", p), err) }
 	return err
 }
 
+func (p *TSSetTimeZoneReq) Equals(other *TSSetTimeZoneReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.TimeZone != other.TimeZone { return false }
+	return true
+}
+
 func (p *TSSetTimeZoneReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -4758,17 +4654,18 @@
 //  - Values
 //  - Timestamp
 type TSInsertRecordReq struct {
-	SessionId    int64    `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	DeviceId     string   `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	DeviceId string `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
 	Measurements []string `thrift:"measurements,3,required" db:"measurements" json:"measurements"`
-	Values       []byte   `thrift:"values,4,required" db:"values" json:"values"`
-	Timestamp    int64    `thrift:"timestamp,5,required" db:"timestamp" json:"timestamp"`
+	Values []byte `thrift:"values,4,required" db:"values" json:"values"`
+	Timestamp int64 `thrift:"timestamp,5,required" db:"timestamp" json:"timestamp"`
 }
 
 func NewTSInsertRecordReq() *TSInsertRecordReq {
 	return &TSInsertRecordReq{}
 }
 
+
 func (p *TSInsertRecordReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -4788,113 +4685,111 @@
 func (p *TSInsertRecordReq) GetTimestamp() int64 {
 	return p.Timestamp
 }
-func (p *TSInsertRecordReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSInsertRecordReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetDeviceId bool = false
-	var issetMeasurements bool = false
-	var issetValues bool = false
-	var issetTimestamp bool = false
+	var issetSessionId bool = false;
+	var issetDeviceId bool = false;
+	var issetMeasurements bool = false;
+	var issetValues bool = false;
+	var issetTimestamp bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetDeviceId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetMeasurements = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetValues = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestamp = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetDeviceId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"))
+	if !issetDeviceId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"));
 	}
-	if !issetMeasurements {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Measurements is not set"))
+	if !issetMeasurements{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Measurements is not set"));
 	}
-	if !issetValues {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Values is not set"))
+	if !issetValues{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Values is not set"));
 	}
-	if !issetTimestamp {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set"))
+	if !issetTimestamp{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set"));
 	}
 	return nil
 }
 
-func (p *TSInsertRecordReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertRecordReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -4902,8 +4797,8 @@
 	return nil
 }
 
-func (p *TSInsertRecordReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSInsertRecordReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.DeviceId = v
@@ -4911,30 +4806,30 @@
 	return nil
 }
 
-func (p *TSInsertRecordReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Measurements = tSlice
-	for i := 0; i < size; i++ {
-		var _elem15 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Measurements =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem27 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem15 = v
+			_elem27 = v
 		}
-		p.Measurements = append(p.Measurements, _elem15)
+		p.Measurements = append(p.Measurements, _elem27)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBinary(); err != nil {
+func (p *TSInsertRecordReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBinary(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.Values = v
@@ -4942,8 +4837,8 @@
 	return nil
 }
 
-func (p *TSInsertRecordReq) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertRecordReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.Timestamp = v
@@ -4951,109 +4846,99 @@
 	return nil
 }
 
-func (p *TSInsertRecordReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSInsertRecordReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSInsertRecordReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSInsertRecordReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSInsertRecordReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSInsertRecordReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("deviceId", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.DeviceId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err)
-	}
+func (p *TSInsertRecordReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "deviceId", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.DeviceId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("measurements", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurements: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Measurements)); err != nil {
+func (p *TSInsertRecordReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "measurements", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurements: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Measurements)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Measurements {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurements: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurements: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("values", thrift.STRING, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:values: ", p), err)
-	}
-	if err := oprot.WriteBinary(p.Values); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.values (4) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:values: ", p), err)
-	}
+func (p *TSInsertRecordReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "values", thrift.STRING, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:values: ", p), err) }
+	if err := oprot.WriteBinary(ctx, p.Values); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.values (4) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:values: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamp: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.Timestamp)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.timestamp (5) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamp: ", p), err)
-	}
+func (p *TSInsertRecordReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestamp", thrift.I64, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamp: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.Timestamp)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.timestamp (5) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamp: ", p), err) }
 	return err
 }
 
+func (p *TSInsertRecordReq) Equals(other *TSInsertRecordReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.DeviceId != other.DeviceId { return false }
+	if len(p.Measurements) != len(other.Measurements) { return false }
+	for i, _tgt := range p.Measurements {
+		_src28 := other.Measurements[i]
+		if _tgt != _src28 { return false }
+	}
+	if bytes.Compare(p.Values, other.Values) != 0 { return false }
+	if p.Timestamp != other.Timestamp { return false }
+	return true
+}
+
 func (p *TSInsertRecordReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -5068,17 +4953,18 @@
 //  - Values
 //  - Timestamp
 type TSInsertStringRecordReq struct {
-	SessionId    int64    `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	DeviceId     string   `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	DeviceId string `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
 	Measurements []string `thrift:"measurements,3,required" db:"measurements" json:"measurements"`
-	Values       []string `thrift:"values,4,required" db:"values" json:"values"`
-	Timestamp    int64    `thrift:"timestamp,5,required" db:"timestamp" json:"timestamp"`
+	Values []string `thrift:"values,4,required" db:"values" json:"values"`
+	Timestamp int64 `thrift:"timestamp,5,required" db:"timestamp" json:"timestamp"`
 }
 
 func NewTSInsertStringRecordReq() *TSInsertStringRecordReq {
 	return &TSInsertStringRecordReq{}
 }
 
+
 func (p *TSInsertStringRecordReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -5098,113 +4984,111 @@
 func (p *TSInsertStringRecordReq) GetTimestamp() int64 {
 	return p.Timestamp
 }
-func (p *TSInsertStringRecordReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSInsertStringRecordReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetDeviceId bool = false
-	var issetMeasurements bool = false
-	var issetValues bool = false
-	var issetTimestamp bool = false
+	var issetSessionId bool = false;
+	var issetDeviceId bool = false;
+	var issetMeasurements bool = false;
+	var issetValues bool = false;
+	var issetTimestamp bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetDeviceId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetMeasurements = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetValues = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestamp = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetDeviceId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"))
+	if !issetDeviceId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"));
 	}
-	if !issetMeasurements {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Measurements is not set"))
+	if !issetMeasurements{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Measurements is not set"));
 	}
-	if !issetValues {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Values is not set"))
+	if !issetValues{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Values is not set"));
 	}
-	if !issetTimestamp {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set"))
+	if !issetTimestamp{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set"));
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertStringRecordReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -5212,8 +5096,8 @@
 	return nil
 }
 
-func (p *TSInsertStringRecordReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSInsertStringRecordReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.DeviceId = v
@@ -5221,52 +5105,52 @@
 	return nil
 }
 
-func (p *TSInsertStringRecordReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertStringRecordReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Measurements = tSlice
-	for i := 0; i < size; i++ {
-		var _elem16 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Measurements =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem29 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem16 = v
+			_elem29 = v
 		}
-		p.Measurements = append(p.Measurements, _elem16)
+		p.Measurements = append(p.Measurements, _elem29)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordReq) ReadField4(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertStringRecordReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Values = tSlice
-	for i := 0; i < size; i++ {
-		var _elem17 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Values =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem30 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem17 = v
+			_elem30 = v
 		}
-		p.Values = append(p.Values, _elem17)
+		p.Values = append(p.Values, _elem30)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordReq) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertStringRecordReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.Timestamp = v
@@ -5274,117 +5158,111 @@
 	return nil
 }
 
-func (p *TSInsertStringRecordReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSInsertStringRecordReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSInsertStringRecordReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSInsertStringRecordReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSInsertStringRecordReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSInsertStringRecordReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("deviceId", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.DeviceId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err)
-	}
+func (p *TSInsertStringRecordReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "deviceId", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.DeviceId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("measurements", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurements: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Measurements)); err != nil {
+func (p *TSInsertStringRecordReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "measurements", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurements: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Measurements)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Measurements {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurements: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurements: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("values", thrift.LIST, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:values: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Values)); err != nil {
+func (p *TSInsertStringRecordReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "values", thrift.LIST, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:values: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Values)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Values {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:values: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:values: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamp: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.Timestamp)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.timestamp (5) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamp: ", p), err)
-	}
+func (p *TSInsertStringRecordReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestamp", thrift.I64, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamp: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.Timestamp)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.timestamp (5) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamp: ", p), err) }
 	return err
 }
 
+func (p *TSInsertStringRecordReq) Equals(other *TSInsertStringRecordReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.DeviceId != other.DeviceId { return false }
+	if len(p.Measurements) != len(other.Measurements) { return false }
+	for i, _tgt := range p.Measurements {
+		_src31 := other.Measurements[i]
+		if _tgt != _src31 { return false }
+	}
+	if len(p.Values) != len(other.Values) { return false }
+	for i, _tgt := range p.Values {
+		_src32 := other.Values[i]
+		if _tgt != _src32 { return false }
+	}
+	if p.Timestamp != other.Timestamp { return false }
+	return true
+}
+
 func (p *TSInsertStringRecordReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -5401,19 +5279,20 @@
 //  - Types
 //  - Size
 type TSInsertTabletReq struct {
-	SessionId    int64    `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	DeviceId     string   `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	DeviceId string `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
 	Measurements []string `thrift:"measurements,3,required" db:"measurements" json:"measurements"`
-	Values       []byte   `thrift:"values,4,required" db:"values" json:"values"`
-	Timestamps   []byte   `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
-	Types        []int32  `thrift:"types,6,required" db:"types" json:"types"`
-	Size         int32    `thrift:"size,7,required" db:"size" json:"size"`
+	Values []byte `thrift:"values,4,required" db:"values" json:"values"`
+	Timestamps []byte `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
+	Types []int32 `thrift:"types,6,required" db:"types" json:"types"`
+	Size int32 `thrift:"size,7,required" db:"size" json:"size"`
 }
 
 func NewTSInsertTabletReq() *TSInsertTabletReq {
 	return &TSInsertTabletReq{}
 }
 
+
 func (p *TSInsertTabletReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -5441,143 +5320,141 @@
 func (p *TSInsertTabletReq) GetSize() int32 {
 	return p.Size
 }
-func (p *TSInsertTabletReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSInsertTabletReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetDeviceId bool = false
-	var issetMeasurements bool = false
-	var issetValues bool = false
-	var issetTimestamps bool = false
-	var issetTypes bool = false
-	var issetSize bool = false
+	var issetSessionId bool = false;
+	var issetDeviceId bool = false;
+	var issetMeasurements bool = false;
+	var issetValues bool = false;
+	var issetTimestamps bool = false;
+	var issetTypes bool = false;
+	var issetSize bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetDeviceId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetMeasurements = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetValues = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestamps = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 				issetTypes = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 7:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField7(iprot); err != nil {
+				if err := p.ReadField7(ctx, iprot); err != nil {
 					return err
 				}
 				issetSize = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetDeviceId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"))
+	if !issetDeviceId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"));
 	}
-	if !issetMeasurements {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Measurements is not set"))
+	if !issetMeasurements{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Measurements is not set"));
 	}
-	if !issetValues {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Values is not set"))
+	if !issetValues{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Values is not set"));
 	}
-	if !issetTimestamps {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"))
+	if !issetTimestamps{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"));
 	}
-	if !issetTypes {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Types is not set"))
+	if !issetTypes{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Types is not set"));
 	}
-	if !issetSize {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Size is not set"))
+	if !issetSize{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Size is not set"));
 	}
 	return nil
 }
 
-func (p *TSInsertTabletReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertTabletReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -5585,8 +5462,8 @@
 	return nil
 }
 
-func (p *TSInsertTabletReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSInsertTabletReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.DeviceId = v
@@ -5594,30 +5471,30 @@
 	return nil
 }
 
-func (p *TSInsertTabletReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Measurements = tSlice
-	for i := 0; i < size; i++ {
-		var _elem18 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Measurements =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem33 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem18 = v
+			_elem33 = v
 		}
-		p.Measurements = append(p.Measurements, _elem18)
+		p.Measurements = append(p.Measurements, _elem33)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBinary(); err != nil {
+func (p *TSInsertTabletReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBinary(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.Values = v
@@ -5625,8 +5502,8 @@
 	return nil
 }
 
-func (p *TSInsertTabletReq) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBinary(); err != nil {
+func (p *TSInsertTabletReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBinary(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.Timestamps = v
@@ -5634,30 +5511,30 @@
 	return nil
 }
 
-func (p *TSInsertTabletReq) ReadField6(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletReq)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int32, 0, size)
-	p.Types = tSlice
-	for i := 0; i < size; i++ {
-		var _elem19 int32
-		if v, err := iprot.ReadI32(); err != nil {
+	p.Types =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem34 int32
+		if v, err := iprot.ReadI32(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem19 = v
+			_elem34 = v
 		}
-		p.Types = append(p.Types, _elem19)
+		p.Types = append(p.Types, _elem34)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletReq) ReadField7(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSInsertTabletReq)  ReadField7(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 7: ", err)
 	} else {
 		p.Size = v
@@ -5665,149 +5542,135 @@
 	return nil
 }
 
-func (p *TSInsertTabletReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSInsertTabletReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSInsertTabletReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSInsertTabletReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField7(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
+		if err := p.writeField7(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSInsertTabletReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSInsertTabletReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("deviceId", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.DeviceId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err)
-	}
+func (p *TSInsertTabletReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "deviceId", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.DeviceId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("measurements", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurements: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Measurements)); err != nil {
+func (p *TSInsertTabletReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "measurements", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurements: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Measurements)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Measurements {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurements: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurements: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("values", thrift.STRING, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:values: ", p), err)
-	}
-	if err := oprot.WriteBinary(p.Values); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.values (4) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:values: ", p), err)
-	}
+func (p *TSInsertTabletReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "values", thrift.STRING, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:values: ", p), err) }
+	if err := oprot.WriteBinary(ctx, p.Values); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.values (4) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:values: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestamps", thrift.STRING, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err)
-	}
-	if err := oprot.WriteBinary(p.Timestamps); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.timestamps (5) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err)
-	}
+func (p *TSInsertTabletReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestamps", thrift.STRING, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err) }
+	if err := oprot.WriteBinary(ctx, p.Timestamps); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.timestamps (5) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletReq) writeField6(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("types", thrift.LIST, 6); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:types: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I32, len(p.Types)); err != nil {
+func (p *TSInsertTabletReq) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "types", thrift.LIST, 6); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:types: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I32, len(p.Types)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Types {
-		if err := oprot.WriteI32(int32(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI32(ctx, int32(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 6:types: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 6:types: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletReq) writeField7(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("size", thrift.I32, 7); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:size: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.Size)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.size (7) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 7:size: ", p), err)
-	}
+func (p *TSInsertTabletReq) writeField7(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "size", thrift.I32, 7); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:size: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.Size)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.size (7) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 7:size: ", p), err) }
 	return err
 }
 
+func (p *TSInsertTabletReq) Equals(other *TSInsertTabletReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.DeviceId != other.DeviceId { return false }
+	if len(p.Measurements) != len(other.Measurements) { return false }
+	for i, _tgt := range p.Measurements {
+		_src35 := other.Measurements[i]
+		if _tgt != _src35 { return false }
+	}
+	if bytes.Compare(p.Values, other.Values) != 0 { return false }
+	if bytes.Compare(p.Timestamps, other.Timestamps) != 0 { return false }
+	if len(p.Types) != len(other.Types) { return false }
+	for i, _tgt := range p.Types {
+		_src36 := other.Types[i]
+		if _tgt != _src36 { return false }
+	}
+	if p.Size != other.Size { return false }
+	return true
+}
+
 func (p *TSInsertTabletReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -5824,19 +5687,20 @@
 //  - TypesList
 //  - SizeList
 type TSInsertTabletsReq struct {
-	SessionId        int64      `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	DeviceIds        []string   `thrift:"deviceIds,2,required" db:"deviceIds" json:"deviceIds"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	DeviceIds []string `thrift:"deviceIds,2,required" db:"deviceIds" json:"deviceIds"`
 	MeasurementsList [][]string `thrift:"measurementsList,3,required" db:"measurementsList" json:"measurementsList"`
-	ValuesList       [][]byte   `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
-	TimestampsList   [][]byte   `thrift:"timestampsList,5,required" db:"timestampsList" json:"timestampsList"`
-	TypesList        [][]int32  `thrift:"typesList,6,required" db:"typesList" json:"typesList"`
-	SizeList         []int32    `thrift:"sizeList,7,required" db:"sizeList" json:"sizeList"`
+	ValuesList [][]byte `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
+	TimestampsList [][]byte `thrift:"timestampsList,5,required" db:"timestampsList" json:"timestampsList"`
+	TypesList [][]int32 `thrift:"typesList,6,required" db:"typesList" json:"typesList"`
+	SizeList []int32 `thrift:"sizeList,7,required" db:"sizeList" json:"sizeList"`
 }
 
 func NewTSInsertTabletsReq() *TSInsertTabletsReq {
 	return &TSInsertTabletsReq{}
 }
 
+
 func (p *TSInsertTabletsReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -5864,143 +5728,141 @@
 func (p *TSInsertTabletsReq) GetSizeList() []int32 {
 	return p.SizeList
 }
-func (p *TSInsertTabletsReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSInsertTabletsReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetDeviceIds bool = false
-	var issetMeasurementsList bool = false
-	var issetValuesList bool = false
-	var issetTimestampsList bool = false
-	var issetTypesList bool = false
-	var issetSizeList bool = false
+	var issetSessionId bool = false;
+	var issetDeviceIds bool = false;
+	var issetMeasurementsList bool = false;
+	var issetValuesList bool = false;
+	var issetTimestampsList bool = false;
+	var issetTypesList bool = false;
+	var issetSizeList bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetDeviceIds = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetMeasurementsList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetValuesList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestampsList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 				issetTypesList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 7:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField7(iprot); err != nil {
+				if err := p.ReadField7(ctx, iprot); err != nil {
 					return err
 				}
 				issetSizeList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetDeviceIds {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceIds is not set"))
+	if !issetDeviceIds{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceIds is not set"));
 	}
-	if !issetMeasurementsList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"))
+	if !issetMeasurementsList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"));
 	}
-	if !issetValuesList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"))
+	if !issetValuesList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"));
 	}
-	if !issetTimestampsList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimestampsList is not set"))
+	if !issetTimestampsList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimestampsList is not set"));
 	}
-	if !issetTypesList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TypesList is not set"))
+	if !issetTypesList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TypesList is not set"));
 	}
-	if !issetSizeList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SizeList is not set"))
+	if !issetSizeList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SizeList is not set"));
 	}
 	return nil
 }
 
-func (p *TSInsertTabletsReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertTabletsReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -6008,353 +5870,363 @@
 	return nil
 }
 
-func (p *TSInsertTabletsReq) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletsReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.DeviceIds = tSlice
-	for i := 0; i < size; i++ {
-		var _elem20 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.DeviceIds =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem37 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem20 = v
+			_elem37 = v
 		}
-		p.DeviceIds = append(p.DeviceIds, _elem20)
+		p.DeviceIds = append(p.DeviceIds, _elem37)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletsReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletsReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]string, 0, size)
-	p.MeasurementsList = tSlice
-	for i := 0; i < size; i++ {
-		_, size, err := iprot.ReadListBegin()
+	p.MeasurementsList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, size, err := iprot.ReadListBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading list begin: ", err)
 		}
 		tSlice := make([]string, 0, size)
-		_elem21 := tSlice
-		for i := 0; i < size; i++ {
-			var _elem22 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem38 :=  tSlice
+		for i := 0; i < size; i ++ {
+			var _elem39 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_elem22 = v
+				_elem39 = v
 			}
-			_elem21 = append(_elem21, _elem22)
+			_elem38 = append(_elem38, _elem39)
 		}
-		if err := iprot.ReadListEnd(); err != nil {
+		if err := iprot.ReadListEnd(ctx); err != nil {
 			return thrift.PrependError("error reading list end: ", err)
 		}
-		p.MeasurementsList = append(p.MeasurementsList, _elem21)
+		p.MeasurementsList = append(p.MeasurementsList, _elem38)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletsReq) ReadField4(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletsReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]byte, 0, size)
-	p.ValuesList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem23 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
+	p.ValuesList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem40 []byte
+		if v, err := iprot.ReadBinary(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem23 = v
+			_elem40 = v
 		}
-		p.ValuesList = append(p.ValuesList, _elem23)
+		p.ValuesList = append(p.ValuesList, _elem40)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletsReq) ReadField5(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletsReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]byte, 0, size)
-	p.TimestampsList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem24 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
+	p.TimestampsList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem41 []byte
+		if v, err := iprot.ReadBinary(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem24 = v
+			_elem41 = v
 		}
-		p.TimestampsList = append(p.TimestampsList, _elem24)
+		p.TimestampsList = append(p.TimestampsList, _elem41)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletsReq) ReadField6(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletsReq)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]int32, 0, size)
-	p.TypesList = tSlice
-	for i := 0; i < size; i++ {
-		_, size, err := iprot.ReadListBegin()
+	p.TypesList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, size, err := iprot.ReadListBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading list begin: ", err)
 		}
 		tSlice := make([]int32, 0, size)
-		_elem25 := tSlice
-		for i := 0; i < size; i++ {
-			var _elem26 int32
-			if v, err := iprot.ReadI32(); err != nil {
+		_elem42 :=  tSlice
+		for i := 0; i < size; i ++ {
+			var _elem43 int32
+			if v, err := iprot.ReadI32(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_elem26 = v
+				_elem43 = v
 			}
-			_elem25 = append(_elem25, _elem26)
+			_elem42 = append(_elem42, _elem43)
 		}
-		if err := iprot.ReadListEnd(); err != nil {
+		if err := iprot.ReadListEnd(ctx); err != nil {
 			return thrift.PrependError("error reading list end: ", err)
 		}
-		p.TypesList = append(p.TypesList, _elem25)
+		p.TypesList = append(p.TypesList, _elem42)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletsReq) ReadField7(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertTabletsReq)  ReadField7(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int32, 0, size)
-	p.SizeList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem27 int32
-		if v, err := iprot.ReadI32(); err != nil {
+	p.SizeList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem44 int32
+		if v, err := iprot.ReadI32(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem27 = v
+			_elem44 = v
 		}
-		p.SizeList = append(p.SizeList, _elem27)
+		p.SizeList = append(p.SizeList, _elem44)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertTabletsReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSInsertTabletsReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSInsertTabletsReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSInsertTabletsReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField7(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
+		if err := p.writeField7(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSInsertTabletsReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSInsertTabletsReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletsReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("deviceIds", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceIds: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.DeviceIds)); err != nil {
+func (p *TSInsertTabletsReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "deviceIds", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceIds: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.DeviceIds)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.DeviceIds {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceIds: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceIds: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletsReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("measurementsList", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.LIST, len(p.MeasurementsList)); err != nil {
+func (p *TSInsertTabletsReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "measurementsList", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.LIST, len(p.MeasurementsList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.MeasurementsList {
-		if err := oprot.WriteListBegin(thrift.STRING, len(v)); err != nil {
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(v)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range v {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletsReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("valuesList", thrift.LIST, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.ValuesList)); err != nil {
+func (p *TSInsertTabletsReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "valuesList", thrift.LIST, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.ValuesList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.ValuesList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletsReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestampsList", thrift.LIST, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestampsList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.TimestampsList)); err != nil {
+func (p *TSInsertTabletsReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestampsList", thrift.LIST, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestampsList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.TimestampsList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.TimestampsList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestampsList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestampsList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletsReq) writeField6(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("typesList", thrift.LIST, 6); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:typesList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.LIST, len(p.TypesList)); err != nil {
+func (p *TSInsertTabletsReq) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "typesList", thrift.LIST, 6); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:typesList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.LIST, len(p.TypesList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.TypesList {
-		if err := oprot.WriteListBegin(thrift.I32, len(v)); err != nil {
+		if err := oprot.WriteListBegin(ctx, thrift.I32, len(v)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range v {
-			if err := oprot.WriteI32(int32(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteI32(ctx, int32(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 6:typesList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 6:typesList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertTabletsReq) writeField7(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sizeList", thrift.LIST, 7); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:sizeList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I32, len(p.SizeList)); err != nil {
+func (p *TSInsertTabletsReq) writeField7(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sizeList", thrift.LIST, 7); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:sizeList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I32, len(p.SizeList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.SizeList {
-		if err := oprot.WriteI32(int32(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI32(ctx, int32(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 7:sizeList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 7:sizeList: ", p), err) }
 	return err
 }
 
+func (p *TSInsertTabletsReq) Equals(other *TSInsertTabletsReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if len(p.DeviceIds) != len(other.DeviceIds) { return false }
+	for i, _tgt := range p.DeviceIds {
+		_src45 := other.DeviceIds[i]
+		if _tgt != _src45 { return false }
+	}
+	if len(p.MeasurementsList) != len(other.MeasurementsList) { return false }
+	for i, _tgt := range p.MeasurementsList {
+		_src46 := other.MeasurementsList[i]
+		if len(_tgt) != len(_src46) { return false }
+		for i, _tgt := range _tgt {
+			_src47 := _src46[i]
+			if _tgt != _src47 { return false }
+		}
+	}
+	if len(p.ValuesList) != len(other.ValuesList) { return false }
+	for i, _tgt := range p.ValuesList {
+		_src48 := other.ValuesList[i]
+		if bytes.Compare(_tgt, _src48) != 0 { return false }
+	}
+	if len(p.TimestampsList) != len(other.TimestampsList) { return false }
+	for i, _tgt := range p.TimestampsList {
+		_src49 := other.TimestampsList[i]
+		if bytes.Compare(_tgt, _src49) != 0 { return false }
+	}
+	if len(p.TypesList) != len(other.TypesList) { return false }
+	for i, _tgt := range p.TypesList {
+		_src50 := other.TypesList[i]
+		if len(_tgt) != len(_src50) { return false }
+		for i, _tgt := range _tgt {
+			_src51 := _src50[i]
+			if _tgt != _src51 { return false }
+		}
+	}
+	if len(p.SizeList) != len(other.SizeList) { return false }
+	for i, _tgt := range p.SizeList {
+		_src52 := other.SizeList[i]
+		if _tgt != _src52 { return false }
+	}
+	return true
+}
+
 func (p *TSInsertTabletsReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -6369,17 +6241,18 @@
 //  - ValuesList
 //  - Timestamps
 type TSInsertRecordsReq struct {
-	SessionId        int64      `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	DeviceIds        []string   `thrift:"deviceIds,2,required" db:"deviceIds" json:"deviceIds"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	DeviceIds []string `thrift:"deviceIds,2,required" db:"deviceIds" json:"deviceIds"`
 	MeasurementsList [][]string `thrift:"measurementsList,3,required" db:"measurementsList" json:"measurementsList"`
-	ValuesList       [][]byte   `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
-	Timestamps       []int64    `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
+	ValuesList [][]byte `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
+	Timestamps []int64 `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
 }
 
 func NewTSInsertRecordsReq() *TSInsertRecordsReq {
 	return &TSInsertRecordsReq{}
 }
 
+
 func (p *TSInsertRecordsReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -6399,113 +6272,111 @@
 func (p *TSInsertRecordsReq) GetTimestamps() []int64 {
 	return p.Timestamps
 }
-func (p *TSInsertRecordsReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSInsertRecordsReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetDeviceIds bool = false
-	var issetMeasurementsList bool = false
-	var issetValuesList bool = false
-	var issetTimestamps bool = false
+	var issetSessionId bool = false;
+	var issetDeviceIds bool = false;
+	var issetMeasurementsList bool = false;
+	var issetValuesList bool = false;
+	var issetTimestamps bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetDeviceIds = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetMeasurementsList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetValuesList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestamps = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetDeviceIds {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceIds is not set"))
+	if !issetDeviceIds{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceIds is not set"));
 	}
-	if !issetMeasurementsList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"))
+	if !issetMeasurementsList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"));
 	}
-	if !issetValuesList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"))
+	if !issetValuesList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"));
 	}
-	if !issetTimestamps {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"))
+	if !issetTimestamps{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"));
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertRecordsReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -6513,241 +6384,247 @@
 	return nil
 }
 
-func (p *TSInsertRecordsReq) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordsReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.DeviceIds = tSlice
-	for i := 0; i < size; i++ {
-		var _elem28 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.DeviceIds =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem53 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem28 = v
+			_elem53 = v
 		}
-		p.DeviceIds = append(p.DeviceIds, _elem28)
+		p.DeviceIds = append(p.DeviceIds, _elem53)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordsReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]string, 0, size)
-	p.MeasurementsList = tSlice
-	for i := 0; i < size; i++ {
-		_, size, err := iprot.ReadListBegin()
+	p.MeasurementsList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, size, err := iprot.ReadListBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading list begin: ", err)
 		}
 		tSlice := make([]string, 0, size)
-		_elem29 := tSlice
-		for i := 0; i < size; i++ {
-			var _elem30 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem54 :=  tSlice
+		for i := 0; i < size; i ++ {
+			var _elem55 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_elem30 = v
+				_elem55 = v
 			}
-			_elem29 = append(_elem29, _elem30)
+			_elem54 = append(_elem54, _elem55)
 		}
-		if err := iprot.ReadListEnd(); err != nil {
+		if err := iprot.ReadListEnd(ctx); err != nil {
 			return thrift.PrependError("error reading list end: ", err)
 		}
-		p.MeasurementsList = append(p.MeasurementsList, _elem29)
+		p.MeasurementsList = append(p.MeasurementsList, _elem54)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsReq) ReadField4(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordsReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]byte, 0, size)
-	p.ValuesList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem31 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
+	p.ValuesList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem56 []byte
+		if v, err := iprot.ReadBinary(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem31 = v
+			_elem56 = v
 		}
-		p.ValuesList = append(p.ValuesList, _elem31)
+		p.ValuesList = append(p.ValuesList, _elem56)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsReq) ReadField5(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordsReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int64, 0, size)
-	p.Timestamps = tSlice
-	for i := 0; i < size; i++ {
-		var _elem32 int64
-		if v, err := iprot.ReadI64(); err != nil {
+	p.Timestamps =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem57 int64
+		if v, err := iprot.ReadI64(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem32 = v
+			_elem57 = v
 		}
-		p.Timestamps = append(p.Timestamps, _elem32)
+		p.Timestamps = append(p.Timestamps, _elem57)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSInsertRecordsReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSInsertRecordsReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSInsertRecordsReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSInsertRecordsReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSInsertRecordsReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("deviceIds", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceIds: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.DeviceIds)); err != nil {
+func (p *TSInsertRecordsReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "deviceIds", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceIds: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.DeviceIds)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.DeviceIds {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceIds: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceIds: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("measurementsList", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.LIST, len(p.MeasurementsList)); err != nil {
+func (p *TSInsertRecordsReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "measurementsList", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.LIST, len(p.MeasurementsList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.MeasurementsList {
-		if err := oprot.WriteListBegin(thrift.STRING, len(v)); err != nil {
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(v)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range v {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("valuesList", thrift.LIST, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.ValuesList)); err != nil {
+func (p *TSInsertRecordsReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "valuesList", thrift.LIST, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.ValuesList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.ValuesList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestamps", thrift.LIST, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I64, len(p.Timestamps)); err != nil {
+func (p *TSInsertRecordsReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestamps", thrift.LIST, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I64, len(p.Timestamps)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Timestamps {
-		if err := oprot.WriteI64(int64(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI64(ctx, int64(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err) }
 	return err
 }
 
+func (p *TSInsertRecordsReq) Equals(other *TSInsertRecordsReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if len(p.DeviceIds) != len(other.DeviceIds) { return false }
+	for i, _tgt := range p.DeviceIds {
+		_src58 := other.DeviceIds[i]
+		if _tgt != _src58 { return false }
+	}
+	if len(p.MeasurementsList) != len(other.MeasurementsList) { return false }
+	for i, _tgt := range p.MeasurementsList {
+		_src59 := other.MeasurementsList[i]
+		if len(_tgt) != len(_src59) { return false }
+		for i, _tgt := range _tgt {
+			_src60 := _src59[i]
+			if _tgt != _src60 { return false }
+		}
+	}
+	if len(p.ValuesList) != len(other.ValuesList) { return false }
+	for i, _tgt := range p.ValuesList {
+		_src61 := other.ValuesList[i]
+		if bytes.Compare(_tgt, _src61) != 0 { return false }
+	}
+	if len(p.Timestamps) != len(other.Timestamps) { return false }
+	for i, _tgt := range p.Timestamps {
+		_src62 := other.Timestamps[i]
+		if _tgt != _src62 { return false }
+	}
+	return true
+}
+
 func (p *TSInsertRecordsReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -6762,17 +6639,18 @@
 //  - ValuesList
 //  - Timestamps
 type TSInsertRecordsOfOneDeviceReq struct {
-	SessionId        int64      `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	DeviceId         string     `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	DeviceId string `thrift:"deviceId,2,required" db:"deviceId" json:"deviceId"`
 	MeasurementsList [][]string `thrift:"measurementsList,3,required" db:"measurementsList" json:"measurementsList"`
-	ValuesList       [][]byte   `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
-	Timestamps       []int64    `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
+	ValuesList [][]byte `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
+	Timestamps []int64 `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
 }
 
 func NewTSInsertRecordsOfOneDeviceReq() *TSInsertRecordsOfOneDeviceReq {
 	return &TSInsertRecordsOfOneDeviceReq{}
 }
 
+
 func (p *TSInsertRecordsOfOneDeviceReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -6792,113 +6670,111 @@
 func (p *TSInsertRecordsOfOneDeviceReq) GetTimestamps() []int64 {
 	return p.Timestamps
 }
-func (p *TSInsertRecordsOfOneDeviceReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSInsertRecordsOfOneDeviceReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetDeviceId bool = false
-	var issetMeasurementsList bool = false
-	var issetValuesList bool = false
-	var issetTimestamps bool = false
+	var issetSessionId bool = false;
+	var issetDeviceId bool = false;
+	var issetMeasurementsList bool = false;
+	var issetValuesList bool = false;
+	var issetTimestamps bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetDeviceId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetMeasurementsList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetValuesList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestamps = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetDeviceId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"))
+	if !issetDeviceId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceId is not set"));
 	}
-	if !issetMeasurementsList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"))
+	if !issetMeasurementsList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"));
 	}
-	if !issetValuesList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"))
+	if !issetValuesList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"));
 	}
-	if !issetTimestamps {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"))
+	if !issetTimestamps{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"));
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertRecordsOfOneDeviceReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -6906,8 +6782,8 @@
 	return nil
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSInsertRecordsOfOneDeviceReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.DeviceId = v
@@ -6915,211 +6791,213 @@
 	return nil
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordsOfOneDeviceReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]string, 0, size)
-	p.MeasurementsList = tSlice
-	for i := 0; i < size; i++ {
-		_, size, err := iprot.ReadListBegin()
+	p.MeasurementsList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, size, err := iprot.ReadListBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading list begin: ", err)
 		}
 		tSlice := make([]string, 0, size)
-		_elem33 := tSlice
-		for i := 0; i < size; i++ {
-			var _elem34 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem63 :=  tSlice
+		for i := 0; i < size; i ++ {
+			var _elem64 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_elem34 = v
+				_elem64 = v
 			}
-			_elem33 = append(_elem33, _elem34)
+			_elem63 = append(_elem63, _elem64)
 		}
-		if err := iprot.ReadListEnd(); err != nil {
+		if err := iprot.ReadListEnd(ctx); err != nil {
 			return thrift.PrependError("error reading list end: ", err)
 		}
-		p.MeasurementsList = append(p.MeasurementsList, _elem33)
+		p.MeasurementsList = append(p.MeasurementsList, _elem63)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) ReadField4(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordsOfOneDeviceReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]byte, 0, size)
-	p.ValuesList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem35 []byte
-		if v, err := iprot.ReadBinary(); err != nil {
+	p.ValuesList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem65 []byte
+		if v, err := iprot.ReadBinary(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem35 = v
+			_elem65 = v
 		}
-		p.ValuesList = append(p.ValuesList, _elem35)
+		p.ValuesList = append(p.ValuesList, _elem65)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) ReadField5(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertRecordsOfOneDeviceReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int64, 0, size)
-	p.Timestamps = tSlice
-	for i := 0; i < size; i++ {
-		var _elem36 int64
-		if v, err := iprot.ReadI64(); err != nil {
+	p.Timestamps =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem66 int64
+		if v, err := iprot.ReadI64(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem36 = v
+			_elem66 = v
 		}
-		p.Timestamps = append(p.Timestamps, _elem36)
+		p.Timestamps = append(p.Timestamps, _elem66)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSInsertRecordsOfOneDeviceReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSInsertRecordsOfOneDeviceReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSInsertRecordsOfOneDeviceReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSInsertRecordsOfOneDeviceReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("deviceId", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.DeviceId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err)
-	}
+func (p *TSInsertRecordsOfOneDeviceReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "deviceId", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceId: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.DeviceId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.deviceId (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("measurementsList", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.LIST, len(p.MeasurementsList)); err != nil {
+func (p *TSInsertRecordsOfOneDeviceReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "measurementsList", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.LIST, len(p.MeasurementsList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.MeasurementsList {
-		if err := oprot.WriteListBegin(thrift.STRING, len(v)); err != nil {
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(v)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range v {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("valuesList", thrift.LIST, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.ValuesList)); err != nil {
+func (p *TSInsertRecordsOfOneDeviceReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "valuesList", thrift.LIST, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.ValuesList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.ValuesList {
-		if err := oprot.WriteBinary(v); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteBinary(ctx, v); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertRecordsOfOneDeviceReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestamps", thrift.LIST, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I64, len(p.Timestamps)); err != nil {
+func (p *TSInsertRecordsOfOneDeviceReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestamps", thrift.LIST, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I64, len(p.Timestamps)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Timestamps {
-		if err := oprot.WriteI64(int64(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI64(ctx, int64(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err) }
 	return err
 }
 
+func (p *TSInsertRecordsOfOneDeviceReq) Equals(other *TSInsertRecordsOfOneDeviceReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.DeviceId != other.DeviceId { return false }
+	if len(p.MeasurementsList) != len(other.MeasurementsList) { return false }
+	for i, _tgt := range p.MeasurementsList {
+		_src67 := other.MeasurementsList[i]
+		if len(_tgt) != len(_src67) { return false }
+		for i, _tgt := range _tgt {
+			_src68 := _src67[i]
+			if _tgt != _src68 { return false }
+		}
+	}
+	if len(p.ValuesList) != len(other.ValuesList) { return false }
+	for i, _tgt := range p.ValuesList {
+		_src69 := other.ValuesList[i]
+		if bytes.Compare(_tgt, _src69) != 0 { return false }
+	}
+	if len(p.Timestamps) != len(other.Timestamps) { return false }
+	for i, _tgt := range p.Timestamps {
+		_src70 := other.Timestamps[i]
+		if _tgt != _src70 { return false }
+	}
+	return true
+}
+
 func (p *TSInsertRecordsOfOneDeviceReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -7134,17 +7012,18 @@
 //  - ValuesList
 //  - Timestamps
 type TSInsertStringRecordsReq struct {
-	SessionId        int64      `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	DeviceIds        []string   `thrift:"deviceIds,2,required" db:"deviceIds" json:"deviceIds"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	DeviceIds []string `thrift:"deviceIds,2,required" db:"deviceIds" json:"deviceIds"`
 	MeasurementsList [][]string `thrift:"measurementsList,3,required" db:"measurementsList" json:"measurementsList"`
-	ValuesList       [][]string `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
-	Timestamps       []int64    `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
+	ValuesList [][]string `thrift:"valuesList,4,required" db:"valuesList" json:"valuesList"`
+	Timestamps []int64 `thrift:"timestamps,5,required" db:"timestamps" json:"timestamps"`
 }
 
 func NewTSInsertStringRecordsReq() *TSInsertStringRecordsReq {
 	return &TSInsertStringRecordsReq{}
 }
 
+
 func (p *TSInsertStringRecordsReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -7164,113 +7043,111 @@
 func (p *TSInsertStringRecordsReq) GetTimestamps() []int64 {
 	return p.Timestamps
 }
-func (p *TSInsertStringRecordsReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSInsertStringRecordsReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetDeviceIds bool = false
-	var issetMeasurementsList bool = false
-	var issetValuesList bool = false
-	var issetTimestamps bool = false
+	var issetSessionId bool = false;
+	var issetDeviceIds bool = false;
+	var issetMeasurementsList bool = false;
+	var issetValuesList bool = false;
+	var issetTimestamps bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetDeviceIds = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetMeasurementsList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetValuesList = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestamps = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetDeviceIds {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceIds is not set"))
+	if !issetDeviceIds{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DeviceIds is not set"));
 	}
-	if !issetMeasurementsList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"))
+	if !issetMeasurementsList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MeasurementsList is not set"));
 	}
-	if !issetValuesList {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"))
+	if !issetValuesList{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ValuesList is not set"));
 	}
-	if !issetTimestamps {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"))
+	if !issetTimestamps{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamps is not set"));
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordsReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSInsertStringRecordsReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -7278,261 +7155,271 @@
 	return nil
 }
 
-func (p *TSInsertStringRecordsReq) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertStringRecordsReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.DeviceIds = tSlice
-	for i := 0; i < size; i++ {
-		var _elem37 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.DeviceIds =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem71 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem37 = v
+			_elem71 = v
 		}
-		p.DeviceIds = append(p.DeviceIds, _elem37)
+		p.DeviceIds = append(p.DeviceIds, _elem71)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordsReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertStringRecordsReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]string, 0, size)
-	p.MeasurementsList = tSlice
-	for i := 0; i < size; i++ {
-		_, size, err := iprot.ReadListBegin()
+	p.MeasurementsList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, size, err := iprot.ReadListBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading list begin: ", err)
 		}
 		tSlice := make([]string, 0, size)
-		_elem38 := tSlice
-		for i := 0; i < size; i++ {
-			var _elem39 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem72 :=  tSlice
+		for i := 0; i < size; i ++ {
+			var _elem73 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_elem39 = v
+				_elem73 = v
 			}
-			_elem38 = append(_elem38, _elem39)
+			_elem72 = append(_elem72, _elem73)
 		}
-		if err := iprot.ReadListEnd(); err != nil {
+		if err := iprot.ReadListEnd(ctx); err != nil {
 			return thrift.PrependError("error reading list end: ", err)
 		}
-		p.MeasurementsList = append(p.MeasurementsList, _elem38)
+		p.MeasurementsList = append(p.MeasurementsList, _elem72)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordsReq) ReadField4(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertStringRecordsReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([][]string, 0, size)
-	p.ValuesList = tSlice
-	for i := 0; i < size; i++ {
-		_, size, err := iprot.ReadListBegin()
+	p.ValuesList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, size, err := iprot.ReadListBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading list begin: ", err)
 		}
 		tSlice := make([]string, 0, size)
-		_elem40 := tSlice
-		for i := 0; i < size; i++ {
-			var _elem41 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem74 :=  tSlice
+		for i := 0; i < size; i ++ {
+			var _elem75 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_elem41 = v
+				_elem75 = v
 			}
-			_elem40 = append(_elem40, _elem41)
+			_elem74 = append(_elem74, _elem75)
 		}
-		if err := iprot.ReadListEnd(); err != nil {
+		if err := iprot.ReadListEnd(ctx); err != nil {
 			return thrift.PrependError("error reading list end: ", err)
 		}
-		p.ValuesList = append(p.ValuesList, _elem40)
+		p.ValuesList = append(p.ValuesList, _elem74)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordsReq) ReadField5(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSInsertStringRecordsReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int64, 0, size)
-	p.Timestamps = tSlice
-	for i := 0; i < size; i++ {
-		var _elem42 int64
-		if v, err := iprot.ReadI64(); err != nil {
+	p.Timestamps =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem76 int64
+		if v, err := iprot.ReadI64(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem42 = v
+			_elem76 = v
 		}
-		p.Timestamps = append(p.Timestamps, _elem42)
+		p.Timestamps = append(p.Timestamps, _elem76)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSInsertStringRecordsReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSInsertStringRecordsReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSInsertStringRecordsReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSInsertStringRecordsReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSInsertStringRecordsReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSInsertStringRecordsReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordsReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("deviceIds", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceIds: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.DeviceIds)); err != nil {
+func (p *TSInsertStringRecordsReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "deviceIds", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:deviceIds: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.DeviceIds)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.DeviceIds {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceIds: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:deviceIds: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordsReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("measurementsList", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.LIST, len(p.MeasurementsList)); err != nil {
+func (p *TSInsertStringRecordsReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "measurementsList", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:measurementsList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.LIST, len(p.MeasurementsList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.MeasurementsList {
-		if err := oprot.WriteListBegin(thrift.STRING, len(v)); err != nil {
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(v)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range v {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:measurementsList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordsReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("valuesList", thrift.LIST, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.LIST, len(p.ValuesList)); err != nil {
+func (p *TSInsertStringRecordsReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "valuesList", thrift.LIST, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:valuesList: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.LIST, len(p.ValuesList)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.ValuesList {
-		if err := oprot.WriteListBegin(thrift.STRING, len(v)); err != nil {
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(v)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range v {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:valuesList: ", p), err) }
 	return err
 }
 
-func (p *TSInsertStringRecordsReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestamps", thrift.LIST, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I64, len(p.Timestamps)); err != nil {
+func (p *TSInsertStringRecordsReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestamps", thrift.LIST, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:timestamps: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I64, len(p.Timestamps)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Timestamps {
-		if err := oprot.WriteI64(int64(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI64(ctx, int64(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:timestamps: ", p), err) }
 	return err
 }
 
+func (p *TSInsertStringRecordsReq) Equals(other *TSInsertStringRecordsReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if len(p.DeviceIds) != len(other.DeviceIds) { return false }
+	for i, _tgt := range p.DeviceIds {
+		_src77 := other.DeviceIds[i]
+		if _tgt != _src77 { return false }
+	}
+	if len(p.MeasurementsList) != len(other.MeasurementsList) { return false }
+	for i, _tgt := range p.MeasurementsList {
+		_src78 := other.MeasurementsList[i]
+		if len(_tgt) != len(_src78) { return false }
+		for i, _tgt := range _tgt {
+			_src79 := _src78[i]
+			if _tgt != _src79 { return false }
+		}
+	}
+	if len(p.ValuesList) != len(other.ValuesList) { return false }
+	for i, _tgt := range p.ValuesList {
+		_src80 := other.ValuesList[i]
+		if len(_tgt) != len(_src80) { return false }
+		for i, _tgt := range _tgt {
+			_src81 := _src80[i]
+			if _tgt != _src81 { return false }
+		}
+	}
+	if len(p.Timestamps) != len(other.Timestamps) { return false }
+	for i, _tgt := range p.Timestamps {
+		_src82 := other.Timestamps[i]
+		if _tgt != _src82 { return false }
+	}
+	return true
+}
+
 func (p *TSInsertStringRecordsReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -7546,16 +7433,17 @@
 //  - StartTime
 //  - EndTime
 type TSDeleteDataReq struct {
-	SessionId int64    `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	Paths     []string `thrift:"paths,2,required" db:"paths" json:"paths"`
-	StartTime int64    `thrift:"startTime,3,required" db:"startTime" json:"startTime"`
-	EndTime   int64    `thrift:"endTime,4,required" db:"endTime" json:"endTime"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	Paths []string `thrift:"paths,2,required" db:"paths" json:"paths"`
+	StartTime int64 `thrift:"startTime,3,required" db:"startTime" json:"startTime"`
+	EndTime int64 `thrift:"endTime,4,required" db:"endTime" json:"endTime"`
 }
 
 func NewTSDeleteDataReq() *TSDeleteDataReq {
 	return &TSDeleteDataReq{}
 }
 
+
 func (p *TSDeleteDataReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -7571,98 +7459,96 @@
 func (p *TSDeleteDataReq) GetEndTime() int64 {
 	return p.EndTime
 }
-func (p *TSDeleteDataReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSDeleteDataReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetPaths bool = false
-	var issetStartTime bool = false
-	var issetEndTime bool = false
+	var issetSessionId bool = false;
+	var issetPaths bool = false;
+	var issetStartTime bool = false;
+	var issetEndTime bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetPaths = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetStartTime = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetEndTime = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetPaths {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Paths is not set"))
+	if !issetPaths{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Paths is not set"));
 	}
-	if !issetStartTime {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StartTime is not set"))
+	if !issetStartTime{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StartTime is not set"));
 	}
-	if !issetEndTime {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EndTime is not set"))
+	if !issetEndTime{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EndTime is not set"));
 	}
 	return nil
 }
 
-func (p *TSDeleteDataReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSDeleteDataReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -7670,30 +7556,30 @@
 	return nil
 }
 
-func (p *TSDeleteDataReq) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSDeleteDataReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Paths = tSlice
-	for i := 0; i < size; i++ {
-		var _elem43 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Paths =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem83 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem43 = v
+			_elem83 = v
 		}
-		p.Paths = append(p.Paths, _elem43)
+		p.Paths = append(p.Paths, _elem83)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSDeleteDataReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSDeleteDataReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.StartTime = v
@@ -7701,8 +7587,8 @@
 	return nil
 }
 
-func (p *TSDeleteDataReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSDeleteDataReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.EndTime = v
@@ -7710,93 +7596,87 @@
 	return nil
 }
 
-func (p *TSDeleteDataReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSDeleteDataReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSDeleteDataReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSDeleteDataReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSDeleteDataReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSDeleteDataReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSDeleteDataReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("paths", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:paths: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Paths)); err != nil {
+func (p *TSDeleteDataReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "paths", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:paths: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Paths)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Paths {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:paths: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:paths: ", p), err) }
 	return err
 }
 
-func (p *TSDeleteDataReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("startTime", thrift.I64, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:startTime: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.StartTime)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.startTime (3) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:startTime: ", p), err)
-	}
+func (p *TSDeleteDataReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "startTime", thrift.I64, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:startTime: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.StartTime)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.startTime (3) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:startTime: ", p), err) }
 	return err
 }
 
-func (p *TSDeleteDataReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("endTime", thrift.I64, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:endTime: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.EndTime)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.endTime (4) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:endTime: ", p), err)
-	}
+func (p *TSDeleteDataReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "endTime", thrift.I64, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:endTime: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.EndTime)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.endTime (4) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:endTime: ", p), err) }
 	return err
 }
 
+func (p *TSDeleteDataReq) Equals(other *TSDeleteDataReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if len(p.Paths) != len(other.Paths) { return false }
+	for i, _tgt := range p.Paths {
+		_src84 := other.Paths[i]
+		if _tgt != _src84 { return false }
+	}
+	if p.StartTime != other.StartTime { return false }
+	if p.EndTime != other.EndTime { return false }
+	return true
+}
+
 func (p *TSDeleteDataReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -7815,21 +7695,22 @@
 //  - Attributes
 //  - MeasurementAlias
 type TSCreateTimeseriesReq struct {
-	SessionId        int64             `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	Path             string            `thrift:"path,2,required" db:"path" json:"path"`
-	DataType         int32             `thrift:"dataType,3,required" db:"dataType" json:"dataType"`
-	Encoding         int32             `thrift:"encoding,4,required" db:"encoding" json:"encoding"`
-	Compressor       int32             `thrift:"compressor,5,required" db:"compressor" json:"compressor"`
-	Props            map[string]string `thrift:"props,6" db:"props" json:"props,omitempty"`
-	Tags             map[string]string `thrift:"tags,7" db:"tags" json:"tags,omitempty"`
-	Attributes       map[string]string `thrift:"attributes,8" db:"attributes" json:"attributes,omitempty"`
-	MeasurementAlias *string           `thrift:"measurementAlias,9" db:"measurementAlias" json:"measurementAlias,omitempty"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	Path string `thrift:"path,2,required" db:"path" json:"path"`
+	DataType int32 `thrift:"dataType,3,required" db:"dataType" json:"dataType"`
+	Encoding int32 `thrift:"encoding,4,required" db:"encoding" json:"encoding"`
+	Compressor int32 `thrift:"compressor,5,required" db:"compressor" json:"compressor"`
+	Props map[string]string `thrift:"props,6" db:"props" json:"props,omitempty"`
+	Tags map[string]string `thrift:"tags,7" db:"tags" json:"tags,omitempty"`
+	Attributes map[string]string `thrift:"attributes,8" db:"attributes" json:"attributes,omitempty"`
+	MeasurementAlias *string `thrift:"measurementAlias,9" db:"measurementAlias" json:"measurementAlias,omitempty"`
 }
 
 func NewTSCreateTimeseriesReq() *TSCreateTimeseriesReq {
 	return &TSCreateTimeseriesReq{}
 }
 
+
 func (p *TSCreateTimeseriesReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -7849,27 +7730,22 @@
 func (p *TSCreateTimeseriesReq) GetCompressor() int32 {
 	return p.Compressor
 }
-
 var TSCreateTimeseriesReq_Props_DEFAULT map[string]string
 
 func (p *TSCreateTimeseriesReq) GetProps() map[string]string {
 	return p.Props
 }
-
 var TSCreateTimeseriesReq_Tags_DEFAULT map[string]string
 
 func (p *TSCreateTimeseriesReq) GetTags() map[string]string {
 	return p.Tags
 }
-
 var TSCreateTimeseriesReq_Attributes_DEFAULT map[string]string
 
 func (p *TSCreateTimeseriesReq) GetAttributes() map[string]string {
 	return p.Attributes
 }
-
 var TSCreateTimeseriesReq_MeasurementAlias_DEFAULT string
-
 func (p *TSCreateTimeseriesReq) GetMeasurementAlias() string {
 	if !p.IsSetMeasurementAlias() {
 		return TSCreateTimeseriesReq_MeasurementAlias_DEFAULT
@@ -7892,153 +7768,151 @@
 	return p.MeasurementAlias != nil
 }
 
-func (p *TSCreateTimeseriesReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSCreateTimeseriesReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetPath bool = false
-	var issetDataType bool = false
-	var issetEncoding bool = false
-	var issetCompressor bool = false
+	var issetSessionId bool = false;
+	var issetPath bool = false;
+	var issetDataType bool = false;
+	var issetEncoding bool = false;
+	var issetCompressor bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetPath = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetDataType = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetEncoding = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetCompressor = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.MAP {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 7:
 			if fieldTypeId == thrift.MAP {
-				if err := p.ReadField7(iprot); err != nil {
+				if err := p.ReadField7(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 8:
 			if fieldTypeId == thrift.MAP {
-				if err := p.ReadField8(iprot); err != nil {
+				if err := p.ReadField8(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 9:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField9(iprot); err != nil {
+				if err := p.ReadField9(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetPath {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Path is not set"))
+	if !issetPath{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Path is not set"));
 	}
-	if !issetDataType {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DataType is not set"))
+	if !issetDataType{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DataType is not set"));
 	}
-	if !issetEncoding {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Encoding is not set"))
+	if !issetEncoding{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Encoding is not set"));
 	}
-	if !issetCompressor {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Compressor is not set"))
+	if !issetCompressor{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Compressor is not set"));
 	}
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCreateTimeseriesReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -8046,8 +7920,8 @@
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSCreateTimeseriesReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.Path = v
@@ -8055,8 +7929,8 @@
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSCreateTimeseriesReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.DataType = v
@@ -8064,8 +7938,8 @@
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSCreateTimeseriesReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.Encoding = v
@@ -8073,8 +7947,8 @@
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSCreateTimeseriesReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.Compressor = v
@@ -8082,92 +7956,92 @@
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField6(iprot thrift.TProtocol) error {
-	_, _, size, err := iprot.ReadMapBegin()
+func (p *TSCreateTimeseriesReq)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	_, _, size, err := iprot.ReadMapBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading map begin: ", err)
 	}
 	tMap := make(map[string]string, size)
-	p.Props = tMap
-	for i := 0; i < size; i++ {
-		var _key44 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Props =  tMap
+	for i := 0; i < size; i ++ {
+		var _key85 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_key44 = v
+			_key85 = v
 		}
-		var _val45 string
-		if v, err := iprot.ReadString(); err != nil {
+		var _val86 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_val45 = v
+			_val86 = v
 		}
-		p.Props[_key44] = _val45
+		p.Props[_key85] = _val86
 	}
-	if err := iprot.ReadMapEnd(); err != nil {
+	if err := iprot.ReadMapEnd(ctx); err != nil {
 		return thrift.PrependError("error reading map end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField7(iprot thrift.TProtocol) error {
-	_, _, size, err := iprot.ReadMapBegin()
+func (p *TSCreateTimeseriesReq)  ReadField7(ctx context.Context, iprot thrift.TProtocol) error {
+	_, _, size, err := iprot.ReadMapBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading map begin: ", err)
 	}
 	tMap := make(map[string]string, size)
-	p.Tags = tMap
-	for i := 0; i < size; i++ {
-		var _key46 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Tags =  tMap
+	for i := 0; i < size; i ++ {
+		var _key87 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_key46 = v
+			_key87 = v
 		}
-		var _val47 string
-		if v, err := iprot.ReadString(); err != nil {
+		var _val88 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_val47 = v
+			_val88 = v
 		}
-		p.Tags[_key46] = _val47
+		p.Tags[_key87] = _val88
 	}
-	if err := iprot.ReadMapEnd(); err != nil {
+	if err := iprot.ReadMapEnd(ctx); err != nil {
 		return thrift.PrependError("error reading map end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField8(iprot thrift.TProtocol) error {
-	_, _, size, err := iprot.ReadMapBegin()
+func (p *TSCreateTimeseriesReq)  ReadField8(ctx context.Context, iprot thrift.TProtocol) error {
+	_, _, size, err := iprot.ReadMapBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading map begin: ", err)
 	}
 	tMap := make(map[string]string, size)
-	p.Attributes = tMap
-	for i := 0; i < size; i++ {
-		var _key48 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Attributes =  tMap
+	for i := 0; i < size; i ++ {
+		var _key89 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_key48 = v
+			_key89 = v
 		}
-		var _val49 string
-		if v, err := iprot.ReadString(); err != nil {
+		var _val90 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_val49 = v
+			_val90 = v
 		}
-		p.Attributes[_key48] = _val49
+		p.Attributes[_key89] = _val90
 	}
-	if err := iprot.ReadMapEnd(); err != nil {
+	if err := iprot.ReadMapEnd(ctx); err != nil {
 		return thrift.PrependError("error reading map end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) ReadField9(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSCreateTimeseriesReq)  ReadField9(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 9: ", err)
 	} else {
 		p.MeasurementAlias = &v
@@ -8175,206 +8049,190 @@
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSCreateTimeseriesReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSCreateTimeseriesReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSCreateTimeseriesReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField7(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField8(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField9(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
+		if err := p.writeField7(ctx, oprot); err != nil { return err }
+		if err := p.writeField8(ctx, oprot); err != nil { return err }
+		if err := p.writeField9(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSCreateTimeseriesReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSCreateTimeseriesReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("path", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:path: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.Path)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.path (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:path: ", p), err)
-	}
+func (p *TSCreateTimeseriesReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "path", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:path: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.Path)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.path (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:path: ", p), err) }
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("dataType", thrift.I32, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:dataType: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.DataType)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.dataType (3) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:dataType: ", p), err)
-	}
+func (p *TSCreateTimeseriesReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "dataType", thrift.I32, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:dataType: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.DataType)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.dataType (3) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:dataType: ", p), err) }
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("encoding", thrift.I32, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:encoding: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.Encoding)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.encoding (4) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:encoding: ", p), err)
-	}
+func (p *TSCreateTimeseriesReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "encoding", thrift.I32, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:encoding: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.Encoding)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.encoding (4) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:encoding: ", p), err) }
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("compressor", thrift.I32, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:compressor: ", p), err)
-	}
-	if err := oprot.WriteI32(int32(p.Compressor)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.compressor (5) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:compressor: ", p), err)
-	}
+func (p *TSCreateTimeseriesReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "compressor", thrift.I32, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:compressor: ", p), err) }
+	if err := oprot.WriteI32(ctx, int32(p.Compressor)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.compressor (5) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:compressor: ", p), err) }
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField6(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateTimeseriesReq) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetProps() {
-		if err := oprot.WriteFieldBegin("props", thrift.MAP, 6); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:props: ", p), err)
-		}
-		if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Props)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "props", thrift.MAP, 6); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:props: ", p), err) }
+		if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(p.Props)); err != nil {
 			return thrift.PrependError("error writing map begin: ", err)
 		}
 		for k, v := range p.Props {
-			if err := oprot.WriteString(string(k)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(k)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteMapEnd(); err != nil {
+		if err := oprot.WriteMapEnd(ctx); err != nil {
 			return thrift.PrependError("error writing map end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:props: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:props: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField7(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateTimeseriesReq) writeField7(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetTags() {
-		if err := oprot.WriteFieldBegin("tags", thrift.MAP, 7); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:tags: ", p), err)
-		}
-		if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Tags)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "tags", thrift.MAP, 7); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:tags: ", p), err) }
+		if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(p.Tags)); err != nil {
 			return thrift.PrependError("error writing map begin: ", err)
 		}
 		for k, v := range p.Tags {
-			if err := oprot.WriteString(string(k)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(k)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteMapEnd(); err != nil {
+		if err := oprot.WriteMapEnd(ctx); err != nil {
 			return thrift.PrependError("error writing map end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:tags: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:tags: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField8(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateTimeseriesReq) writeField8(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetAttributes() {
-		if err := oprot.WriteFieldBegin("attributes", thrift.MAP, 8); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:attributes: ", p), err)
-		}
-		if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(p.Attributes)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "attributes", thrift.MAP, 8); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:attributes: ", p), err) }
+		if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(p.Attributes)); err != nil {
 			return thrift.PrependError("error writing map begin: ", err)
 		}
 		for k, v := range p.Attributes {
-			if err := oprot.WriteString(string(k)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(k)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteMapEnd(); err != nil {
+		if err := oprot.WriteMapEnd(ctx); err != nil {
 			return thrift.PrependError("error writing map end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 8:attributes: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 8:attributes: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSCreateTimeseriesReq) writeField9(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateTimeseriesReq) writeField9(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetMeasurementAlias() {
-		if err := oprot.WriteFieldBegin("measurementAlias", thrift.STRING, 9); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:measurementAlias: ", p), err)
-		}
-		if err := oprot.WriteString(string(*p.MeasurementAlias)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.measurementAlias (9) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 9:measurementAlias: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "measurementAlias", thrift.STRING, 9); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:measurementAlias: ", p), err) }
+		if err := oprot.WriteString(ctx, string(*p.MeasurementAlias)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.measurementAlias (9) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 9:measurementAlias: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSCreateTimeseriesReq) Equals(other *TSCreateTimeseriesReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if p.Path != other.Path { return false }
+	if p.DataType != other.DataType { return false }
+	if p.Encoding != other.Encoding { return false }
+	if p.Compressor != other.Compressor { return false }
+	if len(p.Props) != len(other.Props) { return false }
+	for k, _tgt := range p.Props {
+		_src91 := other.Props[k]
+		if _tgt != _src91 { return false }
+	}
+	if len(p.Tags) != len(other.Tags) { return false }
+	for k, _tgt := range p.Tags {
+		_src92 := other.Tags[k]
+		if _tgt != _src92 { return false }
+	}
+	if len(p.Attributes) != len(other.Attributes) { return false }
+	for k, _tgt := range p.Attributes {
+		_src93 := other.Attributes[k]
+		if _tgt != _src93 { return false }
+	}
+	if p.MeasurementAlias != other.MeasurementAlias {
+		if p.MeasurementAlias == nil || other.MeasurementAlias == nil {
+			return false
+		}
+		if (*p.MeasurementAlias) != (*other.MeasurementAlias) { return false }
+	}
+	return true
+}
+
 func (p *TSCreateTimeseriesReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -8391,19 +8249,20 @@
 //  - StatementId
 //  - EnableRedirectQuery
 type TSRawDataQueryReq struct {
-	SessionId           int64    `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	Paths               []string `thrift:"paths,2,required" db:"paths" json:"paths"`
-	FetchSize           *int32   `thrift:"fetchSize,3" db:"fetchSize" json:"fetchSize,omitempty"`
-	StartTime           int64    `thrift:"startTime,4,required" db:"startTime" json:"startTime"`
-	EndTime             int64    `thrift:"endTime,5,required" db:"endTime" json:"endTime"`
-	StatementId         int64    `thrift:"statementId,6,required" db:"statementId" json:"statementId"`
-	EnableRedirectQuery *bool    `thrift:"enableRedirectQuery,7" db:"enableRedirectQuery" json:"enableRedirectQuery,omitempty"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	Paths []string `thrift:"paths,2,required" db:"paths" json:"paths"`
+	FetchSize *int32 `thrift:"fetchSize,3" db:"fetchSize" json:"fetchSize,omitempty"`
+	StartTime int64 `thrift:"startTime,4,required" db:"startTime" json:"startTime"`
+	EndTime int64 `thrift:"endTime,5,required" db:"endTime" json:"endTime"`
+	StatementId int64 `thrift:"statementId,6,required" db:"statementId" json:"statementId"`
+	EnableRedirectQuery *bool `thrift:"enableRedirectQuery,7" db:"enableRedirectQuery" json:"enableRedirectQuery,omitempty"`
 }
 
 func NewTSRawDataQueryReq() *TSRawDataQueryReq {
 	return &TSRawDataQueryReq{}
 }
 
+
 func (p *TSRawDataQueryReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -8411,9 +8270,7 @@
 func (p *TSRawDataQueryReq) GetPaths() []string {
 	return p.Paths
 }
-
 var TSRawDataQueryReq_FetchSize_DEFAULT int32
-
 func (p *TSRawDataQueryReq) GetFetchSize() int32 {
 	if !p.IsSetFetchSize() {
 		return TSRawDataQueryReq_FetchSize_DEFAULT
@@ -8432,9 +8289,7 @@
 func (p *TSRawDataQueryReq) GetStatementId() int64 {
 	return p.StatementId
 }
-
 var TSRawDataQueryReq_EnableRedirectQuery_DEFAULT bool
-
 func (p *TSRawDataQueryReq) GetEnableRedirectQuery() bool {
 	if !p.IsSetEnableRedirectQuery() {
 		return TSRawDataQueryReq_EnableRedirectQuery_DEFAULT
@@ -8449,133 +8304,131 @@
 	return p.EnableRedirectQuery != nil
 }
 
-func (p *TSRawDataQueryReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSRawDataQueryReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetPaths bool = false
-	var issetStartTime bool = false
-	var issetEndTime bool = false
-	var issetStatementId bool = false
+	var issetSessionId bool = false;
+	var issetPaths bool = false;
+	var issetStartTime bool = false;
+	var issetEndTime bool = false;
+	var issetStatementId bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetPaths = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.I32 {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetStartTime = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetEndTime = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 				issetStatementId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 7:
 			if fieldTypeId == thrift.BOOL {
-				if err := p.ReadField7(iprot); err != nil {
+				if err := p.ReadField7(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetPaths {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Paths is not set"))
+	if !issetPaths{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Paths is not set"));
 	}
-	if !issetStartTime {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StartTime is not set"))
+	if !issetStartTime{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StartTime is not set"));
 	}
-	if !issetEndTime {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EndTime is not set"))
+	if !issetEndTime{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field EndTime is not set"));
 	}
-	if !issetStatementId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StatementId is not set"))
+	if !issetStatementId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StatementId is not set"));
 	}
 	return nil
 }
 
-func (p *TSRawDataQueryReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSRawDataQueryReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -8583,30 +8436,30 @@
 	return nil
 }
 
-func (p *TSRawDataQueryReq) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSRawDataQueryReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Paths = tSlice
-	for i := 0; i < size; i++ {
-		var _elem50 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Paths =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem94 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem50 = v
+			_elem94 = v
 		}
-		p.Paths = append(p.Paths, _elem50)
+		p.Paths = append(p.Paths, _elem94)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSRawDataQueryReq) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI32(); err != nil {
+func (p *TSRawDataQueryReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI32(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.FetchSize = &v
@@ -8614,8 +8467,8 @@
 	return nil
 }
 
-func (p *TSRawDataQueryReq) ReadField4(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSRawDataQueryReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 4: ", err)
 	} else {
 		p.StartTime = v
@@ -8623,8 +8476,8 @@
 	return nil
 }
 
-func (p *TSRawDataQueryReq) ReadField5(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSRawDataQueryReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 5: ", err)
 	} else {
 		p.EndTime = v
@@ -8632,8 +8485,8 @@
 	return nil
 }
 
-func (p *TSRawDataQueryReq) ReadField6(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSRawDataQueryReq)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 6: ", err)
 	} else {
 		p.StatementId = v
@@ -8641,8 +8494,8 @@
 	return nil
 }
 
-func (p *TSRawDataQueryReq) ReadField7(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadBool(); err != nil {
+func (p *TSRawDataQueryReq)  ReadField7(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadBool(ctx); err != nil {
 		return thrift.PrependError("error reading field 7: ", err)
 	} else {
 		p.EnableRedirectQuery = &v
@@ -8650,145 +8503,137 @@
 	return nil
 }
 
-func (p *TSRawDataQueryReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSRawDataQueryReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSRawDataQueryReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSRawDataQueryReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField7(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
+		if err := p.writeField7(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSRawDataQueryReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSRawDataQueryReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSRawDataQueryReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("paths", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:paths: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Paths)); err != nil {
+func (p *TSRawDataQueryReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "paths", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:paths: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Paths)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Paths {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:paths: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:paths: ", p), err) }
 	return err
 }
 
-func (p *TSRawDataQueryReq) writeField3(oprot thrift.TProtocol) (err error) {
+func (p *TSRawDataQueryReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetFetchSize() {
-		if err := oprot.WriteFieldBegin("fetchSize", thrift.I32, 3); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:fetchSize: ", p), err)
-		}
-		if err := oprot.WriteI32(int32(*p.FetchSize)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.fetchSize (3) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:fetchSize: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "fetchSize", thrift.I32, 3); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:fetchSize: ", p), err) }
+		if err := oprot.WriteI32(ctx, int32(*p.FetchSize)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.fetchSize (3) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 3:fetchSize: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSRawDataQueryReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("startTime", thrift.I64, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:startTime: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.StartTime)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.startTime (4) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:startTime: ", p), err)
-	}
+func (p *TSRawDataQueryReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "startTime", thrift.I64, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:startTime: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.StartTime)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.startTime (4) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:startTime: ", p), err) }
 	return err
 }
 
-func (p *TSRawDataQueryReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("endTime", thrift.I64, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:endTime: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.EndTime)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.endTime (5) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:endTime: ", p), err)
-	}
+func (p *TSRawDataQueryReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "endTime", thrift.I64, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:endTime: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.EndTime)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.endTime (5) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:endTime: ", p), err) }
 	return err
 }
 
-func (p *TSRawDataQueryReq) writeField6(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("statementId", thrift.I64, 6); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:statementId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.StatementId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.statementId (6) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 6:statementId: ", p), err)
-	}
+func (p *TSRawDataQueryReq) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "statementId", thrift.I64, 6); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:statementId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.StatementId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.statementId (6) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 6:statementId: ", p), err) }
 	return err
 }
 
-func (p *TSRawDataQueryReq) writeField7(oprot thrift.TProtocol) (err error) {
+func (p *TSRawDataQueryReq) writeField7(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetEnableRedirectQuery() {
-		if err := oprot.WriteFieldBegin("enableRedirectQuery", thrift.BOOL, 7); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:enableRedirectQuery: ", p), err)
-		}
-		if err := oprot.WriteBool(bool(*p.EnableRedirectQuery)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.enableRedirectQuery (7) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:enableRedirectQuery: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "enableRedirectQuery", thrift.BOOL, 7); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:enableRedirectQuery: ", p), err) }
+		if err := oprot.WriteBool(ctx, bool(*p.EnableRedirectQuery)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.enableRedirectQuery (7) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:enableRedirectQuery: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSRawDataQueryReq) Equals(other *TSRawDataQueryReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if len(p.Paths) != len(other.Paths) { return false }
+	for i, _tgt := range p.Paths {
+		_src95 := other.Paths[i]
+		if _tgt != _src95 { return false }
+	}
+	if p.FetchSize != other.FetchSize {
+		if p.FetchSize == nil || other.FetchSize == nil {
+			return false
+		}
+		if (*p.FetchSize) != (*other.FetchSize) { return false }
+	}
+	if p.StartTime != other.StartTime { return false }
+	if p.EndTime != other.EndTime { return false }
+	if p.StatementId != other.StatementId { return false }
+	if p.EnableRedirectQuery != other.EnableRedirectQuery {
+		if p.EnableRedirectQuery == nil || other.EnableRedirectQuery == nil {
+			return false
+		}
+		if (*p.EnableRedirectQuery) != (*other.EnableRedirectQuery) { return false }
+	}
+	return true
+}
+
 func (p *TSRawDataQueryReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -8807,21 +8652,22 @@
 //  - AttributesList
 //  - MeasurementAliasList
 type TSCreateMultiTimeseriesReq struct {
-	SessionId            int64               `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
-	Paths                []string            `thrift:"paths,2,required" db:"paths" json:"paths"`
-	DataTypes            []int32             `thrift:"dataTypes,3,required" db:"dataTypes" json:"dataTypes"`
-	Encodings            []int32             `thrift:"encodings,4,required" db:"encodings" json:"encodings"`
-	Compressors          []int32             `thrift:"compressors,5,required" db:"compressors" json:"compressors"`
-	PropsList            []map[string]string `thrift:"propsList,6" db:"propsList" json:"propsList,omitempty"`
-	TagsList             []map[string]string `thrift:"tagsList,7" db:"tagsList" json:"tagsList,omitempty"`
-	AttributesList       []map[string]string `thrift:"attributesList,8" db:"attributesList" json:"attributesList,omitempty"`
-	MeasurementAliasList []string            `thrift:"measurementAliasList,9" db:"measurementAliasList" json:"measurementAliasList,omitempty"`
+	SessionId int64 `thrift:"sessionId,1,required" db:"sessionId" json:"sessionId"`
+	Paths []string `thrift:"paths,2,required" db:"paths" json:"paths"`
+	DataTypes []int32 `thrift:"dataTypes,3,required" db:"dataTypes" json:"dataTypes"`
+	Encodings []int32 `thrift:"encodings,4,required" db:"encodings" json:"encodings"`
+	Compressors []int32 `thrift:"compressors,5,required" db:"compressors" json:"compressors"`
+	PropsList []map[string]string `thrift:"propsList,6" db:"propsList" json:"propsList,omitempty"`
+	TagsList []map[string]string `thrift:"tagsList,7" db:"tagsList" json:"tagsList,omitempty"`
+	AttributesList []map[string]string `thrift:"attributesList,8" db:"attributesList" json:"attributesList,omitempty"`
+	MeasurementAliasList []string `thrift:"measurementAliasList,9" db:"measurementAliasList" json:"measurementAliasList,omitempty"`
 }
 
 func NewTSCreateMultiTimeseriesReq() *TSCreateMultiTimeseriesReq {
 	return &TSCreateMultiTimeseriesReq{}
 }
 
+
 func (p *TSCreateMultiTimeseriesReq) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -8841,25 +8687,21 @@
 func (p *TSCreateMultiTimeseriesReq) GetCompressors() []int32 {
 	return p.Compressors
 }
-
 var TSCreateMultiTimeseriesReq_PropsList_DEFAULT []map[string]string
 
 func (p *TSCreateMultiTimeseriesReq) GetPropsList() []map[string]string {
 	return p.PropsList
 }
-
 var TSCreateMultiTimeseriesReq_TagsList_DEFAULT []map[string]string
 
 func (p *TSCreateMultiTimeseriesReq) GetTagsList() []map[string]string {
 	return p.TagsList
 }
-
 var TSCreateMultiTimeseriesReq_AttributesList_DEFAULT []map[string]string
 
 func (p *TSCreateMultiTimeseriesReq) GetAttributesList() []map[string]string {
 	return p.AttributesList
 }
-
 var TSCreateMultiTimeseriesReq_MeasurementAliasList_DEFAULT []string
 
 func (p *TSCreateMultiTimeseriesReq) GetMeasurementAliasList() []string {
@@ -8881,153 +8723,151 @@
 	return p.MeasurementAliasList != nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSCreateMultiTimeseriesReq) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetSessionId bool = false
-	var issetPaths bool = false
-	var issetDataTypes bool = false
-	var issetEncodings bool = false
-	var issetCompressors bool = false
+	var issetSessionId bool = false;
+	var issetPaths bool = false;
+	var issetDataTypes bool = false;
+	var issetEncodings bool = false;
+	var issetCompressors bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetSessionId = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetPaths = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetDataTypes = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 4:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField4(iprot); err != nil {
+				if err := p.ReadField4(ctx, iprot); err != nil {
 					return err
 				}
 				issetEncodings = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 5:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField5(iprot); err != nil {
+				if err := p.ReadField5(ctx, iprot); err != nil {
 					return err
 				}
 				issetCompressors = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 6:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField6(iprot); err != nil {
+				if err := p.ReadField6(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 7:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField7(iprot); err != nil {
+				if err := p.ReadField7(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 8:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField8(iprot); err != nil {
+				if err := p.ReadField8(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 9:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField9(iprot); err != nil {
+				if err := p.ReadField9(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetSessionId {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"))
+	if !issetSessionId{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SessionId is not set"));
 	}
-	if !issetPaths {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Paths is not set"))
+	if !issetPaths{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Paths is not set"));
 	}
-	if !issetDataTypes {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DataTypes is not set"))
+	if !issetDataTypes{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DataTypes is not set"));
 	}
-	if !issetEncodings {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Encodings is not set"))
+	if !issetEncodings{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Encodings is not set"));
 	}
-	if !issetCompressors {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Compressors is not set"))
+	if !issetCompressors{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Compressors is not set"));
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSCreateMultiTimeseriesReq)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -9035,500 +8875,511 @@
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Paths = tSlice
-	for i := 0; i < size; i++ {
-		var _elem51 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Paths =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem96 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem51 = v
+			_elem96 = v
 		}
-		p.Paths = append(p.Paths, _elem51)
+		p.Paths = append(p.Paths, _elem96)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField3(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int32, 0, size)
-	p.DataTypes = tSlice
-	for i := 0; i < size; i++ {
-		var _elem52 int32
-		if v, err := iprot.ReadI32(); err != nil {
+	p.DataTypes =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem97 int32
+		if v, err := iprot.ReadI32(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem52 = v
+			_elem97 = v
 		}
-		p.DataTypes = append(p.DataTypes, _elem52)
+		p.DataTypes = append(p.DataTypes, _elem97)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField4(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField4(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int32, 0, size)
-	p.Encodings = tSlice
-	for i := 0; i < size; i++ {
-		var _elem53 int32
-		if v, err := iprot.ReadI32(); err != nil {
+	p.Encodings =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem98 int32
+		if v, err := iprot.ReadI32(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem53 = v
+			_elem98 = v
 		}
-		p.Encodings = append(p.Encodings, _elem53)
+		p.Encodings = append(p.Encodings, _elem98)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField5(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField5(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]int32, 0, size)
-	p.Compressors = tSlice
-	for i := 0; i < size; i++ {
-		var _elem54 int32
-		if v, err := iprot.ReadI32(); err != nil {
+	p.Compressors =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem99 int32
+		if v, err := iprot.ReadI32(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem54 = v
+			_elem99 = v
 		}
-		p.Compressors = append(p.Compressors, _elem54)
+		p.Compressors = append(p.Compressors, _elem99)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField6(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField6(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]map[string]string, 0, size)
-	p.PropsList = tSlice
-	for i := 0; i < size; i++ {
-		_, _, size, err := iprot.ReadMapBegin()
+	p.PropsList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, _, size, err := iprot.ReadMapBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading map begin: ", err)
 		}
 		tMap := make(map[string]string, size)
-		_elem55 := tMap
-		for i := 0; i < size; i++ {
-			var _key56 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem100 :=  tMap
+		for i := 0; i < size; i ++ {
+			var _key101 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_key56 = v
+				_key101 = v
 			}
-			var _val57 string
-			if v, err := iprot.ReadString(); err != nil {
+			var _val102 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_val57 = v
+				_val102 = v
 			}
-			_elem55[_key56] = _val57
+			_elem100[_key101] = _val102
 		}
-		if err := iprot.ReadMapEnd(); err != nil {
+		if err := iprot.ReadMapEnd(ctx); err != nil {
 			return thrift.PrependError("error reading map end: ", err)
 		}
-		p.PropsList = append(p.PropsList, _elem55)
+		p.PropsList = append(p.PropsList, _elem100)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField7(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField7(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]map[string]string, 0, size)
-	p.TagsList = tSlice
-	for i := 0; i < size; i++ {
-		_, _, size, err := iprot.ReadMapBegin()
+	p.TagsList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, _, size, err := iprot.ReadMapBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading map begin: ", err)
 		}
 		tMap := make(map[string]string, size)
-		_elem58 := tMap
-		for i := 0; i < size; i++ {
-			var _key59 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem103 :=  tMap
+		for i := 0; i < size; i ++ {
+			var _key104 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_key59 = v
+				_key104 = v
 			}
-			var _val60 string
-			if v, err := iprot.ReadString(); err != nil {
+			var _val105 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_val60 = v
+				_val105 = v
 			}
-			_elem58[_key59] = _val60
+			_elem103[_key104] = _val105
 		}
-		if err := iprot.ReadMapEnd(); err != nil {
+		if err := iprot.ReadMapEnd(ctx); err != nil {
 			return thrift.PrependError("error reading map end: ", err)
 		}
-		p.TagsList = append(p.TagsList, _elem58)
+		p.TagsList = append(p.TagsList, _elem103)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField8(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField8(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]map[string]string, 0, size)
-	p.AttributesList = tSlice
-	for i := 0; i < size; i++ {
-		_, _, size, err := iprot.ReadMapBegin()
+	p.AttributesList =  tSlice
+	for i := 0; i < size; i ++ {
+		_, _, size, err := iprot.ReadMapBegin(ctx)
 		if err != nil {
 			return thrift.PrependError("error reading map begin: ", err)
 		}
 		tMap := make(map[string]string, size)
-		_elem61 := tMap
-		for i := 0; i < size; i++ {
-			var _key62 string
-			if v, err := iprot.ReadString(); err != nil {
+		_elem106 :=  tMap
+		for i := 0; i < size; i ++ {
+			var _key107 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_key62 = v
+				_key107 = v
 			}
-			var _val63 string
-			if v, err := iprot.ReadString(); err != nil {
+			var _val108 string
+			if v, err := iprot.ReadString(ctx); err != nil {
 				return thrift.PrependError("error reading field 0: ", err)
 			} else {
-				_val63 = v
+				_val108 = v
 			}
-			_elem61[_key62] = _val63
+			_elem106[_key107] = _val108
 		}
-		if err := iprot.ReadMapEnd(); err != nil {
+		if err := iprot.ReadMapEnd(ctx); err != nil {
 			return thrift.PrependError("error reading map end: ", err)
 		}
-		p.AttributesList = append(p.AttributesList, _elem61)
+		p.AttributesList = append(p.AttributesList, _elem106)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) ReadField9(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSCreateMultiTimeseriesReq)  ReadField9(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.MeasurementAliasList = tSlice
-	for i := 0; i < size; i++ {
-		var _elem64 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.MeasurementAliasList =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem109 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem64 = v
+			_elem109 = v
 		}
-		p.MeasurementAliasList = append(p.MeasurementAliasList, _elem64)
+		p.MeasurementAliasList = append(p.MeasurementAliasList, _elem109)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("TSCreateMultiTimeseriesReq"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSCreateMultiTimeseriesReq) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "TSCreateMultiTimeseriesReq"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField4(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField5(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField6(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField7(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField8(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField9(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
+		if err := p.writeField4(ctx, oprot); err != nil { return err }
+		if err := p.writeField5(ctx, oprot); err != nil { return err }
+		if err := p.writeField6(ctx, oprot); err != nil { return err }
+		if err := p.writeField7(ctx, oprot); err != nil { return err }
+		if err := p.writeField8(ctx, oprot); err != nil { return err }
+		if err := p.writeField9(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSCreateMultiTimeseriesReq) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("paths", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:paths: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Paths)); err != nil {
+func (p *TSCreateMultiTimeseriesReq) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "paths", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:paths: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Paths)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Paths {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:paths: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:paths: ", p), err) }
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("dataTypes", thrift.LIST, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:dataTypes: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I32, len(p.DataTypes)); err != nil {
+func (p *TSCreateMultiTimeseriesReq) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "dataTypes", thrift.LIST, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:dataTypes: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I32, len(p.DataTypes)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.DataTypes {
-		if err := oprot.WriteI32(int32(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI32(ctx, int32(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:dataTypes: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:dataTypes: ", p), err) }
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField4(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("encodings", thrift.LIST, 4); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:encodings: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I32, len(p.Encodings)); err != nil {
+func (p *TSCreateMultiTimeseriesReq) writeField4(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "encodings", thrift.LIST, 4); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:encodings: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I32, len(p.Encodings)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Encodings {
-		if err := oprot.WriteI32(int32(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI32(ctx, int32(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:encodings: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 4:encodings: ", p), err) }
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField5(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("compressors", thrift.LIST, 5); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:compressors: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.I32, len(p.Compressors)); err != nil {
+func (p *TSCreateMultiTimeseriesReq) writeField5(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "compressors", thrift.LIST, 5); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:compressors: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.I32, len(p.Compressors)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Compressors {
-		if err := oprot.WriteI32(int32(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteI32(ctx, int32(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:compressors: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 5:compressors: ", p), err) }
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField6(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateMultiTimeseriesReq) writeField6(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetPropsList() {
-		if err := oprot.WriteFieldBegin("propsList", thrift.LIST, 6); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:propsList: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.MAP, len(p.PropsList)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "propsList", thrift.LIST, 6); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:propsList: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.MAP, len(p.PropsList)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.PropsList {
-			if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(v)); err != nil {
+			if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(v)); err != nil {
 				return thrift.PrependError("error writing map begin: ", err)
 			}
 			for k, v := range v {
-				if err := oprot.WriteString(string(k)); err != nil {
-					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-				}
-				if err := oprot.WriteString(string(v)); err != nil {
-					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-				}
+				if err := oprot.WriteString(ctx, string(k)); err != nil {
+					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+				if err := oprot.WriteString(ctx, string(v)); err != nil {
+					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 			}
-			if err := oprot.WriteMapEnd(); err != nil {
+			if err := oprot.WriteMapEnd(ctx); err != nil {
 				return thrift.PrependError("error writing map end: ", err)
 			}
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:propsList: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 6:propsList: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField7(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateMultiTimeseriesReq) writeField7(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetTagsList() {
-		if err := oprot.WriteFieldBegin("tagsList", thrift.LIST, 7); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:tagsList: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.MAP, len(p.TagsList)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "tagsList", thrift.LIST, 7); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:tagsList: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.MAP, len(p.TagsList)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.TagsList {
-			if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(v)); err != nil {
+			if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(v)); err != nil {
 				return thrift.PrependError("error writing map begin: ", err)
 			}
 			for k, v := range v {
-				if err := oprot.WriteString(string(k)); err != nil {
-					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-				}
-				if err := oprot.WriteString(string(v)); err != nil {
-					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-				}
+				if err := oprot.WriteString(ctx, string(k)); err != nil {
+					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+				if err := oprot.WriteString(ctx, string(v)); err != nil {
+					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 			}
-			if err := oprot.WriteMapEnd(); err != nil {
+			if err := oprot.WriteMapEnd(ctx); err != nil {
 				return thrift.PrependError("error writing map end: ", err)
 			}
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:tagsList: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 7:tagsList: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField8(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateMultiTimeseriesReq) writeField8(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetAttributesList() {
-		if err := oprot.WriteFieldBegin("attributesList", thrift.LIST, 8); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:attributesList: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.MAP, len(p.AttributesList)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "attributesList", thrift.LIST, 8); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:attributesList: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.MAP, len(p.AttributesList)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.AttributesList {
-			if err := oprot.WriteMapBegin(thrift.STRING, thrift.STRING, len(v)); err != nil {
+			if err := oprot.WriteMapBegin(ctx, thrift.STRING, thrift.STRING, len(v)); err != nil {
 				return thrift.PrependError("error writing map begin: ", err)
 			}
 			for k, v := range v {
-				if err := oprot.WriteString(string(k)); err != nil {
-					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-				}
-				if err := oprot.WriteString(string(v)); err != nil {
-					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-				}
+				if err := oprot.WriteString(ctx, string(k)); err != nil {
+					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
+				if err := oprot.WriteString(ctx, string(v)); err != nil {
+					return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 			}
-			if err := oprot.WriteMapEnd(); err != nil {
+			if err := oprot.WriteMapEnd(ctx); err != nil {
 				return thrift.PrependError("error writing map end: ", err)
 			}
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 8:attributesList: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 8:attributesList: ", p), err) }
 	}
 	return err
 }
 
-func (p *TSCreateMultiTimeseriesReq) writeField9(oprot thrift.TProtocol) (err error) {
+func (p *TSCreateMultiTimeseriesReq) writeField9(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetMeasurementAliasList() {
-		if err := oprot.WriteFieldBegin("measurementAliasList", thrift.LIST, 9); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:measurementAliasList: ", p), err)
-		}
-		if err := oprot.WriteListBegin(thrift.STRING, len(p.MeasurementAliasList)); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "measurementAliasList", thrift.LIST, 9); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:measurementAliasList: ", p), err) }
+		if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.MeasurementAliasList)); err != nil {
 			return thrift.PrependError("error writing list begin: ", err)
 		}
 		for _, v := range p.MeasurementAliasList {
-			if err := oprot.WriteString(string(v)); err != nil {
-				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-			}
+			if err := oprot.WriteString(ctx, string(v)); err != nil {
+				return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 		}
-		if err := oprot.WriteListEnd(); err != nil {
+		if err := oprot.WriteListEnd(ctx); err != nil {
 			return thrift.PrependError("error writing list end: ", err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 9:measurementAliasList: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 9:measurementAliasList: ", p), err) }
 	}
 	return err
 }
 
+func (p *TSCreateMultiTimeseriesReq) Equals(other *TSCreateMultiTimeseriesReq) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.SessionId != other.SessionId { return false }
+	if len(p.Paths) != len(other.Paths) { return false }
+	for i, _tgt := range p.Paths {
+		_src110 := other.Paths[i]
+		if _tgt != _src110 { return false }
+	}
+	if len(p.DataTypes) != len(other.DataTypes) { return false }
+	for i, _tgt := range p.DataTypes {
+		_src111 := other.DataTypes[i]
+		if _tgt != _src111 { return false }
+	}
+	if len(p.Encodings) != len(other.Encodings) { return false }
+	for i, _tgt := range p.Encodings {
+		_src112 := other.Encodings[i]
+		if _tgt != _src112 { return false }
+	}
+	if len(p.Compressors) != len(other.Compressors) { return false }
+	for i, _tgt := range p.Compressors {
+		_src113 := other.Compressors[i]
+		if _tgt != _src113 { return false }
+	}
+	if len(p.PropsList) != len(other.PropsList) { return false }
+	for i, _tgt := range p.PropsList {
+		_src114 := other.PropsList[i]
+		if len(_tgt) != len(_src114) { return false }
+		for k, _tgt := range _tgt {
+			_src115 := _src114[k]
+			if _tgt != _src115 { return false }
+		}
+	}
+	if len(p.TagsList) != len(other.TagsList) { return false }
+	for i, _tgt := range p.TagsList {
+		_src116 := other.TagsList[i]
+		if len(_tgt) != len(_src116) { return false }
+		for k, _tgt := range _tgt {
+			_src117 := _src116[k]
+			if _tgt != _src117 { return false }
+		}
+	}
+	if len(p.AttributesList) != len(other.AttributesList) { return false }
+	for i, _tgt := range p.AttributesList {
+		_src118 := other.AttributesList[i]
+		if len(_tgt) != len(_src118) { return false }
+		for k, _tgt := range _tgt {
+			_src119 := _src118[k]
+			if _tgt != _src119 { return false }
+		}
+	}
+	if len(p.MeasurementAliasList) != len(other.MeasurementAliasList) { return false }
+	for i, _tgt := range p.MeasurementAliasList {
+		_src120 := other.MeasurementAliasList[i]
+		if _tgt != _src120 { return false }
+	}
+	return true
+}
+
 func (p *TSCreateMultiTimeseriesReq) String() string {
 	if p == nil {
 		return "<nil>"
@@ -9541,15 +9392,16 @@
 //  - SupportedTimeAggregationOperations
 //  - TimestampPrecision
 type ServerProperties struct {
-	Version                            string   `thrift:"version,1,required" db:"version" json:"version"`
+	Version string `thrift:"version,1,required" db:"version" json:"version"`
 	SupportedTimeAggregationOperations []string `thrift:"supportedTimeAggregationOperations,2,required" db:"supportedTimeAggregationOperations" json:"supportedTimeAggregationOperations"`
-	TimestampPrecision                 string   `thrift:"timestampPrecision,3,required" db:"timestampPrecision" json:"timestampPrecision"`
+	TimestampPrecision string `thrift:"timestampPrecision,3,required" db:"timestampPrecision" json:"timestampPrecision"`
 }
 
 func NewServerProperties() *ServerProperties {
 	return &ServerProperties{}
 }
 
+
 func (p *ServerProperties) GetVersion() string {
 	return p.Version
 }
@@ -9561,83 +9413,81 @@
 func (p *ServerProperties) GetTimestampPrecision() string {
 	return p.TimestampPrecision
 }
-func (p *ServerProperties) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *ServerProperties) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
-	var issetVersion bool = false
-	var issetSupportedTimeAggregationOperations bool = false
-	var issetTimestampPrecision bool = false
+	var issetVersion bool = false;
+	var issetSupportedTimeAggregationOperations bool = false;
+	var issetTimestampPrecision bool = false;
 
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 				issetVersion = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 				issetSupportedTimeAggregationOperations = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 3:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField3(iprot); err != nil {
+				if err := p.ReadField3(ctx, iprot); err != nil {
 					return err
 				}
 				issetTimestampPrecision = true
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
-	if !issetVersion {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Version is not set"))
+	if !issetVersion{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Version is not set"));
 	}
-	if !issetSupportedTimeAggregationOperations {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SupportedTimeAggregationOperations is not set"))
+	if !issetSupportedTimeAggregationOperations{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SupportedTimeAggregationOperations is not set"));
 	}
-	if !issetTimestampPrecision {
-		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimestampPrecision is not set"))
+	if !issetTimestampPrecision{
+		return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TimestampPrecision is not set"));
 	}
 	return nil
 }
 
-func (p *ServerProperties) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *ServerProperties)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.Version = v
@@ -9645,30 +9495,30 @@
 	return nil
 }
 
-func (p *ServerProperties) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *ServerProperties)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.SupportedTimeAggregationOperations = tSlice
-	for i := 0; i < size; i++ {
-		var _elem65 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.SupportedTimeAggregationOperations =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem121 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem65 = v
+			_elem121 = v
 		}
-		p.SupportedTimeAggregationOperations = append(p.SupportedTimeAggregationOperations, _elem65)
+		p.SupportedTimeAggregationOperations = append(p.SupportedTimeAggregationOperations, _elem121)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *ServerProperties) ReadField3(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *ServerProperties)  ReadField3(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 3: ", err)
 	} else {
 		p.TimestampPrecision = v
@@ -9676,77 +9526,75 @@
 	return nil
 }
 
-func (p *ServerProperties) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("ServerProperties"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *ServerProperties) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "ServerProperties"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField3(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
+		if err := p.writeField3(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *ServerProperties) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("version", thrift.STRING, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:version: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.Version)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.version (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:version: ", p), err)
-	}
+func (p *ServerProperties) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "version", thrift.STRING, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:version: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.Version)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.version (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:version: ", p), err) }
 	return err
 }
 
-func (p *ServerProperties) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("supportedTimeAggregationOperations", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:supportedTimeAggregationOperations: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.SupportedTimeAggregationOperations)); err != nil {
+func (p *ServerProperties) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "supportedTimeAggregationOperations", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:supportedTimeAggregationOperations: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.SupportedTimeAggregationOperations)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.SupportedTimeAggregationOperations {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:supportedTimeAggregationOperations: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:supportedTimeAggregationOperations: ", p), err) }
 	return err
 }
 
-func (p *ServerProperties) writeField3(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("timestampPrecision", thrift.STRING, 3); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:timestampPrecision: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.TimestampPrecision)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.timestampPrecision (3) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:timestampPrecision: ", p), err)
-	}
+func (p *ServerProperties) writeField3(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "timestampPrecision", thrift.STRING, 3); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:timestampPrecision: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.TimestampPrecision)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.timestampPrecision (3) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 3:timestampPrecision: ", p), err) }
 	return err
 }
 
+func (p *ServerProperties) Equals(other *ServerProperties) bool {
+	if p == other {
+		return true
+	} else if p == nil || other == nil {
+		return false
+	}
+	if p.Version != other.Version { return false }
+	if len(p.SupportedTimeAggregationOperations) != len(other.SupportedTimeAggregationOperations) { return false }
+	for i, _tgt := range p.SupportedTimeAggregationOperations {
+		_src122 := other.SupportedTimeAggregationOperations[i]
+		if _tgt != _src122 { return false }
+	}
+	if p.TimestampPrecision != other.TimestampPrecision { return false }
+	return true
+}
+
 func (p *ServerProperties) String() string {
 	if p == nil {
 		return "<nil>"
@@ -9757,114 +9605,115 @@
 type TSIService interface {
 	// Parameters:
 	//  - Req
-	OpenSession(ctx context.Context, req *TSOpenSessionReq) (r *TSOpenSessionResp, err error)
+	OpenSession(ctx context.Context, req *TSOpenSessionReq) (_r *TSOpenSessionResp, _err error)
 	// Parameters:
 	//  - Req
-	CloseSession(ctx context.Context, req *TSCloseSessionReq) (r *TSStatus, err error)
+	CloseSession(ctx context.Context, req *TSCloseSessionReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	ExecuteStatement(ctx context.Context, req *TSExecuteStatementReq) (r *TSExecuteStatementResp, err error)
+	ExecuteStatement(ctx context.Context, req *TSExecuteStatementReq) (_r *TSExecuteStatementResp, _err error)
 	// Parameters:
 	//  - Req
-	ExecuteBatchStatement(ctx context.Context, req *TSExecuteBatchStatementReq) (r *TSStatus, err error)
+	ExecuteBatchStatement(ctx context.Context, req *TSExecuteBatchStatementReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	ExecuteQueryStatement(ctx context.Context, req *TSExecuteStatementReq) (r *TSExecuteStatementResp, err error)
+	ExecuteQueryStatement(ctx context.Context, req *TSExecuteStatementReq) (_r *TSExecuteStatementResp, _err error)
 	// Parameters:
 	//  - Req
-	ExecuteUpdateStatement(ctx context.Context, req *TSExecuteStatementReq) (r *TSExecuteStatementResp, err error)
+	ExecuteUpdateStatement(ctx context.Context, req *TSExecuteStatementReq) (_r *TSExecuteStatementResp, _err error)
 	// Parameters:
 	//  - Req
-	FetchResults(ctx context.Context, req *TSFetchResultsReq) (r *TSFetchResultsResp, err error)
+	FetchResults(ctx context.Context, req *TSFetchResultsReq) (_r *TSFetchResultsResp, _err error)
 	// Parameters:
 	//  - Req
-	FetchMetadata(ctx context.Context, req *TSFetchMetadataReq) (r *TSFetchMetadataResp, err error)
+	FetchMetadata(ctx context.Context, req *TSFetchMetadataReq) (_r *TSFetchMetadataResp, _err error)
 	// Parameters:
 	//  - Req
-	CancelOperation(ctx context.Context, req *TSCancelOperationReq) (r *TSStatus, err error)
+	CancelOperation(ctx context.Context, req *TSCancelOperationReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	CloseOperation(ctx context.Context, req *TSCloseOperationReq) (r *TSStatus, err error)
+	CloseOperation(ctx context.Context, req *TSCloseOperationReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - SessionId
-	GetTimeZone(ctx context.Context, sessionId int64) (r *TSGetTimeZoneResp, err error)
+	GetTimeZone(ctx context.Context, sessionId int64) (_r *TSGetTimeZoneResp, _err error)
 	// Parameters:
 	//  - Req
-	SetTimeZone(ctx context.Context, req *TSSetTimeZoneReq) (r *TSStatus, err error)
-	GetProperties(ctx context.Context) (r *ServerProperties, err error)
+	SetTimeZone(ctx context.Context, req *TSSetTimeZoneReq) (_r *TSStatus, _err error)
+	GetProperties(ctx context.Context) (_r *ServerProperties, _err error)
 	// Parameters:
 	//  - SessionId
 	//  - StorageGroup
-	SetStorageGroup(ctx context.Context, sessionId int64, storageGroup string) (r *TSStatus, err error)
+	SetStorageGroup(ctx context.Context, sessionId int64, storageGroup string) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	CreateTimeseries(ctx context.Context, req *TSCreateTimeseriesReq) (r *TSStatus, err error)
+	CreateTimeseries(ctx context.Context, req *TSCreateTimeseriesReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	CreateMultiTimeseries(ctx context.Context, req *TSCreateMultiTimeseriesReq) (r *TSStatus, err error)
+	CreateMultiTimeseries(ctx context.Context, req *TSCreateMultiTimeseriesReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - SessionId
 	//  - Path
-	DeleteTimeseries(ctx context.Context, sessionId int64, path []string) (r *TSStatus, err error)
+	DeleteTimeseries(ctx context.Context, sessionId int64, path []string) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - SessionId
 	//  - StorageGroup
-	DeleteStorageGroups(ctx context.Context, sessionId int64, storageGroup []string) (r *TSStatus, err error)
+	DeleteStorageGroups(ctx context.Context, sessionId int64, storageGroup []string) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	InsertRecord(ctx context.Context, req *TSInsertRecordReq) (r *TSStatus, err error)
+	InsertRecord(ctx context.Context, req *TSInsertRecordReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	InsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (r *TSStatus, err error)
+	InsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	InsertTablet(ctx context.Context, req *TSInsertTabletReq) (r *TSStatus, err error)
+	InsertTablet(ctx context.Context, req *TSInsertTabletReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	InsertTablets(ctx context.Context, req *TSInsertTabletsReq) (r *TSStatus, err error)
+	InsertTablets(ctx context.Context, req *TSInsertTabletsReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	InsertRecords(ctx context.Context, req *TSInsertRecordsReq) (r *TSStatus, err error)
+	InsertRecords(ctx context.Context, req *TSInsertRecordsReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	InsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (r *TSStatus, err error)
+	InsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	InsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (r *TSStatus, err error)
+	InsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	TestInsertTablet(ctx context.Context, req *TSInsertTabletReq) (r *TSStatus, err error)
+	TestInsertTablet(ctx context.Context, req *TSInsertTabletReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	TestInsertTablets(ctx context.Context, req *TSInsertTabletsReq) (r *TSStatus, err error)
+	TestInsertTablets(ctx context.Context, req *TSInsertTabletsReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	TestInsertRecord(ctx context.Context, req *TSInsertRecordReq) (r *TSStatus, err error)
+	TestInsertRecord(ctx context.Context, req *TSInsertRecordReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	TestInsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (r *TSStatus, err error)
+	TestInsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	TestInsertRecords(ctx context.Context, req *TSInsertRecordsReq) (r *TSStatus, err error)
+	TestInsertRecords(ctx context.Context, req *TSInsertRecordsReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	TestInsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (r *TSStatus, err error)
+	TestInsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	TestInsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (r *TSStatus, err error)
+	TestInsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	DeleteData(ctx context.Context, req *TSDeleteDataReq) (r *TSStatus, err error)
+	DeleteData(ctx context.Context, req *TSDeleteDataReq) (_r *TSStatus, _err error)
 	// Parameters:
 	//  - Req
-	ExecuteRawDataQuery(ctx context.Context, req *TSRawDataQueryReq) (r *TSExecuteStatementResp, err error)
+	ExecuteRawDataQuery(ctx context.Context, req *TSRawDataQueryReq) (_r *TSExecuteStatementResp, _err error)
 	// Parameters:
 	//  - SessionId
-	RequestStatementId(ctx context.Context, sessionId int64) (r int64, err error)
+	RequestStatementId(ctx context.Context, sessionId int64) (_r int64, _err error)
 }
 
 type TSIServiceClient struct {
 	c thrift.TClient
+	meta thrift.ResponseMeta
 }
 
 func NewTSIServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *TSIServiceClient {
@@ -9889,364 +9738,24 @@
 	return p.c
 }
 
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) OpenSession(ctx context.Context, req *TSOpenSessionReq) (r *TSOpenSessionResp, err error) {
-	var _args66 TSIServiceOpenSessionArgs
-	_args66.Req = req
-	var _result67 TSIServiceOpenSessionResult
-	if err = p.Client_().Call(ctx, "openSession", &_args66, &_result67); err != nil {
-		return
-	}
-	return _result67.GetSuccess(), nil
+func (p *TSIServiceClient) LastResponseMeta_() thrift.ResponseMeta {
+	return p.meta
+}
+
+func (p *TSIServiceClient) SetLastResponseMeta_(meta thrift.ResponseMeta) {
+	p.meta = meta
 }
 
 // Parameters:
 //  - Req
-func (p *TSIServiceClient) CloseSession(ctx context.Context, req *TSCloseSessionReq) (r *TSStatus, err error) {
-	var _args68 TSIServiceCloseSessionArgs
-	_args68.Req = req
-	var _result69 TSIServiceCloseSessionResult
-	if err = p.Client_().Call(ctx, "closeSession", &_args68, &_result69); err != nil {
-		return
-	}
-	return _result69.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) ExecuteStatement(ctx context.Context, req *TSExecuteStatementReq) (r *TSExecuteStatementResp, err error) {
-	var _args70 TSIServiceExecuteStatementArgs
-	_args70.Req = req
-	var _result71 TSIServiceExecuteStatementResult
-	if err = p.Client_().Call(ctx, "executeStatement", &_args70, &_result71); err != nil {
-		return
-	}
-	return _result71.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) ExecuteBatchStatement(ctx context.Context, req *TSExecuteBatchStatementReq) (r *TSStatus, err error) {
-	var _args72 TSIServiceExecuteBatchStatementArgs
-	_args72.Req = req
-	var _result73 TSIServiceExecuteBatchStatementResult
-	if err = p.Client_().Call(ctx, "executeBatchStatement", &_args72, &_result73); err != nil {
-		return
-	}
-	return _result73.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) ExecuteQueryStatement(ctx context.Context, req *TSExecuteStatementReq) (r *TSExecuteStatementResp, err error) {
-	var _args74 TSIServiceExecuteQueryStatementArgs
-	_args74.Req = req
-	var _result75 TSIServiceExecuteQueryStatementResult
-	if err = p.Client_().Call(ctx, "executeQueryStatement", &_args74, &_result75); err != nil {
-		return
-	}
-	return _result75.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) ExecuteUpdateStatement(ctx context.Context, req *TSExecuteStatementReq) (r *TSExecuteStatementResp, err error) {
-	var _args76 TSIServiceExecuteUpdateStatementArgs
-	_args76.Req = req
-	var _result77 TSIServiceExecuteUpdateStatementResult
-	if err = p.Client_().Call(ctx, "executeUpdateStatement", &_args76, &_result77); err != nil {
-		return
-	}
-	return _result77.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) FetchResults(ctx context.Context, req *TSFetchResultsReq) (r *TSFetchResultsResp, err error) {
-	var _args78 TSIServiceFetchResultsArgs
-	_args78.Req = req
-	var _result79 TSIServiceFetchResultsResult
-	if err = p.Client_().Call(ctx, "fetchResults", &_args78, &_result79); err != nil {
-		return
-	}
-	return _result79.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) FetchMetadata(ctx context.Context, req *TSFetchMetadataReq) (r *TSFetchMetadataResp, err error) {
-	var _args80 TSIServiceFetchMetadataArgs
-	_args80.Req = req
-	var _result81 TSIServiceFetchMetadataResult
-	if err = p.Client_().Call(ctx, "fetchMetadata", &_args80, &_result81); err != nil {
-		return
-	}
-	return _result81.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) CancelOperation(ctx context.Context, req *TSCancelOperationReq) (r *TSStatus, err error) {
-	var _args82 TSIServiceCancelOperationArgs
-	_args82.Req = req
-	var _result83 TSIServiceCancelOperationResult
-	if err = p.Client_().Call(ctx, "cancelOperation", &_args82, &_result83); err != nil {
-		return
-	}
-	return _result83.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) CloseOperation(ctx context.Context, req *TSCloseOperationReq) (r *TSStatus, err error) {
-	var _args84 TSIServiceCloseOperationArgs
-	_args84.Req = req
-	var _result85 TSIServiceCloseOperationResult
-	if err = p.Client_().Call(ctx, "closeOperation", &_args84, &_result85); err != nil {
-		return
-	}
-	return _result85.GetSuccess(), nil
-}
-
-// Parameters:
-//  - SessionId
-func (p *TSIServiceClient) GetTimeZone(ctx context.Context, sessionId int64) (r *TSGetTimeZoneResp, err error) {
-	var _args86 TSIServiceGetTimeZoneArgs
-	_args86.SessionId = sessionId
-	var _result87 TSIServiceGetTimeZoneResult
-	if err = p.Client_().Call(ctx, "getTimeZone", &_args86, &_result87); err != nil {
-		return
-	}
-	return _result87.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) SetTimeZone(ctx context.Context, req *TSSetTimeZoneReq) (r *TSStatus, err error) {
-	var _args88 TSIServiceSetTimeZoneArgs
-	_args88.Req = req
-	var _result89 TSIServiceSetTimeZoneResult
-	if err = p.Client_().Call(ctx, "setTimeZone", &_args88, &_result89); err != nil {
-		return
-	}
-	return _result89.GetSuccess(), nil
-}
-
-func (p *TSIServiceClient) GetProperties(ctx context.Context) (r *ServerProperties, err error) {
-	var _args90 TSIServiceGetPropertiesArgs
-	var _result91 TSIServiceGetPropertiesResult
-	if err = p.Client_().Call(ctx, "getProperties", &_args90, &_result91); err != nil {
-		return
-	}
-	return _result91.GetSuccess(), nil
-}
-
-// Parameters:
-//  - SessionId
-//  - StorageGroup
-func (p *TSIServiceClient) SetStorageGroup(ctx context.Context, sessionId int64, storageGroup string) (r *TSStatus, err error) {
-	var _args92 TSIServiceSetStorageGroupArgs
-	_args92.SessionId = sessionId
-	_args92.StorageGroup = storageGroup
-	var _result93 TSIServiceSetStorageGroupResult
-	if err = p.Client_().Call(ctx, "setStorageGroup", &_args92, &_result93); err != nil {
-		return
-	}
-	return _result93.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) CreateTimeseries(ctx context.Context, req *TSCreateTimeseriesReq) (r *TSStatus, err error) {
-	var _args94 TSIServiceCreateTimeseriesArgs
-	_args94.Req = req
-	var _result95 TSIServiceCreateTimeseriesResult
-	if err = p.Client_().Call(ctx, "createTimeseries", &_args94, &_result95); err != nil {
-		return
-	}
-	return _result95.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) CreateMultiTimeseries(ctx context.Context, req *TSCreateMultiTimeseriesReq) (r *TSStatus, err error) {
-	var _args96 TSIServiceCreateMultiTimeseriesArgs
-	_args96.Req = req
-	var _result97 TSIServiceCreateMultiTimeseriesResult
-	if err = p.Client_().Call(ctx, "createMultiTimeseries", &_args96, &_result97); err != nil {
-		return
-	}
-	return _result97.GetSuccess(), nil
-}
-
-// Parameters:
-//  - SessionId
-//  - Path
-func (p *TSIServiceClient) DeleteTimeseries(ctx context.Context, sessionId int64, path []string) (r *TSStatus, err error) {
-	var _args98 TSIServiceDeleteTimeseriesArgs
-	_args98.SessionId = sessionId
-	_args98.Path = path
-	var _result99 TSIServiceDeleteTimeseriesResult
-	if err = p.Client_().Call(ctx, "deleteTimeseries", &_args98, &_result99); err != nil {
-		return
-	}
-	return _result99.GetSuccess(), nil
-}
-
-// Parameters:
-//  - SessionId
-//  - StorageGroup
-func (p *TSIServiceClient) DeleteStorageGroups(ctx context.Context, sessionId int64, storageGroup []string) (r *TSStatus, err error) {
-	var _args100 TSIServiceDeleteStorageGroupsArgs
-	_args100.SessionId = sessionId
-	_args100.StorageGroup = storageGroup
-	var _result101 TSIServiceDeleteStorageGroupsResult
-	if err = p.Client_().Call(ctx, "deleteStorageGroups", &_args100, &_result101); err != nil {
-		return
-	}
-	return _result101.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) InsertRecord(ctx context.Context, req *TSInsertRecordReq) (r *TSStatus, err error) {
-	var _args102 TSIServiceInsertRecordArgs
-	_args102.Req = req
-	var _result103 TSIServiceInsertRecordResult
-	if err = p.Client_().Call(ctx, "insertRecord", &_args102, &_result103); err != nil {
-		return
-	}
-	return _result103.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) InsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (r *TSStatus, err error) {
-	var _args104 TSIServiceInsertStringRecordArgs
-	_args104.Req = req
-	var _result105 TSIServiceInsertStringRecordResult
-	if err = p.Client_().Call(ctx, "insertStringRecord", &_args104, &_result105); err != nil {
-		return
-	}
-	return _result105.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) InsertTablet(ctx context.Context, req *TSInsertTabletReq) (r *TSStatus, err error) {
-	var _args106 TSIServiceInsertTabletArgs
-	_args106.Req = req
-	var _result107 TSIServiceInsertTabletResult
-	if err = p.Client_().Call(ctx, "insertTablet", &_args106, &_result107); err != nil {
-		return
-	}
-	return _result107.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) InsertTablets(ctx context.Context, req *TSInsertTabletsReq) (r *TSStatus, err error) {
-	var _args108 TSIServiceInsertTabletsArgs
-	_args108.Req = req
-	var _result109 TSIServiceInsertTabletsResult
-	if err = p.Client_().Call(ctx, "insertTablets", &_args108, &_result109); err != nil {
-		return
-	}
-	return _result109.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) InsertRecords(ctx context.Context, req *TSInsertRecordsReq) (r *TSStatus, err error) {
-	var _args110 TSIServiceInsertRecordsArgs
-	_args110.Req = req
-	var _result111 TSIServiceInsertRecordsResult
-	if err = p.Client_().Call(ctx, "insertRecords", &_args110, &_result111); err != nil {
-		return
-	}
-	return _result111.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) InsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (r *TSStatus, err error) {
-	var _args112 TSIServiceInsertRecordsOfOneDeviceArgs
-	_args112.Req = req
-	var _result113 TSIServiceInsertRecordsOfOneDeviceResult
-	if err = p.Client_().Call(ctx, "insertRecordsOfOneDevice", &_args112, &_result113); err != nil {
-		return
-	}
-	return _result113.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) InsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (r *TSStatus, err error) {
-	var _args114 TSIServiceInsertStringRecordsArgs
-	_args114.Req = req
-	var _result115 TSIServiceInsertStringRecordsResult
-	if err = p.Client_().Call(ctx, "insertStringRecords", &_args114, &_result115); err != nil {
-		return
-	}
-	return _result115.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) TestInsertTablet(ctx context.Context, req *TSInsertTabletReq) (r *TSStatus, err error) {
-	var _args116 TSIServiceTestInsertTabletArgs
-	_args116.Req = req
-	var _result117 TSIServiceTestInsertTabletResult
-	if err = p.Client_().Call(ctx, "testInsertTablet", &_args116, &_result117); err != nil {
-		return
-	}
-	return _result117.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) TestInsertTablets(ctx context.Context, req *TSInsertTabletsReq) (r *TSStatus, err error) {
-	var _args118 TSIServiceTestInsertTabletsArgs
-	_args118.Req = req
-	var _result119 TSIServiceTestInsertTabletsResult
-	if err = p.Client_().Call(ctx, "testInsertTablets", &_args118, &_result119); err != nil {
-		return
-	}
-	return _result119.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) TestInsertRecord(ctx context.Context, req *TSInsertRecordReq) (r *TSStatus, err error) {
-	var _args120 TSIServiceTestInsertRecordArgs
-	_args120.Req = req
-	var _result121 TSIServiceTestInsertRecordResult
-	if err = p.Client_().Call(ctx, "testInsertRecord", &_args120, &_result121); err != nil {
-		return
-	}
-	return _result121.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) TestInsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (r *TSStatus, err error) {
-	var _args122 TSIServiceTestInsertStringRecordArgs
-	_args122.Req = req
-	var _result123 TSIServiceTestInsertStringRecordResult
-	if err = p.Client_().Call(ctx, "testInsertStringRecord", &_args122, &_result123); err != nil {
-		return
-	}
-	return _result123.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) TestInsertRecords(ctx context.Context, req *TSInsertRecordsReq) (r *TSStatus, err error) {
-	var _args124 TSIServiceTestInsertRecordsArgs
-	_args124.Req = req
-	var _result125 TSIServiceTestInsertRecordsResult
-	if err = p.Client_().Call(ctx, "testInsertRecords", &_args124, &_result125); err != nil {
+func (p *TSIServiceClient) OpenSession(ctx context.Context, req *TSOpenSessionReq) (_r *TSOpenSessionResp, _err error) {
+	var _args123 TSIServiceOpenSessionArgs
+	_args123.Req = req
+	var _result125 TSIServiceOpenSessionResult
+	var _meta124 thrift.ResponseMeta
+	_meta124, _err = p.Client_().Call(ctx, "openSession", &_args123, &_result125)
+	p.SetLastResponseMeta_(_meta124)
+	if _err != nil {
 		return
 	}
 	return _result125.GetSuccess(), nil
@@ -10254,35 +9763,29 @@
 
 // Parameters:
 //  - Req
-func (p *TSIServiceClient) TestInsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (r *TSStatus, err error) {
-	var _args126 TSIServiceTestInsertRecordsOfOneDeviceArgs
+func (p *TSIServiceClient) CloseSession(ctx context.Context, req *TSCloseSessionReq) (_r *TSStatus, _err error) {
+	var _args126 TSIServiceCloseSessionArgs
 	_args126.Req = req
-	var _result127 TSIServiceTestInsertRecordsOfOneDeviceResult
-	if err = p.Client_().Call(ctx, "testInsertRecordsOfOneDevice", &_args126, &_result127); err != nil {
+	var _result128 TSIServiceCloseSessionResult
+	var _meta127 thrift.ResponseMeta
+	_meta127, _err = p.Client_().Call(ctx, "closeSession", &_args126, &_result128)
+	p.SetLastResponseMeta_(_meta127)
+	if _err != nil {
 		return
 	}
-	return _result127.GetSuccess(), nil
+	return _result128.GetSuccess(), nil
 }
 
 // Parameters:
 //  - Req
-func (p *TSIServiceClient) TestInsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (r *TSStatus, err error) {
-	var _args128 TSIServiceTestInsertStringRecordsArgs
-	_args128.Req = req
-	var _result129 TSIServiceTestInsertStringRecordsResult
-	if err = p.Client_().Call(ctx, "testInsertStringRecords", &_args128, &_result129); err != nil {
-		return
-	}
-	return _result129.GetSuccess(), nil
-}
-
-// Parameters:
-//  - Req
-func (p *TSIServiceClient) DeleteData(ctx context.Context, req *TSDeleteDataReq) (r *TSStatus, err error) {
-	var _args130 TSIServiceDeleteDataArgs
-	_args130.Req = req
-	var _result131 TSIServiceDeleteDataResult
-	if err = p.Client_().Call(ctx, "deleteData", &_args130, &_result131); err != nil {
+func (p *TSIServiceClient) ExecuteStatement(ctx context.Context, req *TSExecuteStatementReq) (_r *TSExecuteStatementResp, _err error) {
+	var _args129 TSIServiceExecuteStatementArgs
+	_args129.Req = req
+	var _result131 TSIServiceExecuteStatementResult
+	var _meta130 thrift.ResponseMeta
+	_meta130, _err = p.Client_().Call(ctx, "executeStatement", &_args129, &_result131)
+	p.SetLastResponseMeta_(_meta130)
+	if _err != nil {
 		return
 	}
 	return _result131.GetSuccess(), nil
@@ -10290,31 +9793,490 @@
 
 // Parameters:
 //  - Req
-func (p *TSIServiceClient) ExecuteRawDataQuery(ctx context.Context, req *TSRawDataQueryReq) (r *TSExecuteStatementResp, err error) {
-	var _args132 TSIServiceExecuteRawDataQueryArgs
+func (p *TSIServiceClient) ExecuteBatchStatement(ctx context.Context, req *TSExecuteBatchStatementReq) (_r *TSStatus, _err error) {
+	var _args132 TSIServiceExecuteBatchStatementArgs
 	_args132.Req = req
-	var _result133 TSIServiceExecuteRawDataQueryResult
-	if err = p.Client_().Call(ctx, "executeRawDataQuery", &_args132, &_result133); err != nil {
+	var _result134 TSIServiceExecuteBatchStatementResult
+	var _meta133 thrift.ResponseMeta
+	_meta133, _err = p.Client_().Call(ctx, "executeBatchStatement", &_args132, &_result134)
+	p.SetLastResponseMeta_(_meta133)
+	if _err != nil {
 		return
 	}
-	return _result133.GetSuccess(), nil
+	return _result134.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) ExecuteQueryStatement(ctx context.Context, req *TSExecuteStatementReq) (_r *TSExecuteStatementResp, _err error) {
+	var _args135 TSIServiceExecuteQueryStatementArgs
+	_args135.Req = req
+	var _result137 TSIServiceExecuteQueryStatementResult
+	var _meta136 thrift.ResponseMeta
+	_meta136, _err = p.Client_().Call(ctx, "executeQueryStatement", &_args135, &_result137)
+	p.SetLastResponseMeta_(_meta136)
+	if _err != nil {
+		return
+	}
+	return _result137.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) ExecuteUpdateStatement(ctx context.Context, req *TSExecuteStatementReq) (_r *TSExecuteStatementResp, _err error) {
+	var _args138 TSIServiceExecuteUpdateStatementArgs
+	_args138.Req = req
+	var _result140 TSIServiceExecuteUpdateStatementResult
+	var _meta139 thrift.ResponseMeta
+	_meta139, _err = p.Client_().Call(ctx, "executeUpdateStatement", &_args138, &_result140)
+	p.SetLastResponseMeta_(_meta139)
+	if _err != nil {
+		return
+	}
+	return _result140.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) FetchResults(ctx context.Context, req *TSFetchResultsReq) (_r *TSFetchResultsResp, _err error) {
+	var _args141 TSIServiceFetchResultsArgs
+	_args141.Req = req
+	var _result143 TSIServiceFetchResultsResult
+	var _meta142 thrift.ResponseMeta
+	_meta142, _err = p.Client_().Call(ctx, "fetchResults", &_args141, &_result143)
+	p.SetLastResponseMeta_(_meta142)
+	if _err != nil {
+		return
+	}
+	return _result143.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) FetchMetadata(ctx context.Context, req *TSFetchMetadataReq) (_r *TSFetchMetadataResp, _err error) {
+	var _args144 TSIServiceFetchMetadataArgs
+	_args144.Req = req
+	var _result146 TSIServiceFetchMetadataResult
+	var _meta145 thrift.ResponseMeta
+	_meta145, _err = p.Client_().Call(ctx, "fetchMetadata", &_args144, &_result146)
+	p.SetLastResponseMeta_(_meta145)
+	if _err != nil {
+		return
+	}
+	return _result146.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) CancelOperation(ctx context.Context, req *TSCancelOperationReq) (_r *TSStatus, _err error) {
+	var _args147 TSIServiceCancelOperationArgs
+	_args147.Req = req
+	var _result149 TSIServiceCancelOperationResult
+	var _meta148 thrift.ResponseMeta
+	_meta148, _err = p.Client_().Call(ctx, "cancelOperation", &_args147, &_result149)
+	p.SetLastResponseMeta_(_meta148)
+	if _err != nil {
+		return
+	}
+	return _result149.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) CloseOperation(ctx context.Context, req *TSCloseOperationReq) (_r *TSStatus, _err error) {
+	var _args150 TSIServiceCloseOperationArgs
+	_args150.Req = req
+	var _result152 TSIServiceCloseOperationResult
+	var _meta151 thrift.ResponseMeta
+	_meta151, _err = p.Client_().Call(ctx, "closeOperation", &_args150, &_result152)
+	p.SetLastResponseMeta_(_meta151)
+	if _err != nil {
+		return
+	}
+	return _result152.GetSuccess(), nil
 }
 
 // Parameters:
 //  - SessionId
-func (p *TSIServiceClient) RequestStatementId(ctx context.Context, sessionId int64) (r int64, err error) {
-	var _args134 TSIServiceRequestStatementIdArgs
-	_args134.SessionId = sessionId
-	var _result135 TSIServiceRequestStatementIdResult
-	if err = p.Client_().Call(ctx, "requestStatementId", &_args134, &_result135); err != nil {
+func (p *TSIServiceClient) GetTimeZone(ctx context.Context, sessionId int64) (_r *TSGetTimeZoneResp, _err error) {
+	var _args153 TSIServiceGetTimeZoneArgs
+	_args153.SessionId = sessionId
+	var _result155 TSIServiceGetTimeZoneResult
+	var _meta154 thrift.ResponseMeta
+	_meta154, _err = p.Client_().Call(ctx, "getTimeZone", &_args153, &_result155)
+	p.SetLastResponseMeta_(_meta154)
+	if _err != nil {
 		return
 	}
-	return _result135.GetSuccess(), nil
+	return _result155.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) SetTimeZone(ctx context.Context, req *TSSetTimeZoneReq) (_r *TSStatus, _err error) {
+	var _args156 TSIServiceSetTimeZoneArgs
+	_args156.Req = req
+	var _result158 TSIServiceSetTimeZoneResult
+	var _meta157 thrift.ResponseMeta
+	_meta157, _err = p.Client_().Call(ctx, "setTimeZone", &_args156, &_result158)
+	p.SetLastResponseMeta_(_meta157)
+	if _err != nil {
+		return
+	}
+	return _result158.GetSuccess(), nil
+}
+
+func (p *TSIServiceClient) GetProperties(ctx context.Context) (_r *ServerProperties, _err error) {
+	var _args159 TSIServiceGetPropertiesArgs
+	var _result161 TSIServiceGetPropertiesResult
+	var _meta160 thrift.ResponseMeta
+	_meta160, _err = p.Client_().Call(ctx, "getProperties", &_args159, &_result161)
+	p.SetLastResponseMeta_(_meta160)
+	if _err != nil {
+		return
+	}
+	return _result161.GetSuccess(), nil
+}
+
+// Parameters:
+//  - SessionId
+//  - StorageGroup
+func (p *TSIServiceClient) SetStorageGroup(ctx context.Context, sessionId int64, storageGroup string) (_r *TSStatus, _err error) {
+	var _args162 TSIServiceSetStorageGroupArgs
+	_args162.SessionId = sessionId
+	_args162.StorageGroup = storageGroup
+	var _result164 TSIServiceSetStorageGroupResult
+	var _meta163 thrift.ResponseMeta
+	_meta163, _err = p.Client_().Call(ctx, "setStorageGroup", &_args162, &_result164)
+	p.SetLastResponseMeta_(_meta163)
+	if _err != nil {
+		return
+	}
+	return _result164.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) CreateTimeseries(ctx context.Context, req *TSCreateTimeseriesReq) (_r *TSStatus, _err error) {
+	var _args165 TSIServiceCreateTimeseriesArgs
+	_args165.Req = req
+	var _result167 TSIServiceCreateTimeseriesResult
+	var _meta166 thrift.ResponseMeta
+	_meta166, _err = p.Client_().Call(ctx, "createTimeseries", &_args165, &_result167)
+	p.SetLastResponseMeta_(_meta166)
+	if _err != nil {
+		return
+	}
+	return _result167.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) CreateMultiTimeseries(ctx context.Context, req *TSCreateMultiTimeseriesReq) (_r *TSStatus, _err error) {
+	var _args168 TSIServiceCreateMultiTimeseriesArgs
+	_args168.Req = req
+	var _result170 TSIServiceCreateMultiTimeseriesResult
+	var _meta169 thrift.ResponseMeta
+	_meta169, _err = p.Client_().Call(ctx, "createMultiTimeseries", &_args168, &_result170)
+	p.SetLastResponseMeta_(_meta169)
+	if _err != nil {
+		return
+	}
+	return _result170.GetSuccess(), nil
+}
+
+// Parameters:
+//  - SessionId
+//  - Path
+func (p *TSIServiceClient) DeleteTimeseries(ctx context.Context, sessionId int64, path []string) (_r *TSStatus, _err error) {
+	var _args171 TSIServiceDeleteTimeseriesArgs
+	_args171.SessionId = sessionId
+	_args171.Path = path
+	var _result173 TSIServiceDeleteTimeseriesResult
+	var _meta172 thrift.ResponseMeta
+	_meta172, _err = p.Client_().Call(ctx, "deleteTimeseries", &_args171, &_result173)
+	p.SetLastResponseMeta_(_meta172)
+	if _err != nil {
+		return
+	}
+	return _result173.GetSuccess(), nil
+}
+
+// Parameters:
+//  - SessionId
+//  - StorageGroup
+func (p *TSIServiceClient) DeleteStorageGroups(ctx context.Context, sessionId int64, storageGroup []string) (_r *TSStatus, _err error) {
+	var _args174 TSIServiceDeleteStorageGroupsArgs
+	_args174.SessionId = sessionId
+	_args174.StorageGroup = storageGroup
+	var _result176 TSIServiceDeleteStorageGroupsResult
+	var _meta175 thrift.ResponseMeta
+	_meta175, _err = p.Client_().Call(ctx, "deleteStorageGroups", &_args174, &_result176)
+	p.SetLastResponseMeta_(_meta175)
+	if _err != nil {
+		return
+	}
+	return _result176.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) InsertRecord(ctx context.Context, req *TSInsertRecordReq) (_r *TSStatus, _err error) {
+	var _args177 TSIServiceInsertRecordArgs
+	_args177.Req = req
+	var _result179 TSIServiceInsertRecordResult
+	var _meta178 thrift.ResponseMeta
+	_meta178, _err = p.Client_().Call(ctx, "insertRecord", &_args177, &_result179)
+	p.SetLastResponseMeta_(_meta178)
+	if _err != nil {
+		return
+	}
+	return _result179.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) InsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (_r *TSStatus, _err error) {
+	var _args180 TSIServiceInsertStringRecordArgs
+	_args180.Req = req
+	var _result182 TSIServiceInsertStringRecordResult
+	var _meta181 thrift.ResponseMeta
+	_meta181, _err = p.Client_().Call(ctx, "insertStringRecord", &_args180, &_result182)
+	p.SetLastResponseMeta_(_meta181)
+	if _err != nil {
+		return
+	}
+	return _result182.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) InsertTablet(ctx context.Context, req *TSInsertTabletReq) (_r *TSStatus, _err error) {
+	var _args183 TSIServiceInsertTabletArgs
+	_args183.Req = req
+	var _result185 TSIServiceInsertTabletResult
+	var _meta184 thrift.ResponseMeta
+	_meta184, _err = p.Client_().Call(ctx, "insertTablet", &_args183, &_result185)
+	p.SetLastResponseMeta_(_meta184)
+	if _err != nil {
+		return
+	}
+	return _result185.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) InsertTablets(ctx context.Context, req *TSInsertTabletsReq) (_r *TSStatus, _err error) {
+	var _args186 TSIServiceInsertTabletsArgs
+	_args186.Req = req
+	var _result188 TSIServiceInsertTabletsResult
+	var _meta187 thrift.ResponseMeta
+	_meta187, _err = p.Client_().Call(ctx, "insertTablets", &_args186, &_result188)
+	p.SetLastResponseMeta_(_meta187)
+	if _err != nil {
+		return
+	}
+	return _result188.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) InsertRecords(ctx context.Context, req *TSInsertRecordsReq) (_r *TSStatus, _err error) {
+	var _args189 TSIServiceInsertRecordsArgs
+	_args189.Req = req
+	var _result191 TSIServiceInsertRecordsResult
+	var _meta190 thrift.ResponseMeta
+	_meta190, _err = p.Client_().Call(ctx, "insertRecords", &_args189, &_result191)
+	p.SetLastResponseMeta_(_meta190)
+	if _err != nil {
+		return
+	}
+	return _result191.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) InsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (_r *TSStatus, _err error) {
+	var _args192 TSIServiceInsertRecordsOfOneDeviceArgs
+	_args192.Req = req
+	var _result194 TSIServiceInsertRecordsOfOneDeviceResult
+	var _meta193 thrift.ResponseMeta
+	_meta193, _err = p.Client_().Call(ctx, "insertRecordsOfOneDevice", &_args192, &_result194)
+	p.SetLastResponseMeta_(_meta193)
+	if _err != nil {
+		return
+	}
+	return _result194.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) InsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (_r *TSStatus, _err error) {
+	var _args195 TSIServiceInsertStringRecordsArgs
+	_args195.Req = req
+	var _result197 TSIServiceInsertStringRecordsResult
+	var _meta196 thrift.ResponseMeta
+	_meta196, _err = p.Client_().Call(ctx, "insertStringRecords", &_args195, &_result197)
+	p.SetLastResponseMeta_(_meta196)
+	if _err != nil {
+		return
+	}
+	return _result197.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) TestInsertTablet(ctx context.Context, req *TSInsertTabletReq) (_r *TSStatus, _err error) {
+	var _args198 TSIServiceTestInsertTabletArgs
+	_args198.Req = req
+	var _result200 TSIServiceTestInsertTabletResult
+	var _meta199 thrift.ResponseMeta
+	_meta199, _err = p.Client_().Call(ctx, "testInsertTablet", &_args198, &_result200)
+	p.SetLastResponseMeta_(_meta199)
+	if _err != nil {
+		return
+	}
+	return _result200.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) TestInsertTablets(ctx context.Context, req *TSInsertTabletsReq) (_r *TSStatus, _err error) {
+	var _args201 TSIServiceTestInsertTabletsArgs
+	_args201.Req = req
+	var _result203 TSIServiceTestInsertTabletsResult
+	var _meta202 thrift.ResponseMeta
+	_meta202, _err = p.Client_().Call(ctx, "testInsertTablets", &_args201, &_result203)
+	p.SetLastResponseMeta_(_meta202)
+	if _err != nil {
+		return
+	}
+	return _result203.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) TestInsertRecord(ctx context.Context, req *TSInsertRecordReq) (_r *TSStatus, _err error) {
+	var _args204 TSIServiceTestInsertRecordArgs
+	_args204.Req = req
+	var _result206 TSIServiceTestInsertRecordResult
+	var _meta205 thrift.ResponseMeta
+	_meta205, _err = p.Client_().Call(ctx, "testInsertRecord", &_args204, &_result206)
+	p.SetLastResponseMeta_(_meta205)
+	if _err != nil {
+		return
+	}
+	return _result206.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) TestInsertStringRecord(ctx context.Context, req *TSInsertStringRecordReq) (_r *TSStatus, _err error) {
+	var _args207 TSIServiceTestInsertStringRecordArgs
+	_args207.Req = req
+	var _result209 TSIServiceTestInsertStringRecordResult
+	var _meta208 thrift.ResponseMeta
+	_meta208, _err = p.Client_().Call(ctx, "testInsertStringRecord", &_args207, &_result209)
+	p.SetLastResponseMeta_(_meta208)
+	if _err != nil {
+		return
+	}
+	return _result209.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) TestInsertRecords(ctx context.Context, req *TSInsertRecordsReq) (_r *TSStatus, _err error) {
+	var _args210 TSIServiceTestInsertRecordsArgs
+	_args210.Req = req
+	var _result212 TSIServiceTestInsertRecordsResult
+	var _meta211 thrift.ResponseMeta
+	_meta211, _err = p.Client_().Call(ctx, "testInsertRecords", &_args210, &_result212)
+	p.SetLastResponseMeta_(_meta211)
+	if _err != nil {
+		return
+	}
+	return _result212.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) TestInsertRecordsOfOneDevice(ctx context.Context, req *TSInsertRecordsOfOneDeviceReq) (_r *TSStatus, _err error) {
+	var _args213 TSIServiceTestInsertRecordsOfOneDeviceArgs
+	_args213.Req = req
+	var _result215 TSIServiceTestInsertRecordsOfOneDeviceResult
+	var _meta214 thrift.ResponseMeta
+	_meta214, _err = p.Client_().Call(ctx, "testInsertRecordsOfOneDevice", &_args213, &_result215)
+	p.SetLastResponseMeta_(_meta214)
+	if _err != nil {
+		return
+	}
+	return _result215.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) TestInsertStringRecords(ctx context.Context, req *TSInsertStringRecordsReq) (_r *TSStatus, _err error) {
+	var _args216 TSIServiceTestInsertStringRecordsArgs
+	_args216.Req = req
+	var _result218 TSIServiceTestInsertStringRecordsResult
+	var _meta217 thrift.ResponseMeta
+	_meta217, _err = p.Client_().Call(ctx, "testInsertStringRecords", &_args216, &_result218)
+	p.SetLastResponseMeta_(_meta217)
+	if _err != nil {
+		return
+	}
+	return _result218.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) DeleteData(ctx context.Context, req *TSDeleteDataReq) (_r *TSStatus, _err error) {
+	var _args219 TSIServiceDeleteDataArgs
+	_args219.Req = req
+	var _result221 TSIServiceDeleteDataResult
+	var _meta220 thrift.ResponseMeta
+	_meta220, _err = p.Client_().Call(ctx, "deleteData", &_args219, &_result221)
+	p.SetLastResponseMeta_(_meta220)
+	if _err != nil {
+		return
+	}
+	return _result221.GetSuccess(), nil
+}
+
+// Parameters:
+//  - Req
+func (p *TSIServiceClient) ExecuteRawDataQuery(ctx context.Context, req *TSRawDataQueryReq) (_r *TSExecuteStatementResp, _err error) {
+	var _args222 TSIServiceExecuteRawDataQueryArgs
+	_args222.Req = req
+	var _result224 TSIServiceExecuteRawDataQueryResult
+	var _meta223 thrift.ResponseMeta
+	_meta223, _err = p.Client_().Call(ctx, "executeRawDataQuery", &_args222, &_result224)
+	p.SetLastResponseMeta_(_meta223)
+	if _err != nil {
+		return
+	}
+	return _result224.GetSuccess(), nil
+}
+
+// Parameters:
+//  - SessionId
+func (p *TSIServiceClient) RequestStatementId(ctx context.Context, sessionId int64) (_r int64, _err error) {
+	var _args225 TSIServiceRequestStatementIdArgs
+	_args225.SessionId = sessionId
+	var _result227 TSIServiceRequestStatementIdResult
+	var _meta226 thrift.ResponseMeta
+	_meta226, _err = p.Client_().Call(ctx, "requestStatementId", &_args225, &_result227)
+	p.SetLastResponseMeta_(_meta226)
+	if _err != nil {
+		return
+	}
+	return _result227.GetSuccess(), nil
 }
 
 type TSIServiceProcessor struct {
 	processorMap map[string]thrift.TProcessorFunction
-	handler      TSIService
+	handler TSIService
 }
 
 func (p *TSIServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {
@@ -10332,61 +10294,59 @@
 
 func NewTSIServiceProcessor(handler TSIService) *TSIServiceProcessor {
 
-	self136 := &TSIServiceProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}
-	self136.processorMap["openSession"] = &tSIServiceProcessorOpenSession{handler: handler}
-	self136.processorMap["closeSession"] = &tSIServiceProcessorCloseSession{handler: handler}
-	self136.processorMap["executeStatement"] = &tSIServiceProcessorExecuteStatement{handler: handler}
-	self136.processorMap["executeBatchStatement"] = &tSIServiceProcessorExecuteBatchStatement{handler: handler}
-	self136.processorMap["executeQueryStatement"] = &tSIServiceProcessorExecuteQueryStatement{handler: handler}
-	self136.processorMap["executeUpdateStatement"] = &tSIServiceProcessorExecuteUpdateStatement{handler: handler}
-	self136.processorMap["fetchResults"] = &tSIServiceProcessorFetchResults{handler: handler}
-	self136.processorMap["fetchMetadata"] = &tSIServiceProcessorFetchMetadata{handler: handler}
-	self136.processorMap["cancelOperation"] = &tSIServiceProcessorCancelOperation{handler: handler}
-	self136.processorMap["closeOperation"] = &tSIServiceProcessorCloseOperation{handler: handler}
-	self136.processorMap["getTimeZone"] = &tSIServiceProcessorGetTimeZone{handler: handler}
-	self136.processorMap["setTimeZone"] = &tSIServiceProcessorSetTimeZone{handler: handler}
-	self136.processorMap["getProperties"] = &tSIServiceProcessorGetProperties{handler: handler}
-	self136.processorMap["setStorageGroup"] = &tSIServiceProcessorSetStorageGroup{handler: handler}
-	self136.processorMap["createTimeseries"] = &tSIServiceProcessorCreateTimeseries{handler: handler}
-	self136.processorMap["createMultiTimeseries"] = &tSIServiceProcessorCreateMultiTimeseries{handler: handler}
-	self136.processorMap["deleteTimeseries"] = &tSIServiceProcessorDeleteTimeseries{handler: handler}
-	self136.processorMap["deleteStorageGroups"] = &tSIServiceProcessorDeleteStorageGroups{handler: handler}
-	self136.processorMap["insertRecord"] = &tSIServiceProcessorInsertRecord{handler: handler}
-	self136.processorMap["insertStringRecord"] = &tSIServiceProcessorInsertStringRecord{handler: handler}
-	self136.processorMap["insertTablet"] = &tSIServiceProcessorInsertTablet{handler: handler}
-	self136.processorMap["insertTablets"] = &tSIServiceProcessorInsertTablets{handler: handler}
-	self136.processorMap["insertRecords"] = &tSIServiceProcessorInsertRecords{handler: handler}
-	self136.processorMap["insertRecordsOfOneDevice"] = &tSIServiceProcessorInsertRecordsOfOneDevice{handler: handler}
-	self136.processorMap["insertStringRecords"] = &tSIServiceProcessorInsertStringRecords{handler: handler}
-	self136.processorMap["testInsertTablet"] = &tSIServiceProcessorTestInsertTablet{handler: handler}
-	self136.processorMap["testInsertTablets"] = &tSIServiceProcessorTestInsertTablets{handler: handler}
-	self136.processorMap["testInsertRecord"] = &tSIServiceProcessorTestInsertRecord{handler: handler}
-	self136.processorMap["testInsertStringRecord"] = &tSIServiceProcessorTestInsertStringRecord{handler: handler}
-	self136.processorMap["testInsertRecords"] = &tSIServiceProcessorTestInsertRecords{handler: handler}
-	self136.processorMap["testInsertRecordsOfOneDevice"] = &tSIServiceProcessorTestInsertRecordsOfOneDevice{handler: handler}
-	self136.processorMap["testInsertStringRecords"] = &tSIServiceProcessorTestInsertStringRecords{handler: handler}
-	self136.processorMap["deleteData"] = &tSIServiceProcessorDeleteData{handler: handler}
-	self136.processorMap["executeRawDataQuery"] = &tSIServiceProcessorExecuteRawDataQuery{handler: handler}
-	self136.processorMap["requestStatementId"] = &tSIServiceProcessorRequestStatementId{handler: handler}
-	return self136
+	self228 := &TSIServiceProcessor{handler:handler, processorMap:make(map[string]thrift.TProcessorFunction)}
+	self228.processorMap["openSession"] = &tSIServiceProcessorOpenSession{handler:handler}
+	self228.processorMap["closeSession"] = &tSIServiceProcessorCloseSession{handler:handler}
+	self228.processorMap["executeStatement"] = &tSIServiceProcessorExecuteStatement{handler:handler}
+	self228.processorMap["executeBatchStatement"] = &tSIServiceProcessorExecuteBatchStatement{handler:handler}
+	self228.processorMap["executeQueryStatement"] = &tSIServiceProcessorExecuteQueryStatement{handler:handler}
+	self228.processorMap["executeUpdateStatement"] = &tSIServiceProcessorExecuteUpdateStatement{handler:handler}
+	self228.processorMap["fetchResults"] = &tSIServiceProcessorFetchResults{handler:handler}
+	self228.processorMap["fetchMetadata"] = &tSIServiceProcessorFetchMetadata{handler:handler}
+	self228.processorMap["cancelOperation"] = &tSIServiceProcessorCancelOperation{handler:handler}
+	self228.processorMap["closeOperation"] = &tSIServiceProcessorCloseOperation{handler:handler}
+	self228.processorMap["getTimeZone"] = &tSIServiceProcessorGetTimeZone{handler:handler}
+	self228.processorMap["setTimeZone"] = &tSIServiceProcessorSetTimeZone{handler:handler}
+	self228.processorMap["getProperties"] = &tSIServiceProcessorGetProperties{handler:handler}
+	self228.processorMap["setStorageGroup"] = &tSIServiceProcessorSetStorageGroup{handler:handler}
+	self228.processorMap["createTimeseries"] = &tSIServiceProcessorCreateTimeseries{handler:handler}
+	self228.processorMap["createMultiTimeseries"] = &tSIServiceProcessorCreateMultiTimeseries{handler:handler}
+	self228.processorMap["deleteTimeseries"] = &tSIServiceProcessorDeleteTimeseries{handler:handler}
+	self228.processorMap["deleteStorageGroups"] = &tSIServiceProcessorDeleteStorageGroups{handler:handler}
+	self228.processorMap["insertRecord"] = &tSIServiceProcessorInsertRecord{handler:handler}
+	self228.processorMap["insertStringRecord"] = &tSIServiceProcessorInsertStringRecord{handler:handler}
+	self228.processorMap["insertTablet"] = &tSIServiceProcessorInsertTablet{handler:handler}
+	self228.processorMap["insertTablets"] = &tSIServiceProcessorInsertTablets{handler:handler}
+	self228.processorMap["insertRecords"] = &tSIServiceProcessorInsertRecords{handler:handler}
+	self228.processorMap["insertRecordsOfOneDevice"] = &tSIServiceProcessorInsertRecordsOfOneDevice{handler:handler}
+	self228.processorMap["insertStringRecords"] = &tSIServiceProcessorInsertStringRecords{handler:handler}
+	self228.processorMap["testInsertTablet"] = &tSIServiceProcessorTestInsertTablet{handler:handler}
+	self228.processorMap["testInsertTablets"] = &tSIServiceProcessorTestInsertTablets{handler:handler}
+	self228.processorMap["testInsertRecord"] = &tSIServiceProcessorTestInsertRecord{handler:handler}
+	self228.processorMap["testInsertStringRecord"] = &tSIServiceProcessorTestInsertStringRecord{handler:handler}
+	self228.processorMap["testInsertRecords"] = &tSIServiceProcessorTestInsertRecords{handler:handler}
+	self228.processorMap["testInsertRecordsOfOneDevice"] = &tSIServiceProcessorTestInsertRecordsOfOneDevice{handler:handler}
+	self228.processorMap["testInsertStringRecords"] = &tSIServiceProcessorTestInsertStringRecords{handler:handler}
+	self228.processorMap["deleteData"] = &tSIServiceProcessorDeleteData{handler:handler}
+	self228.processorMap["executeRawDataQuery"] = &tSIServiceProcessorExecuteRawDataQuery{handler:handler}
+	self228.processorMap["requestStatementId"] = &tSIServiceProcessorRequestStatementId{handler:handler}
+	return self228
 }
 
 func (p *TSIServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
-	name, _, seqId, err := iprot.ReadMessageBegin()
-	if err != nil {
-		return false, err
-	}
+	name, _, seqId, err2 := iprot.ReadMessageBegin(ctx)
+	if err2 != nil { return false, thrift.WrapTException(err2) }
 	if processor, ok := p.GetProcessorFunction(name); ok {
 		return processor.Process(ctx, seqId, iprot, oprot)
 	}
-	iprot.Skip(thrift.STRUCT)
-	iprot.ReadMessageEnd()
-	x137 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name)
-	oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)
-	x137.Write(oprot)
-	oprot.WriteMessageEnd()
+	iprot.Skip(ctx, thrift.STRUCT)
+	iprot.ReadMessageEnd(ctx)
+	x229 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function " + name)
+	oprot.WriteMessageBegin(ctx, name, thrift.EXCEPTION, seqId)
+	x229.Write(ctx, oprot)
+	oprot.WriteMessageEnd(ctx)
 	oprot.Flush(ctx)
-	return false, x137
+	return false, x229
 
 }
 
@@ -10396,41 +10356,72 @@
 
 func (p *tSIServiceProcessorOpenSession) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceOpenSessionArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("openSession", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "openSession", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceOpenSessionResult{}
 	var retval *TSOpenSessionResp
-	var err2 error
 	if retval, err2 = p.handler.OpenSession(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing openSession: "+err2.Error())
-		oprot.WriteMessageBegin("openSession", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing openSession: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "openSession", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("openSession", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "openSession", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10444,41 +10435,72 @@
 
 func (p *tSIServiceProcessorCloseSession) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceCloseSessionArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("closeSession", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "closeSession", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceCloseSessionResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.CloseSession(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing closeSession: "+err2.Error())
-		oprot.WriteMessageBegin("closeSession", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing closeSession: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "closeSession", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("closeSession", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "closeSession", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10492,41 +10514,72 @@
 
 func (p *tSIServiceProcessorExecuteStatement) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceExecuteStatementArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("executeStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceExecuteStatementResult{}
 	var retval *TSExecuteStatementResp
-	var err2 error
 	if retval, err2 = p.handler.ExecuteStatement(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeStatement: "+err2.Error())
-		oprot.WriteMessageBegin("executeStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeStatement: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("executeStatement", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "executeStatement", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10540,41 +10593,72 @@
 
 func (p *tSIServiceProcessorExecuteBatchStatement) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceExecuteBatchStatementArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("executeBatchStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeBatchStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceExecuteBatchStatementResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.ExecuteBatchStatement(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeBatchStatement: "+err2.Error())
-		oprot.WriteMessageBegin("executeBatchStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeBatchStatement: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeBatchStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("executeBatchStatement", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "executeBatchStatement", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10588,41 +10672,72 @@
 
 func (p *tSIServiceProcessorExecuteQueryStatement) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceExecuteQueryStatementArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("executeQueryStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeQueryStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceExecuteQueryStatementResult{}
 	var retval *TSExecuteStatementResp
-	var err2 error
 	if retval, err2 = p.handler.ExecuteQueryStatement(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeQueryStatement: "+err2.Error())
-		oprot.WriteMessageBegin("executeQueryStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeQueryStatement: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeQueryStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("executeQueryStatement", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "executeQueryStatement", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10636,41 +10751,72 @@
 
 func (p *tSIServiceProcessorExecuteUpdateStatement) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceExecuteUpdateStatementArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("executeUpdateStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeUpdateStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceExecuteUpdateStatementResult{}
 	var retval *TSExecuteStatementResp
-	var err2 error
 	if retval, err2 = p.handler.ExecuteUpdateStatement(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeUpdateStatement: "+err2.Error())
-		oprot.WriteMessageBegin("executeUpdateStatement", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeUpdateStatement: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeUpdateStatement", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("executeUpdateStatement", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "executeUpdateStatement", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10684,41 +10830,72 @@
 
 func (p *tSIServiceProcessorFetchResults) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceFetchResultsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("fetchResults", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "fetchResults", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceFetchResultsResult{}
 	var retval *TSFetchResultsResp
-	var err2 error
 	if retval, err2 = p.handler.FetchResults(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchResults: "+err2.Error())
-		oprot.WriteMessageBegin("fetchResults", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchResults: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "fetchResults", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("fetchResults", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "fetchResults", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10732,41 +10909,72 @@
 
 func (p *tSIServiceProcessorFetchMetadata) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceFetchMetadataArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("fetchMetadata", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "fetchMetadata", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceFetchMetadataResult{}
 	var retval *TSFetchMetadataResp
-	var err2 error
 	if retval, err2 = p.handler.FetchMetadata(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchMetadata: "+err2.Error())
-		oprot.WriteMessageBegin("fetchMetadata", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing fetchMetadata: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "fetchMetadata", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("fetchMetadata", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "fetchMetadata", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10780,41 +10988,72 @@
 
 func (p *tSIServiceProcessorCancelOperation) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceCancelOperationArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("cancelOperation", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "cancelOperation", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceCancelOperationResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.CancelOperation(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing cancelOperation: "+err2.Error())
-		oprot.WriteMessageBegin("cancelOperation", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing cancelOperation: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "cancelOperation", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("cancelOperation", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "cancelOperation", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10828,41 +11067,72 @@
 
 func (p *tSIServiceProcessorCloseOperation) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceCloseOperationArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("closeOperation", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "closeOperation", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceCloseOperationResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.CloseOperation(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing closeOperation: "+err2.Error())
-		oprot.WriteMessageBegin("closeOperation", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing closeOperation: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "closeOperation", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("closeOperation", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "closeOperation", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10876,41 +11146,72 @@
 
 func (p *tSIServiceProcessorGetTimeZone) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceGetTimeZoneArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("getTimeZone", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "getTimeZone", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceGetTimeZoneResult{}
 	var retval *TSGetTimeZoneResp
-	var err2 error
 	if retval, err2 = p.handler.GetTimeZone(ctx, args.SessionId); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getTimeZone: "+err2.Error())
-		oprot.WriteMessageBegin("getTimeZone", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getTimeZone: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "getTimeZone", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("getTimeZone", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "getTimeZone", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10924,41 +11225,72 @@
 
 func (p *tSIServiceProcessorSetTimeZone) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceSetTimeZoneArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("setTimeZone", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "setTimeZone", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceSetTimeZoneResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.SetTimeZone(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setTimeZone: "+err2.Error())
-		oprot.WriteMessageBegin("setTimeZone", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setTimeZone: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "setTimeZone", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("setTimeZone", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "setTimeZone", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -10972,41 +11304,72 @@
 
 func (p *tSIServiceProcessorGetProperties) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceGetPropertiesArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("getProperties", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "getProperties", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceGetPropertiesResult{}
 	var retval *ServerProperties
-	var err2 error
 	if retval, err2 = p.handler.GetProperties(ctx); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getProperties: "+err2.Error())
-		oprot.WriteMessageBegin("getProperties", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getProperties: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "getProperties", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("getProperties", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "getProperties", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11020,41 +11383,72 @@
 
 func (p *tSIServiceProcessorSetStorageGroup) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceSetStorageGroupArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("setStorageGroup", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "setStorageGroup", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceSetStorageGroupResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.SetStorageGroup(ctx, args.SessionId, args.StorageGroup); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setStorageGroup: "+err2.Error())
-		oprot.WriteMessageBegin("setStorageGroup", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing setStorageGroup: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "setStorageGroup", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("setStorageGroup", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "setStorageGroup", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11068,41 +11462,72 @@
 
 func (p *tSIServiceProcessorCreateTimeseries) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceCreateTimeseriesArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("createTimeseries", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "createTimeseries", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceCreateTimeseriesResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.CreateTimeseries(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing createTimeseries: "+err2.Error())
-		oprot.WriteMessageBegin("createTimeseries", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing createTimeseries: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "createTimeseries", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("createTimeseries", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "createTimeseries", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11116,41 +11541,72 @@
 
 func (p *tSIServiceProcessorCreateMultiTimeseries) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceCreateMultiTimeseriesArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("createMultiTimeseries", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "createMultiTimeseries", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceCreateMultiTimeseriesResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.CreateMultiTimeseries(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing createMultiTimeseries: "+err2.Error())
-		oprot.WriteMessageBegin("createMultiTimeseries", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing createMultiTimeseries: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "createMultiTimeseries", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("createMultiTimeseries", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "createMultiTimeseries", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11164,41 +11620,72 @@
 
 func (p *tSIServiceProcessorDeleteTimeseries) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceDeleteTimeseriesArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("deleteTimeseries", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "deleteTimeseries", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceDeleteTimeseriesResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.DeleteTimeseries(ctx, args.SessionId, args.Path); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing deleteTimeseries: "+err2.Error())
-		oprot.WriteMessageBegin("deleteTimeseries", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing deleteTimeseries: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "deleteTimeseries", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("deleteTimeseries", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "deleteTimeseries", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11212,41 +11699,72 @@
 
 func (p *tSIServiceProcessorDeleteStorageGroups) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceDeleteStorageGroupsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("deleteStorageGroups", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "deleteStorageGroups", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceDeleteStorageGroupsResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.DeleteStorageGroups(ctx, args.SessionId, args.StorageGroup); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing deleteStorageGroups: "+err2.Error())
-		oprot.WriteMessageBegin("deleteStorageGroups", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing deleteStorageGroups: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "deleteStorageGroups", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("deleteStorageGroups", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "deleteStorageGroups", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11260,41 +11778,72 @@
 
 func (p *tSIServiceProcessorInsertRecord) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceInsertRecordArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("insertRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceInsertRecordResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.InsertRecord(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertRecord: "+err2.Error())
-		oprot.WriteMessageBegin("insertRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertRecord: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("insertRecord", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "insertRecord", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11308,41 +11857,72 @@
 
 func (p *tSIServiceProcessorInsertStringRecord) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceInsertStringRecordArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("insertStringRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertStringRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceInsertStringRecordResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.InsertStringRecord(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertStringRecord: "+err2.Error())
-		oprot.WriteMessageBegin("insertStringRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertStringRecord: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertStringRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("insertStringRecord", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "insertStringRecord", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11356,41 +11936,72 @@
 
 func (p *tSIServiceProcessorInsertTablet) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceInsertTabletArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("insertTablet", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertTablet", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceInsertTabletResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.InsertTablet(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertTablet: "+err2.Error())
-		oprot.WriteMessageBegin("insertTablet", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertTablet: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertTablet", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("insertTablet", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "insertTablet", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11404,41 +12015,72 @@
 
 func (p *tSIServiceProcessorInsertTablets) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceInsertTabletsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("insertTablets", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertTablets", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceInsertTabletsResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.InsertTablets(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertTablets: "+err2.Error())
-		oprot.WriteMessageBegin("insertTablets", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertTablets: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertTablets", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("insertTablets", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "insertTablets", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11452,41 +12094,72 @@
 
 func (p *tSIServiceProcessorInsertRecords) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceInsertRecordsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("insertRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceInsertRecordsResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.InsertRecords(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertRecords: "+err2.Error())
-		oprot.WriteMessageBegin("insertRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertRecords: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("insertRecords", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "insertRecords", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11500,41 +12173,72 @@
 
 func (p *tSIServiceProcessorInsertRecordsOfOneDevice) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceInsertRecordsOfOneDeviceArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("insertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceInsertRecordsOfOneDeviceResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.InsertRecordsOfOneDevice(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertRecordsOfOneDevice: "+err2.Error())
-		oprot.WriteMessageBegin("insertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertRecordsOfOneDevice: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("insertRecordsOfOneDevice", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "insertRecordsOfOneDevice", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11548,41 +12252,72 @@
 
 func (p *tSIServiceProcessorInsertStringRecords) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceInsertStringRecordsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("insertStringRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertStringRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceInsertStringRecordsResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.InsertStringRecords(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertStringRecords: "+err2.Error())
-		oprot.WriteMessageBegin("insertStringRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing insertStringRecords: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "insertStringRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("insertStringRecords", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "insertStringRecords", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11596,41 +12331,72 @@
 
 func (p *tSIServiceProcessorTestInsertTablet) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceTestInsertTabletArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("testInsertTablet", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertTablet", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceTestInsertTabletResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.TestInsertTablet(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertTablet: "+err2.Error())
-		oprot.WriteMessageBegin("testInsertTablet", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertTablet: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertTablet", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("testInsertTablet", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "testInsertTablet", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11644,41 +12410,72 @@
 
 func (p *tSIServiceProcessorTestInsertTablets) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceTestInsertTabletsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("testInsertTablets", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertTablets", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceTestInsertTabletsResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.TestInsertTablets(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertTablets: "+err2.Error())
-		oprot.WriteMessageBegin("testInsertTablets", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertTablets: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertTablets", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("testInsertTablets", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "testInsertTablets", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11692,41 +12489,72 @@
 
 func (p *tSIServiceProcessorTestInsertRecord) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceTestInsertRecordArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("testInsertRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceTestInsertRecordResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.TestInsertRecord(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertRecord: "+err2.Error())
-		oprot.WriteMessageBegin("testInsertRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertRecord: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("testInsertRecord", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "testInsertRecord", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11740,41 +12568,72 @@
 
 func (p *tSIServiceProcessorTestInsertStringRecord) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceTestInsertStringRecordArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("testInsertStringRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertStringRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceTestInsertStringRecordResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.TestInsertStringRecord(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertStringRecord: "+err2.Error())
-		oprot.WriteMessageBegin("testInsertStringRecord", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertStringRecord: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertStringRecord", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("testInsertStringRecord", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "testInsertStringRecord", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11788,41 +12647,72 @@
 
 func (p *tSIServiceProcessorTestInsertRecords) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceTestInsertRecordsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("testInsertRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceTestInsertRecordsResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.TestInsertRecords(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertRecords: "+err2.Error())
-		oprot.WriteMessageBegin("testInsertRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertRecords: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("testInsertRecords", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "testInsertRecords", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11836,41 +12726,72 @@
 
 func (p *tSIServiceProcessorTestInsertRecordsOfOneDevice) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceTestInsertRecordsOfOneDeviceArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("testInsertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceTestInsertRecordsOfOneDeviceResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.TestInsertRecordsOfOneDevice(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertRecordsOfOneDevice: "+err2.Error())
-		oprot.WriteMessageBegin("testInsertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertRecordsOfOneDevice: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertRecordsOfOneDevice", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("testInsertRecordsOfOneDevice", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "testInsertRecordsOfOneDevice", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11884,41 +12805,72 @@
 
 func (p *tSIServiceProcessorTestInsertStringRecords) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceTestInsertStringRecordsArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("testInsertStringRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertStringRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceTestInsertStringRecordsResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.TestInsertStringRecords(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertStringRecords: "+err2.Error())
-		oprot.WriteMessageBegin("testInsertStringRecords", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing testInsertStringRecords: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "testInsertStringRecords", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("testInsertStringRecords", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "testInsertStringRecords", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11932,41 +12884,72 @@
 
 func (p *tSIServiceProcessorDeleteData) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceDeleteDataArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("deleteData", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "deleteData", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceDeleteDataResult{}
 	var retval *TSStatus
-	var err2 error
 	if retval, err2 = p.handler.DeleteData(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing deleteData: "+err2.Error())
-		oprot.WriteMessageBegin("deleteData", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing deleteData: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "deleteData", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("deleteData", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "deleteData", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -11980,41 +12963,72 @@
 
 func (p *tSIServiceProcessorExecuteRawDataQuery) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceExecuteRawDataQueryArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("executeRawDataQuery", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeRawDataQuery", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceExecuteRawDataQueryResult{}
 	var retval *TSExecuteStatementResp
-	var err2 error
 	if retval, err2 = p.handler.ExecuteRawDataQuery(ctx, args.Req); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeRawDataQuery: "+err2.Error())
-		oprot.WriteMessageBegin("executeRawDataQuery", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing executeRawDataQuery: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "executeRawDataQuery", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = retval
 	}
-	if err2 = oprot.WriteMessageBegin("executeRawDataQuery", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "executeRawDataQuery", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -12028,41 +13042,72 @@
 
 func (p *tSIServiceProcessorRequestStatementId) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {
 	args := TSIServiceRequestStatementIdArgs{}
-	if err = args.Read(iprot); err != nil {
-		iprot.ReadMessageEnd()
-		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())
-		oprot.WriteMessageBegin("requestStatementId", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+	var err2 error
+	if err2 = args.Read(ctx, iprot); err2 != nil {
+		iprot.ReadMessageEnd(ctx)
+		x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())
+		oprot.WriteMessageBegin(ctx, "requestStatementId", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return false, err
+		return false, thrift.WrapTException(err2)
+	}
+	iprot.ReadMessageEnd(ctx)
+
+	tickerCancel := func() {}
+	// Start a goroutine to do server side connectivity check.
+	if thrift.ServerConnectivityCheckInterval > 0 {
+		var cancel context.CancelFunc
+		ctx, cancel = context.WithCancel(ctx)
+		defer cancel()
+		var tickerCtx context.Context
+		tickerCtx, tickerCancel = context.WithCancel(context.Background())
+		defer tickerCancel()
+		go func(ctx context.Context, cancel context.CancelFunc) {
+			ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)
+			defer ticker.Stop()
+			for {
+				select {
+				case <-ctx.Done():
+					return
+				case <-ticker.C:
+					if !iprot.Transport().IsOpen() {
+						cancel()
+						return
+					}
+				}
+			}
+		}(tickerCtx, cancel)
 	}
 
-	iprot.ReadMessageEnd()
 	result := TSIServiceRequestStatementIdResult{}
 	var retval int64
-	var err2 error
 	if retval, err2 = p.handler.RequestStatementId(ctx, args.SessionId); err2 != nil {
-		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing requestStatementId: "+err2.Error())
-		oprot.WriteMessageBegin("requestStatementId", thrift.EXCEPTION, seqId)
-		x.Write(oprot)
-		oprot.WriteMessageEnd()
+		tickerCancel()
+		if err2 == thrift.ErrAbandonRequest {
+			return false, thrift.WrapTException(err2)
+		}
+		x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing requestStatementId: " + err2.Error())
+		oprot.WriteMessageBegin(ctx, "requestStatementId", thrift.EXCEPTION, seqId)
+		x.Write(ctx, oprot)
+		oprot.WriteMessageEnd(ctx)
 		oprot.Flush(ctx)
-		return true, err2
+		return true, thrift.WrapTException(err2)
 	} else {
 		result.Success = &retval
 	}
-	if err2 = oprot.WriteMessageBegin("requestStatementId", thrift.REPLY, seqId); err2 != nil {
-		err = err2
+	tickerCancel()
+	if err2 = oprot.WriteMessageBegin(ctx, "requestStatementId", thrift.REPLY, seqId); err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = result.Write(oprot); err == nil && err2 != nil {
-		err = err2
+	if err2 = result.Write(ctx, oprot); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
-	if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {
-		err = err2
+	if err2 = oprot.WriteMessageEnd(ctx); err == nil && err2 != nil {
+		err = thrift.WrapTException(err2)
 	}
 	if err2 = oprot.Flush(ctx); err == nil && err2 != nil {
-		err = err2
+		err = thrift.WrapTException(err2)
 	}
 	if err != nil {
 		return
@@ -12070,6 +13115,7 @@
 	return true, err
 }
 
+
 // HELPER FUNCTIONS AND STRUCTURES
 
 // Attributes:
@@ -12083,7 +13129,6 @@
 }
 
 var TSIServiceOpenSessionArgs_Req_DEFAULT *TSOpenSessionReq
-
 func (p *TSIServiceOpenSessionArgs) GetReq() *TSOpenSessionReq {
 	if !p.IsSetReq() {
 		return TSIServiceOpenSessionArgs_Req_DEFAULT
@@ -12094,83 +13139,75 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceOpenSessionArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceOpenSessionArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceOpenSessionArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceOpenSessionArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSOpenSessionReq{
-		ClientProtocol: 2,
+		ClientProtocol:   2,
 	}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceOpenSessionArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("openSession_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceOpenSessionArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "openSession_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceOpenSessionArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceOpenSessionArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -12192,7 +13229,6 @@
 }
 
 var TSIServiceOpenSessionResult_Success_DEFAULT *TSOpenSessionResp
-
 func (p *TSIServiceOpenSessionResult) GetSuccess() *TSOpenSessionResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceOpenSessionResult_Success_DEFAULT
@@ -12203,84 +13239,76 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceOpenSessionResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceOpenSessionResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceOpenSessionResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceOpenSessionResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSOpenSessionResp{
-		ServerProtocolVersion: 0,
+		ServerProtocolVersion:   0,
 	}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceOpenSessionResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("openSession_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceOpenSessionResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "openSession_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceOpenSessionResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceOpenSessionResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -12303,7 +13331,6 @@
 }
 
 var TSIServiceCloseSessionArgs_Req_DEFAULT *TSCloseSessionReq
-
 func (p *TSIServiceCloseSessionArgs) GetReq() *TSCloseSessionReq {
 	if !p.IsSetReq() {
 		return TSIServiceCloseSessionArgs_Req_DEFAULT
@@ -12314,81 +13341,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceCloseSessionArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCloseSessionArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseSessionArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceCloseSessionArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSCloseSessionReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseSessionArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("closeSession_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCloseSessionArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "closeSession_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCloseSessionArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceCloseSessionArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -12410,7 +13429,6 @@
 }
 
 var TSIServiceCloseSessionResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceCloseSessionResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceCloseSessionResult_Success_DEFAULT
@@ -12421,82 +13439,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceCloseSessionResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCloseSessionResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseSessionResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceCloseSessionResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseSessionResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("closeSession_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCloseSessionResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "closeSession_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCloseSessionResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceCloseSessionResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -12519,7 +13529,6 @@
 }
 
 var TSIServiceExecuteStatementArgs_Req_DEFAULT *TSExecuteStatementReq
-
 func (p *TSIServiceExecuteStatementArgs) GetReq() *TSExecuteStatementReq {
 	if !p.IsSetReq() {
 		return TSIServiceExecuteStatementArgs_Req_DEFAULT
@@ -12530,81 +13539,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceExecuteStatementArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteStatementArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteStatementArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteStatementArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSExecuteStatementReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteStatementArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeStatement_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteStatementArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeStatement_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteStatementArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceExecuteStatementArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -12626,7 +13627,6 @@
 }
 
 var TSIServiceExecuteStatementResult_Success_DEFAULT *TSExecuteStatementResp
-
 func (p *TSIServiceExecuteStatementResult) GetSuccess() *TSExecuteStatementResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceExecuteStatementResult_Success_DEFAULT
@@ -12637,82 +13637,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceExecuteStatementResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteStatementResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteStatementResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteStatementResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSExecuteStatementResp{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteStatementResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeStatement_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteStatementResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeStatement_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteStatementResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceExecuteStatementResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -12735,7 +13727,6 @@
 }
 
 var TSIServiceExecuteBatchStatementArgs_Req_DEFAULT *TSExecuteBatchStatementReq
-
 func (p *TSIServiceExecuteBatchStatementArgs) GetReq() *TSExecuteBatchStatementReq {
 	if !p.IsSetReq() {
 		return TSIServiceExecuteBatchStatementArgs_Req_DEFAULT
@@ -12746,81 +13737,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceExecuteBatchStatementArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteBatchStatementArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteBatchStatementArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteBatchStatementArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSExecuteBatchStatementReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteBatchStatementArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeBatchStatement_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteBatchStatementArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeBatchStatement_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteBatchStatementArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceExecuteBatchStatementArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -12842,7 +13825,6 @@
 }
 
 var TSIServiceExecuteBatchStatementResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceExecuteBatchStatementResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceExecuteBatchStatementResult_Success_DEFAULT
@@ -12853,82 +13835,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceExecuteBatchStatementResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteBatchStatementResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteBatchStatementResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteBatchStatementResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteBatchStatementResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeBatchStatement_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteBatchStatementResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeBatchStatement_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteBatchStatementResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceExecuteBatchStatementResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -12951,7 +13925,6 @@
 }
 
 var TSIServiceExecuteQueryStatementArgs_Req_DEFAULT *TSExecuteStatementReq
-
 func (p *TSIServiceExecuteQueryStatementArgs) GetReq() *TSExecuteStatementReq {
 	if !p.IsSetReq() {
 		return TSIServiceExecuteQueryStatementArgs_Req_DEFAULT
@@ -12962,81 +13935,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceExecuteQueryStatementArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteQueryStatementArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteQueryStatementArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteQueryStatementArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSExecuteStatementReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteQueryStatementArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeQueryStatement_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteQueryStatementArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeQueryStatement_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteQueryStatementArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceExecuteQueryStatementArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -13058,7 +14023,6 @@
 }
 
 var TSIServiceExecuteQueryStatementResult_Success_DEFAULT *TSExecuteStatementResp
-
 func (p *TSIServiceExecuteQueryStatementResult) GetSuccess() *TSExecuteStatementResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceExecuteQueryStatementResult_Success_DEFAULT
@@ -13069,82 +14033,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceExecuteQueryStatementResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteQueryStatementResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteQueryStatementResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteQueryStatementResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSExecuteStatementResp{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteQueryStatementResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeQueryStatement_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteQueryStatementResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeQueryStatement_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteQueryStatementResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceExecuteQueryStatementResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -13167,7 +14123,6 @@
 }
 
 var TSIServiceExecuteUpdateStatementArgs_Req_DEFAULT *TSExecuteStatementReq
-
 func (p *TSIServiceExecuteUpdateStatementArgs) GetReq() *TSExecuteStatementReq {
 	if !p.IsSetReq() {
 		return TSIServiceExecuteUpdateStatementArgs_Req_DEFAULT
@@ -13178,81 +14133,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteUpdateStatementArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteUpdateStatementArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSExecuteStatementReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeUpdateStatement_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteUpdateStatementArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeUpdateStatement_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceExecuteUpdateStatementArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -13274,7 +14221,6 @@
 }
 
 var TSIServiceExecuteUpdateStatementResult_Success_DEFAULT *TSExecuteStatementResp
-
 func (p *TSIServiceExecuteUpdateStatementResult) GetSuccess() *TSExecuteStatementResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceExecuteUpdateStatementResult_Success_DEFAULT
@@ -13285,82 +14231,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteUpdateStatementResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteUpdateStatementResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSExecuteStatementResp{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeUpdateStatement_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteUpdateStatementResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeUpdateStatement_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteUpdateStatementResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceExecuteUpdateStatementResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -13383,7 +14321,6 @@
 }
 
 var TSIServiceFetchResultsArgs_Req_DEFAULT *TSFetchResultsReq
-
 func (p *TSIServiceFetchResultsArgs) GetReq() *TSFetchResultsReq {
 	if !p.IsSetReq() {
 		return TSIServiceFetchResultsArgs_Req_DEFAULT
@@ -13394,81 +14331,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceFetchResultsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceFetchResultsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchResultsArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceFetchResultsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSFetchResultsReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchResultsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("fetchResults_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceFetchResultsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "fetchResults_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceFetchResultsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceFetchResultsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -13490,7 +14419,6 @@
 }
 
 var TSIServiceFetchResultsResult_Success_DEFAULT *TSFetchResultsResp
-
 func (p *TSIServiceFetchResultsResult) GetSuccess() *TSFetchResultsResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceFetchResultsResult_Success_DEFAULT
@@ -13501,82 +14429,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceFetchResultsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceFetchResultsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchResultsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceFetchResultsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSFetchResultsResp{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchResultsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("fetchResults_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceFetchResultsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "fetchResults_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceFetchResultsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceFetchResultsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -13599,7 +14519,6 @@
 }
 
 var TSIServiceFetchMetadataArgs_Req_DEFAULT *TSFetchMetadataReq
-
 func (p *TSIServiceFetchMetadataArgs) GetReq() *TSFetchMetadataReq {
 	if !p.IsSetReq() {
 		return TSIServiceFetchMetadataArgs_Req_DEFAULT
@@ -13610,81 +14529,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceFetchMetadataArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceFetchMetadataArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchMetadataArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceFetchMetadataArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSFetchMetadataReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchMetadataArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("fetchMetadata_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceFetchMetadataArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "fetchMetadata_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceFetchMetadataArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceFetchMetadataArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -13706,7 +14617,6 @@
 }
 
 var TSIServiceFetchMetadataResult_Success_DEFAULT *TSFetchMetadataResp
-
 func (p *TSIServiceFetchMetadataResult) GetSuccess() *TSFetchMetadataResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceFetchMetadataResult_Success_DEFAULT
@@ -13717,82 +14627,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceFetchMetadataResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceFetchMetadataResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchMetadataResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceFetchMetadataResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSFetchMetadataResp{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceFetchMetadataResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("fetchMetadata_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceFetchMetadataResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "fetchMetadata_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceFetchMetadataResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceFetchMetadataResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -13815,7 +14717,6 @@
 }
 
 var TSIServiceCancelOperationArgs_Req_DEFAULT *TSCancelOperationReq
-
 func (p *TSIServiceCancelOperationArgs) GetReq() *TSCancelOperationReq {
 	if !p.IsSetReq() {
 		return TSIServiceCancelOperationArgs_Req_DEFAULT
@@ -13826,81 +14727,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceCancelOperationArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCancelOperationArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCancelOperationArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceCancelOperationArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSCancelOperationReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCancelOperationArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("cancelOperation_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCancelOperationArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "cancelOperation_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCancelOperationArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceCancelOperationArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -13922,7 +14815,6 @@
 }
 
 var TSIServiceCancelOperationResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceCancelOperationResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceCancelOperationResult_Success_DEFAULT
@@ -13933,82 +14825,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceCancelOperationResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCancelOperationResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCancelOperationResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceCancelOperationResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCancelOperationResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("cancelOperation_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCancelOperationResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "cancelOperation_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCancelOperationResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceCancelOperationResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -14031,7 +14915,6 @@
 }
 
 var TSIServiceCloseOperationArgs_Req_DEFAULT *TSCloseOperationReq
-
 func (p *TSIServiceCloseOperationArgs) GetReq() *TSCloseOperationReq {
 	if !p.IsSetReq() {
 		return TSIServiceCloseOperationArgs_Req_DEFAULT
@@ -14042,81 +14925,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceCloseOperationArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCloseOperationArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseOperationArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceCloseOperationArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSCloseOperationReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseOperationArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("closeOperation_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCloseOperationArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "closeOperation_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCloseOperationArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceCloseOperationArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -14138,7 +15013,6 @@
 }
 
 var TSIServiceCloseOperationResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceCloseOperationResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceCloseOperationResult_Success_DEFAULT
@@ -14149,82 +15023,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceCloseOperationResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCloseOperationResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseOperationResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceCloseOperationResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCloseOperationResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("closeOperation_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCloseOperationResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "closeOperation_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCloseOperationResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceCloseOperationResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -14246,50 +15112,50 @@
 	return &TSIServiceGetTimeZoneArgs{}
 }
 
+
 func (p *TSIServiceGetTimeZoneArgs) GetSessionId() int64 {
 	return p.SessionId
 }
-func (p *TSIServiceGetTimeZoneArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceGetTimeZoneArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceGetTimeZoneArgs) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSIServiceGetTimeZoneArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -14297,34 +15163,26 @@
 	return nil
 }
 
-func (p *TSIServiceGetTimeZoneArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("getTimeZone_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceGetTimeZoneArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "getTimeZone_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceGetTimeZoneArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSIServiceGetTimeZoneArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
@@ -14346,7 +15204,6 @@
 }
 
 var TSIServiceGetTimeZoneResult_Success_DEFAULT *TSGetTimeZoneResp
-
 func (p *TSIServiceGetTimeZoneResult) GetSuccess() *TSGetTimeZoneResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceGetTimeZoneResult_Success_DEFAULT
@@ -14357,82 +15214,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceGetTimeZoneResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceGetTimeZoneResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceGetTimeZoneResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceGetTimeZoneResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSGetTimeZoneResp{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceGetTimeZoneResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("getTimeZone_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceGetTimeZoneResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "getTimeZone_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceGetTimeZoneResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceGetTimeZoneResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -14455,7 +15304,6 @@
 }
 
 var TSIServiceSetTimeZoneArgs_Req_DEFAULT *TSSetTimeZoneReq
-
 func (p *TSIServiceSetTimeZoneArgs) GetReq() *TSSetTimeZoneReq {
 	if !p.IsSetReq() {
 		return TSIServiceSetTimeZoneArgs_Req_DEFAULT
@@ -14466,81 +15314,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceSetTimeZoneArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceSetTimeZoneArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceSetTimeZoneArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceSetTimeZoneArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSSetTimeZoneReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceSetTimeZoneArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("setTimeZone_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceSetTimeZoneArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "setTimeZone_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceSetTimeZoneArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceSetTimeZoneArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -14562,7 +15402,6 @@
 }
 
 var TSIServiceSetTimeZoneResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceSetTimeZoneResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceSetTimeZoneResult_Success_DEFAULT
@@ -14573,82 +15412,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceSetTimeZoneResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceSetTimeZoneResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceSetTimeZoneResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceSetTimeZoneResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceSetTimeZoneResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("setTimeZone_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceSetTimeZoneResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "setTimeZone_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceSetTimeZoneResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceSetTimeZoneResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -14667,44 +15498,40 @@
 	return &TSIServiceGetPropertiesArgs{}
 }
 
-func (p *TSIServiceGetPropertiesArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceGetPropertiesArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
-		if err := iprot.Skip(fieldTypeId); err != nil {
+		if fieldTypeId == thrift.STOP { break; }
+		if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 			return err
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceGetPropertiesArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("getProperties_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceGetPropertiesArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "getProperties_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
@@ -14726,7 +15553,6 @@
 }
 
 var TSIServiceGetPropertiesResult_Success_DEFAULT *ServerProperties
-
 func (p *TSIServiceGetPropertiesResult) GetSuccess() *ServerProperties {
 	if !p.IsSetSuccess() {
 		return TSIServiceGetPropertiesResult_Success_DEFAULT
@@ -14737,82 +15563,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceGetPropertiesResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceGetPropertiesResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceGetPropertiesResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceGetPropertiesResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &ServerProperties{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceGetPropertiesResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("getProperties_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceGetPropertiesResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "getProperties_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceGetPropertiesResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceGetPropertiesResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -14828,7 +15646,7 @@
 //  - SessionId
 //  - StorageGroup
 type TSIServiceSetStorageGroupArgs struct {
-	SessionId    int64  `thrift:"sessionId,1" db:"sessionId" json:"sessionId"`
+	SessionId int64 `thrift:"sessionId,1" db:"sessionId" json:"sessionId"`
 	StorageGroup string `thrift:"storageGroup,2" db:"storageGroup" json:"storageGroup"`
 }
 
@@ -14836,6 +15654,7 @@
 	return &TSIServiceSetStorageGroupArgs{}
 }
 
+
 func (p *TSIServiceSetStorageGroupArgs) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -14843,57 +15662,56 @@
 func (p *TSIServiceSetStorageGroupArgs) GetStorageGroup() string {
 	return p.StorageGroup
 }
-func (p *TSIServiceSetStorageGroupArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceSetStorageGroupArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.STRING {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceSetStorageGroupArgs) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSIServiceSetStorageGroupArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -14901,8 +15719,8 @@
 	return nil
 }
 
-func (p *TSIServiceSetStorageGroupArgs) ReadField2(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadString(); err != nil {
+func (p *TSIServiceSetStorageGroupArgs)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadString(ctx); err != nil {
 		return thrift.PrependError("error reading field 2: ", err)
 	} else {
 		p.StorageGroup = v
@@ -14910,50 +15728,37 @@
 	return nil
 }
 
-func (p *TSIServiceSetStorageGroupArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("setStorageGroup_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceSetStorageGroupArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "setStorageGroup_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceSetStorageGroupArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSIServiceSetStorageGroupArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSIServiceSetStorageGroupArgs) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("storageGroup", thrift.STRING, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:storageGroup: ", p), err)
-	}
-	if err := oprot.WriteString(string(p.StorageGroup)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.storageGroup (2) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:storageGroup: ", p), err)
-	}
+func (p *TSIServiceSetStorageGroupArgs) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "storageGroup", thrift.STRING, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:storageGroup: ", p), err) }
+	if err := oprot.WriteString(ctx, string(p.StorageGroup)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.storageGroup (2) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:storageGroup: ", p), err) }
 	return err
 }
 
@@ -14975,7 +15780,6 @@
 }
 
 var TSIServiceSetStorageGroupResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceSetStorageGroupResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceSetStorageGroupResult_Success_DEFAULT
@@ -14986,82 +15790,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceSetStorageGroupResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceSetStorageGroupResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceSetStorageGroupResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceSetStorageGroupResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceSetStorageGroupResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("setStorageGroup_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceSetStorageGroupResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "setStorageGroup_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceSetStorageGroupResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceSetStorageGroupResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -15084,7 +15880,6 @@
 }
 
 var TSIServiceCreateTimeseriesArgs_Req_DEFAULT *TSCreateTimeseriesReq
-
 func (p *TSIServiceCreateTimeseriesArgs) GetReq() *TSCreateTimeseriesReq {
 	if !p.IsSetReq() {
 		return TSIServiceCreateTimeseriesArgs_Req_DEFAULT
@@ -15095,81 +15890,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceCreateTimeseriesArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCreateTimeseriesArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateTimeseriesArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceCreateTimeseriesArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSCreateTimeseriesReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateTimeseriesArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("createTimeseries_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCreateTimeseriesArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "createTimeseries_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCreateTimeseriesArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceCreateTimeseriesArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -15191,7 +15978,6 @@
 }
 
 var TSIServiceCreateTimeseriesResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceCreateTimeseriesResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceCreateTimeseriesResult_Success_DEFAULT
@@ -15202,82 +15988,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceCreateTimeseriesResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCreateTimeseriesResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateTimeseriesResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceCreateTimeseriesResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateTimeseriesResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("createTimeseries_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCreateTimeseriesResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "createTimeseries_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCreateTimeseriesResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceCreateTimeseriesResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -15300,7 +16078,6 @@
 }
 
 var TSIServiceCreateMultiTimeseriesArgs_Req_DEFAULT *TSCreateMultiTimeseriesReq
-
 func (p *TSIServiceCreateMultiTimeseriesArgs) GetReq() *TSCreateMultiTimeseriesReq {
 	if !p.IsSetReq() {
 		return TSIServiceCreateMultiTimeseriesArgs_Req_DEFAULT
@@ -15311,81 +16088,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCreateMultiTimeseriesArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceCreateMultiTimeseriesArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSCreateMultiTimeseriesReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("createMultiTimeseries_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCreateMultiTimeseriesArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "createMultiTimeseries_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceCreateMultiTimeseriesArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -15407,7 +16176,6 @@
 }
 
 var TSIServiceCreateMultiTimeseriesResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceCreateMultiTimeseriesResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceCreateMultiTimeseriesResult_Success_DEFAULT
@@ -15418,82 +16186,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceCreateMultiTimeseriesResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceCreateMultiTimeseriesResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("createMultiTimeseries_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceCreateMultiTimeseriesResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "createMultiTimeseries_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceCreateMultiTimeseriesResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceCreateMultiTimeseriesResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -15509,14 +16269,15 @@
 //  - SessionId
 //  - Path
 type TSIServiceDeleteTimeseriesArgs struct {
-	SessionId int64    `thrift:"sessionId,1" db:"sessionId" json:"sessionId"`
-	Path      []string `thrift:"path,2" db:"path" json:"path"`
+	SessionId int64 `thrift:"sessionId,1" db:"sessionId" json:"sessionId"`
+	Path []string `thrift:"path,2" db:"path" json:"path"`
 }
 
 func NewTSIServiceDeleteTimeseriesArgs() *TSIServiceDeleteTimeseriesArgs {
 	return &TSIServiceDeleteTimeseriesArgs{}
 }
 
+
 func (p *TSIServiceDeleteTimeseriesArgs) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -15524,57 +16285,56 @@
 func (p *TSIServiceDeleteTimeseriesArgs) GetPath() []string {
 	return p.Path
 }
-func (p *TSIServiceDeleteTimeseriesArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceDeleteTimeseriesArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteTimeseriesArgs) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSIServiceDeleteTimeseriesArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -15582,80 +16342,67 @@
 	return nil
 }
 
-func (p *TSIServiceDeleteTimeseriesArgs) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSIServiceDeleteTimeseriesArgs)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.Path = tSlice
-	for i := 0; i < size; i++ {
-		var _elem138 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.Path =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem230 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem138 = v
+			_elem230 = v
 		}
-		p.Path = append(p.Path, _elem138)
+		p.Path = append(p.Path, _elem230)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteTimeseriesArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("deleteTimeseries_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceDeleteTimeseriesArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "deleteTimeseries_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceDeleteTimeseriesArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSIServiceDeleteTimeseriesArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSIServiceDeleteTimeseriesArgs) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("path", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:path: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.Path)); err != nil {
+func (p *TSIServiceDeleteTimeseriesArgs) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "path", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:path: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.Path)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.Path {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:path: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:path: ", p), err) }
 	return err
 }
 
@@ -15677,7 +16424,6 @@
 }
 
 var TSIServiceDeleteTimeseriesResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceDeleteTimeseriesResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceDeleteTimeseriesResult_Success_DEFAULT
@@ -15688,82 +16434,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceDeleteTimeseriesResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceDeleteTimeseriesResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteTimeseriesResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceDeleteTimeseriesResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteTimeseriesResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("deleteTimeseries_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceDeleteTimeseriesResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "deleteTimeseries_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceDeleteTimeseriesResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceDeleteTimeseriesResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -15779,7 +16517,7 @@
 //  - SessionId
 //  - StorageGroup
 type TSIServiceDeleteStorageGroupsArgs struct {
-	SessionId    int64    `thrift:"sessionId,1" db:"sessionId" json:"sessionId"`
+	SessionId int64 `thrift:"sessionId,1" db:"sessionId" json:"sessionId"`
 	StorageGroup []string `thrift:"storageGroup,2" db:"storageGroup" json:"storageGroup"`
 }
 
@@ -15787,6 +16525,7 @@
 	return &TSIServiceDeleteStorageGroupsArgs{}
 }
 
+
 func (p *TSIServiceDeleteStorageGroupsArgs) GetSessionId() int64 {
 	return p.SessionId
 }
@@ -15794,57 +16533,56 @@
 func (p *TSIServiceDeleteStorageGroupsArgs) GetStorageGroup() []string {
 	return p.StorageGroup
 }
-func (p *TSIServiceDeleteStorageGroupsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceDeleteStorageGroupsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		case 2:
 			if fieldTypeId == thrift.LIST {
-				if err := p.ReadField2(iprot); err != nil {
+				if err := p.ReadField2(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsArgs) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSIServiceDeleteStorageGroupsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -15852,80 +16590,67 @@
 	return nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsArgs) ReadField2(iprot thrift.TProtocol) error {
-	_, size, err := iprot.ReadListBegin()
+func (p *TSIServiceDeleteStorageGroupsArgs)  ReadField2(ctx context.Context, iprot thrift.TProtocol) error {
+	_, size, err := iprot.ReadListBegin(ctx)
 	if err != nil {
 		return thrift.PrependError("error reading list begin: ", err)
 	}
 	tSlice := make([]string, 0, size)
-	p.StorageGroup = tSlice
-	for i := 0; i < size; i++ {
-		var _elem139 string
-		if v, err := iprot.ReadString(); err != nil {
+	p.StorageGroup =  tSlice
+	for i := 0; i < size; i ++ {
+		var _elem231 string
+		if v, err := iprot.ReadString(ctx); err != nil {
 			return thrift.PrependError("error reading field 0: ", err)
 		} else {
-			_elem139 = v
+			_elem231 = v
 		}
-		p.StorageGroup = append(p.StorageGroup, _elem139)
+		p.StorageGroup = append(p.StorageGroup, _elem231)
 	}
-	if err := iprot.ReadListEnd(); err != nil {
+	if err := iprot.ReadListEnd(ctx); err != nil {
 		return thrift.PrependError("error reading list end: ", err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("deleteStorageGroups_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceDeleteStorageGroupsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "deleteStorageGroups_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
-		if err := p.writeField2(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
+		if err := p.writeField2(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSIServiceDeleteStorageGroupsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
-func (p *TSIServiceDeleteStorageGroupsArgs) writeField2(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("storageGroup", thrift.LIST, 2); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:storageGroup: ", p), err)
-	}
-	if err := oprot.WriteListBegin(thrift.STRING, len(p.StorageGroup)); err != nil {
+func (p *TSIServiceDeleteStorageGroupsArgs) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "storageGroup", thrift.LIST, 2); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:storageGroup: ", p), err) }
+	if err := oprot.WriteListBegin(ctx, thrift.STRING, len(p.StorageGroup)); err != nil {
 		return thrift.PrependError("error writing list begin: ", err)
 	}
 	for _, v := range p.StorageGroup {
-		if err := oprot.WriteString(string(v)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err)
-		}
+		if err := oprot.WriteString(ctx, string(v)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T. (0) field write error: ", p), err) }
 	}
-	if err := oprot.WriteListEnd(); err != nil {
+	if err := oprot.WriteListEnd(ctx); err != nil {
 		return thrift.PrependError("error writing list end: ", err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:storageGroup: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 2:storageGroup: ", p), err) }
 	return err
 }
 
@@ -15947,7 +16672,6 @@
 }
 
 var TSIServiceDeleteStorageGroupsResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceDeleteStorageGroupsResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceDeleteStorageGroupsResult_Success_DEFAULT
@@ -15958,82 +16682,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceDeleteStorageGroupsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceDeleteStorageGroupsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("deleteStorageGroups_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceDeleteStorageGroupsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "deleteStorageGroups_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceDeleteStorageGroupsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceDeleteStorageGroupsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -16056,7 +16772,6 @@
 }
 
 var TSIServiceInsertRecordArgs_Req_DEFAULT *TSInsertRecordReq
-
 func (p *TSIServiceInsertRecordArgs) GetReq() *TSInsertRecordReq {
 	if !p.IsSetReq() {
 		return TSIServiceInsertRecordArgs_Req_DEFAULT
@@ -16067,81 +16782,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceInsertRecordArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertRecordArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertRecordArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertRecordReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertRecord_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertRecordArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertRecord_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertRecordArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceInsertRecordArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -16163,7 +16870,6 @@
 }
 
 var TSIServiceInsertRecordResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceInsertRecordResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceInsertRecordResult_Success_DEFAULT
@@ -16174,82 +16880,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceInsertRecordResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertRecordResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertRecordResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertRecord_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertRecordResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertRecord_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertRecordResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceInsertRecordResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -16272,7 +16970,6 @@
 }
 
 var TSIServiceInsertStringRecordArgs_Req_DEFAULT *TSInsertStringRecordReq
-
 func (p *TSIServiceInsertStringRecordArgs) GetReq() *TSInsertStringRecordReq {
 	if !p.IsSetReq() {
 		return TSIServiceInsertStringRecordArgs_Req_DEFAULT
@@ -16283,81 +16980,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceInsertStringRecordArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertStringRecordArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertStringRecordArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertStringRecordReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertStringRecord_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertStringRecordArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertStringRecord_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceInsertStringRecordArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -16379,7 +17068,6 @@
 }
 
 var TSIServiceInsertStringRecordResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceInsertStringRecordResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceInsertStringRecordResult_Success_DEFAULT
@@ -16390,82 +17078,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceInsertStringRecordResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertStringRecordResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertStringRecordResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertStringRecord_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertStringRecordResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertStringRecord_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceInsertStringRecordResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -16488,7 +17168,6 @@
 }
 
 var TSIServiceInsertTabletArgs_Req_DEFAULT *TSInsertTabletReq
-
 func (p *TSIServiceInsertTabletArgs) GetReq() *TSInsertTabletReq {
 	if !p.IsSetReq() {
 		return TSIServiceInsertTabletArgs_Req_DEFAULT
@@ -16499,81 +17178,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceInsertTabletArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertTabletArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertTabletArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertTabletReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertTablet_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertTabletArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertTablet_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertTabletArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceInsertTabletArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -16595,7 +17266,6 @@
 }
 
 var TSIServiceInsertTabletResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceInsertTabletResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceInsertTabletResult_Success_DEFAULT
@@ -16606,82 +17276,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceInsertTabletResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertTabletResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertTabletResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertTablet_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertTabletResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertTablet_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertTabletResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceInsertTabletResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -16704,7 +17366,6 @@
 }
 
 var TSIServiceInsertTabletsArgs_Req_DEFAULT *TSInsertTabletsReq
-
 func (p *TSIServiceInsertTabletsArgs) GetReq() *TSInsertTabletsReq {
 	if !p.IsSetReq() {
 		return TSIServiceInsertTabletsArgs_Req_DEFAULT
@@ -16715,81 +17376,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceInsertTabletsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertTabletsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletsArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertTabletsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertTabletsReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertTablets_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertTabletsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertTablets_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertTabletsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceInsertTabletsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -16811,7 +17464,6 @@
 }
 
 var TSIServiceInsertTabletsResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceInsertTabletsResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceInsertTabletsResult_Success_DEFAULT
@@ -16822,82 +17474,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceInsertTabletsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertTabletsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertTabletsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertTabletsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertTablets_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertTabletsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertTablets_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertTabletsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceInsertTabletsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -16920,7 +17564,6 @@
 }
 
 var TSIServiceInsertRecordsArgs_Req_DEFAULT *TSInsertRecordsReq
-
 func (p *TSIServiceInsertRecordsArgs) GetReq() *TSInsertRecordsReq {
 	if !p.IsSetReq() {
 		return TSIServiceInsertRecordsArgs_Req_DEFAULT
@@ -16931,81 +17574,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceInsertRecordsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertRecordsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertRecordsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertRecordsReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertRecords_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertRecordsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertRecords_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceInsertRecordsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -17027,7 +17662,6 @@
 }
 
 var TSIServiceInsertRecordsResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceInsertRecordsResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceInsertRecordsResult_Success_DEFAULT
@@ -17038,82 +17672,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceInsertRecordsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertRecordsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertRecordsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertRecords_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertRecordsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertRecords_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceInsertRecordsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -17136,7 +17762,6 @@
 }
 
 var TSIServiceInsertRecordsOfOneDeviceArgs_Req_DEFAULT *TSInsertRecordsOfOneDeviceReq
-
 func (p *TSIServiceInsertRecordsOfOneDeviceArgs) GetReq() *TSInsertRecordsOfOneDeviceReq {
 	if !p.IsSetReq() {
 		return TSIServiceInsertRecordsOfOneDeviceArgs_Req_DEFAULT
@@ -17147,81 +17772,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertRecordsOfOneDeviceArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertRecordsOfOneDeviceArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertRecordsOfOneDeviceReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertRecordsOfOneDevice_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertRecordsOfOneDeviceArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertRecordsOfOneDevice_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceInsertRecordsOfOneDeviceArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -17243,7 +17860,6 @@
 }
 
 var TSIServiceInsertRecordsOfOneDeviceResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceInsertRecordsOfOneDeviceResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceInsertRecordsOfOneDeviceResult_Success_DEFAULT
@@ -17254,82 +17870,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertRecordsOfOneDeviceResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertRecordsOfOneDeviceResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertRecordsOfOneDevice_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertRecordsOfOneDeviceResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertRecordsOfOneDevice_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertRecordsOfOneDeviceResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceInsertRecordsOfOneDeviceResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -17352,7 +17960,6 @@
 }
 
 var TSIServiceInsertStringRecordsArgs_Req_DEFAULT *TSInsertStringRecordsReq
-
 func (p *TSIServiceInsertStringRecordsArgs) GetReq() *TSInsertStringRecordsReq {
 	if !p.IsSetReq() {
 		return TSIServiceInsertStringRecordsArgs_Req_DEFAULT
@@ -17363,81 +17970,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceInsertStringRecordsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertStringRecordsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordsArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertStringRecordsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertStringRecordsReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertStringRecords_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertStringRecordsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertStringRecords_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceInsertStringRecordsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -17459,7 +18058,6 @@
 }
 
 var TSIServiceInsertStringRecordsResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceInsertStringRecordsResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceInsertStringRecordsResult_Success_DEFAULT
@@ -17470,82 +18068,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceInsertStringRecordsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceInsertStringRecordsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceInsertStringRecordsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("insertStringRecords_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceInsertStringRecordsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "insertStringRecords_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceInsertStringRecordsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceInsertStringRecordsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -17568,7 +18158,6 @@
 }
 
 var TSIServiceTestInsertTabletArgs_Req_DEFAULT *TSInsertTabletReq
-
 func (p *TSIServiceTestInsertTabletArgs) GetReq() *TSInsertTabletReq {
 	if !p.IsSetReq() {
 		return TSIServiceTestInsertTabletArgs_Req_DEFAULT
@@ -17579,81 +18168,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceTestInsertTabletArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertTabletArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertTabletArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertTabletReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertTablet_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertTabletArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertTablet_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceTestInsertTabletArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -17675,7 +18256,6 @@
 }
 
 var TSIServiceTestInsertTabletResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceTestInsertTabletResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceTestInsertTabletResult_Success_DEFAULT
@@ -17686,82 +18266,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceTestInsertTabletResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertTabletResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertTabletResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertTablet_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertTabletResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertTablet_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceTestInsertTabletResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -17784,7 +18356,6 @@
 }
 
 var TSIServiceTestInsertTabletsArgs_Req_DEFAULT *TSInsertTabletsReq
-
 func (p *TSIServiceTestInsertTabletsArgs) GetReq() *TSInsertTabletsReq {
 	if !p.IsSetReq() {
 		return TSIServiceTestInsertTabletsArgs_Req_DEFAULT
@@ -17795,81 +18366,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceTestInsertTabletsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertTabletsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletsArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertTabletsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertTabletsReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertTablets_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertTabletsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertTablets_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceTestInsertTabletsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -17891,7 +18454,6 @@
 }
 
 var TSIServiceTestInsertTabletsResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceTestInsertTabletsResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceTestInsertTabletsResult_Success_DEFAULT
@@ -17902,82 +18464,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceTestInsertTabletsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertTabletsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertTabletsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertTablets_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertTabletsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertTablets_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertTabletsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceTestInsertTabletsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -18000,7 +18554,6 @@
 }
 
 var TSIServiceTestInsertRecordArgs_Req_DEFAULT *TSInsertRecordReq
-
 func (p *TSIServiceTestInsertRecordArgs) GetReq() *TSInsertRecordReq {
 	if !p.IsSetReq() {
 		return TSIServiceTestInsertRecordArgs_Req_DEFAULT
@@ -18011,81 +18564,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceTestInsertRecordArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertRecordArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertRecordArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertRecordReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertRecord_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertRecordArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertRecord_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceTestInsertRecordArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -18107,7 +18652,6 @@
 }
 
 var TSIServiceTestInsertRecordResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceTestInsertRecordResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceTestInsertRecordResult_Success_DEFAULT
@@ -18118,82 +18662,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceTestInsertRecordResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertRecordResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertRecordResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertRecord_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertRecordResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertRecord_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceTestInsertRecordResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -18216,7 +18752,6 @@
 }
 
 var TSIServiceTestInsertStringRecordArgs_Req_DEFAULT *TSInsertStringRecordReq
-
 func (p *TSIServiceTestInsertStringRecordArgs) GetReq() *TSInsertStringRecordReq {
 	if !p.IsSetReq() {
 		return TSIServiceTestInsertStringRecordArgs_Req_DEFAULT
@@ -18227,81 +18762,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceTestInsertStringRecordArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertStringRecordArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertStringRecordArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertStringRecordReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertStringRecord_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertStringRecordArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertStringRecord_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceTestInsertStringRecordArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -18323,7 +18850,6 @@
 }
 
 var TSIServiceTestInsertStringRecordResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceTestInsertStringRecordResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceTestInsertStringRecordResult_Success_DEFAULT
@@ -18334,82 +18860,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceTestInsertStringRecordResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertStringRecordResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertStringRecordResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertStringRecord_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertStringRecordResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertStringRecord_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceTestInsertStringRecordResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -18432,7 +18950,6 @@
 }
 
 var TSIServiceTestInsertRecordsArgs_Req_DEFAULT *TSInsertRecordsReq
-
 func (p *TSIServiceTestInsertRecordsArgs) GetReq() *TSInsertRecordsReq {
 	if !p.IsSetReq() {
 		return TSIServiceTestInsertRecordsArgs_Req_DEFAULT
@@ -18443,81 +18960,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceTestInsertRecordsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertRecordsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertRecordsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertRecordsReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertRecords_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertRecordsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertRecords_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceTestInsertRecordsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -18539,7 +19048,6 @@
 }
 
 var TSIServiceTestInsertRecordsResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceTestInsertRecordsResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceTestInsertRecordsResult_Success_DEFAULT
@@ -18550,82 +19058,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceTestInsertRecordsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertRecordsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertRecordsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertRecords_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertRecordsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertRecords_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceTestInsertRecordsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -18648,7 +19148,6 @@
 }
 
 var TSIServiceTestInsertRecordsOfOneDeviceArgs_Req_DEFAULT *TSInsertRecordsOfOneDeviceReq
-
 func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) GetReq() *TSInsertRecordsOfOneDeviceReq {
 	if !p.IsSetReq() {
 		return TSIServiceTestInsertRecordsOfOneDeviceArgs_Req_DEFAULT
@@ -18659,81 +19158,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertRecordsOfOneDeviceReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertRecordsOfOneDevice_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertRecordsOfOneDevice_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceTestInsertRecordsOfOneDeviceArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -18755,7 +19246,6 @@
 }
 
 var TSIServiceTestInsertRecordsOfOneDeviceResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceTestInsertRecordsOfOneDeviceResult_Success_DEFAULT
@@ -18766,82 +19256,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertRecordsOfOneDeviceResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertRecordsOfOneDevice_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertRecordsOfOneDevice_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceTestInsertRecordsOfOneDeviceResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -18864,7 +19346,6 @@
 }
 
 var TSIServiceTestInsertStringRecordsArgs_Req_DEFAULT *TSInsertStringRecordsReq
-
 func (p *TSIServiceTestInsertStringRecordsArgs) GetReq() *TSInsertStringRecordsReq {
 	if !p.IsSetReq() {
 		return TSIServiceTestInsertStringRecordsArgs_Req_DEFAULT
@@ -18875,81 +19356,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertStringRecordsArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertStringRecordsArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSInsertStringRecordsReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertStringRecords_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertStringRecordsArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertStringRecords_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceTestInsertStringRecordsArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -18971,7 +19444,6 @@
 }
 
 var TSIServiceTestInsertStringRecordsResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceTestInsertStringRecordsResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceTestInsertStringRecordsResult_Success_DEFAULT
@@ -18982,82 +19454,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceTestInsertStringRecordsResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceTestInsertStringRecordsResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("testInsertStringRecords_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceTestInsertStringRecordsResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "testInsertStringRecords_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceTestInsertStringRecordsResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceTestInsertStringRecordsResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -19080,7 +19544,6 @@
 }
 
 var TSIServiceDeleteDataArgs_Req_DEFAULT *TSDeleteDataReq
-
 func (p *TSIServiceDeleteDataArgs) GetReq() *TSDeleteDataReq {
 	if !p.IsSetReq() {
 		return TSIServiceDeleteDataArgs_Req_DEFAULT
@@ -19091,81 +19554,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceDeleteDataArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceDeleteDataArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteDataArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceDeleteDataArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSDeleteDataReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteDataArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("deleteData_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceDeleteDataArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "deleteData_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceDeleteDataArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceDeleteDataArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -19187,7 +19642,6 @@
 }
 
 var TSIServiceDeleteDataResult_Success_DEFAULT *TSStatus
-
 func (p *TSIServiceDeleteDataResult) GetSuccess() *TSStatus {
 	if !p.IsSetSuccess() {
 		return TSIServiceDeleteDataResult_Success_DEFAULT
@@ -19198,82 +19652,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceDeleteDataResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceDeleteDataResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteDataResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceDeleteDataResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSStatus{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceDeleteDataResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("deleteData_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceDeleteDataResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "deleteData_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceDeleteDataResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceDeleteDataResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -19296,7 +19742,6 @@
 }
 
 var TSIServiceExecuteRawDataQueryArgs_Req_DEFAULT *TSRawDataQueryReq
-
 func (p *TSIServiceExecuteRawDataQueryArgs) GetReq() *TSRawDataQueryReq {
 	if !p.IsSetReq() {
 		return TSIServiceExecuteRawDataQueryArgs_Req_DEFAULT
@@ -19307,81 +19752,73 @@
 	return p.Req != nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteRawDataQueryArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryArgs) ReadField1(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteRawDataQueryArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Req = &TSRawDataQueryReq{}
-	if err := p.Req.Read(iprot); err != nil {
+	if err := p.Req.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Req), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeRawDataQuery_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteRawDataQueryArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeRawDataQuery_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("req", thrift.STRUCT, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err)
-	}
-	if err := p.Req.Write(oprot); err != nil {
+func (p *TSIServiceExecuteRawDataQueryArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "req", thrift.STRUCT, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:req: ", p), err) }
+	if err := p.Req.Write(ctx, oprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Req), err)
 	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err)
-	}
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:req: ", p), err) }
 	return err
 }
 
@@ -19403,7 +19840,6 @@
 }
 
 var TSIServiceExecuteRawDataQueryResult_Success_DEFAULT *TSExecuteStatementResp
-
 func (p *TSIServiceExecuteRawDataQueryResult) GetSuccess() *TSExecuteStatementResp {
 	if !p.IsSetSuccess() {
 		return TSIServiceExecuteRawDataQueryResult_Success_DEFAULT
@@ -19414,82 +19850,74 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceExecuteRawDataQueryResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.STRUCT {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryResult) ReadField0(iprot thrift.TProtocol) error {
+func (p *TSIServiceExecuteRawDataQueryResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
 	p.Success = &TSExecuteStatementResp{}
-	if err := p.Success.Read(iprot); err != nil {
+	if err := p.Success.Read(ctx, iprot); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("executeRawDataQuery_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceExecuteRawDataQueryResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "executeRawDataQuery_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceExecuteRawDataQueryResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceExecuteRawDataQueryResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := p.Success.Write(oprot); err != nil {
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.STRUCT, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := p.Success.Write(ctx, oprot); err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err)
 		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -19511,50 +19939,50 @@
 	return &TSIServiceRequestStatementIdArgs{}
 }
 
+
 func (p *TSIServiceRequestStatementIdArgs) GetSessionId() int64 {
 	return p.SessionId
 }
-func (p *TSIServiceRequestStatementIdArgs) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceRequestStatementIdArgs) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 1:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField1(iprot); err != nil {
+				if err := p.ReadField1(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceRequestStatementIdArgs) ReadField1(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSIServiceRequestStatementIdArgs)  ReadField1(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 1: ", err)
 	} else {
 		p.SessionId = v
@@ -19562,34 +19990,26 @@
 	return nil
 }
 
-func (p *TSIServiceRequestStatementIdArgs) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("requestStatementId_args"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceRequestStatementIdArgs) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "requestStatementId_args"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField1(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField1(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceRequestStatementIdArgs) writeField1(oprot thrift.TProtocol) (err error) {
-	if err := oprot.WriteFieldBegin("sessionId", thrift.I64, 1); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err)
-	}
-	if err := oprot.WriteI64(int64(p.SessionId)); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err)
-	}
-	if err := oprot.WriteFieldEnd(); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err)
-	}
+func (p *TSIServiceRequestStatementIdArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) {
+	if err := oprot.WriteFieldBegin(ctx, "sessionId", thrift.I64, 1); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:sessionId: ", p), err) }
+	if err := oprot.WriteI64(ctx, int64(p.SessionId)); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T.sessionId (1) field write error: ", p), err) }
+	if err := oprot.WriteFieldEnd(ctx); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write field end error 1:sessionId: ", p), err) }
 	return err
 }
 
@@ -19611,7 +20031,6 @@
 }
 
 var TSIServiceRequestStatementIdResult_Success_DEFAULT int64
-
 func (p *TSIServiceRequestStatementIdResult) GetSuccess() int64 {
 	if !p.IsSetSuccess() {
 		return TSIServiceRequestStatementIdResult_Success_DEFAULT
@@ -19622,47 +20041,46 @@
 	return p.Success != nil
 }
 
-func (p *TSIServiceRequestStatementIdResult) Read(iprot thrift.TProtocol) error {
-	if _, err := iprot.ReadStructBegin(); err != nil {
+func (p *TSIServiceRequestStatementIdResult) Read(ctx context.Context, iprot thrift.TProtocol) error {
+	if _, err := iprot.ReadStructBegin(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err)
 	}
 
+
 	for {
-		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()
+		_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)
 		if err != nil {
 			return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err)
 		}
-		if fieldTypeId == thrift.STOP {
-			break
-		}
+		if fieldTypeId == thrift.STOP { break; }
 		switch fieldId {
 		case 0:
 			if fieldTypeId == thrift.I64 {
-				if err := p.ReadField0(iprot); err != nil {
+				if err := p.ReadField0(ctx, iprot); err != nil {
 					return err
 				}
 			} else {
-				if err := iprot.Skip(fieldTypeId); err != nil {
+				if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 					return err
 				}
 			}
 		default:
-			if err := iprot.Skip(fieldTypeId); err != nil {
+			if err := iprot.Skip(ctx, fieldTypeId); err != nil {
 				return err
 			}
 		}
-		if err := iprot.ReadFieldEnd(); err != nil {
+		if err := iprot.ReadFieldEnd(ctx); err != nil {
 			return err
 		}
 	}
-	if err := iprot.ReadStructEnd(); err != nil {
+	if err := iprot.ReadStructEnd(ctx); err != nil {
 		return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err)
 	}
 	return nil
 }
 
-func (p *TSIServiceRequestStatementIdResult) ReadField0(iprot thrift.TProtocol) error {
-	if v, err := iprot.ReadI64(); err != nil {
+func (p *TSIServiceRequestStatementIdResult)  ReadField0(ctx context.Context, iprot thrift.TProtocol) error {
+	if v, err := iprot.ReadI64(ctx); err != nil {
 		return thrift.PrependError("error reading field 0: ", err)
 	} else {
 		p.Success = &v
@@ -19670,35 +20088,27 @@
 	return nil
 }
 
-func (p *TSIServiceRequestStatementIdResult) Write(oprot thrift.TProtocol) error {
-	if err := oprot.WriteStructBegin("requestStatementId_result"); err != nil {
-		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
-	}
+func (p *TSIServiceRequestStatementIdResult) Write(ctx context.Context, oprot thrift.TProtocol) error {
+	if err := oprot.WriteStructBegin(ctx, "requestStatementId_result"); err != nil {
+		return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) }
 	if p != nil {
-		if err := p.writeField0(oprot); err != nil {
-			return err
-		}
+		if err := p.writeField0(ctx, oprot); err != nil { return err }
 	}
-	if err := oprot.WriteFieldStop(); err != nil {
-		return thrift.PrependError("write field stop error: ", err)
-	}
-	if err := oprot.WriteStructEnd(); err != nil {
-		return thrift.PrependError("write struct stop error: ", err)
-	}
+	if err := oprot.WriteFieldStop(ctx); err != nil {
+		return thrift.PrependError("write field stop error: ", err) }
+	if err := oprot.WriteStructEnd(ctx); err != nil {
+		return thrift.PrependError("write struct stop error: ", err) }
 	return nil
 }
 
-func (p *TSIServiceRequestStatementIdResult) writeField0(oprot thrift.TProtocol) (err error) {
+func (p *TSIServiceRequestStatementIdResult) writeField0(ctx context.Context, oprot thrift.TProtocol) (err error) {
 	if p.IsSetSuccess() {
-		if err := oprot.WriteFieldBegin("success", thrift.I64, 0); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err)
-		}
-		if err := oprot.WriteI64(int64(*p.Success)); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T.success (0) field write error: ", p), err)
-		}
-		if err := oprot.WriteFieldEnd(); err != nil {
-			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err)
-		}
+		if err := oprot.WriteFieldBegin(ctx, "success", thrift.I64, 0); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) }
+		if err := oprot.WriteI64(ctx, int64(*p.Success)); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T.success (0) field write error: ", p), err) }
+		if err := oprot.WriteFieldEnd(ctx); err != nil {
+			return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) }
 	}
 	return err
 }
@@ -19709,3 +20119,5 @@
 	}
 	return fmt.Sprintf("TSIServiceRequestStatementIdResult(%+v)", *p)
 }
+
+
