Thread: Updating a chkpass column in postgres v8.1.21

Updating a chkpass column in postgres v8.1.21

From
"Nelson, Howard C"
Date:

I am using the JDBC prepareStatement object to build a SQL statement that should update a users password in a postgres v8.1.21 database.  (Based on what I have read, chkpass became a “contrib module” starting at 8.3, but I have to use an older version of postgres.)  Here is my java code/snippet:

 

// Build an SQL statement with caller's parameters

private static final String m_defaultPass = "changeme";   

stmtStr = "UPDATE users SET pwd_date=now(), pwd=? " + "WHERE user_id=?;";

stmt = con.prepareStatement(stmtStr);

stmt.setString(1, m_defaultPass);

stmt.setString(2, userId);

    

(userId is a String that is passed into the method)

 

The password column in the database is defined as type chkpass.

userdb=# \d users

                                               Table "public.users"

      Column       |            Type             |                             Modifiers

-------------------+-----------------------------+-------------------------------------------------------------------

user_pk           | integer                     | not null default nextval(('"users_user_pk_seq"'::text)::regclass)

user_id           | character varying(10)       | not null

pwd               | chkpass                     | not null

 :

 

chkpass is a user created type, and is defined as follows:

CREATE TYPE chkpass (

    INTERNALLENGTH = 16,

    INPUT = chkpass_in,

    OUTPUT = chkpass_out,

    ALIGNMENT = int4,

    STORAGE = plain

);

 

When the above java snippet is executed, I get the following error:

   column "pwd" is of type chkpass but expression is of type character varying.

 

How do I modify my SQL statement to get this to work properly?

 

Thanks in advance!

Howard

 

Re: Updating a chkpass column in postgres v8.1.21

From
Tom Lane
Date:
"Nelson, Howard C" <howard.c.nelson@lmco.com> writes:
> I am using the JDBC prepareStatement object to build a SQL statement that should update a users password in a
postgresv8.1.21 database.  (Based on what I have read, chkpass became a "contrib module" starting at 8.3, but I have to
usean older version of postgres.)  Here is my java code/snippet: 

No, it's been in contrib a long time...

> // Build an SQL statement with caller's parameters
> private static final String m_defaultPass = "changeme";
> stmtStr = "UPDATE users SET pwd_date=now(), pwd=? " + "WHERE user_id=?;";
> stmt = con.prepareStatement(stmtStr);
> stmt.setString(1, m_defaultPass);
> stmt.setString(2, userId);

This is telling JDBC that parameter 1 is a string (hence, character
varying); but there is no cast from varchar to chkpass (hence, fail).

It might work to use setObject not setString there, but not sure because
I'm not a Java person.  You might get more help on that from the
pgsql-jdbc list.

In more recent PG versions you could definitely fix it with an explicit
cast in the query, ie "SET pwd=?::chkpass", but I think that will not
work in 8.1.

BTW, 8.1 has been out of support for awhile.  You really need to think
about upgrading.

            regards, tom lane