以下postgresql存储过程的目的是什么?

时间:2012-11-11 15:01:27

标签: sql postgresql stored-procedures

以下postgresql存储过程的目的是什么,它在执行查询时使用,谢谢!

CREATE OR REPLACE FUNCTION extract_fp_query(int[]) RETURNS int[]
AS $$
    SELECT uniq(sort(subarray($1 - 627964279,
        greatest(0, least(icount($1 - 627964279) - 120, 80)), 120)));
$$ LANGUAGE 'SQL' IMMUTABLE STRICT;

1 个答案:

答案 0 :(得分:0)

此代码在很大程度上依赖于the intarray extension中的功能。一旦你知道你可以把它分解成步骤来解决它。

在我看来,我喜欢某种穷人的加密或混淆程序,但你没有提供有关其输入的任何信息,所以很难说更多。本质上,它返回传递数组的已排序,重复数据删除的子集,根据数组中的元素数决定返回哪个子集。如果我正确读取它会从数组中删除值627964279(如果它出现在那里),然后根据数组中元素的数量,将0和80个元素的偏移量返回120个元素(在重复数据删除之前)。 / p>

创建测试数据库。我会打电话给我regress。创建它并以超级用户身份将intarray contrib模块安装到其中:

sudo -u postgres createdb -O myusername regress
sudo -u postgres psql regress -c 'CREATE EXTENSION intarray;'

现在以myusername运行,无论您的未成熟用户帐户是什么,请将代码分解为步骤并尝试每一步。就像在C中一样。将其格式化为表达式可能会有所帮助:

SELECT uniq(sort(
    subarray(
        $1 - 627964279,
        greatest(
            0, 
            least(
                icount($1 - 627964279) - 120,
                80
            )
        )
        , 120
    )
));

然后用一个已知的输入手动评估每个子表达式,随意替换结果并简化表达式,同时记下它的作用。我不能为你做这个,因为你没有提供样本输入,但是,用你的输入数组替换ARRAY[42,5,9,24,1,627964279]你会做类似的事情:

$ psql regress
psql (9.2.1)
Type "help" for help.

regress=> SELECT ARRAY[42,5,9,24,1,627964279];
          array          
-------------------------
 {42,5,9,24,1,627964279}
(1 row)

regress=> SELECT ARRAY[42,5,9,24,1,627964279] - 627964279;
   ?column?    
---------------
 {42,5,9,24,1}
(1 row)

regress=> SELECT icount(ARRAY[42,5,9,24,1,627964279] - 627964279);
 icount 
--------
      5
(1 row)

regress=> SELECT least(icount(ARRAY[42,5,9,24,1,627964279] - 627964279),80);
 least 
-------
     5
(1 row)

regress=> 
regress=> SELECT greatest(least(icount(ARRAY[42,5,9,24,1,627964279] - 627964279),80),0);
 greatest 
----------
        5
(1 row)

现在,通过将5替换为greatest(...)表达式,我们得到subarray表达式:

SELECT subarray($1 - 627964279, 5, 120 )

在评估数组项目删除之后:

regress=> SELECT subarray(ARRAY[42,5,9,24,1], 5, 120);
 subarray 
----------
 {1}
(1 row)

在这种情况下,sortuniq没有进一步的效果。

它的用途是什么?谁知道,因为你没有提供可能提供线索的输入数组。

请参阅the intarray documentation