""" Database setup for the SQL Query Environment. Creates an in-memory SQLite database with three tables: - departments: id, name, budget, location - employees: id, name, department_id, salary, hire_date, is_active - projects: id, name, department_id, lead_employee_id, budget, status, start_date All data is deterministic so grading is reproducible. """ import sqlite3 from typing import Optional SCHEMA_SQL = """ CREATE TABLE departments ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, budget REAL NOT NULL, location TEXT NOT NULL ); CREATE TABLE employees ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, department_id INTEGER NOT NULL, salary REAL NOT NULL, hire_date TEXT NOT NULL, is_active INTEGER NOT NULL DEFAULT 1, FOREIGN KEY (department_id) REFERENCES departments(id) ); CREATE TABLE projects ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, department_id INTEGER NOT NULL, lead_employee_id INTEGER NOT NULL, budget REAL NOT NULL, status TEXT NOT NULL CHECK(status IN ('active', 'completed', 'cancelled')), start_date TEXT NOT NULL, FOREIGN KEY (department_id) REFERENCES departments(id), FOREIGN KEY (lead_employee_id) REFERENCES employees(id) ); """ SEED_SQL = """ INSERT INTO departments VALUES (1, 'Engineering', 500000.00, 'Bangalore'); INSERT INTO departments VALUES (2, 'Marketing', 200000.00, 'Mumbai'); INSERT INTO departments VALUES (3, 'Sales', 300000.00, 'Delhi'); INSERT INTO departments VALUES (4, 'HR', 150000.00, 'Bangalore'); INSERT INTO departments VALUES (5, 'Finance', 250000.00, 'Mumbai'); INSERT INTO employees VALUES (1, 'Arjun Sharma', 1, 85000.00, '2020-03-15', 1); INSERT INTO employees VALUES (2, 'Priya Patel', 1, 92000.00, '2019-07-01', 1); INSERT INTO employees VALUES (3, 'Rahul Verma', 1, 78000.00, '2021-01-10', 1); INSERT INTO employees VALUES (4, 'Sneha Gupta', 2, 65000.00, '2020-06-20', 1); INSERT INTO employees VALUES (5, 'Vikram Singh', 2, 70000.00, '2018-11-05', 1); INSERT INTO employees VALUES (6, 'Anita Desai', 3, 72000.00, '2019-09-12', 1); INSERT INTO employees VALUES (7, 'Karan Mehta', 3, 68000.00, '2021-04-01', 1); INSERT INTO employees VALUES (8, 'Deepa Nair', 3, 75000.00, '2020-02-28', 0); INSERT INTO employees VALUES (9, 'Suresh Kumar', 4, 60000.00, '2022-01-15', 1); INSERT INTO employees VALUES (10, 'Meera Joshi', 4, 58000.00, '2021-08-20', 1); INSERT INTO employees VALUES (11, 'Amit Rao', 5, 88000.00, '2019-05-10', 1); INSERT INTO employees VALUES (12, 'Lakshmi Iyer', 5, 82000.00, '2020-10-01', 1); INSERT INTO employees VALUES (13, 'Ravi Krishnan', 1, 95000.00, '2018-03-20', 1); INSERT INTO employees VALUES (14, 'Pooja Reddy', 2, 62000.00, '2022-06-15', 1); INSERT INTO employees VALUES (15, 'Nikhil Agarwal', 3, 71000.00, '2020-12-01', 1); INSERT INTO projects VALUES (1, 'Cloud Migration', 1, 2, 120000.00, 'active', '2024-01-15'); INSERT INTO projects VALUES (2, 'Mobile App v2', 1, 1, 80000.00, 'active', '2024-03-01'); INSERT INTO projects VALUES (3, 'Brand Refresh', 2, 5, 45000.00, 'completed', '2023-06-01'); INSERT INTO projects VALUES (4, 'Q4 Campaign', 2, 4, 60000.00, 'active', '2024-09-01'); INSERT INTO projects VALUES (5, 'CRM Integration', 3, 6, 90000.00, 'active', '2024-02-15'); INSERT INTO projects VALUES (6, 'Sales Dashboard', 3, 15, 35000.00, 'completed', '2023-11-01'); INSERT INTO projects VALUES (7, 'Payroll Automation', 4, 9, 50000.00, 'active', '2024-04-01'); INSERT INTO projects VALUES (8, 'Annual Audit Tool', 5, 11, 70000.00, 'cancelled', '2024-01-10'); INSERT INTO projects VALUES (9, 'Data Pipeline', 1, 13, 150000.00, 'active', '2024-06-01'); INSERT INTO projects VALUES (10, 'Employee Portal', 4, 10, 40000.00, 'completed', '2023-09-15'); """ SCHEMA_DESCRIPTION = """Tables in the database: CREATE TABLE departments ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, budget REAL NOT NULL, location TEXT NOT NULL ); CREATE TABLE employees ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, department_id INTEGER NOT NULL, salary REAL NOT NULL, hire_date TEXT NOT NULL, -- format: YYYY-MM-DD is_active INTEGER NOT NULL, -- 1 = active, 0 = inactive FOREIGN KEY (department_id) REFERENCES departments(id) ); CREATE TABLE projects ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, department_id INTEGER NOT NULL, lead_employee_id INTEGER NOT NULL, budget REAL NOT NULL, status TEXT NOT NULL, -- 'active', 'completed', or 'cancelled' start_date TEXT NOT NULL, -- format: YYYY-MM-DD FOREIGN KEY (department_id) REFERENCES departments(id), FOREIGN KEY (lead_employee_id) REFERENCES employees(id) );""".strip() def create_database() -> sqlite3.Connection: """Create a fresh in-memory SQLite database with schema and seed data.""" conn = sqlite3.connect(":memory:") conn.execute("PRAGMA foreign_keys = ON;") conn.executescript(SCHEMA_SQL) conn.executescript(SEED_SQL) conn.commit() return conn def execute_query( conn: sqlite3.Connection, sql: str ) -> tuple[list[tuple] | None, list[str] | None, str | None]: """ Execute a SQL query safely. Returns: (rows, column_names, error_message) - On success: (rows_list, columns_list, None) - On error: (None, None, error_string) """ try: cursor = conn.execute(sql) if cursor.description is not None: columns = [desc[0] for desc in cursor.description] rows = cursor.fetchall() return rows, columns, None else: conn.commit() return None, None, None except Exception as e: return None, None, str(e)