Skip to content

Commit 0954868

Browse files
committed
fixtures
1 parent 413a0fa commit 0954868

File tree

5 files changed

+316
-167
lines changed

5 files changed

+316
-167
lines changed

__fixtures__/generated/generated.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
"pretty/misc-4.sql": "SELECT p.id, p.title,\n CASE\n WHEN EXISTS (\n SELECT 1 FROM reviews r\n WHERE r.product_id = p.id AND r.rating >= 4\n ) THEN 'Popular'\n ELSE 'Unrated'\n END AS status\nFROM products p\nWHERE p.archived = false",
1212
"pretty/misc-5.sql": "WITH logs AS (\n SELECT id, payload::json->>'event' AS event, (payload::json->>'ts')::timestamp AS ts\n FROM event_log\n WHERE ts > NOW() - INTERVAL '7 days'\n)\nSELECT event, COUNT(*) AS freq\nFROM (\n SELECT DISTINCT event, ts::date AS event_day\n FROM logs\n) d\nGROUP BY event\nORDER BY freq DESC",
1313
"pretty/misc-6.sql": "SELECT \n o.id AS order_id,\n u.name AS user_name,\n p.name AS product_name,\n s.status,\n sh.shipped_at,\n r.refund_amount\nFROM orders o\nJOIN users u \n ON o.user_id = u.id\nJOIN order_items oi \n ON oi.order_id = o.id\nJOIN products p \n ON (\n (p.id = oi.product_id AND p.available = true)\n OR \n (p.sku = oi.product_sku AND (p.discontinued = false OR p.replacement_id IS NOT NULL))\n )\nLEFT JOIN shipping sh \n ON (\n sh.order_id = o.id \n AND (\n (sh.carrier = 'UPS' AND sh.tracking_number IS NOT NULL)\n OR \n (sh.carrier = 'FedEx' AND sh.shipped_at > o.created_at + INTERVAL '1 day')\n )\n )\nLEFT JOIN statuses s \n ON s.id = o.status_id \n AND (\n s.name != 'cancelled'\n OR (s.name = 'cancelled' AND s.updated_at > NOW() - INTERVAL '7 days')\n )\nLEFT JOIN refunds r \n ON r.order_id = o.id \n AND (\n (r.status = 'approved' AND r.processed_at IS NOT NULL)\n OR \n (r.status = 'pending' AND r.requested_at < NOW() - INTERVAL '14 days')\n )\nWHERE o.created_at > NOW() - INTERVAL '90 days'\n AND u.active = true\n AND (\n s.status = 'shipped' \n OR (\n s.status = 'processing' \n AND EXISTS (\n SELECT 1 FROM order_notes n WHERE n.order_id = o.id AND n.note ILIKE '%expedite%'\n )\n )\n )\nORDER BY o.created_at DESC",
14+
"pretty/misc-7.sql": "select (CASE \nWHEN ( n = 2 ) THEN ARRAY[ 'month' ]\nWHEN ( n = 4 ) THEN ARRAY[ 'year' ]\nWHEN ( n = 6 ) THEN ARRAY[ 'year', 'month' ]\nWHEN ( n = 8 ) THEN ARRAY[ 'day' ]\nWHEN ( n = 1024 ) THEN ARRAY[ 'hour' ]\nWHEN ( n = 1032 ) THEN ARRAY[ 'day', 'hour' ]\nWHEN ( n = 2048 ) THEN ARRAY[ 'minute' ]\nWHEN ( n = 3072 ) THEN ARRAY[ 'hour', 'minute' ]\nWHEN ( n = 3080 ) THEN ARRAY[ 'day', 'minute' ]\nWHEN ( n = 4096 ) THEN ARRAY[ 'second' ]\nWHEN ( n = 6144 ) THEN ARRAY[ 'minute', 'second' ]\nWHEN ( n = 7168 ) THEN ARRAY[ 'hour', 'second' ]\nWHEN ( n = 7176 ) THEN ARRAY[ 'day', 'second' ]\nWHEN ( n = 32767 ) THEN ARRAY[]::text[]\nEND)",
15+
"pretty/misc-8.sql": "SELECT (\n CASE \n WHEN n = 2 OR n = 3 THEN ARRAY['month', COALESCE(extra_label, 'unknown')]\n WHEN n IN (4, 5) THEN \n CASE \n WHEN is_leap_year THEN ARRAY['year', 'leap']\n ELSE ARRAY['year']\n END\n WHEN n = 6 THEN ARRAY['year', 'month', 'quarter']\n WHEN n = 8 THEN ARRAY['day', 'week', compute_label(n)]\n WHEN n = 1024 THEN ARRAY['hour', format('%s-hour', extra_label)]\n WHEN n = 1032 AND flag = true THEN ARRAY['day', 'hour', 'flagged']\n WHEN n BETWEEN 2048 AND 2049 THEN ARRAY['minute', 'tick']\n WHEN n = 3072 THEN ARRAY['hour', 'minute', current_setting('timezone')]\n WHEN n = 3080 THEN ARRAY['day', 'minute', to_char(now(), 'HH24:MI')]\n WHEN n IN (4096, 4097, 4098) THEN ARRAY['second', 'millisecond']\n WHEN n = 6144 THEN ARRAY['minute', 'second', CASE WHEN use_micro = true THEN 'microsecond' ELSE 'none' END]\n WHEN n = 7168 OR (n > 7170 AND n < 7180) THEN ARRAY['hour', 'second', 'buffered']\n WHEN n = 7176 THEN ARRAY['day', 'second', extra_info::text]\n WHEN n = 32767 THEN ARRAY[]::text[]\n ELSE ARRAY['undefined', 'unknown', 'fallback']\n END\n)",
16+
"pretty/misc-9.sql": "SELECT \n user_id,\n (CASE \n WHEN EXISTS (SELECT 1 FROM logins WHERE logins.user_id = users.user_id AND success = false) \n THEN 'risky'\n ELSE 'safe'\n END) AS risk_status\nFROM users",
17+
"pretty/misc-10.sql": "SELECT * \nFROM orders\nWHERE \n status = (CASE \n WHEN shipped_at IS NOT NULL THEN 'shipped'\n WHEN canceled_at IS NOT NULL THEN 'canceled'\n ELSE 'processing'\n END)",
18+
"pretty/misc-11.sql": "SELECT *\nFROM users u,\nLATERAL (\n SELECT \n (CASE \n WHEN u.is_admin THEN 'admin_dashboard'\n ELSE 'user_dashboard'\n END) AS dashboard_view\n) AS derived",
19+
"pretty/misc-12.sql": "SELECT \n id,\n (SELECT \n CASE \n WHEN COUNT(*) > 5 THEN 'frequent'\n ELSE 'occasional'\n END\n FROM purchases p WHERE p.user_id = u.id) AS purchase_freq\nFROM users u",
20+
"pretty/misc-13.sql": "SELECT \n id,\n CASE \n WHEN rank() OVER (ORDER BY score DESC) = 1 THEN 'top'\n ELSE 'normal'\n END AS tier\nFROM players",
1421
"pretty/create_table-1.sql": "CREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name TEXT NOT NULL,\n email TEXT UNIQUE\n)",
1522
"pretty/create_table-2.sql": "CREATE TABLE products (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n price DECIMAL(10,2) CHECK (price > 0),\n category_id INTEGER,\n description TEXT,\n created_at TIMESTAMP DEFAULT now(),\n updated_at TIMESTAMP,\n UNIQUE (name, category_id),\n FOREIGN KEY (category_id) REFERENCES categories(id)\n)",
1623
"pretty/create_table-3.sql": "CREATE TABLE orders (\n id SERIAL PRIMARY KEY,\n subtotal DECIMAL(10,2) NOT NULL,\n tax_rate DECIMAL(5,4) DEFAULT 0.0825,\n tax_amount DECIMAL(10,2) GENERATED ALWAYS AS (subtotal * tax_rate) STORED,\n total DECIMAL(10,2) GENERATED ALWAYS AS (subtotal + tax_amount) STORED\n)",

