Serenity Operating System
1/*
2 * Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibSQL/AST/AST.h>
8#include <LibSQL/Database.h>
9#include <LibSQL/Meta.h>
10#include <LibSQL/Row.h>
11
12namespace SQL::AST {
13
14ResultOr<ResultSet> Delete::execute(ExecutionContext& context) const
15{
16 auto const& schema_name = m_qualified_table_name->schema_name();
17 auto const& table_name = m_qualified_table_name->table_name();
18 auto table_def = TRY(context.database->get_table(schema_name, table_name));
19
20 ResultSet result { SQLCommand::Delete };
21
22 for (auto& table_row : TRY(context.database->select_all(*table_def))) {
23 context.current_row = &table_row;
24
25 if (auto const& where_clause = this->where_clause()) {
26 auto where_result = TRY(where_clause->evaluate(context)).to_bool();
27 if (!where_result.has_value() || !where_result.value())
28 continue;
29 }
30
31 TRY(context.database->remove(table_row));
32
33 // FIXME: Implement the RETURNING clause.
34 result.insert_row(table_row, {});
35 }
36
37 return result;
38}
39
40}