1 | #include "duckdb/common/exception.hpp" |
2 | #include "duckdb/common/string_util.hpp" |
3 | |
4 | using namespace duckdb; |
5 | using namespace std; |
6 | |
7 | #define FORMAT_CONSTRUCTOR(msg) \ |
8 | va_list ap; \ |
9 | va_start(ap, msg); \ |
10 | Format(ap); \ |
11 | va_end(ap); |
12 | |
13 | Exception::Exception(string message) : std::exception(), type(ExceptionType::INVALID) { |
14 | exception_message_ = message; |
15 | } |
16 | |
17 | Exception::Exception(ExceptionType exception_type, string message) : std::exception(), type(exception_type) { |
18 | exception_message_ = ExceptionTypeToString(exception_type) + ": " + message; |
19 | } |
20 | |
21 | const char *Exception::what() const noexcept { |
22 | return exception_message_.c_str(); |
23 | } |
24 | |
25 | void Exception::Format(va_list ap) { |
26 | exception_message_ = StringUtil::VFormat(exception_message_, ap); |
27 | } |
28 | |
29 | string Exception::ExceptionTypeToString(ExceptionType type) { |
30 | switch (type) { |
31 | case ExceptionType::INVALID: |
32 | return "Invalid" ; |
33 | case ExceptionType::OUT_OF_RANGE: |
34 | return "Out of Range" ; |
35 | case ExceptionType::CONVERSION: |
36 | return "Conversion" ; |
37 | case ExceptionType::UNKNOWN_TYPE: |
38 | return "Unknown Type" ; |
39 | case ExceptionType::DECIMAL: |
40 | return "Decimal" ; |
41 | case ExceptionType::MISMATCH_TYPE: |
42 | return "Mismatch Type" ; |
43 | case ExceptionType::DIVIDE_BY_ZERO: |
44 | return "Divide by Zero" ; |
45 | case ExceptionType::OBJECT_SIZE: |
46 | return "Object Size" ; |
47 | case ExceptionType::INVALID_TYPE: |
48 | return "Invalid type" ; |
49 | case ExceptionType::SERIALIZATION: |
50 | return "Serialization" ; |
51 | case ExceptionType::TRANSACTION: |
52 | return "TransactionContext" ; |
53 | case ExceptionType::NOT_IMPLEMENTED: |
54 | return "Not implemented" ; |
55 | case ExceptionType::EXPRESSION: |
56 | return "Expression" ; |
57 | case ExceptionType::CATALOG: |
58 | return "Catalog" ; |
59 | case ExceptionType::PARSER: |
60 | return "Parser" ; |
61 | case ExceptionType::PLANNER: |
62 | return "Planner" ; |
63 | case ExceptionType::SCHEDULER: |
64 | return "Scheduler" ; |
65 | case ExceptionType::EXECUTOR: |
66 | return "Executor" ; |
67 | case ExceptionType::CONSTRAINT: |
68 | return "Constraint" ; |
69 | case ExceptionType::INDEX: |
70 | return "Index" ; |
71 | case ExceptionType::STAT: |
72 | return "Stat" ; |
73 | case ExceptionType::CONNECTION: |
74 | return "Connection" ; |
75 | case ExceptionType::SYNTAX: |
76 | return "Syntax" ; |
77 | case ExceptionType::SETTINGS: |
78 | return "Settings" ; |
79 | case ExceptionType::OPTIMIZER: |
80 | return "Optimizer" ; |
81 | case ExceptionType::NULL_POINTER: |
82 | return "NullPointer" ; |
83 | case ExceptionType::IO: |
84 | return "IO" ; |
85 | case ExceptionType::INTERRUPT: |
86 | return "INTERRUPT" ; |
87 | case ExceptionType::FATAL: |
88 | return "FATAL" ; |
89 | case ExceptionType::INTERNAL: |
90 | return "INTERNAL" ; |
91 | default: |
92 | return "Unknown" ; |
93 | } |
94 | } |
95 | |
96 | CastException::CastException(const TypeId origType, const TypeId newType) |
97 | : Exception(ExceptionType::CONVERSION, |
98 | "Type " + TypeIdToString(origType) + " can't be cast as " + TypeIdToString(newType)) { |
99 | } |
100 | |
101 | ValueOutOfRangeException::ValueOutOfRangeException(const int64_t value, const TypeId origType, const TypeId newType) |
102 | : Exception(ExceptionType::CONVERSION, "Type " + TypeIdToString(origType) + " with value " + |
103 | std::to_string((intmax_t)value) + |
104 | " can't be cast because the value is out of range " |
105 | "for the destination type " + |
106 | TypeIdToString(newType)) { |
107 | } |
108 | |
109 | ValueOutOfRangeException::ValueOutOfRangeException(const double value, const TypeId origType, const TypeId newType) |
110 | : Exception(ExceptionType::CONVERSION, "Type " + TypeIdToString(origType) + " with value " + std::to_string(value) + |
111 | " can't be cast because the value is out of range " |
112 | "for the destination type " + |
113 | TypeIdToString(newType)) { |
114 | } |
115 | |
116 | ValueOutOfRangeException::ValueOutOfRangeException(const TypeId varType, const idx_t length) |
117 | : Exception(ExceptionType::OUT_OF_RANGE, "The value is too long to fit into type " + TypeIdToString(varType) + "(" + |
118 | std::to_string(length) + ")" ){}; |
119 | |
120 | ConversionException::ConversionException(string msg, ...) : Exception(ExceptionType::CONVERSION, msg) { |
121 | FORMAT_CONSTRUCTOR(msg); |
122 | } |
123 | |
124 | InvalidTypeException::InvalidTypeException(TypeId type, string msg) |
125 | : Exception(ExceptionType::INVALID_TYPE, "Invalid Type [" + TypeIdToString(type) + "]: " + msg) { |
126 | } |
127 | |
128 | TypeMismatchException::TypeMismatchException(const TypeId type_1, const TypeId type_2, string msg) |
129 | : Exception(ExceptionType::MISMATCH_TYPE, |
130 | "Type " + TypeIdToString(type_1) + " does not match with " + TypeIdToString(type_2) + ". " + msg) { |
131 | } |
132 | |
133 | TransactionException::TransactionException(string msg, ...) : Exception(ExceptionType::TRANSACTION, msg) { |
134 | FORMAT_CONSTRUCTOR(msg); |
135 | } |
136 | |
137 | NotImplementedException::NotImplementedException(string msg, ...) : Exception(ExceptionType::NOT_IMPLEMENTED, msg) { |
138 | FORMAT_CONSTRUCTOR(msg); |
139 | } |
140 | |
141 | OutOfRangeException::OutOfRangeException(string msg, ...) : Exception(ExceptionType::OUT_OF_RANGE, msg) { |
142 | FORMAT_CONSTRUCTOR(msg); |
143 | } |
144 | |
145 | CatalogException::CatalogException(string msg, ...) : StandardException(ExceptionType::CATALOG, msg) { |
146 | FORMAT_CONSTRUCTOR(msg); |
147 | } |
148 | |
149 | ParserException::ParserException(string msg, ...) : StandardException(ExceptionType::PARSER, msg) { |
150 | FORMAT_CONSTRUCTOR(msg); |
151 | } |
152 | |
153 | SyntaxException::SyntaxException(string msg, ...) : Exception(ExceptionType::SYNTAX, msg) { |
154 | FORMAT_CONSTRUCTOR(msg); |
155 | } |
156 | |
157 | ConstraintException::ConstraintException(string msg, ...) : Exception(ExceptionType::CONSTRAINT, msg) { |
158 | FORMAT_CONSTRUCTOR(msg); |
159 | } |
160 | |
161 | BinderException::BinderException(string msg, ...) : StandardException(ExceptionType::BINDER, msg) { |
162 | FORMAT_CONSTRUCTOR(msg); |
163 | } |
164 | |
165 | IOException::IOException(string msg, ...) : Exception(ExceptionType::IO, msg) { |
166 | FORMAT_CONSTRUCTOR(msg); |
167 | } |
168 | |
169 | SerializationException::SerializationException(string msg, ...) : Exception(ExceptionType::SERIALIZATION, msg) { |
170 | FORMAT_CONSTRUCTOR(msg); |
171 | } |
172 | |
173 | SequenceException::SequenceException(string msg, ...) : Exception(ExceptionType::SERIALIZATION, msg) { |
174 | FORMAT_CONSTRUCTOR(msg); |
175 | } |
176 | |
177 | InterruptException::InterruptException() : Exception(ExceptionType::INTERRUPT, "Interrupted!" ) { |
178 | } |
179 | |
180 | FatalException::FatalException(string msg, ...) : Exception(ExceptionType::FATAL, msg) { |
181 | FORMAT_CONSTRUCTOR(msg); |
182 | } |
183 | |
184 | InternalException::InternalException(string msg, ...) : Exception(ExceptionType::INTERNAL, msg) { |
185 | FORMAT_CONSTRUCTOR(msg); |
186 | } |
187 | |