__fixtures__/kitchen-sink/pretty/misc.sql

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,105 @@ WHERE o.created_at > NOW() - INTERVAL '90 days'
110110
)
111111
)
112112
ORDER BY o.created_at DESC;
113+
114+
-- 7. A case
115+
116+
select (CASE
117+
WHEN ( n = 2 ) THEN ARRAY[ 'month' ]
118+
WHEN ( n = 4 ) THEN ARRAY[ 'year' ]
119+
WHEN ( n = 6 ) THEN ARRAY[ 'year', 'month' ]
120+
WHEN ( n = 8 ) THEN ARRAY[ 'day' ]
121+
WHEN ( n = 1024 ) THEN ARRAY[ 'hour' ]
122+
WHEN ( n = 1032 ) THEN ARRAY[ 'day', 'hour' ]
123+
WHEN ( n = 2048 ) THEN ARRAY[ 'minute' ]
124+
WHEN ( n = 3072 ) THEN ARRAY[ 'hour', 'minute' ]
125+
WHEN ( n = 3080 ) THEN ARRAY[ 'day', 'minute' ]
126+
WHEN ( n = 4096 ) THEN ARRAY[ 'second' ]
127+
WHEN ( n = 6144 ) THEN ARRAY[ 'minute', 'second' ]
128+
WHEN ( n = 7168 ) THEN ARRAY[ 'hour', 'second' ]
129+
WHEN ( n = 7176 ) THEN ARRAY[ 'day', 'second' ]
130+
WHEN ( n = 32767 ) THEN ARRAY[]::text[]
131+
END);
132+
133+
-- 8. A case
134+
135+
SELECT (
136+
CASE
137+
WHEN n = 2 OR n = 3 THEN ARRAY['month', COALESCE(extra_label, 'unknown')]
138+
WHEN n IN (4, 5) THEN
139+
CASE
140+
WHEN is_leap_year THEN ARRAY['year', 'leap']
141+
ELSE ARRAY['year']
142+
END
143+
WHEN n = 6 THEN ARRAY['year', 'month', 'quarter']
144+
WHEN n = 8 THEN ARRAY['day', 'week', compute_label(n)]
145+
WHEN n = 1024 THEN ARRAY['hour', format('%s-hour', extra_label)]
146+
WHEN n = 1032 AND flag = true THEN ARRAY['day', 'hour', 'flagged']
147+
WHEN n BETWEEN 2048 AND 2049 THEN ARRAY['minute', 'tick']
148+
WHEN n = 3072 THEN ARRAY['hour', 'minute', current_setting('timezone')]
149+
WHEN n = 3080 THEN ARRAY['day', 'minute', to_char(now(), 'HH24:MI')]
150+
WHEN n IN (4096, 4097, 4098) THEN ARRAY['second', 'millisecond']
151+
WHEN n = 6144 THEN ARRAY['minute', 'second', CASE WHEN use_micro = true THEN 'microsecond' ELSE 'none' END]
152+
WHEN n = 7168 OR (n > 7170 AND n < 7180) THEN ARRAY['hour', 'second', 'buffered']
153+
WHEN n = 7176 THEN ARRAY['day', 'second', extra_info::text]
154+
WHEN n = 32767 THEN ARRAY[]::text[]
155+
ELSE ARRAY['undefined', 'unknown', 'fallback']
156+
END
157+
);
158+
159+
160+
-- 9. A case with select
161+
162+
SELECT
163+
user_id,
164+
(CASE
165+
WHEN EXISTS (SELECT 1 FROM logins WHERE logins.user_id = users.user_id AND success = false)
166+
THEN 'risky'
167+
ELSE 'safe'
168+
END) AS risk_status
169+
FROM users;
170+
171+
-- 10. A case in where clause
172+
173+
SELECT *
174+
FROM orders
175+
WHERE
176+
status = (CASE
177+
WHEN shipped_at IS NOT NULL THEN 'shipped'
178+
WHEN canceled_at IS NOT NULL THEN 'canceled'
179+
ELSE 'processing'
180+
END);
181+
182+
-- 11. A case in lateral join
183+
184+
SELECT *
185+
FROM users u,
186+
LATERAL (
187+
SELECT
188+
(CASE
189+
WHEN u.is_admin THEN 'admin_dashboard'
190+
ELSE 'user_dashboard'
191+
END) AS dashboard_view
192+
) AS derived;
193+
194+
-- 12. A CASE used inside a scalar subquery in SELECT
195+
196+
SELECT
197+
id,
198+
(SELECT
199+
CASE
200+
WHEN COUNT(*) > 5 THEN 'frequent'
201+
ELSE 'occasional'
202+
END
203+
FROM purchases p WHERE p.user_id = u.id) AS purchase_freq
204+
FROM users u;
205+
206+
-- 13. A case in window function
207+
208+
SELECT
209+
id,
210+
CASE
211+
WHEN rank() OVER (ORDER BY score DESC) = 1 THEN 'top'
212+
ELSE 'normal'
213+
END AS tier
214+
FROM players;

