Bug and/or feature? Complex data types in tables...
| От | Chris Travers | 
|---|---|
| Тема | Bug and/or feature? Complex data types in tables... | 
| Дата | |
| Msg-id | 000901c3cf8e$28884230$3f285e3d@winxp обсуждение исходный текст | 
| Ответы | Re: Bug and/or feature? Complex data types in tables... | 
| Список | pgsql-general | 
Hi all;
I just made an interesting discovery.  Not sure if it is a good thing or
not, and using it certainly breakes first normal form....  Not even sure if
it really works.  However, as I am able to CRASH the backend, there is a bug
here somewhere...
test=# select version();
                                       version
----------------------------------------------------------------------------
----
-----
 PostgreSQL 7.4 on i686-pc-cygwin, compiled by GCC gcc (GCC) 3.3.1 (cygming
spec
ial)
(1 row)
Try the following example:
CREATE TABLE test1 (
    test_id SERIAL,
    test_text TEXT
);
CREATE TABLE test2 (
    other_test test1,
    test_text text
);
The table is created without any problem.  Of course there is no way of
inserting anything into the table, you write a function to create the data
type.  So I created the following function:
CREATE FUNCTION test1 (int, text) returns test1 as '
 declare retval test1;
begin
retval.test_id := $1;
retval.test_text := $2;
return retval;
end;
' language plpgsql.
Now I can insert into the table.  But I cannot get anything out of the
table!  If I try a simple
SELECT * from test2;
 I get: ERROR:  cannot display a value of type record
So, I figured I would write a function to turn the record into text.  The
function I wrote is:
CREATE FUNCTION test1_to_text(test1) returns text as '
declare retval text;
begin
retval := test1.test_id;
retval := retval::text;
retval := retval|| '':'';
retval := retval|| test1.test_text;
return retval;
end;
' language plpgsql;
Here is where the crash occurs (after a brief hang):
test=# select test1_to_text(other_test) from test2;
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
Interestingly I can do:
test=# select test1_to_text(test1('1', 'hi there'));
 test1_to_text
---------------
 1:hi there
(1 row)
Best Wishes,
Chris Travers
		
	В списке pgsql-general по дате отправления: