Esta sección describe el formato detallado de cada mensaje. Cada uno está marcado para indicar si puede ser enviado por el frontend (F), el backend (B) o ambos (F & B). Ten en cuenta que aunque cada mensaje incluye un recuento de bytes al principio, la mayoría de los mensajes están definidos de manera que el final del mensaje se pueda encontrar sin hacer referencia al recuento de bytes. Esto se debe a razones históricas, ya que la versión original del protocolo (ahora obsoleta 2) no tenía un campo de longitud explícito. Sin embargo, también ayuda a la comprobación de validez.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que la autenticación fue exitosa.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que se requiere la autenticación Kerberos V5.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que se requiere una contraseña en texto claro.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que se requiere una contraseña cifrada con MD5.
La sal (salt) a utilizar al cifrar la contraseña.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que se requiere la autenticación GSSAPI.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que este mensaje contiene datos GSSAPI o SSPI.
nDatos de autenticación GSSAPI o SSPI.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que se requiere la autenticación SSPI.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que se requiere la autenticación SASL.
El cuerpo del mensaje es una lista de mecanismos de autenticación SASL, en el orden de preferencia del servidor. Se requiere un byte cero como terminador después del último nombre de mecanismo de autenticación. Para cada mecanismo, se presenta lo siguiente:
Nombre de un mecanismo de autenticación SASL.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que este mensaje contiene un desafío SASL.
nDatos SASL, específicos del mecanismo SASL en uso.
Identifica el mensaje como una solicitud de autenticación.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica que la autenticación SASL ha finalizado.
n"Datos adicionales" del resultado de SASL, específicos del mecanismo SASL en uso.
Identifica el mensaje como datos de la clave de cancelación. El frontend debe guardar estos valores si desea poder emitir mensajes CancelRequest más adelante.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El ID de proceso de este backend.
nLa clave secreta de este backend. Este campo se extiende hasta el final del mensaje, indicado por el campo de longitud.
La longitud mínima y máxima de la clave es de 4 y 256 bytes, respectivamente. El servidor de PostgreSQL solo envía claves de hasta 32 bytes, pero el tamaño máximo más grande permite que las futuras versiones del servidor, así como los gestores de colas de conexiones (connection poolers) y otros intermediarios (middleware), utilicen claves más largas. Un posible caso de uso es complementar la clave del servidor con información adicional. Por lo tanto, también se recomienda a los intermediarios no utilizar todos los bytes, en caso de que se superpongan múltiples aplicaciones intermediarias, cada una de las cuales podría envolver la clave con datos adicionales.
Antes de la versión 3.2 del protocolo, la clave secreta siempre tenía una longitud de 4 bytes.
Identifica el mensaje como un comando Bind.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El nombre del portal de destino (una cadena vacía selecciona el portal sin nombre).
El nombre de la sentencia preparada de origen (una cadena vacía selecciona la sentencia preparada sin nombre).
El número de códigos de formato de parámetros que siguen
(denotado como C más abajo).
Puede ser cero para indicar que no hay parámetros
o que todos los parámetros usan el formato por defecto (texto);
o uno, en cuyo caso el código de formato especificado se aplica
to todos los parámetros; o puede ser igual al número real de
parámetros.
C]Los códigos de formato de los parámetros. Actualmente, cada uno debe ser cero (texto) o uno (binario).
El número de valores de parámetros que siguen (posiblemente cero). Debe coincidir con el número de parámetros requeridos por la consulta.
A continuación, aparece el siguiente par de campos para cada parámetro:
La longitud del valor del parámetro, en bytes (este recuento no se incluye a sí mismo). Puede ser cero. Como caso especial, -1 indica un valor de parámetro NULL. No siguen bytes de valor en el caso NULL.
n
El valor del parámetro, en el formato indicado por el
código de formato asociado.
n es la longitud anterior.
Después del último parámetro, aparecen los siguientes campos:
El número de códigos de formato de columna de resultado que siguen
(denotado como R más abajo).
Puede ser cero para indicar que no hay columnas de resultado
o que todas las columnas de resultado deben usar el formato por defecto
(texto);
o uno, en cuyo caso el código de formato especificado se aplica
a todas las columnas de resultado (si las hay); o puede ser igual al
número real de columnas de resultado de la consulta.
R]Los códigos de formato de la columna de resultado. Actualmente, cada uno debe ser cero (texto) o uno (binario).
Identifica el mensaje como un indicador de Bind finalizado (Bind-complete).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El código de la solicitud de cancelación. El valor se elige para contener
1234 en los 16 bits más significativos y 5678 en los
16 bits menos significativos. (Para evitar confusiones, este código
no debe ser el mismo que cualquier número de versión del protocolo).
El ID de proceso del backend de destino.
nLa clave secreta para el backend de destino. Este campo se extiende hasta el final del mensaje, indicado por el campo de longitud. La longitud máxima de la clave es de 256 bytes.
Antes de la versión 3.2 del protocolo, la clave secreta siempre tenía una longitud de 4 bytes.
Identifica el mensaje como un comando Close.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
'S' para cerrar una sentencia preparada; o
'P' para cerrar un portal.
El nombre de la sentencia preparada o portal a cerrar (una cadena vacía selecciona la sentencia preparada o el portal sin nombre).
Identifica el mensaje como un indicador de Close finalizado (Close-complete).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como una respuesta de comando completado.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
La etiqueta del comando. Usualmente es una sola palabra que identifica qué comando SQL se ha completado.
Para un comando INSERT, la etiqueta es
INSERT , donde
oid
rowsrows es el número de filas insertadas.
oid solía ser el ID de objeto de la fila
insertada si rows era 1 y la tabla de destino
tenía OIDs, pero las columnas de sistema OID ya no son compatibles; por
lo tanto, oid siempre es 0.
Para un comando DELETE, la etiqueta es
DELETE donde
rowsrows es el número de filas eliminadas.
Para un comando UPDATE, la etiqueta es
UPDATE donde
rowsrows es el número de filas actualizadas.
Para un comando MERGE, la etiqueta es
MERGE donde
rowsrows es el número de filas insertadas,
actualizadas o eliminadas.
Para un comando SELECT o CREATE TABLE AS,
la etiqueta es SELECT
donde rowsrows es el número de filas recuperadas.
Para un comando MOVE, la etiqueta es
MOVE donde
rowsrows es el número de filas en las que se ha
cambiado la posición del cursor.
Para un comando FETCH, la etiqueta es
FETCH donde
rowsrows es el número de filas que se han recuperado
del cursor.
Para un comando COPY, la etiqueta es
COPY donde
rowsrows es el número de filas copiadas.
(Nota: el recuento de filas solo aparece en
PostgreSQL 8.2 y posteriores).
Identifica el mensaje como datos de COPY.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
n
Datos que forman parte de un flujo de datos COPY.
Los mensajes enviados desde el backend siempre corresponderán a filas de datos
individuales, pero los mensajes enviados por los frontends pueden dividir el
flujo de datos de manera arbitraria.
Identifica el mensaje como un indicador de COPY finalizado.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como un indicador de error de COPY.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Un mensaje de error para informar como la causa del fallo.
Identifica el mensaje como una respuesta de inicio de Copy In. El frontend ahora debe enviar los datos de copy-in (si no está preparado para hacerlo, debe enviar un mensaje CopyFail).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
0 indica que el formato general de COPY es textual
(filas separadas por saltos de línea, columnas separadas por caracteres
separadores, etc.).
1 indica que el formato general de copia es binario (similar
al formato de DataRow).
Consulta COPY
para obtener más información.
El número de columnas en los datos que se van a copiar
(denotado como N más abajo).
N]Los códigos de formato que se utilizarán para cada columna. Actualmente, cada uno debe ser cero (texto) o uno (binario). Todos deben ser cero si el formato general de copia es textual.
Identifica el mensaje como una respuesta de inicio de Copy Out. Este mensaje será seguido por datos de copy-out.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
0 indica que el formato general de COPY
es textual (filas separadas por saltos de línea, columnas
separadas por caracteres separadores, etc.). 1 indica
que el formato general de copia es binario (similar al formato de DataRow).
Consulta COPY para obtener más información.
El número de columnas en los datos que se van a copiar
(denotado como N más abajo).
N]Los códigos de formato que se utilizarán para cada columna. Actualmente, cada uno debe ser cero (texto) o uno (binario). Todos deben ser cero si el formato general de copia es textual.
Identifica el mensaje como una respuesta de inicio de Copy Both. Este mensaje se utiliza únicamente para la replicación en flujo (Streaming Replication).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
0 indica que el formato general de COPY
es textual (filas separadas por saltos de línea, columnas
separadas por caracteres separadores, etc.). 1 indica
que el formato general de copia es binario (similar al formato de DataRow).
Consulta COPY para obtener más información.
El número de columnas en los datos que se van a copiar
(denotado como N más abajo).
N]Los códigos de formato que se utilizarán para cada columna. Actualmente, cada uno debe ser cero (texto) o uno (binario). Todos deben ser cero si el formato general de copia es textual.
Identifica el mensaje como una fila de datos.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El número de valores de columna que siguen (posiblemente cero).
A continuación, aparece el siguiente par de campos para cada columna:
La longitud del valor de la columna, en bytes (este recuento no se incluye a sí mismo). Puede ser cero. Como caso especial, -1 indica un valor de columna NULL. No siguen bytes de valor en el caso NULL.
n
El valor de la columna, en el formato indicado por el
código de formato asociado.
n es la longitud anterior.
Identifica el mensaje como un comando Describe.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
'S' para describir una sentencia preparada; o
'P' para describir un portal.
El nombre de la sentencia preparada o portal a describir (una cadena vacía selecciona la sentencia preparada o portal sin nombre).
Identifica el mensaje como una respuesta a una cadena de consulta vacía. (Esto sustituye a CommandComplete).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como un error.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El cuerpo del mensaje consiste en uno o más campos identificados, seguidos de un byte cero como terminador. Los campos pueden aparecer en cualquier orden. Para cada campo se presenta lo siguiente:
Un código que identifica el tipo de campo; si es cero, este es el terminador del mensaje y no le sigue ninguna cadena. Los tipos de campo actualmente definidos se enumeran en Section 54.8. Dado que se podrían agregar más tipos de campos en el futuro, los frontends deben ignorar silenciosamente los campos de tipo no reconocido.
El valor del campo.
Identifica el mensaje como un comando Execute.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El nombre del portal a ejecutar (una cadena vacía selecciona el portal sin nombre).
Número máximo de filas a devolver, si el portal contiene una consulta que devuelve filas (se ignora en caso contrario). Cero indica “sin límite”.
Identifica el mensaje como un comando Flush.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como una llamada a función.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica el OID (object ID) de la función a llamar.
El número de códigos de formato de argumentos que siguen
(denotado como C más abajo).
Puede ser cero para indicar que no hay argumentos
o que todos los argumentos usan el formato por defecto (texto);
o uno, en cuyo caso el código de formato especificado se aplica
a todos los argumentos; o puede ser igual al número real de
argumentos.
C]Los códigos de formato de los argumentos. Actualmente, cada uno debe ser cero (texto) o uno (binario).
Especifica el número de argumentos que se suministran a la función.
A continuación, aparece el siguiente par de campos para cada argumento:
La longitud del valor del argumento, en bytes (este recuento no se incluye a sí mismo). Puede ser cero. Como caso especial, -1 indica un valor de argumento NULL. No siguen bytes de valor en el caso NULL.
n
El valor del argumento, en el formato indicado por el
código de formato asociado.
n es la longitud anterior.
Después del último argumento, aparece el siguiente campo:
El código de formato para el resultado de la función. Actualmente debe ser cero (texto) o uno (binario).
Identifica el mensaje como el resultado de una llamada a función.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
La longitud del valor del resultado de la función, en bytes (este recuento no se incluye a sí mismo). Puede ser cero. Como caso especial, -1 indica un resultado de función NULL. No siguen bytes de valor en el caso NULL.
n
El valor del resultado de la función, en el formato indicado por
el código de formato asociado.
n es la longitud anterior.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El código de solicitud de cifrado de GSSAPI. El valor se elige para contener
1234 en los 16 bits más significativos y 5680 en los
16 bits menos significativos. (Para evitar confusiones, este código
no debe ser el mismo que cualquier número de versión del protocolo).
Identifica el mensaje como una respuesta GSSAPI o SSPI. Ten en cuenta que esto también se utiliza para mensajes de respuesta SASL y contraseña. El tipo de mensaje exacto se puede deducir del contexto.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
nDatos de mensaje específicos de GSSAPI/SSPI.
Identifica el mensaje como un mensaje de negociación de versión de protocolo.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
La versión de protocolo menor más nueva admitida por el servidor para la versión de protocolo mayor solicitada por el cliente.
Número de opciones de protocolo no reconocidas por el servidor.
Luego, para cada opción de protocolo no reconocida por el servidor, se presenta lo siguiente:
El nombre de la opción.
Identifica el mensaje como un indicador de que no hay datos (no-data).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como un aviso (notice).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El cuerpo del mensaje consiste en uno o más campos identificados, seguidos de un byte cero como terminador. Los campos pueden aparecer en cualquier orden. Para cada campo se presenta lo siguiente:
Un código que identifica el tipo de campo; si es cero, este es el terminador del mensaje y no le sigue ninguna cadena. Los tipos de campo actualmente definidos se enumeran en Section 54.8. Dado que se podrían agregar más tipos de campos en el futuro, los frontends deben ignorar silenciosamente los campos de tipo no reconocido.
El valor del campo.
Identifica el mensaje como una respuesta de notificación (notification response).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El ID de proceso del proceso backend que realiza la notificación.
El nombre del canal sobre el cual se ha emitido la notificación.
La cadena de carga útil (“payload”) transmitida desde el proceso que realiza la notificación.
Identifica el mensaje como una descripción de parámetros.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El número de parámetros utilizados por la sentencia (puede ser cero).
Luego, para cada parámetro, se presenta lo siguiente:
Especifica el OID (object ID) del tipo de datos del parámetro.
Identifica el mensaje como un informe de estado de parámetros en tiempo de ejecución.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El nombre del parámetro en tiempo de ejecución del cual se informa.
El valor actual del parámetro.
Identifica el mensaje como un comando Parse.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El nombre de la sentencia preparada de destino (una cadena vacía selecciona la sentencia preparada sin nombre).
La cadena de consulta a analizar.
El número de tipos de datos de parámetros especificados (puede ser cero). Ten en cuenta que esto no es una indicación del número de parámetros que podrían aparecer en la cadena de consulta, sino únicamente el número para el cual el frontend desea preespecificar los tipos.
Luego, para cada parámetro, se presenta lo siguiente:
Especifica el OID (object ID) del tipo de datos del parámetro. Colocar un cero aquí equivale a dejar el tipo sin especificar.
Identifica el mensaje como un indicador de Parse finalizado (Parse-complete).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como una respuesta de contraseña. Ten en cuenta que esto también se utiliza para mensajes de respuesta GSSAPI, SSPI y SASL. El tipo de mensaje exacto se puede deducir del contexto.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
La contraseña (cifrada, si se solicitó).
Identifica el mensaje como un indicador de portal suspendido. Ten en cuenta que esto solo aparece si se alcanzó el límite de recuento de filas de un mensaje Execute.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como una consulta simple.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
La propia cadena de consulta.
Identifica el tipo de mensaje. ReadyForQuery se envía cada vez que el backend está listo para un nuevo ciclo de consulta.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Indicador de estado de la transacción backend actual.
Los valores posibles son 'I' si está inactivo
(idle, no en un bloque de transacción); 'T' si está en un
bloque de transacción; o 'E' si está en un bloque de
transacción fallido (las consultas serán rechazadas hasta que termine el bloque).
Identifica el mensaje como una descripción de fila.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Especifica el número de campos en una fila (puede ser cero).
Luego, para cada campo, se presenta lo siguiente:
El nombre del campo.
Si el campo se puede identificar como una columna de una específica tabla, el OID (object ID) de la tabla; de lo contrario, cero.
Si el campo se puede identificar como una columna de una específica tabla, el número de atributo de la columna; de lo contrario, cero.
El OID (object ID) del tipo de datos del campo.
El tamaño del tipo de datos (ver pg_type.typlen).
Ten en cuenta que los valores negativos denotan tipos de ancho variable.
El modificador de tipo (ver pg_attribute.atttypmod).
El significado del modificador es específico de cada tipo.
El código de formato utilizado para el campo. Actualmente será cero (texto) o uno (binario). En un RowDescription devuelto por la variante de sentencia de Describe, el código de formato aún no se conoce y siempre será cero.
Identifica el mensaje como una respuesta SASL inicial. Ten en cuenta que esto también se utiliza para mensajes de respuesta GSSAPI, SSPI y contraseña. El tipo de mensaje exacto se deduce del contexto.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Nombre del mecanismo de autenticación SASL que seleccionó el cliente.
Longitud de la "Respuesta inicial del cliente" específica del mecanismo SASL que sigue, o -1 si no hay Respuesta inicial.
n"Respuesta inicial" específica del mecanismo SASL.
Identifica el mensaje como una respuesta SASL. Ten en cuenta que esto también se utiliza para mensajes de respuesta GSSAPI, SSPI y contraseña. El tipo de mensaje exacto se puede deducir del contexto.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
nDatos de mensaje específicos del mecanismo SASL.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El código de la solicitud SSL. El valor se elige para contener
1234 en los 16 bits más significativos y 5679 en los
16 bits menos significativos. (Para evitar confusiones, este código
no debe ser el mismo que cualquier número de versión del protocolo).
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
El número de versión del protocolo. Los 16 bits más significativos son el número de versión mayor (3 para el protocolo aquí descrito). Los 16 bits menos significativos son el número de versión menor (2 para el protocolo aquí descrito).
El número de versión del protocolo es seguido por uno o más pares de
cadenas de nombre y valor del parámetro. Se requiere un byte cero como
terminador después del último par de nombre/valor. Los parámetros pueden
aparecer en cualquier orden. Se requiere user, otros son opcionales.
Cada parámetro se especifica como:
El nombre del parámetro. Los nombres actualmente reconocidos son:
userEl nombre de usuario de la base de datos para conectarse. Requerido; no hay un valor predeterminado.
databaseLa base de datos a la que conectarse. El valor predeterminado es el nombre de usuario.
options
Argumentos de línea de comandos para el backend. (Esto está
en desuso en favor de la configuración de parámetros individuales
en tiempo de ejecución). Los espacios dentro de esta cadena se
consideran para separar argumentos, a menos que se escapen con
una barra diagonal inversa (\); escribe \\ para
representar una barra diagonal inversa literal.
replication
Se utiliza para conectarse en modo de replicación en flujo
(streaming replication), donde se puede emitir un pequeño
conjunto de comandos de replicación en lugar de sentencias SQL. El valor
puede ser true, false o
database, y el valor predeterminado es
false. Consulta
Section 54.4 para obtener más detalles.
Además de los anteriores, se pueden enumerar otros parámetros.
Los nombres de parámetros que comienzan con _pq_. están
reservados para su uso como extensiones de protocolo, mientras que otros se
tratan como parámetros en tiempo de ejecución para ser establecidos al inicio
del backend. Dichos ajustes se aplicarán durante el inicio del backend
(después de analizar los argumentos de la línea de comandos, si los hay) y
actuarán como valores predeterminados de la sesión.
El valor del parámetro.
Identifica el mensaje como un comando Sync.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.
Identifica el mensaje como una finalización.
Longitud del contenido del mensaje en bytes, incluyéndose a sí mismo.