Thread: Column is of type date but expression is of type text

Column is of type date but expression is of type text

From
list_usr@spacebox.net
Date:
I'm trying to call a stored procedure from a Java app; the stored procedure just makes an insert on a table and returns true or false. It seems there's a problem when a java.sql.Date type parameter is passed from Java to the PostgreSQL stored procedure, and then to the insert: LOG: execute <unnamed>: select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result DETAIL: parameters: $1 = '', $2 = 'foo@bar.com', $3 = 'Joe', $4 = 'Blow', $5 = 'foobar', $6 = 'M', $7 = '1979-03-22 -04:00:00' ERROR: column "dob" is of type date but expression is of type text at character 122 HINT: You will need to rewrite or cast the expression. QUERY: INSERT INTO athlete.athlete (email, first_name, last_name, password, gender, dob) VALUES ( $1 , $2 , $3 , $4 , $5 , $6 ) CONTEXT: PL/pgSQL function "create_athlete" line 2 at SQL statement STATEMENT: select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result The Java code, in brief: registerQuery = "{? = call athlete.create_athlete(?,?,?,?,?,?)}"; ... CallableStatement cs = conn.prepareCall(registerQuery); cs.registerOutParameter(1, Types.BOOLEAN); cs.setString(2, email); ... createAthlete.setDate(7, birthdate); // birthdate is of type java.sql.Date I've asked elsewhere, and it seems my Java code is correct for a stored procedure that returns a single value. However I'm still uncertain because the logs show 7 parameters in the call to create_athlete() when there should only be 6 - if parameters $1-$6 in the call to create_athlete() are the parameters passed to the insert statement, then the dob parameter would be mismatched with the gender parameter. Are parameters $2-$7 actually passed to the insert? If yes, where am I going wrong?

Thanks.

Re: Column is of type date but expression is of type text

From
Kris Jurka
Date:

On Wed, 17 Feb 2010, list_usr@spacebox.net wrote:

> I'm trying to call a stored procedure from a Java app; the stored procedure
> just makes an insert on a table and returns true or false. It seems there's
> a problem when a java.sql.Date type parameter is passed from Java to the
> PostgreSQL stored procedure, and then to the insert: LOG: execute <unnamed>:
> select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result DETAIL:
> parameters: $1 = '', $2 = 'foo@bar.com', $3 = 'Joe', $4 = 'Blow', $5 =
> 'foobar', $6 = 'M', $7 = '1979-03-22 -04:00:00' ERROR: column "dob" is of
> type date but expression is of type text at character 122 HINT: You will
> need to rewrite or cast the expression. QUERY: INSERT INTO athlete.athlete
> (email, first_name, last_name, password, gender, dob) VALUES ( $1 , $2 , $3
> , $4 , $5 , $6 ) CONTEXT: PL/pgSQL function "create_athlete" line 2 at SQL
> statement STATEMENT: select * from
> athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result The Java code, in
> brief: registerQuery = "{? = call athlete.create_athlete(?,?,?,?,?,?)}";
> .... CallableStatement cs = conn.prepareCall(registerQuery);
> cs.registerOutParameter(1, Types.BOOLEAN); cs.setString(2, email); ....
> createAthlete.setDate(7, birthdate); // birthdate is of type java.sql.Date
> I've asked elsewhere, and it seems my Java code is correct for a stored
> procedure that returns a single value. However I'm still uncertain because
> the logs show 7 parameters in the call to create_athlete() when there should
> only be 6 - if parameters $1-$6 in the call to create_athlete() are the
> parameters passed to the insert statement, then the dob parameter would be
> mismatched with the gender parameter. Are parameters $2-$7 actually passed
> to the insert? If yes, where am I going wrong?

Without seeing what your function is doing it's tough to tell where things
are going wrong.  Perhaps you've switched some parameters around from the
function arguments to the insert call?  The JDBC driver rearranges the
output parameter to be in the argument list for it's own internal
convenience.  This is OK and doesn't affect the parameter numbering or
the calling of the function.

Kris Jurka


Re: Column is of type date but expression is of type text

From
list_usr@spacebox.net
Date:
Here is the stored procedure in question:

CREATE FUNCTION athlete_add(IN new_email TEXT, IN fname TEXT, IN lname
TEXT, IN pw TEXT, IN sex TEXT, IN bdate DATE)
RETURNS BOOLEAN AS $$
BEGIN
    INSERT INTO
        athlete (email, first_name, last_name, password, gender, dob)
    VALUES
        (new_email, fname, lname, pw, sex, bdate);

    IF FOUND THEN
        RETURN TRUE;
    END IF;

    RETURN FALSE;
END;
$$ LANGUAGE plpgsql;


As an aside, how do most people name their IN parameters so as not to
have them conflict with actual column names?

Thanks,

     -- Matt


