En realidad, hay tres preguntas que intentaré responder.
-
¿Cuál es el propósito de
unknown?Este es el tipo de datos asignado inicialmente a NULL y literales de cadena en declaraciones SQL. Si tales literales fueran asignados escriba
textinmediatamente, sería difícil inferir el tipo correcto.Por ejemplo, quieres
myfunc('hello')para invocarmyfunc(character varying), pero no hay una conversión de tipos implícita detextacharacter varying(y causaría ambigüedad si crearas uno). -
¿Por qué
SELECT nulldevolver una columna de tipounknown?La respuesta tradicional es:porque el usuario no especificó el tipo.
Sin embargo, este comportamiento ha sido problemático. Por ejemplo, si crea una tabla como esta:
CREATE TABLE test AS SELECT 'hello';terminaría con una columna de tipo
unknown, lo cual es indeseable y causará problemas más adelante. El tipounknownrealmente no debería ser visible para el usuario, sino más bien un detalle de implementación.En consecuencia, este compromiso ha cambiado el comportamiento de PostgreSQL v10 en:Ahora cualquier
unknownqueda en unSELECToRETURNINGla lista está obligada atext, y las tablas no se pueden crear con columnas de tipounknown. -
¿Por qué
SELECT NULL UNION SELECT 42funciona, pero noSELECT NULL UNION SELECT NULL UNION SELECT 42?Esto se debe a las reglas de conversión de tipos .
UNIONse deja asociativa, por lo que la última consulta se interpreta como(SELECT NULL UNION SELECT NULL) UNION SELECT 42;Ahora el primer
UNIONse resuelve en el tipo de datostextpor la regla 3:Esto provoca un error al intentar resolver el tipo para el segundo
UNIONdebido a la regla 4:Por otro lado, en la consulta
SELECT NULL UNION SELECT 42;“NULL” tiene tipo
unknown, y "42" tiene tipointeger(el tipo elegido para literales numéricos sin punto decimal).Regla 5
no se aplica aquí, porque
integerno es un tipo preferido en su categoría (que seríaoidydouble precision), por lo que se utiliza la regla 6:Esto da como resultado un tipo de
integer.