When fixing bug
unused CTEs was forbidden - it was simplest solution to avoid crash in the engine.
Crash happens due to uninitialized input parameters as unused CTE is not handled by syntax analyzer at all.
But it is too stong limitation and users complains about it (not often but anyway).
Improvement is to allow queries with unused CTEs and convert error "CTE "XXX" is not used in query" into warning.
Also, it will handle unused CTEs by syntax analyzer and catch all errors, for example
X AS (SELECT R.RDB$RELATION_NAME FROM RDB$RELATIONS1 R WHERE R.RDB$RELATION_ID = 1),
Y AS (SELECT R.RDB$RELATION_NAME FROM RDB$RELATIONS R WHERE R.RDB$RELATION_ID = :ID2)
SELECT * FROM Y
currently works despite of reference on non-existing table RDB$RELATIONS1 in CTE X