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;