Record variable not behaving as expected (bug?)

Started by Postgres Userover 18 years ago9 messagesgeneral
Jump to latest
#1Postgres User
postgres.developer@gmail.com

According to the docs, record variables "take on the actual row
structure of the row they are assigned during a SELECT or FOR
command."

However, I have found that my record variable is not assigned proper
field-level datatypes. As a result, I'm unable to write basic math
calcs in pg/sql without a lot of typecasting.

When I execute the function below, a basic math statement fails unless
I explicitly typecast the record's field values. This isn't what I
expected; Postgresql should correctly typecast each field in the
record var automatically at the SELECT statement.
(Note: did not test with a row variable, and I prefer to use the
record datatype)

CREATE TABLE table2 (
"s_val" NUMERIC(6,2),
"e_val" NUMERIC(6,2)
);

CREATE FUNCTION divide () RETURNS numeric AS
$body$
declare
retval numeric(6,2);
rec record;
begin
SELECT * INTO rec FROM test.table2 LIMIT 0;
rec.s_val = 100.0;
rec.e_val = 101.0;

-- returns correct value w/ casting:
--retval = ((rec.s_val::numeric(6,2) - rec.e_val::numeric(6,2)) /
rec.s_val::numeric(6,2)) * 100;

-- returns incorrect value, as if fields have invalid datatypes:
retval = ((rec.s_val - rec.e_val) / rec.s_val) * 100;

return retval;
end
$body$
LANGUAGE 'plpgsql';

