Itu ditentukan oleh aturan Resolusi Jenis Fungsi . Penjelasan rinci dalam manual. Terkait:
- Apakah ada cara untuk menonaktifkan fungsi yang berlebihan di Postgres
NULL tanpa pemeran tipe eksplisit dimulai sebagai tipe "tidak diketahui":
SELECT pg_typeof(NULL)
pg_typeof
-----------
unknown
Sebenarnya, Saya curiga dan menjalankan tes cepat, hanya untuk menemukan hasil yang berbeda di Postgres 9.3 dan 9.4. varchar
diambil dari integer
(yang anehnya bertentangan dengan temuan Anda):
SQL Fiddle.
Menurut saya aturan yang sesuai adalah poin 4e dalam daftar (tidak ada poin sebelumnya yang menentukan pertandingan):
Di setiap posisi, pilih kategori string jika ada kandidat yang menerima kategori tersebut. (Bias terhadap string ini sesuai karena literal tipe tidak dikenal terlihat seperti string.)
Jika Anda menambahkan fungsi lain dengan jenis input text
ke campuran yang kelebihan beban, text
akan diambil dari varchar
.
Secara pribadi saya hampir selalu gunakan text
bukannya varchar
. Meskipun kompatibel dengan biner (hampir tetapi tidak persis sama), text
lebih dekat ke jantung Postgres dalam segala hal.
Saya menambahkan itu ke biola, serta contoh lain di mana Postgres tidak dapat memutuskan dan membuat ulah.
Jika Anda ingin memilih fungsi tertentu, tambahkan pemeran tipe eksplisit (itulah caranya!):
select test(null::int) AS func_int
, test(null::varchar) AS func_vc;