How to convert a double value to a numeric datum type in pgsql?

Started by Felix.徐about 12 years ago3 messagesgeneral
Jump to latest
#1Felix.徐
ygnhzeus@gmail.com

Hi all,
I'm talking about the source code of pgsql and I want to know how the
typing system works in pgsql.
A few functions can help us do the type conversion, for example:

Int32GetDatum -- convert a integer to a datum
Float8GetDatum -- convert double to a datum
cstring_to_text -- convert a string to a text
...

but there are a lot of types in pgsql,how to choose the corresponding
function? or is there a more automatic way to do the type conversion(raw
chars to a datum, suppose I have the corresponding Form_pg_type instance)?

I ask this question because I don't know how to convert a double value to a
numeric datum(the field's type is numeric(10,2)), pg_type shows that
numeric's typlen is -1 whose length is variable thus Float8GetDatum is not
working..

#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: Felix.徐 (#1)
Re: How to convert a double value to a numeric datum type in pgsql?

hello

you have to look to postgresql/src/backend/utils/adt/numeric.c functions -

then you can call float8_numeric

Numeric result = DatumGetNumeric(DirectFunctionCall1(float8_numeric,
Float8GetDatum(dx));

regards

Pavel

2014-02-24 7:45 GMT+01:00 Felix.徐 <ygnhzeus@gmail.com>:

Show quoted text

Hi all,
I'm talking about the source code of pgsql and I want to know how the
typing system works in pgsql.
A few functions can help us do the type conversion, for example:

Int32GetDatum -- convert a integer to a datum
Float8GetDatum -- convert double to a datum
cstring_to_text -- convert a string to a text
...

but there are a lot of types in pgsql,how to choose the corresponding
function? or is there a more automatic way to do the type conversion(raw
chars to a datum, suppose I have the corresponding Form_pg_type instance)?

I ask this question because I don't know how to convert a double value to
a numeric datum(the field's type is numeric(10,2)), pg_type shows that
numeric's typlen is -1 whose length is variable thus Float8GetDatum is not
working..

#3Pavel Stehule
pavel.stehule@gmail.com
In reply to: Felix.徐 (#1)
Re: How to convert a double value to a numeric datum type in pgsql?

2014-02-24 8:42 GMT+01:00 Felix.徐 <ygnhzeus@gmail.com>:

Thanks , I find another function called OidInputFunctionCall which can
automatically generate a datum from a string for any data type, but seems
it is not recommended in the comments.

it is little bit different - and it needs a second conversion - double ->
string

Regards

Pavel

Show quoted text

2014-02-24 15:32 GMT+08:00 Pavel Stehule <pavel.stehule@gmail.com>:

hello

you have to look to postgresql/src/backend/utils/adt/numeric.c functions
-

then you can call float8_numeric

Numeric result = DatumGetNumeric(DirectFunctionCall1(float8_numeric,
Float8GetDatum(dx));

regards

Pavel

2014-02-24 7:45 GMT+01:00 Felix.徐 <ygnhzeus@gmail.com>:

Hi all,
I'm talking about the source code of pgsql and I want to know how the
typing system works in pgsql.
A few functions can help us do the type conversion, for example:

Int32GetDatum -- convert a integer to a datum
Float8GetDatum -- convert double to a datum
cstring_to_text -- convert a string to a text
...

but there are a lot of types in pgsql,how to choose the corresponding
function? or is there a more automatic way to do the type conversion(raw
chars to a datum, suppose I have the corresponding Form_pg_type instance)?

I ask this question because I don't know how to convert a double value
to a numeric datum(the field's type is numeric(10,2)), pg_type shows that
numeric's typlen is -1 whose length is variable thus Float8GetDatum is not
working..