让PostgreSQL支持没有别名的子查询(Oracle兼容)

让PostgreSQL支持没有别名的子查询(Oracle兼容),第1张

概述PostgreSQL里我们随便运行一个不带别名的子查询: postgres=# select * from (select * from pg_class);ERROR:  subquery in FROM must have an aliasLINE 1: select * from (select * from pg_class);                      ^HINT

Postgresql里我们随便运行一个不带别名的子查询:

postgres=#select*from(select*frompg_class);ERROR:subqueryinFROMmusthaveanaliasliNE1:select*from(select*frompg_class);^HINT:Forexample,FROM(SELECT...)[AS]foo.postgres=#

而带子查询的是这样:

postgres=#selectamnamefrom(select*frompg_am)asalimit3;amname--------btreehashgist(3rows)postgres=#

Oracle下,有无别名均可:

sql>select*from(select*fromtab);Tname			TABTYPE	CLUSTERID-----------------------------------------------COUNTRIES		tableDEPARTMENTS		tableEMPLOYEES		tableEMP_DETAILS_VIEW	VIEWJOBS			tableJOB_HISTORY		tableLOCATIONS		tableREGIONS		table8rowsselected.sql>

没什么大的影响,但如果遇到Oracle程序向PG迁移,改起来就有点罗嗦,这时候我们不妨让PG变化一下。

这个目标是非常明确,直接去源代码里边:grep -r "subquery in FROM must have an alias",发现它在src/backend/parser/gram.y

沿着代码往下看,可以看到子查询别名为空时报错,办法就很直截了当了,未指定别名时给他产生一个。

出错代码替换为:

Alias*a=makeNode(Alias);a->aliasname="alias_xxxx";n->alias=a;

编译之后运行:

template1=#selectamnamefrom(select*frompg_am)limit3;amname--------btreehashgist(3rows)template1=#

小打小闹修改PG就是如此简单,当然这里还有更多工作要做,比如别名应该随机生成而不是像这样写死。

template1=#selectamnamefrom(select*frompg_am),(select*frompg_database);ERROR:tablename"alias_xxxx"specifIEdmorethanoncetemplate1=#

这肯定不是我们想要的结果


作为一个演示的例子,到此已经足够。


欢迎订阅国际社区中文邮件列表

欢迎使用云栖问答知识库


神州飞象(北京)数据科技有限公司,专业Postgresql产品与服务提供商

总结

以上是内存溢出为你收集整理的让PostgreSQL支持没有别名的子查询(Oracle兼容)全部内容,希望文章能够帮你解决让PostgreSQL支持没有别名的子查询(Oracle兼容)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1174894.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存