#2Martijn van Oosterhout
kleptog@svana.org
In reply to: Postgres User (#1)
Re: Record variable not behaving as expected (bug?)

On Fri, Nov 30, 2007 at 12:23:31AM -0800, Postgres User wrote:

However, I have found that my record variable is not assigned proper
field-level datatypes. As a result, I'm unable to write basic math
calcs in pg/sql without a lot of typecasting.

What version are you running. On my 8.1.9 test system it returns -1.00
as expected.

Have a nice day,
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

Show quoted text

Those who make peaceful revolution impossible will make violent revolution inevitable.
-- John F Kennedy

#3Postgres User
postgres.developer@gmail.com
In reply to: Martijn van Oosterhout (#2)
Re: Record variable not behaving as expected (bug?)

8.2 / Windows (a development-only pc)

Show quoted text

On Nov 30, 2007 12:50 AM, Martijn van Oosterhout <kleptog@svana.org> wrote:

On Fri, Nov 30, 2007 at 12:23:31AM -0800, Postgres User wrote:

However, I have found that my record variable is not assigned proper
field-level datatypes. As a result, I'm unable to write basic math
calcs in pg/sql without a lot of typecasting.

What version are you running. On my 8.1.9 test system it returns -1.00
as expected.

Have a nice day,
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

Those who make peaceful revolution impossible will make violent revolution inevitable.
-- John F Kennedy

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFHT87KIB7bNG8LQkwRAuzqAJ9jdaDv/rxz5pG8bdYvO9suxZLGZACeL6BY
ZMvLJ5nKREBIsBrdk4nE748=
=/aEm
-----END PGP SIGNATURE-----

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Martijn van Oosterhout (#2)
Re: Record variable not behaving as expected (bug?)

Martijn van Oosterhout <kleptog@svana.org> writes:

On Fri, Nov 30, 2007 at 12:23:31AM -0800, Postgres User wrote:

However, I have found that my record variable is not assigned proper
field-level datatypes. As a result, I'm unable to write basic math
calcs in pg/sql without a lot of typecasting.

What version are you running. On my 8.1.9 test system it returns -1.00
as expected.

Works for me too, in all branches back to 8.0. However, I noticed that
the test function references "test.table2" not just "table2", which
makes me wonder if maybe this is picking up some other table2 than the
OP thinks. A test.table2 with integer columns would explain the result.

regards, tom lane

#5Postgres User
postgres.developer@gmail.com
In reply to: Tom Lane (#4)
Re: Record variable not behaving as expected (bug?)

tom- did you test this on wndows? you can ignore the namespace- i'm
using it consistently but removed from the test code to simplify

this problem occurs repeatedly in my code. my guess is that it's a
bug in the windows build.

Show quoted text

On Nov 30, 2007 8:13 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Martijn van Oosterhout <kleptog@svana.org> writes:

On Fri, Nov 30, 2007 at 12:23:31AM -0800, Postgres User wrote:

However, I have found that my record variable is not assigned proper
field-level datatypes. As a result, I'm unable to write basic math
calcs in pg/sql without a lot of typecasting.

What version are you running. On my 8.1.9 test system it returns -1.00
as expected.

Works for me too, in all branches back to 8.0. However, I noticed that
the test function references "test.table2" not just "table2", which
makes me wonder if maybe this is picking up some other table2 than the
OP thinks. A test.table2 with integer columns would explain the result.

regards, tom lane

#6Martijn van Oosterhout
kleptog@svana.org
In reply to: Postgres User (#5)
Re: Record variable not behaving as expected (bug?)

On Fri, Nov 30, 2007 at 08:20:30AM -0800, Postgres User wrote:

tom- did you test this on wndows? you can ignore the namespace- i'm
using it consistently but removed from the test code to simplify

this problem occurs repeatedly in my code. my guess is that it's a
bug in the windows build.

Seems rather unlikely to affect just windows. Can you post a script
that you can run against a blank database that shows the problem.
complete with output on your machine.

Have a nice day,
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

Show quoted text

Those who make peaceful revolution impossible will make violent revolution inevitable.
-- John F Kennedy

#7Postgres User
postgres.developer@gmail.com
In reply to: Martijn van Oosterhout (#6)
Re: Record variable not behaving as expected (bug?)

Sure, I'd be glad to provide any additional code or info that I can.
This issue took me quite awhile to track down from the 200-line
function that was breaking.

When I execute the function defined above, here's what I see returned:

select divide()
?column?
------------------------
0

Hopefully someone can test on Windows to validate.

Show quoted text

On Nov 30, 2007 8:25 AM, Martijn van Oosterhout <kleptog@svana.org> wrote:

On Fri, Nov 30, 2007 at 08:20:30AM -0800, Postgres User wrote:

tom- did you test this on wndows? you can ignore the namespace- i'm
using it consistently but removed from the test code to simplify

this problem occurs repeatedly in my code. my guess is that it's a
bug in the windows build.

Seems rather unlikely to affect just windows. Can you post a script
that you can run against a blank database that shows the problem.
complete with output on your machine.

Have a nice day,
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

Those who make peaceful revolution impossible will make violent revolution inevitable.
-- John F Kennedy

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFHUDmUIB7bNG8LQkwRAvNMAKCQl8+bPo3bca/a33T+WVfQ/Ng2yQCdG+H5
wZyc/alsznWsWck20lheR00=
=RVrJ
-----END PGP SIGNATURE-----

#8Postgres User
postgres.developer@gmail.com
In reply to: Postgres User (#7)
Re: Record variable not behaving as expected (bug?)

Sorry, here's the code:

CREATE TABLE table2 (
"s_val" NUMERIC(6,2),
"e_val" NUMERIC(6,2)
);

CREATE FUNCTION divide () RETURNS numeric AS
$body$
declare
retval numeric(6,2);
rec record;
begin
SELECT * INTO rec FROM test.table2 LIMIT 0;
rec.s_val = 100.0;
rec.e_val = 101.0;

-- returns correct value w/ casting:
--retval = ((rec.s_val::numeric(6,2) - rec.e_val::numeric(6,2)) /
rec.s_val::numeric(6,2)) * 100;

-- returns incorrect value, as if fields have invalid datatypes:
retval = ((rec.s_val - rec.e_val) / rec.s_val) * 100;

return retval;
end
$body$
LANGUAGE 'plpgsql';

Show quoted text

On Nov 30, 2007 12:31 PM, Postgres User <postgres.developer@gmail.com> wrote:

Sure, I'd be glad to provide any additional code or info that I can.
This issue took me quite awhile to track down from the 200-line
function that was breaking.

When I execute the function defined above, here's the output:

select divide()
?column?
------------------------
0

Seems rather unlikely to affect just windows. Can you post a script
that you can run against a blank database that shows the problem.
complete with output on your machine.

#9Martijn van Oosterhout
kleptog@svana.org
In reply to: Postgres User (#8)
Re: Record variable not behaving as expected (bug?)

On Fri, Nov 30, 2007 at 12:34:57PM -0800, Postgres User wrote:

Sorry, here's the code:

<snip>

The code you posted won't work on a blank database, I needed to delete
the test prefix to table2. I've adjusted it to be hopefully what you
did. My output is:
---
CREATE TABLE
CREATE FUNCTION
version
---------------------------------------------------------------------------------------------------------------
PostgreSQL 8.1.9 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
(1 row)

divide
--------
-1.00
(1 row)

DROP FUNCTION
DROP TABLE
---

Can you try the attached script on a *nlank* database? It'll give us
more info about your system.

Have a nice day,
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

Show quoted text

Those who make peaceful revolution impossible will make violent revolution inevitable.
-- John F Kennedy

Attachments:

divide.sqltext/plain; charset=us-asciiDownload