Mission C Phase 5: a pre-parsed, pre-planned query. The caller holds
one of these and repeatedly executes it with fresh literal values via
Engine::execute_prepared. This is PowDB’s equivalent of SQLite’s
prepare_cached — the parse + plan cost is paid exactly once, and
every subsequent execution skips the lexer, the canonicalise hash,
and the plan-cache hashmap lookup.
Sentinel error returned by Engine::execute_powql_readonly when the
query touches a materialized view whose backing table is dirty. The
read path holds only &self, so it can’t refresh the view — the caller
is expected to recognise this prefix and retry with the write lock.
Mission infra-1: classify a parsed statement as read-only vs. mutating.
Used by Engine::execute_powql_readonly and by the server handler
to decide between the RwLock reader and writer sides. Union recurses
because each side can independently be read/write (though in practice
both sides are reads — the parser only builds Union from query shapes).