diff --git a/src/test/regress/expected/rowtypes.out b/src/test/regress/expected/rowtypes.out new file mode 100644 index 0000000000..91eeaf0ab8 --- /dev/null +++ b/src/test/regress/expected/rowtypes.out @@ -0,0 +1,115 @@ +-- +-- ROWTYPES +-- +-- Make both a standalone composite type and a table rowtype +create type complex as (r float8, i float8); +create temp table fullname (first text, last text); +-- Nested composite +create type quad as (c1 complex, c2 complex); +-- Some simple tests of I/O conversions and row construction +select (1.1,2.2)::complex, row((3.3,4.4),(5.5,null))::quad; + row | row +-----------+------------------------ + (1.1,2.2) | ("(3.3,4.4)","(5.5,)") +(1 row) + +select row('Joe', 'Blow')::fullname, '(Joe,Blow)'::fullname; + row | fullname +------------+------------ + (Joe,Blow) | (Joe,Blow) +(1 row) + +select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname; + fullname | fullname +------------------+-------------- + (Joe,"von Blow") | (Joe,d'Blow) +(1 row) + +select '(Joe,"von""Blow")'::fullname, '(Joe,d\\\\Blow)'::fullname; + fullname | fullname +-------------------+----------------- + (Joe,"von""Blow") | (Joe,"d\\Blow") +(1 row) + +select '(Joe,"Blow,Jr")'::fullname; + fullname +----------------- + (Joe,"Blow,Jr") +(1 row) + +select '(Joe,)'::fullname; -- ok, null 2nd column + fullname +---------- + (Joe,) +(1 row) + +select '(Joe)'::fullname; -- bad +ERROR: malformed record literal: "(Joe)" +DETAIL: Too few columns. +select '(Joe,,)'::fullname; -- bad +ERROR: malformed record literal: "(Joe,,)" +DETAIL: Too many columns. +create temp table quadtable(f1 int, q quad); +insert into quadtable values (1, ((3.3,4.4),(5.5,6.6))); +insert into quadtable values (2, ((null,4.4),(5.5,6.6))); +select * from quadtable; + f1 | q +----+--------------------------- + 1 | ("(3.3,4.4)","(5.5,6.6)") + 2 | ("(,4.4)","(5.5,6.6)") +(2 rows) + +select f1, q.c1 from quadtable; -- fails, q is a table reference +ERROR: relation "q" does not exist +select f1, (q).c1, (qq.q).c1.i from quadtable qq; + f1 | c1 | i +----+-----------+----- + 1 | (3.3,4.4) | 4.4 + 2 | (,4.4) | 4.4 +(2 rows) + +create temp table people (fn fullname, bd date); +insert into people values ('(Joe,Blow)', '1984-01-10'); +select * from people; + fn | bd +------------+------------ + (Joe,Blow) | 01-10-1984 +(1 row) + +-- at the moment this will not work due to ALTER TABLE inadequacy: +alter table fullname add column suffix text default ''; +ERROR: cannot alter table "fullname" because column "people"."fn" uses its rowtype +-- but this should work: +alter table fullname add column suffix text default null; +select * from people; + fn | bd +-------------+------------ + (Joe,Blow,) | 01-10-1984 +(1 row) + +-- This fails at the moment, would like it to work though: +update people set fn.suffix = 'Jr'; +ERROR: syntax error at or near "." at character 21 +LINE 1: update people set fn.suffix = 'Jr'; + ^ +-- ugly workaround: +update people set fn = ((fn).first, (fn).last, 'III'); +select * from people; + fn | bd +----------------+------------ + (Joe,Blow,III) | 01-10-1984 +(1 row) + +-- The object here is to ensure that toasted references inside +-- composite values don't cause problems. The large f1 value will +-- be toasted inside pp, it must still work after being copied to people. +create temp table pp (f1 text); +insert into pp values (repeat('abcdefghijkl', 100000)); +insert into people select ('Jim', f1, null)::fullname, current_date from pp; +select (fn).first, substr((fn).last, 1, 20), length((fn).last) from people; + first | substr | length +-------+----------------------+--------- + Joe | Blow | 4 + Jim | abcdefghijklabcdefgh | 1200000 +(2 rows) + diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 96976ccc9f..035a81543f 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -74,7 +74,7 @@ test: select_views portals_p2 rules foreign_key cluster # The sixth group of parallel test # ---------- # "plpgsql" cannot run concurrently with "rules" -test: limit plpgsql copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism +test: limit plpgsql copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism rowtypes # run stats by itself because its delay may be insufficient under heavy load test: stats diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index 61ac9eff33..1dd7a03cc7 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -1,4 +1,4 @@ -# $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.24 2004/01/11 04:58:17 neilc Exp $ +# $PostgreSQL: pgsql/src/test/regress/serial_schedule,v 1.25 2004/06/06 21:20:46 tgl Exp $ # This should probably be in an order similar to parallel_schedule. test: boolean test: char @@ -94,4 +94,5 @@ test: truncate test: alter_table test: sequence test: polymorphism +test: rowtypes test: stats diff --git a/src/test/regress/sql/rowtypes.sql b/src/test/regress/sql/rowtypes.sql new file mode 100644 index 0000000000..809cad8f32 --- /dev/null +++ b/src/test/regress/sql/rowtypes.sql @@ -0,0 +1,73 @@ +-- +-- ROWTYPES +-- + +-- Make both a standalone composite type and a table rowtype + +create type complex as (r float8, i float8); + +create temp table fullname (first text, last text); + +-- Nested composite + +create type quad as (c1 complex, c2 complex); + +-- Some simple tests of I/O conversions and row construction + +select (1.1,2.2)::complex, row((3.3,4.4),(5.5,null))::quad; + +select row('Joe', 'Blow')::fullname, '(Joe,Blow)'::fullname; + +select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname; + +select '(Joe,"von""Blow")'::fullname, '(Joe,d\\\\Blow)'::fullname; + +select '(Joe,"Blow,Jr")'::fullname; + +select '(Joe,)'::fullname; -- ok, null 2nd column +select '(Joe)'::fullname; -- bad +select '(Joe,,)'::fullname; -- bad + +create temp table quadtable(f1 int, q quad); + +insert into quadtable values (1, ((3.3,4.4),(5.5,6.6))); +insert into quadtable values (2, ((null,4.4),(5.5,6.6))); + +select * from quadtable; + +select f1, q.c1 from quadtable; -- fails, q is a table reference + +select f1, (q).c1, (qq.q).c1.i from quadtable qq; + +create temp table people (fn fullname, bd date); + +insert into people values ('(Joe,Blow)', '1984-01-10'); + +select * from people; + +-- at the moment this will not work due to ALTER TABLE inadequacy: +alter table fullname add column suffix text default ''; + +-- but this should work: +alter table fullname add column suffix text default null; + +select * from people; + +-- This fails at the moment, would like it to work though: +update people set fn.suffix = 'Jr'; + +-- ugly workaround: +update people set fn = ((fn).first, (fn).last, 'III'); + +select * from people; + +-- The object here is to ensure that toasted references inside +-- composite values don't cause problems. The large f1 value will +-- be toasted inside pp, it must still work after being copied to people. + +create temp table pp (f1 text); +insert into pp values (repeat('abcdefghijkl', 100000)); + +insert into people select ('Jim', f1, null)::fullname, current_date from pp; + +select (fn).first, substr((fn).last, 1, 20), length((fn).last) from people;