暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

运维-postgresql解决subquery in FROM must have an alias

SmallDB 2024-10-25
180

问题

测试迁移数据库带来的问题,业务端因为之前的开发在opengauss上面 ,出现语法的问题,其实opengauss也是为了兼容oracle

dh-# \dt;
List of relations
Schema|Name|Type|Owner
--------+--------------+-------+----------
public| tbl_idx_tb01 | table | postgres
(1 row)

dh=# SELECT * FROM (SELECT * FROM tbl_idx_tb01);
ERROR:  subquery in FROM must have an alias
LINE 1: SELECT * FROM (SELECT * FROM tbl_idx_tb01);
^
HINT:For example, FROM (SELECT ...)[AS] foo.
dh=# \h alias
No help available for"alias".
Try \h withno arguments to see available help.
dh=#

问题解决

方式1 升级到postgresql16 可以解决

docker pull ghcr.io/cloudnative-pg/postgresql:16.4-18-bookworm
➜  ~ docker images
REPOSITORY                                                    TAG                IMAGE ID       CREATED         SIZE
ghcr.io/cloudnative-pg/postgresql                             16.4-18-bookworm   cefdf076affd   2 days ago      600MB
mysql                                                         8.0                c5f0c876cdb1   4 months ago    567MB
postgres                                                      14.71c159088a87816 months ago   377MB
opengauss/opengauss                                           5.0.0187da08af34117 months ago   1.45GB
opengauss                                                     5.0.0478a0029413718 months ago   1.38GB
swr.cn-south-1.myhuaweicloud.com/opengauss/x86_64/opengauss   5.0.0478a0029413718 months ago   1.38GB
wenjunxiao/mac-docker-connector                               latest             f54166dde9a7   3 years ago     8.89MB
jdeathe/centos-ssh                                            latest             f47765d0cf63   5 years ago     228MB
➜  ~

安装postgresql:16

docker pull ghcr.io/cloudnative-pg/postgresql:16.4-18-bookworm
docker tag ghcr.io/cloudnative-pg/postgresql:16.4-18-bookworm postgresql:16.4-18-bookworm



docker run -p 5433:5432--name postgresql16 -e POSTGRES_PASSWORD=123456-d postgresql:16.4-18-bookworm


docker start postgresql16

docker logs postgresql16


docker exec-it postgresql16 /bin/bash


docker rm postgresql16



docker pull ghcr.io/enterprisedb/postgresql



#建表插入测试数据
hank=> create table tbl_idx_tb01 (a int,b text);
CREATE TABLE
hank=> insert into tbl_idx_tb01 select t,'hank_'||t from generate_series(1,11000000) t;
INSERT 011000000
hank=> create index CONCURRENTLY idx_tb01_a  on tbl_idx_tb01 (a);
CREATE INDEX
hank=> drop index idx_tb01_a;
DROP INDEX
hank=> create index idx_tb01_a  on tbl_idx_tb01 (a);
CREATE INDEX
dh=# show server_version;
         server_version
--------------------------------
16.4(Debian16.4-1.pgdg120+1)
(1 row)

dh=#select version();
                                                       version
---------------------------------------------------------------------------------------------------------------------
PostgreSQL16.4(Debian16.4-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian12.2.0-14)12.2.0,64-bit
(1 row)

dh=#

dh=# SELECT * FROM (SELECT * FROM tbl_idx_tb01) limit 1;
    a    |      b
---------+--------------
3926888| hank_3926888
(1 row)

dh=#

方式2 修改源代码的语法解析模块

社区也是类似的补丁,我的建议也是升级16以上版本,可是我目前使用的是14.7,不能升级,只能打补丁,社区的补丁不兼容,我是借鉴了它的思路改的

我的操作思路,

  • • 下载 postgresql14.7的git,然后初始提交,为了后面生成postgresql16.0生成补丁,剔除其它的提交,只关注涉及社区补丁的文件,然后看它改了什么,我根据需要改就可以了

之前的 

现在的


文章转载自SmallDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论