test(sql): cover explainOverACompoundQueryDescribesTheSetOperatorAndB...
This commit is contained in:
1 parent
820f4fef7e
commit
aae2ff034b
1 file changed
+82
@@ -314,3 +314,85 @@ class DiskExecutorExplainTest {
|
||||
assertEquals(" Offset 1", plan[1])
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainOverACompoundQueryDescribesTheSetOperatorAndBothSides() {
|
||||
val db = newDatabase()
|
||||
db.run("CREATE TABLE t1 (id INTEGER PRIMARY KEY, name TEXT NOT NULL)")
|
||||
db.run("CREATE TABLE t2 (id INTEGER PRIMARY KEY, name TEXT NOT NULL)")
|
||||
db.run("INSERT INTO t1 VALUES (1, 'ada')")
|
||||
db.run("INSERT INTO t2 VALUES (2, 'linus')")
|
||||
val plan = db.explain("EXPLAIN SELECT name FROM t1 UNION SELECT name FROM t2")
|
||||
assertEquals("Union", plan.first())
|
||||
assertTrue(plan.any { it.trim() == "-> Seq Scan on t1" })
|
||||
assertTrue(plan.any { it.trim() == "-> Seq Scan on t2" })
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainOverAWithRecursiveQueryDescribesTheCteAndItsBody() {
|
||||
val db = newDatabase()
|
||||
db.run("CREATE TABLE dual (x INTEGER)")
|
||||
db.run("INSERT INTO dual VALUES (1)")
|
||||
val plan = db.explain(
|
||||
"EXPLAIN WITH RECURSIVE counter(n) AS (" +
|
||||
"SELECT 1 FROM dual UNION ALL SELECT n + 1 FROM counter WHERE n < 5" +
|
||||
") SELECT n FROM counter"
|
||||
)
|
||||
assertTrue(plan.any { it == "CTE counter" })
|
||||
assertTrue(plan.any { it == "Seq Scan on counter" })
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainOverAViewDescribesTheOuterQueryAgainstTheViewsMaterializedSchema() {
|
||||
val db = newDatabase()
|
||||
db.seedUsers()
|
||||
db.run("CREATE VIEW adults AS SELECT id, name FROM users WHERE age >= 40")
|
||||
val plan = db.explain("EXPLAIN SELECT * FROM adults")
|
||||
assertTrue(plan.any { it == "Seq Scan on adults" })
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainOverADerivedTableDescribesItByItsAlias() {
|
||||
val db = newDatabase()
|
||||
db.seedUsers()
|
||||
val plan = db.explain("EXPLAIN SELECT s.name FROM (SELECT id, name FROM users) AS s")
|
||||
assertTrue(plan.any { it == "Seq Scan on s" })
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainRejectsAWindowFunctionInWhereStructurallyWithoutRunningTheQuery() {
|
||||
val db = newDatabase()
|
||||
db.seedUsers()
|
||||
val table = db.catalog.table("users")
|
||||
val failure = assertFailsWith<DiskExecutorException> {
|
||||
db.explain("EXPLAIN SELECT name FROM users WHERE ROW_NUMBER() OVER (ORDER BY id) > 1")
|
||||
}
|
||||
assertTrue(failure.message!!.contains("window functions are not allowed in WHERE"))
|
||||
assertEquals(0, table.scanCount)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainRejectsAColumnMissingFromGroupByJustLikeRunningTheQueryWould() {
|
||||
val db = newDatabase()
|
||||
db.seedOrders()
|
||||
val failure = assertFailsWith<DiskExecutorException> {
|
||||
db.explain("EXPLAIN SELECT customer_id, amount FROM orders GROUP BY customer_id")
|
||||
}
|
||||
assertTrue(failure.message!!.contains("must appear in GROUP BY"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainRejectsADuplicateTableAliasJustLikeRunningTheQueryWould() {
|
||||
val db = newDatabase()
|
||||
db.seedUsers()
|
||||
val failure = assertFailsWith<DiskExecutorException> {
|
||||
db.explain("EXPLAIN SELECT * FROM users u JOIN users u ON u.id = u.id")
|
||||
}
|
||||
assertTrue(failure.message!!.contains("duplicate table alias"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun explainOnAMissingTableStillReportsNoSuchTable() {
|
||||
val db = newDatabase()
|
||||
assertFailsWith<DiskCatalogException> { db.explain("EXPLAIN SELECT * FROM missing") }
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user