mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-13 17:19:43 +02:00
7e64dbc6b5
As a side effect, cause subscripts in INSERT targetlists to do something more or less sensible; previously we evaluated such subscripts and then effectively ignored them. Another side effect is that UPDATE-ing an element or slice of an array value that is NULL now produces a non-null result, namely an array containing just the assigned-to positions.
120 lines
3.5 KiB
Plaintext
120 lines
3.5 KiB
Plaintext
--
|
|
-- 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)
|
|
|
|
-- test insertion/updating of subfields
|
|
update people set fn.suffix = 'Jr';
|
|
select * from people;
|
|
fn | bd
|
|
---------------+------------
|
|
(Joe,Blow,Jr) | 01-10-1984
|
|
(1 row)
|
|
|
|
insert into quadtable (f1, q.c1.r, q.c2.i) values(44,55,66);
|
|
select * from quadtable;
|
|
f1 | q
|
|
----+---------------------------
|
|
1 | ("(3.3,4.4)","(5.5,6.6)")
|
|
2 | ("(,4.4)","(5.5,6.6)")
|
|
44 | ("(55,)","(,66)")
|
|
(3 rows)
|
|
|
|
-- 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)
|
|
|