common_grpc_expr/
error.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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}