On Thu, Feb 18, 2010 at 12:34 AM, Kris Jurka <books@ejurka.com> wrote:
>
>
> On Wed, 17 Feb 2010, list_usr@spacebox.net wrote:
>
>> I'm trying to call a stored procedure from a Java app; the stored procedure
>> just makes an insert on a table and returns true or false. It seems there's
>> a problem when a java.sql.Date type parameter is passed from Java to the
>> PostgreSQL stored procedure, and then to the insert: LOG: execute <unnamed>:
>> select * from athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result DETAIL:
>> parameters: $1 = '', $2 = 'foo@bar.com', $3 = 'Joe', $4 = 'Blow', $5 =
>> 'foobar', $6 = 'M', $7 = '1979-03-22 -04:00:00' ERROR: column "dob" is of
>> type date but expression is of type text at character 122 HINT: You will
>> need to rewrite or cast the expression. QUERY: INSERT INTO athlete.athlete
>> (email, first_name, last_name, password, gender, dob) VALUES ( $1 , $2 , $3
>> , $4 , $5 , $6 ) CONTEXT: PL/pgSQL function "create_athlete" line 2 at SQL
>> statement STATEMENT: select * from
>> athlete.create_athlete($1,$2,$3,$4,$5,$6,$7) as result The Java code, in
>> brief: registerQuery = "{? = call athlete.create_athlete(?,?,?,?,?,?)}";
>> .... CallableStatement cs = conn.prepareCall(registerQuery);
>> cs.registerOutParameter(1, Types.BOOLEAN); cs.setString(2, email); ....
>> createAthlete.setDate(7, birthdate); // birthdate is of type java.sql.Date
>> I've asked elsewhere, and it seems my Java code is correct for a stored
>> procedure that returns a single value. However I'm still uncertain because
>> the logs show 7 parameters in the call to create_athlete() when there should
>> only be 6 - if parameters $1-$6 in the call to create_athlete() are the
>> parameters passed to the insert statement, then the dob parameter would be
>> mismatched with the gender parameter. Are parameters $2-$7 actually passed
>> to the insert? If yes, where am I going wrong?
>
> Without seeing what your function is doing it's tough to tell where things are going wrong.  Perhaps you've switched
someparameters around from the function arguments to the insert call?  The JDBC driver rearranges the output parameter
tobe in the argument list for it's own internal convenience.  This is OK and doesn't affect the parameter numbering or
thecalling of the function. 
>
> Kris Jurka
>

Re: Column is of type date but expression is of type text

From
Kris Jurka
Date:

On Thu, 18 Feb 2010, list_usr@spacebox.net wrote:

> Here is the stored procedure in question:

The attached testcase works fine for me.  What driver and server versions
do you have?

>
> As an aside, how do most people name their IN parameters so as not to
> have them conflict with actual column names?
>

Some people prefix them with v_ to indicate that they are variables.

Kris Jurka

Attachment

Re: Column is of type date but expression is of type text

From
list_usr@spacebox.net
Date:
Re: version, good question - I have both postgresql-8.4-701.jdbc3.jar
and postgresql-8.4-701.jdbc4.jar in my Apache Tomcat 5.5 common/lib
directory.  Would that cause a problem?

I'm using PostgreSQL 8.4.  Java 1.6.

Your example code worked with both jdbc3 and jdbc4, but my code still
isn't working.

I thought it might have to do with the way I instantiate the date, but
I tried that in your example code and it worked fine:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
birthdate.setTime(format.parse(request.getParameter("birthdate")).getTime());
// getParameter("birthdate") would return "1978-02-13" for example

In my app the PostgreSQL logs show the birthdate parameter as
"1978-02-13 -04:00:00", with the same code in your test program the
time is omitted.  Would that make a difference?


On Thu, Feb 18, 2010 at 5:11 PM, Kris Jurka <books@ejurka.com> wrote:
>
>
> On Thu, 18 Feb 2010, list_usr@spacebox.net wrote:
>
>> Here is the stored procedure in question:
>
> The attached testcase works fine for me.  What driver and server versions do
> you have?
>
>>
>> As an aside, how do most people name their IN parameters so as not to
>> have them conflict with actual column names?
>>
>
> Some people prefix them with v_ to indicate that they are variables.
>
> Kris Jurka

Re: Column is of type date but expression is of type text

From
list_usr@spacebox.net
Date:
Would the problem be that the timezone is included with the date
passed in the stored procedure parameter?

I don't understand why the timezone shows up in my J2EE app but not in
the test code you sent.


On Fri, Feb 19, 2010 at 8:21 PM,  <list_usr@spacebox.net> wrote:
> Re: version, good question - I have both postgresql-8.4-701.jdbc3.jar
> and postgresql-8.4-701.jdbc4.jar in my Apache Tomcat 5.5 common/lib
> directory.  Would that cause a problem?
>
> I'm using PostgreSQL 8.4.  Java 1.6.
>
> Your example code worked with both jdbc3 and jdbc4, but my code still
> isn't working.
>
> I thought it might have to do with the way I instantiate the date, but
> I tried that in your example code and it worked fine:
>
> SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
> birthdate.setTime(format.parse(request.getParameter("birthdate")).getTime());
> // getParameter("birthdate") would return "1978-02-13" for example
>
> In my app the PostgreSQL logs show the birthdate parameter as
> "1978-02-13 -04:00:00", with the same code in your test program the
> time is omitted.  Would that make a difference?
>
>
> On Thu, Feb 18, 2010 at 5:11 PM, Kris Jurka <books@ejurka.com> wrote:
>>
>>
>> On Thu, 18 Feb 2010, list_usr@spacebox.net wrote:
>>
>>> Here is the stored procedure in question:
>>
>> The attached testcase works fine for me.  What driver and server versions do
>> you have?
>>
>>>
>>> As an aside, how do most people name their IN parameters so as not to
>>> have them conflict with actual column names?
>>>
>>
>> Some people prefix them with v_ to indicate that they are variables.
>>
>> Kris Jurka
>

