W rzeczywistości są tam trzy pytania, na które postaram się odpowiedzieć.
-
Jaki jest cel
unknown
?Jest to typ danych początkowo przypisany do wartości NULL i literałów łańcuchowych w instrukcjach SQL. Jeśli takie literały zostały przypisane, wpisz
text
od razu trudno byłoby wywnioskować właściwy typ.Na przykład chcesz
myfunc('hello')
wywołaćmyfunc(character varying)
, ale nie ma niejawnego rzutowania typu ztext
nacharacter varying
(i spowodowałoby to niejednoznaczność, gdybyś je stworzył). -
Dlaczego
SELECT null
zwrócić kolumnę typuunknown
?Tradycyjna odpowiedź brzmi:ponieważ użytkownik nie określił typu.
Jednak to zachowanie było problematyczne. Na przykład, jeśli utworzysz taką tabelę:
CREATE TABLE test AS SELECT 'hello';
skończysz z kolumną typu
unknown
, co jest niepożądane i spowoduje dalsze problemy. Typunknown
naprawdę nie powinien być widoczny dla użytkownika, ale raczej szczegół implementacji.W związku z tym to zatwierdzenie zmienił zachowanie z PostgreSQL v10 na:Teraz każdy
unknown
s pozostały wSELECT
lubRETURNING
lista jest zmuszona dotext
, a tabel nie można tworzyć z kolumnami typuunknown
. -
Dlaczego
SELECT NULL UNION SELECT 42
działa, ale nieSELECT NULL UNION SELECT NULL UNION SELECT 42
?Wynika to z zasad konwersji typów .
UNION
jest skojarzone, więc drugie zapytanie jest interpretowane jako(SELECT NULL UNION SELECT NULL) UNION SELECT 42;
Teraz pierwszy
UNION
zamienia się na typ danychtext
z powodu zasady 3:Powoduje to błąd podczas próby rozwiązania typu dla drugiej
UNION
z powodu zasady 4:Z drugiej strony w zapytaniu
SELECT NULL UNION SELECT 42;
„NULL” ma typ
unknown
, a „42” ma typinteger
(typ wybrany dla literałów numerycznych bez kropki dziesiętnej).Zasada 5
nie ma tu zastosowania, ponieważ
integer
nie jest preferowanym typem w swojej kategorii (to byłobyoid
idouble precision
), więc stosowana jest zasada 6:Daje to typ
integer
.