Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
b0a66dd1
Commit
b0a66dd1
authored
Mar 28, 1999
by
Tom Lane
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New regression test to cross-check pg_type, pg_class,
and related tables.
parent
8a3ef74b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
285 additions
and
0 deletions
+285
-0
src/test/regress/expected/type_sanity.out
src/test/regress/expected/type_sanity.out
+131
-0
src/test/regress/sql/tests
src/test/regress/sql/tests
+1
-0
src/test/regress/sql/type_sanity.sql
src/test/regress/sql/type_sanity.sql
+153
-0
No files found.
src/test/regress/expected/type_sanity.out
0 → 100644
View file @
b0a66dd1
QUERY: SELECT p1.oid, p1.typname
FROM pg_type as p1
WHERE (p1.typlen <= 0 AND p1.typlen != -1) OR
(p1.typtype != 'b' AND p1.typtype != 'c') OR
NOT p1.typisdefined OR
(p1.typalign != 'c' AND p1.typalign != 's' AND
p1.typalign != 'i' AND p1.typalign != 'd');
oid|typname
---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.typname
FROM pg_type as p1
WHERE p1.typbyval AND
(p1.typlen != 1 OR p1.typalign != 'c') AND
(p1.typlen != 2 OR p1.typalign != 's') AND
(p1.typlen != 4 OR p1.typalign != 'i');
oid|typname
---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.typname
FROM pg_type as p1
WHERE (p1.typtype = 'c' AND p1.typrelid = 0) OR
(p1.typtype != 'c' AND p1.typrelid != 0);
oid|typname
---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.typname
FROM pg_type as p1
WHERE p1.typtype != 'c' AND
(p1.typinput = 0 OR p1.typoutput = 0 OR
p1.typreceive = 0 OR p1.typsend = 0);
oid|typname
---+-------
(0 rows)
QUERY: 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 = 'b' AND
(p2.pronargs != 1 OR p2.proretset) AND
(p2.pronargs < 2 OR p2.pronargs > 3 OR p2.proretset OR p1.typelem = 0);
oid|typname|oid|proname
---+-------+---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.typname, p2.oid, p2.proname
FROM pg_type AS p1, pg_proc AS p2
WHERE p1.typoutput = p2.oid AND p1.typtype = 'b' AND
(p2.pronargs != 1 OR p2.proretset) AND
(p2.pronargs != 2 OR p2.proretset OR p1.typelem = 0);
oid|typname|oid|proname
---+-------+---+-------
(0 rows)
QUERY: 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 = 'b' AND
(p2.pronargs != 1 OR p2.proretset) AND
(p2.pronargs < 2 OR p2.pronargs > 3 OR p2.proretset OR p1.typelem = 0);
oid|typname|oid|proname
---+-------+---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.typname, p2.oid, p2.proname
FROM pg_type AS p1, pg_proc AS p2
WHERE p1.typsend = p2.oid AND p1.typtype = 'b' AND
(p2.pronargs != 1 OR p2.proretset) AND
(p2.pronargs != 2 OR p2.proretset OR p1.typelem = 0);
oid|typname|oid|proname
---+-------+---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.relname
FROM pg_class as p1
WHERE (p1.relkind != 'r' AND p1.relkind != 'i' AND p1.relkind != 's');
oid|relname
---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.relname
FROM pg_class as p1
WHERE (p1.relkind = 'i' AND p1.relam = 0) OR
(p1.relkind != 'i' AND p1.relam != 0);
oid|relname
---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.attrelid, p1.attname
FROM pg_attribute as p1
WHERE p1.attrelid = 0 OR p1.atttypid = 0 OR p1.attnum = 0 OR
p1.attcacheoff != -1;
oid|attrelid|attname
---+--------+-------
(0 rows)
QUERY: SELECT p1.oid, p1.attname, p2.oid, p2.attname
FROM pg_attribute AS p1, pg_attribute AS p2
WHERE p1.oid != p2.oid AND
p1.attrelid = p2.attrelid AND
(p1.attname = p2.attname OR p1.attnum = p2.attnum);
oid|attname|oid|attname
---+-------+---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.attname, p2.oid, p2.relname
FROM pg_attribute AS p1, pg_class AS p2
WHERE p1.attrelid = p2.oid AND p1.attnum > p2.relnatts;
oid|attname|oid|relname
---+-------+---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.relname
FROM pg_class AS p1
WHERE p1.relnatts != (SELECT count(*) FROM pg_attribute AS p2
WHERE p2.attrelid = p1.oid AND p2.attnum > 0);
oid|relname
---+-------
(0 rows)
QUERY: SELECT p1.oid, p1.attname, p2.oid, p2.typname
FROM pg_attribute AS p1, pg_type AS p2
WHERE p1.atttypid = p2.oid AND
(p1.attlen != p2.typlen OR
p1.attalign != p2.typalign OR
p1.attbyval != p2.typbyval);
oid|attname|oid|typname
---+-------+---+-------
(0 rows)
src/test/regress/sql/tests
View file @
b0a66dd1
...
@@ -27,6 +27,7 @@ horology
...
@@ -27,6 +27,7 @@ horology
inet
inet
comments
comments
oidjoins
oidjoins
type_sanity
opr_sanity
opr_sanity
create_function_1
create_function_1
create_type
create_type
...
...
src/test/regress/sql/type_sanity.sql
0 → 100644
View file @
b0a66dd1
--
-- Sanity checks for common errors in making type-related system tables:
-- pg_type, pg_class, pg_attribute.
--
-- None of the SELECTs here should ever find any matching entries,
-- so the expected output is easy to maintain ;-).
-- A test failure indicates someone messed up an entry in the system tables.
--
-- NB: we assume the oidjoins test will have caught any dangling links,
-- that is OID or REGPROC fields that are not zero and do not match some
-- row in the linked-to table. However, if we want to enforce that a link
-- field can't be 0, we have to check it here.
-- **************** pg_type ****************
-- Look for illegal values in pg_type fields.
SELECT
p1
.
oid
,
p1
.
typname
FROM
pg_type
as
p1
WHERE
(
p1
.
typlen
<=
0
AND
p1
.
typlen
!=
-
1
)
OR
(
p1
.
typtype
!=
'b'
AND
p1
.
typtype
!=
'c'
)
OR
NOT
p1
.
typisdefined
OR
(
p1
.
typalign
!=
'c'
AND
p1
.
typalign
!=
's'
AND
p1
.
typalign
!=
'i'
AND
p1
.
typalign
!=
'd'
);
-- Look for "pass by value" types that can't be passed by value.
SELECT
p1
.
oid
,
p1
.
typname
FROM
pg_type
as
p1
WHERE
p1
.
typbyval
AND
(
p1
.
typlen
!=
1
OR
p1
.
typalign
!=
'c'
)
AND
(
p1
.
typlen
!=
2
OR
p1
.
typalign
!=
's'
)
AND
(
p1
.
typlen
!=
4
OR
p1
.
typalign
!=
'i'
);
-- Look for complex types that do not have a typrelid entry,
-- or basic types that do.
SELECT
p1
.
oid
,
p1
.
typname
FROM
pg_type
as
p1
WHERE
(
p1
.
typtype
=
'c'
AND
p1
.
typrelid
=
0
)
OR
(
p1
.
typtype
!=
'c'
AND
p1
.
typrelid
!=
0
);
-- Conversion routines must be provided except in 'c' entries.
SELECT
p1
.
oid
,
p1
.
typname
FROM
pg_type
as
p1
WHERE
p1
.
typtype
!=
'c'
AND
(
p1
.
typinput
=
0
OR
p1
.
typoutput
=
0
OR
p1
.
typreceive
=
0
OR
p1
.
typsend
=
0
);
-- Check for bogus typinput routines
-- The first OR subclause detects bogus non-array cases,
-- the second one detects bogus array cases.
-- FIXME: ought to check prorettype, but there are special cases that make it
-- hard: prorettype might be binary-compatible with the type but not the same,
-- and for array types array_in's result has nothing to do with anything.
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
=
'b'
AND
(
p2
.
pronargs
!=
1
OR
p2
.
proretset
)
AND
(
p2
.
pronargs
<
2
OR
p2
.
pronargs
>
3
OR
p2
.
proretset
OR
p1
.
typelem
=
0
);
-- Check for bogus typoutput routines
-- The first OR subclause detects bogus non-array cases,
-- the second one detects bogus array cases.
-- FIXME: ought to check prorettype, but not clear what it should be.
SELECT
p1
.
oid
,
p1
.
typname
,
p2
.
oid
,
p2
.
proname
FROM
pg_type
AS
p1
,
pg_proc
AS
p2
WHERE
p1
.
typoutput
=
p2
.
oid
AND
p1
.
typtype
=
'b'
AND
(
p2
.
pronargs
!=
1
OR
p2
.
proretset
)
AND
(
p2
.
pronargs
!=
2
OR
p2
.
proretset
OR
p1
.
typelem
=
0
);
-- Check for bogus typreceive routines
-- The first OR subclause detects bogus non-array cases,
-- the second one detects bogus array cases.
-- FIXME: ought to check prorettype, but there are special cases that make it
-- hard: prorettype might be binary-compatible with the type but not the same,
-- and for array types array_in's result has nothing to do with anything.
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
=
'b'
AND
(
p2
.
pronargs
!=
1
OR
p2
.
proretset
)
AND
(
p2
.
pronargs
<
2
OR
p2
.
pronargs
>
3
OR
p2
.
proretset
OR
p1
.
typelem
=
0
);
-- Check for bogus typsend routines
-- The first OR subclause detects bogus non-array cases,
-- the second one detects bogus array cases.
-- FIXME: ought to check prorettype, but not clear what it should be.
SELECT
p1
.
oid
,
p1
.
typname
,
p2
.
oid
,
p2
.
proname
FROM
pg_type
AS
p1
,
pg_proc
AS
p2
WHERE
p1
.
typsend
=
p2
.
oid
AND
p1
.
typtype
=
'b'
AND
(
p2
.
pronargs
!=
1
OR
p2
.
proretset
)
AND
(
p2
.
pronargs
!=
2
OR
p2
.
proretset
OR
p1
.
typelem
=
0
);
-- **************** pg_class ****************
-- Look for illegal values in pg_class fields
SELECT
p1
.
oid
,
p1
.
relname
FROM
pg_class
as
p1
WHERE
(
p1
.
relkind
!=
'r'
AND
p1
.
relkind
!=
'i'
AND
p1
.
relkind
!=
's'
);
-- Indexes should have an access method, others not.
SELECT
p1
.
oid
,
p1
.
relname
FROM
pg_class
as
p1
WHERE
(
p1
.
relkind
=
'i'
AND
p1
.
relam
=
0
)
OR
(
p1
.
relkind
!=
'i'
AND
p1
.
relam
!=
0
);
-- **************** pg_attribute ****************
-- Look for illegal values in pg_attribute fields
SELECT
p1
.
oid
,
p1
.
attrelid
,
p1
.
attname
FROM
pg_attribute
as
p1
WHERE
p1
.
attrelid
=
0
OR
p1
.
atttypid
=
0
OR
p1
.
attnum
=
0
OR
p1
.
attcacheoff
!=
-
1
;
-- Look for duplicate pg_attribute entries
-- (This would not be necessary if the indexes on pg_attribute were UNIQUE?)
SELECT
p1
.
oid
,
p1
.
attname
,
p2
.
oid
,
p2
.
attname
FROM
pg_attribute
AS
p1
,
pg_attribute
AS
p2
WHERE
p1
.
oid
!=
p2
.
oid
AND
p1
.
attrelid
=
p2
.
attrelid
AND
(
p1
.
attname
=
p2
.
attname
OR
p1
.
attnum
=
p2
.
attnum
);
-- Cross-check attnum against parent relation
SELECT
p1
.
oid
,
p1
.
attname
,
p2
.
oid
,
p2
.
relname
FROM
pg_attribute
AS
p1
,
pg_class
AS
p2
WHERE
p1
.
attrelid
=
p2
.
oid
AND
p1
.
attnum
>
p2
.
relnatts
;
-- Detect missing pg_attribute entries: should have as many non-system
-- attributes as parent relation expects
SELECT
p1
.
oid
,
p1
.
relname
FROM
pg_class
AS
p1
WHERE
p1
.
relnatts
!=
(
SELECT
count
(
*
)
FROM
pg_attribute
AS
p2
WHERE
p2
.
attrelid
=
p1
.
oid
AND
p2
.
attnum
>
0
);
-- Cross-check against pg_type entry
SELECT
p1
.
oid
,
p1
.
attname
,
p2
.
oid
,
p2
.
typname
FROM
pg_attribute
AS
p1
,
pg_type
AS
p2
WHERE
p1
.
atttypid
=
p2
.
oid
AND
(
p1
.
attlen
!=
p2
.
typlen
OR
p1
.
attalign
!=
p2
.
typalign
OR
p1
.
attbyval
!=
p2
.
typbyval
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment