1use 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 #[snafu(display("Invalid index option"))]
158 InvalidIndexOption {
159 #[snafu(implicit)]
160 location: Location,
161 #[snafu(source)]
162 error: datatypes::error::Error,
163 },
164
165 #[snafu(display("Sql common error"))]
166 SqlCommon {
167 source: common_sql::error::Error,
168 #[snafu(implicit)]
169 location: Location,
170 },
171
172 #[snafu(display("Missing required field in protobuf, column name: {}", column_name))]
173 ColumnNotFound {
174 column_name: String,
175 #[snafu(implicit)]
176 location: Location,
177 },
178
179 #[snafu(display("Need table metadata, but not found, table_id: {}", table_id))]
180 MissingTableMeta {
181 table_id: u32,
182 #[snafu(implicit)]
183 location: Location,
184 },
185}
186
187pub type Result<T> = std::result::Result<T, Error>;
188
189impl ErrorExt for Error {
190 fn status_code(&self) -> StatusCode {
191 match self {
192 Error::IllegalDeleteRequest { .. } => StatusCode::InvalidArguments,
193
194 Error::ColumnDataType { .. } => StatusCode::Internal,
195 Error::DuplicatedTimestampColumn { .. }
196 | Error::DuplicatedColumnName { .. }
197 | Error::MissingTimestampColumn { .. } => StatusCode::InvalidArguments,
198 Error::CreateVector { .. } => StatusCode::InvalidArguments,
199 Error::MissingField { .. } => StatusCode::InvalidArguments,
200 Error::InvalidColumnDef { source, .. } => source.status_code(),
201 Error::UnexpectedValuesLength { .. } | Error::UnknownLocationType { .. } => {
202 StatusCode::InvalidArguments
203 }
204
205 Error::UnknownColumnDataType { .. } | Error::InvalidStringIndexColumnType { .. } => {
206 StatusCode::InvalidArguments
207 }
208 Error::InvalidSetTableOptionRequest { .. }
209 | Error::InvalidUnsetTableOptionRequest { .. }
210 | Error::InvalidSetFulltextOptionRequest { .. }
211 | Error::InvalidSetSkippingIndexOptionRequest { .. }
212 | Error::MissingAlterIndexOption { .. }
213 | Error::InvalidIndexOption { .. } => StatusCode::InvalidArguments,
214 Error::ColumnNotFound { .. } => StatusCode::TableColumnNotFound,
215 Error::SqlCommon { source, .. } => source.status_code(),
216 Error::MissingTableMeta { .. } => StatusCode::Unexpected,
217 }
218 }
219
220 fn as_any(&self) -> &dyn Any {
221 self
222 }
223}