| 1 | #include "duckdb/parser/statement/drop_statement.hpp" |
|---|---|
| 2 | #include "duckdb/planner/binder.hpp" |
| 3 | #include "duckdb/planner/operator/logical_simple.hpp" |
| 4 | #include "duckdb/catalog/catalog.hpp" |
| 5 | #include "duckdb/catalog/standard_entry.hpp" |
| 6 | #include "duckdb/catalog/catalog_entry/schema_catalog_entry.hpp" |
| 7 | |
| 8 | using namespace duckdb; |
| 9 | using namespace std; |
| 10 | |
| 11 | BoundStatement Binder::Bind(DropStatement &stmt) { |
| 12 | BoundStatement result; |
| 13 | |
| 14 | switch (stmt.info->type) { |
| 15 | case CatalogType::PREPARED_STATEMENT: |
| 16 | // dropping prepared statements is always possible |
| 17 | // it also does not require a valid transaction |
| 18 | this->requires_valid_transaction = false; |
| 19 | break; |
| 20 | case CatalogType::SCHEMA: |
| 21 | // dropping a schema is never read-only because there are no temporary schemas |
| 22 | this->read_only = false; |
| 23 | break; |
| 24 | case CatalogType::VIEW: |
| 25 | case CatalogType::SEQUENCE: |
| 26 | case CatalogType::INDEX: |
| 27 | case CatalogType::TABLE: { |
| 28 | auto entry = (StandardEntry *)Catalog::GetCatalog(context).GetEntry(context, stmt.info->type, stmt.info->schema, |
| 29 | stmt.info->name, true); |
| 30 | if (!entry) { |
| 31 | break; |
| 32 | } |
| 33 | if (!entry->temporary) { |
| 34 | // we can only drop temporary tables in read-only mode |
| 35 | this->read_only = false; |
| 36 | } |
| 37 | stmt.info->schema = entry->schema->name; |
| 38 | break; |
| 39 | } |
| 40 | default: |
| 41 | throw BinderException("Unknown catalog type for drop statement!"); |
| 42 | } |
| 43 | result.plan = make_unique<LogicalSimple>(LogicalOperatorType::DROP, move(stmt.info)); |
| 44 | result.names = {"Success"}; |
| 45 | result.types = {SQLType::BOOLEAN}; |
| 46 | return result; |
| 47 | } |
| 48 |