Add some regression tests for composite-type operations.

This commit is contained in:
Tom Lane 2004-06-06 21:20:46 +00:00
parent bb3da43e3b
commit b8312c5fe7
4 changed files with 191 additions and 2 deletions

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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;