-2

下面这个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;
4

1 回答 1

0

此代码严重依赖扩展中intarray功能。一旦你知道你可以通过把它分解成几个步骤来解决它。

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

创建一个测试数据库。我会打电话给我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)

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

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

这是在评估数组项删除之后:

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

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

这是为了什么?谁知道,因为您没有提供可能提供线索的输入数组。

请参阅intarray 文档

于 2012-11-12T02:03:19.200 回答