Calcite currently reuses the same instance when throwing CyclicMetadataException as shown below.
Reusing the same exception instance gives the wrong stack trace, see: https://stackoverflow.com/questions/15090664/is-it-safe-to-store-an-instance-of-an-exception-and-reuse-it
The misleading stack trace causes many confusions when debugging. The potential performance impact because of object construction is minor compared to the time spent on debugging. Therefore it should be changed to not reuse the singleton instance.
A pull request have been opened to fix this issue: https://github.com/apache/calcite/pull/1484