This is an automated email from the ASF dual-hosted git repository.
francischuang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite-avatica-go.git
The following commit(s) were added to refs/heads/master by this push:
new 7a35be7 [CALCITE-3275] add nil checks to error parsing (Tino Rusch).
7a35be7 is described below
commit 7a35be7713b740eb9bd8e18d2996ca2c279c27f3
Author: Tino Rusch <[email protected]>
AuthorDate: Tue Aug 20 13:33:46 2019 +0200
[CALCITE-3275] add nil checks to error parsing (Tino Rusch).
This commit introduces a small helper method to get the server address from
the
message metadata. Before using this helper the driver would crash the whole
application if the server sends an error message without setting up the
metadata
object.
---
connection.go | 7 +------
generic/generic.go | 15 +++++++--------
hsqldb/hsqldb.go | 15 +++++++--------
message/helper.go | 14 ++++++++++++++
phoenix/phoenix.go | 15 +++++++--------
5 files changed, 36 insertions(+), 30 deletions(-)
diff --git a/connection.go b/connection.go
index ce5d1c1..222cc9d 100644
--- a/connection.go
+++ b/connection.go
@@ -216,11 +216,6 @@ func (c *conn) avaticaErrorToResponseErrorOrError(err
error) error {
return
c.adapter.ErrorResponseToResponseError(avaticaErr.message)
}
- serverAddress := "unknown"
- md := avaticaErr.message.GetMetadata()
- if md != nil {
- serverAddress = md.ServerAddress
- }
return errors.ResponseError{
Exceptions: avaticaErr.message.Exceptions,
ErrorMessage: avaticaErr.message.ErrorMessage,
@@ -228,7 +223,7 @@ func (c *conn) avaticaErrorToResponseErrorOrError(err
error) error {
ErrorCode: errors.ErrorCode(avaticaErr.message.ErrorCode),
SqlState: errors.SQLState(avaticaErr.message.SqlState),
Metadata: &errors.RPCMetadata{
- ServerAddress: serverAddress,
+ ServerAddress:
message.ServerAddressFromMetadata(avaticaErr.message),
},
}
}
diff --git a/generic/generic.go b/generic/generic.go
index 3ca0bd9..a1ed68d 100644
--- a/generic/generic.go
+++ b/generic/generic.go
@@ -109,16 +109,15 @@ func (a Adapter) GetColumnTypeDefinition(col
*message.ColumnMetaData) *internal.
return column
}
-func (a Adapter) ErrorResponseToResponseError(message *message.ErrorResponse)
errors.ResponseError {
-
+func (a Adapter) ErrorResponseToResponseError(err *message.ErrorResponse)
errors.ResponseError {
return errors.ResponseError{
- Exceptions: message.Exceptions,
- ErrorMessage: message.ErrorMessage,
- Severity: int8(message.Severity),
- ErrorCode: errors.ErrorCode(message.ErrorCode),
- SqlState: errors.SQLState(message.SqlState),
+ Exceptions: err.Exceptions,
+ ErrorMessage: err.ErrorMessage,
+ Severity: int8(err.Severity),
+ ErrorCode: errors.ErrorCode(err.ErrorCode),
+ SqlState: errors.SQLState(err.SqlState),
Metadata: &errors.RPCMetadata{
- ServerAddress: message.GetMetadata().ServerAddress,
+ ServerAddress: message.ServerAddressFromMetadata(err),
},
}
}
diff --git a/hsqldb/hsqldb.go b/hsqldb/hsqldb.go
index 2cb14cd..2ac6f3b 100644
--- a/hsqldb/hsqldb.go
+++ b/hsqldb/hsqldb.go
@@ -109,16 +109,15 @@ func (a Adapter) GetColumnTypeDefinition(col
*message.ColumnMetaData) *internal.
return column
}
-func (a Adapter) ErrorResponseToResponseError(message *message.ErrorResponse)
errors.ResponseError {
-
+func (a Adapter) ErrorResponseToResponseError(err *message.ErrorResponse)
errors.ResponseError {
return errors.ResponseError{
- Exceptions: message.Exceptions,
- ErrorMessage: message.ErrorMessage,
- Severity: int8(message.Severity),
- ErrorCode: errors.ErrorCode(message.ErrorCode),
- SqlState: errors.SQLState(message.SqlState),
+ Exceptions: err.Exceptions,
+ ErrorMessage: err.ErrorMessage,
+ Severity: int8(err.Severity),
+ ErrorCode: errors.ErrorCode(err.ErrorCode),
+ SqlState: errors.SQLState(err.SqlState),
Metadata: &errors.RPCMetadata{
- ServerAddress: message.GetMetadata().ServerAddress,
+ ServerAddress: message.ServerAddressFromMetadata(err),
},
}
}
diff --git a/message/helper.go b/message/helper.go
new file mode 100644
index 0000000..a17ab53
--- /dev/null
+++ b/message/helper.go
@@ -0,0 +1,14 @@
+package message
+
+type MetadataProvider interface {
+ GetMetadata() *RpcMetadata
+}
+
+func ServerAddressFromMetadata(message MetadataProvider) string {
+ serverAddress := "unknown"
+ md := message.GetMetadata()
+ if md != nil {
+ serverAddress = md.ServerAddress
+ }
+ return serverAddress
+}
diff --git a/phoenix/phoenix.go b/phoenix/phoenix.go
index 77ee648..6ed4448 100644
--- a/phoenix/phoenix.go
+++ b/phoenix/phoenix.go
@@ -115,14 +115,14 @@ func (a Adapter) GetColumnTypeDefinition(col
*message.ColumnMetaData) *internal.
return column
}
-func (a Adapter) ErrorResponseToResponseError(message *message.ErrorResponse)
errors.ResponseError {
+func (a Adapter) ErrorResponseToResponseError(err *message.ErrorResponse)
errors.ResponseError {
var (
errorCode int
sqlState string
)
re := regexp.MustCompile(`ERROR (\d+) \(([0-9a-zA-Z]+)\)`)
- codes := re.FindStringSubmatch(message.ErrorMessage)
+ codes := re.FindStringSubmatch(err.ErrorMessage)
if len(codes) > 1 {
errorCode, _ = strconv.Atoi(codes[1])
@@ -132,19 +132,18 @@ func (a Adapter) ErrorResponseToResponseError(message
*message.ErrorResponse) er
sqlState = codes[2]
}
- err := errors.ResponseError{
- Exceptions: message.Exceptions,
- ErrorMessage: message.ErrorMessage,
- Severity: int8(message.Severity),
+ return errors.ResponseError{
+ Exceptions: err.Exceptions,
+ ErrorMessage: err.ErrorMessage,
+ Severity: int8(err.Severity),
ErrorCode: errors.ErrorCode(errorCode),
SqlState: errors.SQLState(sqlState),
Metadata: &errors.RPCMetadata{
- ServerAddress: message.GetMetadata().ServerAddress,
+ ServerAddress: message.ServerAddressFromMetadata(err),
},
Name: errorCodeNames[uint32(errorCode)],
}
- return err
}
var errorCodeNames = map[uint32]string{