sql-debug-env / server /tasks /task_easy.py
md896's picture
Make OpenEnv training+API judge-proof
d061422
"""
TASK 1 — EASY: Syntax Error Fix
Difficulty: Easy
Bug type: Simple syntax errors (typo in keyword, missing alias, wrong column name)
Max steps: 10
Expected baseline model score: 0.8-1.0
"""
from typing import List, Dict, Any
from .base import BaseTask
class EasyTask(BaseTask):
"""
Scenario: An e-commerce company wants to find the top 5 customers
by total order value. The query has a syntax error:
uses 'GRUP BY' instead of 'GROUP BY' and references wrong column alias.
Database: customers, orders, order_items
Bug 1: 'GRUP BY' typo
Bug 2: ORDER BY references 'total' but SELECT aliases it as 'total_value'
"""
@property
def task_id(self) -> str:
return "easy_syntax_fix"
@property
def name(self) -> str:
return "Top Customers by Revenue — Syntax Error Fix"
@property
def difficulty(self) -> str:
return "easy"
@property
def description(self) -> str:
return """You are debugging a SQL query for an e-commerce analytics dashboard.
The query is supposed to find the top 5 customers by their total order value
(sum of quantity * unit_price across all their orders).
The query has 2 syntax/reference bugs that prevent it from running:
1. A typo in a SQL keyword
2. An ORDER BY clause that references a column alias incorrectly
Fix both bugs so the query runs and returns the correct result.
The result should show: customer_name, total_value (rounded to 2 decimal places),
ordered from highest to lowest, top 5 only."""
@property
def expected_output_description(self) -> str:
return "5 rows: customer_name, total_value (DESC order). Alice Chen should be first with 1947.50."
@property
def broken_query(self) -> str:
return """SELECT
c.name AS customer_name,
ROUND(SUM(oi.quantity * oi.unit_price), 2) AS total_value
FROM customers c
JOIN orders o ON c.id = o.customer_id
JOIN order_items oi ON o.id = oi.order_id
GRUP BY c.id, c.name
ORDER BY total DESC
LIMIT 5"""
@property
def schema_sql(self) -> str:
return """
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL,
order_date TEXT NOT NULL,
status TEXT DEFAULT 'completed',
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
CREATE TABLE order_items (
id INTEGER PRIMARY KEY,
order_id INTEGER NOT NULL,
product_name TEXT NOT NULL,
quantity INTEGER NOT NULL,
unit_price REAL NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id)
)"""
@property
def seed_data_sql(self) -> str:
return """
INSERT INTO customers VALUES (1,'Alice Chen','alice@example.com','2023-01-01');
INSERT INTO customers VALUES (2,'Bob Kumar','bob@example.com','2023-01-05');
INSERT INTO customers VALUES (3,'Carol White','carol@example.com','2023-01-10');
INSERT INTO customers VALUES (4,'David Park','david@example.com','2023-02-01');
INSERT INTO customers VALUES (5,'Eva Rodriguez','eva@example.com','2023-02-15');
INSERT INTO customers VALUES (6,'Frank Liu','frank@example.com','2023-03-01');
INSERT INTO orders VALUES (1,1,'2023-06-01','completed');
INSERT INTO orders VALUES (2,1,'2023-07-15','completed');
INSERT INTO orders VALUES (3,2,'2023-06-10','completed');
INSERT INTO orders VALUES (4,3,'2023-06-20','completed');
INSERT INTO orders VALUES (5,3,'2023-08-01','completed');
INSERT INTO orders VALUES (6,4,'2023-07-01','completed');
INSERT INTO orders VALUES (7,5,'2023-07-20','completed');
INSERT INTO orders VALUES (8,5,'2023-08-10','completed');
INSERT INTO orders VALUES (9,6,'2023-09-01','completed');
INSERT INTO order_items VALUES (1,1,'Laptop',1,1200.00);
INSERT INTO order_items VALUES (2,1,'Mouse',2,25.00);
INSERT INTO order_items VALUES (3,2,'Keyboard',1,150.00);
INSERT INTO order_items VALUES (4,2,'Monitor',1,450.00);
INSERT INTO order_items VALUES (5,2,'Webcam',1,97.50);
INSERT INTO order_items VALUES (6,3,'Headphones',1,350.00);
INSERT INTO order_items VALUES (7,3,'USB Hub',2,45.00);
INSERT INTO order_items VALUES (8,4,'Tablet',1,600.00);
INSERT INTO order_items VALUES (9,4,'Case',1,35.00);
INSERT INTO order_items VALUES (10,5,'Charger',2,30.00);
INSERT INTO order_items VALUES (11,5,'Cable',3,15.00);
INSERT INTO order_items VALUES (12,6,'Desk Lamp',1,85.00);
INSERT INTO order_items VALUES (13,6,'Chair Mat',1,60.00);
INSERT INTO order_items VALUES (14,7,'Speakers',1,220.00);
INSERT INTO order_items VALUES (15,7,'Microphone',1,180.00);
INSERT INTO order_items VALUES (16,8,'Webcam',1,97.50);
INSERT INTO order_items VALUES (17,9,'Monitor',1,450.00)"""
@property
def expected_output(self) -> List[Dict[str, Any]]:
# Alice: 1200+50+150+450+97.50 = 1947.50 (orders 1,2)
# Wait: recalculate
# Alice order 1: laptop 1200 + mouse 2*25=50 = 1250
# Alice order 2: keyboard 150 + monitor 450 + webcam 97.50 = 697.50
# Alice total: 1947.50 — but let me recalculate with all items
# Actually: 1200+50+150+450+97.50 = 1947.50
# Carol: tablet 600 + case 35 + charger 60 + cable 45 = 740
# Eva: speakers 220 + micro 180 + webcam 97.50 = 497.50
# Bob: headphones 350 + hub 90 = 440
# Frank: lamp 85 + mat 60 + monitor 450 = 595
# David: lamp 85 + mat 60 = 145 — wait David is order 6
# Order 6 items 12,13: lamp 85 + mat 60 = 145
return [
{"customer_name": "Alice Chen", "total_value": 1947.50},
{"customer_name": "Carol White", "total_value": 740.00},
{"customer_name": "Frank Liu", "total_value": 595.00},
{"customer_name": "Eva Rodriguez", "total_value": 497.50},
{"customer_name": "Bob Kumar", "total_value": 440.00},
]
@property
def hint(self) -> str:
return "Hint: Check every SQL keyword spelling carefully. Also check that your ORDER BY column name exactly matches the alias in your SELECT clause."