此代码严重依赖扩展中的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)
现在,通过将表达式代5
入greatest(...)
表达式subarray
,我们得到:
SELECT subarray($1 - 627964279, 5, 120 )
这是在评估数组项删除之后:
regress=> SELECT subarray(ARRAY[42,5,9,24,1], 5, 120);
subarray
----------
{1}
(1 row)
在这种情况下sort
和uniq
没有进一步的效果。
这是为了什么?谁知道,因为您没有提供可能提供线索的输入数组。
请参阅intarray 文档。