PostgreSQL 10 PostGIS 兼容性 FIX

标签

PostgreSQL , PostGIS , regexp_matches , _raster_constraint_info_blocksize


背景

PostGIS 的PG 10有一点兼容性问题:

创建extension时报错如下:

ERROR:  set-returning functions are not allowed in CASE
LINE 6:                                 split_part((regexp_matches(s...
                                                    ^
HINT:  You might be able to move the set-returning function into a LATERAL FROM item.

分析对应的.sql文件,出错的是这个FUNCTION。

CREATE OR REPLACE FUNCTION _raster_constraint_info_blocksize(rastschema name, rasttable name, rastcolumn name, axis text)
        RETURNS integer AS $$
        SELECT
                CASE
                        WHEN strpos(s.consrc, 'ANY (ARRAY[') > 0 THEN
                                split_part((regexp_matches(s.consrc, E'ARRAY\\[(.*?){1}\\]'))[1], ',', 1)::integer   -- 改成regexp_match
                        ELSE
                                regexp_replace(
                                        split_part(s.consrc, '= ', 2),
                                        '[\(\)]', '', 'g'
                                )::integer
                        END
        FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s
        WHERE n.nspname = $1
                AND c.relname = $2
                AND a.attname = $3
                AND a.attrelid = c.oid
                AND s.connamespace = n.oid
                AND s.conrelid = c.oid
                AND a.attnum = ANY (s.conkey)
                AND s.consrc LIKE '%st_' || $4 || '(%= %';
        $$ LANGUAGE sql STABLE STRICT
  COST 100;

修正方法

regexp_matches改成regexp_match。

修正后的验证,正常返回约束即可。

postgres=# CREATE TABLE test_rast(rid serial, rast raster);
CREATE TABLE
postgres=#
postgres=# INSERT INTO test_rast(rast)
postgres-# SELECT r
postgres-# FROM  ST_Tile(ST_MakeEmptyRaster(500, 500, 0,500, 1, 1, 0, 0, 0), 50, 50) AS r;
INSERT 0 100
postgres=#
postgres=# SELECT AddRasterConstraints(current_schema(), 'test_rast', 'rast'::name, 'blocksize');
NOTICE:  Adding blocksize-X constraint
NOTICE:  Adding blocksize-Y constraint
 addrasterconstraints
----------------------
 t
(1 row)  

postgres=# \d+ test_rast
                                                 Table "public.test_rast"
 Column |  Type   | Collation | Nullable |                Default                 | Storage  | Stats target | Description
--------+---------+-----------+----------+----------------------------------------+----------+--------------+-------------
 rid    | integer |           | not null | nextval('test_rast_rid_seq'::regclass) | plain    |              |
 rast   | raster  |           |          |                                        | extended |              |
Check constraints:
    "enforce_height_rast" CHECK (st_height(rast) = 50)
    "enforce_width_rast" CHECK (st_width(rast) = 50)  

postgres=# SELECT _raster_constraint_info_blocksize('public', 'test_rast', 'rast', 'width') AS width,
postgres-#      _raster_constraint_info_blocksize('public', 'test_rast', 'rast', 'width') AS height;
 width | height
-------+--------
    50 |     50
(1 row)

扩展阅读

PostgreSQL 10新增了一个规则匹配函数regexp_match,分别用于返回单行和多行。

如下

Function Return Type Description Example Result
regexp_match(string text, pattern text [, flags text]) text[] Return captured substring(s) resulting from the first match of a POSIX regular expression to the string. See Section 9.7.3 for more information. regexp_match('foobarbequebaz', '(bar)(beque)') {bar,beque}
regexp_matches(string text, pattern text [, flags text]) setof text[] Return captured substring(s) resulting from matching a POSIX regular expression to the string. See Section 9.7.3 for more information. regexp_matches('foobarbequebaz', 'ba.', 'g') {bar} {baz} (2 rows)

10以前的版本如下,只有一个regexp_matches函数,效果与regexp_match类似。虽然返回的是SRF。

Function Return Type Description Example Result
regexp_matches(string text, pattern text [, flags text]) setof text[] Return all captured substrings resulting from matching a POSIX regular expression against the string. See Section 9.7.3 for more information. regexp_matches('foobarbequebaz', '(bar)(beque)') {bar,beque}

因此PostgreSQL 10我们在PostGIS的postgis--2.3.2.sql中修正为regexp_match是可行的。

另一方面,实际上SRF函数在非SRF中调用并返回结果时,实际上返回的也是第一个匹配行,如下:

-- 非SRF函数中调用SRF。
postgres=# create or replace function f() returns int as $$
postgres$# select * from (values (1),(2),(3)) t(id);
postgres$# $$ language sql strict;
CREATE FUNCTION  

postgres=# select f();
 f
---
 1
(1 row)  

-- SRF函数中调用SRF。
postgres=# drop function f();
DROP FUNCTION
postgres=# create or replace function f() returns setof int as $$
select * from (values (1),(2),(3)) t(id);
$$ language sql strict;
CREATE FUNCTION
postgres=# select f();
 f
---
 1
 2
 3
(3 rows)

PostGIS插件安装中用到的一些字符串处理函数

PostGIS插件安装中用到了大量字符串处理函数,列举一些:

strpos  

split_part  

regexp_match  

regexp_replace

例子

postgres=# select strpos('abc','a');
 strpos
--------
      1
(1 row)  

postgres=# select strpos('abc','b');
 strpos
--------
      2
(1 row)  

postgres=# select split_part('a.b.c','.',1);
 split_part
------------
 a
(1 row)  

postgres=# select split_part('a.b.c','.',2);
 split_part
------------
 b
(1 row)  

postgres=# select split_part('a.b.c','.',3);
 split_part
------------
 c
(1 row)  

postgres=# select regexp_match('foobarbequebaz', '(bar)(beque)');
 regexp_match
--------------
 {bar,beque}
(1 row)  

postgres=# select regexp_matches('foobarbequebaz', 'ba.', 'g');
 regexp_matches
----------------
 {bar}
 {baz}
(2 rows)  

postgres=# select regexp_replace('Thomas', '.[mN]a.', 'M');
 regexp_replace
----------------
 ThM
(1 row)

参考

https://trac.osgeo.org/postgis/ticket/3760#no1

《PostgreSQL 使用递归SQL 找出数据库对象之间的依赖关系》

《PostgreSQL 10.0 解读》

https://www.postgresql.org/docs/10/static/functions-string.html

时间: 2024-12-22 00:11:29

PostgreSQL 10 PostGIS 兼容性 FIX的相关文章

PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户)

标签 PostgreSQL , Linux , CentOS 背景 新用户部署PostgreSQL以及空间数据库插件PostGIS的指南. 内网环境RPM打包(可选项) 如果是内网环境,可以将包全部下载到本地再用rpm安装. 安装epel和postgresql yum rpm两个包后再执行: 1.使用yum-utils的yumdownloader下载需要的安装包,包括依赖包. yum install -y yum-utils yumdownloader --resolve --destdir=/

PostgreSQL 10.0 preview 功能增强 - 匿名、自治事务(Oracle 兼容性)

标签 PostgreSQL , 10.0 , 匿名事务 , 自治事务 背景 PostgreSQL 10.0 通过session backendground实现了匿名事务,从此可以愉快的支持Oracle存储过程的自治事务了. 此前,我们需要通过dblink实现,或者通过匿名块+exception来实现,比较繁琐. <PostgreSQL Oracle 兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁> <PostgreSQL Oracle 兼容性之

空间|时间|对象 圈人 + 目标人群透视 - 暨PostgreSQL 10与Greenplum的对比和选择

标签 PostgreSQL , PostGIS , geohash , brin , gist索引 , Greenplum , HybridDB for PostgreSQL 背景 通常一个人的常驻地可能会包括:家.儿女家.双方父母家.情人.异性伴侣家.公司.商圈若干等. 通过对这些数据的运营,可以实现很多业务需求.例如: 1.寻人 <海量用户实时定位和圈人 - 团圆社会公益系统(位置寻人\圈人)> 2.线下广告投放人群圈选,选址,商圈人群画像. <数据寻龙点穴(空间聚集分析) - 阿里

PostgreSQL 10.0 解读

背景 本文参考当前的release notes以及git, committe fest编写,10.0还没有正式release,部分内容在正式release时可能会修改,同时会新增新的内容. 迁移到10.0的注意事项 迁移时,请注意不兼容的地方. 1. 使用pg_upgrade升级时,hash index 需要重建.(因为10.0为了支持hash index WAL,存储结构改变了.) 2. $PGDATA/pg_log, pg_xlog, pg_clog目录分别重命名为log, pg_wal,

PostgreSQL 10.0 preview 性能增强 - mergesort(Gather merge)

标签 PostgreSQL , 10.0 , merge sort , gather merge 背景 在数据库中,经常会有多个节点append,然后sort的情况. 例如一张表有10个分区,查询所有分区,并按某列排序输出,常规的做法是所有的记录append,然后sort. PostgreSQL 10.0 将支持append node的并行计算,也就是说所有的分区表可以并行的sort,然后返回,此时就可以使用merge sort来提高排序的速度. 另外,像单表的并行计算,如果需要排序输出的话,每

PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)

标签 PostgreSQL , 10.0 , 后台运行 , pg_background_launch , pg_background_result , pg_background_detach , pg_background 背景 当用户在管理数据库时,如果要在交互式界面跑一些QUERY,但是不知道QUERY要运行多久,担心网络问题或者其他问题导致终端断开,QUERY执行情况不明的话.就需要后台运行这个功能了. 后台运行在LINUX中也很常见,比如 nohup ls -la / >/tmp/re

PostgreSQL 10.0 preview 功能增强 - hash index 支持wal(灾难恢复)

标签 PostgreSQL , 10.0 , hash index , wal , 灾难恢复 背景 PostgreSQL 10.0 将支持hash index WAL. 因此建hash index再也不怕数据库crash或者备库hash index不可用了. $SUBJECT will make hash indexes reliable and usable on standby. AFAIU, currently hash indexes are not recommended to be

最受开发者欢迎的HTAP数据库PostgreSQL 10特性

标签 PostgreSQL , 10 , 特性 , 开发者 背景 作为一款HTAP数据库(同时支持 "OLTP高并发在线事务处理" 与 "OLAP在线分析" 业务场景),PostgreSQL 10的哪些特性是开发人员.DBA.架构师都喜欢的呢? 多核并行增强 9.6的版本支持如下并行: Sequential scans Aggregates Hash and loop joins 10 并行增强: 1.通过 max_parallel_workers 控制最大并行度,

元旦技术大礼包 - 2017金秋将要发布的PostgreSQL 10.0已装备了哪些核武器?

标签 PostgreSQL , 10.0 , 金秋 , 元旦 , 大礼包 , commitfest 背景 早上送给大家的新年大礼包,一年一个大版本是PostgreSQL社区的传统,虽然发布时间通常为秋天,还有一段时间,但是已经迫不及待地想看看2017金秋将要发布的10.0版本已经装备了哪些核武器. 放心,还会有一波又一波的feature和增强搭上开往2017金秋的列车,本文提到的可能只是其中的某一节车厢沃,PGer是不是开始有一点振奋人心的感觉啦. 1. 并行计算专属动态共享内存区,(加速索引扫