Postgres 中的视图列来自哪里?

Where did view columns come from in Postgres?

假设我有一个 PostgreSQL 数据库并且有一个看起来像这样的视图:

select foo.id as id, bar.id as bar_id, ...
from foo join bar on foo.bar_id = bar.id;

哪个查询可以告诉我视图的哪些列来自哪些基础 table/column 组合?

我最接近的是查询information_schema.view_column_usage。这给了我一切,除了定义了视图中的哪一列。所以我可以说,例如,foo.idbar.id 都在视图中使用。但是我不知道 id 列是来自 foo 还是 bar.

(是的,我可以手动解析 SQL。但我正在尝试自动分析具有许多视图、许多列以及视图中不明显的列重命名的系统。)

正如 JGH 在他的评论中所说,很容易得出视图列依赖于多个底层对象的视图。

视图定义本身以解析树的形式存储在相应pg_rewrite条目的ev_action列中,因此您必须编写C代码并深入研究其内部结构PostgreSQL 来处理它。但请注意:尝试解析文本表示会更加困难。

我只需要 select * from pg_get_viewdef('view_name'),但您显然需要更多。

虽然它没有完全解决您的问题,但如果您没有看过以下几周前的文章,您可能会发现它很有趣:

滥用 Postgresql 作为 SQL 美化器

https://www.cybertec-postgresql.com/en/abusing-postgresql-as-an-sql-beautifier/