Re: Bug and/or feature? Complex data types in tables... - Mailing list pgsql-general

From Michael Glaesemann
Subject Re: Bug and/or feature? Complex data types in tables...
Date
Msg-id 80D1617A-3D4D-11D8-A298-000A95C88220@myrealbox.com
Whole thread Raw
In response to Re: Bug and/or feature? Complex data types in tables...  ("Chris Travers" <chris@travelamericas.com>)
List pgsql-general
On Jan 2, 2004, at 7:44 AM, Chris Travers wrote:

> creating a complex type and using it in a table would create the same
> problem, would it not?
> If my type has more than one component, then it would not work well.

After a bit of experimentation, I see what you mean:
test=# select version();
                                                         version
------------------------------------------------------------------------
-----------------------------------------------
  PostgreSQL 7.4 on powerpc-apple-darwin7.2.0, compiled by GCC gcc (GCC)
3.3 20030304 (Apple Computer, Inc. build 1495)
(1 row)

test=# create type complex_number as (real numeric, imaginary numeric);
CREATE TYPE
test=# create table numbers (num complex_number);
ERROR:  column "num" has composite type complex_number
ERROR:  column "num" has composite type complex_number
test=# create table complex_number_table (real numeric not null,
imaginary numeric not null);
CREATE TABLE
test=# create table numbers (num complex_number_table);
CREATE TABLE

You'd think the first CREATE TABLE numbers would work, and the second
wouldn't. (Unless I'm doing something wrong.)

> Here is a better example.  Imagine creating a type for complex numbers.
> Each complex number has 2 components:  a real component (x, numeric)
> and an
> imaginary component (y, numeric).  The standard representation is  x
> +/- yi,
> so if the real component is 3.4 and the imaginary component is 5, it
> would
> be written 3.4 + 5i.

In the language of Date and Darwen, you're talking about possible
representations, or possreps, I believe. One possible representation of
a complex number would be x +/- yi, another could be (x,y)

> Storing this data in the database would require either:
> 1:  A text string which would be parsed by the app.  (not really very
> useful)
> 2:  A native datatype consisting of 2 numeric components, that could
> be cast
> as text by the rules above.
>
> Obviously the second one is best.

Definitely. The default TIMESTAMP possrep is much different from how
it's represented internally. For that matter, NUMERIC is, too. There's
no reason to necessarily store the value in the form the user sees.

> Currently in PostgreSQL, I would have to
> write this in C, but with complex types, I could write this mostly in
> PLPGSQL!

(To avoid confusion since we're talking about complex numbers, I'm
assuming you mean what PostgreSQL refers to as composite types.) It
definitely would be nice to be able to define composite types that can
be used as attributes and functions. It seems like there's quite a bit
of, er, functionality with composite types already. I don't have
pl/pgsql installed, but I was able to create some simple operators with
just SQL (see below). They're not perfect (and don't let us use
composite types in tables); just exploring what I could do. I wonder
what it would take to allow these user-defined types defined in
PostgreSQL (rather than C) usable in tables.

Michael Glaesemann
grzm myrealbox com

test=# create or replace function THE_REAL(complex_number) returns
numeric as 'select $1.real as real;' language sql;
CREATE FUNCTION
test=# create or replace function THE_IMAGINARY(complex_number) returns
numeric as 'select $1.imaginary as real;' language sql;
CREATE FUNCTION
test=# create function complex_number(numeric,numeric) returns
complex_number as 'select $1,$2;' language sql;
CREATE FUNCTION
test=# select THE_REAL(complex_number(4::numeric,3::numeric));
  the_real
----------
         4
(1 row)

test=# select THE_IMAGINARY(complex_number(4::numeric,3::numeric));
  the_imaginary
---------------
              3
(1 row)

test=# create or replace function
display_ordpair_complex_number(complex_number) returns text as 'select
''('' || $1.real || '','' || $1.imaginary || '')'';' language sql;
CREATE FUNCTION
test=# create function display_irep_complex_number(complex_number)
returns text as 'select $1.real || '' '' || $1.imaginary || ''i'';'
language sql;
CREATE FUNCTION
test=# select
display_ordpair_complex_number(complex_number(4::numeric,3::numeric));
  display_ordpair_complex_number
--------------------------------
  (4,3)
(1 row)

test=# select
display_irep_complex_number(complex_number(4::numeric,3::numeric));
  display_irep_complex_number
-----------------------------
  4 3i
(1 row)



pgsql-general by date:

Previous
From: "Nikola Milutinovic"
Date:
Subject: BUG: compiling PL/Python - Semi-SOLVED
Next
From: "Chris Travers"
Date:
Subject: Re: Bug and/or feature? Complex data types in tables...