CreateTable.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibSQL/AST/AST.h>
  7. #include <LibSQL/Database.h>
  8. namespace SQL::AST {
  9. ResultOr<ResultSet> CreateTable::execute(ExecutionContext& context) const
  10. {
  11. auto schema_def = TRY(context.database->get_schema(m_schema_name));
  12. auto table_def = TRY(context.database->get_table(m_schema_name, m_table_name));
  13. if (table_def) {
  14. if (m_is_error_if_table_exists)
  15. return Result { SQLCommand::Create, SQLErrorCode::TableExists, m_table_name };
  16. return ResultSet { SQLCommand::Create };
  17. }
  18. table_def = TableDef::construct(schema_def, m_table_name);
  19. for (auto& column : m_columns) {
  20. SQLType type;
  21. if (column.type_name()->name().is_one_of("VARCHAR"sv, "TEXT"sv))
  22. type = SQLType::Text;
  23. else if (column.type_name()->name().is_one_of("INT"sv, "INTEGER"sv))
  24. type = SQLType::Integer;
  25. else if (column.type_name()->name().is_one_of("FLOAT"sv, "NUMBER"sv))
  26. type = SQLType::Float;
  27. else if (column.type_name()->name().is_one_of("BOOL"sv, "BOOLEAN"sv))
  28. type = SQLType::Boolean;
  29. else
  30. return Result { SQLCommand::Create, SQLErrorCode::InvalidType, column.type_name()->name() };
  31. table_def->append_column(column.name(), type);
  32. }
  33. TRY(context.database->add_table(*table_def));
  34. return ResultSet { SQLCommand::Create };
  35. }
  36. }