CTE returns an empty set even though anchor is non-empty
I figured it out. (Apologies to those of you who tried to help me. There was no way you could have figured this out.)

After a lot of experimentation, I noticed that dynamic queries (Connection.createStatement()) were returning results but parameterized queries (Connection.prepareStatement()) were returning an empty set. You had no way of knowing this because my question incorrectly listed the query as:


  anchor.child_id = -32763


whereas in actuality it was a PreparedStatement


  anchor.child_id = ?


with a value of -32763.

Deep within H2's release notes I ran across this wonderful sentence:


  Parameters are only supported within the last SELECT statement (a workaround is to use session variables like @start within the table expression).


In short, this looks like an H2 limitation/bug. I really wish H2 would have thrown an exception instead of returning an empty set.

https://groups.google.com/d/msg/h2-database/OJfqNF_Iqyo/Z748UP7W3NAJ confirms this issue (I am getting an empty set instead of null, but otherwise the problem description is identical).

Thank you to those of you who tried helping!