summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.zig')
-rwxr-xr-xsrc/main.zig35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/main.zig b/src/main.zig
index 780c70c..c06bd66 100755
--- a/src/main.zig
+++ b/src/main.zig
@@ -37,6 +37,41 @@ pub fn main() !void {
try stdout.print("number of tables: {}\n", .{num_tables});
} else if (std.mem.eql(u8, args[2], ".tables")) {
try tables.showTables(allocator, &file, page_size, stdout);
+ } else if (std.mem.startsWith(u8, args[2], "SELECT") or std.mem.startsWith(u8, args[2], "select")) {
+ // Parse SELECT query: "SELECT column FROM table"
+ var tokens = std.mem.tokenizeScalar(u8, args[2], ' ');
+
+ // Skip "SELECT"
+ _ = tokens.next();
+
+ // Get column name or aggregate function
+ const column_name = tokens.next() orelse return error.InvalidQuery;
+
+ // Skip "FROM" or "from"
+ _ = tokens.next();
+
+ // Get table name
+ const table_name = tokens.next() orelse return error.InvalidQuery;
+
+ // Check if this is COUNT(*)
+ if (std.mem.indexOf(u8, column_name, "count(") != null or std.mem.indexOf(u8, column_name, "COUNT(") != null) {
+ const rootpage = try schema.getRootpage(allocator, &file, page_size, table_name);
+ const row_count = try schema.countRows(allocator, &file, page_size, rootpage);
+ try stdout.print("{}\n", .{row_count});
+ } else {
+ // Get the CREATE TABLE statement to find column order
+ const create_sql = try schema.getCreateTableSQL(allocator, &file, page_size, table_name);
+ defer allocator.free(create_sql);
+
+ // Find the column index
+ const column_idx = try schema.parseColumnIndex(create_sql, column_name);
+
+ // Get the table's root page
+ const rootpage = try schema.getRootpage(allocator, &file, page_size, table_name);
+
+ // Read and print all rows
+ try schema.readTableRows(allocator, &file, page_size, rootpage, column_idx, stdout);
+ }
} else {
var tokens = std.mem.tokenizeScalar(u8, args[2], ' ');
var last_token: []const u8 = "";