El acceso a la tabla pg_statistic está restringido a
superusuarios, de modo que los usuarios comunes no puedan conocer el contenido de las
tablas de otros usuarios a partir de ella. Algunas funciones de estimación de selectividad
utilizarán un operador proporcionado por el usuario (ya sea el operador que aparece en la consulta o
un operador relacionado) para analizar las estadísticas almacenadas. Por ejemplo, para
determinar si un valor más común almacenado es aplicable, el
estimador de selectividad tendrá que ejecutar el operador =
adecuado para comparar la constante en la consulta con el valor almacenado.
Por lo tanto, los datos en pg_statistic se pasan potencialmente
a operadores definidos por el usuario. Un operador diseñado adecuadamente puede
filtrar intencionadamente los operandos pasados (por ejemplo, registrándolos
o escribiéndolos en una tabla diferente), o filtrarlos accidentalmente mostrando
sus valores en mensajes de error, exponiendo en cualquier caso datos de
pg_statistic a un usuario que no debería poder
verlos.
Para evitar esto, lo siguiente se aplica a todas las funciones de estimación de selectividad
incorporadas. Al planificar una consulta, para poder utilizar las
estadísticas almacenadas, el usuario actual debe tener
el privilegio SELECT en la tabla o en las columnas involucradas,
o bien el operador utilizado debe ser LEAKPROOF (más
precisamente, la función en la que se basa el operador). De lo contrario, el
estimador de selectividad se comportará como si no hubiera estadísticas disponibles, y
el planificador procederá con suposiciones predeterminadas o de respaldo.
El metacomando
\do+
del programa psql es útil para determinar qué operadores están marcados como leakproof.
Si un usuario no tiene el privilegio requerido en la tabla o columnas, entonces, en muchos casos, la consulta finalmente recibirá un error de permiso denegado, en cuyo caso este mecanismo es invisible en la práctica. Pero si el usuario está leyendo desde una vista de barrera de seguridad (security-barrier view), entonces el planificador podría desear verificar las estadísticas de una tabla subyacente que de otro modo es inaccesible para el usuario. En ese caso, el operador debe ser leakproof o las estadísticas no se utilizarán. No hay comentarios directos sobre eso, excepto que el plan podría ser subóptimo. Si uno sospecha que este es el caso, podría intentar ejecutar la consulta como un usuario más privilegiado, para ver si resulta un plan diferente.
Esta restricción se aplica únicamente a los casos en los que el planificador necesitaría
ejecutar un operador definido por el usuario en uno o más valores
de pg_statistic. Por lo tanto, se permite al planificador
utilizar información estadística genérica, como la fracción de valores nulos
o el número de valores distintos en una columna, independientemente de los privilegios
de acceso.
Las funciones de estimación de selectividad contenidas en extensiones de terceros que potencialmente operan sobre estadísticas con operadores definidos por el usuario deben seguir las mismas reglas de seguridad. Consulta el código fuente de PostgreSQL para obtener orientación.