From f1f0770d686a9fecfa51be3699469c287e1fd9c2 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 9 Feb 2022 17:10:08 -0500 Subject: [PATCH] LibSQL: Do not crash when SELECTing from an empty table The crash was caused by getting the first element of an empty vector. --- Tests/LibSQL/TestSqlStatementExecution.cpp | 11 +++++++++++ Userland/Libraries/LibSQL/AST/Select.cpp | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Tests/LibSQL/TestSqlStatementExecution.cpp b/Tests/LibSQL/TestSqlStatementExecution.cpp index 91f0ad728d..024fcb703c 100644 --- a/Tests/LibSQL/TestSqlStatementExecution.cpp +++ b/Tests/LibSQL/TestSqlStatementExecution.cpp @@ -177,6 +177,17 @@ TEST_CASE(insert_without_column_names) EXPECT_EQ(rows_or_error.value().size(), 2u); } +TEST_CASE(select_from_empty_table) +{ + ScopeGuard guard([]() { unlink(db_name); }); + auto database = SQL::Database::construct(db_name); + EXPECT(!database->open().is_error()); + create_table(database); + auto result = execute(database, "SELECT * FROM TestSchema.TestTable;"); + EXPECT(!result.is_error()); + EXPECT(!result.has_results()); +} + TEST_CASE(select_from_table) { ScopeGuard guard([]() { unlink(db_name); }); diff --git a/Userland/Libraries/LibSQL/AST/Select.cpp b/Userland/Libraries/LibSQL/AST/Select.cpp index 55253c8b08..863f90cc50 100644 --- a/Userland/Libraries/LibSQL/AST/Select.cpp +++ b/Userland/Libraries/LibSQL/AST/Select.cpp @@ -69,8 +69,8 @@ Result Select::execute(ExecutionContext& context) const auto old_descriptor_size = descriptor->size(); descriptor->extend(table_def->to_tuple_descriptor()); - for (auto cartesian_row = rows.first(); cartesian_row.size() == old_descriptor_size; cartesian_row = rows.first()) { - rows.remove(0); + while (!rows.is_empty() && (rows.first().size() == old_descriptor_size)) { + auto cartesian_row = rows.take_first(); auto table_rows = TRY(context.database->select_all(*table_def)); for (auto& table_row : table_rows) {