このコードは、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のドキュメントを参照してください。