mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-13 17:39:36 +02:00
6456810078
Implement TIME WITH TIME ZONE type (timetz internal type). Remap length() for character strings to CHAR_LENGTH() for SQL92 and to remove the ambiguity with geometric length() functions. Keep length() for character strings for backward compatibility. Shrink stored views by removing internal column name list from visible rte. Implement min(), max() for time and timetz data types. Implement conversion of TIME to INTERVAL. Implement abs(), mod(), fac() for the int8 data type. Rename some math functions to generic names: round(), sqrt(), cbrt(), pow(), etc. Rename NUMERIC power() function to pow(). Fix int2 factorial to calculate result in int4. Enhance the Oracle compatibility function translate() to work with string arguments (from Edwin Ramirez). Modify pg_proc system table to remove OID holes.
214 lines
4.6 KiB
Plaintext
214 lines
4.6 KiB
Plaintext
--
|
|
-- BOX
|
|
--
|
|
--
|
|
-- box logic
|
|
-- o
|
|
-- 3 o--|X
|
|
-- | o|
|
|
-- 2 +-+-+ |
|
|
-- | | | |
|
|
-- 1 | o-+-o
|
|
-- | |
|
|
-- 0 +---+
|
|
--
|
|
-- 0 1 2 3
|
|
--
|
|
-- boxes are specified by two points, given by four floats x1,y1,x2,y2
|
|
CREATE TABLE BOX_TBL (f1 box);
|
|
INSERT INTO BOX_TBL (f1) VALUES ('(2.0,2.0,0.0,0.0)');
|
|
INSERT INTO BOX_TBL (f1) VALUES ('(1.0,1.0,3.0,3.0)');
|
|
-- degenerate cases where the box is a line or a point
|
|
-- note that lines and points boxes all have zero area
|
|
INSERT INTO BOX_TBL (f1) VALUES ('(2.5, 2.5, 2.5,3.5)');
|
|
INSERT INTO BOX_TBL (f1) VALUES ('(3.0, 3.0,3.0,3.0)');
|
|
-- badly formatted box inputs
|
|
INSERT INTO BOX_TBL (f1) VALUES ('(2.3, 4.5)');
|
|
ERROR: Bad box external representation '(2.3, 4.5)'
|
|
INSERT INTO BOX_TBL (f1) VALUES ('asdfasdf(ad');
|
|
ERROR: Bad box external representation 'asdfasdf(ad'
|
|
SELECT '' AS four, BOX_TBL.*;
|
|
four | f1
|
|
------+---------------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
| (2.5,3.5),(2.5,2.5)
|
|
| (3,3),(3,3)
|
|
(4 rows)
|
|
|
|
SELECT '' AS four, b.*, area(b.f1) as barea
|
|
FROM BOX_TBL b;
|
|
four | f1 | barea
|
|
------+---------------------+-------
|
|
| (2,2),(0,0) | 4
|
|
| (3,3),(1,1) | 4
|
|
| (2.5,3.5),(2.5,2.5) | 0
|
|
| (3,3),(3,3) | 0
|
|
(4 rows)
|
|
|
|
-- overlap
|
|
SELECT '' AS three, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE b.f1 && box '(2.5,2.5,1.0,1.0)';
|
|
three | f1
|
|
-------+---------------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
| (2.5,3.5),(2.5,2.5)
|
|
(3 rows)
|
|
|
|
-- left-or-overlap (x only)
|
|
SELECT '' AS two, b1.*
|
|
FROM BOX_TBL b1
|
|
WHERE b1.f1 &< box '(2.0,2.0,2.5,2.5)';
|
|
two | f1
|
|
-----+---------------------
|
|
| (2,2),(0,0)
|
|
| (2.5,3.5),(2.5,2.5)
|
|
(2 rows)
|
|
|
|
-- right-or-overlap (x only)
|
|
SELECT '' AS two, b1.*
|
|
FROM BOX_TBL b1
|
|
WHERE b1.f1 &> box '(2.0,2.0,2.5,2.5)';
|
|
two | f1
|
|
-----+---------------------
|
|
| (2.5,3.5),(2.5,2.5)
|
|
| (3,3),(3,3)
|
|
(2 rows)
|
|
|
|
-- left of
|
|
SELECT '' AS two, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE b.f1 << box '(3.0,3.0,5.0,5.0)';
|
|
two | f1
|
|
-----+---------------------
|
|
| (2,2),(0,0)
|
|
| (2.5,3.5),(2.5,2.5)
|
|
(2 rows)
|
|
|
|
-- area <=
|
|
SELECT '' AS four, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE b.f1 <= box '(3.0,3.0,5.0,5.0)';
|
|
four | f1
|
|
------+---------------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
| (2.5,3.5),(2.5,2.5)
|
|
| (3,3),(3,3)
|
|
(4 rows)
|
|
|
|
-- area <
|
|
SELECT '' AS two, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE b.f1 < box '(3.0,3.0,5.0,5.0)';
|
|
two | f1
|
|
-----+---------------------
|
|
| (2.5,3.5),(2.5,2.5)
|
|
| (3,3),(3,3)
|
|
(2 rows)
|
|
|
|
-- area =
|
|
SELECT '' AS two, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE b.f1 = box '(3.0,3.0,5.0,5.0)';
|
|
two | f1
|
|
-----+-------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
(2 rows)
|
|
|
|
-- area >
|
|
SELECT '' AS two, b.f1
|
|
FROM BOX_TBL b -- zero area
|
|
WHERE b.f1 > box '(3.5,3.0,4.5,3.0)';
|
|
two | f1
|
|
-----+-------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
(2 rows)
|
|
|
|
-- area >=
|
|
SELECT '' AS four, b.f1
|
|
FROM BOX_TBL b -- zero area
|
|
WHERE b.f1 >= box '(3.5,3.0,4.5,3.0)';
|
|
four | f1
|
|
------+---------------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
| (2.5,3.5),(2.5,2.5)
|
|
| (3,3),(3,3)
|
|
(4 rows)
|
|
|
|
-- right of
|
|
SELECT '' AS two, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE box '(3.0,3.0,5.0,5.0)' >> b.f1;
|
|
two | f1
|
|
-----+---------------------
|
|
| (2,2),(0,0)
|
|
| (2.5,3.5),(2.5,2.5)
|
|
(2 rows)
|
|
|
|
-- contained in
|
|
SELECT '' AS three, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE b.f1 @ box '(0,0,3,3)';
|
|
three | f1
|
|
-------+-------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
| (3,3),(3,3)
|
|
(3 rows)
|
|
|
|
-- contains
|
|
SELECT '' AS three, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE box '(0,0,3,3)' ~ b.f1;
|
|
three | f1
|
|
-------+-------------
|
|
| (2,2),(0,0)
|
|
| (3,3),(1,1)
|
|
| (3,3),(3,3)
|
|
(3 rows)
|
|
|
|
-- box equality
|
|
SELECT '' AS one, b.f1
|
|
FROM BOX_TBL b
|
|
WHERE box '(1,1,3,3)' ~= b.f1;
|
|
one | f1
|
|
-----+-------------
|
|
| (3,3),(1,1)
|
|
(1 row)
|
|
|
|
-- center of box, left unary operator
|
|
SELECT '' AS four, @@(b1.f1) AS p
|
|
FROM BOX_TBL b1;
|
|
four | p
|
|
------+---------
|
|
| (1,1)
|
|
| (2,2)
|
|
| (2.5,3)
|
|
| (3,3)
|
|
(4 rows)
|
|
|
|
-- wholly-contained
|
|
SELECT '' AS one, b1.*, b2.*
|
|
FROM BOX_TBL b1, BOX_TBL b2
|
|
WHERE b1.f1 ~ b2.f1 and not b1.f1 ~= b2.f1;
|
|
one | f1 | f1
|
|
-----+-------------+-------------
|
|
| (3,3),(1,1) | (3,3),(3,3)
|
|
(1 row)
|
|
|
|
SELECT '' AS four, height(f1), width(f1) FROM BOX_TBL;
|
|
four | height | width
|
|
------+--------+-------
|
|
| 2 | 2
|
|
| 2 | 2
|
|
| 1 | 0
|
|
| 0 | 0
|
|
(4 rows)
|
|
|