// Copyright 2023 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace DB { namespace ErrorCodes { extern const int READONLY; extern const int UNKNOWN_TYPE_OF_QUERY; } // namespace ErrorCodes static void throwIfReadOnly(Context & context) { if (context.getSettingsRef().readonly) { throw Exception("Cannot execute query in readonly mode", ErrorCodes::READONLY); } } std::unique_ptr InterpreterFactory::get( ASTPtr & query, Context & context, QueryProcessingStage::Enum stage) { if (typeid_cast(query.get())) { return std::make_unique(query, context, Names{}, stage); } else if (typeid_cast(query.get())) { return std::make_unique(query, context, Names{}, stage); } else if (typeid_cast(query.get())) { /// readonly is checked inside InterpreterInsertQuery return std::make_unique(query, context, false); } else if (typeid_cast(query.get())) { /// readonly is checked inside InterpreterCreateQuery return std::make_unique(query, context); } else if (typeid_cast(query.get())) { /// readonly is checked inside InterpreterDropQuery return std::make_unique(query, context); } else if (typeid_cast(query.get())) { throwIfReadOnly(context); return std::make_unique(query, context, context.getCurrentQueryId()); } else if (typeid_cast(query.get())) { return std::make_unique(query, context); } else if (typeid_cast(query.get())) { return std::make_unique(query, context); } else if (typeid_cast(query.get())) { /// readonly is checked inside InterpreterSetQuery return std::make_unique(query, context); } else if (typeid_cast(query.get())) { return std::make_unique(query, context); } else if (typeid_cast(query.get())) { return std::make_unique(query, context); } else if (typeid_cast(query.get())) { return std::make_unique(query, context); } else if (typeid_cast(query.get())) { throwIfReadOnly(context); return std::make_unique(query, context); } else if (typeid_cast(query.get())) { return std::make_unique(query, context); } else if (typeid_cast(query.get())) { throwIfReadOnly(context); return std::make_unique(query, context); } else throw Exception("Unknown type of query: " + query->getID(), ErrorCodes::UNKNOWN_TYPE_OF_QUERY); } } // namespace DB