¿Qué significa %% en PL / pgSQL?

Estaba leyendo la solución de fragmentación de Instagram y noté la siguiente línea:

SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id; 

¿Qué hace el %% en la línea SELECT arriba? Busqué PostgreSQL y lo único que encontré fue que %% se utiliza cuando quieres usar un carácter de porcentaje literal.

 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; 

El único lugar en el que puedo pensar, donde un % se duplicaría en Postgres estándar, está dentro de la function format() , comúnmente utilizada para producir una cadena de consulta para SQL dynamic. Compare ejemplos aquí en SO.

El manual :

Además de los especificadores de formatting descritos anteriormente, la secuencia especial %% se puede usar para generar un carácter % literal.

¡Tricky al usar el operador de module % en una statement dinámica!

Sospecho que están ejecutando SQL dynamic detrás de las cortinas, que generalizaron y simplificaron para el artículo. (El nombre calificado de esquema de la secuencia es 'insta5.table_id_seq' y la tabla no se llamaría 'tabla'.) En el process, olvidaron "desactivar '' el operador de module.
Eso es lo que realmente están ejecutando:

 EXECUTE format($$SELECT nextval('%I') %% 1024$$, seq_name) INTO seq_id; 

Con la installation pnetworkingeterminada (en 9.2):

 ERROR: operator does not exist: bigint %% integer SQL state: 42883 

Entonces yo diría que podría ser

  • un operador personalizado
  • o un error tipográfico, y quieren escribir el operador de module: %

Parece un operador de module escapado para mí.