Re: Column is of type date but expression is of type text

From
Kris Jurka
Date:

On Fri, 19 Feb 2010, list_usr@spacebox.net wrote:

> Re: version, good question - I have both postgresql-8.4-701.jdbc3.jar
> and postgresql-8.4-701.jdbc4.jar in my Apache Tomcat 5.5 common/lib
> directory.  Would that cause a problem?
>
> I'm using PostgreSQL 8.4.  Java 1.6.
>
> Your example code worked with both jdbc3 and jdbc4, but my code still
> isn't working.

Well those versions are all recent enough not to have any problems.  If my
code works and yours doesn't it's likely you're not telling us something
about your code.  If you can create a self-contained testcase like I did
then I'd be happy to look at it, but it doesn't look like a driver
problem.

Kris Jurka

Re: Column is of type date but expression is of type text

From
Lew
Date:
Kris Jurka wrote:
> If my code works and yours doesn't it's likely you're not telling us
> something about your code.  If you can create a self-contained testcase
> like I did then I'd be happy to look at it, but it doesn't look like a
> driver problem.

For advice on creating examples for Usenet or other support environments, see
<http://sscce.org/>

--
Lew

Re: Column is of type date but expression is of type text

From
list_usr@spacebox.net
Date:
So I don't know what happened.. but I dropped the database and
reloaded it and now it works.  I had made some small updates to the
stored procedure but had been recreating it (CREATE OR REPLACE
FUNCTION) with the updates - should I have been restarting Postgres
after recreating the stored procedure?

I think the issue was the ordering of the parameters - after your
initial answer to my question I updated the stored procedure so the
ordering of the parameters matched the order that they appeared in the
insert statement.  I recreated the stored procedure and continued to
encounter the problem which led me to believe that wasn't the issue.

Anyhow, after recreating the database it's now working.

Thanks for all your help!

     -- Matt

On Sat, Feb 20, 2010 at 2:21 PM, Kris Jurka <books@ejurka.com> wrote:
>
>
> On Fri, 19 Feb 2010, list_usr@spacebox.net wrote:
>
>> Re: version, good question - I have both postgresql-8.4-701.jdbc3.jar
>> and postgresql-8.4-701.jdbc4.jar in my Apache Tomcat 5.5 common/lib
>> directory.  Would that cause a problem?
>>
>> I'm using PostgreSQL 8.4.  Java 1.6.
>>
>> Your example code worked with both jdbc3 and jdbc4, but my code still
>> isn't working.
>
> Well those versions are all recent enough not to have any problems.  If my
> code works and yours doesn't it's likely you're not telling us something
> about your code.  If you can create a self-contained testcase like I did
> then I'd be happy to look at it, but it doesn't look like a driver problem.
>
> Kris Jurka
>

Re: Column is of type date but expression is of type text

From
Tom Lane
Date:
list_usr@spacebox.net writes:
> I think the issue was the ordering of the parameters - after your
> initial answer to my question I updated the stored procedure so the
> ordering of the parameters matched the order that they appeared in the
> insert statement.  I recreated the stored procedure and continued to
> encounter the problem which led me to believe that wasn't the issue.

Note that two functions with the same names and differently ordered
parameter lists are different objects to Postgres.  I think maybe you
forgot to drop the first version and it was still getting invoked.

            regards, tom lane

Re: Column is of type date but expression is of type text

From
list_usr@spacebox.net
Date:
But wouldn't the stored procedure with parameters matching the order
of the parameters in the call be the stored procedure to be called?

On Sun, Feb 21, 2010 at 1:17 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> list_usr@spacebox.net writes:
>> I think the issue was the ordering of the parameters - after your
>> initial answer to my question I updated the stored procedure so the
>> ordering of the parameters matched the order that they appeared in the
>> insert statement.  I recreated the stored procedure and continued to
>> encounter the problem which led me to believe that wasn't the issue.
>
> Note that two functions with the same names and differently ordered
> parameter lists are different objects to Postgres.  I think maybe you
> forgot to drop the first version and it was still getting invoked.
>
>                        regards, tom lane
>

Re: Column is of type date but expression is of type text

From
Tom Lane
Date:
list_usr@spacebox.net writes:
> But wouldn't the stored procedure with parameters matching the order
> of the parameters in the call be the stored procedure to be called?

[ shrug... ]  If you want an exact diagnosis of what happened then
you'd need to actually show us exactly what happened.  I was merely
suggesting a possible contributing factor.

            regards, tom lane