← All tasks Task 5 of 12 unsolved

5. Chunked IN-Clause Query Builder

SQL Pagination ~10 min

Most databases reject WHERE id IN (...) when the list is too long — Oracle caps at 1,000, and even on PostgreSQL a 50K-element IN can blow the query plan cache. Split a flat list of IDs into chunks and emit one SQL statement per chunk.

Used in Synthesized.io's read pipeline whenever subset IDs exceed the dialect's safe IN-clause size.

Tests this task must pass

  1. Uneven split — 10 IDs, chunk size 3 → 4 queries (last chunk has 1 ID).
  2. Empty input — empty ID list → empty output (no degenerate IN ()).
  3. Chunk larger than input — 2 IDs, chunk size 100 → exactly 1 query.
  4. Exact multiple — 9 IDs, chunk size 3 → 3 queries, no trailing empty chunk.
  5. SQL shape — every output starts with SELECT * FROM <table> WHERE <col> IN ( and ends with ).
//sampleStart fun buildChunkedQueries(table: String, column: String, ids: List<Long>, chunkSize: Int): List<String> { // Split ids into chunks of chunkSize // For each chunk: build "SELECT * FROM table WHERE column IN (1,2,3)" // Return list of SQL strings TODO() } //sampleEnd fun main() { // Test 1: 10 ids, chunk 3 val r1 = buildChunkedQueries("users", "id", (1L..10L).toList(), 3) check(r1.size == 4) { "FAIL: 10/3 = 4 chunks. Got ${r1.size}" } check(r1[0].contains("IN (1,2,3)") || r1[0].contains("IN (1, 2, 3)")) { "FAIL: first chunk has 3 ids" } check(r1[3].contains("10")) { "FAIL: last chunk has remaining id" } println("✅ Test 1: ${r1.size} chunks") // Test 2: Empty ids val r2 = buildChunkedQueries("users", "id", emptyList(), 5) check(r2.isEmpty()) { "FAIL: empty ids → empty result" } println("✅ Test 2: Empty ids") // Test 3: Chunk larger than ids val r3 = buildChunkedQueries("users", "id", listOf(1L, 2L), 100) check(r3.size == 1) { "FAIL: should be single query" } println("✅ Test 3: Single query") // Test 4: Exact multiple val r4 = buildChunkedQueries("users", "id", (1L..9L).toList(), 3) check(r4.size == 3) { "FAIL: 9/3 = 3 chunks exactly" } println("✅ Test 4: Exact multiple — ${r4.size} chunks") // Test 5: Each query is valid SQL for (q in r1) { check(q.startsWith("SELECT * FROM users WHERE id IN (")) { "FAIL: invalid SQL: $q" } check(q.endsWith(")")) { "FAIL: should end with )" } } println("✅ Test 5: Valid SQL format") println("\n🎉 ALL TESTS PASSED!") }
← Previous Next: Phone Masking →