Changing a column's type

Started by Hadley Willanover 23 years ago5 messagesgeneral
Jump to latest
#1Hadley Willan
hadley.willan@deeper.co.nz

Hi All,
I was using 7.2 and my sequences had a column type of int. I didn't
think much of this until I recently built the RPMs for 7.3 and
"upgraded". i.e. dumped out and imported again. I not that it had all
gone okay until I called a function that was working in 7.2 that is now
broken in 7.3

Reason being is that the column type for the sequence values is now
bigInt and of course I foolishly have a number of functions defined as
taking an INT. So of course the function bails because it can't find a
definition for a function matching bigint.

Anyway, to cut a long story short I was wondering if it is possible to
change the existing type of the sequence columns back to Int or recreate
the sequence with a type of int4.....

And yes, I should probably fix my functions to work with the bigInt
type, but I'm also curious to know if this is possible.

Thanks.
--
Hadley Willan > Systems Development > Deeper Design Limited. +64(7)377-3328
hadley.willan@deeper.co.nz > www.deeperdesign.com > +64(21)-28-41-463
Level 1, 4 Tamamutu St, PO Box 90, TAUPO 2730, New Zealand.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Hadley Willan (#1)
Re: Changing a column's type

Hadley Willan <hadley.willan@deeper.co.nz> writes:

Reason being is that the column type for the sequence values is now
bigInt and of course I foolishly have a number of functions defined as
taking an INT.

I don't follow. You're executing functions on the columns of a sequence
object? Why?

regards, tom lane

#3Hadley Willan
hadley.willan@deeper.co.nz
In reply to: Tom Lane (#2)
Re: Changing a column's type

Sorry perhaps I wasn't clear.

FUNCTION fn_create_new_item()
_seq RECORD;
begin
SELECT INTO _seq NEXTVAL(''source_sequence'');
..do stuff, insert ....
PERFORM fn_b( _seq.next_value );
end;

FUNCTION fn_do_stuff_with_new_item_id( INT )
.....

Call to fn_b breaks because _seq.next_value is of type BIGINT.

On Tue, 2002-12-17 at 12:59, Tom Lane wrote:

Hadley Willan <hadley.willan@deeper.co.nz> writes:

Reason being is that the column type for the sequence values is now
bigInt and of course I foolishly have a number of functions defined as
taking an INT.

I don't follow. You're executing functions on the columns of a sequence
object? Why?

regards, tom lane

--
Hadley Willan > Systems Development > Deeper Design Limited. +64(7)377-3328
hadley.willan@deeper.co.nz > www.deeperdesign.com > +64(21)-28-41-463
Level 1, 4 Tamamutu St, PO Box 90, TAUPO 2730, New Zealand.

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Hadley Willan (#3)
Re: Changing a column's type

Hadley Willan <hadley.willan@deeper.co.nz> writes:

FUNCTION fn_create_new_item()
_seq RECORD;
begin
SELECT INTO _seq NEXTVAL(''source_sequence'');
..do stuff, insert ....
PERFORM fn_b( _seq.next_value );
end;

Call to fn_b breaks because _seq.next_value is of type BIGINT.

Oh, I see. It seems like a rather random coding technique: why'd you
not declare _seq as type int? If you don't want to change that, you
could insert an explicit cast in the PERFORM, too:

PERFORM fn_b( _seq.next_value::int );

There's been some recent talk of allowing fn_b() with an int8 argument
to be resolved as fn_b(int4) --- with a runtime down-conversion --- if
there are no other candidates for fn_b(). But no one's put forward a
convincing argument for that as yet. It might just add confusion.

regards, tom lane

#5Hadley Willan
hadley.willan@deeper.co.nz
In reply to: Tom Lane (#4)
Re: Changing a column's type

I chose not to declare _seq as type Int because I wanted access to the
entire record and it's columns. The function is a bit longer than just,
really ;-)

Anyway it's more a case of an explicit cast will fix it for now, thanks
for that.

As for the runtime down-conversion. I could see it being handy, but a
little dangerous. I could see it throwing an exception of course when
the down-conversion was impossible, i.e. bigint value exceeds int. So as
you say why bother.

Hadley

On Tue, 2002-12-17 at 13:12, Tom Lane wrote:

Hadley Willan <hadley.willan@deeper.co.nz> writes:

FUNCTION fn_create_new_item()
_seq RECORD;
begin
SELECT INTO _seq NEXTVAL(''source_sequence'');
..do stuff, insert ....
PERFORM fn_b( _seq.next_value );
end;

Call to fn_b breaks because _seq.next_value is of type BIGINT.

Oh, I see. It seems like a rather random coding technique: why'd you
not declare _seq as type int? If you don't want to change that, you
could insert an explicit cast in the PERFORM, too:

PERFORM fn_b( _seq.next_value::int );

There's been some recent talk of allowing fn_b() with an int8 argument
to be resolved as fn_b(int4) --- with a runtime down-conversion --- if
there are no other candidates for fn_b(). But no one's put forward a
convincing argument for that as yet. It might just add confusion.

regards, tom lane

--
Hadley Willan > Systems Development > Deeper Design Limited. +64(7)377-3328
hadley.willan@deeper.co.nz > www.deeperdesign.com > +64(21)-28-41-463
Level 1, 4 Tamamutu St, PO Box 90, TAUPO 2730, New Zealand.