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
textod 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 ztextnacharacter varying(i spowodowałoby to niejednoznaczność, gdybyś je stworzył). -
Dlaczego
SELECT nullzwró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. Typunknownnaprawdę 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
unknowns pozostały wSELECTlubRETURNINGlista jest zmuszona dotext, a tabel nie można tworzyć z kolumnami typuunknown. -
Dlaczego
SELECT NULL UNION SELECT 42działa, ale nieSELECT NULL UNION SELECT NULL UNION SELECT 42?Wynika to z zasad konwersji typów .
UNIONjest skojarzone, więc drugie zapytanie jest interpretowane jako(SELECT NULL UNION SELECT NULL) UNION SELECT 42;Teraz pierwszy
UNIONzamienia się na typ danychtextz powodu zasady 3:Powoduje to błąd podczas próby rozwiązania typu dla drugiej
UNIONz 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ż
integernie jest preferowanym typem w swojej kategorii (to byłobyoididouble precision), więc stosowana jest zasada 6:Daje to typ
integer.