Cast for text->Integer missing in 8.3.5
I am trying to upgrade my Postgres server from 8.2.3 to 8.3.5 and have
found that the cast text->integer and integer->text are missing. Is
there a reason why they are not there and how can I get them back. I
have many stored procedures that rely on those casts
2009/1/13 Nykolyn, Andrew <andrew.nykolyn@ngc.com>:
I am trying to upgrade my Postgres server from 8.2.3 to 8.3.5 and have found
that the cast text->integer and integer->text are missing. Is there a
reason why they are not there and how can I get them back. I have many
stored procedures that rely on those casts
http://code.open-bio.org/svnweb/index.cgi/biosql/revision?rev=284
here are the functions
--
Emanuel Calvo Franco
ArPUG / AOSUG Member
Postgresql Support & Admin
Nykolyn, Andrew wrote:
I am trying to upgrade my Postgres server from 8.2.3 to 8.3.5 and have
found that the cast text->integer and integer->text are missing. Is
there a reason why they are not there and how can I get them back. I
have many stored procedures that rely on those casts
I'm right in the middle of trying to solve the same problem, myself.
I started with this link: http://code.open-bio.org/svnweb/index.cgi/biosql/revision?rev=284
But that wasn't enough. In fact, it broke some things that worked before I added the missing implicit casts. Like this,
for example:
select 123::double precision || 'abc';
ERROR: operator is not unique: double precision || unknown
So I also had to define "||(double precision, text)" and "||(text, double precision)" operators. I'm not sure how much
additional work might be needed, but here's what I have so far for adding backwards compatility for "double precision"
datatype:
CREATE FUNCTION pg_catalog.text(double precision)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textin(float8out($1));';
CREATE CAST (double precision AS text)
WITH FUNCTION pg_catalog.text(double precision) AS IMPLICIT;
CREATE FUNCTION pg_catalog.compat_textcat(double precision, text)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textcat(CAST($1 AS TEXT), $2);';
CREATE FUNCTION pg_catalog.compat_textcat(text, double precision)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textcat($1, CAST($2 AS TEXT));';
CREATE OPERATOR pg_catalog.|| (
PROCEDURE = compat_textcat,
LEFTARG = double precision,
RIGHTARG = text
);
CREATE OPERATOR pg_catalog.|| (
PROCEDURE = compat_textcat,
LEFTARG = text,
RIGHTARG = double precision
);
Regards,
Aleksander
2009/1/13 Aleksander Kmetec <aleksander.kmetec@intera.si>:
Nykolyn, Andrew wrote:
I am trying to upgrade my Postgres server from 8.2.3 to 8.3.5 and have
found that the cast text->integer and integer->text are missing. Is there a
reason why they are not there and how can I get them back. I have many
stored procedures that rely on those castsI'm right in the middle of trying to solve the same problem, myself.
I started with this link:
http://code.open-bio.org/svnweb/index.cgi/biosql/revision?rev=284
But that wasn't enough. In fact, it broke some things that worked before I
added the missing implicit casts. Like this, for example:
select 123::double precision || 'abc';
ERROR: operator is not unique: double precision || unknownSo I also had to define "||(double precision, text)" and "||(text, double
precision)" operators. I'm not sure how much additional work might be
needed, but here's what I have so far for adding backwards compatility for
"double precision" datatype:CREATE FUNCTION pg_catalog.text(double precision)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textin(float8out($1));';CREATE CAST (double precision AS text)
WITH FUNCTION pg_catalog.text(double precision) AS IMPLICIT;CREATE FUNCTION pg_catalog.compat_textcat(double precision, text)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textcat(CAST($1 AS TEXT), $2);';CREATE FUNCTION pg_catalog.compat_textcat(text, double precision)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textcat($1, CAST($2 AS TEXT));';CREATE OPERATOR pg_catalog.|| (
PROCEDURE = compat_textcat,
LEFTARG = double precision,
RIGHTARG = text
);CREATE OPERATOR pg_catalog.|| (
PROCEDURE = compat_textcat,
LEFTARG = text,
RIGHTARG = double precision
);Regards,
Aleksander--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general
I forgive to tell you that you must add operators...d'oh!
--
Emanuel Calvo Franco
ArPUG / AOSUG Member
Postgresql Support & Admin
On Tue, Jan 13, 2009 at 8:23 AM, Nykolyn, Andrew <andrew.nykolyn@ngc.com> wrote:
I am trying to upgrade my Postgres server from 8.2.3 to 8.3.5 and have found
that the cast text->integer and integer->text are missing. Is there a
reason why they are not there and how can I get them back. I have many
stored procedures that rely on those casts
They were removed because the output was unpredictable. It's far
better to spend your time fixing your code than trying to reinstate
buggy / questionable behaviour.
"Scott Marlowe" <scott.marlowe@gmail.com> writes:
On Tue, Jan 13, 2009 at 8:23 AM, Nykolyn, Andrew <andrew.nykolyn@ngc.com> wrote:
I am trying to upgrade my Postgres server from 8.2.3 to 8.3.5 and have found
that the cast text->integer and integer->text are missing. Is there a
reason why they are not there and how can I get them back. I have many
stored procedures that rely on those casts
They were removed because the output was unpredictable. It's far
better to spend your time fixing your code than trying to reinstate
buggy / questionable behaviour.
To clarify: those casts are not *gone*, they just don't occur implicitly
anymore. You should put explicit casts into your functions in those
places where you actually intend an integer to be converted to text or
vice versa. Don't be surprised if this turns up some bugs in your code,
ie places where you didn't really intend the semantics you were getting.
regards, tom lane
2009/1/13 Aleksander Kmetec <aleksander.kmetec@intera.si>:
Nykolyn, Andrew wrote:
I am trying to upgrade my Postgres server from 8.2.3 to 8.3.5 and
have found that the cast text->integer and integer->text are missing.
Is there a reason why they are not there and how can I get them back.
I have many stored procedures that rely on those casts
I'm right in the middle of trying to solve the same problem, myself.
I started with this link:
http://code.open-bio.org/svnweb/index.cgi/biosql/revision?rev=284
But that wasn't enough. In fact, it broke some things that worked
before I added the missing implicit casts. Like this, for example:
select 123::double precision || 'abc';
ERROR: operator is not unique: double precision || unknownSo I also had to define "||(double precision, text)" and "||(text,
double precision)" operators. I'm not sure how much additional work
might be needed, but here's what I have so far for adding backwards
compatility for "double precision" datatype:CREATE FUNCTION pg_catalog.text(double precision)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textin(float8out($1));';CREATE CAST (double precision AS text)
WITH FUNCTION pg_catalog.text(double precision) AS IMPLICIT;CREATE FUNCTION pg_catalog.compat_textcat(double precision, text)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textcat(CAST($1 AS TEXT), $2);';CREATE FUNCTION pg_catalog.compat_textcat(text, double precision)
RETURNS text STRICT IMMUTABLE
LANGUAGE SQL AS 'SELECT textcat($1, CAST($2 AS TEXT));';CREATE OPERATOR pg_catalog.|| (
PROCEDURE = compat_textcat,
LEFTARG = double precision,
RIGHTARG = text
);CREATE OPERATOR pg_catalog.|| (
PROCEDURE = compat_textcat,
LEFTARG = text,
RIGHTARG = double precision
);
The above has all worked great to get me past the two issues described
so far. Now I am having a problem with: function quote_literal is not
unique. Is there anything to make that backward compatible?
"Nykolyn, Andrew" <andrew.nykolyn@ngc.com> writes:
The above has all worked great to get me past the two issues described
so far. Now I am having a problem with: function quote_literal is not
unique.
And you're going to have a few other problems after you get past that.
You can't just insert implicit casts and expect that it will affect only
the situations you want it to affect. The reason we downgraded the
implicit casts to begin with was exactly that they kicked in too often.
You might try backing off to just having the special || operators
and not the implicit casts, and see if that gets you to where you want,
or at least close enough that fixing your remaining code properly is not
too big a task. Extra operators are not nearly as dangerous as implicit
casts.
regards, tom lane