From debe24d37ac1267f64fdd0164d0a6e44550e6bd2 Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Thu, 27 Aug 2026 21:21:06 -0700 Subject: [PATCH] Run `*.sql` through `sql-formatter` ```bash find -name \*.sql | while read f ; do sed -i 's/^\. /-- . /' "$f" sql-formatter --fix -l sqlite "$f" sed -i 's/^-- \. /. /' "$f" done ``` --- .../practice/binary-search/.meta/example.sql | 153 +++++--- .../.meta/template.create_test_table.j2 | 13 +- .../binary-search/create_test_table.sql | 13 +- exercises/practice/bowling/.meta/example.sql | 367 +++++++++++------- .../.meta/template.create_test_table.j2 | 16 +- .../practice/bowling/create_test_table.sql | 16 +- .../.meta/template.create_test_table.j2 | 3 +- .../practice/queen-attack/.meta/example.sql | 141 ++++--- .../queen-attack/create_test_table.sql | 165 ++++++-- .../rail-fence-cipher/.meta/example.sql | 358 ++++++++++------- .../.meta/template.create_test_table.j2 | 4 +- .../rail-fence-cipher/create_test_table.sql | 4 +- exercises/practice/rest-api/.meta/example.sql | 4 +- exercises/practice/sieve/.meta/example.sql | 139 ++++--- .../sieve/.meta/template.create_test_table.j2 | 3 +- .../practice/sieve/create_test_table.sql | 3 +- 16 files changed, 916 insertions(+), 486 deletions(-) diff --git a/exercises/practice/binary-search/.meta/example.sql b/exercises/practice/binary-search/.meta/example.sql index 0afd2c60..14ccf874 100644 --- a/exercises/practice/binary-search/.meta/example.sql +++ b/exercises/practice/binary-search/.meta/example.sql @@ -1,74 +1,109 @@ UPDATE "binary-search" - SET error = 'value not in array' - WHERE JSON(array) = '[]' -; +SET + error = 'value not in array' +WHERE + JSON(array) = '[]'; DROP TABLE IF EXISTS tmp; + CREATE TEMPORARY TABLE tmp ( - array TEXT NOT NULL, - value INTEGER NOT NULL, + array TEXT NOT NULL, + value INTEGER NOT NULL, result TEXT, - PRIMARY KEY(array, value) + PRIMARY KEY (array, value) ); -INSERT INTO tmp +INSERT INTO + tmp SELECT array, value, - (WITH RECURSIVE rcte (list, target) AS ( - VALUES (( - SELECT JSON_GROUP_ARRAY(JSON_ARRAY(j.value, j.key)) - FROM JSON_EACH("binary-search".array) j), - "binary-search".value - ) - UNION - SELECT CASE - WHEN JSON_EXTRACT( - list, PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2) - ) = target - THEN JSON_ARRAY( - JSON_EXTRACT( - list,PRINTF('$[%d]', JSON_ARRAY_LENGTH(list) / 2))) - WHEN JSON_EXTRACT( - list, PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2) - ) > target - THEN (SELECT JSON_GROUP_ARRAY(JSON(j.value)) - FROM JSON_EACH(list) j - WHERE j.key < JSON_ARRAY_LENGTH(list) / 2) - WHEN JSON_EXTRACT( - list, PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2) - ) < target - THEN (SELECT JSON_GROUP_ARRAY(JSON(j.value)) - FROM JSON_EACH(list) j - WHERE j.key > JSON_ARRAY_LENGTH(list) / 2) - END, - target - FROM rcte - WHERE JSON_ARRAY_LENGTH(list) > 1 - ) - SELECT IIF(JSON_EXTRACT(list, '$[0][0]') != target, - JSON_OBJECT('error', 'value not in array'), - JSON_OBJECT('result', JSON_EXTRACT(list, '$[0][1]')) - ) - FROM rcte - WHERE JSON_ARRAY_LENGTH(list) = 1 + ( + WITH RECURSIVE + rcte (list, target) AS ( + VALUES + ( + ( + SELECT + JSON_GROUP_ARRAY(JSON_ARRAY(j.value, j.key)) + FROM + JSON_EACH("binary-search".array) j + ), + "binary-search".value + ) + UNION + SELECT + CASE + WHEN JSON_EXTRACT( + list, + PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2) + ) = target THEN JSON_ARRAY( + JSON_EXTRACT( + list, + PRINTF('$[%d]', JSON_ARRAY_LENGTH(list) / 2) + ) + ) + WHEN JSON_EXTRACT( + list, + PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2) + ) > target THEN ( + SELECT + JSON_GROUP_ARRAY(JSON(j.value)) + FROM + JSON_EACH(list) j + WHERE + j.key < JSON_ARRAY_LENGTH(list) / 2 + ) + WHEN JSON_EXTRACT( + list, + PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2) + ) < target THEN ( + SELECT + JSON_GROUP_ARRAY(JSON(j.value)) + FROM + JSON_EACH(list) j + WHERE + j.key > JSON_ARRAY_LENGTH(list) / 2 + ) + END, + target + FROM + rcte + WHERE + JSON_ARRAY_LENGTH(list) > 1 + ) + SELECT + IIF( + JSON_EXTRACT(list, '$[0][0]') != target, + JSON_OBJECT('error', 'value not in array'), + JSON_OBJECT('result', JSON_EXTRACT(list, '$[0][1]')) + ) + FROM + rcte + WHERE + JSON_ARRAY_LENGTH(list) = 1 ) - FROM "binary-search" - WHERE JSON(array) != '[]' -; +FROM + "binary-search" +WHERE + JSON(array) != '[]'; UPDATE "binary-search" - SET error = JSON_EXTRACT(tmp.result, '$."error"') - FROM tmp - WHERE "binary-search".array = tmp.array - AND "binary-search".value = tmp.value - AND JSON_EXTRACT(tmp.result, '$."error"') NOTNULL -; +SET + error = JSON_EXTRACT(tmp.result, '$."error"') +FROM + tmp +WHERE + "binary-search".array = tmp.array + AND "binary-search".value = tmp.value + AND JSON_EXTRACT(tmp.result, '$."error"') NOTNULL; UPDATE "binary-search" - SET result = JSON_EXTRACT(tmp.result, '$."result"') - FROM tmp - WHERE "binary-search".array = tmp.array - AND "binary-search".value = tmp.value - AND JSON_EXTRACT(tmp.result, '$."result"') NOTNULL -; +SET + result = JSON_EXTRACT(tmp.result, '$."result"') +FROM + tmp +WHERE + "binary-search".array = tmp.array + AND "binary-search".value = tmp.value + AND JSON_EXTRACT(tmp.result, '$."result"') NOTNULL; diff --git a/exercises/practice/binary-search/.meta/template.create_test_table.j2 b/exercises/practice/binary-search/.meta/template.create_test_table.j2 index 3b1b3df0..3b6ec439 100644 --- a/exercises/practice/binary-search/.meta/template.create_test_table.j2 +++ b/exercises/practice/binary-search/.meta/template.create_test_table.j2 @@ -1,4 +1,5 @@ DROP TABLE IF EXISTS tests; + CREATE TABLE IF NOT EXISTS tests ( -- uuid and description are taken from the test.toml file uuid TEXT PRIMARY KEY, @@ -10,13 +11,21 @@ CREATE TABLE IF NOT EXISTS tests ( test_code TEXT, task_id INTEGER DEFAULT NULL, -- Here are columns for the actual tests - array TEXT NOT NULL, -- json array + array TEXT NOT NULL, -- json array value INTEGER NOT NULL, expected_result INTEGER, expected_error TEXT ); -INSERT INTO tests (uuid, description, array, value, expected_result, expected_error) +INSERT INTO + tests ( + uuid, + description, + array, + value, + expected_result, + expected_error + ) VALUES {%- for case in cases %} ( diff --git a/exercises/practice/binary-search/create_test_table.sql b/exercises/practice/binary-search/create_test_table.sql index bbfc6ded..8da444a4 100644 --- a/exercises/practice/binary-search/create_test_table.sql +++ b/exercises/practice/binary-search/create_test_table.sql @@ -1,4 +1,5 @@ DROP TABLE IF EXISTS tests; + CREATE TABLE IF NOT EXISTS tests ( -- uuid and description are taken from the test.toml file uuid TEXT PRIMARY KEY, @@ -10,13 +11,21 @@ CREATE TABLE IF NOT EXISTS tests ( test_code TEXT, task_id INTEGER DEFAULT NULL, -- Here are columns for the actual tests - array TEXT NOT NULL, -- json array + array TEXT NOT NULL, -- json array value INTEGER NOT NULL, expected_result INTEGER, expected_error TEXT ); -INSERT INTO tests (uuid, description, array, value, expected_result, expected_error) +INSERT INTO + tests ( + uuid, + description, + array, + value, + expected_result, + expected_error + ) VALUES ( 'b55c24a9-a98d-4379-a08c-2adcf8ebeee8', diff --git a/exercises/practice/bowling/.meta/example.sql b/exercises/practice/bowling/.meta/example.sql index ab47174c..7e7b0ded 100644 --- a/exercises/practice/bowling/.meta/example.sql +++ b/exercises/practice/bowling/.meta/example.sql @@ -1,164 +1,231 @@ UPDATE bowling - SET error = 'Negative roll is invalid' - WHERE (SELECT 1 - FROM JSON_EACH( - IIF(roll NOTNULL, - JSON_INSERT(previous_rolls, '$[#]', roll), - previous_rolls - ) - ) - WHERE value < 0 - ) - AND error ISNULL -; +SET + error = 'Negative roll is invalid' +WHERE + ( + SELECT + 1 + FROM + JSON_EACH( + IIF( + roll NOTNULL, + JSON_INSERT(previous_rolls, '$[#]', roll), + previous_rolls + ) + ) + WHERE + value < 0 + ) + AND error ISNULL; UPDATE bowling - SET error = 'Pin count exceeds pins on the lane' - WHERE (SELECT 1 - FROM JSON_EACH( - IIF(roll NOTNULL, - JSON_INSERT(previous_rolls, '$[#]', roll), - previous_rolls - ) - ) - WHERE value > 10 - ) - AND error ISNULL -; +SET + error = 'Pin count exceeds pins on the lane' +WHERE + ( + SELECT + 1 + FROM + JSON_EACH( + IIF( + roll NOTNULL, + JSON_INSERT(previous_rolls, '$[#]', roll), + previous_rolls + ) + ) + WHERE + value > 10 + ) + AND error ISNULL; DROP TABLE IF EXISTS tmp; -CREATE TEMPORARY TABLE tmp ( - rolls TEXT PRIMARY KEY, - frames TEXT NOT NULL -); -WITH cte (prevrolls) AS ( - SELECT IIF(roll NOTNULL, - JSON_INSERT(previous_rolls, '$[#]', roll), - previous_rolls - ) - FROM bowling - WHERE error ISNULL -) -INSERT INTO tmp (rolls, frames) -SELECT prevrolls, - (WITH RECURSIVE framer (rolls, frame, frame_id) AS ( - VALUES (prevrolls, '[]', 0) - UNION ALL - SELECT CASE - WHEN JSON_EXTRACT(rolls, '$[0]') = 10 - THEN JSON_REMOVE(rolls, '$[0]') - ELSE JSON_REMOVE(rolls, '$[0]', '$[0]') - END, - CASE - WHEN JSON_EXTRACT(rolls, '$[0]') = 10 THEN - CASE - WHEN frame_id + 1 < 10 - THEN JSON_EXTRACT(rolls, '$[0]', '$[1]', '$[2]') - ELSE JSON_EXTRACT(rolls, '$[0]') - END - WHEN JSON_EXTRACT(rolls, '$[0]') + - JSON_EXTRACT(rolls, '$[1]') = 10 THEN - CASE - WHEN frame_id + 1 < 10 - THEN JSON_EXTRACT(rolls, '$[0]', '$[1]', '$[2]') - ELSE JSON_EXTRACT(rolls, '$[0]', '$[1]') - END - WHEN JSON_EXTRACT(rolls, '$[0]') + - JSON_EXTRACT(rolls, '$[1]') > 10 - THEN JSON_OBJECT('error', 'Pin count exceeds pins on the lane') - ELSE JSON_EXTRACT(rolls, '$[0]', '$[1]') - END, - frame_id + 1 - END - FROM framer - WHERE JSON_TYPE(frame) != 'object' - AND JSON_ARRAY_LENGTH(rolls) > 0 - ) - SELECT JSON_GROUP_ARRAY(JSON(frame)) frames - FROM framer - WHERE frame_id > 0 - ) AS frames - FROM cte -; +CREATE TEMPORARY TABLE tmp (rolls TEXT PRIMARY KEY, frames TEXT NOT NULL); -WITH cte (rolls, error) AS ( - SELECT rolls, JSON_EXTRACT(j.value, '$.error') - FROM tmp, JSON_EACH(frames) j - WHERE type = 'object' -) -UPDATE bowling - SET error = cte.error - FROM cte - WHERE IIF(roll NOTNULL, - JSON_INSERT(previous_rolls, '$[#]', roll), - previous_rolls - ) = cte.rolls - AND bowling.error ISNULL -; +WITH + cte (prevrolls) AS ( + SELECT + IIF( + roll NOTNULL, + JSON_INSERT(previous_rolls, '$[#]', roll), + previous_rolls + ) + FROM + bowling + WHERE + error ISNULL + ) +INSERT INTO + tmp (rolls, frames) +SELECT + prevrolls, + ( + WITH RECURSIVE + framer (rolls, frame, frame_id) AS ( + VALUES + (prevrolls, '[]', 0) + UNION ALL + SELECT + CASE + WHEN JSON_EXTRACT(rolls, '$[0]') = 10 THEN JSON_REMOVE(rolls, '$[0]') + ELSE JSON_REMOVE(rolls, '$[0]', '$[0]') + END, + CASE + WHEN JSON_EXTRACT(rolls, '$[0]') = 10 THEN CASE + WHEN frame_id + 1 < 10 THEN JSON_EXTRACT(rolls, '$[0]', '$[1]', '$[2]') + ELSE JSON_EXTRACT(rolls, '$[0]') + END + WHEN JSON_EXTRACT(rolls, '$[0]') + JSON_EXTRACT(rolls, '$[1]') = 10 THEN CASE + WHEN frame_id + 1 < 10 THEN JSON_EXTRACT(rolls, '$[0]', '$[1]', '$[2]') + ELSE JSON_EXTRACT(rolls, '$[0]', '$[1]') + END + WHEN JSON_EXTRACT(rolls, '$[0]') + JSON_EXTRACT(rolls, '$[1]') > 10 THEN JSON_OBJECT('error', 'Pin count exceeds pins on the lane') + ELSE JSON_EXTRACT(rolls, '$[0]', '$[1]') + END, + frame_id + 1 END + FROM + framer + WHERE + JSON_TYPE(frame) != 'object' + AND JSON_ARRAY_LENGTH(rolls) > 0 + ) + SELECT + JSON_GROUP_ARRAY(JSON(frame)) frames + FROM + framer + WHERE + frame_id > 0 + ) AS frames +FROM + cte; +WITH + cte (rolls, error) AS ( + SELECT + rolls, + JSON_EXTRACT(j.value, '$.error') + FROM + tmp, + JSON_EACH(frames) j + WHERE + type = 'object' + ) UPDATE bowling - SET error = 'Score cannot be taken until the end of the game' - FROM tmp - WHERE IIF(roll NOTNULL, - JSON_INSERT(previous_rolls, '$[#]', roll), - previous_rolls - ) = tmp.rolls - AND roll ISNULL - AND bowling.error ISNULL - AND (JSON_ARRAY_LENGTH(frames) < 10 - OR ( - JSON_EXTRACT(frames, '$[9]') = 10 - AND JSON_ARRAY_LENGTH(frames) < 11 - OR (JSON_EXTRACT(frames, '$[9]', '$[10]') = JSON_ARRAY(10, 10) - AND JSON_ARRAY_LENGTH(frames) < 12) - OR (JSON_EXTRACT(frames, '$[9][0]') + - JSON_EXTRACT(frames, '$[9][1]') = 10 - AND JSON_ARRAY_LENGTH(frames) < 11))) -; +SET + error = cte.error +FROM + cte +WHERE + IIF( + roll NOTNULL, + JSON_INSERT(previous_rolls, '$[#]', roll), + previous_rolls + ) = cte.rolls + AND bowling.error ISNULL; UPDATE bowling - SET error = 'Cannot roll after game is over' - FROM tmp - WHERE IIF(roll NOTNULL, - JSON_INSERT(previous_rolls, '$[#]', roll), - previous_rolls - ) = tmp.rolls - AND bowling.error ISNULL - AND JSON_ARRAY_LENGTH(frames) > 10 - AND ( - (JSON_EXTRACT(frames, '$[9]') != 10 - AND (SELECT SUM(VALUE) - FROM JSON_EACH(JSON_EXTRACT(frames, '$[9]'))) != 10 - ) - OR ( - JSON_EXTRACT(frames, '$[9]') != 10 - AND (SELECT SUM(VALUE) - FROM JSON_EACH(JSON_EXTRACT(frames, '$[9]'))) = 10 - AND JSON_EXTRACT(frames, '$[10][1]') NOTNULL - ) - OR ( - JSON_EXTRACT(frames, '$[9]') = 10 - AND (SELECT SUM(VALUE) - FROM JSON_EACH(JSON_EXTRACT(frames, '$[10]')) - ) < 10 - AND JSON_EXTRACT(frames, '$[11]') NOTNULL - ) - ) -; +SET + error = 'Score cannot be taken until the end of the game' +FROM + tmp +WHERE + IIF( + roll NOTNULL, + JSON_INSERT(previous_rolls, '$[#]', roll), + previous_rolls + ) = tmp.rolls + AND roll ISNULL + AND bowling.error ISNULL + AND ( + JSON_ARRAY_LENGTH(frames) < 10 + OR ( + JSON_EXTRACT(frames, '$[9]') = 10 + AND JSON_ARRAY_LENGTH(frames) < 11 + OR ( + JSON_EXTRACT(frames, '$[9]', '$[10]') = JSON_ARRAY(10, 10) + AND JSON_ARRAY_LENGTH(frames) < 12 + ) + OR ( + JSON_EXTRACT(frames, '$[9][0]') + JSON_EXTRACT(frames, '$[9][1]') = 10 + AND JSON_ARRAY_LENGTH(frames) < 11 + ) + ) + ); -WITH cte (rolls, score) AS ( - SELECT rolls, - (SELECT SUM((SELECT SUM(jb.value) FROM JSON_EACH(ja.value) jb)) - FROM JSON_EACH(frames) ja) - FROM tmp -) UPDATE bowling - SET result = score - FROM cte - WHERE IIF(roll NOTNULL, - JSON_INSERT(previous_rolls, '$[#]', roll), - previous_rolls - ) = cte.rolls +SET + error = 'Cannot roll after game is over' +FROM + tmp +WHERE + IIF( + roll NOTNULL, + JSON_INSERT(previous_rolls, '$[#]', roll), + previous_rolls + ) = tmp.rolls AND bowling.error ISNULL -; + AND JSON_ARRAY_LENGTH(frames) > 10 + AND ( + ( + JSON_EXTRACT(frames, '$[9]') != 10 + AND ( + SELECT + SUM(VALUE) + FROM + JSON_EACH(JSON_EXTRACT(frames, '$[9]')) + ) != 10 + ) + OR ( + JSON_EXTRACT(frames, '$[9]') != 10 + AND ( + SELECT + SUM(VALUE) + FROM + JSON_EACH(JSON_EXTRACT(frames, '$[9]')) + ) = 10 + AND JSON_EXTRACT(frames, '$[10][1]') NOTNULL + ) + OR ( + JSON_EXTRACT(frames, '$[9]') = 10 + AND ( + SELECT + SUM(VALUE) + FROM + JSON_EACH(JSON_EXTRACT(frames, '$[10]')) + ) < 10 + AND JSON_EXTRACT(frames, '$[11]') NOTNULL + ) + ); + +WITH + cte (rolls, score) AS ( + SELECT + rolls, + ( + SELECT + SUM( + ( + SELECT + SUM(jb.value) + FROM + JSON_EACH(ja.value) jb + ) + ) + FROM + JSON_EACH(frames) ja + ) + FROM + tmp + ) +UPDATE bowling +SET + result = score +FROM + cte +WHERE + IIF( + roll NOTNULL, + JSON_INSERT(previous_rolls, '$[#]', roll), + previous_rolls + ) = cte.rolls + AND bowling.error ISNULL; diff --git a/exercises/practice/bowling/.meta/template.create_test_table.j2 b/exercises/practice/bowling/.meta/template.create_test_table.j2 index abe68803..b0a2ad6f 100644 --- a/exercises/practice/bowling/.meta/template.create_test_table.j2 +++ b/exercises/practice/bowling/.meta/template.create_test_table.j2 @@ -1,4 +1,5 @@ DROP TABLE IF EXISTS tests; + CREATE TABLE IF NOT EXISTS tests ( -- uuid and description are taken from the test.toml file uuid TEXT PRIMARY KEY, @@ -16,12 +17,15 @@ CREATE TABLE IF NOT EXISTS tests ( expected_error TEXT ); -INSERT INTO tests (uuid, - description, - previous_rolls, - roll, - expected_result, - expected_error) +INSERT INTO + tests ( + uuid, + description, + previous_rolls, + roll, + expected_result, + expected_error + ) VALUES {%- for case in cases %} ( diff --git a/exercises/practice/bowling/create_test_table.sql b/exercises/practice/bowling/create_test_table.sql index e6824a44..f43ff7f8 100644 --- a/exercises/practice/bowling/create_test_table.sql +++ b/exercises/practice/bowling/create_test_table.sql @@ -1,4 +1,5 @@ DROP TABLE IF EXISTS tests; + CREATE TABLE IF NOT EXISTS tests ( -- uuid and description are taken from the test.toml file uuid TEXT PRIMARY KEY, @@ -16,12 +17,15 @@ CREATE TABLE IF NOT EXISTS tests ( expected_error TEXT ); -INSERT INTO tests (uuid, - description, - previous_rolls, - roll, - expected_result, - expected_error) +INSERT INTO + tests ( + uuid, + description, + previous_rolls, + roll, + expected_result, + expected_error + ) VALUES ( '656ae006-25c2-438c-a549-f338e7ec7441', diff --git a/exercises/practice/perfect-numbers/.meta/template.create_test_table.j2 b/exercises/practice/perfect-numbers/.meta/template.create_test_table.j2 index 6f68f001..95a1fe41 100644 --- a/exercises/practice/perfect-numbers/.meta/template.create_test_table.j2 +++ b/exercises/practice/perfect-numbers/.meta/template.create_test_table.j2 @@ -29,8 +29,7 @@ VALUES ( '{{ case["uuid"] }}', '{{ case["description"] }}', - {{ case["input"]["number"] }}, - + '{{ case["input"]["number"] }}', {%- if not case["expect_error"] %} '{{ case["expected"] }}', {%- else %} diff --git a/exercises/practice/queen-attack/.meta/example.sql b/exercises/practice/queen-attack/.meta/example.sql index 6472c820..cdfc99bc 100644 --- a/exercises/practice/queen-attack/.meta/example.sql +++ b/exercises/practice/queen-attack/.meta/example.sql @@ -1,55 +1,106 @@ UPDATE "queen-attack" - SET error = - CASE - WHEN white_row < 0 OR black_row < 0 THEN 'row not positive' - WHEN white_row > 7 OR black_row > 7 THEN 'row not on board' - WHEN white_col < 0 OR black_col < 0 THEN 'column not positive' - WHEN white_col > 7 OR black_col > 7 THEN 'column not on board' - END -; +SET + error = CASE + WHEN white_row < 0 + OR black_row < 0 THEN 'row not positive' + WHEN white_row > 7 + OR black_row > 7 THEN 'row not on board' + WHEN white_col < 0 + OR black_col < 0 THEN 'column not positive' + WHEN white_col > 7 + OR black_col > 7 THEN 'column not on board' + END; UPDATE "queen-attack" - SET result = ( - WITH - seq AS (SELECT value FROM GENERATE_SERIES(0, 7)), - positions (row, col) AS ( - SELECT white_row, value FROM seq +SET + result = ( + WITH + seq AS ( + SELECT + value + FROM + GENERATE_SERIES (0, 7) + ), + positions (row, col) AS ( + SELECT + white_row, + value + FROM + seq UNION - SELECT value, white_col FROM seq + SELECT + value, + white_col + FROM + seq UNION - SELECT white_row - value AS r, white_col - value AS c - FROM seq - WHERE r >= 0 AND c >= 0 + SELECT + white_row - value AS r, + white_col - value AS c + FROM + seq + WHERE + r >= 0 + AND c >= 0 UNION - SELECT white_row + value AS r, white_col + value AS c - FROM seq - WHERE r <= 7 AND c <= 7 + SELECT + white_row + value AS r, + white_col + value AS c + FROM + seq + WHERE + r <= 7 + AND c <= 7 UNION - SELECT white_row - value AS r, white_col - value AS c - FROM seq - WHERE r >= 0 AND c >= 0 + SELECT + white_row - value AS r, + white_col - value AS c + FROM + seq + WHERE + r >= 0 + AND c >= 0 UNION - SELECT white_row + value AS r, white_col + value AS c - FROM seq - WHERE r <= 7 AND c <= 7 + SELECT + white_row + value AS r, + white_col + value AS c + FROM + seq + WHERE + r <= 7 + AND c <= 7 UNION - SELECT white_row + value AS r, white_col - value AS c - FROM seq - WHERE r <= 7 AND c >= 0 + SELECT + white_row + value AS r, + white_col - value AS c + FROM + seq + WHERE + r <= 7 + AND c >= 0 UNION - SELECT white_row - value AS r, white_col + value AS c - FROM seq - WHERE r >= 0 AND c <= 7 - ) - SELECT - COALESCE( - (SELECT TRUE - FROM positions - WHERE row = black_row - AND col = black_col - ), - FALSE - ) - ) - WHERE error ISNULL -; + SELECT + white_row - value AS r, + white_col + value AS c + FROM + seq + WHERE + r >= 0 + AND c <= 7 + ) + SELECT + COALESCE( + ( + SELECT + TRUE + FROM + positions + WHERE + row = black_row + AND col = black_col + ), + FALSE + ) + ) +WHERE + error ISNULL; diff --git a/exercises/practice/queen-attack/create_test_table.sql b/exercises/practice/queen-attack/create_test_table.sql index 52c03426..ea37c426 100644 --- a/exercises/practice/queen-attack/create_test_table.sql +++ b/exercises/practice/queen-attack/create_test_table.sql @@ -1,4 +1,5 @@ DROP TABLE IF EXISTS tests; + CREATE TABLE IF NOT EXISTS tests ( -- uuid and description are taken from the test.toml file uuid TEXT PRIMARY KEY, @@ -18,27 +19,145 @@ CREATE TABLE IF NOT EXISTS tests ( expected_error TEXT ); -INSERT INTO tests ( - uuid , - description , - white_row , - white_col , - black_row , - black_col , - expected_result, - expected_error -) +INSERT INTO + tests ( + uuid, + description, + white_row, + white_col, + black_row, + black_col, + expected_result, + expected_error + ) VALUES -('3ac4f735-d36c-44c4-a3e2-316f79704203', 'queen with a valid position', 2, 2, 2, 2, 1, NULL), -('4e812d5d-b974-4e38-9a6b-8e0492bfa7be', 'queen must have positive row', -2, 2, -2, 2, NULL, 'row not positive'), -('f07b7536-b66b-4f08-beb9-4d70d891d5c8', 'queen must have row on board', 8, 4, 8, 4, NULL, 'row not on board'), -('15a10794-36d9-4907-ae6b-e5a0d4c54ebe', 'queen must have positive column', 2, -2, 2, -2, NULL, 'column not positive'), -('6907762d-0e8a-4c38-87fb-12f2f65f0ce4', 'queen must have column on board', 4, 8, 4, 8, NULL, 'column not on board'), -('33ae4113-d237-42ee-bac1-e1e699c0c007', 'cannot attack', 2, 4, 6, 6, 0, NULL), -('eaa65540-ea7c-4152-8c21-003c7a68c914', 'can attack on same row', 2, 4, 2, 6, 1, NULL), -('bae6f609-2c0e-4154-af71-af82b7c31cea', 'can attack on same column', 4, 5, 2, 5, 1, NULL), -('0e1b4139-b90d-4562-bd58-dfa04f1746c7', 'can attack on first diagonal', 2, 2, 0, 4, 1, NULL), -('ff9b7ed4-e4b6-401b-8d16-bc894d6d3dcd', 'can attack on second diagonal', 2, 2, 3, 1, 1, NULL), -('0a71e605-6e28-4cc2-aa47-d20a2e71037a', 'can attack on third diagonal', 2, 2, 1, 1, 1, NULL), -('0790b588-ae73-4f1f-a968-dd0b34f45f86', 'can attack on fourth diagonal', 1, 7, 0, 6, 1, NULL), -('543f8fd4-2597-4aad-8d77-cbdab63619f8', 'cannot attack if falling diagonals are only the same when reflected across the longest falling diagonal', 4, 1, 2, 5, 0, NULL); + ( + '3ac4f735-d36c-44c4-a3e2-316f79704203', + 'queen with a valid position', + 2, + 2, + 2, + 2, + 1, + NULL + ), + ( + '4e812d5d-b974-4e38-9a6b-8e0492bfa7be', + 'queen must have positive row', + -2, + 2, + -2, + 2, + NULL, + 'row not positive' + ), + ( + 'f07b7536-b66b-4f08-beb9-4d70d891d5c8', + 'queen must have row on board', + 8, + 4, + 8, + 4, + NULL, + 'row not on board' + ), + ( + '15a10794-36d9-4907-ae6b-e5a0d4c54ebe', + 'queen must have positive column', + 2, + -2, + 2, + -2, + NULL, + 'column not positive' + ), + ( + '6907762d-0e8a-4c38-87fb-12f2f65f0ce4', + 'queen must have column on board', + 4, + 8, + 4, + 8, + NULL, + 'column not on board' + ), + ( + '33ae4113-d237-42ee-bac1-e1e699c0c007', + 'cannot attack', + 2, + 4, + 6, + 6, + 0, + NULL + ), + ( + 'eaa65540-ea7c-4152-8c21-003c7a68c914', + 'can attack on same row', + 2, + 4, + 2, + 6, + 1, + NULL + ), + ( + 'bae6f609-2c0e-4154-af71-af82b7c31cea', + 'can attack on same column', + 4, + 5, + 2, + 5, + 1, + NULL + ), + ( + '0e1b4139-b90d-4562-bd58-dfa04f1746c7', + 'can attack on first diagonal', + 2, + 2, + 0, + 4, + 1, + NULL + ), + ( + 'ff9b7ed4-e4b6-401b-8d16-bc894d6d3dcd', + 'can attack on second diagonal', + 2, + 2, + 3, + 1, + 1, + NULL + ), + ( + '0a71e605-6e28-4cc2-aa47-d20a2e71037a', + 'can attack on third diagonal', + 2, + 2, + 1, + 1, + 1, + NULL + ), + ( + '0790b588-ae73-4f1f-a968-dd0b34f45f86', + 'can attack on fourth diagonal', + 1, + 7, + 0, + 6, + 1, + NULL + ), + ( + '543f8fd4-2597-4aad-8d77-cbdab63619f8', + 'cannot attack if falling diagonals are only the same when reflected across the longest falling diagonal', + 4, + 1, + 2, + 5, + 0, + NULL + ); diff --git a/exercises/practice/rail-fence-cipher/.meta/example.sql b/exercises/practice/rail-fence-cipher/.meta/example.sql index ed924a84..d516966f 100644 --- a/exercises/practice/rail-fence-cipher/.meta/example.sql +++ b/exercises/practice/rail-fence-cipher/.meta/example.sql @@ -1,149 +1,239 @@ DROP TABLE IF EXISTS tmp; + CREATE TEMPORARY TABLE tmp ( - msg TEXT NOT NULL, - rails INTEGER NOT NULL, - fence TEXT NOT NULL, - to_enc TEXT , + msg TEXT NOT NULL, + rails INTEGER NOT NULL, + fence TEXT NOT NULL, + to_enc TEXT, to_dec TEXT ); -WITH cte AS ( - SELECT msg, - rails, - (WITH RECURSIVE - gen_matrix (rowid, colid, maxrow, maxcol, fill, matrix) AS ( - VALUES (0, 0, rails - 1, LENGTH(msg) - 1, NULL, '[[]]') - UNION ALL - SELECT IIF(colid = maxcol, rowid + 1, rowid), - IIF(colid = maxcol, 0, colid + 1), - maxrow, - maxcol, - fill, - JSON_INSERT(matrix, PRINTF('$[%d][%d]', rowid, colid), fill) - FROM gen_matrix - WHERE rowid <= maxrow - ) - SELECT matrix - FROM gen_matrix - ORDER BY rowid DESC, colid DESC - LIMIT 1 - ) AS fence - FROM "rail-fence-cipher" -) -INSERT INTO tmp (msg, rails, fence) -SELECT msg, rails, fence - FROM cte -; -WITH cte AS ( -SELECT msg, - rails, - (WITH cte AS ( - WITH RECURSIVE - rcte (strlen, nrails, flow, row, col, matrix, to_enc) AS ( - VALUES (LENGTH(msg), rails,'D', 0, 0, fence, '[]') - UNION ALL - SELECT strlen, - nrails, - -- CASE row - -- WHEN 2 THEN 'U' - -- WHEN 0 THEN 'D' - -- ELSE flow - -- END, - -- IIF(row > 0 AND (row % (nrails - 1) = 0 OR flow = 'U'), - -- row - 1, - -- row + 1 - -- ), - CASE - WHEN row = nrails - 2 THEN 'U' - WHEN row = 0 THEN 'D' - ELSE flow - END, - IIF(flow = 'U' AND row > 0, - row - 1, - row + 1 - ), - col + 1, - JSON_SET(matrix, PRINTF('$[%d][%d]', row, col), '?'), - JSON_INSERT(to_enc, '$[#]', PRINTF('$[%d][%d]', row, col)) - FROM rcte - WHERE col < strlen - ) - SELECT matrix, to_enc - FROM rcte - ORDER BY col DESC - LIMIT 1 - ) - SELECT - JSON_OBJECT( - 'matrix', JSON(matrix), - 'to_enc', JSON(to_enc), - 'to_dec', ( - WITH jrows (jkey, jrow) AS ( - SELECT key, VALUE FROM cte, JSON_EACH(matrix) - ) - SELECT JSON_GROUP_ARRAY(PRINTF('$[%d][%d]', jkey, j.key)) to_dec - FROM jrows, JSON_EACH(jrow) j - WHERE j.value = '?' - ) - ) jobj - FROM cte - ) AS jobj - FROM tmp -) -UPDATE tmp - SET fence = JSON_EXTRACT(jobj, '$.matrix'), - to_enc = JSON_EXTRACT(jobj, '$.to_enc'), - to_dec = JSON_EXTRACT(jobj, '$.to_dec') - FROM cte - WHERE tmp.msg = cte.msg - AND tmp.rails = cte.rails -; +WITH + cte AS ( + SELECT + msg, + rails, + ( + WITH RECURSIVE + gen_matrix (rowid, colid, maxrow, maxcol, fill, matrix) AS ( + VALUES + (0, 0, rails - 1, LENGTH(msg) - 1, NULL, '[[]]') + UNION ALL + SELECT + IIF(colid = maxcol, rowid + 1, rowid), + IIF(colid = maxcol, 0, colid + 1), + maxrow, + maxcol, + fill, + JSON_INSERT(matrix, PRINTF('$[%d][%d]', rowid, colid), fill) + FROM + gen_matrix + WHERE + rowid <= maxrow + ) + SELECT + matrix + FROM + gen_matrix + ORDER BY + rowid DESC, + colid DESC + LIMIT + 1 + ) AS fence + FROM + "rail-fence-cipher" + ) +INSERT INTO + tmp (msg, rails, fence) +SELECT + msg, + rails, + fence +FROM + cte; -WITH cipher AS ( -SELECT tmp.msg, - tmp.rails, - (WITH +WITH + cte AS ( + SELECT + msg, + rails, + ( + WITH cte AS ( - WITH RECURSIVE rcte (string, paths, matrix) AS ( - VALUES (msg, IIF(property = 'encode', to_enc, to_dec), fence) - UNION ALL - SELECT SUBSTR(string, 2), - JSON_REMOVE(paths, '$[0]'), - JSON_SET( - matrix, - JSON_EXTRACT(paths, '$[0]'), - SUBSTR(string, 1, 1) + WITH RECURSIVE + rcte (strlen, nrails, flow, row, col, matrix, to_enc) AS ( + VALUES + (LENGTH(msg), rails, 'D', 0, 0, fence, '[]') + UNION ALL + SELECT + strlen, + nrails, + -- CASE row + -- WHEN 2 THEN 'U' + -- WHEN 0 THEN 'D' + -- ELSE flow + -- END, + -- IIF(row > 0 AND (row % (nrails - 1) = 0 OR flow = 'U'), + -- row - 1, + -- row + 1 + -- ), + CASE + WHEN row = nrails - 2 THEN 'U' + WHEN row = 0 THEN 'D' + ELSE flow + END, + IIF( + flow = 'U' + AND row > 0, + row - 1, + row + 1 + ), + col + 1, + JSON_SET(matrix, PRINTF('$[%d][%d]', row, col), '?'), + JSON_INSERT(to_enc, '$[#]', PRINTF('$[%d][%d]', row, col)) + FROM + rcte + WHERE + col < strlen ) - FROM rcte - WHERE string <> '' + SELECT + matrix, + to_enc + FROM + rcte + ORDER BY + col DESC + LIMIT + 1 + ) + SELECT + JSON_OBJECT( + 'matrix', + JSON(matrix), + 'to_enc', + JSON(to_enc), + 'to_dec', + ( + WITH + jrows (jkey, jrow) AS ( + SELECT + key, + VALUE + FROM + cte, + JSON_EACH(matrix) + ) + SELECT + JSON_GROUP_ARRAY(PRINTF('$[%d][%d]', jkey, j.key)) to_dec + FROM + jrows, + JSON_EACH(jrow) j + WHERE + j.value = '?' ) - SELECT matrix - FROM rcte - ORDER BY LENGTH(string) - LIMIT 1 + ) jobj + FROM + cte + ) AS jobj + FROM + tmp + ) +UPDATE tmp +SET + fence = JSON_EXTRACT(jobj, '$.matrix'), + to_enc = JSON_EXTRACT(jobj, '$.to_enc'), + to_dec = JSON_EXTRACT(jobj, '$.to_dec') +FROM + cte +WHERE + tmp.msg = cte.msg + AND tmp.rails = cte.rails; + +WITH + cipher AS ( + SELECT + tmp.msg, + tmp.rails, + ( + WITH + cte AS ( + WITH RECURSIVE + rcte (string, paths, matrix) AS ( + VALUES + ( + msg, + IIF(property = 'encode', to_enc, to_dec), + fence + ) + UNION ALL + SELECT + SUBSTR(string, 2), + JSON_REMOVE(paths, '$[0]'), + JSON_SET( + matrix, + JSON_EXTRACT(paths, '$[0]'), + SUBSTR(string, 1, 1) + ) + FROM + rcte + WHERE + string <> '' + ) + SELECT + matrix + FROM + rcte + ORDER BY + LENGTH(string) + LIMIT + 1 ), join_row_encode (string) AS ( - SELECT (SELECT GROUP_CONCAT(jb.VALUE, '') - FROM JSON_EACH(ja.VALUE) jb - ) - FROM cte, JSON_EACH(matrix) ja + SELECT + ( + SELECT + GROUP_CONCAT(jb.VALUE, '') + FROM + JSON_EACH(ja.VALUE) jb + ) + FROM + cte, + JSON_EACH(matrix) ja ), join_row_decode (string) AS ( - SELECT JSON_EXTRACT(matrix, j.value) AS chr - FROM cte, JSON_EACH(to_enc) j + SELECT + JSON_EXTRACT(matrix, j.value) AS chr + FROM + cte, + JSON_EACH(to_enc) j + ) + SELECT + IIF( + property = 'encode', + ( + SELECT + GROUP_CONCAT(string, '') + FROM + join_row_encode + ), + ( + SELECT + GROUP_CONCAT(string, '') + FROM + join_row_decode ) - SELECT - IIF( - property = 'encode', - (SELECT GROUP_CONCAT(string, '') FROM join_row_encode), - (SELECT GROUP_CONCAT(string, '') FROM join_row_decode) - ) - ) AS result - FROM "rail-fence-cipher" JOIN tmp USING (msg, rails) -) + ) + ) AS result + FROM + "rail-fence-cipher" + JOIN tmp USING (msg, rails) + ) UPDATE "rail-fence-cipher" - SET result = cipher.result - FROM cipher - WHERE "rail-fence-cipher".msg = cipher.msg - AND "rail-fence-cipher".rails = cipher.rails -; +SET + result = cipher.result +FROM + cipher +WHERE + "rail-fence-cipher".msg = cipher.msg + AND "rail-fence-cipher".rails = cipher.rails; diff --git a/exercises/practice/rail-fence-cipher/.meta/template.create_test_table.j2 b/exercises/practice/rail-fence-cipher/.meta/template.create_test_table.j2 index 5193f9b7..5b80633a 100644 --- a/exercises/practice/rail-fence-cipher/.meta/template.create_test_table.j2 +++ b/exercises/practice/rail-fence-cipher/.meta/template.create_test_table.j2 @@ -1,4 +1,5 @@ DROP TABLE IF EXISTS tests; + CREATE TABLE IF NOT EXISTS tests ( -- uuid and description are taken from the test.toml file uuid TEXT PRIMARY KEY, @@ -16,7 +17,8 @@ CREATE TABLE IF NOT EXISTS tests ( expected TEXT NOT NULL ); -INSERT INTO tests (uuid, description, property, msg, rails, expected) +INSERT INTO + tests (uuid, description, property, msg, rails, expected) VALUES {%- for case in cases %} ( diff --git a/exercises/practice/rail-fence-cipher/create_test_table.sql b/exercises/practice/rail-fence-cipher/create_test_table.sql index 035b977a..b1222b8b 100644 --- a/exercises/practice/rail-fence-cipher/create_test_table.sql +++ b/exercises/practice/rail-fence-cipher/create_test_table.sql @@ -1,4 +1,5 @@ DROP TABLE IF EXISTS tests; + CREATE TABLE IF NOT EXISTS tests ( -- uuid and description are taken from the test.toml file uuid TEXT PRIMARY KEY, @@ -16,7 +17,8 @@ CREATE TABLE IF NOT EXISTS tests ( expected TEXT NOT NULL ); -INSERT INTO tests (uuid, description, property, msg, rails, expected) +INSERT INTO + tests (uuid, description, property, msg, rails, expected) VALUES ( '46dc5c50-5538-401d-93a5-41102680d068', diff --git a/exercises/practice/rest-api/.meta/example.sql b/exercises/practice/rest-api/.meta/example.sql index 7e432043..ebc54910 100644 --- a/exercises/practice/rest-api/.meta/example.sql +++ b/exercises/practice/rest-api/.meta/example.sql @@ -7,9 +7,7 @@ SET IIF( json_type(DB.value) IS NULL, json_array(), - json_array( - json(DB.value) - ) + json_array(json(DB.value)) ) ) FROM diff --git a/exercises/practice/sieve/.meta/example.sql b/exercises/practice/sieve/.meta/example.sql index eafc9c13..538bac8d 100644 --- a/exercises/practice/sieve/.meta/example.sql +++ b/exercises/practice/sieve/.meta/example.sql @@ -1,53 +1,92 @@ -WITH results ("limit", primes) AS ( -SELECT - "limit", - (WITH - cte AS ( - SELECT (SELECT JSON_GROUP_ARRAY(JSON_ARRAY(g.value, NULL)) - FROM GENERATE_SERIES(2, "limit") g) numbers - ) - SELECT - (WITH RECURSIVE rcte (matrix) AS ( - VALUES (numbers) - UNION ALL - SELECT - (WITH first_unmarked (prime) AS ( - SELECT JSON_EXTRACT(value, '$[0]') - FROM JSON_EACH(matrix) - WHERE JSON_EXTRACT(value, '$[1]') ISNULL - LIMIT 1 +WITH + results ("limit", primes) AS ( + SELECT + "limit", + ( + WITH + cte AS ( + SELECT + ( + SELECT + JSON_GROUP_ARRAY(JSON_ARRAY(g.value, NULL)) + FROM + GENERATE_SERIES (2, "limit") g + ) numbers + ) + SELECT + ( + WITH RECURSIVE + rcte (matrix) AS ( + VALUES + (numbers) + UNION ALL + SELECT + ( + WITH + first_unmarked (prime) AS ( + SELECT + JSON_EXTRACT(value, '$[0]') + FROM + JSON_EACH(matrix) + WHERE + JSON_EXTRACT(value, '$[1]') ISNULL + LIMIT + 1 + ) + SELECT + JSON_GROUP_ARRAY( + CASE + WHEN JSON_EXTRACT(j.value, '$[0]') = prime THEN JSON_SET(j.value, '$[1]', JSON('true')) + WHEN JSON_EXTRACT(j.value, '$[1]') ISNULL + AND JSON_EXTRACT(j.value, '$[0]') % prime = 0 THEN JSON_SET(j.value, '$[1]', JSON('false')) + ELSE j.value + END + ) + FROM + first_unmarked, + JSON_EACH(matrix) j + ) + FROM + rcte + WHERE + ( + SELECT + 1 + FROM + JSON_EACH(matrix) + WHERE + JSON_EXTRACT(value, '$[1]') ISNULL + ) + ) + SELECT + COALESCE( + GROUP_CONCAT(JSON_EXTRACT(j.value, '$[0]'), ', '), + '' + ) + FROM + rcte, + JSON_EACH(matrix) j + WHERE + ( + SELECT + COUNT(*) = 0 + FROM + JSON_EACH(matrix) + WHERE + JSON_EXTRACT(value, '$[1]') ISNULL + ) + AND JSON_EXTRACT(j.value, '$[1]') + ) + FROM + cte ) - SELECT - JSON_GROUP_ARRAY( - CASE - WHEN JSON_EXTRACT(j.value, '$[0]') = prime - THEN JSON_SET(j.value, '$[1]', JSON('true')) - WHEN JSON_EXTRACT(j.value, '$[1]') ISNULL AND - JSON_EXTRACT(j.value, '$[0]') % prime = 0 - THEN JSON_SET(j.value, '$[1]', JSON('false')) - ELSE j.value - END - ) - FROM first_unmarked, JSON_EACH(matrix) j - ) - FROM rcte - WHERE (SELECT 1 - FROM JSON_EACH(matrix) - WHERE JSON_EXTRACT(value, '$[1]') ISNULL) - ) - SELECT COALESCE(GROUP_CONCAT(JSON_EXTRACT(j.value, '$[0]'), ', '), '') - FROM rcte, JSON_EACH(matrix) j - WHERE (SELECT COUNT(*) = 0 - FROM JSON_EACH(matrix) - WHERE JSON_EXTRACT(value, '$[1]') ISNULL) - AND JSON_EXTRACT(j.value, '$[1]') - ) - FROM cte + FROM + sieve ) - FROM sieve -) UPDATE sieve - SET result = primes - FROM results - WHERE sieve."limit" = results."limit" -; +SET + result = primes +FROM + results +WHERE + sieve."limit" = results."limit"; diff --git a/exercises/practice/sieve/.meta/template.create_test_table.j2 b/exercises/practice/sieve/.meta/template.create_test_table.j2 index 89700b1b..120509e6 100644 --- a/exercises/practice/sieve/.meta/template.create_test_table.j2 +++ b/exercises/practice/sieve/.meta/template.create_test_table.j2 @@ -14,7 +14,8 @@ CREATE TABLE IF NOT EXISTS tests ( expected TEXT NOT NULL ); -INSERT INTO tests (uuid, description, "limit", expected) +INSERT INTO + tests (uuid, description, "limit", expected) VALUES {%- for case in cases %} ( diff --git a/exercises/practice/sieve/create_test_table.sql b/exercises/practice/sieve/create_test_table.sql index 66d8f649..b6ce50c3 100644 --- a/exercises/practice/sieve/create_test_table.sql +++ b/exercises/practice/sieve/create_test_table.sql @@ -14,7 +14,8 @@ CREATE TABLE IF NOT EXISTS tests ( expected TEXT NOT NULL ); -INSERT INTO tests (uuid, description, "limit", expected) +INSERT INTO + tests (uuid, description, "limit", expected) VALUES ( '88529125-c4ce-43cc-bb36-1eb4ddd7b44f',