packages/deparser/__tests__/kitchen-sink/pretty-misc.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ it('pretty-misc', async () => {
99
"pretty/misc-3.sql",
1010
"pretty/misc-4.sql",
1111
"pretty/misc-5.sql",
12-
"pretty/misc-6.sql"
12+
"pretty/misc-6.sql",
13+
"pretty/misc-7.sql",
14+
"pretty/misc-8.sql",
15+
"pretty/misc-9.sql",
16+
"pretty/misc-10.sql",
17+
"pretty/misc-11.sql",
18+
"pretty/misc-12.sql",
19+
"pretty/misc-13.sql"
1320
]);
1421
});

packages/deparser/__tests__/pretty/__snapshots__/misc-pretty.test.ts.snap

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,129 @@ WHERE
152152
ORDER BY
153153
o.created_at DESC"
154154
`;
155+
156+
exports[`Pretty Misc SQL formatting should format misc-7: Large Case Stmt (non-pretty) 1`] = `"SELECT CASE WHEN n = 2 THEN ARRAY['month'] WHEN n = 4 THEN ARRAY['year'] WHEN n = 6 THEN ARRAY['year', 'month'] WHEN n = 8 THEN ARRAY['day'] WHEN n = 1024 THEN ARRAY['hour'] WHEN n = 1032 THEN ARRAY['day', 'hour'] WHEN n = 2048 THEN ARRAY['minute'] WHEN n = 3072 THEN ARRAY['hour', 'minute'] WHEN n = 3080 THEN ARRAY['day', 'minute'] WHEN n = 4096 THEN ARRAY['second'] WHEN n = 6144 THEN ARRAY['minute', 'second'] WHEN n = 7168 THEN ARRAY['hour', 'second'] WHEN n = 7176 THEN ARRAY['day', 'second'] WHEN n = 32767 THEN CAST(ARRAY[] AS text[]) END"`;
157+
158+
exports[`Pretty Misc SQL formatting should format misc-7: Large Case Stmt (pretty) 1`] = `
159+
"SELECT
160+
CASE
161+
WHEN n = 2 THEN ARRAY['month']
162+
WHEN n = 4 THEN ARRAY['year']
163+
WHEN n = 6 THEN ARRAY['year', 'month']
164+
WHEN n = 8 THEN ARRAY['day']
165+
WHEN n = 1024 THEN ARRAY['hour']
166+
WHEN n = 1032 THEN ARRAY['day', 'hour']
167+
WHEN n = 2048 THEN ARRAY['minute']
168+
WHEN n = 3072 THEN ARRAY['hour', 'minute']
169+
WHEN n = 3080 THEN ARRAY['day', 'minute']
170+
WHEN n = 4096 THEN ARRAY['second']
171+
WHEN n = 6144 THEN ARRAY['minute', 'second']
172+
WHEN n = 7168 THEN ARRAY['hour', 'second']
173+
WHEN n = 7176 THEN ARRAY['day', 'second']
174+
WHEN n = 32767 THEN CAST(ARRAY[] AS text[])
175+
END"
176+
`;
177+
178+
exports[`Pretty Misc SQL formatting should format misc-8: Large Case Stmt (non-pretty) 1`] = `"SELECT CASE WHEN n = 2 OR n = 3 THEN ARRAY['month', COALESCE(extra_label, 'unknown')] WHEN n IN (4, 5) THEN CASE WHEN is_leap_year THEN ARRAY['year', 'leap'] ELSE ARRAY['year'] END WHEN n = 6 THEN ARRAY['year', 'month', 'quarter'] WHEN n = 8 THEN ARRAY['day', 'week', compute_label(n)] WHEN n = 1024 THEN ARRAY['hour', format('%s-hour', extra_label)] WHEN n = 1032 AND flag = true THEN ARRAY['day', 'hour', 'flagged'] WHEN n BETWEEN 2048 AND 2049 THEN ARRAY['minute', 'tick'] WHEN n = 3072 THEN ARRAY['hour', 'minute', current_setting('timezone')] WHEN n = 3080 THEN ARRAY['day', 'minute', to_char(now(), 'HH24:MI')] WHEN n IN (4096, 4097, 4098) THEN ARRAY['second', 'millisecond'] WHEN n = 6144 THEN ARRAY['minute', 'second', CASE WHEN use_micro = true THEN 'microsecond' ELSE 'none' END] WHEN n = 7168 OR (n > 7170 AND n < 7180) THEN ARRAY['hour', 'second', 'buffered'] WHEN n = 7176 THEN ARRAY['day', 'second', CAST(extra_info AS text)] WHEN n = 32767 THEN CAST(ARRAY[] AS text[]) ELSE ARRAY['undefined', 'unknown', 'fallback'] END"`;
179+
180+
exports[`Pretty Misc SQL formatting should format misc-8: Large Case Stmt (pretty) 1`] = `
181+
"SELECT
182+
CASE
183+
WHEN n = 2
184+
OR n = 3 THEN ARRAY['month', COALESCE(extra_label, 'unknown')]
185+
WHEN n IN (4, 5) THEN CASE
186+
WHEN is_leap_year THEN ARRAY['year', 'leap']
187+
ELSE ARRAY['year']
188+
END
189+
WHEN n = 6 THEN ARRAY['year', 'month', 'quarter']
190+
WHEN n = 8 THEN ARRAY['day', 'week', compute_label(n)]
191+
WHEN n = 1024 THEN ARRAY['hour', format('%s-hour', extra_label)]
192+
WHEN n = 1032
193+
AND flag = true THEN ARRAY['day', 'hour', 'flagged']
194+
WHEN n BETWEEN 2048 AND 2049 THEN ARRAY['minute', 'tick']
195+
WHEN n = 3072 THEN ARRAY['hour', 'minute', current_setting('timezone')]
196+
WHEN n = 3080 THEN ARRAY['day', 'minute', to_char(now(), 'HH24:MI')]
197+
WHEN n IN (4096, 4097, 4098) THEN ARRAY['second', 'millisecond']
198+
WHEN n = 6144 THEN ARRAY['minute', 'second', CASE
199+
WHEN use_micro = true THEN 'microsecond'
200+
ELSE 'none'
201+
END]
202+
WHEN n = 7168
203+
OR (n > 7170
204+
AND n < 7180) THEN ARRAY['hour', 'second', 'buffered']
205+
WHEN n = 7176 THEN ARRAY['day', 'second', CAST(extra_info AS text)]
206+
WHEN n = 32767 THEN CAST(ARRAY[] AS text[])
207+
ELSE ARRAY['undefined', 'unknown', 'fallback']
208+
END"
209+
`;
210+
211+
exports[`Pretty Misc SQL formatting should format misc-9: Large Case Stmt (non-pretty) 1`] = `"SELECT user_id, CASE WHEN EXISTS (SELECT 1 FROM logins WHERE logins.user_id = users.user_id AND success = false) THEN 'risky' ELSE 'safe' END AS risk_status FROM users"`;
212+
213+
exports[`Pretty Misc SQL formatting should format misc-9: Large Case Stmt (pretty) 1`] = `
214+
"SELECT
215+
user_id,
216+
CASE
217+
WHEN EXISTS (SELECT
218+
1
219+
FROM logins
220+
WHERE
221+
logins.user_id = users.user_id
222+
AND success = false) THEN 'risky'
223+
ELSE 'safe'
224+
END AS risk_status
225+
FROM users"
226+
`;
227+
228+
exports[`Pretty Misc SQL formatting should format misc-10: Where Clause (non-pretty) 1`] = `"SELECT * FROM orders WHERE status = (CASE WHEN shipped_at IS NOT NULL THEN 'shipped' WHEN canceled_at IS NOT NULL THEN 'canceled' ELSE 'processing' END)"`;
229+
230+
exports[`Pretty Misc SQL formatting should format misc-10: Where Clause (pretty) 1`] = `
231+
"SELECT
232+
*
233+
FROM orders
234+
WHERE
235+
status = (CASE
236+
WHEN shipped_at IS NOT NULL THEN 'shipped'
237+
WHEN canceled_at IS NOT NULL THEN 'canceled'
238+
ELSE 'processing'
239+
END)"
240+
`;
241+
242+
exports[`Pretty Misc SQL formatting should format misc-11: Lateral Join (non-pretty) 1`] = `"SELECT * FROM users AS u, LATERAL ( SELECT CASE WHEN u.is_admin THEN 'admin_dashboard' ELSE 'user_dashboard' END AS dashboard_view ) AS derived"`;
243+
244+
exports[`Pretty Misc SQL formatting should format misc-11: Lateral Join (pretty) 1`] = `
245+
"SELECT
246+
*
247+
FROM users AS u, LATERAL ( SELECT
248+
CASE
249+
WHEN u.is_admin THEN 'admin_dashboard'
250+
ELSE 'user_dashboard'
251+
END AS dashboard_view ) AS derived"
252+
`;
253+
254+
exports[`Pretty Misc SQL formatting should format misc-12: Scalar Subquery (non-pretty) 1`] = `"SELECT id, (SELECT CASE WHEN count(*) > 5 THEN 'frequent' ELSE 'occasional' END FROM purchases AS p WHERE p.user_id = u.id) AS purchase_freq FROM users AS u"`;
255+
256+
exports[`Pretty Misc SQL formatting should format misc-12: Scalar Subquery (pretty) 1`] = `
257+
"SELECT
258+
id,
259+
(SELECT
260+
CASE
261+
WHEN count(*) > 5 THEN 'frequent'
262+
ELSE 'occasional'
263+
END
264+
FROM purchases AS p
265+
WHERE
266+
p.user_id = u.id) AS purchase_freq
267+
FROM users AS u"
268+
`;
269+
270+
exports[`Pretty Misc SQL formatting should format misc-13: Window Function (non-pretty) 1`] = `"SELECT id, CASE WHEN rank() OVER (ORDER BY score DESC) = 1 THEN 'top' ELSE 'normal' END AS tier FROM players"`;
271+
272+
exports[`Pretty Misc SQL formatting should format misc-13: Window Function (pretty) 1`] = `
273+
"SELECT
274+
id,
275+
CASE
276+
WHEN rank() OVER (ORDER BY score DESC) = 1 THEN 'top'
277+
ELSE 'normal'
278+
END AS tier
279+
FROM players"
280+
`;

0 commit comments

Comments
 (0)