假设我在模式PostGIS中创建了一个扩展,比如postgis,
CREATE EXTENSION postgis WITH SCHEMA postgis;在下面的示例中,是否可以完全限定像&&这样的运算符,
SELECT box2d && ST_MakePoint(5,5)
FROM postgis.box2d(postgis.ST_MakeEnvelope(0,0,10,10));但是"postgis.&&",甚至"postgis".&&和"postgis"."&&"都不是我的工作对象。关于“操作符类型解析”的文档似乎暗示有可能,
如果指定了限定运算符名,则只考虑指定架构中的运算符。
换句话说,我可以使用一个操作符是“不是可见”。吗?
SELECT pg_type_is_visible(
'postgis.&&(postgis.geometry,postgis.geometry)'::regoperator
);显然,我可以将postgis添加到我的search_path中,但我希望保留这个未经修改的内容,在其他任何情况下,我们实际上都可以限定所有内容。
发布于 2017-11-25 05:59:53
是的,它被记录在模式搜索路径下和OPERATOR()
SELECT box2d OPERATOR(postgis.&&) postgis.ST_MakePoint(5,5) AS "&&"
FROM postgis.box2d(postgis.ST_MakeEnvelope(0,0,10,10));发布于 2017-11-25 16:40:32
请注意,OPERATOR构造(如OPERATOR(postgis.&&))与操作符本身并不完全相同。运算符失去了它们的隐式优先级,返回到未定义,这可能会产生鬼鬼祟祟的副作用。考虑:
SELECT 3 + 3 * 2 -- 9
, 3 + 3 OPERATOR(pg_catalog.*) 2; -- 12对OPERATOR(postgis.&&)没有任何影响,因为&&首先具有默认的操作符优先级。
相关信息:
另一个限制是:OPERATOR构造不适用于AND、OR、BETWEEN等SQL语法元素,这些元素有时也被称为“操作符”(并且具有自己的运算符优先级)。只适用于系统目录pg_operator中列出的运算符。
https://dba.stackexchange.com/questions/191695
复制相似问题