mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Make oidin/oidout produce and consume unsigned representation of Oid,
rather than just being aliases for int4in/int4out. Give type Oid a full set of comparison operators that do proper unsigned comparison, instead of reusing the int4 comparators. Since pg_dump is now doing unsigned comparisons of OIDs, it is now *necessary* that we play by the rules here. In fact, given that btoidcmp() has been doing unsigned comparison for quite some time, it seems likely that we have index- corruption problems in 7.0 and before once the Oid counter goes past 2G. Fixing these operators is a necessary step before we can think about 8-byte Oid, too.
This commit is contained in:
@ -6,63 +6,70 @@ INSERT INTO OID_TBL(f1) VALUES ('1234');
|
||||
INSERT INTO OID_TBL(f1) VALUES ('1235');
|
||||
INSERT INTO OID_TBL(f1) VALUES ('987');
|
||||
INSERT INTO OID_TBL(f1) VALUES ('-1040');
|
||||
INSERT INTO OID_TBL(f1) VALUES ('99999999');
|
||||
INSERT INTO OID_TBL(f1) VALUES ('');
|
||||
-- bad inputs
|
||||
INSERT INTO OID_TBL(f1) VALUES ('asdfasd');
|
||||
ERROR: pg_atoi: error in "asdfasd": can't parse "asdfasd"
|
||||
SELECT '' AS five, OID_TBL.*;
|
||||
five | f1
|
||||
------+-------
|
||||
| 1234
|
||||
| 1235
|
||||
| 987
|
||||
| -1040
|
||||
| 0
|
||||
ERROR: oidin: error in "asdfasd": can't parse "asdfasd"
|
||||
INSERT INTO OID_TBL(f1) VALUES ('99asdfasd');
|
||||
ERROR: oidin: error in "99asdfasd": can't parse "asdfasd"
|
||||
SELECT '' AS six, OID_TBL.*;
|
||||
six | f1
|
||||
-----+------------
|
||||
| 1234
|
||||
| 1235
|
||||
| 987
|
||||
| 4294966256
|
||||
| 99999999
|
||||
| 0
|
||||
(6 rows)
|
||||
|
||||
SELECT '' AS one, o.* FROM OID_TBL o WHERE o.f1 = 1234;
|
||||
one | f1
|
||||
-----+------
|
||||
| 1234
|
||||
(1 row)
|
||||
|
||||
SELECT '' AS five, o.* FROM OID_TBL o WHERE o.f1 <> '1234';
|
||||
five | f1
|
||||
------+------------
|
||||
| 1235
|
||||
| 987
|
||||
| 4294966256
|
||||
| 99999999
|
||||
| 0
|
||||
(5 rows)
|
||||
|
||||
SELECT '' AS one, o.* FROM OID_TBL o WHERE o.f1 = oid '1234';
|
||||
one | f1
|
||||
-----+------
|
||||
| 1234
|
||||
(1 row)
|
||||
|
||||
SELECT '' AS four, o.* FROM OID_TBL o WHERE o.f1 <> '1234';
|
||||
four | f1
|
||||
------+-------
|
||||
| 1235
|
||||
| 987
|
||||
| -1040
|
||||
| 0
|
||||
(4 rows)
|
||||
|
||||
SELECT '' AS four, o.* FROM OID_TBL o WHERE o.f1 <= '1234';
|
||||
four | f1
|
||||
------+-------
|
||||
| 1234
|
||||
| 987
|
||||
| -1040
|
||||
| 0
|
||||
(4 rows)
|
||||
|
||||
SELECT '' AS three, o.* FROM OID_TBL o WHERE o.f1 < '1234';
|
||||
three | f1
|
||||
-------+-------
|
||||
| 987
|
||||
| -1040
|
||||
| 0
|
||||
SELECT '' AS three, o.* FROM OID_TBL o WHERE o.f1 <= '1234';
|
||||
three | f1
|
||||
-------+------
|
||||
| 1234
|
||||
| 987
|
||||
| 0
|
||||
(3 rows)
|
||||
|
||||
SELECT '' AS two, o.* FROM OID_TBL o WHERE o.f1 >= '1234';
|
||||
two | f1
|
||||
-----+------
|
||||
| 1234
|
||||
| 1235
|
||||
SELECT '' AS two, o.* FROM OID_TBL o WHERE o.f1 < '1234';
|
||||
two | f1
|
||||
-----+-----
|
||||
| 987
|
||||
| 0
|
||||
(2 rows)
|
||||
|
||||
SELECT '' AS one, o.* FROM OID_TBL o WHERE o.f1 > '1234';
|
||||
one | f1
|
||||
-----+------
|
||||
| 1235
|
||||
(1 row)
|
||||
SELECT '' AS four, o.* FROM OID_TBL o WHERE o.f1 >= '1234';
|
||||
four | f1
|
||||
------+------------
|
||||
| 1234
|
||||
| 1235
|
||||
| 4294966256
|
||||
| 99999999
|
||||
(4 rows)
|
||||
|
||||
SELECT '' AS three, o.* FROM OID_TBL o WHERE o.f1 > '1234';
|
||||
three | f1
|
||||
-------+------------
|
||||
| 1235
|
||||
| 4294966256
|
||||
| 99999999
|
||||
(3 rows)
|
||||
|
||||
DROP TABLE OID_TBL;
|
||||
|
@ -12,24 +12,28 @@ INSERT INTO OID_TBL(f1) VALUES ('987');
|
||||
|
||||
INSERT INTO OID_TBL(f1) VALUES ('-1040');
|
||||
|
||||
INSERT INTO OID_TBL(f1) VALUES ('99999999');
|
||||
|
||||
INSERT INTO OID_TBL(f1) VALUES ('');
|
||||
|
||||
-- bad inputs
|
||||
|
||||
INSERT INTO OID_TBL(f1) VALUES ('asdfasd');
|
||||
INSERT INTO OID_TBL(f1) VALUES ('99asdfasd');
|
||||
|
||||
SELECT '' AS five, OID_TBL.*;
|
||||
SELECT '' AS six, OID_TBL.*;
|
||||
|
||||
|
||||
SELECT '' AS one, o.* FROM OID_TBL o WHERE o.f1 = oid '1234';
|
||||
SELECT '' AS one, o.* FROM OID_TBL o WHERE o.f1 = 1234;
|
||||
|
||||
SELECT '' AS four, o.* FROM OID_TBL o WHERE o.f1 <> '1234';
|
||||
SELECT '' AS five, o.* FROM OID_TBL o WHERE o.f1 <> '1234';
|
||||
|
||||
SELECT '' AS four, o.* FROM OID_TBL o WHERE o.f1 <= '1234';
|
||||
SELECT '' AS three, o.* FROM OID_TBL o WHERE o.f1 <= '1234';
|
||||
|
||||
SELECT '' AS three, o.* FROM OID_TBL o WHERE o.f1 < '1234';
|
||||
SELECT '' AS two, o.* FROM OID_TBL o WHERE o.f1 < '1234';
|
||||
|
||||
SELECT '' AS two, o.* FROM OID_TBL o WHERE o.f1 >= '1234';
|
||||
SELECT '' AS four, o.* FROM OID_TBL o WHERE o.f1 >= '1234';
|
||||
|
||||
SELECT '' AS one, o.* FROM OID_TBL o WHERE o.f1 > '1234';
|
||||
SELECT '' AS three, o.* FROM OID_TBL o WHERE o.f1 > '1234';
|
||||
|
||||
DROP TABLE OID_TBL;
|
||||
|
Reference in New Issue
Block a user