⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opr_sanity.sql

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 SQL
📖 第 1 页 / 共 3 页
字号:
-- DEFINITIONAL NOTE: If A.oprnegate = B, then both A and B must yield-- boolean results, and (x A y) == ! (x B y), or the equivalent for-- single-operand operators.-- We expect that B will always say that B.oprnegate = A as well; that's not-- inherently essential, but it would be inefficient not to mark it so.-- Also, A and B had better not be the same operator.SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcodeFROM pg_operator AS p1, pg_operator AS p2WHERE p1.oprnegate = p2.oid AND    (p1.oprkind != p2.oprkind OR     p1.oprleft != p2.oprleft OR     p1.oprright != p2.oprright OR     p1.oprresult != 'bool'::regtype OR     p2.oprresult != 'bool'::regtype OR     p1.oid != p2.oprnegate OR     p1.oid = p2.oid);-- Look for mergejoin operators that don't match their links.-- An lsortop/rsortop link leads from an '=' operator to the-- sort operator ('<' operator) that's appropriate for-- its left-side or right-side data type.-- An ltcmpop/gtcmpop link leads from an '=' operator to the-- '<' or '>' operator of the same input datatypes.-- (If the '=' operator has identical L and R input datatypes,-- then lsortop, rsortop, and ltcmpop are all the same operator.)SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcodeFROM pg_operator AS p1, pg_operator AS p2WHERE p1.oprlsortop = p2.oid AND    (p1.oprname NOT IN ('=', '~=~') OR p2.oprname NOT IN ('<', '~<~') OR     p1.oprkind != 'b' OR p2.oprkind != 'b' OR     p1.oprleft != p2.oprleft OR     p1.oprleft != p2.oprright OR     p1.oprresult != 'bool'::regtype OR     p2.oprresult != 'bool'::regtype);SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcodeFROM pg_operator AS p1, pg_operator AS p2WHERE p1.oprrsortop = p2.oid AND    (p1.oprname NOT IN ('=', '~=~') OR p2.oprname NOT IN ('<', '~<~') OR     p1.oprkind != 'b' OR p2.oprkind != 'b' OR     p1.oprright != p2.oprleft OR     p1.oprright != p2.oprright OR     p1.oprresult != 'bool'::regtype OR     p2.oprresult != 'bool'::regtype);SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcodeFROM pg_operator AS p1, pg_operator AS p2WHERE p1.oprltcmpop = p2.oid AND    (p1.oprname NOT IN ('=', '~=~') OR p2.oprname NOT IN ('<', '~<~') OR     p1.oprkind != 'b' OR p2.oprkind != 'b' OR     p1.oprleft != p2.oprleft OR     p1.oprright != p2.oprright OR     p1.oprresult != 'bool'::regtype OR     p2.oprresult != 'bool'::regtype);SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcodeFROM pg_operator AS p1, pg_operator AS p2WHERE p1.oprgtcmpop = p2.oid AND    (p1.oprname NOT IN ('=', '~=~') OR p2.oprname NOT IN ('>', '~>~') OR     p1.oprkind != 'b' OR p2.oprkind != 'b' OR     p1.oprleft != p2.oprleft OR     p1.oprright != p2.oprright OR     p1.oprresult != 'bool'::regtype OR     p2.oprresult != 'bool'::regtype);-- Make sure all four links are specified if any are.SELECT p1.oid, p1.oprcodeFROM pg_operator AS p1WHERE NOT ((oprlsortop = 0 AND oprrsortop = 0 AND            oprltcmpop = 0 AND oprgtcmpop = 0) OR           (oprlsortop != 0 AND oprrsortop != 0 AND            oprltcmpop != 0 AND oprgtcmpop != 0));-- A mergejoinable = operator must have a commutator (usually itself).SELECT p1.oid, p1.oprname FROM pg_operator AS p1WHERE p1.oprlsortop != 0 AND      p1.oprcom = 0;-- Mergejoinable operators across datatypes must come in closed sets, that-- is if you provide int2 = int4 and int4 = int8 then you must also provide-- int2 = int8 (and commutators of all these).  This is necessary because-- the planner tries to deduce additional qual clauses from transitivity-- of mergejoinable operators.  If there are clauses int2var = int4var and-- int4var = int8var, the planner will deduce int2var = int8var ... and it-- had better have a way to represent it.SELECT p1.oid, p2.oid FROM pg_operator AS p1, pg_operator AS p2WHERE p1.oprlsortop != p1.oprrsortop AND      p1.oprrsortop = p2.oprlsortop AND      p2.oprlsortop != p2.oprrsortop AND      NOT EXISTS (SELECT 1 FROM pg_operator p3 WHERE      p3.oprlsortop = p1.oprlsortop AND p3.oprrsortop = p2.oprrsortop);-- Hashing only works on simple equality operators "type = sametype",-- since the hash itself depends on the bitwise representation of the type.-- Check that allegedly hashable operators look like they might be "=".SELECT p1.oid, p1.oprnameFROM pg_operator AS p1WHERE p1.oprcanhash AND NOT    (p1.oprkind = 'b' AND p1.oprresult = 'bool'::regtype AND     p1.oprleft = p1.oprright AND p1.oprname IN ('=', '~=~') AND     p1.oprcom = p1.oid);-- In 6.5 we accepted hashable array equality operators when the array element-- type is hashable.  However, what we actually need to make hashjoin work on-- an array is a hashable element type *and* no padding between elements in-- the array storage (or, perhaps, guaranteed-zero padding).  Currently,-- since the padding code in arrayfuncs.c is pretty bogus, it seems safest-- to just forbid hashjoin on array equality ops.-- This should be reconsidered someday.-- -- Look for array equality operators that are hashable when the underlying-- -- type is not, or vice versa.  This is presumably bogus.-- -- SELECT p1.oid, p1.oprcanhash, p2.oid, p2.oprcanhash, t1.typname, t2.typname-- FROM pg_operator AS p1, pg_operator AS p2, pg_type AS t1, pg_type AS t2-- WHERE p1.oprname = '=' AND p1.oprleft = p1.oprright AND --     p2.oprname = '=' AND p2.oprleft = p2.oprright AND--     p1.oprleft = t1.oid AND p2.oprleft = t2.oid AND t1.typelem = t2.oid AND--     p1.oprcanhash != p2.oprcanhash;-- Substitute check: forbid hashable array ops, period.SELECT p1.oid, p1.oprnameFROM pg_operator AS p1, pg_proc AS p2WHERE p1.oprcanhash AND p1.oprcode = p2.oid AND p2.proname = 'array_eq';-- Hashable operators should appear as members of hash index opclasses.SELECT p1.oid, p1.oprnameFROM pg_operator AS p1WHERE p1.oprcanhash AND NOT EXISTS  (SELECT 1 FROM pg_opclass op JOIN pg_amop p ON op.oid = amopclaid   WHERE opcamid = (SELECT oid FROM pg_am WHERE amname = 'hash') AND         amopopr = p1.oid);-- And the converse.SELECT p1.oid, p1.oprname, op.opcnameFROM pg_operator AS p1, pg_opclass op, pg_amop pWHERE amopopr = p1.oid AND amopclaid = op.oid  AND opcamid = (SELECT oid FROM pg_am WHERE amname = 'hash')  AND NOT p1.oprcanhash;-- Check that each operator defined in pg_operator matches its oprcode entry-- in pg_proc.  Easiest to do this separately for each oprkind.SELECT p1.oid, p1.oprname, p2.oid, p2.pronameFROM pg_operator AS p1, pg_proc AS p2WHERE p1.oprcode = p2.oid AND    p1.oprkind = 'b' AND    (p2.pronargs != 2     OR NOT binary_coercible(p2.prorettype, p1.oprresult)     OR NOT binary_coercible(p1.oprleft, p2.proargtypes[0])     OR NOT binary_coercible(p1.oprright, p2.proargtypes[1]));SELECT p1.oid, p1.oprname, p2.oid, p2.pronameFROM pg_operator AS p1, pg_proc AS p2WHERE p1.oprcode = p2.oid AND    p1.oprkind = 'l' AND    (p2.pronargs != 1     OR NOT binary_coercible(p2.prorettype, p1.oprresult)     OR NOT binary_coercible(p1.oprright, p2.proargtypes[0])     OR p1.oprleft != 0);SELECT p1.oid, p1.oprname, p2.oid, p2.pronameFROM pg_operator AS p1, pg_proc AS p2WHERE p1.oprcode = p2.oid AND    p1.oprkind = 'r' AND    (p2.pronargs != 1     OR NOT binary_coercible(p2.prorettype, p1.oprresult)     OR NOT binary_coercible(p1.oprleft, p2.proargtypes[0])     OR p1.oprright != 0);-- If the operator is mergejoinable or hashjoinable, its underlying function-- should not be volatile.SELECT p1.oid, p1.oprname, p2.oid, p2.pronameFROM pg_operator AS p1, pg_proc AS p2WHERE p1.oprcode = p2.oid AND    (p1.oprlsortop != 0 OR p1.oprcanhash) AND    p2.provolatile = 'v';-- If oprrest is set, the operator must return boolean,-- and it must link to a proc with the right signature-- to be a restriction selectivity estimator.-- The proc signature we want is: float8 proc(internal, oid, internal, int4)SELECT p1.oid, p1.oprname, p2.oid, p2.pronameFROM pg_operator AS p1, pg_proc AS p2WHERE p1.oprrest = p2.oid AND    (p1.oprresult != 'bool'::regtype OR     p2.prorettype != 'float8'::regtype OR p2.proretset OR     p2.pronargs != 4 OR     p2.proargtypes[0] != 'internal'::regtype OR     p2.proargtypes[1] != 'oid'::regtype OR     p2.proargtypes[2] != 'internal'::regtype OR     p2.proargtypes[3] != 'int4'::regtype);-- If oprjoin is set, the operator must be a binary boolean op,-- and it must link to a proc with the right signature-- to be a join selectivity estimator.-- The proc signature we want is: float8 proc(internal, oid, internal, int2)SELECT p1.oid, p1.oprname, p2.oid, p2.pronameFROM pg_operator AS p1, pg_proc AS p2WHERE p1.oprjoin = p2.oid AND    (p1.oprkind != 'b' OR p1.oprresult != 'bool'::regtype OR     p2.prorettype != 'float8'::regtype OR p2.proretset OR     p2.pronargs != 4 OR     p2.proargtypes[0] != 'internal'::regtype OR     p2.proargtypes[1] != 'oid'::regtype OR     p2.proargtypes[2] != 'internal'::regtype OR     p2.proargtypes[3] != 'int2'::regtype);-- **************** pg_aggregate ****************-- Look for illegal values in pg_aggregate fields.SELECT ctid, aggfnoid::oidFROM pg_aggregate as p1WHERE aggfnoid = 0 OR aggtransfn = 0 OR aggtranstype = 0;-- Make sure the matching pg_proc entry is sensible, too.SELECT a.aggfnoid::oid, p.pronameFROM pg_aggregate as a, pg_proc as pWHERE a.aggfnoid = p.oid AND    (NOT p.proisagg OR p.pronargs != 1 OR p.proretset);-- Make sure there are no proisagg pg_proc entries without matches.SELECT oid, pronameFROM pg_proc as pWHERE p.proisagg AND    NOT EXISTS (SELECT 1 FROM pg_aggregate a WHERE a.aggfnoid = p.oid);-- If there is no finalfn then the output type must be the transtype.SELECT a.aggfnoid::oid, p.pronameFROM pg_aggregate as a, pg_proc as pWHERE a.aggfnoid = p.oid AND    a.aggfinalfn = 0 AND p.prorettype != a.aggtranstype;-- Cross-check transfn against its entry in pg_proc.-- NOTE: use physically_coercible here, not binary_coercible, because-- max and min on abstime are implemented using int4larger/int4smaller.SELECT a.aggfnoid::oid, p.proname, ptr.oid, ptr.pronameFROM pg_aggregate AS a, pg_proc AS p, pg_proc AS ptrWHERE a.aggfnoid = p.oid AND    a.aggtransfn = ptr.oid AND    (ptr.proretset     OR NOT physically_coercible(ptr.prorettype, a.aggtranstype)     OR NOT physically_coercible(a.aggtranstype, ptr.proargtypes[0])     OR NOT ((ptr.pronargs = 2 AND              physically_coercible(p.proargtypes[0], ptr.proargtypes[1]))             OR             (ptr.pronargs = 1 AND              p.proargtypes[0] = '"any"'::regtype)));-- Cross-check finalfn (if present) against its entry in pg_proc.SELECT a.aggfnoid::oid, p.proname, pfn.oid, pfn.pronameFROM pg_aggregate AS a, pg_proc AS p, pg_proc AS pfnWHERE a.aggfnoid = p.oid AND    a.aggfinalfn = pfn.oid AND    (pfn.proretset     OR NOT binary_coercible(pfn.prorettype, p.prorettype)     OR pfn.pronargs != 1     OR NOT binary_coercible(a.aggtranstype, pfn.proargtypes[0]));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -