What's new
SQL Arena update history. Newest releases on top.
- The Skill Map now covers every task category (added CTE, DDL, transactions, optimization) and is bigger and easier to read.
- The Skill Map "what to improve" hint now points at the topic with the most unsolved tasks instead of a random one.
- The yearly activity graph shows full month names again instead of clipping them to a single letter.
- Solutions returning a time interval (e.g. the difference of two times) no longer error on submit.
- Task #88: data fixed — Paris departures now have distinct durations instead of three identical rows.
- Undo (Ctrl+Z) in the editor now keeps separate history per query tab.
- Task #624: the prompt now states that the average price must be rounded to 2 decimal places.
- SQL editor suggestions no longer duplicate after navigating between tasks.
- Task #621: clubs with no members now appear in the result with zero revenue.
- Task #831 difficulty changed from EXPERT to MEDIUM.
SQL Arena is now multilingual: English, Spanish and Portuguese, each with its own page URLs and automatic region detection.
- Language switcher: Russian, English, Spanish (Spain and Latin America) and Portuguese.
- On a first visit the site opens in the language of your region, and your choice is remembered.
- Each language has its own page URLs (/en, /es, /es-419, /pt-br) that are safe to share.
- Premium checkout in your local currency: RUB, USD, EUR or BRL depending on the region.
- The English site is fully supported; Spanish and Portuguese translations are rolling out.
Table-creation tasks accept any valid form, error hints are now relevant, and one task with an ambiguous answer was fixed.
- The "most popular course pair" task: the sample data allowed several equally valid answers while the grader accepted only one. The task now has a single correct answer.
- CREATE TABLE tasks rejected a correct solution when the learner named a constraint (e.g.
CONSTRAINT ... PRIMARY KEY). Grading now compares the table structure — constraint names are ignored. - A failed table-creation task showed an irrelevant "add ORDER BY" hint. The hint is now on point — about columns, types, NOT NULL and keys.
Data-mutation tasks are solved exactly as the prompt says — no undocumented verifying SELECT.
- INSERT/UPDATE/DELETE and transaction tasks (including UPSERT, MERGE, SKIP LOCKED) no longer demanded an undocumented verifying SELECT. They are now graded by the resulting table state, and the task page shows a "no trailing SELECT needed" note.
- Top solutions: staff accounts no longer appear in the list — matching the public leaderboard.
Table- and index-creation tasks are now solved exactly as the prompt says — no undocumented SELECT; the live leaderboard refresh works again.
- DDL tasks (CREATE TABLE, ALTER, CREATE INDEX, foreign keys) no longer demanded an undocumented verifying SELECT. They are now graded by the resulting database schema, and the task page shows a "no trailing SELECT needed" note.
- Leaderboard page: live refresh restored — the leaderboard WebSocket connection no longer fails.
- Schema diagram: some tasks showed no links between tables — foreign-key arrows now appear on the diagram.
- The "Correct!" dialog no longer shows a rank drop as an upward promotion — the rank badge appears only on a genuine promotion.
CREATE / ALTER TABLE tasks and other multi-step solutions can be submitted again — the per-submission statement limit was too strict.
- The per-submission statement limit was raised from 3 to 20: DDL tasks (CREATE TABLE, ALTER, indexes, triggers) and multi-step DML are no longer rejected with a "too many statements" error.
The MySQL variant of catalog tasks is back in sync with PostgreSQL — some MySQL tasks were graded against stale data.
- The MySQL variant of hundreds of tasks ran on a stale dataset — seeds resynced, the MySQL answer matches PostgreSQL again.
- Six tasks that worked only in PostgreSQL now have a working MySQL variant.
- CREATE TABLE / CREATE INDEX / ALTER tasks are graded by the resulting table schema — a wrong structure is no longer accepted as correct.
- INSERT tasks using CURRENT_TIMESTAMP / NOW() no longer reject a correct answer over a run-time difference.
- Example outputs that accidentally revealed the exact answer are replaced with non-spoiler samples; row order is enforced where a task requires it.
- A catalog-wide audit realigned the prompt, the grading data and the reference solution across several dozen tasks where they had drifted apart.
Fixed grading of multi-statement solutions — a DELETE/UPDATE with a final SELECT is now graded correctly.
- Dates and times in query results now display cleanly as
2024-01-15 08:00:00instead of the technical ISO format.
- DML tasks (DELETE, UPDATE, INSERT) with a verifying SELECT no longer reject a correct answer as "extra columns".
- Task #768: the prompt now matches the graded answer.
- The wrong-answer hint no longer suggests comparing against the example block, which is intentionally not exact.
- Pure UPDATE / DELETE / INSERT tasks are now graded by the resulting table state — a wrong mutation is no longer accepted as correct.
Fixed five tasks where the prompt text did not match the schema and answer.
- Tasks #762, #763, #764, #765, #809: prompt rewritten to match the actual schema and expected answer.
- AI task generation, AI Mentor, and the bug-report form: on rate-limit they now show "retry in N seconds" instead of "ThrottlerException".
Fixed task #17 — the grader returned NULL due to a schema bug.
- Task #17 (
average-post-hiatus): schema aligned with the seed, grader works again.
On the "Move old rows to archive in one go — race-free" task (#789), the prompt asked for a customer_id column that doesn't exist in the schema. The wording is now aligned with the actual schema and grader: id, status, amount.
- Task #789 (
hard-cte-atomic-archive): the description mentioned a non-existentcustomer_idcolumn. The wording now matches theorders/orders_archiveschema and the expected columnsid, status, amount.
"Too many requests" message now shows the exact limit and seconds-until-reset instead of the cryptic "ThrottlerException". Server-side rate-limit raised so fast track navigation no longer hits the ceiling.
- Server-side rate-limit on regular API requests raised 5×. Fast back-and-forth between tasks within a track (10+ parallel mount fetches) no longer hits the ceiling and 429s.
- When rate-limited on Submit or Run, the message now shows the actual limit and exact seconds-to-retry. Previously only the cryptic "ThrottlerException: Too Many Requests" surfaced with no waiting hint.
"Start" on the track card actually starts the track again — an invisible card-link overlay was eating the click and routing it to the track detail page.
- On
/trainer/tracks, the "Start" button on a track card no longer navigates to the track detail page instead of starting the track. Click-anywhere-on-card → details is preserved.
SQL sandbox: bring your own tables and queries — no task, no grading. Plus a unified wide bento layout across leaderboard, progress, tracks, tasks, and sessions.
- New
/sandboxpage — Monaco editor, schema panel, result panel, per-table data tabs, warm-up snippets. Anon sessions idle out after 30 min, signed-in users get 7 days. - Saved fiddles: up to 5 on free, unlimited on Premium. Library with search, copy-link, delete, and privacy toggle.
- Unified wide layout across personal-space pages — My Fiddles, Progress, Leaderboard, Sessions, Tasks, Tracks, and the track-detail page now share one shell with a gradient hero and a consistent card grid.
The position-change arrows on the leaderboard are back — previously the column was empty because there was no baseline snapshot to diff against.
- The "climbed / dropped / no change" indicator is back next to each row on the leaderboard. The previous-week baseline snapshot was seeded; the regular weekly cron will keep refreshing it.
Fixed a bug where re-submitting an already-solved task silently removed Power — the "first-try" bonus got erased. All affected users have had their Power recalculated.
- Re-submitting a solution for an already-solved task no longer wipes the "first-try" bonus — the Power for that task stays the same as right after the first successful submit.
- Task #107 (book-genre spend breakdown for 2005) no longer requires a specific row order — any ordering is now accepted, matching the wording of the problem statement.
Fixed the DB schema panel on several tasks — the orange relationship lines between linked tables were not being drawn.
- On some tasks the "Schema" panel didn't show the relationships between tables (the orange 1:N arrows) — the missing relationships were added to the datasets.
Fixed the "Split customers into low / mid / high spenders" task: the sample answer and the reference solution had drifted away from the prompt — now everything uses the customer id and the low / mid / high segments.
- Task "Split customers into low / mid / high spenders" (#757): the sample answer and the reference solution now match the prompt — columns
customer_id,segment, segmentslow/mid/high, ordered bycustomer_id.
A big "Arena" rebrand: a new homepage, a from-scratch leaderboard with a podium and live updates, points renamed to "Power" with a battle-axe brand mark, learning tracks rebuilt, and adaptive AI task generation that actually reads your recent submissions.
- A new "League" tab — the 30 users closest to you by Power. Difficulty filters on the global tab (Power recomputed per ladder). Climb / drop arrows next to each position — week-over-week movement.
- Achievements: emoji replaced with vector icons tinted by category, browser tooltips show localised names; on
/statsit's a grid with tap-popovers on mobile. New "10 Expert" achievement. - Hover a name on the leaderboard for a mini user-card. A "Share rank" button — the link points to your public profile with an OG preview.
- Homepage rewritten under the "Arena" brand: a punchy "Sharpen SQL. Take the offer." headline, a live scoreboard in the hero, a rank ladder with a "You" pin, sections on the trainer / tracks / AI / interview mode / progress, and a closing "The axe is in your hand. Swing." band. Mobile-ready.
- Points renamed to "Power". The lightning bolt is replaced with a battle-axe — now the logo, the favicon, and the link-share preview.
- The leaderboard page was rewritten from scratch: a top-3 podium (gold / silver / bronze), a personal progress card with a bar to the next rank, a single sticky filters bar, the rank ladder right under the header, a pinned "you" row when you're outside the top 50, and live updates — the table reacts smoothly to other people's solves with no reload.
- Learning tracks rebuilt. Analyst / Backend / QA / Data Engineering — ~50 curated tasks each: a few representatives per topic×difficulty cell, warm-up to EXPERT, weighted toward real-interview problems. Added a Data Engineering track plus a dedicated interview-prep track.
- The "Generate for me" button is now genuinely adaptive: it reads your last 40 submissions, picks the topic with the worst recent accuracy, and calibrates difficulty to your level — stalling drops the next one a notch, a streak bumps it up.
- New visitors land on the "Night" theme by default (previously "Evening"). If you've already picked a theme, your choice is kept.
- Task "Say in one number: how many active customers" — the canonical solution required customers with ≥2 paid orders while the description says "at least once". Fixed to match the description.
EXPERT tasks now grant a real 75 power per solve (up to 281 with bonuses) instead of the EASY-tier 10. Lifetime power for users who already cleared an EXPERT has been recomputed retroactively.
- The reward table had no row for EXPERT, so the grader fell back to a default of 10 and every EXPERT task paid out the same as an EASY one. EXPERT base is now 75 power, with the same multipliers stacking on top (first-try ×2, Mock-Interview pass ×1.25, premium solve ×1.5) — up to 281 power per EXPERT task. A migration replayed
xp_totalfor every profile under the corrected rules, so anyone who had already solved an EXPERT picks up the missing power automatically.
Closed the loophole where a task could be "solved" by hardcoding the sample output: on 25 datasets the grader now checks your query against hidden rows that differ from the ones shown in the task description.
- Solutions still run against the same tables and columns as before, but the rows inside the grading seed differ from the visible sample. Any genuine query-based answer keeps passing, while a hardcoded
SELECT … UNION ALL …that copied the sample literals now grades as "wrong". 25 datasets across the latest catalogue batch are covered (lists, CTE, window, pivot, DML, expert).
Patched two learner-reported task issues: the misordered sample in "Students by region" and the description that drifted away from the schema in the net-revenue task.
- Task "Students by region" (#357): the sample now ascends by
rn(Jack / Kim / Lars in the first row), and the reference solution carries an explicitORDER BY rnso it produces the same order. - Task "Users with net revenue of at least 100" (#783): title and description now match the actual data — users and
purchase/refundevents, not products andsale/refund, with a threshold of 100, not 1000.
Six advanced tasks now ship a pre-seeded table — solutions no longer start with a CREATE TABLE preamble.
- Six Hard / Expert tasks (single- and multi-column UPSERT, CTE with
RETURNING, bulkINSERT … RETURNING,SKIP LOCKEDqueue, array unfolding viaUNNEST) joined the rest of the advanced catalogue: the table is created and seeded in the dataset, and the solution holds just the operation under test plus a finalSELECTfor grading.
- The "View counter" task description no longer drifts away from the expected output: both now describe the same
counters(id, count)table and five runs of the same row.
DDL tasks no longer show unrelated tables in the side schema panel.
- On 10
CREATE TABLEtasks (from easy to expert) the side schema panel was rendering tables from an unrelated dataset — e.g. an articles task showedorders. The panel is now empty, as it should be when a task asks you to build the table from scratch.
115 new tasks, tri-mode Day / Evening / Night theme switcher, and a softer dark palette.
- The catalogue grew by 115 tasks: 20 easy, 35 medium, 45 hard, and 15 expert — subqueries, CTEs, window functions, DML/DDL, MERGE, query optimization, transactions, JSONB, recursion, and
LATERAL. - New «Expert» difficulty tier with a violet badge and its own filter in the catalogue.
- Tri-mode theme switcher: Day (light), Evening (soft dark), and Night (deep) — pick by ambient light to ease eye strain.
- Dark theme softened: the canvas moved to a Linear-style gray-blue (
#1B1B1F) instead of the previous near-black, primary text dropped to zinc-300 — less halation on long sessions. - In «Night» mode the SQL editor pane sits three steps deeper than the canvas with a slight push toward true black — reads as a recessed panel in the same family.
- The in-task topic cheatsheet is now difficulty-aware: on Hard / Expert tiers it hides basic
SELECT/WHERE/ORDER BY/LIMITand surfaces advanced patterns instead —STRING_AGG,ARRAY_AGG,GROUPING SETS,LATERAL, JSONB, partial indexes, and so on. - Active difficulty-filter pills switched to a brand-accent soft-fill instead of solid black — they no longer break the light theme's look.
- Russian difficulty labels: «Лёгкое» → «Лёгкий», «Среднее» → «Средний», «Сложное» → «Сложный».
24 new beginner blog articles.
- Topic coverage expanded: DML (
INSERT/UPDATE/DELETE), DDL (CREATE TABLE/ALTER TABLE), aggregates,DISTINCT, NULL handling (CASE WHEN/COALESCE/NULLIF), CTEs and subqueries, window functions, string and date.
- Trainer cheat sheet: each item now points to its own article. Previously the four window-function items linked to a single overview —
ROW_NUMBER,RANK/DENSE_RANK,PARTITION BY, andLAG/LEADeach now have their own.
- Task #114 "How many cardiology wards" — renamed the expected output column from
counttowards_countso it no longer collides visually with the reserved keyword.
Closed the answer-padding loophole: tasks now grade against a hidden dataset.
- The grader can now run a task against a hidden dataset. The canonical reference is recomputed on the same data, so correct solutions still pass while constants borrowed from the visible sample fall through.
- The "Oldest club member" task no longer accepts a hardcoded
LIMITmatched to the visible sample — only a query that expresses "all rows with the minimum birth date" passes.
Pricing-card polish and "Sign in & subscribe" button fixes right after v2.2.0.
- Price and CTA button in the Free and Premium cards now line up at the same Y.
- Trimmed the price footnotes for Crypto and Visa/MC — only the rails name remains.
- The "Sign in & subscribe" button is clickable again for signed-out users.
Added crypto and international Visa/Mastercard payments, plus tightened anti-bot defences on the auth flow.
- Crypto payments via NowPayments — BTC, ETH, USDT and others. $21 quarterly / $28 semi-annual.
- International Visa/Mastercard via Paddle with automatic VAT/sales tax. $21 / $28.
- Payment-method picker on the Premium card: RU card, Crypto, Visa/MC. Currency switches per method.
- Cloudflare Turnstile on login and register — invisible to humans, blocks bots.
- Account locks for 15 min after 5 wrong passwords (exponentially up to 24 h) with an explicit countdown.
- Login and register errors are humanised — no more raw "Forbidden" or "Invalid credentials".
- Submission rate limit: 5/min, 30/15min per user. Doesn't affect real solve sessions.
- After login we return to the page you came from — including OAuth (Google, GitHub, Yandex).
- Logging out from a public page no longer kicks you to the home page.
Finished the Telegram, GitHub, and LinkedIn save fix on the profile page. The previous release fixed the username normaliser on the backend, but the front-end component was short-circuiting onBlur — the PATCH never actually fired. The field visually accepted input, the server stayed empty, and after a reload the field was blank. Now the blur comparison uses the value captured at focus-time, not the in-flight input.
- The Telegram, GitHub, and LinkedIn fields on the profile page now save again. A useEffect was overwriting the "last-saved" ref on every keystroke, so the onBlur check compared the current value to itself and skipped the PATCH. The blur check now compares against a snapshot taken at focus-time.
Fixed saving Telegram, GitHub, and LinkedIn handles on the profile page: typing the placeholder format like t.me/username was being chopped down to garbage like t.me. Now any input — bare handle, @handle, t.me/handle, or https://t.me/handle — normalises to a clean username.
- The Telegram, GitHub, and LinkedIn fields on the profile page now save correctly when the address is typed without
https://. Previouslyt.me/durovwas stored ast.me,github.com/octocatasgithub.com, because the normaliser required anhttp(s)://scheme and otherwise cut the value at the first slash.
Removed the false-positive premium upsell banner in the solve-result panel: it triggered on free tasks and even for premium users. It was dead UI to begin with — premium tasks are blocked at task open, so the editor never sees them.
- In the "Correct!" celebration modal the "+50% Power per solve — go Premium" pill now has proper horizontal padding — the crown and chevron no longer touch the pill edges.
- AI Mentor now receives compact task context: active SQL dialect, tables, relationships, expected columns, sample output, and the latest grading diff. Reference SQL is used only as private context for error explanations and later hint tiers.
- The "Interview tasks — Premium" upsell banner is gone from the feedback panel. Previously any server-side error containing the word
premiumin its stack trace (e.g. a missingsolved_as_premiumcolumn right after a migration) tripped a substring match and rendered the upsell — even on free tasks and even for premium users.
Premium now grants +50% Power per solved task — the boost sticks to the task forever, even after the subscription expires. AI Mentor no longer dumps the solution on the first hint and now escalates help on a per-task basis. Also dropped the starter -- Click ▶ Run comment from the first-task editor.
- Premium subscription grants a ×1.5 Power multiplier on every solved task. The boost is locked in at the moment of solve, so it stays in your total even if the subscription later expires.
- The "Correct!" celebration modal now shows an upgrade nudge for free users right under the +Power chip: "Get +50% Power per solve — go Premium", linking to /pricing.
- AI Mentor now escalates hints per task. The first request gets a direction-only nudge with no operator names; requests 2-4 add concept and category; from request 5 the mentor may name
LIKE/WHERE/GROUP BYdirectly. Counter resets every 24 hours. - Wrong-answer explanations now follow the same hint tiers as plain hints — they no longer reveal specific operators on the very first failed submission.
- Closed the remaining SQL-task audit findings: fixed the Tournament Winners reference, aligned TIMESTAMP previews on several tasks, and restored the PostgreSQL variant for one AI task.
- Removed the starter comment
-- Click ▶ Run — see what's in this tablefrom the first-task editor. Opened tasks now start from a blank editor.
Reworked the task catalogue filters: status became a 3-state segmented control (All / Unsolved / Solved) defaulting to Unsolved, added a dialect filter, topic and company chips now show their current task count, active filters surface as removable pills with a "Reset all" affordance.
- Dialect filter in the catalogue: All / PG / MySQL — its own segment next to the status control.
- Topic and company chips now show how many tasks match: "Windows (43)", "Tinkoff (5)". Chips with zero tasks fade out.
- Active-filter pills row: every applied filter (search, difficulty, status, dialect, favourites, topic, tag, company, region) renders as a removable pill; "Reset all" snaps everything back to defaults.
- Task-status filter is now a 3-state segmented control (All / Unsolved / Solved), defaulting to Unsolved. Replaces the single "Hide solved" toggle.
- Sort control moved to the top bar — previously buried at the bottom and hidden behind scroll.
- Favourites toggle moved to the top filter bar — now sitting next to the other binary toggles.
- Filter badge no longer reads "1" out-of-the-box — the default "Unsolved" view is not counted as an applied filter.
Catalogue-wide audit: grader no longer rejects correct answers because of DATE-vs-TIMESTAMP serialisation, sample previews on 60+ tasks now match what the reference solution actually returns, and 5 tasks using CURRENT_DATE / NOW() are pinned to a fixed reference so previews stop drifting day-by-day. Plus a description fix on the monthly-transactions task from a user bug-report.
- Grader: added date-as-timestamp normalisation (
2024-01-01T00:00:00.000Z↔2024-01-01) — correct answers stop getting "row count matches, contents differ" because of return-type formatting. - Task "Monthly transactions and chargebacks": description now clarifies that a chargeback belongs to the original transaction's month, not the refund date; preview shows first-day-of-month dates instead of TZ-shifted ISO timestamps.
- Regenerated sample previews on 60+ tasks: numeric formatting (
100→100.00), timezone display (+03→+00), DATE-as-TIMESTAMP, INTERVAL-as-object — preview now matches what the live runner returns. - Five tasks using
CURRENT_DATE/NOW()/CURRENT_TIMESTAMPin their seed (#170, #601, #602, #668, #693) are now pinned to2026-05-05 12:00:00 UTC. Previews stop drifting.
Reworked the blog: search, navigation by 10 sections, first 7 beginner tutorials. Command names in the in-task cheatsheet are now clickable links to articles. The releases page got a version tree with scroll-spy.
- Blog: search across titles, content, and tags + left section sidebar. Active section highlights on scroll.
- Blog: 7 first beginner tutorials —
SELECT … FROM,WHERE,ORDER BY,LIMIT,INNER JOIN,LEFT JOIN, aliases. - In-task topic cheatsheet: command names are now blue links to the matching blog tutorial — open in a new tab.
- Releases page: left-side version tree grouped by
major.minor; clicking scrolls to the version and updates the hash anchor. - "Copy SQL" button on every row of the Submissions tab.
- Russian plural agreement everywhere: "221 задача", "2 задачи", "5 задач" instead of the old "221 задач".
- In-task topic cheatsheet no longer jitters when expanded — scrollbar track is now reserved.
- Markdown tables in blog articles now render as HTML tables instead of a single plain-text line.
Catalog-wide quality sweep: 23 unrunnable tasks repaired, 66 English descriptions rewritten, descriptions and sample previews aligned on a few dozen more. Plus one user-reported fix.
- Sample previews on 50+ tasks now match what the reference solution returns.
- Collapsed duplicate company tags in the task filter chips.
- Repaired 23 tasks (pharma-*, loyal-*, hotel-*, qa-*) that could not be solved due to a schema/seed mismatch.
- Rewrote English descriptions on 66 lc-* / lc2-* tasks that previously shipped a stub or fragment.
- Task "Rooms Booked on September 2, 2019" no longer accepts the wrong answer.
- Ten tasks where the description disagreed with the reference solution are now consistent.
- Seven Tochka tasks shipped someone else's problem statement — rewrote them.
69 new tasks pulled from real Russian-market job interviews (Yandex, Tinkoff, Sber, VTB, Alfa, VK, Ozon, Avito, Magnit, Samokat and 23 more companies) — built around the wider PostgreSQL type universe: UUID, JSONB, ENUM, INTERVAL, TSTZRANGE, INET, NUMERIC and POINT. Plus key fixes from user reports and a "What's new" red-dot indicator in the sidebar.
- 69 new tasks taken from real interviews at Russian companies. 33 employers: Yandex, Tinkoff / T-Bank, Sber / SberMarket, VTB, Alfa-Bank, Gazprombank, Rosbank, Sovcombank, MTS / MTS Bank, Otkritie, Renaissance Bank, Megafon, VK, Ozon, Avito, Magnit, Lenta, Wildberries, Cian, ivi, Delimobil, Aviasales, Samokat, Domclick, Lesta, Skypro, Uchi.ru, Sravni.ru, Vizor, CloudReports and Yandex Practicum. All tagged Interview, accessible to Premium.
- Rich PostgreSQL types in task schemas. Most tasks used to be
INT+VARCHAR(100)— fine for textbook examples, far from production. The new tasks introduceUUIDfor client and order PKs,NUMERIC(15,2)for money andNUMERIC(12,4)for FX rates,TIMESTAMPTZfor events,INTERVALfor call and session durations,TSTZRANGE/DATERANGE/NUMRANGEfor SCD2 histories and validity windows,JSONBfor metadata and event payloads,ENUM(with explicitCREATE TYPE) for statuses and categories,INETfor IPs in antifraud tasks,POINTfor GPS coordinates,TEXT[]/INTEGER[]for tags and ID arrays. So the trainer exposes you to the same types you'll meet in production. - Red dot indicator on the "What's new" sidebar entry — appears when a new release has shipped that you haven't opened yet. The dot disappears after one visit to
/releases(the flag lives in this browser's localStorage). Previously the indicator only existed in the top navbar; in sidebar-only layouts it wasn't reachable.
- Proper rendering of the new types in the query result table. Previously
JSONB,INTERVALandPOINTcolumns rendered as "[object Object]" and arrays (TEXT[],INTEGER[]) collapsed to comma-joined strings — the structure was invisible. Now JSONB and arrays render as readable JSON, INTERVAL as1d 02:30:00, POINT as(x, y). Booleans and UUIDs keep their text rendering. - ER diagrams on the task page got palette entries for the new types: UUID violet, JSONB yellow, INTERVAL purple (same family as other date/time types), TSTZRANGE / DATERANGE / NUMRANGE pink, INET cyan, POINT pink, custom ENUMs rose. Previously these types fell through to the default grey and were indistinguishable from plain INT / VARCHAR.
- The six fixed tasks above also got an enriched schema in the same style as the new interview set:
UUIDprimary keys,JSONBpayloads,ENUMtypes for sex / categories / statuses,NUMERIC(15,2)in place ofINTfor salaries and prices,INTERVALfor durations. Task wording was slightly adjusted to motivate the new types, but the underlying problem is unchanged. This is the first step in upgrading older tasks — more in upcoming releases.
- Fixed a handful of older tasks reported by users. "Project Employees II" — the ER diagram showed Employee + Department instead of Project + Employee, while the underlying schema was correct; brought the diagram in line. "Reported Posts" — the description didn't spell out that the report reason lives in the
extracolumn: now it does. "Sales Analysis I" — the reference solution usedSUM(price)even though the schema has aquantitycolumn, which was confusing; reframed asSUM(quantity * price), closer to real-world revenue. "Swap Salary" — the task was wired to the wrong dataset (Employee + Department instead ofSalary(id, name, sex, salary)), making it unsolvable; relinked to the canonical dataset. Same silent ER drift in "Project Employees III" and "Reported Posts II" got the same fix.
Major release: a new left-sidebar navigation, the strict Mock Interview mode with a +25% Power bonus, public profiles and friends, email notifications, brand-coloured company tags, extra filters and a partner-courses block. Plus an important cross-account privacy fix and dozens of UX polish items.
- Partner-course block. On the tasks page (wide screens) a right-hand column shows a curated set of partner courses; on mobile it's a horizontal carousel above the list. Cards link out to partner landing pages with UTM tags — for us, a way to keep the subscription price down by covering infrastructure costs.
- New Mock Interview mode — a strict simulation of a real interview. Any single violation (tab switch, paste, fullscreen exit, > 1-second window blur) auto-fails the session. Hints, AI Mentor and cheatsheet are hidden and locked. Durations: 5 / 10 / 15 / 30 / 60 minutes. Free tier — 1 attempt per day; Premium — unlimited. While a session is live the surrounding navigation (sidebar, "Tasks", "Top solutions", "Next task", "Leave track", Prev/Next/Random) is locked down — the only way out is the explicit "End" button or closing the tab (which auto-abandons the session).
- +25% Power for every task cleared in Mock Interview mode — the bonus is per-task and flagged on the post-session report. The leaderboard now has an informational "Mock" column (same count shown on the profile card and on
/u/<username>); it does not affect Power-based sort order. - Public profiles at
/u/<username>: pick a short handle and flip the public toggle — any anonymous visitor sees your rank, Power, current streak, achievement count, activity heatmap and GitHub / Telegram / LinkedIn links. No private data exposed. - Friends: add users by their public handle, manage incoming and outgoing requests, see a dedicated friends-leaderboard tab with their Power, streak and tasks-solved.
- Favourites: every task card now has a star — click it and the task lands in the "Favourites only" filter. The list lives on the server tied to your account and survives browser switches.
- Email notifications (toggles in profile). "Save your streak" — evening reminder when your streak is ≥ 3 days and you haven't solved anything today. "Weekly digest" — Saturday morning recap with last week's solved tasks, current streak and weakest category.
- Premium users are visually flagged wherever avatars appear: a holographic gradient ring (leaderboard, friends, profile, sidebar, public
/u/<username>page); a small Crown badge in the corner on large avatars. Does not affect sort order. - Brand-coloured company tags on task cards: yellow for Yandex / Tinkoff / Beeline, green for Sberbank / Spotify / OpenAI, blue for VK / Ozon / Google / Meta, red for MTS / Alfa / Tesla, purple for Stripe / Skypro / Wayfair, orange for Amazon / Alibaba and so on. Previously every tag was a single purple.
- Extra SQL-clause chips in the "Topic" filter on the tasks page: alongside the 8 broad categories (SELECT, JOIN, subqueries, window, aggregates, CTE, DML, DDL) you can now toggle
GROUP BY,COUNT,HAVING. Mix them with categories for sharper filtering. - The "DB Schema" panel on the task page can now be collapsed. The toggle next to the task title hides the column and frees up width for the editor and result table. The collapse state is remembered per browser, so the schema opens the same way on the next task.
- 8 new interview tasks from Tochka — ranging from EASY to HARD. CRM scenarios (find clients with an active application), portfolio calculations (structure, weighted-average maturity, value dynamics), bond queries with window functions. Solutions for both PostgreSQL and MySQL.
- Blog section at
/blog. Long-form tutorials — kicking off with a window-functions deep dive. Bilingual content, slug URLs, OG cards for social sharing. Reachable from the footer and the bottom of the sidebar. - Custom 404 page. The old Next.js default rendered black-on-white text — invisible in dark mode. The new page uses theme tokens and lives inside the shared shell, keeping navigation in reach.
- Navigation redesigned. For signed-in users inside the app the primary nav has moved to a left sidebar — Trainer, Progress, Leaderboard and the other sections live there, with Power + streak under your avatar and language/theme toggles at the bottom. The landing page, pricing and auth flows keep the slim top-bar. Utility pages (What's new / Report a bug / Blog) inherit whichever chrome you came from.
- Premium gradient ring around avatars now shows on every leaderboard tab — previously the ring appeared only on the "All time" tab and silently dropped off on "Week" and "Month" because the backend didn't emit the subscription flag for the periodic rankings.
- Name and avatar edits in your profile now reflect immediately in the sidebar — no page reload required. Previously the old user card could linger until a full refresh.
- Cross-account data leaks when switching users in the same browser. Previously, after logout / login with a different account these could persist: AI Mentor chat threads, SQL drafts in the editor, per-task "solved" flags, active mock-interview sessions, AI-generation counter, favourites cache. Now logout and every login path (form, OAuth, email verify) wipes everything tied to the previous user.
- "Friends rating" link from the profile now lands directly on the Friends tab — previously it dropped you on the global leaderboard. The "Start here" beginner lane no longer comes back after you've dismissed it; previously the dismiss reset on every logout / login.
- Dozens of mobile-layout and interaction polish items: a more compact post-session report modal, correct filter spacing on narrow screens, the feedback banner no longer overlaps the side panel at 1024px, name + email fields on the bug-report page for anonymous submitters.
Editor UX hotfix on narrow screens: the "Editor settings" popup no longer gets clipped by the code panel and no longer spills past the viewport edge on mobile. The same gear button that desktop has now lives in the mobile toolbar too, and the font-size setting finally applies to the mobile editor.
- The "Editor settings" popup could get clipped by the page edges and had no internal scroll — on a narrow laptop or a phone, half the settings were simply invisible. The popup now renders on top of the whole page (via a portal), auto-clamps to the visible area, and grows an internal scrollbar when its content overflows the viewport height. The header with the title and close button stays sticky while scrolling.
- On the mobile editor view (≤1024px) the toolbar was missing the editor-settings gear — "Font size" was only reachable from desktop. The gear now sits next to PG/MySQL and Format, and the font-size setting actually scales the mobile editor input.
Hotfix from a bug report: task #240 ("Staff Bonuses") was rendering the wrong schema — it showed Employee + Department instead of the real Employee + Bonus, making the prompt unreadable.
- Task #240 "Staff Bonuses": the schema viewer was rendering stale tables
Employee + Department(withdepartment_id,manager_idfields) and a hollowDepartmenttab. The sandbox and reference solution were correct all along — only the viewer metadata was off. Now the schema shows the realEmployee + Bonustables with theBonus.empId → Employee.empIdrelation.
Enriched datasets across 268 of 339 tasks — fuller source tables, more meaningful rows in the expected output, tasks no longer feel broken.
- Mass dataset enrichment: 268 of 339 tasks got fuller seed data — typically 6-12 rows in primary tables instead of 2-4, with variety along the filter/JOIN/GROUP BY axes the reference solution exercises. 137 unique datasets touched. Reference solutions and schemas are unchanged. User progress is preserved — already-solved tasks stay solved, Power and achievements aren't recomputed.
- Every enriched task was validated: the reference solution was run against the new seed via the executor, sample_output regenerated from the real result.
- Task #38 (
well-paid-employees) — originally a v1.2.4 hotfix, now part of the broader pass.
Hotfix from a bug report: the "Expected output sample" panel now clarifies that the row count there doesn't have to match the schema tables.
- Added a disclaimer above the "Expected output sample" panel: "this is what a correct answer looks like — its row count is its own, it doesn't have to match the schema tables". Previously users counted rows in one of the schema tables and assumed the task was broken when the numbers differed.
Hotfix from a bug report: task #38 "Salary higher than manager" now runs on a proper dataset with three real cases. Plus a small orange dot on "What's new?" when a fresh release ships.
- A small orange dot appears on the "What's new?" nav item when a fresh release ships. One visit to
/releasesclears it until the next release.
- Task #38 (
well-paid-employees): the dataset was too sparse — 6 employees and a single "subordinate earns more than manager" case, which made it look like the data was wrong. Expanded to 9 employees across two departments with three clear cases (Eve > Alice, Frank > Dave, Henry > Bob).
New "Report a bug" page with screenshot attachments, a secondary nav group, and a more compact "Start here" lane on mobile.
- New "Report a bug" page in the navbar: subject + description form with up to 5 screenshots / short clips (drag-and-drop supported). Reports land in our inbox for fast triage.
- Navbar gets a secondary group — "What's new?" and "Report a bug" — separated from the primary tabs by a thin vertical divider.
- Beginner "Start here" lane is more compact on mobile — shorter title, hidden description, narrower cards. Frees up space for the task list itself.
- Beginner "Start here" lane no longer flashes for a split second when opening the tasks page — now renders only after
/progressresolves. - Release-notes highlight (top one-liner) now properly renders backticks — previously showed literal "
?lang=" instead of a styled code pill. - Phantom vertical scrollbar on the "Learning Tracks" page is gone —
min-h-screenpaired with the navbar was forcing ~60px of extra height even when content fit.
UX polish across the trainer plus a ?lang= URL param for ads and direct locale-specific links.
- Land on a specific language via
?lang=enor?lang=ruin the URL:https://sql.coderang.dev/?lang=en. Handy for ads and sharing locale-specific links; the choice is remembered for a year.
- When daily AI hints run out, the "Explain" button becomes "Cheatsheet" and opens the topic reference.
- Favourite Star is now visible on mobile and faintly visible on desktop instead of hidden until hover.
- Task description no longer jumps when the cheatsheet expands. Star is brighter on hover.
- On DDL tasks the schema panel shows "no starting tables; create them" instead of an empty canvas.
- AI button actually pulses only on errors now (the animation class was never defined before).
- Navbar Power and Streak seed from localStorage before the server fetch — no more "0 ⚡" flash.
- AI generation counter no longer resets to 0 after redirecting to the generated task.
- Mobile niceties: equal-width difficulty badges (Star aligned), bottom-tab text fits, daily counter scale animation, streak icon tooltip, Russian plural rules.
- Russian company names (Сбербанк, Яндекс, Авито…) now render in Latin transliteration (Sberbank, Yandex, Avito) on English UI; Cyrillic stays on Russian.
- Cheatsheet entry names (Aliases, Scalar subquery, etc.) now properly translate on language switch.
- Weekly/monthly leaderboard now applies the first-try ×2 bonus and ignores re-submissions, matching how lifetime Power is computed. Previously the period view showed roughly half of lifetime — bug in the math, not the data.
- Removed a dead Solutions tab — no button activated it but it was duplicating the load.
- Backticks no longer leave a gap before trailing punctuation ("
Action."). - Result-pane empty states now properly translate to English.
Polish for data-modification tasks and overall description rendering.
- Heads-up for DDL/DML tasks: UPDATE/INSERT/DELETE and CREATE/ALTER/DROP tasks now show a short "no trailing SELECT needed" notice — no more guessing what to output.
- Topic cheatsheet now respects task type: DML tasks no longer show SELECT/ORDER BY/LIMIT, DDL tasks show only schema-modification commands.
- Backticked tokens in task descriptions (\
id = 4\, \users.email\) now render as accent code-pills instead of raw text — descriptions read exactly as authors write them. - Cheatsheet code blocks now have an accent left-bar and a subtle border — they read as real code snippets instead of grey blobs.
Newcomer onboarding: a "Start here" lane, starter SQL on your first task, and a topic cheatsheet inside every task. Wrong-answer hints are now specific and don't burn your AI quota.
- "Start here" lane at the top of the tasks page — 8 simple SELECT tasks for first-timers. Shows up until you solve something; drag-to-scroll with a grab cursor.
- Starter SQL in the editor. The very first task you open prefills
SELECT * FROM <first_table> LIMIT 5;so you can hit ▶ right away and see what the data looks like. - Topic cheatsheet. The task panel now has a collapsible reference block with relevant SQL commands, syntax, and a one-line explanation — tailored per topic: SELECT, JOIN, aggregates, subqueries, windows, CTE, DML, DDL.
- Wrong-answer banner is now specific: it names extra/missing columns, row diffs, sort issues, and common SQL errors. Runs locally, no AI quota consumed.
Alias-aware autocomplete in the SQL editor and major mobile layout improvements.
- Releases page: the update history is now visible at /releases.
- Alias-aware autocomplete. After
<alias>.the suggestions are scoped to that single table's columns. Aliases themselves complete on Tab. .is now a trigger character: suggestions pop automatically after it, no need for Ctrl+Space.
- The mobile menu now overlays content instead of pushing the page down. Closes on outside tap.
- 300+ task descriptions rewritten: added business context, listed output columns, made sorting and rounding explicit.
- Mobile task description now scrolls correctly when the text is long. It used to jam and block access to the tabs at the bottom.
- The trainer's bottom tab bar is now always visible on any mobile browser (Yandex Browser, MIUI, Samsung Internet). It used to clip below the viewport.
- The mobile menu is now fully opaque. Previously 5% of background content showed through on browsers without backdrop-filter support.
- On narrow screens (320px and below), the task sort dropdown no longer overflows the right edge.
- Old autocomplete bug: typing
t.eafterFROM employee twould insertt.employee.salary(invalid SQL). The alias is now respected.
First stable release of SQL Arena.
- 259 curated SQL tasks across 6 categories: SELECT, JOIN, aggregate, subquery, window, DML.
- 96 interview tasks from top tech companies (Google, Meta, Amazon, Stripe, etc.).
- Dual SQL dialect support — PostgreSQL and MySQL with instant switching.
- AI task generation: unique tasks adapted to your skill level.
- AI Mentor: contextual hints without giving away the answer.
- 3 learning tracks: structured paths from basics to advanced SQL.
- Real-time SQL execution in a sandboxed environment with result grading (column/row/order diff).
- OAuth authentication via GitHub, Google, Yandex, plus email/password sign-up.
- XP-based (Power) leaderboard, user profiles, achievements, dark and light themes.
- Premium subscription with YooKassa integration and anti-bot rate limiting.
- Interactive ER schema diagrams, Monaco editor with SQL highlighting and formatting.
- Bilingual interface: Russian and English.