Pgx: NullInt32 - could not determine data type of parameter $1

Created on 8 Jun 2017  路  2Comments  路  Source: jackc/pgx

I'm trying to run a query with an optional WHERE:

//userid is pgx.NullInt32
//count is int
//offset is int

//if userid.Valid is false this should evaluate to NULL is NULL, and thus not filter on userid 
rows, err := dbPool.Query(`SELECT id, userid, timestamp, downloadsize FROM videos
                        WHERE ($1 IS NULL OR userid=$1) 
                        LIMIT $2
                        OFFSET $3`, userid, count, offset)

Table videos looks like:

id              uuid
userid          integer
timestamp       timestamp without timezone
downloadsize    integer

But this returns the error could not determine data type of parameter $1 (SQLSTATE 42P08). The error occurs both when userid.Valid is true and when false.

What am I doing wrong?

Most helpful comment

The problem is $1 IS NULL. pgx will use prepared statements under the hood. When preparing that statement PostgreSQL cannot infer what type $1 is. You can see the same thing in the psql client.

jack=# prepare ps as select 'foo' where $1 is null;
ERROR:  could not determine data type of parameter $1

Solution is to include a typecast.

jack=# prepare ps as select 'foo' where $1::int is null;
PREPARE

All 2 comments

The problem is $1 IS NULL. pgx will use prepared statements under the hood. When preparing that statement PostgreSQL cannot infer what type $1 is. You can see the same thing in the psql client.

jack=# prepare ps as select 'foo' where $1 is null;
ERROR:  could not determine data type of parameter $1

Solution is to include a typecast.

jack=# prepare ps as select 'foo' where $1::int is null;
PREPARE

Oohh I see! Thank you!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Zamiell picture Zamiell  路  10Comments

kokizzu picture kokizzu  路  6Comments

Oliver-Fish picture Oliver-Fish  路  4Comments

jeromer picture jeromer  路  11Comments

pengux picture pengux  路  3Comments