mirror of
https://github.com/postgres/postgres.git
synced 2025-06-05 00:02:04 -04:00
Add tests for record_image_eq and record_image_cmp
record_image_eq was covered a bit by the materialized view code that it is meant to support, but record_image_cmp was not tested at all. While we're here, add more tests to record_eq and record_cmp as well, for symmetry. Reviewed-by: Michael Paquier <michael.paquier@gmail.com>
This commit is contained in:
parent
5b2a8cf96f
commit
a61116da8b
@ -53,6 +53,22 @@ ERROR: malformed record literal: "(Joe,,)"
|
|||||||
LINE 1: select '(Joe,,)'::fullname;
|
LINE 1: select '(Joe,,)'::fullname;
|
||||||
^
|
^
|
||||||
DETAIL: Too many columns.
|
DETAIL: Too many columns.
|
||||||
|
select '[]'::fullname; -- bad
|
||||||
|
ERROR: malformed record literal: "[]"
|
||||||
|
LINE 1: select '[]'::fullname;
|
||||||
|
^
|
||||||
|
DETAIL: Missing left parenthesis.
|
||||||
|
select ' (Joe,Blow) '::fullname; -- ok, extra whitespace
|
||||||
|
fullname
|
||||||
|
------------
|
||||||
|
(Joe,Blow)
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select '(Joe,Blow) /'::fullname; -- bad
|
||||||
|
ERROR: malformed record literal: "(Joe,Blow) /"
|
||||||
|
LINE 1: select '(Joe,Blow) /'::fullname;
|
||||||
|
^
|
||||||
|
DETAIL: Junk after right parenthesis.
|
||||||
create temp table quadtable(f1 int, q quad);
|
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 (1, ((3.3,4.4),(5.5,6.6)));
|
||||||
insert into quadtable values (2, ((null,4.4),(5.5,6.6)));
|
insert into quadtable values (2, ((null,4.4),(5.5,6.6)));
|
||||||
@ -369,6 +385,290 @@ LINE 1: select * from cc order by f1;
|
|||||||
^
|
^
|
||||||
HINT: Use an explicit ordering operator or modify the query.
|
HINT: Use an explicit ordering operator or modify the query.
|
||||||
--
|
--
|
||||||
|
-- Tests for record_{eq,cmp}
|
||||||
|
--
|
||||||
|
create type testtype1 as (a int, b int);
|
||||||
|
-- all true
|
||||||
|
select row(1, 2)::testtype1 < row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 2)::testtype1 <= row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 2)::testtype1 = row(1, 2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 2)::testtype1 <> row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 3)::testtype1 >= row(1, 2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 3)::testtype1 > row(1, 2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- all false
|
||||||
|
select row(1, -2)::testtype1 < row(1, -3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -2)::testtype1 <= row(1, -3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -2)::testtype1 = row(1, -3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -2)::testtype1 <> row(1, -2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -3)::testtype1 >= row(1, -2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -3)::testtype1 > row(1, -2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- true, but see *< below
|
||||||
|
select row(1, -2)::testtype1 < row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- mismatches
|
||||||
|
create type testtype3 as (a int, b text);
|
||||||
|
select row(1, 2)::testtype1 < row(1, 'abc')::testtype3;
|
||||||
|
ERROR: cannot compare dissimilar column types integer and text at record column 2
|
||||||
|
select row(1, 2)::testtype1 <> row(1, 'abc')::testtype3;
|
||||||
|
ERROR: cannot compare dissimilar column types integer and text at record column 2
|
||||||
|
create type testtype5 as (a int);
|
||||||
|
select row(1, 2)::testtype1 < row(1)::testtype5;
|
||||||
|
ERROR: cannot compare record types with different numbers of columns
|
||||||
|
select row(1, 2)::testtype1 <> row(1)::testtype5;
|
||||||
|
ERROR: cannot compare record types with different numbers of columns
|
||||||
|
-- non-comparable types
|
||||||
|
create type testtype6 as (a int, b point);
|
||||||
|
select row(1, '(1,2)')::testtype6 < row(1, '(1,3)')::testtype6;
|
||||||
|
ERROR: could not identify a comparison function for type point
|
||||||
|
select row(1, '(1,2)')::testtype6 <> row(1, '(1,3)')::testtype6;
|
||||||
|
ERROR: could not identify an equality operator for type point
|
||||||
|
drop type testtype1, testtype3, testtype5, testtype6;
|
||||||
|
--
|
||||||
|
-- Tests for record_image_{eq,cmp}
|
||||||
|
--
|
||||||
|
create type testtype1 as (a int, b int);
|
||||||
|
-- all true
|
||||||
|
select row(1, 2)::testtype1 *< row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 2)::testtype1 *<= row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 2)::testtype1 *= row(1, 2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 2)::testtype1 *<> row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 3)::testtype1 *>= row(1, 2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 3)::testtype1 *> row(1, 2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- all false
|
||||||
|
select row(1, -2)::testtype1 *< row(1, -3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -2)::testtype1 *<= row(1, -3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -2)::testtype1 *= row(1, -3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -2)::testtype1 *<> row(1, -2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -3)::testtype1 *>= row(1, -2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, -3)::testtype1 *> row(1, -2)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- This returns the "wrong" order because record_image_cmp works on
|
||||||
|
-- unsigned datums without knowing about the actual data type.
|
||||||
|
select row(1, -2)::testtype1 *< row(1, 3)::testtype1;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- other types
|
||||||
|
create type testtype2 as (a smallint, b bool); -- byval different sizes
|
||||||
|
select row(1, true)::testtype2 *< row(2, true)::testtype2;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(-2, true)::testtype2 *< row(-1, true)::testtype2;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(0, false)::testtype2 *< row(0, true)::testtype2;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(0, false)::testtype2 *<> row(0, true)::testtype2;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
create type testtype3 as (a int, b text); -- variable length
|
||||||
|
select row(1, 'abc')::testtype3 *< row(1, 'abd')::testtype3;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 'abc')::testtype3 *< row(1, 'abcd')::testtype3;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 'abc')::testtype3 *> row(1, 'abd')::testtype3;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, 'abc')::testtype3 *<> row(1, 'abd')::testtype3;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
create type testtype4 as (a int, b point); -- by ref, fixed length
|
||||||
|
select row(1, '(1,2)')::testtype4 *< row(1, '(1,3)')::testtype4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, '(1,2)')::testtype4 *<> row(1, '(1,3)')::testtype4;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- mismatches
|
||||||
|
select row(1, 2)::testtype1 *< row(1, 'abc')::testtype3;
|
||||||
|
ERROR: cannot compare dissimilar column types integer and text at record column 2
|
||||||
|
select row(1, 2)::testtype1 *<> row(1, 'abc')::testtype3;
|
||||||
|
ERROR: cannot compare dissimilar column types integer and text at record column 2
|
||||||
|
create type testtype5 as (a int);
|
||||||
|
select row(1, 2)::testtype1 *< row(1)::testtype5;
|
||||||
|
ERROR: cannot compare record types with different numbers of columns
|
||||||
|
select row(1, 2)::testtype1 *<> row(1)::testtype5;
|
||||||
|
ERROR: cannot compare record types with different numbers of columns
|
||||||
|
-- non-comparable types
|
||||||
|
create type testtype6 as (a int, b point);
|
||||||
|
select row(1, '(1,2)')::testtype6 *< row(1, '(1,3)')::testtype6;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, '(1,2)')::testtype6 *>= row(1, '(1,3)')::testtype6;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select row(1, '(1,2)')::testtype6 *<> row(1, '(1,3)')::testtype6;
|
||||||
|
?column?
|
||||||
|
----------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
drop type testtype1, testtype2, testtype3, testtype4, testtype5, testtype6;
|
||||||
|
--
|
||||||
-- Test case derived from bug #5716: check multiple uses of a rowtype result
|
-- Test case derived from bug #5716: check multiple uses of a rowtype result
|
||||||
--
|
--
|
||||||
BEGIN;
|
BEGIN;
|
||||||
|
@ -27,6 +27,9 @@ select '(Joe,"Blow,Jr")'::fullname;
|
|||||||
select '(Joe,)'::fullname; -- ok, null 2nd column
|
select '(Joe,)'::fullname; -- ok, null 2nd column
|
||||||
select '(Joe)'::fullname; -- bad
|
select '(Joe)'::fullname; -- bad
|
||||||
select '(Joe,,)'::fullname; -- bad
|
select '(Joe,,)'::fullname; -- bad
|
||||||
|
select '[]'::fullname; -- bad
|
||||||
|
select ' (Joe,Blow) '::fullname; -- ok, extra whitespace
|
||||||
|
select '(Joe,Blow) /'::fullname; -- bad
|
||||||
|
|
||||||
create temp table quadtable(f1 int, q quad);
|
create temp table quadtable(f1 int, q quad);
|
||||||
|
|
||||||
@ -160,6 +163,105 @@ insert into cc values('("(1,2)",3)');
|
|||||||
insert into cc values('("(4,5)",6)');
|
insert into cc values('("(4,5)",6)');
|
||||||
select * from cc order by f1; -- fail, but should complain about cantcompare
|
select * from cc order by f1; -- fail, but should complain about cantcompare
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Tests for record_{eq,cmp}
|
||||||
|
--
|
||||||
|
|
||||||
|
create type testtype1 as (a int, b int);
|
||||||
|
|
||||||
|
-- all true
|
||||||
|
select row(1, 2)::testtype1 < row(1, 3)::testtype1;
|
||||||
|
select row(1, 2)::testtype1 <= row(1, 3)::testtype1;
|
||||||
|
select row(1, 2)::testtype1 = row(1, 2)::testtype1;
|
||||||
|
select row(1, 2)::testtype1 <> row(1, 3)::testtype1;
|
||||||
|
select row(1, 3)::testtype1 >= row(1, 2)::testtype1;
|
||||||
|
select row(1, 3)::testtype1 > row(1, 2)::testtype1;
|
||||||
|
|
||||||
|
-- all false
|
||||||
|
select row(1, -2)::testtype1 < row(1, -3)::testtype1;
|
||||||
|
select row(1, -2)::testtype1 <= row(1, -3)::testtype1;
|
||||||
|
select row(1, -2)::testtype1 = row(1, -3)::testtype1;
|
||||||
|
select row(1, -2)::testtype1 <> row(1, -2)::testtype1;
|
||||||
|
select row(1, -3)::testtype1 >= row(1, -2)::testtype1;
|
||||||
|
select row(1, -3)::testtype1 > row(1, -2)::testtype1;
|
||||||
|
|
||||||
|
-- true, but see *< below
|
||||||
|
select row(1, -2)::testtype1 < row(1, 3)::testtype1;
|
||||||
|
|
||||||
|
-- mismatches
|
||||||
|
create type testtype3 as (a int, b text);
|
||||||
|
select row(1, 2)::testtype1 < row(1, 'abc')::testtype3;
|
||||||
|
select row(1, 2)::testtype1 <> row(1, 'abc')::testtype3;
|
||||||
|
create type testtype5 as (a int);
|
||||||
|
select row(1, 2)::testtype1 < row(1)::testtype5;
|
||||||
|
select row(1, 2)::testtype1 <> row(1)::testtype5;
|
||||||
|
|
||||||
|
-- non-comparable types
|
||||||
|
create type testtype6 as (a int, b point);
|
||||||
|
select row(1, '(1,2)')::testtype6 < row(1, '(1,3)')::testtype6;
|
||||||
|
select row(1, '(1,2)')::testtype6 <> row(1, '(1,3)')::testtype6;
|
||||||
|
|
||||||
|
drop type testtype1, testtype3, testtype5, testtype6;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Tests for record_image_{eq,cmp}
|
||||||
|
--
|
||||||
|
|
||||||
|
create type testtype1 as (a int, b int);
|
||||||
|
|
||||||
|
-- all true
|
||||||
|
select row(1, 2)::testtype1 *< row(1, 3)::testtype1;
|
||||||
|
select row(1, 2)::testtype1 *<= row(1, 3)::testtype1;
|
||||||
|
select row(1, 2)::testtype1 *= row(1, 2)::testtype1;
|
||||||
|
select row(1, 2)::testtype1 *<> row(1, 3)::testtype1;
|
||||||
|
select row(1, 3)::testtype1 *>= row(1, 2)::testtype1;
|
||||||
|
select row(1, 3)::testtype1 *> row(1, 2)::testtype1;
|
||||||
|
|
||||||
|
-- all false
|
||||||
|
select row(1, -2)::testtype1 *< row(1, -3)::testtype1;
|
||||||
|
select row(1, -2)::testtype1 *<= row(1, -3)::testtype1;
|
||||||
|
select row(1, -2)::testtype1 *= row(1, -3)::testtype1;
|
||||||
|
select row(1, -2)::testtype1 *<> row(1, -2)::testtype1;
|
||||||
|
select row(1, -3)::testtype1 *>= row(1, -2)::testtype1;
|
||||||
|
select row(1, -3)::testtype1 *> row(1, -2)::testtype1;
|
||||||
|
|
||||||
|
-- This returns the "wrong" order because record_image_cmp works on
|
||||||
|
-- unsigned datums without knowing about the actual data type.
|
||||||
|
select row(1, -2)::testtype1 *< row(1, 3)::testtype1;
|
||||||
|
|
||||||
|
-- other types
|
||||||
|
create type testtype2 as (a smallint, b bool); -- byval different sizes
|
||||||
|
select row(1, true)::testtype2 *< row(2, true)::testtype2;
|
||||||
|
select row(-2, true)::testtype2 *< row(-1, true)::testtype2;
|
||||||
|
select row(0, false)::testtype2 *< row(0, true)::testtype2;
|
||||||
|
select row(0, false)::testtype2 *<> row(0, true)::testtype2;
|
||||||
|
|
||||||
|
create type testtype3 as (a int, b text); -- variable length
|
||||||
|
select row(1, 'abc')::testtype3 *< row(1, 'abd')::testtype3;
|
||||||
|
select row(1, 'abc')::testtype3 *< row(1, 'abcd')::testtype3;
|
||||||
|
select row(1, 'abc')::testtype3 *> row(1, 'abd')::testtype3;
|
||||||
|
select row(1, 'abc')::testtype3 *<> row(1, 'abd')::testtype3;
|
||||||
|
|
||||||
|
create type testtype4 as (a int, b point); -- by ref, fixed length
|
||||||
|
select row(1, '(1,2)')::testtype4 *< row(1, '(1,3)')::testtype4;
|
||||||
|
select row(1, '(1,2)')::testtype4 *<> row(1, '(1,3)')::testtype4;
|
||||||
|
|
||||||
|
-- mismatches
|
||||||
|
select row(1, 2)::testtype1 *< row(1, 'abc')::testtype3;
|
||||||
|
select row(1, 2)::testtype1 *<> row(1, 'abc')::testtype3;
|
||||||
|
create type testtype5 as (a int);
|
||||||
|
select row(1, 2)::testtype1 *< row(1)::testtype5;
|
||||||
|
select row(1, 2)::testtype1 *<> row(1)::testtype5;
|
||||||
|
|
||||||
|
-- non-comparable types
|
||||||
|
create type testtype6 as (a int, b point);
|
||||||
|
select row(1, '(1,2)')::testtype6 *< row(1, '(1,3)')::testtype6;
|
||||||
|
select row(1, '(1,2)')::testtype6 *>= row(1, '(1,3)')::testtype6;
|
||||||
|
select row(1, '(1,2)')::testtype6 *<> row(1, '(1,3)')::testtype6;
|
||||||
|
|
||||||
|
drop type testtype1, testtype2, testtype3, testtype4, testtype5, testtype6;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Test case derived from bug #5716: check multiple uses of a rowtype result
|
-- Test case derived from bug #5716: check multiple uses of a rowtype result
|
||||||
--
|
--
|
||||||
|
Loading…
x
Reference in New Issue
Block a user