| 1 | #include "duckdb/parser/statement/pragma_statement.hpp" |
|---|---|
| 2 | #include "duckdb/parser/transformer.hpp" |
| 3 | #include "duckdb/parser/expression/constant_expression.hpp" |
| 4 | |
| 5 | using namespace duckdb; |
| 6 | using namespace std; |
| 7 | |
| 8 | unique_ptr<PragmaStatement> Transformer::TransformPragma(PGNode *node) { |
| 9 | auto stmt = reinterpret_cast<PGPragmaStmt *>(node); |
| 10 | |
| 11 | auto result = make_unique<PragmaStatement>(); |
| 12 | auto &info = *result->info; |
| 13 | |
| 14 | info.name = stmt->name; |
| 15 | // parse the arguments, if any |
| 16 | if (stmt->args) { |
| 17 | for (auto cell = stmt->args->head; cell != nullptr; cell = cell->next) { |
| 18 | auto node = reinterpret_cast<PGNode *>(cell->data.ptr_value); |
| 19 | if (node->type != T_PGAConst) { |
| 20 | throw ParserException("Unsupported PRAGMA parameter: can only accept constants!"); |
| 21 | } |
| 22 | auto constant = TransformConstant((PGAConst *)node); |
| 23 | info.parameters.push_back(((ConstantExpression &)*constant).value); |
| 24 | } |
| 25 | } |
| 26 | // now parse the pragma type |
| 27 | switch (stmt->kind) { |
| 28 | case PG_PRAGMA_TYPE_NOTHING: |
| 29 | if (info.parameters.size() > 0) { |
| 30 | throw ParserException("PRAGMA statement that is not a call or assignment cannot contain parameters"); |
| 31 | } |
| 32 | info.pragma_type = PragmaType::NOTHING; |
| 33 | break; |
| 34 | case PG_PRAGMA_TYPE_ASSIGNMENT: |
| 35 | if (info.parameters.size() != 1) { |
| 36 | throw ParserException("PRAGMA statement with assignment should contain exactly one parameter"); |
| 37 | } |
| 38 | info.pragma_type = PragmaType::ASSIGNMENT; |
| 39 | break; |
| 40 | case PG_PRAGMA_TYPE_CALL: |
| 41 | info.pragma_type = PragmaType::CALL; |
| 42 | break; |
| 43 | default: |
| 44 | throw ParserException("Unknown pragma type"); |
| 45 | } |
| 46 | |
| 47 | return result; |
| 48 | } |
| 49 |