mirror of
https://github.com/postgres/postgres.git
synced 2025-12-12 02:37:31 +03:00
Convert oidvector and int2vector into variable-length arrays. This
change saves a great deal of space in pg_proc and its primary index, and it eliminates the former requirement that INDEX_MAX_KEYS and FUNC_MAX_ARGS have the same value. INDEX_MAX_KEYS is still embedded in the on-disk representation (because it affects index tuple header size), but FUNC_MAX_ARGS is not. I believe it would now be possible to increase FUNC_MAX_ARGS at little cost, but haven't experimented yet. There are still a lot of vestigial references to FUNC_MAX_ARGS, which I will clean up in a separate pass. However, getting rid of it altogether would require changing the FunctionCallInfoData struct, and I'm not sure I want to buy into that.
This commit is contained in:
@@ -33,23 +33,13 @@ create function physically_coercible(oid, oid) returns bool as
|
||||
language sql;
|
||||
-- **************** pg_proc ****************
|
||||
-- Look for illegal values in pg_proc fields.
|
||||
-- NOTE: in reality pronargs could be more than 10, but I'm too lazy to put
|
||||
-- a larger number of proargtypes check clauses in here. If we ever have
|
||||
-- more-than-10-arg functions in the standard catalogs, extend this query.
|
||||
SELECT p1.oid, p1.proname
|
||||
FROM pg_proc as p1
|
||||
WHERE p1.prolang = 0 OR p1.prorettype = 0 OR
|
||||
p1.pronargs < 0 OR p1.pronargs > 10 OR
|
||||
(p1.proargtypes[0] = 0 AND p1.pronargs > 0) OR
|
||||
(p1.proargtypes[1] = 0 AND p1.pronargs > 1) OR
|
||||
(p1.proargtypes[2] = 0 AND p1.pronargs > 2) OR
|
||||
(p1.proargtypes[3] = 0 AND p1.pronargs > 3) OR
|
||||
(p1.proargtypes[4] = 0 AND p1.pronargs > 4) OR
|
||||
(p1.proargtypes[5] = 0 AND p1.pronargs > 5) OR
|
||||
(p1.proargtypes[6] = 0 AND p1.pronargs > 6) OR
|
||||
(p1.proargtypes[7] = 0 AND p1.pronargs > 7) OR
|
||||
(p1.proargtypes[8] = 0 AND p1.pronargs > 8) OR
|
||||
(p1.proargtypes[9] = 0 AND p1.pronargs > 9);
|
||||
p1.pronargs < 0 OR
|
||||
array_lower(p1.proargtypes, 1) != 0 OR
|
||||
array_upper(p1.proargtypes, 1) != p1.pronargs-1 OR
|
||||
0::oid = ANY (p1.proargtypes);
|
||||
oid | proname
|
||||
-----+---------
|
||||
(0 rows)
|
||||
@@ -218,7 +208,7 @@ WHERE p1.oid != p2.oid AND
|
||||
SELECT p1.oid, p1.proname
|
||||
FROM pg_proc as p1
|
||||
WHERE p1.prorettype = 'internal'::regtype AND NOT
|
||||
('(' || oidvectortypes(p1.proargtypes) || ')') ~ '[^a-z0-9_]internal[^a-z0-9_]';
|
||||
'internal'::regtype = ANY (p1.proargtypes);
|
||||
oid | proname
|
||||
------+-------------
|
||||
2304 | internal_in
|
||||
|
||||
@@ -106,14 +106,18 @@ ORDER BY 1;
|
||||
(1 row)
|
||||
|
||||
-- Varlena array types will point to array_in
|
||||
-- Exception as of 8.1: int2vector and oidvector have their own I/O routines
|
||||
SELECT p1.oid, p1.typname, p2.oid, p2.proname
|
||||
FROM pg_type AS p1, pg_proc AS p2
|
||||
WHERE p1.typinput = p2.oid AND p1.typtype in ('b', 'p') AND
|
||||
(p1.typelem != 0 AND p1.typlen < 0) AND NOT
|
||||
(p2.oid = 'array_in'::regproc);
|
||||
oid | typname | oid | proname
|
||||
-----+---------+-----+---------
|
||||
(0 rows)
|
||||
(p2.oid = 'array_in'::regproc)
|
||||
ORDER BY 1;
|
||||
oid | typname | oid | proname
|
||||
-----+------------+-----+--------------
|
||||
22 | int2vector | 40 | int2vectorin
|
||||
30 | oidvector | 54 | oidvectorin
|
||||
(2 rows)
|
||||
|
||||
-- Check for bogus typoutput routines
|
||||
-- As of 8.0, this check finds refcursor, which is borrowing
|
||||
@@ -165,14 +169,18 @@ ORDER BY 1;
|
||||
(1 row)
|
||||
|
||||
-- Varlena array types will point to array_recv
|
||||
-- Exception as of 8.1: int2vector and oidvector have their own I/O routines
|
||||
SELECT p1.oid, p1.typname, p2.oid, p2.proname
|
||||
FROM pg_type AS p1, pg_proc AS p2
|
||||
WHERE p1.typreceive = p2.oid AND p1.typtype in ('b', 'p') AND
|
||||
(p1.typelem != 0 AND p1.typlen < 0) AND NOT
|
||||
(p2.oid = 'array_recv'::regproc);
|
||||
oid | typname | oid | proname
|
||||
-----+---------+-----+---------
|
||||
(0 rows)
|
||||
(p2.oid = 'array_recv'::regproc)
|
||||
ORDER BY 1;
|
||||
oid | typname | oid | proname
|
||||
-----+------------+------+----------------
|
||||
22 | int2vector | 2410 | int2vectorrecv
|
||||
30 | oidvector | 2420 | oidvectorrecv
|
||||
(2 rows)
|
||||
|
||||
-- Check for bogus typsend routines
|
||||
-- As of 7.4, this check finds refcursor, which is borrowing
|
||||
@@ -203,7 +211,7 @@ WHERE p1.typsend = p2.oid AND p1.typtype in ('b', 'p') AND NOT
|
||||
-- Look for illegal values in pg_class fields
|
||||
SELECT p1.oid, p1.relname
|
||||
FROM pg_class as p1
|
||||
WHERE p1.relkind NOT IN ('r', 'i', 's', 'S', 't', 'v');
|
||||
WHERE p1.relkind NOT IN ('r', 'i', 's', 'S', 'c', 't', 'v');
|
||||
oid | relname
|
||||
-----+---------
|
||||
(0 rows)
|
||||
|
||||
@@ -39,24 +39,14 @@ language sql;
|
||||
-- **************** pg_proc ****************
|
||||
|
||||
-- Look for illegal values in pg_proc fields.
|
||||
-- NOTE: in reality pronargs could be more than 10, but I'm too lazy to put
|
||||
-- a larger number of proargtypes check clauses in here. If we ever have
|
||||
-- more-than-10-arg functions in the standard catalogs, extend this query.
|
||||
|
||||
SELECT p1.oid, p1.proname
|
||||
FROM pg_proc as p1
|
||||
WHERE p1.prolang = 0 OR p1.prorettype = 0 OR
|
||||
p1.pronargs < 0 OR p1.pronargs > 10 OR
|
||||
(p1.proargtypes[0] = 0 AND p1.pronargs > 0) OR
|
||||
(p1.proargtypes[1] = 0 AND p1.pronargs > 1) OR
|
||||
(p1.proargtypes[2] = 0 AND p1.pronargs > 2) OR
|
||||
(p1.proargtypes[3] = 0 AND p1.pronargs > 3) OR
|
||||
(p1.proargtypes[4] = 0 AND p1.pronargs > 4) OR
|
||||
(p1.proargtypes[5] = 0 AND p1.pronargs > 5) OR
|
||||
(p1.proargtypes[6] = 0 AND p1.pronargs > 6) OR
|
||||
(p1.proargtypes[7] = 0 AND p1.pronargs > 7) OR
|
||||
(p1.proargtypes[8] = 0 AND p1.pronargs > 8) OR
|
||||
(p1.proargtypes[9] = 0 AND p1.pronargs > 9);
|
||||
p1.pronargs < 0 OR
|
||||
array_lower(p1.proargtypes, 1) != 0 OR
|
||||
array_upper(p1.proargtypes, 1) != p1.pronargs-1 OR
|
||||
0::oid = ANY (p1.proargtypes);
|
||||
|
||||
-- Look for conflicting proc definitions (same names and input datatypes).
|
||||
-- (This test should be dead code now that we have the unique index
|
||||
@@ -179,7 +169,7 @@ WHERE p1.oid != p2.oid AND
|
||||
SELECT p1.oid, p1.proname
|
||||
FROM pg_proc as p1
|
||||
WHERE p1.prorettype = 'internal'::regtype AND NOT
|
||||
('(' || oidvectortypes(p1.proargtypes) || ')') ~ '[^a-z0-9_]internal[^a-z0-9_]';
|
||||
'internal'::regtype = ANY (p1.proargtypes);
|
||||
|
||||
|
||||
-- **************** pg_cast ****************
|
||||
|
||||
@@ -88,11 +88,13 @@ WHERE p1.typinput = p2.oid AND p1.typtype in ('b', 'p') AND NOT
|
||||
ORDER BY 1;
|
||||
|
||||
-- Varlena array types will point to array_in
|
||||
-- Exception as of 8.1: int2vector and oidvector have their own I/O routines
|
||||
SELECT p1.oid, p1.typname, p2.oid, p2.proname
|
||||
FROM pg_type AS p1, pg_proc AS p2
|
||||
WHERE p1.typinput = p2.oid AND p1.typtype in ('b', 'p') AND
|
||||
(p1.typelem != 0 AND p1.typlen < 0) AND NOT
|
||||
(p2.oid = 'array_in'::regproc);
|
||||
(p2.oid = 'array_in'::regproc)
|
||||
ORDER BY 1;
|
||||
|
||||
-- Check for bogus typoutput routines
|
||||
|
||||
@@ -132,11 +134,13 @@ WHERE p1.typreceive = p2.oid AND p1.typtype in ('b', 'p') AND NOT
|
||||
ORDER BY 1;
|
||||
|
||||
-- Varlena array types will point to array_recv
|
||||
-- Exception as of 8.1: int2vector and oidvector have their own I/O routines
|
||||
SELECT p1.oid, p1.typname, p2.oid, p2.proname
|
||||
FROM pg_type AS p1, pg_proc AS p2
|
||||
WHERE p1.typreceive = p2.oid AND p1.typtype in ('b', 'p') AND
|
||||
(p1.typelem != 0 AND p1.typlen < 0) AND NOT
|
||||
(p2.oid = 'array_recv'::regproc);
|
||||
(p2.oid = 'array_recv'::regproc)
|
||||
ORDER BY 1;
|
||||
|
||||
-- Check for bogus typsend routines
|
||||
|
||||
@@ -163,7 +167,7 @@ WHERE p1.typsend = p2.oid AND p1.typtype in ('b', 'p') AND NOT
|
||||
|
||||
SELECT p1.oid, p1.relname
|
||||
FROM pg_class as p1
|
||||
WHERE p1.relkind NOT IN ('r', 'i', 's', 'S', 't', 'v');
|
||||
WHERE p1.relkind NOT IN ('r', 'i', 's', 'S', 'c', 't', 'v');
|
||||
|
||||
-- Indexes should have an access method, others not.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user