common_grpc_expr/
error.rs1use std::any::Any;
16
17use api::v1::ColumnDataType;
18use common_error::ext::ErrorExt;
19use common_error::status_code::StatusCode;
20use common_macro::stack_trace_debug;
21use snafu::{Location, Snafu};
22use store_api::metadata::MetadataError;
23
24#[derive(Snafu)]
25#[snafu(visibility(pub))]
26#[stack_trace_debug]
27pub enum Error {
28 #[snafu(display("Illegal delete request, reason: {reason}"))]
29 IllegalDeleteRequest {
30 reason: String,
31 #[snafu(implicit)]
32 location: Location,
33 },
34
35 #[snafu(display("Column datatype error"))]
36 ColumnDataType {
37 #[snafu(implicit)]
38 location: Location,
39 source: api::error::Error,
40 },
41
42 #[snafu(display(
43 "Duplicated timestamp column in gRPC requests, exists {}, duplicated: {}",
44 exists,
45 duplicated
46 ))]
47 DuplicatedTimestampColumn {
48 exists: String,
49 duplicated: String,
50 #[snafu(implicit)]
51 location: Location,
52 },
53
54 #[snafu(display("Duplicated column name in gRPC requests, name: {}", name,))]
55 DuplicatedColumnName {
56 name: String,
57 #[snafu(implicit)]
58 location: Location,
59 },
60
61 #[snafu(display("Missing timestamp column, msg: {}", msg))]
62 MissingTimestampColumn {
63 msg: String,
64 #[snafu(implicit)]
65 location: Location,
66 },
67
68 #[snafu(display("Failed to create vector"))]
69 CreateVector {
70 #[snafu(implicit)]
71 location: Location,
72 source: datatypes::error::Error,
73 },
74
75 #[snafu(display("Missing required field in protobuf, field: {}", field))]
76 MissingField {
77 field: String,
78 #[snafu(implicit)]
79 location: Location,
80 },
81
82 #[snafu(display("Invalid column proto definition, column: {}", column))]
83 InvalidColumnDef {
84 column: String,
85 #[snafu(implicit)]
86 location: Location,
87 source: api::error::Error,
88 },
89
90 #[snafu(display("Unexpected values length, reason: {}", reason))]
91 UnexpectedValuesLength {
92 reason: String,
93 #[snafu(implicit)]
94 location: Location,
95 },
96
97 #[snafu(display("Unknown location type: {}", location_type))]
98 UnknownLocationType {
99 location_type: i32,
100 #[snafu(implicit)]
101 location: Location,
102 },
103
104 #[snafu(display("Unknown proto column datatype: {}", datatype))]
105 UnknownColumnDataType {
106 datatype: i32,
107 #[snafu(implicit)]
108 location: Location,
109 #[snafu(source)]
110 error: prost::UnknownEnumValue,
111 },
112
113 #[snafu(display(
114 "Fulltext or Skipping index only supports string type, column: {column_name}, unexpected type: {column_type:?}"
115 ))]
116 InvalidStringIndexColumnType {
117 column_name: String,
118 column_type: ColumnDataType,
119 #[snafu(implicit)]
120 location: Location,
121 },
122
123 #[snafu(display("Invalid set table option request"))]
124 InvalidSetTableOptionRequest {
125 #[snafu(source)]
126 error: MetadataError,
127 },
128
129 #[snafu(display("Invalid unset table option request"))]
130 InvalidUnsetTableOptionRequest {
131 #[snafu(source)]
132 error: MetadataError,
133 },
134
135 #[snafu(display("Invalid set fulltext option request"))]
136 InvalidSetFulltextOptionRequest {
137 #[snafu(implicit)]
138 location: Location,
139 #[snafu(source)]
140 error: prost::UnknownEnumValue,
141 },
142
143 #[snafu(display("Invalid set skipping index option request"))]
144 InvalidSetSkippingIndexOptionRequest {
145 #[snafu(implicit)]
146 location: Location,
147 #[snafu(source)]
148 error: prost::UnknownEnumValue,
149 },
150
151 #[snafu(display("Missing alter index options"))]
152 MissingAlterIndexOption {
153 #[snafu(implicit)]
154 location: Location,
155 },
156}
157
158pub type Result<T> = std::result::Result<T, Error>;
159
160impl ErrorExt for Error {
161 fn status_code(&self) -> StatusCode {
162 match self {
163 Error::IllegalDeleteRequest { .. } => StatusCode::InvalidArguments,
164
165 Error::ColumnDataType { .. } => StatusCode::Internal,
166 Error::DuplicatedTimestampColumn { .. }
167 | Error::DuplicatedColumnName { .. }
168 | Error::MissingTimestampColumn { .. } => StatusCode::InvalidArguments,
169 Error::CreateVector { .. } => StatusCode::InvalidArguments,
170 Error::MissingField { .. } => StatusCode::InvalidArguments,
171 Error::InvalidColumnDef { source, .. } => source.status_code(),
172 Error::UnexpectedValuesLength { .. } | Error::UnknownLocationType { .. } => {
173 StatusCode::InvalidArguments
174 }
175
176 Error::UnknownColumnDataType { .. } | Error::InvalidStringIndexColumnType { .. } => {
177 StatusCode::InvalidArguments
178 }
179 Error::InvalidSetTableOptionRequest { .. }
180 | Error::InvalidUnsetTableOptionRequest { .. }
181 | Error::InvalidSetFulltextOptionRequest { .. }
182 | Error::InvalidSetSkippingIndexOptionRequest { .. }
183 | Error::MissingAlterIndexOption { .. } => StatusCode::InvalidArguments,
184 }
185 }
186
187 fn as_any(&self) -> &dyn Any {
188 self
189 }
190}