创建聚合initcond中的PostgreSQL格式错误的数组文字

时间:2019-06-19 20:23:50

标签: postgresql

运行postgres 11.3。这是sql代码

create type _stats_agg_accum_type AS (
    cnt bigint,
    min double precision,
    max double precision,
    m1 double precision,
    m2 double precision,
    m3 double precision,
    m4 double precision,

    q double precision[],
    n double precision[],
    np  double precision[],
    dn  double precision[]
);

create aggregate stats_agg(double precision) (
    sfunc = _stats_agg_accumulator,
    stype = _stats_agg_accum_type,
    finalfunc = _stats_agg_finalizer,
    combinefunc = _stats_agg_combiner,
    parallel = safe,
    initcond = '(0,,, 0, 0, 0, 0, {}, {1,2,3,4,5}, {1,2,3,4,5}, {0,0.25,0.5,0.75,1})'
);

哪个给我

ERROR:  malformed array literal: "{1"
DETAIL:  Unexpected end of input.
SQL state: 22P02

空数组文字可以正常工作。我还尝试了一个工作正常的单元素文字{1}。每当我有2个或更多元素时,就会出现此错误。

作为一种变通方法,我可以传入空数组并在第一遍进行初始化,但这很丑陋。

1 个答案:

答案 0 :(得分:1)

您需要在数组两边加上引号,这是因为数组是一行的文本版本。

通过将输入作为一行来进行测试很容易,并查看postgres如何设置其格式(此处需要在数组周围使用单引号,因为{}是文本数组)

SELECT ROW(0,NULL,NULL, 0, 0, 0, 0, '{}', '{1,2,3,4,5}', '{1,2,3,4,5}', '{0,0.25,0.5,0.75,1}')

返回:

(0,,,0,0,0,0,{},"{1,2,3,4,5}","{1,2,3,4,5}","{0,0.25,0.5,0.75,1}")

因此,您需要执行以下操作:

...
initcond = '(0,,,0,0,0,0,{},"{1,2,3,4,5}","{1,2,3,4,5}","{0,0.25,0.5,0.75,1}")'

为什么在一个为空或只有一个值的数组上不需要加引号:

数组中的多个值以逗号分隔,行中的字段也以逗号分隔。如果您将行提供为'(0,{1,2})',则PG会将其解释为三个字段:0{12}。在这种情况下,自然会收到有关格式错误的数组的错误。将字段放在引号中意味着这些引号内的所有内容都是一个字段。因此,'(0,"{1,2}")'将正确解释为0{1,2}。如果数组为空或仅包含一个值,则不会有逗号,因此正确解析该字段没有问题。