我正在阅读Instagrams sharding solution,我注意到以下一行:
SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;
上面的SELECT行中的%%是做什么的? 我查找了PostgreSQL,我发现的唯一一件事就是当你想使用字面百分比字符时使用%%。
CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$
DECLARE
our_epoch bigint := 1314220021721;
seq_id bigint;
now_millis bigint;
shard_id int := 5;
BEGIN
SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
result := (now_millis - our_epoch) << 23;
result := result | (shard_id << 10);
result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;
答案 0 :(得分:4)
我能想到的唯一的位置,%
在标准Postgres中加倍,在format()
函数中,通常用于生成查询字符串动态SQL。 Compare examples here on SO.
除了上面描述的格式说明符之外,还有特殊的 序列
%%
可用于输出文字%
字符。
在动态声明中使用modulo operator %
时很棘手!
我怀疑他们正在幕后运行动态SQL - 他们对文章进行了概括和简化。 (序列的模式限定名称为'insta5.table_id_seq'
,表格不会被命名为&#34; table&#34 ;.)在此过程中,他们忘记了&#34; unescape&#34;模运算符。
这就是他们实际可能正在运行的内容:
EXECUTE format($$SELECT nextval('%I') %% 1024$$, seq_name)
INTO seq_id;
答案 1 :(得分:2)
使用默认安装(在9.2上):
ERROR: operator does not exist: bigint %% integer
SQL state: 42883
所以我想说它可能是
%
答案 2 :(得分:1)
看起来像是对我进行了转义modulo operator。