1#include "duckdb/parser/statement/create_statement.hpp"
2#include "duckdb/parser/transformer.hpp"
3#include "duckdb/parser/parsed_data/create_view_info.hpp"
4
5using namespace duckdb;
6using namespace std;
7
8unique_ptr<CreateStatement> Transformer::TransformCreateView(PGNode *node) {
9 assert(node);
10 assert(node->type == T_PGViewStmt);
11
12 auto stmt = reinterpret_cast<PGViewStmt *>(node);
13 assert(stmt);
14 assert(stmt->view);
15
16 auto result = make_unique<CreateStatement>();
17 auto info = make_unique<CreateViewInfo>();
18
19 if (stmt->view->schemaname) {
20 info->schema = stmt->view->schemaname;
21 }
22 info->view_name = stmt->view->relname;
23 info->temporary = !stmt->view->relpersistence;
24 if (info->temporary) {
25 info->schema = TEMP_SCHEMA;
26 }
27 info->on_conflict = stmt->replace ? OnCreateConflict::REPLACE : OnCreateConflict::ERROR;
28
29 info->query = TransformSelectNode((PGSelectStmt *)stmt->query);
30
31 if (stmt->aliases && stmt->aliases->length > 0) {
32 for (auto c = stmt->aliases->head; c != NULL; c = lnext(c)) {
33 auto node = reinterpret_cast<PGNode *>(c->data.ptr_value);
34 switch (node->type) {
35 case T_PGString: {
36 auto val = (PGValue *)node;
37 info->aliases.push_back(string(val->val.str));
38 break;
39 }
40 default:
41 throw NotImplementedException("View projection type");
42 }
43 }
44 if (info->aliases.size() < 1) {
45 throw ParserException("Need at least one column name in CREATE VIEW projection list");
46 }
47 }
48
49 if (stmt->options && stmt->options->length > 0) {
50 throw NotImplementedException("VIEW options");
51 }
52
53 if (stmt->withCheckOption != PGViewCheckOption::PG_NO_CHECK_OPTION) {
54 throw NotImplementedException("VIEW CHECK options");
55 }
56 result->info = move(info);
57 return result;
58}
59