Utilisez un cast de type explicite :
SELECT language, to_tsvector(language::regconfig, 'hello world') FROM languages;
Ou changez la colonne languages.language
pour taper regconfig
. Voir la réponse de @Swav.
Pourquoi ?
Postgres permet la surcharge de fonctions. Les signatures de fonction sont définies par leur (éventuellement schéma -qualifié) nom plus (la liste des) type de paramètre d'entrée (s). La forme à 2 paramètres de to_tsvector()
attend le type regconfig
comme premier paramètre :
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
Si aucune fonction existante ne correspond exactement , les règles de résolution de type de fonction décident de la meilleure correspondance, le cas échéant. C'est réussi pour to_tsvector('english', 'hello world')
, avec 'english'
étant un littéral de chaîne non typé . Mais échoue avec un paramètre tapé varchar
, car il n'y a pas d'enregistrement implicite cast depuis varchar
à regconfig
. Le manuel :
Ignorer les fonctions candidates pour lesquelles les types d'entrée ne correspondent pas et ne peuvent pas être converties (en utilisant une méthode implicite conversion) pour correspondre. littéraux inconnus sont supposés être convertibles en quoi que ce soit à cette fin.
Gras gras de la mienne.
Les casts enregistrés pour 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
Explication pour castcontext
:
castcontext char
Indique dans quels contextes le cast peut être invoqué.e
signifie uniquement en tant que cast explicite (en utilisantCAST
ou::
syntaxe).a
signifie implicitement dans l'affectation à une colonne cible, ainsi qu'explicitement.i
signifie implicitement dans les expressions, ainsi que les autres cas.
En savoir plus sur les trois différents types de devoirs dans le chapitre CREATE CAST.