Brug en eksplicit type cast:
SELECT language, to_tsvector(language::regconfig, 'hello world') FROM languages;
Eller skift kolonnen languages.language
for at skrive regconfig
. Se @Swavs svar.
Hvorfor?
Postgres tillader funktionsoverbelastning. Funktionssignaturer er defineret af deres (valgfrit skema -kvalificeret) navn plus (listen over) input parametertype (s). Den 2-parameter form af to_tsvector()
forventer typen regconfig
som første parameter:
SELECT proname, pg_get_function_arguments(oid)
FROM pg_catalog.pg_proc
WHERE proname = 'to_tsvector'
proname | pg_get_function_arguments
-------------+---------------------------
to_tsvector | text
to_tsvector | regconfig, text -- you are here
Hvis ingen eksisterende funktion matcher nøjagtigt , reglerne for funktionstypeopløsning bestemmer det bedste match - hvis nogen. Dette er lykkedes for to_tsvector('english', 'hello world')
, med 'english'
være en utypestrenget bogstavelig . Men fejler med en parameter indtastet varchar
, fordi der ikke er nogen registreret implicit cast fra varchar
til regconfig
. Manualen:
Kassér kandidatfunktioner, for hvilke inputtyperne ikke stemmer overens og ikke kan konverteres (ved hjælp af en implicit konvertering) for at matche. ukendte bogstaver antages at kunne konverteres til hvad som helst til dette formål.
Fed fremhævelse mine.
De registrerede casts til regconfig
:
SELECT castsource::regtype, casttarget::regtype, castcontext
FROM pg_catalog.pg_cast
WHERE casttarget = 'regconfig'::regtype;
castsource | casttarget | castcontext
------------+------------+-------------
oid | regconfig | i
bigint | regconfig | i
smallint | regconfig | i
integer | regconfig | i
Forklaring på castcontext
:
castcontext char
Indikerer, hvilke sammenhænge rollebesætningen kan påberåbes i. e
betyder kun som en eksplicit cast (ved hjælp af CAST
eller ::
syntaks). a
betyder implicit i tildeling til en målkolonne, såvel som eksplicit. i
betyder implicit i udtryk, såvel som de andre tilfælde.
Læs mere om de tre forskellige opgavetyper i kapitlet OPRET CAST.