lsyscache.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:10k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * lsyscache.c
  4.  *   Routines to access information within system caches
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/utils/cache/lsyscache.c,v 1.27.2.1 1999/08/02 05:25:00 scrappy Exp $
  11.  *
  12.  * NOTES
  13.  *   Eventually, the index information should go through here, too.
  14.  *-------------------------------------------------------------------------
  15.  */
  16. #include "postgres.h"
  17. #include "catalog/pg_operator.h"
  18. #include "catalog/pg_type.h"
  19. #include "utils/lsyscache.h"
  20. #include "utils/syscache.h"
  21. /* ---------- AMOP CACHES ----------  */
  22. /*
  23.  * op_class -
  24.  *
  25.  * Return t iff operator 'opno' is in operator class 'opclass'.
  26.  *
  27.  */
  28. bool
  29. op_class(Oid oprno, int32 opclass, Oid amopid)
  30. {
  31. if (HeapTupleIsValid(SearchSysCacheTuple(AMOPOPID,
  32.  ObjectIdGetDatum(opclass),
  33.  ObjectIdGetDatum(oprno),
  34.  ObjectIdGetDatum(amopid),
  35.  0)))
  36. return true;
  37. else
  38. return false;
  39. }
  40. /* ---------- ATTRIBUTE CACHES ----------  */
  41. /*
  42.  * get_attname -
  43.  *
  44.  * Given the relation id and the attribute number,
  45.  * return the "attname" field from the attribute relation.
  46.  *
  47.  */
  48. char *
  49. get_attname(Oid relid, AttrNumber attnum)
  50. {
  51. HeapTuple tp;
  52. tp = SearchSysCacheTuple(ATTNUM,
  53.  ObjectIdGetDatum(relid),
  54.  UInt16GetDatum(attnum),
  55.  0, 0);
  56. if (HeapTupleIsValid(tp))
  57. {
  58. Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
  59. return pstrdup(att_tup->attname.data);
  60. }
  61. else
  62. return NULL;
  63. }
  64. /*
  65.  * get_attnum -
  66.  *
  67.  * Given the relation id and the attribute name,
  68.  * return the "attnum" field from the attribute relation.
  69.  *
  70.  */
  71. AttrNumber
  72. get_attnum(Oid relid, char *attname)
  73. {
  74. HeapTuple tp;
  75. tp = SearchSysCacheTuple(ATTNAME,
  76.  ObjectIdGetDatum(relid),
  77.  PointerGetDatum(attname),
  78.  0, 0);
  79. if (HeapTupleIsValid(tp))
  80. {
  81. Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
  82. return att_tup->attnum;
  83. }
  84. else
  85. return InvalidAttrNumber;
  86. }
  87. /*
  88.  * get_atttype -
  89.  *
  90.  * Given the relation OID and the attribute number with the relation,
  91.  * return the attribute type OID.
  92.  *
  93.  */
  94. Oid
  95. get_atttype(Oid relid, AttrNumber attnum)
  96. {
  97. HeapTuple tp;
  98. tp = SearchSysCacheTuple(ATTNUM,
  99.  ObjectIdGetDatum(relid),
  100.  UInt16GetDatum(attnum),
  101.  0, 0);
  102. if (HeapTupleIsValid(tp))
  103. {
  104. Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
  105. return att_tup->atttypid;
  106. }
  107. else
  108. return InvalidOid;
  109. }
  110. /* This routine uses the attname instead of the attnum because it
  111.  * replaces the routine find_atttype, which is called sometimes when
  112.  * only the attname, not the attno, is available.
  113.  */
  114. bool
  115. get_attisset(Oid relid, char *attname)
  116. {
  117. HeapTuple tp;
  118. tp = SearchSysCacheTuple(ATTNAME,
  119.  ObjectIdGetDatum(relid),
  120.  PointerGetDatum(attname),
  121.  0, 0);
  122. if (HeapTupleIsValid(tp))
  123. {
  124. Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
  125. return att_tup->attisset;
  126. }
  127. else
  128. return false;
  129. }
  130. /*
  131.  * get_atttypmod -
  132.  *
  133.  * Given the relation id and the attribute number,
  134.  * return the "atttypmod" field from the attribute relation.
  135.  *
  136.  */
  137. int32
  138. get_atttypmod(Oid relid, AttrNumber attnum)
  139. {
  140. HeapTuple tp;
  141. tp = SearchSysCacheTuple(ATTNUM,
  142.  ObjectIdGetDatum(relid),
  143.  UInt16GetDatum(attnum),
  144.  0, 0);
  145. if (HeapTupleIsValid(tp))
  146. {
  147. Form_pg_attribute att_tup = (Form_pg_attribute) GETSTRUCT(tp);
  148. return att_tup->atttypmod;
  149. }
  150. else
  151. return -1;
  152. }
  153. /* ---------- INDEX CACHE ----------  */
  154. /* watch this space...
  155.  */
  156. /* ---------- OPERATOR CACHE ----------  */
  157. /*
  158.  * get_opcode -
  159.  *
  160.  * Returns the regproc id of the routine used to implement an
  161.  * operator given the operator oid.
  162.  *
  163.  */
  164. RegProcedure
  165. get_opcode(Oid opno)
  166. {
  167. HeapTuple tp;
  168. tp = SearchSysCacheTuple(OPROID,
  169.  ObjectIdGetDatum(opno),
  170.  0, 0, 0);
  171. if (HeapTupleIsValid(tp))
  172. {
  173. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  174. return optup->oprcode;
  175. }
  176. else
  177. return (RegProcedure) NULL;
  178. }
  179. /*
  180.  * get_opname -
  181.  *   returns the name of the operator with the given opno
  182.  *
  183.  * Note: returns a palloc'd copy of the string, or NULL if no such operator.
  184.  */
  185. char *
  186. get_opname(Oid opno)
  187. {
  188. HeapTuple tp;
  189. tp = SearchSysCacheTuple(OPROID,
  190.  ObjectIdGetDatum(opno),
  191.  0, 0, 0);
  192. if (HeapTupleIsValid(tp))
  193. {
  194. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  195. return pstrdup(optup->oprname.data);
  196. }
  197. else
  198. return NULL;
  199. }
  200. /*
  201.  * op_mergejoinable -
  202.  *
  203.  * Returns the left and right sort operators and types corresponding to a
  204.  * mergejoinable operator, or nil if the operator is not mergejoinable.
  205.  *
  206.  */
  207. bool
  208. op_mergejoinable(Oid opno, Oid ltype, Oid rtype, Oid *leftOp, Oid *rightOp)
  209. {
  210. HeapTuple tp;
  211. tp = SearchSysCacheTuple(OPROID,
  212.  ObjectIdGetDatum(opno),
  213.  0, 0, 0);
  214. if (HeapTupleIsValid(tp))
  215. {
  216. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  217. if (optup->oprlsortop &&
  218. optup->oprrsortop &&
  219. optup->oprleft == ltype &&
  220. optup->oprright == rtype)
  221. {
  222. *leftOp = ObjectIdGetDatum(optup->oprlsortop);
  223. *rightOp = ObjectIdGetDatum(optup->oprrsortop);
  224. return true;
  225. }
  226. }
  227. return false;
  228. }
  229. /*
  230.  * op_hashjoinable
  231.  *
  232.  * Returns the hash operator corresponding to a hashjoinable operator,
  233.  * or nil if the operator is not hashjoinable.
  234.  *
  235.  */
  236. Oid
  237. op_hashjoinable(Oid opno, Oid ltype, Oid rtype)
  238. {
  239. HeapTuple tp;
  240. tp = SearchSysCacheTuple(OPROID,
  241.  ObjectIdGetDatum(opno),
  242.  0, 0, 0);
  243. if (HeapTupleIsValid(tp))
  244. {
  245. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  246. if (optup->oprcanhash &&
  247. optup->oprleft == ltype &&
  248. optup->oprright == rtype)
  249. return opno;
  250. }
  251. return InvalidOid;
  252. }
  253. HeapTuple
  254. get_operator_tuple(Oid opno)
  255. {
  256. HeapTuple optup;
  257. if ((optup = SearchSysCacheTuple(OPROID,
  258.  ObjectIdGetDatum(opno),
  259.  0, 0, 0)))
  260. return optup;
  261. else
  262. return (HeapTuple) NULL;
  263. }
  264. /*
  265.  * get_commutator -
  266.  *
  267.  * Returns the corresponding commutator of an operator.
  268.  *
  269.  */
  270. Oid
  271. get_commutator(Oid opno)
  272. {
  273. HeapTuple tp;
  274. tp = SearchSysCacheTuple(OPROID,
  275.  ObjectIdGetDatum(opno),
  276.  0, 0, 0);
  277. if (HeapTupleIsValid(tp))
  278. {
  279. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  280. return optup->oprcom;
  281. }
  282. else
  283. return InvalidOid;
  284. }
  285. /*
  286.  * get_negator -
  287.  *
  288.  * Returns the corresponding negator of an operator.
  289.  *
  290.  */
  291. Oid
  292. get_negator(Oid opno)
  293. {
  294. HeapTuple tp;
  295. tp = SearchSysCacheTuple(OPROID,
  296.  ObjectIdGetDatum(opno),
  297.  0, 0, 0);
  298. if (HeapTupleIsValid(tp))
  299. {
  300. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  301. return optup->oprnegate;
  302. }
  303. else
  304. return InvalidOid;
  305. }
  306. /*
  307.  * get_oprrest -
  308.  *
  309.  * Returns procedure id for computing selectivity of an operator.
  310.  *
  311.  */
  312. RegProcedure
  313. get_oprrest(Oid opno)
  314. {
  315. HeapTuple tp;
  316. tp = SearchSysCacheTuple(OPROID,
  317.  ObjectIdGetDatum(opno),
  318.  0, 0, 0);
  319. if (HeapTupleIsValid(tp))
  320. {
  321. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  322. return optup->oprrest;
  323. }
  324. else
  325. return (RegProcedure) NULL;
  326. }
  327. /*
  328.  * get_oprjoin -
  329.  *
  330.  * Returns procedure id for computing selectivity of a join.
  331.  *
  332.  */
  333. RegProcedure
  334. get_oprjoin(Oid opno)
  335. {
  336. HeapTuple tp;
  337. tp = SearchSysCacheTuple(OPROID,
  338.  ObjectIdGetDatum(opno),
  339.  0, 0, 0);
  340. if (HeapTupleIsValid(tp))
  341. {
  342. Form_pg_operator optup = (Form_pg_operator) GETSTRUCT(tp);
  343. return optup->oprjoin;
  344. }
  345. else
  346. return (RegProcedure) NULL;
  347. }
  348. /* ---------- RELATION CACHE ----------  */
  349. /*
  350.  * get_relnatts -
  351.  *
  352.  * Returns the number of attributes for a given relation.
  353.  *
  354.  */
  355. int
  356. get_relnatts(Oid relid)
  357. {
  358. HeapTuple tp;
  359. tp = SearchSysCacheTuple(RELOID,
  360.  ObjectIdGetDatum(relid),
  361.  0, 0, 0);
  362. if (HeapTupleIsValid(tp))
  363. {
  364. Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
  365. return reltup->relnatts;
  366. }
  367. else
  368. return InvalidAttrNumber;
  369. }
  370. /*
  371.  * get_rel_name -
  372.  *
  373.  * Returns the name of a given relation.
  374.  *
  375.  */
  376. char *
  377. get_rel_name(Oid relid)
  378. {
  379. HeapTuple tp;
  380. tp = SearchSysCacheTuple(RELOID,
  381.  ObjectIdGetDatum(relid),
  382.  0, 0, 0);
  383. if (HeapTupleIsValid(tp))
  384. {
  385. Form_pg_class reltup = (Form_pg_class) GETSTRUCT(tp);
  386. return pstrdup(reltup->relname.data);
  387. }
  388. else
  389. return NULL;
  390. }
  391. /* ---------- TYPE CACHE ----------  */
  392. /*
  393.  * get_typlen -
  394.  *
  395.  * Given the type OID, return the length of the type.
  396.  *
  397.  */
  398. int16
  399. get_typlen(Oid typid)
  400. {
  401. HeapTuple tp;
  402. tp = SearchSysCacheTuple(TYPOID,
  403.  ObjectIdGetDatum(typid),
  404.  0, 0, 0);
  405. if (HeapTupleIsValid(tp))
  406. {
  407. Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
  408. return typtup->typlen;
  409. }
  410. else
  411. return 0;
  412. }
  413. /*
  414.  * get_typbyval -
  415.  *
  416.  * Given the type OID, determine whether the type is returned by value or
  417.  * not.  Returns 1 if by value, 0 if by reference.
  418.  *
  419.  */
  420. bool
  421. get_typbyval(Oid typid)
  422. {
  423. HeapTuple tp;
  424. tp = SearchSysCacheTuple(TYPOID,
  425.  ObjectIdGetDatum(typid),
  426.  0, 0, 0);
  427. if (HeapTupleIsValid(tp))
  428. {
  429. Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
  430. return (bool) typtup->typbyval;
  431. }
  432. else
  433. return false;
  434. }
  435. #ifdef NOT_USED
  436. char
  437. get_typalign(Oid typid)
  438. {
  439. HeapTuple tp;
  440. tp = SearchSysCacheTuple(TYPOID,
  441.  ObjectIdGetDatum(typid),
  442.  0, 0, 0);
  443. if (HeapTupleIsValid(tp))
  444. {
  445. Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
  446. return typtup->typalign;
  447. }
  448. else
  449. return 'i';
  450. }
  451. #endif
  452. /*
  453.  * get_typdefault -
  454.  *
  455.  * Given the type OID, return the default value of the ADT.
  456.  *
  457.  */
  458. struct varlena *
  459. get_typdefault(Oid typid)
  460. {
  461. struct varlena *typdefault = (struct varlena *) TypeDefaultRetrieve(typid);
  462. return typdefault;
  463. }
  464. /*
  465.  * get_typtype -
  466.  *
  467.  * Given the type OID, find if it is a basic type, a named relation
  468.  * or the generic type 'relation'.
  469.  * It returns the null char if the cache lookup fails...
  470.  *
  471.  */
  472. #ifdef NOT_USED
  473. char
  474. get_typtype(Oid typid)
  475. {
  476. HeapTuple tp;
  477. tp = SearchSysCacheTuple(TYPOID,
  478.  ObjectIdGetDatum(typid),
  479.  0, 0, 0);
  480. if (HeapTupleIsValid(tp))
  481. {
  482. Form_pg_type typtup = (Form_pg_type) GETSTRUCT(tp);
  483. return typtup->typtype;
  484. }
  485. else
  486. return '';
  487. }
  488. #endif