Decydują o tym zasady Rozwiązywania typów funkcji . Szczegółowe wyjaśnienie w instrukcji. Powiązane:
- Czy istnieje sposób na wyłączenie przeciążania funkcji w Postgresie
NULL bez jawnego rzutowania typu zaczyna się jako typ „nieznany”:
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
Właściwie, Nabrałem podejrzeń i przeprowadziłem szybki test, aby znaleźć różne wyniki w Postgresie 9.3 i 9.4. varchar
jest wybierany przez integer
(co dziwne jest sprzeczny z twoimi ustaleniami):
Skrzypce SQL.
Myślę, że taka zasada to punkt 4e na liście (żaden z wcześniejszych punktów nie decyduje o meczu):
Na każdej pozycji wybierz kategorię ciągu, jeśli jakikolwiek kandydat akceptuje tę kategorię. (To nastawienie na łańcuch jest odpowiednie, ponieważ literał nieznanego typu wygląda jak łańcuch.)
Jeśli dodałeś inną funkcję z typem wejściowym text
do przeładowanego miksu, text
zostanie wybrany przez varchar
.
Osobiście prawie zawsze użyj text
zamiast varchar
. Będąc kompatybilnym z plikami binarnymi (czyli prawie, ale nie do końca tak samo), text
jest bliżej serca Postgresa pod każdym względem.
Dodałem to do skrzypiec, a także innego przykładu, w którym Postgres nie może się zdecydować i wpada w złość.
Jeśli chcesz wybrać konkretną funkcję, dodaj jawne rzutowanie typu (to jest droga!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;