Casting tipo NULL al actualizar varias filas

Tengo un problema cuando intento actualizar muchas filas al mismo tiempo.

Aquí está la tabla y la consulta que uso (simplificada para una mejor lectura):

mesa

CREATE TABLE foo
(
    pkid integer,
    x integer,
    y integer
)

consulta

UPDATE foo SET x=t.x, y=t.y FROM
(VALUES (50, 50, 1),
        (100, 120, 2))
AS t(x, y, pkid) WHERE foo.pkid=t.pkid

Esta consulta funciona perfectamente, pero cuando intento ejecutar una consulta donde todosx oy Los valores son nulos, me sale un error:

consulta con nulos

UPDATE foo SET x=t.x, y=t.y FROM
(VALUES (null, 20, 1),
        (null, 50, 2))
AS t(x, y, pkid) WHERE foo.pkid=t.pkid

error

ERROR:  column "x" is of type integer but expression is of type text
LINE 1: UPDATE foo SET x=t.x FROM

La única forma de solucionarlo es cambiar al menos uno de los valores(null, 20, 1) a(null:int, 50, 2) pero no puedo hacer eso, ya que tengo una función que genera estas consultas de "actualización de varias filas" y no sabe nada sobre los tipos de columna.

¿Cuál es la mejor solución aquí? ¿Hay alguna consulta de actualización mejor para múltiples filas? ¿Hay alguna función o sintaxis comoAS t(x:gettype(foo.x), y:gettype(foo.y), pkid:gettype(foo.pkid))?

Respuestas a la pregunta(3)

Su respuesta a la pregunta